$DIR/common/client/models_test.go: `.String()` $DIR/common/client/models_test.go: `.Contains(strC, "SendTxReturnCode(")` $DIR/common/client/multi_node_test.go: `t.Run("Fails without nodes", func(t *testing.T) { t.Parallel() mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: types.RandomID(), }) err := mn.Dial(tests.Context(t)) assert.EqualError(t, err, fmt.Sprintf("no available nodes for chain %s", mn.chainID.String())) })` $DIR/common/client/multi_node_test.go: `t.Run("Fails with wrong node's chainID", func(t *testing.T) { t.Parallel() node := newMockNode(t) multiNodeChainID := types.NewIDFromInt(10) nodeChainID := types.NewIDFromInt(11) node.On("ConfiguredChainID").Return(nodeChainID).Twice() const nodeName = "nodeName" node.On("String").Return(nodeName).Once() mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: multiNodeChainID, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{node}, }) err := mn.Dial(tests.Context(t)) assert.EqualError(t, err, fmt.Sprintf("node %s has configured chain ID %s which does not match multinode configured chain ID of %s", nodeName, nodeChainID, mn.chainID)) })` $DIR/common/client/multi_node_test.go: `node.On("ConfiguredChainID").Return(nodeChainID).Twice()` $DIR/common/client/multi_node_test.go: `node.On("String").Return(nodeName).Once()` $DIR/common/client/multi_node_test.go: `t.Run("Fails if node fails", func(t *testing.T) { t.Parallel() node := newMockNode(t) chainID := types.RandomID() node.On("ConfiguredChainID").Return(chainID).Once() expectedError := errors.New("failed to start node") node.On("Start", mock.Anything).Return(expectedError).Once() mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{node}, }) err := mn.Dial(tests.Context(t)) assert.EqualError(t, err, expectedError.Error()) })` $DIR/common/client/multi_node_test.go: `node.On("ConfiguredChainID").Return(chainID).Once()` $DIR/common/client/multi_node_test.go: `node.On("Start", mock.Anything).Return(expectedError).Once()` $DIR/common/client/multi_node_test.go: `t.Run("Closes started nodes on failure", func(t *testing.T) { t.Parallel() chainID := types.RandomID() node1 := newHealthyNode(t, chainID) node2 := newMockNode(t) node2.On("ConfiguredChainID").Return(chainID).Once() expectedError := errors.New("failed to start node") node2.On("Start", mock.Anything).Return(expectedError).Once() mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{node1, node2}, }) err := mn.Dial(tests.Context(t)) assert.EqualError(t, err, expectedError.Error()) })` $DIR/common/client/multi_node_test.go: `node2.On("ConfiguredChainID").Return(chainID).Once()` $DIR/common/client/multi_node_test.go: `node2.On("Start", mock.Anything).Return(expectedError).Once()` $DIR/common/client/multi_node_test.go: `t.Run("Fails with wrong send only node's chainID", func(t *testing.T) { t.Parallel() multiNodeChainID := types.NewIDFromInt(10) node := newHealthyNode(t, multiNodeChainID) sendOnly := newMockSendOnlyNode(t) sendOnlyChainID := types.NewIDFromInt(11) sendOnly.On("ConfiguredChainID").Return(sendOnlyChainID).Twice() const sendOnlyName = "sendOnlyNodeName" sendOnly.On("String").Return(sendOnlyName).Once() mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: multiNodeChainID, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{node}, sendonlys: []SendOnlyNode[types.ID, multiNodeRPCClient]{sendOnly}, }) err := mn.Dial(tests.Context(t)) assert.EqualError(t, err, fmt.Sprintf("sendonly node %s has configured chain ID %s which does not match multinode configured chain ID of %s", sendOnlyName, sendOnlyChainID, mn.chainID)) })` $DIR/common/client/multi_node_test.go: `sendOnly.On("ConfiguredChainID").Return(sendOnlyChainID).Twice()` $DIR/common/client/multi_node_test.go: `sendOnly.On("String").Return(sendOnlyName).Once()` $DIR/common/client/multi_node_test.go: `node.On("ConfiguredChainID").Return(chainID).Once()` $DIR/common/client/multi_node_test.go: `node.On("Start", mock.Anything).Return(nil).Once()` $DIR/common/client/multi_node_test.go: `node.On("Close").Return(nil).Once()` $DIR/common/client/multi_node_test.go: `t.Run("Fails on send only node failure", func(t *testing.T) { t.Parallel() chainID := types.NewIDFromInt(10) node := newHealthyNode(t, chainID) sendOnly1 := newHealthySendOnly(t, chainID) sendOnly2 := newMockSendOnlyNode(t) sendOnly2.On("ConfiguredChainID").Return(chainID).Once() expectedError := errors.New("failed to start send only node") sendOnly2.On("Start", mock.Anything).Return(expectedError).Once() mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{node}, sendonlys: []SendOnlyNode[types.ID, multiNodeRPCClient]{sendOnly1, sendOnly2}, }) err := mn.Dial(tests.Context(t)) assert.EqualError(t, err, expectedError.Error()) })` $DIR/common/client/multi_node_test.go: `sendOnly2.On("ConfiguredChainID").Return(chainID).Once()` $DIR/common/client/multi_node_test.go: `sendOnly2.On("Start", mock.Anything).Return(expectedError).Once()` $DIR/common/client/multi_node_test.go: `t.Run("Dial starts periodical reporting", func(t *testing.T) { t.Parallel() chainID := types.RandomID() node1 := newHealthyNode(t, chainID) node2 := newNodeWithState(t, chainID, nodeStateOutOfSync) lggr, observedLogs := logger.TestObserved(t, zap.WarnLevel) mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{node1, node2}, logger: lggr, }) mn.reportInterval = tests.TestInterval defer func() { assert.NoError(t, mn.Close()) }() err := mn.Dial(tests.Context(t)) require.NoError(t, err) tests.AssertLogCountEventually(t, observedLogs, "At least one primary node is dead: 1/2 nodes are alive", 2) })` $DIR/common/client/multi_node_test.go: `mn.reportInterval = tests.TestInterval` $DIR/common/client/multi_node_test.go: `tests.AssertLogCountEventually(t, observedLogs, "At least one primary node is dead: 1/2 nodes are alive", 2)` $DIR/common/client/multi_node_test.go: `mn.reportInterval = tests.TestInterval` $DIR/common/client/multi_node_test.go: `tests.AssertLogCountEventually(t, observedLogs, "no primary nodes available: 0/1 nodes are alive", 2)` $DIR/common/client/multi_node_test.go: `err = mn.Healthy()` $DIR/common/client/multi_node_test.go: `t.Run("Round robin disables lease check", func(t *testing.T) { t.Parallel() chainID := types.RandomID() node := newHealthyNode(t, chainID) lggr, observedLogs := logger.TestObserved(t, zap.InfoLevel) mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, logger: lggr, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{node}, }) defer func() { assert.NoError(t, mn.Close()) }() err := mn.Dial(tests.Context(t)) require.NoError(t, err) tests.RequireLogMessage(t, observedLogs, "Best node switching is disabled") })` $DIR/common/client/multi_node_test.go: `tests.RequireLogMessage(t, observedLogs, "Best node switching is disabled")` $DIR/common/client/multi_node_test.go: `t.Run("Misconfigured lease check period won't start", func(t *testing.T) { t.Parallel() chainID := types.RandomID() node := newHealthyNode(t, chainID) lggr, observedLogs := logger.TestObserved(t, zap.InfoLevel) mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeHighestHead, chainID: chainID, logger: lggr, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{node}, leaseDuration: 0, }) defer func() { assert.NoError(t, mn.Close()) }() err := mn.Dial(tests.Context(t)) require.NoError(t, err) tests.RequireLogMessage(t, observedLogs, "Best node switching is disabled") })` $DIR/common/client/multi_node_test.go: `tests.RequireLogMessage(t, observedLogs, "Best node switching is disabled")` $DIR/common/client/multi_node_test.go: `t.Run("Lease check updates active node", func(t *testing.T) { t.Parallel() chainID := types.RandomID() node := newHealthyNode(t, chainID) node.On("SubscribersCount").Return(int32(2)) node.On("UnsubscribeAllExceptAliveLoop") bestNode := newHealthyNode(t, chainID) nodeSelector := newMockNodeSelector[types.ID, types.Head[Hashable], multiNodeRPCClient](t) nodeSelector.On("Select").Return(bestNode) lggr, observedLogs := logger.TestObserved(t, zap.InfoLevel) mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeHighestHead, chainID: chainID, logger: lggr, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{node, bestNode}, leaseDuration: tests.TestInterval, }) defer func() { assert.NoError(t, mn.Close()) }() mn.nodeSelector = nodeSelector err := mn.Dial(tests.Context(t)) require.NoError(t, err) tests.AssertLogEventually(t, observedLogs, fmt.Sprintf("Switching to best node from %q to %q", node.String(), bestNode.String())) tests.AssertEventually(t, func() bool { mn.activeMu.RLock() active := mn.activeNode mn.activeMu.RUnlock() return bestNode == active }) })` $DIR/common/client/multi_node_test.go: `node.On("SubscribersCount").Return(int32(2))` $DIR/common/client/multi_node_test.go: `node.On("UnsubscribeAllExceptAliveLoop")` $DIR/common/client/multi_node_test.go: `nodeSelector.On("Select").Return(bestNode)` $DIR/common/client/multi_node_test.go: `mn.nodeSelector = nodeSelector` $DIR/common/client/multi_node_test.go: `tests.AssertLogEventually(t, observedLogs, fmt.Sprintf("Switching to best node from %q to %q", node.String(), bestNode.String()))` $DIR/common/client/multi_node_test.go: `tests.AssertEventually(t, func() bool { mn.activeMu.RLock() active := mn.activeNode mn.activeMu.RUnlock() return bestNode == active })` $DIR/common/client/multi_node_test.go: `mn.activeMu.RLock()` $DIR/common/client/multi_node_test.go: `mn.activeMu.RUnlock()` $DIR/common/client/multi_node_test.go: `node.On("Name").Return(name).Once()` $DIR/common/client/multi_node_test.go: `node.On("State").Return(state).Once()` $DIR/common/client/multi_node_test.go: `opts.nodes = append(opts.nodes, node)` $DIR/common/client/multi_node_test.go: `sendOnly.On("Name").Return(sendOnlyName).Once()` $DIR/common/client/multi_node_test.go: `sendOnly.On("State").Return(state).Once()` $DIR/common/client/multi_node_test.go: `opts.sendonlys = append(opts.sendonlys, sendOnly)` $DIR/common/client/multi_node_test.go: `expectedResult[name] = state.String()` $DIR/common/client/multi_node_test.go: `expectedResult[sendOnlyName] = state.String()` $DIR/common/client/multi_node_test.go: `t.Run("Returns same node, if it's still healthy", func(t *testing.T) { t.Parallel() chainID := types.RandomID() node1 := newMockNode[types.ID, types.Head[Hashable], multiNodeRPCClient](t) node1.On("State").Return(nodeStateAlive).Once() node1.On("String").Return("node1").Maybe() node2 := newMockNode[types.ID, types.Head[Hashable], multiNodeRPCClient](t) node2.On("String").Return("node2").Maybe() mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{node1, node2}, }) nodeSelector := newMockNodeSelector[types.ID, types.Head[Hashable], multiNodeRPCClient](t) nodeSelector.On("Select").Return(node1).Once() mn.nodeSelector = nodeSelector prevActiveNode, err := mn.selectNode() require.NoError(t, err) require.Equal(t, node1.String(), prevActiveNode.String()) newActiveNode, err := mn.selectNode() require.NoError(t, err) require.Equal(t, prevActiveNode.String(), newActiveNode.String()) })` $DIR/common/client/multi_node_test.go: `node1.On("State").Return(nodeStateAlive).Once()` $DIR/common/client/multi_node_test.go: `node1.On("String").Return("node1").Maybe()` $DIR/common/client/multi_node_test.go: `node2.On("String").Return("node2").Maybe()` $DIR/common/client/multi_node_test.go: `nodeSelector.On("Select").Return(node1).Once()` $DIR/common/client/multi_node_test.go: `mn.nodeSelector = nodeSelector` $DIR/common/client/multi_node_test.go: `t.Run("Updates node if active is not healthy", func(t *testing.T) { t.Parallel() chainID := types.RandomID() oldBest := newMockNode[types.ID, types.Head[Hashable], multiNodeRPCClient](t) oldBest.On("String").Return("oldBest").Maybe() newBest := newMockNode[types.ID, types.Head[Hashable], multiNodeRPCClient](t) newBest.On("String").Return("newBest").Maybe() mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{oldBest, newBest}, }) nodeSelector := newMockNodeSelector[types.ID, types.Head[Hashable], multiNodeRPCClient](t) nodeSelector.On("Select").Return(oldBest).Once() mn.nodeSelector = nodeSelector activeNode, err := mn.selectNode() require.NoError(t, err) require.Equal(t, oldBest.String(), activeNode.String()) // old best died, so we should replace it oldBest.On("State").Return(nodeStateOutOfSync).Twice() nodeSelector.On("Select").Return(newBest).Once() newActiveNode, err := mn.selectNode() require.NoError(t, err) require.Equal(t, newBest.String(), newActiveNode.String()) })` $DIR/common/client/multi_node_test.go: `oldBest.On("String").Return("oldBest").Maybe()` $DIR/common/client/multi_node_test.go: `newBest.On("String").Return("newBest").Maybe()` $DIR/common/client/multi_node_test.go: `nodeSelector.On("Select").Return(oldBest).Once()` $DIR/common/client/multi_node_test.go: `mn.nodeSelector = nodeSelector` $DIR/common/client/multi_node_test.go: `oldBest.On("State").Return(nodeStateOutOfSync).Twice()` $DIR/common/client/multi_node_test.go: `nodeSelector.On("Select").Return(newBest).Once()` $DIR/common/client/multi_node_test.go: `nodeSelector.On("Select").Return(nil).Once()` $DIR/common/client/multi_node_test.go: `nodeSelector.On("Name").Return("MockedNodeSelector").Once()` $DIR/common/client/multi_node_test.go: `mn.nodeSelector = nodeSelector` $DIR/common/client/multi_node_test.go: `tests.RequireLogMessage(t, observedLogs, "No live RPC nodes available")` $DIR/common/client/multi_node_test.go: `t.Run(tc.Name, func(t *testing.T) { for _, params := range tc.NodeParams { node := newMockNode[types.ID, types.Head[Hashable], multiNodeRPCClient](t) node.On("StateAndLatest").Return(params.State, params.BlockNumber, params.TotalDifficulty) mn.nodes = append(mn.nodes, node) } nNodes, blockNum, td := mn.nLiveNodes() assert.Equal(t, tc.ExpectedNLiveNodes, nNodes) assert.Equal(t, tc.ExpectedTotalDifficulty, td) assert.Equal(t, tc.ExpectedBlockNumber, blockNum) })` $DIR/common/client/multi_node_test.go: `node.On("StateAndLatest").Return(params.State, params.BlockNumber, params.TotalDifficulty)` $DIR/common/client/multi_node_test.go: `mn.nodes = append(mn.nodes, node)` $DIR/common/client/multi_node_test.go: `t.Run("Fails if failed to select active node", func(t *testing.T) { chainID := types.RandomID() mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, }) nodeSelector := newMockNodeSelector[types.ID, types.Head[Hashable], multiNodeRPCClient](t) nodeSelector.On("Select").Return(nil).Once() nodeSelector.On("Name").Return("MockedNodeSelector").Once() mn.nodeSelector = nodeSelector err := mn.BatchCallContextAll(tests.Context(t), nil) require.EqualError(t, err, ErroringNodeError.Error()) })` $DIR/common/client/multi_node_test.go: `nodeSelector.On("Select").Return(nil).Once()` $DIR/common/client/multi_node_test.go: `nodeSelector.On("Name").Return("MockedNodeSelector").Once()` $DIR/common/client/multi_node_test.go: `mn.nodeSelector = nodeSelector` $DIR/common/client/multi_node_test.go: `t.Run("Returns error if RPC call fails for active node", func(t *testing.T) { chainID := types.RandomID() rpc := newMultiNodeRPCClient(t) expectedError := errors.New("rpc failed to do the batch call") rpc.On("BatchCallContext", mock.Anything, mock.Anything).Return(expectedError).Once() node := newMockNode[types.ID, types.Head[Hashable], multiNodeRPCClient](t) node.On("RPC").Return(rpc) nodeSelector := newMockNodeSelector[types.ID, types.Head[Hashable], multiNodeRPCClient](t) nodeSelector.On("Select").Return(node).Once() mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, }) mn.nodeSelector = nodeSelector err := mn.BatchCallContextAll(tests.Context(t), nil) require.EqualError(t, err, expectedError.Error()) })` $DIR/common/client/multi_node_test.go: `rpc.On("BatchCallContext", mock.Anything, mock.Anything).Return(expectedError).Once()` $DIR/common/client/multi_node_test.go: `node.On("RPC").Return(rpc)` $DIR/common/client/multi_node_test.go: `nodeSelector.On("Select").Return(node).Once()` $DIR/common/client/multi_node_test.go: `mn.nodeSelector = nodeSelector` $DIR/common/client/multi_node_test.go: `t.Run("Waits for all nodes to complete the call and logs results", func(t *testing.T) { // setup RPCs failedRPC := newMultiNodeRPCClient(t) failedRPC.On("BatchCallContext", mock.Anything, mock.Anything). Return(errors.New("rpc failed to do the batch call")).Once() okRPC := newMultiNodeRPCClient(t) okRPC.On("BatchCallContext", mock.Anything, mock.Anything).Return(nil).Twice() // setup ok and failed auxiliary nodes okNode := newMockSendOnlyNode[types.ID, multiNodeRPCClient](t) okNode.On("RPC").Return(okRPC).Once() okNode.On("State").Return(nodeStateAlive) failedNode := newMockNode[types.ID, types.Head[Hashable], multiNodeRPCClient](t) failedNode.On("RPC").Return(failedRPC).Once() failedNode.On("State").Return(nodeStateAlive) // setup main node mainNode := newMockNode[types.ID, types.Head[Hashable], multiNodeRPCClient](t) mainNode.On("RPC").Return(okRPC) nodeSelector := newMockNodeSelector[types.ID, types.Head[Hashable], multiNodeRPCClient](t) nodeSelector.On("Select").Return(mainNode).Once() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: types.RandomID(), nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{failedNode, mainNode}, sendonlys: []SendOnlyNode[types.ID, multiNodeRPCClient]{okNode}, logger: lggr, }) mn.nodeSelector = nodeSelector err := mn.BatchCallContextAll(tests.Context(t), nil) require.NoError(t, err) tests.RequireLogMessage(t, observedLogs, "Secondary node BatchCallContext failed") })` $DIR/common/client/multi_node_test.go: `failedRPC.On("BatchCallContext", mock.Anything, mock.Anything). Return(errors.New("rpc failed to do the batch call")).Once()` $DIR/common/client/multi_node_test.go: `okRPC.On("BatchCallContext", mock.Anything, mock.Anything).Return(nil).Twice()` $DIR/common/client/multi_node_test.go: `okNode.On("RPC").Return(okRPC).Once()` $DIR/common/client/multi_node_test.go: `okNode.On("State").Return(nodeStateAlive)` $DIR/common/client/multi_node_test.go: `failedNode.On("RPC").Return(failedRPC).Once()` $DIR/common/client/multi_node_test.go: `failedNode.On("State").Return(nodeStateAlive)` $DIR/common/client/multi_node_test.go: `mainNode.On("RPC").Return(okRPC)` $DIR/common/client/multi_node_test.go: `nodeSelector.On("Select").Return(mainNode).Once()` $DIR/common/client/multi_node_test.go: `mn.nodeSelector = nodeSelector` $DIR/common/client/multi_node_test.go: `tests.RequireLogMessage(t, observedLogs, "Secondary node BatchCallContext failed")` $DIR/common/client/multi_node_test.go: `okRPC.On("BatchCallContext", mock.Anything, mock.Anything).Return(nil).Twice()` $DIR/common/client/multi_node_test.go: `healthyNode.On("RPC").Return(okRPC).Once()` $DIR/common/client/multi_node_test.go: `healthyNode.On("State").Return(nodeStateAlive)` $DIR/common/client/multi_node_test.go: `deadNode.On("State").Return(nodeStateUnreachable)` $DIR/common/client/multi_node_test.go: `mainNode.On("RPC").Return(okRPC)` $DIR/common/client/multi_node_test.go: `nodeSelector.On("Select").Return(mainNode).Once()` $DIR/common/client/multi_node_test.go: `mn.nodeSelector = nodeSelector` $DIR/common/client/multi_node_test.go: `rpc.On("SendTransaction", mock.Anything, mock.Anything).Return(txErr).Run(sendTxRun).Maybe()` $DIR/common/client/multi_node_test.go: `node.On("String").Return("node name").Maybe()` $DIR/common/client/multi_node_test.go: `node.On("RPC").Return(rpc).Maybe()` $DIR/common/client/multi_node_test.go: `node.On("State").Return(state).Maybe()` $DIR/common/client/multi_node_test.go: `node.On("Close").Return(nil).Once()` $DIR/common/client/multi_node_test.go: `t.Cleanup(func() { require.NoError(t, mn.Close()) })` $DIR/common/client/multi_node_test.go: `t.Run("Fails if there is no nodes available", func(t *testing.T) { mn := newStartedMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: types.RandomID(), }) err := mn.SendTransaction(tests.Context(t), nil) assert.EqualError(t, err, ErroringNodeError.Error()) })` $DIR/common/client/multi_node_test.go: `t.Run("Transaction failure happy path", func(t *testing.T) { chainID := types.RandomID() expectedError := errors.New("transaction failed") mainNode := newNode(t, expectedError, nil) lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) mn := newStartedMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{mainNode}, sendonlys: []SendOnlyNode[types.ID, multiNodeRPCClient]{newNode(t, errors.New("unexpected error"), nil)}, classifySendTxError: classifySendTxError, logger: lggr, }) err := mn.SendTransaction(tests.Context(t), nil) require.EqualError(t, err, expectedError.Error()) tests.AssertLogCountEventually(t, observedLogs, "Node sent transaction", 2) tests.AssertLogCountEventually(t, observedLogs, "RPC returned error", 2) })` $DIR/common/client/multi_node_test.go: `tests.AssertLogCountEventually(t, observedLogs, "Node sent transaction", 2)` $DIR/common/client/multi_node_test.go: `tests.AssertLogCountEventually(t, observedLogs, "RPC returned error", 2)` $DIR/common/client/multi_node_test.go: `t.Run("Transaction success happy path", func(t *testing.T) { chainID := types.RandomID() mainNode := newNode(t, nil, nil) lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) mn := newStartedMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{mainNode}, sendonlys: []SendOnlyNode[types.ID, multiNodeRPCClient]{newNode(t, errors.New("unexpected error"), nil)}, classifySendTxError: classifySendTxError, logger: lggr, }) err := mn.SendTransaction(tests.Context(t), nil) require.NoError(t, err) tests.AssertLogCountEventually(t, observedLogs, "Node sent transaction", 2) tests.AssertLogCountEventually(t, observedLogs, "RPC returned error", 1) })` $DIR/common/client/multi_node_test.go: `tests.AssertLogCountEventually(t, observedLogs, "Node sent transaction", 2)` $DIR/common/client/multi_node_test.go: `tests.AssertLogCountEventually(t, observedLogs, "RPC returned error", 1)` $DIR/common/client/multi_node_test.go: `t.Run("Context expired before collecting sufficient results", func(t *testing.T) { chainID := types.RandomID() testContext, testCancel := context.WithCancel(tests.Context(t)) defer testCancel() mainNode := newNode(t, errors.New("unexpected error"), func(_ mock.Arguments) { // block caller til end of the test <-testContext.Done() }) mn := newStartedMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{mainNode}, classifySendTxError: classifySendTxError, }) requestContext, cancel := context.WithCancel(tests.Context(t)) cancel() err := mn.SendTransaction(requestContext, nil) require.EqualError(t, err, "context canceled") })` $DIR/common/client/multi_node_test.go: `<-testContext.Done()` $DIR/common/client/multi_node_test.go: `cancel()` $DIR/common/client/multi_node_test.go: `t.Run("Soft timeout stops results collection", func(t *testing.T) { chainID := types.RandomID() expectedError := errors.New("tmp error") fastNode := newNode(t, expectedError, nil) // hold reply from the node till end of the test testContext, testCancel := context.WithCancel(tests.Context(t)) defer testCancel() slowNode := newNode(t, errors.New("transaction failed"), func(_ mock.Arguments) { // block caller til end of the test <-testContext.Done() }) mn := newStartedMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{fastNode, slowNode}, classifySendTxError: classifySendTxError, sendTxSoftTimeout: tests.TestInterval, }) err := mn.SendTransaction(tests.Context(t), nil) require.EqualError(t, err, expectedError.Error()) })` $DIR/common/client/multi_node_test.go: `<-testContext.Done()` $DIR/common/client/multi_node_test.go: `t.Run("Returns success without waiting for the rest of the nodes", func(t *testing.T) { chainID := types.RandomID() fastNode := newNode(t, nil, nil) // hold reply from the node till end of the test testContext, testCancel := context.WithCancel(tests.Context(t)) defer testCancel() slowNode := newNode(t, errors.New("transaction failed"), func(_ mock.Arguments) { // block caller til end of the test <-testContext.Done() }) slowSendOnly := newNode(t, errors.New("send only failed"), func(_ mock.Arguments) { // block caller til end of the test <-testContext.Done() }) lggr, observedLogs := logger.TestObserved(t, zap.WarnLevel) mn := newTestMultiNode(t, multiNodeOpts{ logger: lggr, selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{fastNode, slowNode}, sendonlys: []SendOnlyNode[types.ID, multiNodeRPCClient]{slowSendOnly}, classifySendTxError: classifySendTxError, sendTxSoftTimeout: tests.TestInterval, }) assert.NoError(t, mn.StartOnce("startedTestMultiNode", func() error { return nil })) err := mn.SendTransaction(tests.Context(t), nil) require.NoError(t, err) testCancel() require.NoError(t, mn.Close()) tests.AssertLogEventually(t, observedLogs, "observed invariant violation on SendTransaction") })` $DIR/common/client/multi_node_test.go: `<-testContext.Done()` $DIR/common/client/multi_node_test.go: `<-testContext.Done()` $DIR/common/client/multi_node_test.go: `testCancel()` $DIR/common/client/multi_node_test.go: `tests.AssertLogEventually(t, observedLogs, "observed invariant violation on SendTransaction")` $DIR/common/client/multi_node_test.go: `t.Run("Fails when closed", func(t *testing.T) { mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: types.RandomID(), nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{newNode(t, nil, nil)}, sendonlys: []SendOnlyNode[types.ID, multiNodeRPCClient]{newNode(t, nil, nil)}, classifySendTxError: classifySendTxError, }) err := mn.StartOnce("startedTestMultiNode", func() error { return nil }) require.NoError(t, err) require.NoError(t, mn.Close()) err = mn.SendTransaction(tests.Context(t), nil) require.EqualError(t, err, "aborted while broadcasting tx - multiNode is stopped: context canceled") })` $DIR/common/client/multi_node_test.go: `err = mn.SendTransaction(tests.Context(t), nil)` $DIR/common/client/multi_node_test.go: `t.Run("Returns error if there is no healthy primary nodes", func(t *testing.T) { mn := newStartedMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: types.RandomID(), nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{newNodeWithState(t, nodeStateUnreachable, nil, nil)}, sendonlys: []SendOnlyNode[types.ID, multiNodeRPCClient]{newNodeWithState(t, nodeStateUnreachable, nil, nil)}, classifySendTxError: classifySendTxError, }) err := mn.SendTransaction(tests.Context(t), nil) assert.EqualError(t, err, ErroringNodeError.Error()) })` $DIR/common/client/multi_node_test.go: `tests.AssertLogCountEventually(t, observedLogs, "Node sent transaction", 2)` $DIR/common/client/multi_node_test.go: `tests.AssertLogCountEventually(t, observedLogs, "RPC returned error", 1)` $DIR/common/client/multi_node_test.go: `codesToCover[code] = struct{}{}` $DIR/common/client/multi_node_test.go: `delete(codesToCover, code)` $DIR/common/client/multi_node_test.go: `t.Run(testCase.Name, func(t *testing.T) { txResult, err := aggregateTxResults(testCase.ResultsByCode) if testCase.ExpectedTxResult == "" { assert.NoError(t, err) } else { assert.EqualError(t, txResult, testCase.ExpectedTxResult) } logger.Sugared(logger.Test(t)).Info("Map: " + fmt.Sprint(testCase.ResultsByCode)) logger.Sugared(logger.Test(t)).Criticalw("observed invariant violation on SendTransaction", "resultsByCode", testCase.ResultsByCode, "err", err) if testCase.ExpectedCriticalErr == "" { assert.NoError(t, err) } else { assert.EqualError(t, err, testCase.ExpectedCriticalErr) } })` $DIR/common/client/multi_node_test.go: `logger.Sugared(logger.Test(t)).Info("Map: " + fmt.Sprint(testCase.ResultsByCode))` $DIR/common/client/multi_node_test.go: `logger.Sugared(logger.Test(t)).Criticalw("observed invariant violation on SendTransaction", "resultsByCode", testCase.ResultsByCode, "err", err)` $DIR/common/client/multi_node_test.go: `delete(codesToCover, codeToIgnore)` $DIR/common/client/multi_node_test.go: `.Run("Fails without nodes", func(t *testing.T) { t.Parallel() mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: types.RandomID(), }) err := mn.Dial(tests.Context(t)) assert.EqualError(t, err, fmt.Sprintf("no available nodes for chain %s", mn.chainID.String())) })` $DIR/common/client/multi_node_test.go: `.RandomID()` $DIR/common/client/multi_node_test.go: `.Dial(tests.Context(t))` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.Run("Fails with wrong node's chainID", func(t *testing.T) { t.Parallel() node := newMockNode(t) multiNodeChainID := types.NewIDFromInt(10) nodeChainID := types.NewIDFromInt(11) node.On("ConfiguredChainID").Return(nodeChainID).Twice() const nodeName = "nodeName" node.On("String").Return(nodeName).Once() mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: multiNodeChainID, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{node}, }) err := mn.Dial(tests.Context(t)) assert.EqualError(t, err, fmt.Sprintf("node %s has configured chain ID %s which does not match multinode configured chain ID of %s", nodeName, nodeChainID, mn.chainID)) })` $DIR/common/client/multi_node_test.go: `.NewIDFromInt(10)` $DIR/common/client/multi_node_test.go: `.NewIDFromInt(11)` $DIR/common/client/multi_node_test.go: `.On("ConfiguredChainID")` $DIR/common/client/multi_node_test.go: `.Return(nodeChainID)` $DIR/common/client/multi_node_test.go: `.Twice()` $DIR/common/client/multi_node_test.go: `.On("String")` $DIR/common/client/multi_node_test.go: `.Return(nodeName)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.Dial(tests.Context(t))` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.Run("Fails if node fails", func(t *testing.T) { t.Parallel() node := newMockNode(t) chainID := types.RandomID() node.On("ConfiguredChainID").Return(chainID).Once() expectedError := errors.New("failed to start node") node.On("Start", mock.Anything).Return(expectedError).Once() mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{node}, }) err := mn.Dial(tests.Context(t)) assert.EqualError(t, err, expectedError.Error()) })` $DIR/common/client/multi_node_test.go: `.RandomID()` $DIR/common/client/multi_node_test.go: `.On("ConfiguredChainID")` $DIR/common/client/multi_node_test.go: `.Return(chainID)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.New("failed to start node")` $DIR/common/client/multi_node_test.go: `.On("Start", mock.Anything)` $DIR/common/client/multi_node_test.go: `.Return(expectedError)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.Dial(tests.Context(t))` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.Run("Closes started nodes on failure", func(t *testing.T) { t.Parallel() chainID := types.RandomID() node1 := newHealthyNode(t, chainID) node2 := newMockNode(t) node2.On("ConfiguredChainID").Return(chainID).Once() expectedError := errors.New("failed to start node") node2.On("Start", mock.Anything).Return(expectedError).Once() mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{node1, node2}, }) err := mn.Dial(tests.Context(t)) assert.EqualError(t, err, expectedError.Error()) })` $DIR/common/client/multi_node_test.go: `.RandomID()` $DIR/common/client/multi_node_test.go: `.On("ConfiguredChainID")` $DIR/common/client/multi_node_test.go: `.Return(chainID)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.New("failed to start node")` $DIR/common/client/multi_node_test.go: `.On("Start", mock.Anything)` $DIR/common/client/multi_node_test.go: `.Return(expectedError)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.Dial(tests.Context(t))` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.Run("Fails with wrong send only node's chainID", func(t *testing.T) { t.Parallel() multiNodeChainID := types.NewIDFromInt(10) node := newHealthyNode(t, multiNodeChainID) sendOnly := newMockSendOnlyNode(t) sendOnlyChainID := types.NewIDFromInt(11) sendOnly.On("ConfiguredChainID").Return(sendOnlyChainID).Twice() const sendOnlyName = "sendOnlyNodeName" sendOnly.On("String").Return(sendOnlyName).Once() mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: multiNodeChainID, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{node}, sendonlys: []SendOnlyNode[types.ID, multiNodeRPCClient]{sendOnly}, }) err := mn.Dial(tests.Context(t)) assert.EqualError(t, err, fmt.Sprintf("sendonly node %s has configured chain ID %s which does not match multinode configured chain ID of %s", sendOnlyName, sendOnlyChainID, mn.chainID)) })` $DIR/common/client/multi_node_test.go: `.NewIDFromInt(10)` $DIR/common/client/multi_node_test.go: `.NewIDFromInt(11)` $DIR/common/client/multi_node_test.go: `.On("ConfiguredChainID")` $DIR/common/client/multi_node_test.go: `.Return(sendOnlyChainID)` $DIR/common/client/multi_node_test.go: `.Twice()` $DIR/common/client/multi_node_test.go: `.On("String")` $DIR/common/client/multi_node_test.go: `.Return(sendOnlyName)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.Dial(tests.Context(t))` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.On("ConfiguredChainID")` $DIR/common/client/multi_node_test.go: `.Return(chainID)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.On("Start", mock.Anything)` $DIR/common/client/multi_node_test.go: `.Return(nil)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.On("Close")` $DIR/common/client/multi_node_test.go: `.Return(nil)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.Run("Fails on send only node failure", func(t *testing.T) { t.Parallel() chainID := types.NewIDFromInt(10) node := newHealthyNode(t, chainID) sendOnly1 := newHealthySendOnly(t, chainID) sendOnly2 := newMockSendOnlyNode(t) sendOnly2.On("ConfiguredChainID").Return(chainID).Once() expectedError := errors.New("failed to start send only node") sendOnly2.On("Start", mock.Anything).Return(expectedError).Once() mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{node}, sendonlys: []SendOnlyNode[types.ID, multiNodeRPCClient]{sendOnly1, sendOnly2}, }) err := mn.Dial(tests.Context(t)) assert.EqualError(t, err, expectedError.Error()) })` $DIR/common/client/multi_node_test.go: `.NewIDFromInt(10)` $DIR/common/client/multi_node_test.go: `.On("ConfiguredChainID")` $DIR/common/client/multi_node_test.go: `.Return(chainID)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.New("failed to start send only node")` $DIR/common/client/multi_node_test.go: `.On("Start", mock.Anything)` $DIR/common/client/multi_node_test.go: `.Return(expectedError)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.Dial(tests.Context(t))` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.NewIDFromInt(10)` $DIR/common/client/multi_node_test.go: `.Dial(tests.Context(t))` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.selectNode()` $DIR/common/client/multi_node_test.go: `.Run("Dial starts periodical reporting", func(t *testing.T) { t.Parallel() chainID := types.RandomID() node1 := newHealthyNode(t, chainID) node2 := newNodeWithState(t, chainID, nodeStateOutOfSync) lggr, observedLogs := logger.TestObserved(t, zap.WarnLevel) mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{node1, node2}, logger: lggr, }) mn.reportInterval = tests.TestInterval defer func() { assert.NoError(t, mn.Close()) }() err := mn.Dial(tests.Context(t)) require.NoError(t, err) tests.AssertLogCountEventually(t, observedLogs, "At least one primary node is dead: 1/2 nodes are alive", 2) })` $DIR/common/client/multi_node_test.go: `.RandomID()` $DIR/common/client/multi_node_test.go: `.TestObserved(t, zap.WarnLevel)` $DIR/common/client/multi_node_test.go: `.Dial(tests.Context(t))` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.AssertLogCountEventually(t, observedLogs, "At least one primary node is dead: 1/2 nodes are alive", 2)` $DIR/common/client/multi_node_test.go: `.RandomID()` $DIR/common/client/multi_node_test.go: `.TestObserved(t, zap.WarnLevel)` $DIR/common/client/multi_node_test.go: `.Dial(tests.Context(t))` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.AssertLogCountEventually(t, observedLogs, "no primary nodes available: 0/1 nodes are alive", 2)` $DIR/common/client/multi_node_test.go: `.Healthy()` $DIR/common/client/multi_node_test.go: `.Run("Round robin disables lease check", func(t *testing.T) { t.Parallel() chainID := types.RandomID() node := newHealthyNode(t, chainID) lggr, observedLogs := logger.TestObserved(t, zap.InfoLevel) mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, logger: lggr, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{node}, }) defer func() { assert.NoError(t, mn.Close()) }() err := mn.Dial(tests.Context(t)) require.NoError(t, err) tests.RequireLogMessage(t, observedLogs, "Best node switching is disabled") })` $DIR/common/client/multi_node_test.go: `.RandomID()` $DIR/common/client/multi_node_test.go: `.TestObserved(t, zap.InfoLevel)` $DIR/common/client/multi_node_test.go: `.Dial(tests.Context(t))` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.RequireLogMessage(t, observedLogs, "Best node switching is disabled")` $DIR/common/client/multi_node_test.go: `.Run("Misconfigured lease check period won't start", func(t *testing.T) { t.Parallel() chainID := types.RandomID() node := newHealthyNode(t, chainID) lggr, observedLogs := logger.TestObserved(t, zap.InfoLevel) mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeHighestHead, chainID: chainID, logger: lggr, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{node}, leaseDuration: 0, }) defer func() { assert.NoError(t, mn.Close()) }() err := mn.Dial(tests.Context(t)) require.NoError(t, err) tests.RequireLogMessage(t, observedLogs, "Best node switching is disabled") })` $DIR/common/client/multi_node_test.go: `.RandomID()` $DIR/common/client/multi_node_test.go: `.TestObserved(t, zap.InfoLevel)` $DIR/common/client/multi_node_test.go: `.Dial(tests.Context(t))` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.RequireLogMessage(t, observedLogs, "Best node switching is disabled")` $DIR/common/client/multi_node_test.go: `.Run("Lease check updates active node", func(t *testing.T) { t.Parallel() chainID := types.RandomID() node := newHealthyNode(t, chainID) node.On("SubscribersCount").Return(int32(2)) node.On("UnsubscribeAllExceptAliveLoop") bestNode := newHealthyNode(t, chainID) nodeSelector := newMockNodeSelector[types.ID, types.Head[Hashable], multiNodeRPCClient](t) nodeSelector.On("Select").Return(bestNode) lggr, observedLogs := logger.TestObserved(t, zap.InfoLevel) mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeHighestHead, chainID: chainID, logger: lggr, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{node, bestNode}, leaseDuration: tests.TestInterval, }) defer func() { assert.NoError(t, mn.Close()) }() mn.nodeSelector = nodeSelector err := mn.Dial(tests.Context(t)) require.NoError(t, err) tests.AssertLogEventually(t, observedLogs, fmt.Sprintf("Switching to best node from %q to %q", node.String(), bestNode.String())) tests.AssertEventually(t, func() bool { mn.activeMu.RLock() active := mn.activeNode mn.activeMu.RUnlock() return bestNode == active }) })` $DIR/common/client/multi_node_test.go: `.RandomID()` $DIR/common/client/multi_node_test.go: `.On("SubscribersCount")` $DIR/common/client/multi_node_test.go: `.Return(int32(2))` $DIR/common/client/multi_node_test.go: `.On("UnsubscribeAllExceptAliveLoop")` $DIR/common/client/multi_node_test.go: `.On("Select")` $DIR/common/client/multi_node_test.go: `.Return(bestNode)` $DIR/common/client/multi_node_test.go: `.TestObserved(t, zap.InfoLevel)` $DIR/common/client/multi_node_test.go: `.Dial(tests.Context(t))` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.AssertLogEventually(t, observedLogs, fmt.Sprintf("Switching to best node from %q to %q", node.String(), bestNode.String()))` $DIR/common/client/multi_node_test.go: `.Sprintf("Switching to best node from %q to %q", node.String(), bestNode.String())` $DIR/common/client/multi_node_test.go: `.String()` $DIR/common/client/multi_node_test.go: `.String()` $DIR/common/client/multi_node_test.go: `.AssertEventually(t, func() bool { mn.activeMu.RLock() active := mn.activeNode mn.activeMu.RUnlock() return bestNode == active })` $DIR/common/client/multi_node_test.go: `.activeMu.RLock()` $DIR/common/client/multi_node_test.go: `.activeMu.RUnlock()` $DIR/common/client/multi_node_test.go: `.NewIDFromInt(10)` $DIR/common/client/multi_node_test.go: `.On("Name")` $DIR/common/client/multi_node_test.go: `.Return(name)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.On("State")` $DIR/common/client/multi_node_test.go: `.Return(state)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.On("Name")` $DIR/common/client/multi_node_test.go: `.Return(sendOnlyName)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.On("State")` $DIR/common/client/multi_node_test.go: `.Return(state)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.String()` $DIR/common/client/multi_node_test.go: `.String()` $DIR/common/client/multi_node_test.go: `.NodeStates()` $DIR/common/client/multi_node_test.go: `.Run("Returns same node, if it's still healthy", func(t *testing.T) { t.Parallel() chainID := types.RandomID() node1 := newMockNode[types.ID, types.Head[Hashable], multiNodeRPCClient](t) node1.On("State").Return(nodeStateAlive).Once() node1.On("String").Return("node1").Maybe() node2 := newMockNode[types.ID, types.Head[Hashable], multiNodeRPCClient](t) node2.On("String").Return("node2").Maybe() mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{node1, node2}, }) nodeSelector := newMockNodeSelector[types.ID, types.Head[Hashable], multiNodeRPCClient](t) nodeSelector.On("Select").Return(node1).Once() mn.nodeSelector = nodeSelector prevActiveNode, err := mn.selectNode() require.NoError(t, err) require.Equal(t, node1.String(), prevActiveNode.String()) newActiveNode, err := mn.selectNode() require.NoError(t, err) require.Equal(t, prevActiveNode.String(), newActiveNode.String()) })` $DIR/common/client/multi_node_test.go: `.RandomID()` $DIR/common/client/multi_node_test.go: `.On("State")` $DIR/common/client/multi_node_test.go: `.Return(nodeStateAlive)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.On("String")` $DIR/common/client/multi_node_test.go: `.Return("node1")` $DIR/common/client/multi_node_test.go: `.Maybe()` $DIR/common/client/multi_node_test.go: `.On("String")` $DIR/common/client/multi_node_test.go: `.Return("node2")` $DIR/common/client/multi_node_test.go: `.Maybe()` $DIR/common/client/multi_node_test.go: `.On("Select")` $DIR/common/client/multi_node_test.go: `.Return(node1)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.selectNode()` $DIR/common/client/multi_node_test.go: `.selectNode()` $DIR/common/client/multi_node_test.go: `.Run("Updates node if active is not healthy", func(t *testing.T) { t.Parallel() chainID := types.RandomID() oldBest := newMockNode[types.ID, types.Head[Hashable], multiNodeRPCClient](t) oldBest.On("String").Return("oldBest").Maybe() newBest := newMockNode[types.ID, types.Head[Hashable], multiNodeRPCClient](t) newBest.On("String").Return("newBest").Maybe() mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{oldBest, newBest}, }) nodeSelector := newMockNodeSelector[types.ID, types.Head[Hashable], multiNodeRPCClient](t) nodeSelector.On("Select").Return(oldBest).Once() mn.nodeSelector = nodeSelector activeNode, err := mn.selectNode() require.NoError(t, err) require.Equal(t, oldBest.String(), activeNode.String()) // old best died, so we should replace it oldBest.On("State").Return(nodeStateOutOfSync).Twice() nodeSelector.On("Select").Return(newBest).Once() newActiveNode, err := mn.selectNode() require.NoError(t, err) require.Equal(t, newBest.String(), newActiveNode.String()) })` $DIR/common/client/multi_node_test.go: `.RandomID()` $DIR/common/client/multi_node_test.go: `.On("String")` $DIR/common/client/multi_node_test.go: `.Return("oldBest")` $DIR/common/client/multi_node_test.go: `.Maybe()` $DIR/common/client/multi_node_test.go: `.On("String")` $DIR/common/client/multi_node_test.go: `.Return("newBest")` $DIR/common/client/multi_node_test.go: `.Maybe()` $DIR/common/client/multi_node_test.go: `.On("Select")` $DIR/common/client/multi_node_test.go: `.Return(oldBest)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.selectNode()` $DIR/common/client/multi_node_test.go: `.On("State")` $DIR/common/client/multi_node_test.go: `.Return(nodeStateOutOfSync)` $DIR/common/client/multi_node_test.go: `.Twice()` $DIR/common/client/multi_node_test.go: `.On("Select")` $DIR/common/client/multi_node_test.go: `.Return(newBest)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.selectNode()` $DIR/common/client/multi_node_test.go: `.RandomID()` $DIR/common/client/multi_node_test.go: `.TestObserved(t, zap.InfoLevel)` $DIR/common/client/multi_node_test.go: `.On("Select")` $DIR/common/client/multi_node_test.go: `.Return(nil)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.On("Name")` $DIR/common/client/multi_node_test.go: `.Return("MockedNodeSelector")` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.selectNode()` $DIR/common/client/multi_node_test.go: `.RequireLogMessage(t, observedLogs, "No live RPC nodes available")` $DIR/common/client/multi_node_test.go: `.NewInt(0)` $DIR/common/client/multi_node_test.go: `.NewInt(10)` $DIR/common/client/multi_node_test.go: `.NewInt(2000)` $DIR/common/client/multi_node_test.go: `.NewInt(9)` $DIR/common/client/multi_node_test.go: `.NewInt(10)` $DIR/common/client/multi_node_test.go: `.RandomID()` $DIR/common/client/multi_node_test.go: `.Run(tc.Name, func(t *testing.T) { for _, params := range tc.NodeParams { node := newMockNode[types.ID, types.Head[Hashable], multiNodeRPCClient](t) node.On("StateAndLatest").Return(params.State, params.BlockNumber, params.TotalDifficulty) mn.nodes = append(mn.nodes, node) } nNodes, blockNum, td := mn.nLiveNodes() assert.Equal(t, tc.ExpectedNLiveNodes, nNodes) assert.Equal(t, tc.ExpectedTotalDifficulty, td) assert.Equal(t, tc.ExpectedBlockNumber, blockNum) })` $DIR/common/client/multi_node_test.go: `.On("StateAndLatest")` $DIR/common/client/multi_node_test.go: `.Return(params.State, params.BlockNumber, params.TotalDifficulty)` $DIR/common/client/multi_node_test.go: `.nLiveNodes()` $DIR/common/client/multi_node_test.go: `.Run("Fails if failed to select active node", func(t *testing.T) { chainID := types.RandomID() mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, }) nodeSelector := newMockNodeSelector[types.ID, types.Head[Hashable], multiNodeRPCClient](t) nodeSelector.On("Select").Return(nil).Once() nodeSelector.On("Name").Return("MockedNodeSelector").Once() mn.nodeSelector = nodeSelector err := mn.BatchCallContextAll(tests.Context(t), nil) require.EqualError(t, err, ErroringNodeError.Error()) })` $DIR/common/client/multi_node_test.go: `.RandomID()` $DIR/common/client/multi_node_test.go: `.On("Select")` $DIR/common/client/multi_node_test.go: `.Return(nil)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.On("Name")` $DIR/common/client/multi_node_test.go: `.Return("MockedNodeSelector")` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.BatchCallContextAll(tests.Context(t), nil)` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.Run("Returns error if RPC call fails for active node", func(t *testing.T) { chainID := types.RandomID() rpc := newMultiNodeRPCClient(t) expectedError := errors.New("rpc failed to do the batch call") rpc.On("BatchCallContext", mock.Anything, mock.Anything).Return(expectedError).Once() node := newMockNode[types.ID, types.Head[Hashable], multiNodeRPCClient](t) node.On("RPC").Return(rpc) nodeSelector := newMockNodeSelector[types.ID, types.Head[Hashable], multiNodeRPCClient](t) nodeSelector.On("Select").Return(node).Once() mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, }) mn.nodeSelector = nodeSelector err := mn.BatchCallContextAll(tests.Context(t), nil) require.EqualError(t, err, expectedError.Error()) })` $DIR/common/client/multi_node_test.go: `.RandomID()` $DIR/common/client/multi_node_test.go: `.New("rpc failed to do the batch call")` $DIR/common/client/multi_node_test.go: `.On("BatchCallContext", mock.Anything, mock.Anything)` $DIR/common/client/multi_node_test.go: `.Return(expectedError)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.On("RPC")` $DIR/common/client/multi_node_test.go: `.Return(rpc)` $DIR/common/client/multi_node_test.go: `.On("Select")` $DIR/common/client/multi_node_test.go: `.Return(node)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.BatchCallContextAll(tests.Context(t), nil)` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.Run("Waits for all nodes to complete the call and logs results", func(t *testing.T) { // setup RPCs failedRPC := newMultiNodeRPCClient(t) failedRPC.On("BatchCallContext", mock.Anything, mock.Anything). Return(errors.New("rpc failed to do the batch call")).Once() okRPC := newMultiNodeRPCClient(t) okRPC.On("BatchCallContext", mock.Anything, mock.Anything).Return(nil).Twice() // setup ok and failed auxiliary nodes okNode := newMockSendOnlyNode[types.ID, multiNodeRPCClient](t) okNode.On("RPC").Return(okRPC).Once() okNode.On("State").Return(nodeStateAlive) failedNode := newMockNode[types.ID, types.Head[Hashable], multiNodeRPCClient](t) failedNode.On("RPC").Return(failedRPC).Once() failedNode.On("State").Return(nodeStateAlive) // setup main node mainNode := newMockNode[types.ID, types.Head[Hashable], multiNodeRPCClient](t) mainNode.On("RPC").Return(okRPC) nodeSelector := newMockNodeSelector[types.ID, types.Head[Hashable], multiNodeRPCClient](t) nodeSelector.On("Select").Return(mainNode).Once() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: types.RandomID(), nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{failedNode, mainNode}, sendonlys: []SendOnlyNode[types.ID, multiNodeRPCClient]{okNode}, logger: lggr, }) mn.nodeSelector = nodeSelector err := mn.BatchCallContextAll(tests.Context(t), nil) require.NoError(t, err) tests.RequireLogMessage(t, observedLogs, "Secondary node BatchCallContext failed") })` $DIR/common/client/multi_node_test.go: `.On("BatchCallContext", mock.Anything, mock.Anything)` $DIR/common/client/multi_node_test.go: `. Return(errors.New("rpc failed to do the batch call"))` $DIR/common/client/multi_node_test.go: `.New("rpc failed to do the batch call")` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.On("BatchCallContext", mock.Anything, mock.Anything)` $DIR/common/client/multi_node_test.go: `.Return(nil)` $DIR/common/client/multi_node_test.go: `.Twice()` $DIR/common/client/multi_node_test.go: `.On("RPC")` $DIR/common/client/multi_node_test.go: `.Return(okRPC)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.On("State")` $DIR/common/client/multi_node_test.go: `.Return(nodeStateAlive)` $DIR/common/client/multi_node_test.go: `.On("RPC")` $DIR/common/client/multi_node_test.go: `.Return(failedRPC)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.On("State")` $DIR/common/client/multi_node_test.go: `.Return(nodeStateAlive)` $DIR/common/client/multi_node_test.go: `.On("RPC")` $DIR/common/client/multi_node_test.go: `.Return(okRPC)` $DIR/common/client/multi_node_test.go: `.On("Select")` $DIR/common/client/multi_node_test.go: `.Return(mainNode)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/multi_node_test.go: `.RandomID()` $DIR/common/client/multi_node_test.go: `.BatchCallContextAll(tests.Context(t), nil)` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.RequireLogMessage(t, observedLogs, "Secondary node BatchCallContext failed")` $DIR/common/client/multi_node_test.go: `.On("BatchCallContext", mock.Anything, mock.Anything)` $DIR/common/client/multi_node_test.go: `.Return(nil)` $DIR/common/client/multi_node_test.go: `.Twice()` $DIR/common/client/multi_node_test.go: `.On("RPC")` $DIR/common/client/multi_node_test.go: `.Return(okRPC)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.On("State")` $DIR/common/client/multi_node_test.go: `.Return(nodeStateAlive)` $DIR/common/client/multi_node_test.go: `.On("State")` $DIR/common/client/multi_node_test.go: `.Return(nodeStateUnreachable)` $DIR/common/client/multi_node_test.go: `.On("RPC")` $DIR/common/client/multi_node_test.go: `.Return(okRPC)` $DIR/common/client/multi_node_test.go: `.On("Select")` $DIR/common/client/multi_node_test.go: `.Return(mainNode)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.RandomID()` $DIR/common/client/multi_node_test.go: `.BatchCallContextAll(tests.Context(t), nil)` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.On("SendTransaction", mock.Anything, mock.Anything)` $DIR/common/client/multi_node_test.go: `.Return(txErr)` $DIR/common/client/multi_node_test.go: `.Run(sendTxRun)` $DIR/common/client/multi_node_test.go: `.Maybe()` $DIR/common/client/multi_node_test.go: `.On("String")` $DIR/common/client/multi_node_test.go: `.Return("node name")` $DIR/common/client/multi_node_test.go: `.Maybe()` $DIR/common/client/multi_node_test.go: `.On("RPC")` $DIR/common/client/multi_node_test.go: `.Return(rpc)` $DIR/common/client/multi_node_test.go: `.Maybe()` $DIR/common/client/multi_node_test.go: `.On("State")` $DIR/common/client/multi_node_test.go: `.Return(state)` $DIR/common/client/multi_node_test.go: `.Maybe()` $DIR/common/client/multi_node_test.go: `.On("Close")` $DIR/common/client/multi_node_test.go: `.Return(nil)` $DIR/common/client/multi_node_test.go: `.Once()` $DIR/common/client/multi_node_test.go: `.StartOnce("startedTestMultiNode", func() error { return nil })` $DIR/common/client/multi_node_test.go: `.Cleanup(func() { require.NoError(t, mn.Close()) })` $DIR/common/client/multi_node_test.go: `.Run("Fails if there is no nodes available", func(t *testing.T) { mn := newStartedMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: types.RandomID(), }) err := mn.SendTransaction(tests.Context(t), nil) assert.EqualError(t, err, ErroringNodeError.Error()) })` $DIR/common/client/multi_node_test.go: `.RandomID()` $DIR/common/client/multi_node_test.go: `.SendTransaction(tests.Context(t), nil)` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.Run("Transaction failure happy path", func(t *testing.T) { chainID := types.RandomID() expectedError := errors.New("transaction failed") mainNode := newNode(t, expectedError, nil) lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) mn := newStartedMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{mainNode}, sendonlys: []SendOnlyNode[types.ID, multiNodeRPCClient]{newNode(t, errors.New("unexpected error"), nil)}, classifySendTxError: classifySendTxError, logger: lggr, }) err := mn.SendTransaction(tests.Context(t), nil) require.EqualError(t, err, expectedError.Error()) tests.AssertLogCountEventually(t, observedLogs, "Node sent transaction", 2) tests.AssertLogCountEventually(t, observedLogs, "RPC returned error", 2) })` $DIR/common/client/multi_node_test.go: `.RandomID()` $DIR/common/client/multi_node_test.go: `.New("transaction failed")` $DIR/common/client/multi_node_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/multi_node_test.go: `.New("unexpected error")` $DIR/common/client/multi_node_test.go: `.SendTransaction(tests.Context(t), nil)` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.AssertLogCountEventually(t, observedLogs, "Node sent transaction", 2)` $DIR/common/client/multi_node_test.go: `.AssertLogCountEventually(t, observedLogs, "RPC returned error", 2)` $DIR/common/client/multi_node_test.go: `.Run("Transaction success happy path", func(t *testing.T) { chainID := types.RandomID() mainNode := newNode(t, nil, nil) lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) mn := newStartedMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{mainNode}, sendonlys: []SendOnlyNode[types.ID, multiNodeRPCClient]{newNode(t, errors.New("unexpected error"), nil)}, classifySendTxError: classifySendTxError, logger: lggr, }) err := mn.SendTransaction(tests.Context(t), nil) require.NoError(t, err) tests.AssertLogCountEventually(t, observedLogs, "Node sent transaction", 2) tests.AssertLogCountEventually(t, observedLogs, "RPC returned error", 1) })` $DIR/common/client/multi_node_test.go: `.RandomID()` $DIR/common/client/multi_node_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/multi_node_test.go: `.New("unexpected error")` $DIR/common/client/multi_node_test.go: `.SendTransaction(tests.Context(t), nil)` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.AssertLogCountEventually(t, observedLogs, "Node sent transaction", 2)` $DIR/common/client/multi_node_test.go: `.AssertLogCountEventually(t, observedLogs, "RPC returned error", 1)` $DIR/common/client/multi_node_test.go: `.Run("Context expired before collecting sufficient results", func(t *testing.T) { chainID := types.RandomID() testContext, testCancel := context.WithCancel(tests.Context(t)) defer testCancel() mainNode := newNode(t, errors.New("unexpected error"), func(_ mock.Arguments) { // block caller til end of the test <-testContext.Done() }) mn := newStartedMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{mainNode}, classifySendTxError: classifySendTxError, }) requestContext, cancel := context.WithCancel(tests.Context(t)) cancel() err := mn.SendTransaction(requestContext, nil) require.EqualError(t, err, "context canceled") })` $DIR/common/client/multi_node_test.go: `.RandomID()` $DIR/common/client/multi_node_test.go: `.WithCancel(tests.Context(t))` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.New("unexpected error")` $DIR/common/client/multi_node_test.go: `.Done()` $DIR/common/client/multi_node_test.go: `.WithCancel(tests.Context(t))` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.SendTransaction(requestContext, nil)` $DIR/common/client/multi_node_test.go: `.Run("Soft timeout stops results collection", func(t *testing.T) { chainID := types.RandomID() expectedError := errors.New("tmp error") fastNode := newNode(t, expectedError, nil) // hold reply from the node till end of the test testContext, testCancel := context.WithCancel(tests.Context(t)) defer testCancel() slowNode := newNode(t, errors.New("transaction failed"), func(_ mock.Arguments) { // block caller til end of the test <-testContext.Done() }) mn := newStartedMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{fastNode, slowNode}, classifySendTxError: classifySendTxError, sendTxSoftTimeout: tests.TestInterval, }) err := mn.SendTransaction(tests.Context(t), nil) require.EqualError(t, err, expectedError.Error()) })` $DIR/common/client/multi_node_test.go: `.RandomID()` $DIR/common/client/multi_node_test.go: `.New("tmp error")` $DIR/common/client/multi_node_test.go: `.WithCancel(tests.Context(t))` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.New("transaction failed")` $DIR/common/client/multi_node_test.go: `.Done()` $DIR/common/client/multi_node_test.go: `.SendTransaction(tests.Context(t), nil)` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.Run("Returns success without waiting for the rest of the nodes", func(t *testing.T) { chainID := types.RandomID() fastNode := newNode(t, nil, nil) // hold reply from the node till end of the test testContext, testCancel := context.WithCancel(tests.Context(t)) defer testCancel() slowNode := newNode(t, errors.New("transaction failed"), func(_ mock.Arguments) { // block caller til end of the test <-testContext.Done() }) slowSendOnly := newNode(t, errors.New("send only failed"), func(_ mock.Arguments) { // block caller til end of the test <-testContext.Done() }) lggr, observedLogs := logger.TestObserved(t, zap.WarnLevel) mn := newTestMultiNode(t, multiNodeOpts{ logger: lggr, selectionMode: NodeSelectionModeRoundRobin, chainID: chainID, nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{fastNode, slowNode}, sendonlys: []SendOnlyNode[types.ID, multiNodeRPCClient]{slowSendOnly}, classifySendTxError: classifySendTxError, sendTxSoftTimeout: tests.TestInterval, }) assert.NoError(t, mn.StartOnce("startedTestMultiNode", func() error { return nil })) err := mn.SendTransaction(tests.Context(t), nil) require.NoError(t, err) testCancel() require.NoError(t, mn.Close()) tests.AssertLogEventually(t, observedLogs, "observed invariant violation on SendTransaction") })` $DIR/common/client/multi_node_test.go: `.RandomID()` $DIR/common/client/multi_node_test.go: `.WithCancel(tests.Context(t))` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.New("transaction failed")` $DIR/common/client/multi_node_test.go: `.Done()` $DIR/common/client/multi_node_test.go: `.New("send only failed")` $DIR/common/client/multi_node_test.go: `.Done()` $DIR/common/client/multi_node_test.go: `.TestObserved(t, zap.WarnLevel)` $DIR/common/client/multi_node_test.go: `.SendTransaction(tests.Context(t), nil)` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.AssertLogEventually(t, observedLogs, "observed invariant violation on SendTransaction")` $DIR/common/client/multi_node_test.go: `.Run("Fails when closed", func(t *testing.T) { mn := newTestMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: types.RandomID(), nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{newNode(t, nil, nil)}, sendonlys: []SendOnlyNode[types.ID, multiNodeRPCClient]{newNode(t, nil, nil)}, classifySendTxError: classifySendTxError, }) err := mn.StartOnce("startedTestMultiNode", func() error { return nil }) require.NoError(t, err) require.NoError(t, mn.Close()) err = mn.SendTransaction(tests.Context(t), nil) require.EqualError(t, err, "aborted while broadcasting tx - multiNode is stopped: context canceled") })` $DIR/common/client/multi_node_test.go: `.RandomID()` $DIR/common/client/multi_node_test.go: `.StartOnce("startedTestMultiNode", func() error { return nil })` $DIR/common/client/multi_node_test.go: `.SendTransaction(tests.Context(t), nil)` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.Run("Returns error if there is no healthy primary nodes", func(t *testing.T) { mn := newStartedMultiNode(t, multiNodeOpts{ selectionMode: NodeSelectionModeRoundRobin, chainID: types.RandomID(), nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{newNodeWithState(t, nodeStateUnreachable, nil, nil)}, sendonlys: []SendOnlyNode[types.ID, multiNodeRPCClient]{newNodeWithState(t, nodeStateUnreachable, nil, nil)}, classifySendTxError: classifySendTxError, }) err := mn.SendTransaction(tests.Context(t), nil) assert.EqualError(t, err, ErroringNodeError.Error()) })` $DIR/common/client/multi_node_test.go: `.RandomID()` $DIR/common/client/multi_node_test.go: `.SendTransaction(tests.Context(t), nil)` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.RandomID()` $DIR/common/client/multi_node_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/multi_node_test.go: `.New("unexpected error")` $DIR/common/client/multi_node_test.go: `.SendTransaction(tests.Context(t), nil)` $DIR/common/client/multi_node_test.go: `.Context(t)` $DIR/common/client/multi_node_test.go: `.AssertLogCountEventually(t, observedLogs, "Node sent transaction", 2)` $DIR/common/client/multi_node_test.go: `.AssertLogCountEventually(t, observedLogs, "RPC returned error", 1)` $DIR/common/client/multi_node_test.go: `.New("success")` $DIR/common/client/multi_node_test.go: `.New("fatal")` $DIR/common/client/multi_node_test.go: `.New("tx_already_known")` $DIR/common/client/multi_node_test.go: `.New("unsupported")` $DIR/common/client/multi_node_test.go: `.New("retryable")` $DIR/common/client/multi_node_test.go: `.New("underpriced")` $DIR/common/client/multi_node_test.go: `.New("retryable")` $DIR/common/client/multi_node_test.go: `.New("insufficientFunds")` $DIR/common/client/multi_node_test.go: `.New("not enough keccak counters to continue the execution")` $DIR/common/client/multi_node_test.go: `.Run(testCase.Name, func(t *testing.T) { txResult, err := aggregateTxResults(testCase.ResultsByCode) if testCase.ExpectedTxResult == "" { assert.NoError(t, err) } else { assert.EqualError(t, txResult, testCase.ExpectedTxResult) } logger.Sugared(logger.Test(t)).Info("Map: " + fmt.Sprint(testCase.ResultsByCode)) logger.Sugared(logger.Test(t)).Criticalw("observed invariant violation on SendTransaction", "resultsByCode", testCase.ResultsByCode, "err", err) if testCase.ExpectedCriticalErr == "" { assert.NoError(t, err) } else { assert.EqualError(t, err, testCase.ExpectedCriticalErr) } })` $DIR/common/client/multi_node_test.go: `.Sugared(logger.Test(t))` $DIR/common/client/multi_node_test.go: `.Test(t)` $DIR/common/client/multi_node_test.go: `.Info("Map: " + fmt.Sprint(testCase.ResultsByCode))` $DIR/common/client/multi_node_test.go: `.Sprint(testCase.ResultsByCode)` $DIR/common/client/multi_node_test.go: `.Sugared(logger.Test(t))` $DIR/common/client/multi_node_test.go: `.Test(t)` $DIR/common/client/multi_node_test.go: `.Criticalw("observed invariant violation on SendTransaction", "resultsByCode", testCase.ResultsByCode, "err", err)` $DIR/common/client/node_fsm_test.go: `t.Run("setState", func(t *testing.T) { n := newTestNode(t, testNodeOpts{rpc: nil, config: testNodeConfig{nodeIsSyncingEnabled: true}}) assert.Equal(t, nodeStateUndialed, n.State()) n.setState(nodeStateAlive) assert.Equal(t, nodeStateAlive, n.State()) n.setState(nodeStateUndialed) assert.Equal(t, nodeStateUndialed, n.State()) })` $DIR/common/client/node_fsm_test.go: `n.setState(nodeStateAlive)` $DIR/common/client/node_fsm_test.go: `n.setState(nodeStateUndialed)` $DIR/common/client/node_fsm_test.go: `t.Run("transitionToAlive", func(t *testing.T) { const destinationState = nodeStateAlive allowedStates := []nodeState{nodeStateDialed, nodeStateInvalidChainID, nodeStateSyncing} rpc := newMockNodeClient[types.ID, Head](t) testTransition(t, rpc, testNode.transitionToAlive, destinationState, allowedStates...) })` $DIR/common/client/node_fsm_test.go: `testTransition(t, rpc, testNode.transitionToAlive, destinationState, allowedStates...)` $DIR/common/client/node_fsm_test.go: `t.Run("transitionToInSync", func(t *testing.T) { const destinationState = nodeStateAlive allowedStates := []nodeState{nodeStateOutOfSync, nodeStateSyncing} rpc := newMockNodeClient[types.ID, Head](t) testTransition(t, rpc, testNode.transitionToInSync, destinationState, allowedStates...) })` $DIR/common/client/node_fsm_test.go: `testTransition(t, rpc, testNode.transitionToInSync, destinationState, allowedStates...)` $DIR/common/client/node_fsm_test.go: `t.Run("transitionToOutOfSync", func(t *testing.T) { const destinationState = nodeStateOutOfSync allowedStates := []nodeState{nodeStateAlive} rpc := newMockNodeClient[types.ID, Head](t) rpc.On("DisconnectAll").Once() testTransition(t, rpc, testNode.transitionToOutOfSync, destinationState, allowedStates...) })` $DIR/common/client/node_fsm_test.go: `rpc.On("DisconnectAll").Once()` $DIR/common/client/node_fsm_test.go: `testTransition(t, rpc, testNode.transitionToOutOfSync, destinationState, allowedStates...)` $DIR/common/client/node_fsm_test.go: `t.Run("transitionToUnreachable", func(t *testing.T) { const destinationState = nodeStateUnreachable allowedStates := []nodeState{nodeStateUndialed, nodeStateDialed, nodeStateAlive, nodeStateOutOfSync, nodeStateInvalidChainID, nodeStateSyncing} rpc := newMockNodeClient[types.ID, Head](t) rpc.On("DisconnectAll").Times(len(allowedStates)) testTransition(t, rpc, testNode.transitionToUnreachable, destinationState, allowedStates...) })` $DIR/common/client/node_fsm_test.go: `rpc.On("DisconnectAll").Times(len(allowedStates))` $DIR/common/client/node_fsm_test.go: `testTransition(t, rpc, testNode.transitionToUnreachable, destinationState, allowedStates...)` $DIR/common/client/node_fsm_test.go: `t.Run("transitionToInvalidChain", func(t *testing.T) { const destinationState = nodeStateInvalidChainID allowedStates := []nodeState{nodeStateDialed, nodeStateOutOfSync, nodeStateSyncing} rpc := newMockNodeClient[types.ID, Head](t) rpc.On("DisconnectAll").Times(len(allowedStates)) testTransition(t, rpc, testNode.transitionToInvalidChainID, destinationState, allowedStates...) })` $DIR/common/client/node_fsm_test.go: `rpc.On("DisconnectAll").Times(len(allowedStates))` $DIR/common/client/node_fsm_test.go: `testTransition(t, rpc, testNode.transitionToInvalidChainID, destinationState, allowedStates...)` $DIR/common/client/node_fsm_test.go: `t.Run("transitionToSyncing", func(t *testing.T) { const destinationState = nodeStateSyncing allowedStates := []nodeState{nodeStateDialed, nodeStateOutOfSync, nodeStateInvalidChainID} rpc := newMockNodeClient[types.ID, Head](t) rpc.On("DisconnectAll").Times(len(allowedStates)) testTransition(t, rpc, testNode.transitionToSyncing, destinationState, allowedStates...) })` $DIR/common/client/node_fsm_test.go: `rpc.On("DisconnectAll").Times(len(allowedStates))` $DIR/common/client/node_fsm_test.go: `testTransition(t, rpc, testNode.transitionToSyncing, destinationState, allowedStates...)` $DIR/common/client/node_fsm_test.go: `rpc.On("DisconnectAll").Once()` $DIR/common/client/node_fsm_test.go: `node.setState(nodeStateDialed)` $DIR/common/client/node_fsm_test.go: `.Run("setState", func(t *testing.T) { n := newTestNode(t, testNodeOpts{rpc: nil, config: testNodeConfig{nodeIsSyncingEnabled: true}}) assert.Equal(t, nodeStateUndialed, n.State()) n.setState(nodeStateAlive) assert.Equal(t, nodeStateAlive, n.State()) n.setState(nodeStateUndialed) assert.Equal(t, nodeStateUndialed, n.State()) })` $DIR/common/client/node_fsm_test.go: `.setState(nodeStateAlive)` $DIR/common/client/node_fsm_test.go: `.setState(nodeStateUndialed)` $DIR/common/client/node_fsm_test.go: `.Run("transitionToAlive", func(t *testing.T) { const destinationState = nodeStateAlive allowedStates := []nodeState{nodeStateDialed, nodeStateInvalidChainID, nodeStateSyncing} rpc := newMockNodeClient[types.ID, Head](t) testTransition(t, rpc, testNode.transitionToAlive, destinationState, allowedStates...) })` $DIR/common/client/node_fsm_test.go: `.Run("transitionToInSync", func(t *testing.T) { const destinationState = nodeStateAlive allowedStates := []nodeState{nodeStateOutOfSync, nodeStateSyncing} rpc := newMockNodeClient[types.ID, Head](t) testTransition(t, rpc, testNode.transitionToInSync, destinationState, allowedStates...) })` $DIR/common/client/node_fsm_test.go: `.Run("transitionToOutOfSync", func(t *testing.T) { const destinationState = nodeStateOutOfSync allowedStates := []nodeState{nodeStateAlive} rpc := newMockNodeClient[types.ID, Head](t) rpc.On("DisconnectAll").Once() testTransition(t, rpc, testNode.transitionToOutOfSync, destinationState, allowedStates...) })` $DIR/common/client/node_fsm_test.go: `.On("DisconnectAll")` $DIR/common/client/node_fsm_test.go: `.Once()` $DIR/common/client/node_fsm_test.go: `.Run("transitionToUnreachable", func(t *testing.T) { const destinationState = nodeStateUnreachable allowedStates := []nodeState{nodeStateUndialed, nodeStateDialed, nodeStateAlive, nodeStateOutOfSync, nodeStateInvalidChainID, nodeStateSyncing} rpc := newMockNodeClient[types.ID, Head](t) rpc.On("DisconnectAll").Times(len(allowedStates)) testTransition(t, rpc, testNode.transitionToUnreachable, destinationState, allowedStates...) })` $DIR/common/client/node_fsm_test.go: `.On("DisconnectAll")` $DIR/common/client/node_fsm_test.go: `.Times(len(allowedStates))` $DIR/common/client/node_fsm_test.go: `.Run("transitionToInvalidChain", func(t *testing.T) { const destinationState = nodeStateInvalidChainID allowedStates := []nodeState{nodeStateDialed, nodeStateOutOfSync, nodeStateSyncing} rpc := newMockNodeClient[types.ID, Head](t) rpc.On("DisconnectAll").Times(len(allowedStates)) testTransition(t, rpc, testNode.transitionToInvalidChainID, destinationState, allowedStates...) })` $DIR/common/client/node_fsm_test.go: `.On("DisconnectAll")` $DIR/common/client/node_fsm_test.go: `.Times(len(allowedStates))` $DIR/common/client/node_fsm_test.go: `.Run("transitionToSyncing", func(t *testing.T) { const destinationState = nodeStateSyncing allowedStates := []nodeState{nodeStateDialed, nodeStateOutOfSync, nodeStateInvalidChainID} rpc := newMockNodeClient[types.ID, Head](t) rpc.On("DisconnectAll").Times(len(allowedStates)) testTransition(t, rpc, testNode.transitionToSyncing, destinationState, allowedStates...) })` $DIR/common/client/node_fsm_test.go: `.On("DisconnectAll")` $DIR/common/client/node_fsm_test.go: `.Times(len(allowedStates))` $DIR/common/client/node_fsm_test.go: `.On("DisconnectAll")` $DIR/common/client/node_fsm_test.go: `.Once()` $DIR/common/client/node_fsm_test.go: `.setState(nodeStateDialed)` $DIR/common/client/node_fsm_test.go: `.AssertNotCalled(t)` $DIR/common/client/node_lifecycle_test.go: `opts.rpc.On("Close").Return(nil).Once()` $DIR/common/client/node_lifecycle_test.go: `node.setState(nodeStateDialed)` $DIR/common/client/node_lifecycle_test.go: `t.Run("returns on closed", func(t *testing.T) { node := newTestNode(t, testNodeOpts{}) node.setState(nodeStateClosed) node.wg.Add(1) node.aliveLoop() })` $DIR/common/client/node_lifecycle_test.go: `node.setState(nodeStateClosed)` $DIR/common/client/node_lifecycle_test.go: `node.wg.Add(1)` $DIR/common/client/node_lifecycle_test.go: `node.aliveLoop()` $DIR/common/client/node_lifecycle_test.go: `t.Run("if initial subscribe fails, transitions to unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) node := newDialedNode(t, testNodeOpts{ rpc: rpc, }) defer func() { assert.NoError(t, node.close()) }() expectedError := errors.New("failed to subscribe to rpc") rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Return(nil, expectedError).Once() rpc.On("DisconnectAll").Once() // might be called in unreachable loop rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe() node.declareAlive() tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Return(nil, expectedError).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("DisconnectAll").Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe()` $DIR/common/client/node_lifecycle_test.go: `node.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `t.Run("if remote RPC connection is closed transitions to unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) lggr, observedLogs := logger.TestObserved(t, zap.WarnLevel) node := newDialedNode(t, testNodeOpts{ rpc: rpc, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() sub := mocks.NewSubscription(t) errChan := make(chan error) close(errChan) sub.On("Err").Return((<-chan error)(errChan)).Once() sub.On("Unsubscribe").Once() rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Return(sub, nil).Once() rpc.On("SetAliveLoopSub", sub).Once() // disconnects all on transfer to unreachable rpc.On("DisconnectAll").Once() // might be called in unreachable loop rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe() node.declareAlive() tests.AssertLogEventually(t, observedLogs, "Subscription was terminated") assert.Equal(t, nodeStateUnreachable, node.State()) })` $DIR/common/client/node_lifecycle_test.go: `close(errChan)` $DIR/common/client/node_lifecycle_test.go: `sub.On("Err").Return((<-chan error)(errChan)).Once()` $DIR/common/client/node_lifecycle_test.go: `sub.On("Unsubscribe").Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Return(sub, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("SetAliveLoopSub", sub).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("DisconnectAll").Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe()` $DIR/common/client/node_lifecycle_test.go: `node.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogEventually(t, observedLogs, "Subscription was terminated")` $DIR/common/client/node_lifecycle_test.go: `sub.On("Err").Return((<-chan error)(nil))` $DIR/common/client/node_lifecycle_test.go: `sub.On("Unsubscribe").Once()` $DIR/common/client/node_lifecycle_test.go: `opts.rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Return(sub, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `opts.rpc.On("SetAliveLoopSub", sub).Once()` $DIR/common/client/node_lifecycle_test.go: `t.Run("Stays alive and waits for signal", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newSubscribedNode(t, testNodeOpts{ config: testNodeConfig{}, rpc: rpc, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() node.declareAlive() tests.AssertLogEventually(t, observedLogs, "Head liveness checking disabled") tests.AssertLogEventually(t, observedLogs, "Polling disabled") assert.Equal(t, nodeStateAlive, node.State()) })` $DIR/common/client/node_lifecycle_test.go: `node.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogEventually(t, observedLogs, "Head liveness checking disabled")` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogEventually(t, observedLogs, "Polling disabled")` $DIR/common/client/node_lifecycle_test.go: `t.Run("stays alive while below pollFailureThreshold and resets counter on success", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) const pollFailureThreshold = 3 node := newSubscribedNode(t, testNodeOpts{ config: testNodeConfig{ pollFailureThreshold: pollFailureThreshold, pollInterval: tests.TestInterval, }, rpc: rpc, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() pollError := errors.New("failed to get ClientVersion") // 1. Return error several times, but below threshold rpc.On("ClientVersion", mock.Anything).Return("", pollError).Run(func(_ mock.Arguments) { // stays healthy while below threshold assert.Equal(t, nodeStateAlive, node.State()) }).Times(pollFailureThreshold - 1) // 2. Successful call that is expected to reset counter rpc.On("ClientVersion", mock.Anything).Return("client_version", nil).Once() // 3. Return error. If we have not reset the timer, we'll transition to nonAliveState rpc.On("ClientVersion", mock.Anything).Return("", pollError).Once() // 4. Once during the call, check if node is alive var ensuredAlive atomic.Bool rpc.On("ClientVersion", mock.Anything).Return("client_version", nil).Run(func(_ mock.Arguments) { if ensuredAlive.Load() { return } ensuredAlive.Store(true) assert.Equal(t, nodeStateAlive, node.State()) }).Once() // redundant call to stay in alive state rpc.On("ClientVersion", mock.Anything).Return("client_version", nil) node.declareAlive() tests.AssertLogCountEventually(t, observedLogs, fmt.Sprintf("Poll failure, RPC endpoint %s failed to respond properly", node.String()), pollFailureThreshold) tests.AssertLogCountEventually(t, observedLogs, "Version poll successful", 2) assert.True(t, ensuredAlive.Load(), "expected to ensure that node was alive") })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ClientVersion", mock.Anything).Return("", pollError).Run(func(_ mock.Arguments) { // stays healthy while below threshold assert.Equal(t, nodeStateAlive, node.State()) }).Times(pollFailureThreshold - 1)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ClientVersion", mock.Anything).Return("client_version", nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ClientVersion", mock.Anything).Return("", pollError).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ClientVersion", mock.Anything).Return("client_version", nil).Run(func(_ mock.Arguments) { if ensuredAlive.Load() { return } ensuredAlive.Store(true) assert.Equal(t, nodeStateAlive, node.State()) }).Once()` $DIR/common/client/node_lifecycle_test.go: `ensuredAlive.Store(true)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ClientVersion", mock.Anything).Return("client_version", nil)` $DIR/common/client/node_lifecycle_test.go: `node.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogCountEventually(t, observedLogs, fmt.Sprintf("Poll failure, RPC endpoint %s failed to respond properly", node.String()), pollFailureThreshold)` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogCountEventually(t, observedLogs, "Version poll successful", 2)` $DIR/common/client/node_lifecycle_test.go: `t.Run("with threshold poll failures, transitions to unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) const pollFailureThreshold = 3 node := newSubscribedNode(t, testNodeOpts{ config: testNodeConfig{ pollFailureThreshold: pollFailureThreshold, pollInterval: tests.TestInterval, }, rpc: rpc, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() pollError := errors.New("failed to get ClientVersion") rpc.On("ClientVersion", mock.Anything).Return("", pollError) // disconnects all on transfer to unreachable rpc.On("DisconnectAll").Once() // might be called in unreachable loop rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe() node.declareAlive() tests.AssertLogCountEventually(t, observedLogs, fmt.Sprintf("Poll failure, RPC endpoint %s failed to respond properly", node.String()), pollFailureThreshold) tests.AssertEventually(t, func() bool { return nodeStateUnreachable == node.State() }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ClientVersion", mock.Anything).Return("", pollError)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("DisconnectAll").Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe()` $DIR/common/client/node_lifecycle_test.go: `node.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogCountEventually(t, observedLogs, fmt.Sprintf("Poll failure, RPC endpoint %s failed to respond properly", node.String()), pollFailureThreshold)` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return nodeStateUnreachable == node.State() })` $DIR/common/client/node_lifecycle_test.go: `t.Run("with threshold poll failures, but we are the last node alive, forcibly keeps it alive", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) const pollFailureThreshold = 3 node := newSubscribedNode(t, testNodeOpts{ config: testNodeConfig{ pollFailureThreshold: pollFailureThreshold, pollInterval: tests.TestInterval, }, rpc: rpc, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() node.nLiveNodes = func() (count int, blockNumber int64, totalDifficulty *big.Int) { return 1, 20, big.NewInt(10) } pollError := errors.New("failed to get ClientVersion") rpc.On("ClientVersion", mock.Anything).Return("", pollError) node.declareAlive() tests.AssertLogEventually(t, observedLogs, fmt.Sprintf("RPC endpoint failed to respond to %d consecutive polls", pollFailureThreshold)) assert.Equal(t, nodeStateAlive, node.State()) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ClientVersion", mock.Anything).Return("", pollError)` $DIR/common/client/node_lifecycle_test.go: `node.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogEventually(t, observedLogs, fmt.Sprintf("RPC endpoint failed to respond to %d consecutive polls", pollFailureThreshold))` $DIR/common/client/node_lifecycle_test.go: `t.Run("when behind more than SyncThreshold, transitions to out of sync", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) const syncThreshold = 10 node := newSubscribedNode(t, testNodeOpts{ config: testNodeConfig{ pollInterval: tests.TestInterval, syncThreshold: syncThreshold, selectionMode: NodeSelectionModeRoundRobin, }, rpc: rpc, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() node.stateLatestBlockNumber = 20 node.nLiveNodes = func() (count int, blockNumber int64, totalDifficulty *big.Int) { return 10, syncThreshold + node.stateLatestBlockNumber + 1, big.NewInt(10) } rpc.On("ClientVersion", mock.Anything).Return("", nil) // tries to redial in outOfSync rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Run(func(_ mock.Arguments) { assert.Equal(t, nodeStateOutOfSync, node.State()) }).Once() // disconnects all on transfer to unreachable or outOfSync rpc.On("DisconnectAll").Maybe() // might be called in unreachable loop rpc.On("Dial", mock.Anything).Run(func(_ mock.Arguments) { require.Equal(t, nodeStateOutOfSync, node.State()) }).Return(errors.New("failed to dial")).Maybe() node.declareAlive() tests.AssertLogEventually(t, observedLogs, "Dial failed: Node is unreachable") })` $DIR/common/client/node_lifecycle_test.go: `node.stateLatestBlockNumber = 20` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ClientVersion", mock.Anything).Return("", nil)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Run(func(_ mock.Arguments) { assert.Equal(t, nodeStateOutOfSync, node.State()) }).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("DisconnectAll").Maybe()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Run(func(_ mock.Arguments) { require.Equal(t, nodeStateOutOfSync, node.State()) }).Return(errors.New("failed to dial")).Maybe()` $DIR/common/client/node_lifecycle_test.go: `node.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogEventually(t, observedLogs, "Dial failed: Node is unreachable")` $DIR/common/client/node_lifecycle_test.go: `t.Run("when behind more than SyncThreshold but we are the last live node, forcibly stays alive", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) const syncThreshold = 10 node := newSubscribedNode(t, testNodeOpts{ config: testNodeConfig{ pollInterval: tests.TestInterval, syncThreshold: syncThreshold, selectionMode: NodeSelectionModeRoundRobin, }, rpc: rpc, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() node.stateLatestBlockNumber = 20 node.nLiveNodes = func() (count int, blockNumber int64, totalDifficulty *big.Int) { return 1, syncThreshold + node.stateLatestBlockNumber + 1, big.NewInt(10) } rpc.On("ClientVersion", mock.Anything).Return("", nil) node.declareAlive() tests.AssertLogEventually(t, observedLogs, fmt.Sprintf("RPC endpoint has fallen behind; %s %s", msgCannotDisable, msgDegradedState)) })` $DIR/common/client/node_lifecycle_test.go: `node.stateLatestBlockNumber = 20` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ClientVersion", mock.Anything).Return("", nil)` $DIR/common/client/node_lifecycle_test.go: `node.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogEventually(t, observedLogs, fmt.Sprintf("RPC endpoint has fallen behind; %s %s", msgCannotDisable, msgDegradedState))` $DIR/common/client/node_lifecycle_test.go: `t.Run("when behind but SyncThreshold=0, stay alive", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newSubscribedNode(t, testNodeOpts{ config: testNodeConfig{ pollInterval: tests.TestInterval, syncThreshold: 0, selectionMode: NodeSelectionModeRoundRobin, }, rpc: rpc, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() node.stateLatestBlockNumber = 20 node.nLiveNodes = func() (count int, blockNumber int64, totalDifficulty *big.Int) { return 1, node.stateLatestBlockNumber + 100, big.NewInt(10) } rpc.On("ClientVersion", mock.Anything).Return("", nil) node.declareAlive() tests.AssertLogCountEventually(t, observedLogs, "Version poll successful", 2) assert.Equal(t, nodeStateAlive, node.State()) })` $DIR/common/client/node_lifecycle_test.go: `node.stateLatestBlockNumber = 20` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ClientVersion", mock.Anything).Return("", nil)` $DIR/common/client/node_lifecycle_test.go: `node.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogCountEventually(t, observedLogs, "Version poll successful", 2)` $DIR/common/client/node_lifecycle_test.go: `t.Run("when no new heads received for threshold, transitions to out of sync", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) node := newSubscribedNode(t, testNodeOpts{ config: testNodeConfig{}, chainConfig: clientMocks.ChainConfig{ NoNewHeadsThresholdVal: tests.TestInterval, }, rpc: rpc, }) defer func() { assert.NoError(t, node.close()) }() // tries to redial in outOfSync rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Run(func(_ mock.Arguments) { assert.Equal(t, nodeStateOutOfSync, node.State()) }).Once() // disconnects all on transfer to unreachable or outOfSync rpc.On("DisconnectAll").Maybe() // might be called in unreachable loop rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe() node.declareAlive() tests.AssertEventually(t, func() bool { // right after outOfSync we'll transfer to unreachable due to returned error on Dial // we check that we were in out of sync state on first Dial call return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Run(func(_ mock.Arguments) { assert.Equal(t, nodeStateOutOfSync, node.State()) }).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("DisconnectAll").Maybe()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe()` $DIR/common/client/node_lifecycle_test.go: `node.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { // right after outOfSync we'll transfer to unreachable due to returned error on Dial // we check that we were in out of sync state on first Dial call return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `t.Run("when no new heads received for threshold but we are the last live node, forcibly stays alive", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newSubscribedNode(t, testNodeOpts{ config: testNodeConfig{}, lggr: lggr, chainConfig: clientMocks.ChainConfig{ NoNewHeadsThresholdVal: tests.TestInterval, }, rpc: rpc, }) defer func() { assert.NoError(t, node.close()) }() node.nLiveNodes = func() (count int, blockNumber int64, totalDifficulty *big.Int) { return 1, 20, big.NewInt(10) } node.declareAlive() tests.AssertLogEventually(t, observedLogs, fmt.Sprintf("RPC endpoint detected out of sync; %s %s", msgCannotDisable, msgDegradedState)) assert.Equal(t, nodeStateAlive, node.State()) })` $DIR/common/client/node_lifecycle_test.go: `node.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogEventually(t, observedLogs, fmt.Sprintf("RPC endpoint detected out of sync; %s %s", msgCannotDisable, msgDegradedState))` $DIR/common/client/node_lifecycle_test.go: `t.Run("rpc closed head channel", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) sub := mocks.NewSubscription(t) sub.On("Err").Return((<-chan error)(nil)) sub.On("Unsubscribe").Once() rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Run(func(args mock.Arguments) { ch := args.Get(1).(chan<- Head) close(ch) }).Return(sub, nil).Once() rpc.On("SetAliveLoopSub", sub).Once() lggr, observedLogs := logger.TestObserved(t, zap.ErrorLevel) node := newDialedNode(t, testNodeOpts{ lggr: lggr, config: testNodeConfig{}, chainConfig: clientMocks.ChainConfig{ NoNewHeadsThresholdVal: tests.TestInterval, }, rpc: rpc, }) defer func() { assert.NoError(t, node.close()) }() // disconnects all on transfer to unreachable or outOfSync rpc.On("DisconnectAll").Once() // might be called in unreachable loop rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe() node.declareAlive() tests.AssertLogEventually(t, observedLogs, "Subscription channel unexpectedly closed") assert.Equal(t, nodeStateUnreachable, node.State()) })` $DIR/common/client/node_lifecycle_test.go: `sub.On("Err").Return((<-chan error)(nil))` $DIR/common/client/node_lifecycle_test.go: `sub.On("Unsubscribe").Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Run(func(args mock.Arguments) { ch := args.Get(1).(chan<- Head) close(ch) }).Return(sub, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `close(ch)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("SetAliveLoopSub", sub).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("DisconnectAll").Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe()` $DIR/common/client/node_lifecycle_test.go: `node.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogEventually(t, observedLogs, "Subscription channel unexpectedly closed")` $DIR/common/client/node_lifecycle_test.go: `t.Run("updates block number and difficulty on new head", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) sub := mocks.NewSubscription(t) sub.On("Err").Return((<-chan error)(nil)) sub.On("Unsubscribe").Once() expectedBlockNumber := rand.Int64() expectedDiff := big.NewInt(rand.Int64()) rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Run(func(args mock.Arguments) { ch := args.Get(1).(chan<- Head) go writeHeads(t, ch, head{BlockNumber: expectedBlockNumber, BlockDifficulty: expectedDiff}) }).Return(sub, nil).Once() rpc.On("SetAliveLoopSub", sub).Once() node := newDialedNode(t, testNodeOpts{ config: testNodeConfig{}, rpc: rpc, }) defer func() { assert.NoError(t, node.close()) }() node.declareAlive() tests.AssertEventually(t, func() bool { state, block, diff := node.StateAndLatest() return state == nodeStateAlive && block == expectedBlockNumber == bigmath.Equal(diff, expectedDiff) }) })` $DIR/common/client/node_lifecycle_test.go: `sub.On("Err").Return((<-chan error)(nil))` $DIR/common/client/node_lifecycle_test.go: `sub.On("Unsubscribe").Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Run(func(args mock.Arguments) { ch := args.Get(1).(chan<- Head) go writeHeads(t, ch, head{BlockNumber: expectedBlockNumber, BlockDifficulty: expectedDiff}) }).Return(sub, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `go writeHeads(t, ch, head{BlockNumber: expectedBlockNumber, BlockDifficulty: expectedDiff})` $DIR/common/client/node_lifecycle_test.go: `rpc.On("SetAliveLoopSub", sub).Once()` $DIR/common/client/node_lifecycle_test.go: `node.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { state, block, diff := node.StateAndLatest() return state == nodeStateAlive && block == expectedBlockNumber == bigmath.Equal(diff, expectedDiff) })` $DIR/common/client/node_lifecycle_test.go: `t.Run("If finality tag is not enabled updates finalized block metric using finality depth and latest head", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) sub := mocks.NewSubscription(t) sub.On("Err").Return((<-chan error)(nil)) sub.On("Unsubscribe").Once() const blockNumber = 1000 const finalityDepth = 10 const expectedBlock = 990 rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Run(func(args mock.Arguments) { ch := args.Get(1).(chan<- Head) go writeHeads(t, ch, head{BlockNumber: blockNumber - 1}, head{BlockNumber: blockNumber}, head{BlockNumber: blockNumber - 1}) }).Return(sub, nil).Once() rpc.On("SetAliveLoopSub", sub).Once() name := "node-" + rand.Str(5) node := newDialedNode(t, testNodeOpts{ config: testNodeConfig{}, chainConfig: clientMocks.ChainConfig{FinalityDepthVal: finalityDepth}, rpc: rpc, name: name, chainID: big.NewInt(1), }) defer func() { assert.NoError(t, node.close()) }() node.declareAlive() tests.AssertEventually(t, func() bool { metric, err := promPoolRPCNodeHighestFinalizedBlock.GetMetricWithLabelValues(big.NewInt(1).String(), name) require.NoError(t, err) var m = &prom.Metric{} require.NoError(t, metric.Write(m)) return float64(expectedBlock) == m.Gauge.GetValue() }) })` $DIR/common/client/node_lifecycle_test.go: `sub.On("Err").Return((<-chan error)(nil))` $DIR/common/client/node_lifecycle_test.go: `sub.On("Unsubscribe").Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Run(func(args mock.Arguments) { ch := args.Get(1).(chan<- Head) go writeHeads(t, ch, head{BlockNumber: blockNumber - 1}, head{BlockNumber: blockNumber}, head{BlockNumber: blockNumber - 1}) }).Return(sub, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `go writeHeads(t, ch, head{BlockNumber: blockNumber - 1}, head{BlockNumber: blockNumber}, head{BlockNumber: blockNumber - 1})` $DIR/common/client/node_lifecycle_test.go: `rpc.On("SetAliveLoopSub", sub).Once()` $DIR/common/client/node_lifecycle_test.go: `node.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { metric, err := promPoolRPCNodeHighestFinalizedBlock.GetMetricWithLabelValues(big.NewInt(1).String(), name) require.NoError(t, err) var m = &prom.Metric{} require.NoError(t, metric.Write(m)) return float64(expectedBlock) == m.Gauge.GetValue() })` $DIR/common/client/node_lifecycle_test.go: `t.Run("Logs warning if failed to get finalized block", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) rpc.On("LatestFinalizedBlock", mock.Anything).Return(newMockHead(t), errors.New("failed to get finalized block")) sub := mocks.NewSubscription(t) sub.On("Err").Return((<-chan error)(nil)) sub.On("Unsubscribe").Once() rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Return(sub, nil).Once() rpc.On("SetAliveLoopSub", sub).Once() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newDialedNode(t, testNodeOpts{ config: testNodeConfig{ finalizedBlockPollInterval: tests.TestInterval, }, chainConfig: clientMocks.ChainConfig{ IsFinalityTagEnabled: true, }, rpc: rpc, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() node.declareAlive() tests.AssertLogEventually(t, observedLogs, "Failed to fetch latest finalized block") })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("LatestFinalizedBlock", mock.Anything).Return(newMockHead(t), errors.New("failed to get finalized block"))` $DIR/common/client/node_lifecycle_test.go: `sub.On("Err").Return((<-chan error)(nil))` $DIR/common/client/node_lifecycle_test.go: `sub.On("Unsubscribe").Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Return(sub, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("SetAliveLoopSub", sub).Once()` $DIR/common/client/node_lifecycle_test.go: `node.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogEventually(t, observedLogs, "Failed to fetch latest finalized block")` $DIR/common/client/node_lifecycle_test.go: `t.Run("Logs warning if latest finalized block is not valid", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) head := newMockHead(t) head.On("IsValid").Return(false) rpc.On("LatestFinalizedBlock", mock.Anything).Return(head, nil) sub := mocks.NewSubscription(t) sub.On("Err").Return((<-chan error)(nil)) sub.On("Unsubscribe").Once() rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Return(sub, nil).Once() rpc.On("SetAliveLoopSub", sub).Once() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newDialedNode(t, testNodeOpts{ config: testNodeConfig{ finalizedBlockPollInterval: tests.TestInterval, }, chainConfig: clientMocks.ChainConfig{ IsFinalityTagEnabled: true, }, rpc: rpc, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() node.declareAlive() tests.AssertLogEventually(t, observedLogs, "Latest finalized block is not valid") })` $DIR/common/client/node_lifecycle_test.go: `head.On("IsValid").Return(false)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("LatestFinalizedBlock", mock.Anything).Return(head, nil)` $DIR/common/client/node_lifecycle_test.go: `sub.On("Err").Return((<-chan error)(nil))` $DIR/common/client/node_lifecycle_test.go: `sub.On("Unsubscribe").Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Return(sub, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("SetAliveLoopSub", sub).Once()` $DIR/common/client/node_lifecycle_test.go: `node.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogEventually(t, observedLogs, "Latest finalized block is not valid")` $DIR/common/client/node_lifecycle_test.go: `rpc.On("LatestFinalizedBlock", mock.Anything).Return(head{BlockNumber: expectedBlock - 1}.ToMockHead(t), nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("LatestFinalizedBlock", mock.Anything).Return(head{BlockNumber: expectedBlock}.ToMockHead(t), nil)` $DIR/common/client/node_lifecycle_test.go: `sub.On("Err").Return((<-chan error)(nil))` $DIR/common/client/node_lifecycle_test.go: `sub.On("Unsubscribe").Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Run(func(args mock.Arguments) { ch := args.Get(1).(chan<- Head) // ensure that "calculated" finalized head is larger than actual, to ensure we are correctly setting // the metric go writeHeads(t, ch, head{BlockNumber: expectedBlock*2 + finalityDepth}) }).Return(sub, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `go writeHeads(t, ch, head{BlockNumber: expectedBlock*2 + finalityDepth})` $DIR/common/client/node_lifecycle_test.go: `rpc.On("SetAliveLoopSub", sub).Once()` $DIR/common/client/node_lifecycle_test.go: `node.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { metric, err := promPoolRPCNodeHighestFinalizedBlock.GetMetricWithLabelValues(big.NewInt(1).String(), name) require.NoError(t, err) var m = &prom.Metric{} require.NoError(t, metric.Write(m)) return float64(expectedBlock) == m.Gauge.GetValue() })` $DIR/common/client/node_lifecycle_test.go: `opts.rpc.On("Close").Return(nil).Once()` $DIR/common/client/node_lifecycle_test.go: `opts.rpc.On("DisconnectAll")` $DIR/common/client/node_lifecycle_test.go: `node.setState(nodeStateAlive)` $DIR/common/client/node_lifecycle_test.go: `t.Run("returns on closed", func(t *testing.T) { t.Parallel() node := newTestNode(t, testNodeOpts{}) node.setState(nodeStateClosed) node.wg.Add(1) node.outOfSyncLoop(stubIsOutOfSync) })` $DIR/common/client/node_lifecycle_test.go: `node.setState(nodeStateClosed)` $DIR/common/client/node_lifecycle_test.go: `node.wg.Add(1)` $DIR/common/client/node_lifecycle_test.go: `node.outOfSyncLoop(stubIsOutOfSync)` $DIR/common/client/node_lifecycle_test.go: `t.Run("on old blocks stays outOfSync and returns on close", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil).Once() rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once() outOfSyncSubscription := mocks.NewSubscription(t) outOfSyncSubscription.On("Err").Return((<-chan error)(nil)) outOfSyncSubscription.On("Unsubscribe").Once() heads := []head{{BlockNumber: 7}, {BlockNumber: 11}, {BlockNumber: 13}} rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Run(func(args mock.Arguments) { ch := args.Get(1).(chan<- Head) go writeHeads(t, ch, heads...) }).Return(outOfSyncSubscription, nil).Once() rpc.On("Dial", mock.Anything).Return(errors.New("failed to redial")).Maybe() node.declareOutOfSync(func(num int64, td *big.Int) bool { return true }) tests.AssertLogCountEventually(t, observedLogs, msgReceivedBlock, len(heads)) assert.Equal(t, nodeStateOutOfSync, node.State()) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `outOfSyncSubscription.On("Err").Return((<-chan error)(nil))` $DIR/common/client/node_lifecycle_test.go: `outOfSyncSubscription.On("Unsubscribe").Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Run(func(args mock.Arguments) { ch := args.Get(1).(chan<- Head) go writeHeads(t, ch, heads...) }).Return(outOfSyncSubscription, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `go writeHeads(t, ch, heads...)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(errors.New("failed to redial")).Maybe()` $DIR/common/client/node_lifecycle_test.go: `node.declareOutOfSync(func(num int64, td *big.Int) bool { return true })` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogCountEventually(t, observedLogs, msgReceivedBlock, len(heads))` $DIR/common/client/node_lifecycle_test.go: `t.Run("if initial dial fails, transitions to unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) node := newAliveNode(t, testNodeOpts{ rpc: rpc, }) defer func() { assert.NoError(t, node.close()) }() expectedError := errors.New("failed to dial rpc") // might be called again in unreachable loop, so no need to set once rpc.On("Dial", mock.Anything).Return(expectedError) node.declareOutOfSync(stubIsOutOfSync) tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(expectedError)` $DIR/common/client/node_lifecycle_test.go: `node.declareOutOfSync(stubIsOutOfSync)` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `t.Run("if fail to get chainID, transitions to unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) node := newAliveNode(t, testNodeOpts{ rpc: rpc, }) defer func() { assert.NoError(t, node.close()) }() // for out-of-sync rpc.On("Dial", mock.Anything).Return(nil).Once() // for unreachable rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe() expectedError := errors.New("failed to get chain ID") // might be called multiple times rpc.On("ChainID", mock.Anything).Return(types.NewIDFromInt(0), expectedError) node.declareOutOfSync(stubIsOutOfSync) tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(types.NewIDFromInt(0), expectedError)` $DIR/common/client/node_lifecycle_test.go: `node.declareOutOfSync(stubIsOutOfSync)` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `t.Run("if chainID does not match, transitions to invalidChainID", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.NewIDFromInt(10) rpcChainID := types.NewIDFromInt(11) node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, }) defer func() { assert.NoError(t, node.close()) }() // one for out-of-sync & one for invalid chainID rpc.On("Dial", mock.Anything).Return(nil).Twice() // might be called multiple times rpc.On("ChainID", mock.Anything).Return(rpcChainID, nil) node.declareOutOfSync(stubIsOutOfSync) tests.AssertEventually(t, func() bool { return node.State() == nodeStateInvalidChainID }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil).Twice()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(rpcChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `node.declareOutOfSync(stubIsOutOfSync)` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateInvalidChainID })` $DIR/common/client/node_lifecycle_test.go: `t.Run("if syncing, transitions to syncing", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.NewIDFromInt(10) node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, config: testNodeConfig{nodeIsSyncingEnabled: true}, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil) rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil) // might be called multiple times rpc.On("IsSyncing", mock.Anything).Return(true, nil) node.declareOutOfSync(stubIsOutOfSync) tests.AssertEventually(t, func() bool { return node.State() == nodeStateSyncing }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("IsSyncing", mock.Anything).Return(true, nil)` $DIR/common/client/node_lifecycle_test.go: `node.declareOutOfSync(stubIsOutOfSync)` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateSyncing })` $DIR/common/client/node_lifecycle_test.go: `t.Run("if fails to fetch syncing status, transitions to unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.NewIDFromInt(10) node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, config: testNodeConfig{nodeIsSyncingEnabled: true}, }) defer func() { assert.NoError(t, node.close()) }() // one for out-of-sync rpc.On("Dial", mock.Anything).Return(nil).Once() // for unreachable rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe() rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once() // might be called multiple times rpc.On("IsSyncing", mock.Anything).Return(false, errors.New("failed to check syncing")) node.declareOutOfSync(stubIsOutOfSync) tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("IsSyncing", mock.Anything).Return(false, errors.New("failed to check syncing"))` $DIR/common/client/node_lifecycle_test.go: `node.declareOutOfSync(stubIsOutOfSync)` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `t.Run("if fails to subscribe, becomes unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil).Once() rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once() expectedError := errors.New("failed to subscribe") rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Return(nil, expectedError) rpc.On("Dial", mock.Anything).Return(errors.New("failed to redial")).Maybe() node.declareOutOfSync(stubIsOutOfSync) tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Return(nil, expectedError)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(errors.New("failed to redial")).Maybe()` $DIR/common/client/node_lifecycle_test.go: `node.declareOutOfSync(stubIsOutOfSync)` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `t.Run("on subscription termination becomes unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.ErrorLevel) node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil).Once() rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once() sub := mocks.NewSubscription(t) errChan := make(chan error, 1) errChan <- errors.New("subscription was terminate") sub.On("Err").Return((<-chan error)(errChan)) sub.On("Unsubscribe").Once() rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Return(sub, nil).Once() rpc.On("Dial", mock.Anything).Return(errors.New("failed to redial")).Maybe() node.declareOutOfSync(stubIsOutOfSync) tests.AssertLogEventually(t, observedLogs, "Subscription was terminated") tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `errChan <- errors.New("subscription was terminate")` $DIR/common/client/node_lifecycle_test.go: `sub.On("Err").Return((<-chan error)(errChan))` $DIR/common/client/node_lifecycle_test.go: `sub.On("Unsubscribe").Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Return(sub, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(errors.New("failed to redial")).Maybe()` $DIR/common/client/node_lifecycle_test.go: `node.declareOutOfSync(stubIsOutOfSync)` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogEventually(t, observedLogs, "Subscription was terminated")` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `t.Run("becomes unreachable if head channel is closed", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.ErrorLevel) node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil).Once() rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once() sub := mocks.NewSubscription(t) sub.On("Err").Return((<-chan error)(nil)) sub.On("Unsubscribe").Once() rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Run(func(args mock.Arguments) { ch := args.Get(1).(chan<- Head) close(ch) }).Return(sub, nil).Once() rpc.On("Dial", mock.Anything).Return(errors.New("failed to redial")).Maybe() node.declareOutOfSync(stubIsOutOfSync) tests.AssertLogEventually(t, observedLogs, "Subscription channel unexpectedly closed") tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `sub.On("Err").Return((<-chan error)(nil))` $DIR/common/client/node_lifecycle_test.go: `sub.On("Unsubscribe").Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Run(func(args mock.Arguments) { ch := args.Get(1).(chan<- Head) close(ch) }).Return(sub, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `close(ch)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(errors.New("failed to redial")).Maybe()` $DIR/common/client/node_lifecycle_test.go: `node.declareOutOfSync(stubIsOutOfSync)` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogEventually(t, observedLogs, "Subscription channel unexpectedly closed")` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `t.Run("becomes alive if it receives a newer head", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil).Once() rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once() outOfSyncSubscription := mocks.NewSubscription(t) outOfSyncSubscription.On("Err").Return((<-chan error)(nil)) outOfSyncSubscription.On("Unsubscribe").Once() const highestBlock = 1000 rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Run(func(args mock.Arguments) { ch := args.Get(1).(chan<- Head) go writeHeads(t, ch, head{BlockNumber: highestBlock - 1}, head{BlockNumber: highestBlock}) }).Return(outOfSyncSubscription, nil).Once() setupRPCForAliveLoop(t, rpc) node.declareOutOfSync(func(num int64, td *big.Int) bool { return num < highestBlock }) tests.AssertLogEventually(t, observedLogs, msgReceivedBlock) tests.AssertLogEventually(t, observedLogs, msgInSync) tests.AssertEventually(t, func() bool { return node.State() == nodeStateAlive }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `outOfSyncSubscription.On("Err").Return((<-chan error)(nil))` $DIR/common/client/node_lifecycle_test.go: `outOfSyncSubscription.On("Unsubscribe").Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Run(func(args mock.Arguments) { ch := args.Get(1).(chan<- Head) go writeHeads(t, ch, head{BlockNumber: highestBlock - 1}, head{BlockNumber: highestBlock}) }).Return(outOfSyncSubscription, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `go writeHeads(t, ch, head{BlockNumber: highestBlock - 1}, head{BlockNumber: highestBlock})` $DIR/common/client/node_lifecycle_test.go: `setupRPCForAliveLoop(t, rpc)` $DIR/common/client/node_lifecycle_test.go: `node.declareOutOfSync(func(num int64, td *big.Int) bool { return num < highestBlock })` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogEventually(t, observedLogs, msgReceivedBlock)` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogEventually(t, observedLogs, msgInSync)` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateAlive })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `outOfSyncSubscription.On("Err").Return((<-chan error)(nil))` $DIR/common/client/node_lifecycle_test.go: `outOfSyncSubscription.On("Unsubscribe").Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Return(outOfSyncSubscription, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `setupRPCForAliveLoop(t, rpc)` $DIR/common/client/node_lifecycle_test.go: `node.declareOutOfSync(stubIsOutOfSync)` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogEventually(t, observedLogs, "RPC endpoint is still out of sync, but there are no other available nodes. This RPC node will be forcibly moved back into the live pool in a degraded state")` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateAlive })` $DIR/common/client/node_lifecycle_test.go: `opts.rpc.On("Close").Return(nil).Once()` $DIR/common/client/node_lifecycle_test.go: `opts.rpc.On("DisconnectAll")` $DIR/common/client/node_lifecycle_test.go: `node.setState(nodeStateAlive)` $DIR/common/client/node_lifecycle_test.go: `t.Run("returns on closed", func(t *testing.T) { t.Parallel() node := newTestNode(t, testNodeOpts{}) node.setState(nodeStateClosed) node.wg.Add(1) node.unreachableLoop() })` $DIR/common/client/node_lifecycle_test.go: `node.setState(nodeStateClosed)` $DIR/common/client/node_lifecycle_test.go: `node.wg.Add(1)` $DIR/common/client/node_lifecycle_test.go: `node.unreachableLoop()` $DIR/common/client/node_lifecycle_test.go: `t.Run("on failed redial, keeps trying", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")) node.declareUnreachable() tests.AssertLogCountEventually(t, observedLogs, "Failed to redial RPC node; still unreachable", 2) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial"))` $DIR/common/client/node_lifecycle_test.go: `node.declareUnreachable()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogCountEventually(t, observedLogs, "Failed to redial RPC node; still unreachable", 2)` $DIR/common/client/node_lifecycle_test.go: `t.Run("on failed chainID verification, keep trying", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil) rpc.On("ChainID", mock.Anything).Run(func(_ mock.Arguments) { assert.Equal(t, nodeStateDialed, node.State()) }).Return(nodeChainID, errors.New("failed to get chain id")) node.declareUnreachable() tests.AssertLogCountEventually(t, observedLogs, "Failed to verify chain ID for node", 2) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Run(func(_ mock.Arguments) { assert.Equal(t, nodeStateDialed, node.State()) }).Return(nodeChainID, errors.New("failed to get chain id"))` $DIR/common/client/node_lifecycle_test.go: `node.declareUnreachable()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogCountEventually(t, observedLogs, "Failed to verify chain ID for node", 2)` $DIR/common/client/node_lifecycle_test.go: `t.Run("on chain ID mismatch transitions to invalidChainID", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.NewIDFromInt(10) rpcChainID := types.NewIDFromInt(11) node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil) rpc.On("ChainID", mock.Anything).Return(rpcChainID, nil) node.declareUnreachable() tests.AssertEventually(t, func() bool { return node.State() == nodeStateInvalidChainID }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(rpcChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `node.declareUnreachable()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateInvalidChainID })` $DIR/common/client/node_lifecycle_test.go: `t.Run("on syncing status check failure, keeps trying", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, config: testNodeConfig{nodeIsSyncingEnabled: true}, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil) rpc.On("ChainID", mock.Anything).Run(func(_ mock.Arguments) { assert.Equal(t, nodeStateDialed, node.State()) }).Return(nodeChainID, nil) rpc.On("IsSyncing", mock.Anything).Return(false, errors.New("failed to check syncing status")) node.declareUnreachable() tests.AssertLogCountEventually(t, observedLogs, "Unexpected error while verifying RPC node synchronization status", 2) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Run(func(_ mock.Arguments) { assert.Equal(t, nodeStateDialed, node.State()) }).Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("IsSyncing", mock.Anything).Return(false, errors.New("failed to check syncing status"))` $DIR/common/client/node_lifecycle_test.go: `node.declareUnreachable()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogCountEventually(t, observedLogs, "Unexpected error while verifying RPC node synchronization status", 2)` $DIR/common/client/node_lifecycle_test.go: `t.Run("on syncing, transitions to syncing state", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, config: testNodeConfig{nodeIsSyncingEnabled: true}, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil) rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil) rpc.On("IsSyncing", mock.Anything).Return(true, nil) setupRPCForAliveLoop(t, rpc) node.declareUnreachable() tests.AssertEventually(t, func() bool { return node.State() == nodeStateSyncing }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("IsSyncing", mock.Anything).Return(true, nil)` $DIR/common/client/node_lifecycle_test.go: `setupRPCForAliveLoop(t, rpc)` $DIR/common/client/node_lifecycle_test.go: `node.declareUnreachable()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateSyncing })` $DIR/common/client/node_lifecycle_test.go: `t.Run("on successful verification becomes alive", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, config: testNodeConfig{nodeIsSyncingEnabled: true}, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil) rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil) rpc.On("IsSyncing", mock.Anything).Return(false, nil) setupRPCForAliveLoop(t, rpc) node.declareUnreachable() tests.AssertEventually(t, func() bool { return node.State() == nodeStateAlive }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("IsSyncing", mock.Anything).Return(false, nil)` $DIR/common/client/node_lifecycle_test.go: `setupRPCForAliveLoop(t, rpc)` $DIR/common/client/node_lifecycle_test.go: `node.declareUnreachable()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateAlive })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `setupRPCForAliveLoop(t, rpc)` $DIR/common/client/node_lifecycle_test.go: `node.declareUnreachable()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateAlive })` $DIR/common/client/node_lifecycle_test.go: `opts.rpc.On("Close").Return(nil).Once()` $DIR/common/client/node_lifecycle_test.go: `opts.rpc.On("DisconnectAll")` $DIR/common/client/node_lifecycle_test.go: `node.setState(nodeStateDialed)` $DIR/common/client/node_lifecycle_test.go: `t.Run("returns on closed", func(t *testing.T) { t.Parallel() node := newTestNode(t, testNodeOpts{}) node.setState(nodeStateClosed) node.wg.Add(1) node.invalidChainIDLoop() })` $DIR/common/client/node_lifecycle_test.go: `node.setState(nodeStateClosed)` $DIR/common/client/node_lifecycle_test.go: `node.wg.Add(1)` $DIR/common/client/node_lifecycle_test.go: `node.invalidChainIDLoop()` $DIR/common/client/node_lifecycle_test.go: `t.Run("on invalid dial becomes unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() node := newDialedNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")) node.declareInvalidChainID() tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial"))` $DIR/common/client/node_lifecycle_test.go: `node.declareInvalidChainID()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `t.Run("on failed chainID call becomes unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newDialedNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("ChainID", mock.Anything).Return(nodeChainID, errors.New("failed to get chain id")) // once for chainID and maybe another one for unreachable rpc.On("Dial", mock.Anything).Return(nil).Once() rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe() node.declareInvalidChainID() tests.AssertLogEventually(t, observedLogs, "Failed to verify chain ID for node") tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(nodeChainID, errors.New("failed to get chain id"))` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe()` $DIR/common/client/node_lifecycle_test.go: `node.declareInvalidChainID()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogEventually(t, observedLogs, "Failed to verify chain ID for node")` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `t.Run("on chainID mismatch keeps trying", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.NewIDFromInt(10) rpcChainID := types.NewIDFromInt(11) lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newDialedNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil).Once() rpc.On("ChainID", mock.Anything).Return(rpcChainID, nil) node.declareInvalidChainID() tests.AssertLogCountEventually(t, observedLogs, "Failed to verify RPC node; remote endpoint returned the wrong chain ID", 2) tests.AssertEventually(t, func() bool { return node.State() == nodeStateInvalidChainID }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(rpcChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `node.declareInvalidChainID()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogCountEventually(t, observedLogs, "Failed to verify RPC node; remote endpoint returned the wrong chain ID", 2)` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateInvalidChainID })` $DIR/common/client/node_lifecycle_test.go: `t.Run("on successful verification without isSyncing becomes alive", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.NewIDFromInt(10) rpcChainID := types.NewIDFromInt(11) node := newDialedNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil).Once() rpc.On("ChainID", mock.Anything).Return(rpcChainID, nil).Once() rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once() setupRPCForAliveLoop(t, rpc) node.declareInvalidChainID() tests.AssertEventually(t, func() bool { return node.State() == nodeStateAlive }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(rpcChainID, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `setupRPCForAliveLoop(t, rpc)` $DIR/common/client/node_lifecycle_test.go: `node.declareInvalidChainID()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateAlive })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(rpcChainID, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("IsSyncing", mock.Anything).Return(false, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `setupRPCForAliveLoop(t, rpc)` $DIR/common/client/node_lifecycle_test.go: `node.declareInvalidChainID()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateAlive })` $DIR/common/client/node_lifecycle_test.go: `opts.rpc.On("Close").Return(nil).Once()` $DIR/common/client/node_lifecycle_test.go: `t.Run("if fails on initial dial, becomes unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")) // disconnects all on transfer to unreachable rpc.On("DisconnectAll") err := node.Start(tests.Context(t)) assert.NoError(t, err) tests.AssertLogEventually(t, observedLogs, "Dial failed: Node is unreachable") tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial"))` $DIR/common/client/node_lifecycle_test.go: `rpc.On("DisconnectAll")` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogEventually(t, observedLogs, "Dial failed: Node is unreachable")` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `t.Run("if chainID verification fails, becomes unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil) rpc.On("ChainID", mock.Anything).Run(func(_ mock.Arguments) { assert.Equal(t, nodeStateDialed, node.State()) }).Return(nodeChainID, errors.New("failed to get chain id")) // disconnects all on transfer to unreachable rpc.On("DisconnectAll") err := node.Start(tests.Context(t)) assert.NoError(t, err) tests.AssertLogEventually(t, observedLogs, "Failed to verify chain ID for node") tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Run(func(_ mock.Arguments) { assert.Equal(t, nodeStateDialed, node.State()) }).Return(nodeChainID, errors.New("failed to get chain id"))` $DIR/common/client/node_lifecycle_test.go: `rpc.On("DisconnectAll")` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogEventually(t, observedLogs, "Failed to verify chain ID for node")` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `t.Run("on chain ID mismatch transitions to invalidChainID", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.NewIDFromInt(10) rpcChainID := types.NewIDFromInt(11) node := newNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil) rpc.On("ChainID", mock.Anything).Return(rpcChainID, nil) // disconnects all on transfer to unreachable rpc.On("DisconnectAll") err := node.Start(tests.Context(t)) assert.NoError(t, err) tests.AssertEventually(t, func() bool { return node.State() == nodeStateInvalidChainID }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(rpcChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("DisconnectAll")` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateInvalidChainID })` $DIR/common/client/node_lifecycle_test.go: `t.Run("if syncing verification fails, becomes unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, config: testNodeConfig{nodeIsSyncingEnabled: true}, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil).Once() rpc.On("ChainID", mock.Anything).Run(func(_ mock.Arguments) { assert.Equal(t, nodeStateDialed, node.State()) }).Return(nodeChainID, nil).Once() rpc.On("IsSyncing", mock.Anything).Return(false, errors.New("failed to check syncing status")) // disconnects all on transfer to unreachable rpc.On("DisconnectAll") // fail to redial to stay in unreachable state rpc.On("Dial", mock.Anything).Return(errors.New("failed to redial")) err := node.Start(tests.Context(t)) assert.NoError(t, err) tests.AssertLogEventually(t, observedLogs, "Unexpected error while verifying RPC node synchronization status") tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Run(func(_ mock.Arguments) { assert.Equal(t, nodeStateDialed, node.State()) }).Return(nodeChainID, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("IsSyncing", mock.Anything).Return(false, errors.New("failed to check syncing status"))` $DIR/common/client/node_lifecycle_test.go: `rpc.On("DisconnectAll")` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(errors.New("failed to redial"))` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogEventually(t, observedLogs, "Unexpected error while verifying RPC node synchronization status")` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `t.Run("on isSyncing transitions to syncing", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.NewIDFromInt(10) node := newNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, config: testNodeConfig{nodeIsSyncingEnabled: true}, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil) rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil) rpc.On("IsSyncing", mock.Anything).Return(true, nil) // disconnects all on transfer to unreachable rpc.On("DisconnectAll") err := node.Start(tests.Context(t)) assert.NoError(t, err) tests.AssertEventually(t, func() bool { return node.State() == nodeStateSyncing }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("IsSyncing", mock.Anything).Return(true, nil)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("DisconnectAll")` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateSyncing })` $DIR/common/client/node_lifecycle_test.go: `t.Run("on successful verification becomes alive", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() node := newNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, config: testNodeConfig{nodeIsSyncingEnabled: true}, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil) rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil) rpc.On("IsSyncing", mock.Anything).Return(false, nil) setupRPCForAliveLoop(t, rpc) err := node.Start(tests.Context(t)) assert.NoError(t, err) tests.AssertEventually(t, func() bool { return node.State() == nodeStateAlive }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("IsSyncing", mock.Anything).Return(false, nil)` $DIR/common/client/node_lifecycle_test.go: `setupRPCForAliveLoop(t, rpc)` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateAlive })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `setupRPCForAliveLoop(t, rpc)` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateAlive })` $DIR/common/client/node_lifecycle_test.go: `t.Run("skip if nLiveNodes is not configured", func(t *testing.T) { node := newTestNode(t, testNodeOpts{}) outOfSync, liveNodes := node.syncStatus(0, nil) assert.Equal(t, false, outOfSync) assert.Equal(t, 0, liveNodes) })` $DIR/common/client/node_lifecycle_test.go: `t.Run("skip if syncThreshold is not configured", func(t *testing.T) { node := newTestNode(t, testNodeOpts{}) node.nLiveNodes = func() (count int, blockNumber int64, totalDifficulty *big.Int) { return } outOfSync, liveNodes := node.syncStatus(0, nil) assert.Equal(t, false, outOfSync) assert.Equal(t, 0, liveNodes) })` $DIR/common/client/node_lifecycle_test.go: `t.Run("panics on invalid selection mode", func(t *testing.T) { node := newTestNode(t, testNodeOpts{ config: testNodeConfig{syncThreshold: 1}, }) node.nLiveNodes = func() (count int, blockNumber int64, totalDifficulty *big.Int) { return } assert.Panics(t, func() { _, _ = node.syncStatus(0, nil) }) })` $DIR/common/client/node_lifecycle_test.go: `t.Run("block height selection mode", func(t *testing.T) { const syncThreshold = 10 const highestBlock = 1000 const nodesNum = 20 const totalDifficulty = 3000 testCases := []struct { name string blockNumber int64 outOfSync bool }{ { name: "below threshold", blockNumber: highestBlock - syncThreshold - 1, outOfSync: true, }, { name: "equal to threshold", blockNumber: highestBlock - syncThreshold, outOfSync: false, }, { name: "equal to highest block", blockNumber: highestBlock, outOfSync: false, }, { name: "higher than highest block", blockNumber: highestBlock, outOfSync: false, }, } for _, selectionMode := range []string{NodeSelectionModeHighestHead, NodeSelectionModeRoundRobin, NodeSelectionModePriorityLevel} { node := newTestNode(t, testNodeOpts{ config: testNodeConfig{ syncThreshold: syncThreshold, selectionMode: selectionMode, }, }) node.nLiveNodes = func() (int, int64, *big.Int) { return nodesNum, highestBlock, big.NewInt(totalDifficulty) } for _, td := range []int64{totalDifficulty - syncThreshold - 1, totalDifficulty - syncThreshold, totalDifficulty, totalDifficulty + 1} { for _, testCase := range testCases { t.Run(fmt.Sprintf("%s: SelectionModeVal: %s: total difficulty: %d", testCase.name, selectionMode, td), func(t *testing.T) { outOfSync, liveNodes := node.syncStatus(testCase.blockNumber, big.NewInt(td)) assert.Equal(t, nodesNum, liveNodes) assert.Equal(t, testCase.outOfSync, outOfSync) }) } } } })` $DIR/common/client/node_lifecycle_test.go: `t.Run(fmt.Sprintf("%s: SelectionModeVal: %s: total difficulty: %d", testCase.name, selectionMode, td), func(t *testing.T) { outOfSync, liveNodes := node.syncStatus(testCase.blockNumber, big.NewInt(td)) assert.Equal(t, nodesNum, liveNodes) assert.Equal(t, testCase.outOfSync, outOfSync) })` $DIR/common/client/node_lifecycle_test.go: `t.Run(fmt.Sprintf("%s: SelectionModeVal: %s: highest block: %d", testCase.name, NodeSelectionModeTotalDifficulty, hb), func(t *testing.T) { outOfSync, liveNodes := node.syncStatus(hb, big.NewInt(testCase.totalDifficulty)) assert.Equal(t, nodesNum, liveNodes) assert.Equal(t, testCase.outOfSync, outOfSync) })` $DIR/common/client/node_lifecycle_test.go: `opts.config.nodeIsSyncingEnabled = true` $DIR/common/client/node_lifecycle_test.go: `opts.rpc.On("Close").Return(nil).Once()` $DIR/common/client/node_lifecycle_test.go: `opts.rpc.On("DisconnectAll")` $DIR/common/client/node_lifecycle_test.go: `node.setState(nodeStateDialed)` $DIR/common/client/node_lifecycle_test.go: `t.Run("returns on closed", func(t *testing.T) { t.Parallel() node := newTestNode(t, testNodeOpts{}) node.setState(nodeStateClosed) node.wg.Add(1) node.syncingLoop() })` $DIR/common/client/node_lifecycle_test.go: `node.setState(nodeStateClosed)` $DIR/common/client/node_lifecycle_test.go: `node.wg.Add(1)` $DIR/common/client/node_lifecycle_test.go: `node.syncingLoop()` $DIR/common/client/node_lifecycle_test.go: `t.Run("on invalid dial becomes unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() node := newDialedNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")) node.declareSyncing() tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial"))` $DIR/common/client/node_lifecycle_test.go: `node.declareSyncing()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `t.Run("on failed chainID call becomes unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newDialedNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("ChainID", mock.Anything).Return(nodeChainID, errors.New("failed to get chain id")) // once for syncing and maybe another one for unreachable rpc.On("Dial", mock.Anything).Return(nil).Once() rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe() node.declareSyncing() tests.AssertLogEventually(t, observedLogs, "Failed to verify chain ID for node") tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(nodeChainID, errors.New("failed to get chain id"))` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe()` $DIR/common/client/node_lifecycle_test.go: `node.declareSyncing()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogEventually(t, observedLogs, "Failed to verify chain ID for node")` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `t.Run("on chainID mismatch transitions to invalidChainID", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.NewIDFromInt(10) rpcChainID := types.NewIDFromInt(11) lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newDialedNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil).Twice() rpc.On("ChainID", mock.Anything).Return(rpcChainID, nil) node.declareSyncing() tests.AssertLogCountEventually(t, observedLogs, "Failed to verify RPC node; remote endpoint returned the wrong chain ID", 2) tests.AssertEventually(t, func() bool { return node.State() == nodeStateInvalidChainID }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil).Twice()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(rpcChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `node.declareSyncing()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogCountEventually(t, observedLogs, "Failed to verify RPC node; remote endpoint returned the wrong chain ID", 2)` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateInvalidChainID })` $DIR/common/client/node_lifecycle_test.go: `t.Run("on failed Syncing check - becomes unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newDialedNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once() // first one is needed to enter internal loop rpc.On("IsSyncing", mock.Anything).Return(true, nil).Once() rpc.On("IsSyncing", mock.Anything).Return(false, errors.New("failed to check if syncing")).Once() rpc.On("Dial", mock.Anything).Return(nil).Once() rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe() node.declareSyncing() tests.AssertLogEventually(t, observedLogs, "Unexpected error while verifying RPC node synchronization status") tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("IsSyncing", mock.Anything).Return(true, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("IsSyncing", mock.Anything).Return(false, errors.New("failed to check if syncing")).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe()` $DIR/common/client/node_lifecycle_test.go: `node.declareSyncing()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogEventually(t, observedLogs, "Unexpected error while verifying RPC node synchronization status")` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `t.Run("on IsSyncing - keeps trying", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newDialedNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once() rpc.On("IsSyncing", mock.Anything).Return(true, nil) rpc.On("Dial", mock.Anything).Return(nil).Once() node.declareSyncing() tests.AssertLogCountEventually(t, observedLogs, "Verification failed: Node is syncing", 2) tests.AssertEventually(t, func() bool { return node.State() == nodeStateSyncing }) })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("IsSyncing", mock.Anything).Return(true, nil)` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil).Once()` $DIR/common/client/node_lifecycle_test.go: `node.declareSyncing()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertLogCountEventually(t, observedLogs, "Verification failed: Node is syncing", 2)` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateSyncing })` $DIR/common/client/node_lifecycle_test.go: `rpc.On("Dial", mock.Anything).Return(nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("IsSyncing", mock.Anything).Return(true, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `rpc.On("IsSyncing", mock.Anything).Return(false, nil).Once()` $DIR/common/client/node_lifecycle_test.go: `setupRPCForAliveLoop(t, rpc)` $DIR/common/client/node_lifecycle_test.go: `node.declareSyncing()` $DIR/common/client/node_lifecycle_test.go: `tests.AssertEventually(t, func() bool { return node.State() == nodeStateAlive })` $DIR/common/client/node_lifecycle_test.go: `.rpc.On("Close")` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.setState(nodeStateDialed)` $DIR/common/client/node_lifecycle_test.go: `.Run("returns on closed", func(t *testing.T) { node := newTestNode(t, testNodeOpts{}) node.setState(nodeStateClosed) node.wg.Add(1) node.aliveLoop() })` $DIR/common/client/node_lifecycle_test.go: `.setState(nodeStateClosed)` $DIR/common/client/node_lifecycle_test.go: `.wg.Add(1)` $DIR/common/client/node_lifecycle_test.go: `.aliveLoop()` $DIR/common/client/node_lifecycle_test.go: `.Run("if initial subscribe fails, transitions to unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) node := newDialedNode(t, testNodeOpts{ rpc: rpc, }) defer func() { assert.NoError(t, node.close()) }() expectedError := errors.New("failed to subscribe to rpc") rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Return(nil, expectedError).Once() rpc.On("DisconnectAll").Once() // might be called in unreachable loop rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe() node.declareAlive() tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `.New("failed to subscribe to rpc")` $DIR/common/client/node_lifecycle_test.go: `.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil, expectedError)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("DisconnectAll")` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(errors.New("failed to dial"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to dial")` $DIR/common/client/node_lifecycle_test.go: `.Maybe()` $DIR/common/client/node_lifecycle_test.go: `.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.Run("if remote RPC connection is closed transitions to unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) lggr, observedLogs := logger.TestObserved(t, zap.WarnLevel) node := newDialedNode(t, testNodeOpts{ rpc: rpc, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() sub := mocks.NewSubscription(t) errChan := make(chan error) close(errChan) sub.On("Err").Return((<-chan error)(errChan)).Once() sub.On("Unsubscribe").Once() rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Return(sub, nil).Once() rpc.On("SetAliveLoopSub", sub).Once() // disconnects all on transfer to unreachable rpc.On("DisconnectAll").Once() // might be called in unreachable loop rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe() node.declareAlive() tests.AssertLogEventually(t, observedLogs, "Subscription was terminated") assert.Equal(t, nodeStateUnreachable, node.State()) })` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.WarnLevel)` $DIR/common/client/node_lifecycle_test.go: `.NewSubscription(t)` $DIR/common/client/node_lifecycle_test.go: `.On("Err")` $DIR/common/client/node_lifecycle_test.go: `.Return((<-chan error)(errChan))` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("Unsubscribe")` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads)` $DIR/common/client/node_lifecycle_test.go: `.Return(sub, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("SetAliveLoopSub", sub)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("DisconnectAll")` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(errors.New("failed to dial"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to dial")` $DIR/common/client/node_lifecycle_test.go: `.Maybe()` $DIR/common/client/node_lifecycle_test.go: `.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `.AssertLogEventually(t, observedLogs, "Subscription was terminated")` $DIR/common/client/node_lifecycle_test.go: `.NewSubscription(t)` $DIR/common/client/node_lifecycle_test.go: `.On("Err")` $DIR/common/client/node_lifecycle_test.go: `.Return((<-chan error)(nil))` $DIR/common/client/node_lifecycle_test.go: `.On("Unsubscribe")` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads)` $DIR/common/client/node_lifecycle_test.go: `.Return(sub, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.rpc.On("SetAliveLoopSub", sub)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.Run("Stays alive and waits for signal", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newSubscribedNode(t, testNodeOpts{ config: testNodeConfig{}, rpc: rpc, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() node.declareAlive() tests.AssertLogEventually(t, observedLogs, "Head liveness checking disabled") tests.AssertLogEventually(t, observedLogs, "Polling disabled") assert.Equal(t, nodeStateAlive, node.State()) })` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/node_lifecycle_test.go: `.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `.AssertLogEventually(t, observedLogs, "Head liveness checking disabled")` $DIR/common/client/node_lifecycle_test.go: `.AssertLogEventually(t, observedLogs, "Polling disabled")` $DIR/common/client/node_lifecycle_test.go: `.Run("stays alive while below pollFailureThreshold and resets counter on success", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) const pollFailureThreshold = 3 node := newSubscribedNode(t, testNodeOpts{ config: testNodeConfig{ pollFailureThreshold: pollFailureThreshold, pollInterval: tests.TestInterval, }, rpc: rpc, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() pollError := errors.New("failed to get ClientVersion") // 1. Return error several times, but below threshold rpc.On("ClientVersion", mock.Anything).Return("", pollError).Run(func(_ mock.Arguments) { // stays healthy while below threshold assert.Equal(t, nodeStateAlive, node.State()) }).Times(pollFailureThreshold - 1) // 2. Successful call that is expected to reset counter rpc.On("ClientVersion", mock.Anything).Return("client_version", nil).Once() // 3. Return error. If we have not reset the timer, we'll transition to nonAliveState rpc.On("ClientVersion", mock.Anything).Return("", pollError).Once() // 4. Once during the call, check if node is alive var ensuredAlive atomic.Bool rpc.On("ClientVersion", mock.Anything).Return("client_version", nil).Run(func(_ mock.Arguments) { if ensuredAlive.Load() { return } ensuredAlive.Store(true) assert.Equal(t, nodeStateAlive, node.State()) }).Once() // redundant call to stay in alive state rpc.On("ClientVersion", mock.Anything).Return("client_version", nil) node.declareAlive() tests.AssertLogCountEventually(t, observedLogs, fmt.Sprintf("Poll failure, RPC endpoint %s failed to respond properly", node.String()), pollFailureThreshold) tests.AssertLogCountEventually(t, observedLogs, "Version poll successful", 2) assert.True(t, ensuredAlive.Load(), "expected to ensure that node was alive") })` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/node_lifecycle_test.go: `.New("failed to get ClientVersion")` $DIR/common/client/node_lifecycle_test.go: `.On("ClientVersion", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return("", pollError)` $DIR/common/client/node_lifecycle_test.go: `.Run(func(_ mock.Arguments) { // stays healthy while below threshold assert.Equal(t, nodeStateAlive, node.State()) })` $DIR/common/client/node_lifecycle_test.go: `.Times(pollFailureThreshold - 1)` $DIR/common/client/node_lifecycle_test.go: `.On("ClientVersion", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return("client_version", nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("ClientVersion", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return("", pollError)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("ClientVersion", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return("client_version", nil)` $DIR/common/client/node_lifecycle_test.go: `.Run(func(_ mock.Arguments) { if ensuredAlive.Load() { return } ensuredAlive.Store(true) assert.Equal(t, nodeStateAlive, node.State()) })` $DIR/common/client/node_lifecycle_test.go: `.Load()` $DIR/common/client/node_lifecycle_test.go: `.Store(true)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("ClientVersion", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return("client_version", nil)` $DIR/common/client/node_lifecycle_test.go: `.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `.AssertLogCountEventually(t, observedLogs, fmt.Sprintf("Poll failure, RPC endpoint %s failed to respond properly", node.String()), pollFailureThreshold)` $DIR/common/client/node_lifecycle_test.go: `.Sprintf("Poll failure, RPC endpoint %s failed to respond properly", node.String())` $DIR/common/client/node_lifecycle_test.go: `.String()` $DIR/common/client/node_lifecycle_test.go: `.AssertLogCountEventually(t, observedLogs, "Version poll successful", 2)` $DIR/common/client/node_lifecycle_test.go: `.Run("with threshold poll failures, transitions to unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) const pollFailureThreshold = 3 node := newSubscribedNode(t, testNodeOpts{ config: testNodeConfig{ pollFailureThreshold: pollFailureThreshold, pollInterval: tests.TestInterval, }, rpc: rpc, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() pollError := errors.New("failed to get ClientVersion") rpc.On("ClientVersion", mock.Anything).Return("", pollError) // disconnects all on transfer to unreachable rpc.On("DisconnectAll").Once() // might be called in unreachable loop rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe() node.declareAlive() tests.AssertLogCountEventually(t, observedLogs, fmt.Sprintf("Poll failure, RPC endpoint %s failed to respond properly", node.String()), pollFailureThreshold) tests.AssertEventually(t, func() bool { return nodeStateUnreachable == node.State() }) })` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/node_lifecycle_test.go: `.New("failed to get ClientVersion")` $DIR/common/client/node_lifecycle_test.go: `.On("ClientVersion", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return("", pollError)` $DIR/common/client/node_lifecycle_test.go: `.On("DisconnectAll")` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(errors.New("failed to dial"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to dial")` $DIR/common/client/node_lifecycle_test.go: `.Maybe()` $DIR/common/client/node_lifecycle_test.go: `.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `.AssertLogCountEventually(t, observedLogs, fmt.Sprintf("Poll failure, RPC endpoint %s failed to respond properly", node.String()), pollFailureThreshold)` $DIR/common/client/node_lifecycle_test.go: `.Sprintf("Poll failure, RPC endpoint %s failed to respond properly", node.String())` $DIR/common/client/node_lifecycle_test.go: `.String()` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return nodeStateUnreachable == node.State() })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.Run("with threshold poll failures, but we are the last node alive, forcibly keeps it alive", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) const pollFailureThreshold = 3 node := newSubscribedNode(t, testNodeOpts{ config: testNodeConfig{ pollFailureThreshold: pollFailureThreshold, pollInterval: tests.TestInterval, }, rpc: rpc, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() node.nLiveNodes = func() (count int, blockNumber int64, totalDifficulty *big.Int) { return 1, 20, big.NewInt(10) } pollError := errors.New("failed to get ClientVersion") rpc.On("ClientVersion", mock.Anything).Return("", pollError) node.declareAlive() tests.AssertLogEventually(t, observedLogs, fmt.Sprintf("RPC endpoint failed to respond to %d consecutive polls", pollFailureThreshold)) assert.Equal(t, nodeStateAlive, node.State()) })` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/node_lifecycle_test.go: `.NewInt(10)` $DIR/common/client/node_lifecycle_test.go: `.New("failed to get ClientVersion")` $DIR/common/client/node_lifecycle_test.go: `.On("ClientVersion", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return("", pollError)` $DIR/common/client/node_lifecycle_test.go: `.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `.AssertLogEventually(t, observedLogs, fmt.Sprintf("RPC endpoint failed to respond to %d consecutive polls", pollFailureThreshold))` $DIR/common/client/node_lifecycle_test.go: `.Sprintf("RPC endpoint failed to respond to %d consecutive polls", pollFailureThreshold)` $DIR/common/client/node_lifecycle_test.go: `.Run("when behind more than SyncThreshold, transitions to out of sync", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) const syncThreshold = 10 node := newSubscribedNode(t, testNodeOpts{ config: testNodeConfig{ pollInterval: tests.TestInterval, syncThreshold: syncThreshold, selectionMode: NodeSelectionModeRoundRobin, }, rpc: rpc, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() node.stateLatestBlockNumber = 20 node.nLiveNodes = func() (count int, blockNumber int64, totalDifficulty *big.Int) { return 10, syncThreshold + node.stateLatestBlockNumber + 1, big.NewInt(10) } rpc.On("ClientVersion", mock.Anything).Return("", nil) // tries to redial in outOfSync rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Run(func(_ mock.Arguments) { assert.Equal(t, nodeStateOutOfSync, node.State()) }).Once() // disconnects all on transfer to unreachable or outOfSync rpc.On("DisconnectAll").Maybe() // might be called in unreachable loop rpc.On("Dial", mock.Anything).Run(func(_ mock.Arguments) { require.Equal(t, nodeStateOutOfSync, node.State()) }).Return(errors.New("failed to dial")).Maybe() node.declareAlive() tests.AssertLogEventually(t, observedLogs, "Dial failed: Node is unreachable") })` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/node_lifecycle_test.go: `.NewInt(10)` $DIR/common/client/node_lifecycle_test.go: `.On("ClientVersion", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return("", nil)` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(errors.New("failed to dial"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to dial")` $DIR/common/client/node_lifecycle_test.go: `.Run(func(_ mock.Arguments) { assert.Equal(t, nodeStateOutOfSync, node.State()) })` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("DisconnectAll")` $DIR/common/client/node_lifecycle_test.go: `.Maybe()` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Run(func(_ mock.Arguments) { require.Equal(t, nodeStateOutOfSync, node.State()) })` $DIR/common/client/node_lifecycle_test.go: `.Return(errors.New("failed to dial"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to dial")` $DIR/common/client/node_lifecycle_test.go: `.Maybe()` $DIR/common/client/node_lifecycle_test.go: `.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `.AssertLogEventually(t, observedLogs, "Dial failed: Node is unreachable")` $DIR/common/client/node_lifecycle_test.go: `.Run("when behind more than SyncThreshold but we are the last live node, forcibly stays alive", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) const syncThreshold = 10 node := newSubscribedNode(t, testNodeOpts{ config: testNodeConfig{ pollInterval: tests.TestInterval, syncThreshold: syncThreshold, selectionMode: NodeSelectionModeRoundRobin, }, rpc: rpc, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() node.stateLatestBlockNumber = 20 node.nLiveNodes = func() (count int, blockNumber int64, totalDifficulty *big.Int) { return 1, syncThreshold + node.stateLatestBlockNumber + 1, big.NewInt(10) } rpc.On("ClientVersion", mock.Anything).Return("", nil) node.declareAlive() tests.AssertLogEventually(t, observedLogs, fmt.Sprintf("RPC endpoint has fallen behind; %s %s", msgCannotDisable, msgDegradedState)) })` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/node_lifecycle_test.go: `.NewInt(10)` $DIR/common/client/node_lifecycle_test.go: `.On("ClientVersion", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return("", nil)` $DIR/common/client/node_lifecycle_test.go: `.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `.AssertLogEventually(t, observedLogs, fmt.Sprintf("RPC endpoint has fallen behind; %s %s", msgCannotDisable, msgDegradedState))` $DIR/common/client/node_lifecycle_test.go: `.Sprintf("RPC endpoint has fallen behind; %s %s", msgCannotDisable, msgDegradedState)` $DIR/common/client/node_lifecycle_test.go: `.Run("when behind but SyncThreshold=0, stay alive", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newSubscribedNode(t, testNodeOpts{ config: testNodeConfig{ pollInterval: tests.TestInterval, syncThreshold: 0, selectionMode: NodeSelectionModeRoundRobin, }, rpc: rpc, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() node.stateLatestBlockNumber = 20 node.nLiveNodes = func() (count int, blockNumber int64, totalDifficulty *big.Int) { return 1, node.stateLatestBlockNumber + 100, big.NewInt(10) } rpc.On("ClientVersion", mock.Anything).Return("", nil) node.declareAlive() tests.AssertLogCountEventually(t, observedLogs, "Version poll successful", 2) assert.Equal(t, nodeStateAlive, node.State()) })` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/node_lifecycle_test.go: `.NewInt(10)` $DIR/common/client/node_lifecycle_test.go: `.On("ClientVersion", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return("", nil)` $DIR/common/client/node_lifecycle_test.go: `.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `.AssertLogCountEventually(t, observedLogs, "Version poll successful", 2)` $DIR/common/client/node_lifecycle_test.go: `.Run("when no new heads received for threshold, transitions to out of sync", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) node := newSubscribedNode(t, testNodeOpts{ config: testNodeConfig{}, chainConfig: clientMocks.ChainConfig{ NoNewHeadsThresholdVal: tests.TestInterval, }, rpc: rpc, }) defer func() { assert.NoError(t, node.close()) }() // tries to redial in outOfSync rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Run(func(_ mock.Arguments) { assert.Equal(t, nodeStateOutOfSync, node.State()) }).Once() // disconnects all on transfer to unreachable or outOfSync rpc.On("DisconnectAll").Maybe() // might be called in unreachable loop rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe() node.declareAlive() tests.AssertEventually(t, func() bool { // right after outOfSync we'll transfer to unreachable due to returned error on Dial // we check that we were in out of sync state on first Dial call return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(errors.New("failed to dial"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to dial")` $DIR/common/client/node_lifecycle_test.go: `.Run(func(_ mock.Arguments) { assert.Equal(t, nodeStateOutOfSync, node.State()) })` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("DisconnectAll")` $DIR/common/client/node_lifecycle_test.go: `.Maybe()` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(errors.New("failed to dial"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to dial")` $DIR/common/client/node_lifecycle_test.go: `.Maybe()` $DIR/common/client/node_lifecycle_test.go: `.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { // right after outOfSync we'll transfer to unreachable due to returned error on Dial // we check that we were in out of sync state on first Dial call return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.Run("when no new heads received for threshold but we are the last live node, forcibly stays alive", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newSubscribedNode(t, testNodeOpts{ config: testNodeConfig{}, lggr: lggr, chainConfig: clientMocks.ChainConfig{ NoNewHeadsThresholdVal: tests.TestInterval, }, rpc: rpc, }) defer func() { assert.NoError(t, node.close()) }() node.nLiveNodes = func() (count int, blockNumber int64, totalDifficulty *big.Int) { return 1, 20, big.NewInt(10) } node.declareAlive() tests.AssertLogEventually(t, observedLogs, fmt.Sprintf("RPC endpoint detected out of sync; %s %s", msgCannotDisable, msgDegradedState)) assert.Equal(t, nodeStateAlive, node.State()) })` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/node_lifecycle_test.go: `.NewInt(10)` $DIR/common/client/node_lifecycle_test.go: `.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `.AssertLogEventually(t, observedLogs, fmt.Sprintf("RPC endpoint detected out of sync; %s %s", msgCannotDisable, msgDegradedState))` $DIR/common/client/node_lifecycle_test.go: `.Sprintf("RPC endpoint detected out of sync; %s %s", msgCannotDisable, msgDegradedState)` $DIR/common/client/node_lifecycle_test.go: `.Run("rpc closed head channel", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) sub := mocks.NewSubscription(t) sub.On("Err").Return((<-chan error)(nil)) sub.On("Unsubscribe").Once() rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Run(func(args mock.Arguments) { ch := args.Get(1).(chan<- Head) close(ch) }).Return(sub, nil).Once() rpc.On("SetAliveLoopSub", sub).Once() lggr, observedLogs := logger.TestObserved(t, zap.ErrorLevel) node := newDialedNode(t, testNodeOpts{ lggr: lggr, config: testNodeConfig{}, chainConfig: clientMocks.ChainConfig{ NoNewHeadsThresholdVal: tests.TestInterval, }, rpc: rpc, }) defer func() { assert.NoError(t, node.close()) }() // disconnects all on transfer to unreachable or outOfSync rpc.On("DisconnectAll").Once() // might be called in unreachable loop rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe() node.declareAlive() tests.AssertLogEventually(t, observedLogs, "Subscription channel unexpectedly closed") assert.Equal(t, nodeStateUnreachable, node.State()) })` $DIR/common/client/node_lifecycle_test.go: `.NewSubscription(t)` $DIR/common/client/node_lifecycle_test.go: `.On("Err")` $DIR/common/client/node_lifecycle_test.go: `.Return((<-chan error)(nil))` $DIR/common/client/node_lifecycle_test.go: `.On("Unsubscribe")` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads)` $DIR/common/client/node_lifecycle_test.go: `.Run(func(args mock.Arguments) { ch := args.Get(1).(chan<- Head) close(ch) })` $DIR/common/client/node_lifecycle_test.go: `.Get(1)` $DIR/common/client/node_lifecycle_test.go: `.Return(sub, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("SetAliveLoopSub", sub)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.ErrorLevel)` $DIR/common/client/node_lifecycle_test.go: `.On("DisconnectAll")` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(errors.New("failed to dial"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to dial")` $DIR/common/client/node_lifecycle_test.go: `.Maybe()` $DIR/common/client/node_lifecycle_test.go: `.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `.AssertLogEventually(t, observedLogs, "Subscription channel unexpectedly closed")` $DIR/common/client/node_lifecycle_test.go: `.Run("updates block number and difficulty on new head", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) sub := mocks.NewSubscription(t) sub.On("Err").Return((<-chan error)(nil)) sub.On("Unsubscribe").Once() expectedBlockNumber := rand.Int64() expectedDiff := big.NewInt(rand.Int64()) rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Run(func(args mock.Arguments) { ch := args.Get(1).(chan<- Head) go writeHeads(t, ch, head{BlockNumber: expectedBlockNumber, BlockDifficulty: expectedDiff}) }).Return(sub, nil).Once() rpc.On("SetAliveLoopSub", sub).Once() node := newDialedNode(t, testNodeOpts{ config: testNodeConfig{}, rpc: rpc, }) defer func() { assert.NoError(t, node.close()) }() node.declareAlive() tests.AssertEventually(t, func() bool { state, block, diff := node.StateAndLatest() return state == nodeStateAlive && block == expectedBlockNumber == bigmath.Equal(diff, expectedDiff) }) })` $DIR/common/client/node_lifecycle_test.go: `.NewSubscription(t)` $DIR/common/client/node_lifecycle_test.go: `.On("Err")` $DIR/common/client/node_lifecycle_test.go: `.Return((<-chan error)(nil))` $DIR/common/client/node_lifecycle_test.go: `.On("Unsubscribe")` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.Int64()` $DIR/common/client/node_lifecycle_test.go: `.NewInt(rand.Int64())` $DIR/common/client/node_lifecycle_test.go: `.Int64()` $DIR/common/client/node_lifecycle_test.go: `.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads)` $DIR/common/client/node_lifecycle_test.go: `.Run(func(args mock.Arguments) { ch := args.Get(1).(chan<- Head) go writeHeads(t, ch, head{BlockNumber: expectedBlockNumber, BlockDifficulty: expectedDiff}) })` $DIR/common/client/node_lifecycle_test.go: `.Get(1)` $DIR/common/client/node_lifecycle_test.go: `.Return(sub, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("SetAliveLoopSub", sub)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { state, block, diff := node.StateAndLatest() return state == nodeStateAlive && block == expectedBlockNumber == bigmath.Equal(diff, expectedDiff) })` $DIR/common/client/node_lifecycle_test.go: `.StateAndLatest()` $DIR/common/client/node_lifecycle_test.go: `.Equal(diff, expectedDiff)` $DIR/common/client/node_lifecycle_test.go: `.Run("If finality tag is not enabled updates finalized block metric using finality depth and latest head", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) sub := mocks.NewSubscription(t) sub.On("Err").Return((<-chan error)(nil)) sub.On("Unsubscribe").Once() const blockNumber = 1000 const finalityDepth = 10 const expectedBlock = 990 rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Run(func(args mock.Arguments) { ch := args.Get(1).(chan<- Head) go writeHeads(t, ch, head{BlockNumber: blockNumber - 1}, head{BlockNumber: blockNumber}, head{BlockNumber: blockNumber - 1}) }).Return(sub, nil).Once() rpc.On("SetAliveLoopSub", sub).Once() name := "node-" + rand.Str(5) node := newDialedNode(t, testNodeOpts{ config: testNodeConfig{}, chainConfig: clientMocks.ChainConfig{FinalityDepthVal: finalityDepth}, rpc: rpc, name: name, chainID: big.NewInt(1), }) defer func() { assert.NoError(t, node.close()) }() node.declareAlive() tests.AssertEventually(t, func() bool { metric, err := promPoolRPCNodeHighestFinalizedBlock.GetMetricWithLabelValues(big.NewInt(1).String(), name) require.NoError(t, err) var m = &prom.Metric{} require.NoError(t, metric.Write(m)) return float64(expectedBlock) == m.Gauge.GetValue() }) })` $DIR/common/client/node_lifecycle_test.go: `.NewSubscription(t)` $DIR/common/client/node_lifecycle_test.go: `.On("Err")` $DIR/common/client/node_lifecycle_test.go: `.Return((<-chan error)(nil))` $DIR/common/client/node_lifecycle_test.go: `.On("Unsubscribe")` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads)` $DIR/common/client/node_lifecycle_test.go: `.Run(func(args mock.Arguments) { ch := args.Get(1).(chan<- Head) go writeHeads(t, ch, head{BlockNumber: blockNumber - 1}, head{BlockNumber: blockNumber}, head{BlockNumber: blockNumber - 1}) })` $DIR/common/client/node_lifecycle_test.go: `.Get(1)` $DIR/common/client/node_lifecycle_test.go: `.Return(sub, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("SetAliveLoopSub", sub)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.Str(5)` $DIR/common/client/node_lifecycle_test.go: `.NewInt(1)` $DIR/common/client/node_lifecycle_test.go: `.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { metric, err := promPoolRPCNodeHighestFinalizedBlock.GetMetricWithLabelValues(big.NewInt(1).String(), name) require.NoError(t, err) var m = &prom.Metric{} require.NoError(t, metric.Write(m)) return float64(expectedBlock) == m.Gauge.GetValue() })` $DIR/common/client/node_lifecycle_test.go: `.GetMetricWithLabelValues(big.NewInt(1).String(), name)` $DIR/common/client/node_lifecycle_test.go: `.NewInt(1)` $DIR/common/client/node_lifecycle_test.go: `.String()` $DIR/common/client/node_lifecycle_test.go: `.Gauge.GetValue()` $DIR/common/client/node_lifecycle_test.go: `.Run("Logs warning if failed to get finalized block", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) rpc.On("LatestFinalizedBlock", mock.Anything).Return(newMockHead(t), errors.New("failed to get finalized block")) sub := mocks.NewSubscription(t) sub.On("Err").Return((<-chan error)(nil)) sub.On("Unsubscribe").Once() rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Return(sub, nil).Once() rpc.On("SetAliveLoopSub", sub).Once() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newDialedNode(t, testNodeOpts{ config: testNodeConfig{ finalizedBlockPollInterval: tests.TestInterval, }, chainConfig: clientMocks.ChainConfig{ IsFinalityTagEnabled: true, }, rpc: rpc, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() node.declareAlive() tests.AssertLogEventually(t, observedLogs, "Failed to fetch latest finalized block") })` $DIR/common/client/node_lifecycle_test.go: `.On("LatestFinalizedBlock", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(newMockHead(t), errors.New("failed to get finalized block"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to get finalized block")` $DIR/common/client/node_lifecycle_test.go: `.NewSubscription(t)` $DIR/common/client/node_lifecycle_test.go: `.On("Err")` $DIR/common/client/node_lifecycle_test.go: `.Return((<-chan error)(nil))` $DIR/common/client/node_lifecycle_test.go: `.On("Unsubscribe")` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads)` $DIR/common/client/node_lifecycle_test.go: `.Return(sub, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("SetAliveLoopSub", sub)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/node_lifecycle_test.go: `.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `.AssertLogEventually(t, observedLogs, "Failed to fetch latest finalized block")` $DIR/common/client/node_lifecycle_test.go: `.Run("Logs warning if latest finalized block is not valid", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) head := newMockHead(t) head.On("IsValid").Return(false) rpc.On("LatestFinalizedBlock", mock.Anything).Return(head, nil) sub := mocks.NewSubscription(t) sub.On("Err").Return((<-chan error)(nil)) sub.On("Unsubscribe").Once() rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Return(sub, nil).Once() rpc.On("SetAliveLoopSub", sub).Once() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newDialedNode(t, testNodeOpts{ config: testNodeConfig{ finalizedBlockPollInterval: tests.TestInterval, }, chainConfig: clientMocks.ChainConfig{ IsFinalityTagEnabled: true, }, rpc: rpc, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() node.declareAlive() tests.AssertLogEventually(t, observedLogs, "Latest finalized block is not valid") })` $DIR/common/client/node_lifecycle_test.go: `.On("IsValid")` $DIR/common/client/node_lifecycle_test.go: `.Return(false)` $DIR/common/client/node_lifecycle_test.go: `.On("LatestFinalizedBlock", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(head, nil)` $DIR/common/client/node_lifecycle_test.go: `.NewSubscription(t)` $DIR/common/client/node_lifecycle_test.go: `.On("Err")` $DIR/common/client/node_lifecycle_test.go: `.Return((<-chan error)(nil))` $DIR/common/client/node_lifecycle_test.go: `.On("Unsubscribe")` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads)` $DIR/common/client/node_lifecycle_test.go: `.Return(sub, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("SetAliveLoopSub", sub)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/node_lifecycle_test.go: `.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `.AssertLogEventually(t, observedLogs, "Latest finalized block is not valid")` $DIR/common/client/node_lifecycle_test.go: `.On("LatestFinalizedBlock", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(head{BlockNumber: expectedBlock - 1}.ToMockHead(t), nil)` $DIR/common/client/node_lifecycle_test.go: `.ToMockHead(t)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("LatestFinalizedBlock", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(head{BlockNumber: expectedBlock}.ToMockHead(t), nil)` $DIR/common/client/node_lifecycle_test.go: `.ToMockHead(t)` $DIR/common/client/node_lifecycle_test.go: `.NewSubscription(t)` $DIR/common/client/node_lifecycle_test.go: `.On("Err")` $DIR/common/client/node_lifecycle_test.go: `.Return((<-chan error)(nil))` $DIR/common/client/node_lifecycle_test.go: `.On("Unsubscribe")` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads)` $DIR/common/client/node_lifecycle_test.go: `.Run(func(args mock.Arguments) { ch := args.Get(1).(chan<- Head) // ensure that "calculated" finalized head is larger than actual, to ensure we are correctly setting // the metric go writeHeads(t, ch, head{BlockNumber: expectedBlock*2 + finalityDepth}) })` $DIR/common/client/node_lifecycle_test.go: `.Get(1)` $DIR/common/client/node_lifecycle_test.go: `.Return(sub, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("SetAliveLoopSub", sub)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.Str(5)` $DIR/common/client/node_lifecycle_test.go: `.NewInt(1)` $DIR/common/client/node_lifecycle_test.go: `.declareAlive()` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { metric, err := promPoolRPCNodeHighestFinalizedBlock.GetMetricWithLabelValues(big.NewInt(1).String(), name) require.NoError(t, err) var m = &prom.Metric{} require.NoError(t, metric.Write(m)) return float64(expectedBlock) == m.Gauge.GetValue() })` $DIR/common/client/node_lifecycle_test.go: `.GetMetricWithLabelValues(big.NewInt(1).String(), name)` $DIR/common/client/node_lifecycle_test.go: `.NewInt(1)` $DIR/common/client/node_lifecycle_test.go: `.String()` $DIR/common/client/node_lifecycle_test.go: `.Gauge.GetValue()` $DIR/common/client/node_lifecycle_test.go: `.rpc.On("Close")` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.rpc.On("DisconnectAll")` $DIR/common/client/node_lifecycle_test.go: `.setState(nodeStateAlive)` $DIR/common/client/node_lifecycle_test.go: `.Run("returns on closed", func(t *testing.T) { t.Parallel() node := newTestNode(t, testNodeOpts{}) node.setState(nodeStateClosed) node.wg.Add(1) node.outOfSyncLoop(stubIsOutOfSync) })` $DIR/common/client/node_lifecycle_test.go: `.setState(nodeStateClosed)` $DIR/common/client/node_lifecycle_test.go: `.wg.Add(1)` $DIR/common/client/node_lifecycle_test.go: `.outOfSyncLoop(stubIsOutOfSync)` $DIR/common/client/node_lifecycle_test.go: `.Run("on old blocks stays outOfSync and returns on close", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil).Once() rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once() outOfSyncSubscription := mocks.NewSubscription(t) outOfSyncSubscription.On("Err").Return((<-chan error)(nil)) outOfSyncSubscription.On("Unsubscribe").Once() heads := []head{{BlockNumber: 7}, {BlockNumber: 11}, {BlockNumber: 13}} rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Run(func(args mock.Arguments) { ch := args.Get(1).(chan<- Head) go writeHeads(t, ch, heads...) }).Return(outOfSyncSubscription, nil).Once() rpc.On("Dial", mock.Anything).Return(errors.New("failed to redial")).Maybe() node.declareOutOfSync(func(num int64, td *big.Int) bool { return true }) tests.AssertLogCountEventually(t, observedLogs, msgReceivedBlock, len(heads)) assert.Equal(t, nodeStateOutOfSync, node.State()) })` $DIR/common/client/node_lifecycle_test.go: `.RandomID()` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.NewSubscription(t)` $DIR/common/client/node_lifecycle_test.go: `.On("Err")` $DIR/common/client/node_lifecycle_test.go: `.Return((<-chan error)(nil))` $DIR/common/client/node_lifecycle_test.go: `.On("Unsubscribe")` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads)` $DIR/common/client/node_lifecycle_test.go: `.Run(func(args mock.Arguments) { ch := args.Get(1).(chan<- Head) go writeHeads(t, ch, heads...) })` $DIR/common/client/node_lifecycle_test.go: `.Get(1)` $DIR/common/client/node_lifecycle_test.go: `.Return(outOfSyncSubscription, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(errors.New("failed to redial"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to redial")` $DIR/common/client/node_lifecycle_test.go: `.Maybe()` $DIR/common/client/node_lifecycle_test.go: `.declareOutOfSync(func(num int64, td *big.Int) bool { return true })` $DIR/common/client/node_lifecycle_test.go: `.AssertLogCountEventually(t, observedLogs, msgReceivedBlock, len(heads))` $DIR/common/client/node_lifecycle_test.go: `.Run("if initial dial fails, transitions to unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) node := newAliveNode(t, testNodeOpts{ rpc: rpc, }) defer func() { assert.NoError(t, node.close()) }() expectedError := errors.New("failed to dial rpc") // might be called again in unreachable loop, so no need to set once rpc.On("Dial", mock.Anything).Return(expectedError) node.declareOutOfSync(stubIsOutOfSync) tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `.New("failed to dial rpc")` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(expectedError)` $DIR/common/client/node_lifecycle_test.go: `.declareOutOfSync(stubIsOutOfSync)` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.Run("if fail to get chainID, transitions to unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) node := newAliveNode(t, testNodeOpts{ rpc: rpc, }) defer func() { assert.NoError(t, node.close()) }() // for out-of-sync rpc.On("Dial", mock.Anything).Return(nil).Once() // for unreachable rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe() expectedError := errors.New("failed to get chain ID") // might be called multiple times rpc.On("ChainID", mock.Anything).Return(types.NewIDFromInt(0), expectedError) node.declareOutOfSync(stubIsOutOfSync) tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(errors.New("failed to dial"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to dial")` $DIR/common/client/node_lifecycle_test.go: `.Maybe()` $DIR/common/client/node_lifecycle_test.go: `.New("failed to get chain ID")` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(types.NewIDFromInt(0), expectedError)` $DIR/common/client/node_lifecycle_test.go: `.NewIDFromInt(0)` $DIR/common/client/node_lifecycle_test.go: `.declareOutOfSync(stubIsOutOfSync)` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.Run("if chainID does not match, transitions to invalidChainID", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.NewIDFromInt(10) rpcChainID := types.NewIDFromInt(11) node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, }) defer func() { assert.NoError(t, node.close()) }() // one for out-of-sync & one for invalid chainID rpc.On("Dial", mock.Anything).Return(nil).Twice() // might be called multiple times rpc.On("ChainID", mock.Anything).Return(rpcChainID, nil) node.declareOutOfSync(stubIsOutOfSync) tests.AssertEventually(t, func() bool { return node.State() == nodeStateInvalidChainID }) })` $DIR/common/client/node_lifecycle_test.go: `.NewIDFromInt(10)` $DIR/common/client/node_lifecycle_test.go: `.NewIDFromInt(11)` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.Twice()` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(rpcChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.declareOutOfSync(stubIsOutOfSync)` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateInvalidChainID })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.Run("if syncing, transitions to syncing", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.NewIDFromInt(10) node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, config: testNodeConfig{nodeIsSyncingEnabled: true}, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil) rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil) // might be called multiple times rpc.On("IsSyncing", mock.Anything).Return(true, nil) node.declareOutOfSync(stubIsOutOfSync) tests.AssertEventually(t, func() bool { return node.State() == nodeStateSyncing }) })` $DIR/common/client/node_lifecycle_test.go: `.NewIDFromInt(10)` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.On("IsSyncing", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(true, nil)` $DIR/common/client/node_lifecycle_test.go: `.declareOutOfSync(stubIsOutOfSync)` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateSyncing })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.Run("if fails to fetch syncing status, transitions to unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.NewIDFromInt(10) node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, config: testNodeConfig{nodeIsSyncingEnabled: true}, }) defer func() { assert.NoError(t, node.close()) }() // one for out-of-sync rpc.On("Dial", mock.Anything).Return(nil).Once() // for unreachable rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe() rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once() // might be called multiple times rpc.On("IsSyncing", mock.Anything).Return(false, errors.New("failed to check syncing")) node.declareOutOfSync(stubIsOutOfSync) tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `.NewIDFromInt(10)` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(errors.New("failed to dial"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to dial")` $DIR/common/client/node_lifecycle_test.go: `.Maybe()` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("IsSyncing", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(false, errors.New("failed to check syncing"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to check syncing")` $DIR/common/client/node_lifecycle_test.go: `.declareOutOfSync(stubIsOutOfSync)` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.Run("if fails to subscribe, becomes unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil).Once() rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once() expectedError := errors.New("failed to subscribe") rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Return(nil, expectedError) rpc.On("Dial", mock.Anything).Return(errors.New("failed to redial")).Maybe() node.declareOutOfSync(stubIsOutOfSync) tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `.RandomID()` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.New("failed to subscribe")` $DIR/common/client/node_lifecycle_test.go: `.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil, expectedError)` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(errors.New("failed to redial"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to redial")` $DIR/common/client/node_lifecycle_test.go: `.Maybe()` $DIR/common/client/node_lifecycle_test.go: `.declareOutOfSync(stubIsOutOfSync)` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.Run("on subscription termination becomes unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.ErrorLevel) node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil).Once() rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once() sub := mocks.NewSubscription(t) errChan := make(chan error, 1) errChan <- errors.New("subscription was terminate") sub.On("Err").Return((<-chan error)(errChan)) sub.On("Unsubscribe").Once() rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Return(sub, nil).Once() rpc.On("Dial", mock.Anything).Return(errors.New("failed to redial")).Maybe() node.declareOutOfSync(stubIsOutOfSync) tests.AssertLogEventually(t, observedLogs, "Subscription was terminated") tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `.RandomID()` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.ErrorLevel)` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.NewSubscription(t)` $DIR/common/client/node_lifecycle_test.go: `.New("subscription was terminate")` $DIR/common/client/node_lifecycle_test.go: `.On("Err")` $DIR/common/client/node_lifecycle_test.go: `.Return((<-chan error)(errChan))` $DIR/common/client/node_lifecycle_test.go: `.On("Unsubscribe")` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads)` $DIR/common/client/node_lifecycle_test.go: `.Return(sub, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(errors.New("failed to redial"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to redial")` $DIR/common/client/node_lifecycle_test.go: `.Maybe()` $DIR/common/client/node_lifecycle_test.go: `.declareOutOfSync(stubIsOutOfSync)` $DIR/common/client/node_lifecycle_test.go: `.AssertLogEventually(t, observedLogs, "Subscription was terminated")` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.Run("becomes unreachable if head channel is closed", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.ErrorLevel) node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil).Once() rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once() sub := mocks.NewSubscription(t) sub.On("Err").Return((<-chan error)(nil)) sub.On("Unsubscribe").Once() rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Run(func(args mock.Arguments) { ch := args.Get(1).(chan<- Head) close(ch) }).Return(sub, nil).Once() rpc.On("Dial", mock.Anything).Return(errors.New("failed to redial")).Maybe() node.declareOutOfSync(stubIsOutOfSync) tests.AssertLogEventually(t, observedLogs, "Subscription channel unexpectedly closed") tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `.RandomID()` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.ErrorLevel)` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.NewSubscription(t)` $DIR/common/client/node_lifecycle_test.go: `.On("Err")` $DIR/common/client/node_lifecycle_test.go: `.Return((<-chan error)(nil))` $DIR/common/client/node_lifecycle_test.go: `.On("Unsubscribe")` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads)` $DIR/common/client/node_lifecycle_test.go: `.Run(func(args mock.Arguments) { ch := args.Get(1).(chan<- Head) close(ch) })` $DIR/common/client/node_lifecycle_test.go: `.Get(1)` $DIR/common/client/node_lifecycle_test.go: `.Return(sub, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(errors.New("failed to redial"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to redial")` $DIR/common/client/node_lifecycle_test.go: `.Maybe()` $DIR/common/client/node_lifecycle_test.go: `.declareOutOfSync(stubIsOutOfSync)` $DIR/common/client/node_lifecycle_test.go: `.AssertLogEventually(t, observedLogs, "Subscription channel unexpectedly closed")` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.Run("becomes alive if it receives a newer head", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil).Once() rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once() outOfSyncSubscription := mocks.NewSubscription(t) outOfSyncSubscription.On("Err").Return((<-chan error)(nil)) outOfSyncSubscription.On("Unsubscribe").Once() const highestBlock = 1000 rpc.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads).Run(func(args mock.Arguments) { ch := args.Get(1).(chan<- Head) go writeHeads(t, ch, head{BlockNumber: highestBlock - 1}, head{BlockNumber: highestBlock}) }).Return(outOfSyncSubscription, nil).Once() setupRPCForAliveLoop(t, rpc) node.declareOutOfSync(func(num int64, td *big.Int) bool { return num < highestBlock }) tests.AssertLogEventually(t, observedLogs, msgReceivedBlock) tests.AssertLogEventually(t, observedLogs, msgInSync) tests.AssertEventually(t, func() bool { return node.State() == nodeStateAlive }) })` $DIR/common/client/node_lifecycle_test.go: `.RandomID()` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.NewSubscription(t)` $DIR/common/client/node_lifecycle_test.go: `.On("Err")` $DIR/common/client/node_lifecycle_test.go: `.Return((<-chan error)(nil))` $DIR/common/client/node_lifecycle_test.go: `.On("Unsubscribe")` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads)` $DIR/common/client/node_lifecycle_test.go: `.Run(func(args mock.Arguments) { ch := args.Get(1).(chan<- Head) go writeHeads(t, ch, head{BlockNumber: highestBlock - 1}, head{BlockNumber: highestBlock}) })` $DIR/common/client/node_lifecycle_test.go: `.Get(1)` $DIR/common/client/node_lifecycle_test.go: `.Return(outOfSyncSubscription, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.declareOutOfSync(func(num int64, td *big.Int) bool { return num < highestBlock })` $DIR/common/client/node_lifecycle_test.go: `.AssertLogEventually(t, observedLogs, msgReceivedBlock)` $DIR/common/client/node_lifecycle_test.go: `.AssertLogEventually(t, observedLogs, msgInSync)` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateAlive })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.RandomID()` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/node_lifecycle_test.go: `.NewInt(200)` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.NewSubscription(t)` $DIR/common/client/node_lifecycle_test.go: `.On("Err")` $DIR/common/client/node_lifecycle_test.go: `.Return((<-chan error)(nil))` $DIR/common/client/node_lifecycle_test.go: `.On("Unsubscribe")` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("Subscribe", mock.Anything, mock.Anything, rpcSubscriptionMethodNewHeads)` $DIR/common/client/node_lifecycle_test.go: `.Return(outOfSyncSubscription, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.declareOutOfSync(stubIsOutOfSync)` $DIR/common/client/node_lifecycle_test.go: `.AssertLogEventually(t, observedLogs, "RPC endpoint is still out of sync, but there are no other available nodes. This RPC node will be forcibly moved back into the live pool in a degraded state")` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateAlive })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.rpc.On("Close")` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.rpc.On("DisconnectAll")` $DIR/common/client/node_lifecycle_test.go: `.setState(nodeStateAlive)` $DIR/common/client/node_lifecycle_test.go: `.Run("returns on closed", func(t *testing.T) { t.Parallel() node := newTestNode(t, testNodeOpts{}) node.setState(nodeStateClosed) node.wg.Add(1) node.unreachableLoop() })` $DIR/common/client/node_lifecycle_test.go: `.setState(nodeStateClosed)` $DIR/common/client/node_lifecycle_test.go: `.wg.Add(1)` $DIR/common/client/node_lifecycle_test.go: `.unreachableLoop()` $DIR/common/client/node_lifecycle_test.go: `.Run("on failed redial, keeps trying", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")) node.declareUnreachable() tests.AssertLogCountEventually(t, observedLogs, "Failed to redial RPC node; still unreachable", 2) })` $DIR/common/client/node_lifecycle_test.go: `.RandomID()` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(errors.New("failed to dial"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to dial")` $DIR/common/client/node_lifecycle_test.go: `.declareUnreachable()` $DIR/common/client/node_lifecycle_test.go: `.AssertLogCountEventually(t, observedLogs, "Failed to redial RPC node; still unreachable", 2)` $DIR/common/client/node_lifecycle_test.go: `.Run("on failed chainID verification, keep trying", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil) rpc.On("ChainID", mock.Anything).Run(func(_ mock.Arguments) { assert.Equal(t, nodeStateDialed, node.State()) }).Return(nodeChainID, errors.New("failed to get chain id")) node.declareUnreachable() tests.AssertLogCountEventually(t, observedLogs, "Failed to verify chain ID for node", 2) })` $DIR/common/client/node_lifecycle_test.go: `.RandomID()` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Run(func(_ mock.Arguments) { assert.Equal(t, nodeStateDialed, node.State()) })` $DIR/common/client/node_lifecycle_test.go: `.Return(nodeChainID, errors.New("failed to get chain id"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to get chain id")` $DIR/common/client/node_lifecycle_test.go: `.declareUnreachable()` $DIR/common/client/node_lifecycle_test.go: `.AssertLogCountEventually(t, observedLogs, "Failed to verify chain ID for node", 2)` $DIR/common/client/node_lifecycle_test.go: `.Run("on chain ID mismatch transitions to invalidChainID", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.NewIDFromInt(10) rpcChainID := types.NewIDFromInt(11) node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil) rpc.On("ChainID", mock.Anything).Return(rpcChainID, nil) node.declareUnreachable() tests.AssertEventually(t, func() bool { return node.State() == nodeStateInvalidChainID }) })` $DIR/common/client/node_lifecycle_test.go: `.NewIDFromInt(10)` $DIR/common/client/node_lifecycle_test.go: `.NewIDFromInt(11)` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(rpcChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.declareUnreachable()` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateInvalidChainID })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.Run("on syncing status check failure, keeps trying", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, config: testNodeConfig{nodeIsSyncingEnabled: true}, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil) rpc.On("ChainID", mock.Anything).Run(func(_ mock.Arguments) { assert.Equal(t, nodeStateDialed, node.State()) }).Return(nodeChainID, nil) rpc.On("IsSyncing", mock.Anything).Return(false, errors.New("failed to check syncing status")) node.declareUnreachable() tests.AssertLogCountEventually(t, observedLogs, "Unexpected error while verifying RPC node synchronization status", 2) })` $DIR/common/client/node_lifecycle_test.go: `.RandomID()` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Run(func(_ mock.Arguments) { assert.Equal(t, nodeStateDialed, node.State()) })` $DIR/common/client/node_lifecycle_test.go: `.Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.On("IsSyncing", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(false, errors.New("failed to check syncing status"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to check syncing status")` $DIR/common/client/node_lifecycle_test.go: `.declareUnreachable()` $DIR/common/client/node_lifecycle_test.go: `.AssertLogCountEventually(t, observedLogs, "Unexpected error while verifying RPC node synchronization status", 2)` $DIR/common/client/node_lifecycle_test.go: `.Run("on syncing, transitions to syncing state", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, config: testNodeConfig{nodeIsSyncingEnabled: true}, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil) rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil) rpc.On("IsSyncing", mock.Anything).Return(true, nil) setupRPCForAliveLoop(t, rpc) node.declareUnreachable() tests.AssertEventually(t, func() bool { return node.State() == nodeStateSyncing }) })` $DIR/common/client/node_lifecycle_test.go: `.RandomID()` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.On("IsSyncing", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(true, nil)` $DIR/common/client/node_lifecycle_test.go: `.declareUnreachable()` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateSyncing })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.Run("on successful verification becomes alive", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() node := newAliveNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, config: testNodeConfig{nodeIsSyncingEnabled: true}, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil) rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil) rpc.On("IsSyncing", mock.Anything).Return(false, nil) setupRPCForAliveLoop(t, rpc) node.declareUnreachable() tests.AssertEventually(t, func() bool { return node.State() == nodeStateAlive }) })` $DIR/common/client/node_lifecycle_test.go: `.RandomID()` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.On("IsSyncing", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(false, nil)` $DIR/common/client/node_lifecycle_test.go: `.declareUnreachable()` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateAlive })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.RandomID()` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.declareUnreachable()` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateAlive })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.rpc.On("Close")` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.rpc.On("DisconnectAll")` $DIR/common/client/node_lifecycle_test.go: `.setState(nodeStateDialed)` $DIR/common/client/node_lifecycle_test.go: `.Run("returns on closed", func(t *testing.T) { t.Parallel() node := newTestNode(t, testNodeOpts{}) node.setState(nodeStateClosed) node.wg.Add(1) node.invalidChainIDLoop() })` $DIR/common/client/node_lifecycle_test.go: `.setState(nodeStateClosed)` $DIR/common/client/node_lifecycle_test.go: `.wg.Add(1)` $DIR/common/client/node_lifecycle_test.go: `.invalidChainIDLoop()` $DIR/common/client/node_lifecycle_test.go: `.Run("on invalid dial becomes unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() node := newDialedNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")) node.declareInvalidChainID() tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `.RandomID()` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(errors.New("failed to dial"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to dial")` $DIR/common/client/node_lifecycle_test.go: `.declareInvalidChainID()` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.Run("on failed chainID call becomes unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newDialedNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("ChainID", mock.Anything).Return(nodeChainID, errors.New("failed to get chain id")) // once for chainID and maybe another one for unreachable rpc.On("Dial", mock.Anything).Return(nil).Once() rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe() node.declareInvalidChainID() tests.AssertLogEventually(t, observedLogs, "Failed to verify chain ID for node") tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `.RandomID()` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nodeChainID, errors.New("failed to get chain id"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to get chain id")` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(errors.New("failed to dial"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to dial")` $DIR/common/client/node_lifecycle_test.go: `.Maybe()` $DIR/common/client/node_lifecycle_test.go: `.declareInvalidChainID()` $DIR/common/client/node_lifecycle_test.go: `.AssertLogEventually(t, observedLogs, "Failed to verify chain ID for node")` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.Run("on chainID mismatch keeps trying", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.NewIDFromInt(10) rpcChainID := types.NewIDFromInt(11) lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newDialedNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil).Once() rpc.On("ChainID", mock.Anything).Return(rpcChainID, nil) node.declareInvalidChainID() tests.AssertLogCountEventually(t, observedLogs, "Failed to verify RPC node; remote endpoint returned the wrong chain ID", 2) tests.AssertEventually(t, func() bool { return node.State() == nodeStateInvalidChainID }) })` $DIR/common/client/node_lifecycle_test.go: `.NewIDFromInt(10)` $DIR/common/client/node_lifecycle_test.go: `.NewIDFromInt(11)` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(rpcChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.declareInvalidChainID()` $DIR/common/client/node_lifecycle_test.go: `.AssertLogCountEventually(t, observedLogs, "Failed to verify RPC node; remote endpoint returned the wrong chain ID", 2)` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateInvalidChainID })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.Run("on successful verification without isSyncing becomes alive", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.NewIDFromInt(10) rpcChainID := types.NewIDFromInt(11) node := newDialedNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil).Once() rpc.On("ChainID", mock.Anything).Return(rpcChainID, nil).Once() rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once() setupRPCForAliveLoop(t, rpc) node.declareInvalidChainID() tests.AssertEventually(t, func() bool { return node.State() == nodeStateAlive }) })` $DIR/common/client/node_lifecycle_test.go: `.NewIDFromInt(10)` $DIR/common/client/node_lifecycle_test.go: `.NewIDFromInt(11)` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(rpcChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.declareInvalidChainID()` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateAlive })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.NewIDFromInt(10)` $DIR/common/client/node_lifecycle_test.go: `.NewIDFromInt(11)` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(rpcChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("IsSyncing", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(false, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.declareInvalidChainID()` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateAlive })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.rpc.On("Close")` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.Run("if fails on initial dial, becomes unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")) // disconnects all on transfer to unreachable rpc.On("DisconnectAll") err := node.Start(tests.Context(t)) assert.NoError(t, err) tests.AssertLogEventually(t, observedLogs, "Dial failed: Node is unreachable") tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `.RandomID()` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(errors.New("failed to dial"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to dial")` $DIR/common/client/node_lifecycle_test.go: `.On("DisconnectAll")` $DIR/common/client/node_lifecycle_test.go: `.Start(tests.Context(t))` $DIR/common/client/node_lifecycle_test.go: `.Context(t)` $DIR/common/client/node_lifecycle_test.go: `.AssertLogEventually(t, observedLogs, "Dial failed: Node is unreachable")` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.Run("if chainID verification fails, becomes unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil) rpc.On("ChainID", mock.Anything).Run(func(_ mock.Arguments) { assert.Equal(t, nodeStateDialed, node.State()) }).Return(nodeChainID, errors.New("failed to get chain id")) // disconnects all on transfer to unreachable rpc.On("DisconnectAll") err := node.Start(tests.Context(t)) assert.NoError(t, err) tests.AssertLogEventually(t, observedLogs, "Failed to verify chain ID for node") tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `.RandomID()` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Run(func(_ mock.Arguments) { assert.Equal(t, nodeStateDialed, node.State()) })` $DIR/common/client/node_lifecycle_test.go: `.Return(nodeChainID, errors.New("failed to get chain id"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to get chain id")` $DIR/common/client/node_lifecycle_test.go: `.On("DisconnectAll")` $DIR/common/client/node_lifecycle_test.go: `.Start(tests.Context(t))` $DIR/common/client/node_lifecycle_test.go: `.Context(t)` $DIR/common/client/node_lifecycle_test.go: `.AssertLogEventually(t, observedLogs, "Failed to verify chain ID for node")` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.Run("on chain ID mismatch transitions to invalidChainID", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.NewIDFromInt(10) rpcChainID := types.NewIDFromInt(11) node := newNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil) rpc.On("ChainID", mock.Anything).Return(rpcChainID, nil) // disconnects all on transfer to unreachable rpc.On("DisconnectAll") err := node.Start(tests.Context(t)) assert.NoError(t, err) tests.AssertEventually(t, func() bool { return node.State() == nodeStateInvalidChainID }) })` $DIR/common/client/node_lifecycle_test.go: `.NewIDFromInt(10)` $DIR/common/client/node_lifecycle_test.go: `.NewIDFromInt(11)` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(rpcChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.On("DisconnectAll")` $DIR/common/client/node_lifecycle_test.go: `.Start(tests.Context(t))` $DIR/common/client/node_lifecycle_test.go: `.Context(t)` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateInvalidChainID })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.Run("if syncing verification fails, becomes unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, config: testNodeConfig{nodeIsSyncingEnabled: true}, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil).Once() rpc.On("ChainID", mock.Anything).Run(func(_ mock.Arguments) { assert.Equal(t, nodeStateDialed, node.State()) }).Return(nodeChainID, nil).Once() rpc.On("IsSyncing", mock.Anything).Return(false, errors.New("failed to check syncing status")) // disconnects all on transfer to unreachable rpc.On("DisconnectAll") // fail to redial to stay in unreachable state rpc.On("Dial", mock.Anything).Return(errors.New("failed to redial")) err := node.Start(tests.Context(t)) assert.NoError(t, err) tests.AssertLogEventually(t, observedLogs, "Unexpected error while verifying RPC node synchronization status") tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `.RandomID()` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Run(func(_ mock.Arguments) { assert.Equal(t, nodeStateDialed, node.State()) })` $DIR/common/client/node_lifecycle_test.go: `.Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("IsSyncing", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(false, errors.New("failed to check syncing status"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to check syncing status")` $DIR/common/client/node_lifecycle_test.go: `.On("DisconnectAll")` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(errors.New("failed to redial"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to redial")` $DIR/common/client/node_lifecycle_test.go: `.Start(tests.Context(t))` $DIR/common/client/node_lifecycle_test.go: `.Context(t)` $DIR/common/client/node_lifecycle_test.go: `.AssertLogEventually(t, observedLogs, "Unexpected error while verifying RPC node synchronization status")` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.Run("on isSyncing transitions to syncing", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.NewIDFromInt(10) node := newNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, config: testNodeConfig{nodeIsSyncingEnabled: true}, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil) rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil) rpc.On("IsSyncing", mock.Anything).Return(true, nil) // disconnects all on transfer to unreachable rpc.On("DisconnectAll") err := node.Start(tests.Context(t)) assert.NoError(t, err) tests.AssertEventually(t, func() bool { return node.State() == nodeStateSyncing }) })` $DIR/common/client/node_lifecycle_test.go: `.NewIDFromInt(10)` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.On("IsSyncing", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(true, nil)` $DIR/common/client/node_lifecycle_test.go: `.On("DisconnectAll")` $DIR/common/client/node_lifecycle_test.go: `.Start(tests.Context(t))` $DIR/common/client/node_lifecycle_test.go: `.Context(t)` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateSyncing })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.Run("on successful verification becomes alive", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() node := newNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, config: testNodeConfig{nodeIsSyncingEnabled: true}, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil) rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil) rpc.On("IsSyncing", mock.Anything).Return(false, nil) setupRPCForAliveLoop(t, rpc) err := node.Start(tests.Context(t)) assert.NoError(t, err) tests.AssertEventually(t, func() bool { return node.State() == nodeStateAlive }) })` $DIR/common/client/node_lifecycle_test.go: `.RandomID()` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.On("IsSyncing", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(false, nil)` $DIR/common/client/node_lifecycle_test.go: `.Start(tests.Context(t))` $DIR/common/client/node_lifecycle_test.go: `.Context(t)` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateAlive })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.RandomID()` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.Start(tests.Context(t))` $DIR/common/client/node_lifecycle_test.go: `.Context(t)` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateAlive })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.Run("skip if nLiveNodes is not configured", func(t *testing.T) { node := newTestNode(t, testNodeOpts{}) outOfSync, liveNodes := node.syncStatus(0, nil) assert.Equal(t, false, outOfSync) assert.Equal(t, 0, liveNodes) })` $DIR/common/client/node_lifecycle_test.go: `.syncStatus(0, nil)` $DIR/common/client/node_lifecycle_test.go: `.Run("skip if syncThreshold is not configured", func(t *testing.T) { node := newTestNode(t, testNodeOpts{}) node.nLiveNodes = func() (count int, blockNumber int64, totalDifficulty *big.Int) { return } outOfSync, liveNodes := node.syncStatus(0, nil) assert.Equal(t, false, outOfSync) assert.Equal(t, 0, liveNodes) })` $DIR/common/client/node_lifecycle_test.go: `.syncStatus(0, nil)` $DIR/common/client/node_lifecycle_test.go: `.Run("panics on invalid selection mode", func(t *testing.T) { node := newTestNode(t, testNodeOpts{ config: testNodeConfig{syncThreshold: 1}, }) node.nLiveNodes = func() (count int, blockNumber int64, totalDifficulty *big.Int) { return } assert.Panics(t, func() { _, _ = node.syncStatus(0, nil) }) })` $DIR/common/client/node_lifecycle_test.go: `.Run("block height selection mode", func(t *testing.T) { const syncThreshold = 10 const highestBlock = 1000 const nodesNum = 20 const totalDifficulty = 3000 testCases := []struct { name string blockNumber int64 outOfSync bool }{ { name: "below threshold", blockNumber: highestBlock - syncThreshold - 1, outOfSync: true, }, { name: "equal to threshold", blockNumber: highestBlock - syncThreshold, outOfSync: false, }, { name: "equal to highest block", blockNumber: highestBlock, outOfSync: false, }, { name: "higher than highest block", blockNumber: highestBlock, outOfSync: false, }, } for _, selectionMode := range []string{NodeSelectionModeHighestHead, NodeSelectionModeRoundRobin, NodeSelectionModePriorityLevel} { node := newTestNode(t, testNodeOpts{ config: testNodeConfig{ syncThreshold: syncThreshold, selectionMode: selectionMode, }, }) node.nLiveNodes = func() (int, int64, *big.Int) { return nodesNum, highestBlock, big.NewInt(totalDifficulty) } for _, td := range []int64{totalDifficulty - syncThreshold - 1, totalDifficulty - syncThreshold, totalDifficulty, totalDifficulty + 1} { for _, testCase := range testCases { t.Run(fmt.Sprintf("%s: SelectionModeVal: %s: total difficulty: %d", testCase.name, selectionMode, td), func(t *testing.T) { outOfSync, liveNodes := node.syncStatus(testCase.blockNumber, big.NewInt(td)) assert.Equal(t, nodesNum, liveNodes) assert.Equal(t, testCase.outOfSync, outOfSync) }) } } } })` $DIR/common/client/node_lifecycle_test.go: `.NewInt(totalDifficulty)` $DIR/common/client/node_lifecycle_test.go: `.Run(fmt.Sprintf("%s: SelectionModeVal: %s: total difficulty: %d", testCase.name, selectionMode, td), func(t *testing.T) { outOfSync, liveNodes := node.syncStatus(testCase.blockNumber, big.NewInt(td)) assert.Equal(t, nodesNum, liveNodes) assert.Equal(t, testCase.outOfSync, outOfSync) })` $DIR/common/client/node_lifecycle_test.go: `.Sprintf("%s: SelectionModeVal: %s: total difficulty: %d", testCase.name, selectionMode, td)` $DIR/common/client/node_lifecycle_test.go: `.syncStatus(testCase.blockNumber, big.NewInt(td))` $DIR/common/client/node_lifecycle_test.go: `.NewInt(td)` $DIR/common/client/node_lifecycle_test.go: `.NewInt(totalDifficulty)` $DIR/common/client/node_lifecycle_test.go: `.Run(fmt.Sprintf("%s: SelectionModeVal: %s: highest block: %d", testCase.name, NodeSelectionModeTotalDifficulty, hb), func(t *testing.T) { outOfSync, liveNodes := node.syncStatus(hb, big.NewInt(testCase.totalDifficulty)) assert.Equal(t, nodesNum, liveNodes) assert.Equal(t, testCase.outOfSync, outOfSync) })` $DIR/common/client/node_lifecycle_test.go: `.Sprintf("%s: SelectionModeVal: %s: highest block: %d", testCase.name, NodeSelectionModeTotalDifficulty, hb)` $DIR/common/client/node_lifecycle_test.go: `.syncStatus(hb, big.NewInt(testCase.totalDifficulty))` $DIR/common/client/node_lifecycle_test.go: `.NewInt(testCase.totalDifficulty)` $DIR/common/client/node_lifecycle_test.go: `.rpc.On("Close")` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.rpc.On("DisconnectAll")` $DIR/common/client/node_lifecycle_test.go: `.setState(nodeStateDialed)` $DIR/common/client/node_lifecycle_test.go: `.Run("returns on closed", func(t *testing.T) { t.Parallel() node := newTestNode(t, testNodeOpts{}) node.setState(nodeStateClosed) node.wg.Add(1) node.syncingLoop() })` $DIR/common/client/node_lifecycle_test.go: `.setState(nodeStateClosed)` $DIR/common/client/node_lifecycle_test.go: `.wg.Add(1)` $DIR/common/client/node_lifecycle_test.go: `.syncingLoop()` $DIR/common/client/node_lifecycle_test.go: `.Run("on invalid dial becomes unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() node := newDialedNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")) node.declareSyncing() tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `.RandomID()` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(errors.New("failed to dial"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to dial")` $DIR/common/client/node_lifecycle_test.go: `.declareSyncing()` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.Run("on failed chainID call becomes unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newDialedNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("ChainID", mock.Anything).Return(nodeChainID, errors.New("failed to get chain id")) // once for syncing and maybe another one for unreachable rpc.On("Dial", mock.Anything).Return(nil).Once() rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe() node.declareSyncing() tests.AssertLogEventually(t, observedLogs, "Failed to verify chain ID for node") tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `.RandomID()` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nodeChainID, errors.New("failed to get chain id"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to get chain id")` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(errors.New("failed to dial"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to dial")` $DIR/common/client/node_lifecycle_test.go: `.Maybe()` $DIR/common/client/node_lifecycle_test.go: `.declareSyncing()` $DIR/common/client/node_lifecycle_test.go: `.AssertLogEventually(t, observedLogs, "Failed to verify chain ID for node")` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.Run("on chainID mismatch transitions to invalidChainID", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.NewIDFromInt(10) rpcChainID := types.NewIDFromInt(11) lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newDialedNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("Dial", mock.Anything).Return(nil).Twice() rpc.On("ChainID", mock.Anything).Return(rpcChainID, nil) node.declareSyncing() tests.AssertLogCountEventually(t, observedLogs, "Failed to verify RPC node; remote endpoint returned the wrong chain ID", 2) tests.AssertEventually(t, func() bool { return node.State() == nodeStateInvalidChainID }) })` $DIR/common/client/node_lifecycle_test.go: `.NewIDFromInt(10)` $DIR/common/client/node_lifecycle_test.go: `.NewIDFromInt(11)` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.Twice()` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(rpcChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.declareSyncing()` $DIR/common/client/node_lifecycle_test.go: `.AssertLogCountEventually(t, observedLogs, "Failed to verify RPC node; remote endpoint returned the wrong chain ID", 2)` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateInvalidChainID })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.Run("on failed Syncing check - becomes unreachable", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newDialedNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once() // first one is needed to enter internal loop rpc.On("IsSyncing", mock.Anything).Return(true, nil).Once() rpc.On("IsSyncing", mock.Anything).Return(false, errors.New("failed to check if syncing")).Once() rpc.On("Dial", mock.Anything).Return(nil).Once() rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe() node.declareSyncing() tests.AssertLogEventually(t, observedLogs, "Unexpected error while verifying RPC node synchronization status") tests.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable }) })` $DIR/common/client/node_lifecycle_test.go: `.RandomID()` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("IsSyncing", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(true, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("IsSyncing", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(false, errors.New("failed to check if syncing"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to check if syncing")` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(errors.New("failed to dial"))` $DIR/common/client/node_lifecycle_test.go: `.New("failed to dial")` $DIR/common/client/node_lifecycle_test.go: `.Maybe()` $DIR/common/client/node_lifecycle_test.go: `.declareSyncing()` $DIR/common/client/node_lifecycle_test.go: `.AssertLogEventually(t, observedLogs, "Unexpected error while verifying RPC node synchronization status")` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateUnreachable })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.Run("on IsSyncing - keeps trying", func(t *testing.T) { t.Parallel() rpc := newMockNodeClient[types.ID, Head](t) nodeChainID := types.RandomID() lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newDialedNode(t, testNodeOpts{ rpc: rpc, chainID: nodeChainID, lggr: lggr, }) defer func() { assert.NoError(t, node.close()) }() rpc.On("ChainID", mock.Anything).Return(nodeChainID, nil).Once() rpc.On("IsSyncing", mock.Anything).Return(true, nil) rpc.On("Dial", mock.Anything).Return(nil).Once() node.declareSyncing() tests.AssertLogCountEventually(t, observedLogs, "Verification failed: Node is syncing", 2) tests.AssertEventually(t, func() bool { return node.State() == nodeStateSyncing }) })` $DIR/common/client/node_lifecycle_test.go: `.RandomID()` $DIR/common/client/node_lifecycle_test.go: `.TestObserved(t, zap.DebugLevel)` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("IsSyncing", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(true, nil)` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.declareSyncing()` $DIR/common/client/node_lifecycle_test.go: `.AssertLogCountEventually(t, observedLogs, "Verification failed: Node is syncing", 2)` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateSyncing })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_lifecycle_test.go: `.RandomID()` $DIR/common/client/node_lifecycle_test.go: `.On("Dial", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(nodeChainID, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("IsSyncing", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(true, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.On("IsSyncing", mock.Anything)` $DIR/common/client/node_lifecycle_test.go: `.Return(false, nil)` $DIR/common/client/node_lifecycle_test.go: `.Once()` $DIR/common/client/node_lifecycle_test.go: `.declareSyncing()` $DIR/common/client/node_lifecycle_test.go: `.AssertEventually(t, func() bool { return node.State() == nodeStateAlive })` $DIR/common/client/node_lifecycle_test.go: `.State()` $DIR/common/client/node_selector_highest_head_test.go: `node.On("StateAndLatest").Return(nodeStateOutOfSync, int64(-1), nil)` $DIR/common/client/node_selector_highest_head_test.go: `node.On("StateAndLatest").Return(nodeStateAlive, int64(1), nil)` $DIR/common/client/node_selector_highest_head_test.go: `node.On("StateAndLatest").Return(nodeStateAlive, int64(2), nil)` $DIR/common/client/node_selector_highest_head_test.go: `node.On("Order").Maybe().Return(int32(1))` $DIR/common/client/node_selector_highest_head_test.go: `nodes = append(nodes, node)` $DIR/common/client/node_selector_highest_head_test.go: `t.Run("stick to the same node", func(t *testing.T) { node := newMockNode[types.ID, Head, nodeClient](t) // fourth node is alive, LatestReceivedBlockNumber = 2 (same as 3rd) node.On("StateAndLatest").Return(nodeStateAlive, int64(2), nil) node.On("Order").Return(int32(1)) nodes = append(nodes, node) selector := newNodeSelector(NodeSelectionModeHighestHead, nodes) assert.Same(t, nodes[2], selector.Select()) })` $DIR/common/client/node_selector_highest_head_test.go: `node.On("StateAndLatest").Return(nodeStateAlive, int64(2), nil)` $DIR/common/client/node_selector_highest_head_test.go: `node.On("Order").Return(int32(1))` $DIR/common/client/node_selector_highest_head_test.go: `nodes = append(nodes, node)` $DIR/common/client/node_selector_highest_head_test.go: `t.Run("another best node", func(t *testing.T) { node := newMockNode[types.ID, Head, nodeClient](t) // fifth node is alive, LatestReceivedBlockNumber = 3 (better than 3rd and 4th) node.On("StateAndLatest").Return(nodeStateAlive, int64(3), nil) node.On("Order").Return(int32(1)) nodes = append(nodes, node) selector := newNodeSelector(NodeSelectionModeHighestHead, nodes) assert.Same(t, nodes[4], selector.Select()) })` $DIR/common/client/node_selector_highest_head_test.go: `node.On("StateAndLatest").Return(nodeStateAlive, int64(3), nil)` $DIR/common/client/node_selector_highest_head_test.go: `node.On("Order").Return(int32(1))` $DIR/common/client/node_selector_highest_head_test.go: `nodes = append(nodes, node)` $DIR/common/client/node_selector_highest_head_test.go: `node1.On("StateAndLatest").Return(nodeStateAlive, int64(-1), nil)` $DIR/common/client/node_selector_highest_head_test.go: `node1.On("Order").Return(int32(1))` $DIR/common/client/node_selector_highest_head_test.go: `node2.On("StateAndLatest").Return(nodeStateAlive, int64(-1), nil)` $DIR/common/client/node_selector_highest_head_test.go: `node2.On("Order").Return(int32(1))` $DIR/common/client/node_selector_highest_head_test.go: `node.On("StateAndLatest").Return(nodeStateOutOfSync, int64(-1), nil)` $DIR/common/client/node_selector_highest_head_test.go: `node.On("StateAndLatest").Return(nodeStateUnreachable, int64(1), nil)` $DIR/common/client/node_selector_highest_head_test.go: `nodes = append(nodes, node)` $DIR/common/client/node_selector_highest_head_test.go: `t.Run("same head and order", func(t *testing.T) { for i := 0; i < 3; i++ { node := newMockNode[types.ID, Head, nodeClient](t) node.On("StateAndLatest").Return(nodeStateAlive, int64(1), nil) node.On("Order").Return(int32(2)) nodes = append(nodes, node) } selector := newNodeSelector(NodeSelectionModeHighestHead, nodes) //Should select the first node because all things are equal assert.Same(t, nodes[0], selector.Select()) })` $DIR/common/client/node_selector_highest_head_test.go: `node.On("StateAndLatest").Return(nodeStateAlive, int64(1), nil)` $DIR/common/client/node_selector_highest_head_test.go: `node.On("Order").Return(int32(2))` $DIR/common/client/node_selector_highest_head_test.go: `nodes = append(nodes, node)` $DIR/common/client/node_selector_highest_head_test.go: `t.Run("same head but different order", func(t *testing.T) { node1 := newMockNode[types.ID, Head, nodeClient](t) node1.On("StateAndLatest").Return(nodeStateAlive, int64(3), nil) node1.On("Order").Return(int32(3)) node2 := newMockNode[types.ID, Head, nodeClient](t) node2.On("StateAndLatest").Return(nodeStateAlive, int64(3), nil) node2.On("Order").Return(int32(1)) node3 := newMockNode[types.ID, Head, nodeClient](t) node3.On("StateAndLatest").Return(nodeStateAlive, int64(3), nil) node3.On("Order").Return(int32(2)) nodes := []Node[types.ID, Head, nodeClient]{node1, node2, node3} selector := newNodeSelector(NodeSelectionModeHighestHead, nodes) //Should select the second node as it has the highest priority assert.Same(t, nodes[1], selector.Select()) })` $DIR/common/client/node_selector_highest_head_test.go: `node1.On("StateAndLatest").Return(nodeStateAlive, int64(3), nil)` $DIR/common/client/node_selector_highest_head_test.go: `node1.On("Order").Return(int32(3))` $DIR/common/client/node_selector_highest_head_test.go: `node2.On("StateAndLatest").Return(nodeStateAlive, int64(3), nil)` $DIR/common/client/node_selector_highest_head_test.go: `node2.On("Order").Return(int32(1))` $DIR/common/client/node_selector_highest_head_test.go: `node3.On("StateAndLatest").Return(nodeStateAlive, int64(3), nil)` $DIR/common/client/node_selector_highest_head_test.go: `node3.On("Order").Return(int32(2))` $DIR/common/client/node_selector_highest_head_test.go: `t.Run("different head but same order", func(t *testing.T) { node1 := newMockNode[types.ID, Head, nodeClient](t) node1.On("StateAndLatest").Return(nodeStateAlive, int64(1), nil) node1.On("Order").Maybe().Return(int32(3)) node2 := newMockNode[types.ID, Head, nodeClient](t) node2.On("StateAndLatest").Return(nodeStateAlive, int64(2), nil) node2.On("Order").Maybe().Return(int32(3)) node3 := newMockNode[types.ID, Head, nodeClient](t) node3.On("StateAndLatest").Return(nodeStateAlive, int64(3), nil) node3.On("Order").Return(int32(3)) nodes := []Node[types.ID, Head, nodeClient]{node1, node2, node3} selector := newNodeSelector(NodeSelectionModeHighestHead, nodes) //Should select the third node as it has the highest head assert.Same(t, nodes[2], selector.Select()) })` $DIR/common/client/node_selector_highest_head_test.go: `node1.On("StateAndLatest").Return(nodeStateAlive, int64(1), nil)` $DIR/common/client/node_selector_highest_head_test.go: `node1.On("Order").Maybe().Return(int32(3))` $DIR/common/client/node_selector_highest_head_test.go: `node2.On("StateAndLatest").Return(nodeStateAlive, int64(2), nil)` $DIR/common/client/node_selector_highest_head_test.go: `node2.On("Order").Maybe().Return(int32(3))` $DIR/common/client/node_selector_highest_head_test.go: `node3.On("StateAndLatest").Return(nodeStateAlive, int64(3), nil)` $DIR/common/client/node_selector_highest_head_test.go: `node3.On("Order").Return(int32(3))` $DIR/common/client/node_selector_highest_head_test.go: `node1.On("StateAndLatest").Return(nodeStateAlive, int64(10), nil)` $DIR/common/client/node_selector_highest_head_test.go: `node1.On("Order").Maybe().Return(int32(3))` $DIR/common/client/node_selector_highest_head_test.go: `node2.On("StateAndLatest").Return(nodeStateAlive, int64(11), nil)` $DIR/common/client/node_selector_highest_head_test.go: `node2.On("Order").Maybe().Return(int32(4))` $DIR/common/client/node_selector_highest_head_test.go: `node3.On("StateAndLatest").Return(nodeStateAlive, int64(11), nil)` $DIR/common/client/node_selector_highest_head_test.go: `node3.On("Order").Maybe().Return(int32(3))` $DIR/common/client/node_selector_highest_head_test.go: `node4.On("StateAndLatest").Return(nodeStateAlive, int64(10), nil)` $DIR/common/client/node_selector_highest_head_test.go: `node4.On("Order").Maybe().Return(int32(1))` $DIR/common/client/node_selector_highest_head_test.go: `.Name()` $DIR/common/client/node_selector_highest_head_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(nodeStateOutOfSync, int64(-1), nil)` $DIR/common/client/node_selector_highest_head_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(nodeStateAlive, int64(1), nil)` $DIR/common/client/node_selector_highest_head_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(nodeStateAlive, int64(2), nil)` $DIR/common/client/node_selector_highest_head_test.go: `.On("Order")` $DIR/common/client/node_selector_highest_head_test.go: `.Maybe()` $DIR/common/client/node_selector_highest_head_test.go: `.Return(int32(1))` $DIR/common/client/node_selector_highest_head_test.go: `.Run("stick to the same node", func(t *testing.T) { node := newMockNode[types.ID, Head, nodeClient](t) // fourth node is alive, LatestReceivedBlockNumber = 2 (same as 3rd) node.On("StateAndLatest").Return(nodeStateAlive, int64(2), nil) node.On("Order").Return(int32(1)) nodes = append(nodes, node) selector := newNodeSelector(NodeSelectionModeHighestHead, nodes) assert.Same(t, nodes[2], selector.Select()) })` $DIR/common/client/node_selector_highest_head_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(nodeStateAlive, int64(2), nil)` $DIR/common/client/node_selector_highest_head_test.go: `.On("Order")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(int32(1))` $DIR/common/client/node_selector_highest_head_test.go: `.Run("another best node", func(t *testing.T) { node := newMockNode[types.ID, Head, nodeClient](t) // fifth node is alive, LatestReceivedBlockNumber = 3 (better than 3rd and 4th) node.On("StateAndLatest").Return(nodeStateAlive, int64(3), nil) node.On("Order").Return(int32(1)) nodes = append(nodes, node) selector := newNodeSelector(NodeSelectionModeHighestHead, nodes) assert.Same(t, nodes[4], selector.Select()) })` $DIR/common/client/node_selector_highest_head_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(nodeStateAlive, int64(3), nil)` $DIR/common/client/node_selector_highest_head_test.go: `.On("Order")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(int32(1))` $DIR/common/client/node_selector_highest_head_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(nodeStateAlive, int64(-1), nil)` $DIR/common/client/node_selector_highest_head_test.go: `.On("Order")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(int32(1))` $DIR/common/client/node_selector_highest_head_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(nodeStateAlive, int64(-1), nil)` $DIR/common/client/node_selector_highest_head_test.go: `.On("Order")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(int32(1))` $DIR/common/client/node_selector_highest_head_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(nodeStateOutOfSync, int64(-1), nil)` $DIR/common/client/node_selector_highest_head_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(nodeStateUnreachable, int64(1), nil)` $DIR/common/client/node_selector_highest_head_test.go: `.Select()` $DIR/common/client/node_selector_highest_head_test.go: `.Run("same head and order", func(t *testing.T) { for i := 0; i < 3; i++ { node := newMockNode[types.ID, Head, nodeClient](t) node.On("StateAndLatest").Return(nodeStateAlive, int64(1), nil) node.On("Order").Return(int32(2)) nodes = append(nodes, node) } selector := newNodeSelector(NodeSelectionModeHighestHead, nodes) //Should select the first node because all things are equal assert.Same(t, nodes[0], selector.Select()) })` $DIR/common/client/node_selector_highest_head_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(nodeStateAlive, int64(1), nil)` $DIR/common/client/node_selector_highest_head_test.go: `.On("Order")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(int32(2))` $DIR/common/client/node_selector_highest_head_test.go: `.Run("same head but different order", func(t *testing.T) { node1 := newMockNode[types.ID, Head, nodeClient](t) node1.On("StateAndLatest").Return(nodeStateAlive, int64(3), nil) node1.On("Order").Return(int32(3)) node2 := newMockNode[types.ID, Head, nodeClient](t) node2.On("StateAndLatest").Return(nodeStateAlive, int64(3), nil) node2.On("Order").Return(int32(1)) node3 := newMockNode[types.ID, Head, nodeClient](t) node3.On("StateAndLatest").Return(nodeStateAlive, int64(3), nil) node3.On("Order").Return(int32(2)) nodes := []Node[types.ID, Head, nodeClient]{node1, node2, node3} selector := newNodeSelector(NodeSelectionModeHighestHead, nodes) //Should select the second node as it has the highest priority assert.Same(t, nodes[1], selector.Select()) })` $DIR/common/client/node_selector_highest_head_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(nodeStateAlive, int64(3), nil)` $DIR/common/client/node_selector_highest_head_test.go: `.On("Order")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(int32(3))` $DIR/common/client/node_selector_highest_head_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(nodeStateAlive, int64(3), nil)` $DIR/common/client/node_selector_highest_head_test.go: `.On("Order")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(int32(1))` $DIR/common/client/node_selector_highest_head_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(nodeStateAlive, int64(3), nil)` $DIR/common/client/node_selector_highest_head_test.go: `.On("Order")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(int32(2))` $DIR/common/client/node_selector_highest_head_test.go: `.Run("different head but same order", func(t *testing.T) { node1 := newMockNode[types.ID, Head, nodeClient](t) node1.On("StateAndLatest").Return(nodeStateAlive, int64(1), nil) node1.On("Order").Maybe().Return(int32(3)) node2 := newMockNode[types.ID, Head, nodeClient](t) node2.On("StateAndLatest").Return(nodeStateAlive, int64(2), nil) node2.On("Order").Maybe().Return(int32(3)) node3 := newMockNode[types.ID, Head, nodeClient](t) node3.On("StateAndLatest").Return(nodeStateAlive, int64(3), nil) node3.On("Order").Return(int32(3)) nodes := []Node[types.ID, Head, nodeClient]{node1, node2, node3} selector := newNodeSelector(NodeSelectionModeHighestHead, nodes) //Should select the third node as it has the highest head assert.Same(t, nodes[2], selector.Select()) })` $DIR/common/client/node_selector_highest_head_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(nodeStateAlive, int64(1), nil)` $DIR/common/client/node_selector_highest_head_test.go: `.On("Order")` $DIR/common/client/node_selector_highest_head_test.go: `.Maybe()` $DIR/common/client/node_selector_highest_head_test.go: `.Return(int32(3))` $DIR/common/client/node_selector_highest_head_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(nodeStateAlive, int64(2), nil)` $DIR/common/client/node_selector_highest_head_test.go: `.On("Order")` $DIR/common/client/node_selector_highest_head_test.go: `.Maybe()` $DIR/common/client/node_selector_highest_head_test.go: `.Return(int32(3))` $DIR/common/client/node_selector_highest_head_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(nodeStateAlive, int64(3), nil)` $DIR/common/client/node_selector_highest_head_test.go: `.On("Order")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(int32(3))` $DIR/common/client/node_selector_highest_head_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(nodeStateAlive, int64(10), nil)` $DIR/common/client/node_selector_highest_head_test.go: `.On("Order")` $DIR/common/client/node_selector_highest_head_test.go: `.Maybe()` $DIR/common/client/node_selector_highest_head_test.go: `.Return(int32(3))` $DIR/common/client/node_selector_highest_head_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(nodeStateAlive, int64(11), nil)` $DIR/common/client/node_selector_highest_head_test.go: `.On("Order")` $DIR/common/client/node_selector_highest_head_test.go: `.Maybe()` $DIR/common/client/node_selector_highest_head_test.go: `.Return(int32(4))` $DIR/common/client/node_selector_highest_head_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(nodeStateAlive, int64(11), nil)` $DIR/common/client/node_selector_highest_head_test.go: `.On("Order")` $DIR/common/client/node_selector_highest_head_test.go: `.Maybe()` $DIR/common/client/node_selector_highest_head_test.go: `.Return(int32(3))` $DIR/common/client/node_selector_highest_head_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_highest_head_test.go: `.Return(nodeStateAlive, int64(10), nil)` $DIR/common/client/node_selector_highest_head_test.go: `.On("Order")` $DIR/common/client/node_selector_highest_head_test.go: `.Maybe()` $DIR/common/client/node_selector_highest_head_test.go: `.Return(int32(1))` $DIR/common/client/node_selector_priority_level_test.go: `t.Run(tc.name, func(t *testing.T) { var nodes []Node[types.ID, Head, nodeClient] for _, tn := range tc.nodes { node := newMockNode[types.ID, Head, nodeClient](t) node.On("State").Return(tn.state) node.On("Order").Return(tn.order) nodes = append(nodes, node) } selector := newNodeSelector(NodeSelectionModePriorityLevel, nodes) for _, idx := range tc.expect { if idx >= len(nodes) { t.Fatalf("Invalid node index %d in test case '%s'", idx, tc.name) } assert.Same(t, nodes[idx], selector.Select()) } // Check for nil selection if expected slice is empty if len(tc.expect) == 0 { assert.Nil(t, selector.Select()) } })` $DIR/common/client/node_selector_priority_level_test.go: `node.On("State").Return(tn.state)` $DIR/common/client/node_selector_priority_level_test.go: `node.On("Order").Return(tn.order)` $DIR/common/client/node_selector_priority_level_test.go: `nodes = append(nodes, node)` $DIR/common/client/node_selector_priority_level_test.go: `.Name()` $DIR/common/client/node_selector_priority_level_test.go: `.Run(tc.name, func(t *testing.T) { var nodes []Node[types.ID, Head, nodeClient] for _, tn := range tc.nodes { node := newMockNode[types.ID, Head, nodeClient](t) node.On("State").Return(tn.state) node.On("Order").Return(tn.order) nodes = append(nodes, node) } selector := newNodeSelector(NodeSelectionModePriorityLevel, nodes) for _, idx := range tc.expect { if idx >= len(nodes) { t.Fatalf("Invalid node index %d in test case '%s'", idx, tc.name) } assert.Same(t, nodes[idx], selector.Select()) } // Check for nil selection if expected slice is empty if len(tc.expect) == 0 { assert.Nil(t, selector.Select()) } })` $DIR/common/client/node_selector_priority_level_test.go: `.On("State")` $DIR/common/client/node_selector_priority_level_test.go: `.Return(tn.state)` $DIR/common/client/node_selector_priority_level_test.go: `.On("Order")` $DIR/common/client/node_selector_priority_level_test.go: `.Return(tn.order)` $DIR/common/client/node_selector_round_robin_test.go: `node.On("State").Return(nodeStateOutOfSync)` $DIR/common/client/node_selector_round_robin_test.go: `node.On("State").Return(nodeStateAlive)` $DIR/common/client/node_selector_round_robin_test.go: `nodes = append(nodes, node)` $DIR/common/client/node_selector_round_robin_test.go: `node.On("State").Return(nodeStateOutOfSync)` $DIR/common/client/node_selector_round_robin_test.go: `node.On("State").Return(nodeStateUnreachable)` $DIR/common/client/node_selector_round_robin_test.go: `nodes = append(nodes, node)` $DIR/common/client/node_selector_round_robin_test.go: `.Name()` $DIR/common/client/node_selector_round_robin_test.go: `.On("State")` $DIR/common/client/node_selector_round_robin_test.go: `.Return(nodeStateOutOfSync)` $DIR/common/client/node_selector_round_robin_test.go: `.On("State")` $DIR/common/client/node_selector_round_robin_test.go: `.Return(nodeStateAlive)` $DIR/common/client/node_selector_round_robin_test.go: `.Select()` $DIR/common/client/node_selector_round_robin_test.go: `.On("State")` $DIR/common/client/node_selector_round_robin_test.go: `.Return(nodeStateOutOfSync)` $DIR/common/client/node_selector_round_robin_test.go: `.On("State")` $DIR/common/client/node_selector_round_robin_test.go: `.Return(nodeStateUnreachable)` $DIR/common/client/node_selector_round_robin_test.go: `.Select()` $DIR/common/client/node_selector_total_difficulty_test.go: `node.On("StateAndLatest").Return(nodeStateOutOfSync, int64(-1), nil)` $DIR/common/client/node_selector_total_difficulty_test.go: `node.On("StateAndLatest").Return(nodeStateAlive, int64(1), big.NewInt(7))` $DIR/common/client/node_selector_total_difficulty_test.go: `node.On("StateAndLatest").Return(nodeStateAlive, int64(2), big.NewInt(8))` $DIR/common/client/node_selector_total_difficulty_test.go: `node.On("Order").Maybe().Return(int32(1))` $DIR/common/client/node_selector_total_difficulty_test.go: `nodes = append(nodes, node)` $DIR/common/client/node_selector_total_difficulty_test.go: `t.Run("stick to the same node", func(t *testing.T) { node := newMockNode[types.ID, Head, nodeClient](t) // fourth node is alive (same as 3rd) node.On("StateAndLatest").Return(nodeStateAlive, int64(2), big.NewInt(8)) node.On("Order").Maybe().Return(int32(1)) nodes = append(nodes, node) selector := newNodeSelector(NodeSelectionModeTotalDifficulty, nodes) assert.Same(t, nodes[2], selector.Select()) })` $DIR/common/client/node_selector_total_difficulty_test.go: `node.On("StateAndLatest").Return(nodeStateAlive, int64(2), big.NewInt(8))` $DIR/common/client/node_selector_total_difficulty_test.go: `node.On("Order").Maybe().Return(int32(1))` $DIR/common/client/node_selector_total_difficulty_test.go: `nodes = append(nodes, node)` $DIR/common/client/node_selector_total_difficulty_test.go: `t.Run("another best node", func(t *testing.T) { node := newMockNode[types.ID, Head, nodeClient](t) // fifth node is alive (better than 3rd and 4th) node.On("StateAndLatest").Return(nodeStateAlive, int64(3), big.NewInt(11)) node.On("Order").Maybe().Return(int32(1)) nodes = append(nodes, node) selector := newNodeSelector(NodeSelectionModeTotalDifficulty, nodes) assert.Same(t, nodes[4], selector.Select()) })` $DIR/common/client/node_selector_total_difficulty_test.go: `node.On("StateAndLatest").Return(nodeStateAlive, int64(3), big.NewInt(11))` $DIR/common/client/node_selector_total_difficulty_test.go: `node.On("Order").Maybe().Return(int32(1))` $DIR/common/client/node_selector_total_difficulty_test.go: `nodes = append(nodes, node)` $DIR/common/client/node_selector_total_difficulty_test.go: `node1.On("StateAndLatest").Return(nodeStateAlive, int64(-1), nil)` $DIR/common/client/node_selector_total_difficulty_test.go: `node1.On("Order").Maybe().Return(int32(1))` $DIR/common/client/node_selector_total_difficulty_test.go: `node2.On("StateAndLatest").Return(nodeStateAlive, int64(-1), nil)` $DIR/common/client/node_selector_total_difficulty_test.go: `node2.On("Order").Maybe().Return(int32(1))` $DIR/common/client/node_selector_total_difficulty_test.go: `node.On("StateAndLatest").Return(nodeStateOutOfSync, int64(-1), nil)` $DIR/common/client/node_selector_total_difficulty_test.go: `node.On("StateAndLatest").Return(nodeStateUnreachable, int64(1), big.NewInt(7))` $DIR/common/client/node_selector_total_difficulty_test.go: `nodes = append(nodes, node)` $DIR/common/client/node_selector_total_difficulty_test.go: `t.Run("same td and order", func(t *testing.T) { for i := 0; i < 3; i++ { node := newMockNode[types.ID, Head, nodeClient](t) node.On("StateAndLatest").Return(nodeStateAlive, int64(1), big.NewInt(10)) node.On("Order").Return(int32(2)) nodes = append(nodes, node) } selector := newNodeSelector(NodeSelectionModeTotalDifficulty, nodes) //Should select the first node because all things are equal assert.Same(t, nodes[0], selector.Select()) })` $DIR/common/client/node_selector_total_difficulty_test.go: `node.On("StateAndLatest").Return(nodeStateAlive, int64(1), big.NewInt(10))` $DIR/common/client/node_selector_total_difficulty_test.go: `node.On("Order").Return(int32(2))` $DIR/common/client/node_selector_total_difficulty_test.go: `nodes = append(nodes, node)` $DIR/common/client/node_selector_total_difficulty_test.go: `t.Run("same td but different order", func(t *testing.T) { node1 := newMockNode[types.ID, Head, nodeClient](t) node1.On("StateAndLatest").Return(nodeStateAlive, int64(3), big.NewInt(10)) node1.On("Order").Return(int32(3)) node2 := newMockNode[types.ID, Head, nodeClient](t) node2.On("StateAndLatest").Return(nodeStateAlive, int64(3), big.NewInt(10)) node2.On("Order").Return(int32(1)) node3 := newMockNode[types.ID, Head, nodeClient](t) node3.On("StateAndLatest").Return(nodeStateAlive, int64(3), big.NewInt(10)) node3.On("Order").Return(int32(2)) nodes := []Node[types.ID, Head, nodeClient]{node1, node2, node3} selector := newNodeSelector(NodeSelectionModeTotalDifficulty, nodes) //Should select the second node as it has the highest priority assert.Same(t, nodes[1], selector.Select()) })` $DIR/common/client/node_selector_total_difficulty_test.go: `node1.On("StateAndLatest").Return(nodeStateAlive, int64(3), big.NewInt(10))` $DIR/common/client/node_selector_total_difficulty_test.go: `node1.On("Order").Return(int32(3))` $DIR/common/client/node_selector_total_difficulty_test.go: `node2.On("StateAndLatest").Return(nodeStateAlive, int64(3), big.NewInt(10))` $DIR/common/client/node_selector_total_difficulty_test.go: `node2.On("Order").Return(int32(1))` $DIR/common/client/node_selector_total_difficulty_test.go: `node3.On("StateAndLatest").Return(nodeStateAlive, int64(3), big.NewInt(10))` $DIR/common/client/node_selector_total_difficulty_test.go: `node3.On("Order").Return(int32(2))` $DIR/common/client/node_selector_total_difficulty_test.go: `t.Run("different td but same order", func(t *testing.T) { node1 := newMockNode[types.ID, Head, nodeClient](t) node1.On("StateAndLatest").Return(nodeStateAlive, int64(1), big.NewInt(10)) node1.On("Order").Maybe().Return(int32(3)) node2 := newMockNode[types.ID, Head, nodeClient](t) node2.On("StateAndLatest").Return(nodeStateAlive, int64(1), big.NewInt(11)) node2.On("Order").Maybe().Return(int32(3)) node3 := newMockNode[types.ID, Head, nodeClient](t) node3.On("StateAndLatest").Return(nodeStateAlive, int64(1), big.NewInt(12)) node3.On("Order").Return(int32(3)) nodes := []Node[types.ID, Head, nodeClient]{node1, node2, node3} selector := newNodeSelector(NodeSelectionModeTotalDifficulty, nodes) //Should select the third node as it has the highest td assert.Same(t, nodes[2], selector.Select()) })` $DIR/common/client/node_selector_total_difficulty_test.go: `node1.On("StateAndLatest").Return(nodeStateAlive, int64(1), big.NewInt(10))` $DIR/common/client/node_selector_total_difficulty_test.go: `node1.On("Order").Maybe().Return(int32(3))` $DIR/common/client/node_selector_total_difficulty_test.go: `node2.On("StateAndLatest").Return(nodeStateAlive, int64(1), big.NewInt(11))` $DIR/common/client/node_selector_total_difficulty_test.go: `node2.On("Order").Maybe().Return(int32(3))` $DIR/common/client/node_selector_total_difficulty_test.go: `node3.On("StateAndLatest").Return(nodeStateAlive, int64(1), big.NewInt(12))` $DIR/common/client/node_selector_total_difficulty_test.go: `node3.On("Order").Return(int32(3))` $DIR/common/client/node_selector_total_difficulty_test.go: `node1.On("StateAndLatest").Return(nodeStateAlive, int64(1), big.NewInt(100))` $DIR/common/client/node_selector_total_difficulty_test.go: `node1.On("Order").Maybe().Return(int32(4))` $DIR/common/client/node_selector_total_difficulty_test.go: `node2.On("StateAndLatest").Return(nodeStateAlive, int64(1), big.NewInt(110))` $DIR/common/client/node_selector_total_difficulty_test.go: `node2.On("Order").Maybe().Return(int32(5))` $DIR/common/client/node_selector_total_difficulty_test.go: `node3.On("StateAndLatest").Return(nodeStateAlive, int64(1), big.NewInt(110))` $DIR/common/client/node_selector_total_difficulty_test.go: `node3.On("Order").Maybe().Return(int32(1))` $DIR/common/client/node_selector_total_difficulty_test.go: `node4.On("StateAndLatest").Return(nodeStateAlive, int64(1), big.NewInt(105))` $DIR/common/client/node_selector_total_difficulty_test.go: `node4.On("Order").Maybe().Return(int32(2))` $DIR/common/client/node_selector_total_difficulty_test.go: `.Name()` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(nodeStateOutOfSync, int64(-1), nil)` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(nodeStateAlive, int64(1), big.NewInt(7))` $DIR/common/client/node_selector_total_difficulty_test.go: `.NewInt(7)` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(nodeStateAlive, int64(2), big.NewInt(8))` $DIR/common/client/node_selector_total_difficulty_test.go: `.NewInt(8)` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("Order")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Maybe()` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(int32(1))` $DIR/common/client/node_selector_total_difficulty_test.go: `.Run("stick to the same node", func(t *testing.T) { node := newMockNode[types.ID, Head, nodeClient](t) // fourth node is alive (same as 3rd) node.On("StateAndLatest").Return(nodeStateAlive, int64(2), big.NewInt(8)) node.On("Order").Maybe().Return(int32(1)) nodes = append(nodes, node) selector := newNodeSelector(NodeSelectionModeTotalDifficulty, nodes) assert.Same(t, nodes[2], selector.Select()) })` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(nodeStateAlive, int64(2), big.NewInt(8))` $DIR/common/client/node_selector_total_difficulty_test.go: `.NewInt(8)` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("Order")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Maybe()` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(int32(1))` $DIR/common/client/node_selector_total_difficulty_test.go: `.Run("another best node", func(t *testing.T) { node := newMockNode[types.ID, Head, nodeClient](t) // fifth node is alive (better than 3rd and 4th) node.On("StateAndLatest").Return(nodeStateAlive, int64(3), big.NewInt(11)) node.On("Order").Maybe().Return(int32(1)) nodes = append(nodes, node) selector := newNodeSelector(NodeSelectionModeTotalDifficulty, nodes) assert.Same(t, nodes[4], selector.Select()) })` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(nodeStateAlive, int64(3), big.NewInt(11))` $DIR/common/client/node_selector_total_difficulty_test.go: `.NewInt(11)` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("Order")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Maybe()` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(int32(1))` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(nodeStateAlive, int64(-1), nil)` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("Order")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Maybe()` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(int32(1))` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(nodeStateAlive, int64(-1), nil)` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("Order")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Maybe()` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(int32(1))` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(nodeStateOutOfSync, int64(-1), nil)` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(nodeStateUnreachable, int64(1), big.NewInt(7))` $DIR/common/client/node_selector_total_difficulty_test.go: `.NewInt(7)` $DIR/common/client/node_selector_total_difficulty_test.go: `.Select()` $DIR/common/client/node_selector_total_difficulty_test.go: `.Run("same td and order", func(t *testing.T) { for i := 0; i < 3; i++ { node := newMockNode[types.ID, Head, nodeClient](t) node.On("StateAndLatest").Return(nodeStateAlive, int64(1), big.NewInt(10)) node.On("Order").Return(int32(2)) nodes = append(nodes, node) } selector := newNodeSelector(NodeSelectionModeTotalDifficulty, nodes) //Should select the first node because all things are equal assert.Same(t, nodes[0], selector.Select()) })` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(nodeStateAlive, int64(1), big.NewInt(10))` $DIR/common/client/node_selector_total_difficulty_test.go: `.NewInt(10)` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("Order")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(int32(2))` $DIR/common/client/node_selector_total_difficulty_test.go: `.Run("same td but different order", func(t *testing.T) { node1 := newMockNode[types.ID, Head, nodeClient](t) node1.On("StateAndLatest").Return(nodeStateAlive, int64(3), big.NewInt(10)) node1.On("Order").Return(int32(3)) node2 := newMockNode[types.ID, Head, nodeClient](t) node2.On("StateAndLatest").Return(nodeStateAlive, int64(3), big.NewInt(10)) node2.On("Order").Return(int32(1)) node3 := newMockNode[types.ID, Head, nodeClient](t) node3.On("StateAndLatest").Return(nodeStateAlive, int64(3), big.NewInt(10)) node3.On("Order").Return(int32(2)) nodes := []Node[types.ID, Head, nodeClient]{node1, node2, node3} selector := newNodeSelector(NodeSelectionModeTotalDifficulty, nodes) //Should select the second node as it has the highest priority assert.Same(t, nodes[1], selector.Select()) })` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(nodeStateAlive, int64(3), big.NewInt(10))` $DIR/common/client/node_selector_total_difficulty_test.go: `.NewInt(10)` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("Order")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(int32(3))` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(nodeStateAlive, int64(3), big.NewInt(10))` $DIR/common/client/node_selector_total_difficulty_test.go: `.NewInt(10)` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("Order")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(int32(1))` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(nodeStateAlive, int64(3), big.NewInt(10))` $DIR/common/client/node_selector_total_difficulty_test.go: `.NewInt(10)` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("Order")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(int32(2))` $DIR/common/client/node_selector_total_difficulty_test.go: `.Run("different td but same order", func(t *testing.T) { node1 := newMockNode[types.ID, Head, nodeClient](t) node1.On("StateAndLatest").Return(nodeStateAlive, int64(1), big.NewInt(10)) node1.On("Order").Maybe().Return(int32(3)) node2 := newMockNode[types.ID, Head, nodeClient](t) node2.On("StateAndLatest").Return(nodeStateAlive, int64(1), big.NewInt(11)) node2.On("Order").Maybe().Return(int32(3)) node3 := newMockNode[types.ID, Head, nodeClient](t) node3.On("StateAndLatest").Return(nodeStateAlive, int64(1), big.NewInt(12)) node3.On("Order").Return(int32(3)) nodes := []Node[types.ID, Head, nodeClient]{node1, node2, node3} selector := newNodeSelector(NodeSelectionModeTotalDifficulty, nodes) //Should select the third node as it has the highest td assert.Same(t, nodes[2], selector.Select()) })` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(nodeStateAlive, int64(1), big.NewInt(10))` $DIR/common/client/node_selector_total_difficulty_test.go: `.NewInt(10)` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("Order")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Maybe()` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(int32(3))` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(nodeStateAlive, int64(1), big.NewInt(11))` $DIR/common/client/node_selector_total_difficulty_test.go: `.NewInt(11)` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("Order")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Maybe()` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(int32(3))` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(nodeStateAlive, int64(1), big.NewInt(12))` $DIR/common/client/node_selector_total_difficulty_test.go: `.NewInt(12)` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("Order")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(int32(3))` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(nodeStateAlive, int64(1), big.NewInt(100))` $DIR/common/client/node_selector_total_difficulty_test.go: `.NewInt(100)` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("Order")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Maybe()` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(int32(4))` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(nodeStateAlive, int64(1), big.NewInt(110))` $DIR/common/client/node_selector_total_difficulty_test.go: `.NewInt(110)` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("Order")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Maybe()` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(int32(5))` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(nodeStateAlive, int64(1), big.NewInt(110))` $DIR/common/client/node_selector_total_difficulty_test.go: `.NewInt(110)` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("Order")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Maybe()` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(int32(1))` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("StateAndLatest")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(nodeStateAlive, int64(1), big.NewInt(105))` $DIR/common/client/node_selector_total_difficulty_test.go: `.NewInt(105)` $DIR/common/client/node_selector_total_difficulty_test.go: `.On("Order")` $DIR/common/client/node_selector_total_difficulty_test.go: `.Maybe()` $DIR/common/client/node_selector_total_difficulty_test.go: `.Return(int32(2))` $DIR/common/client/poller_test.go: `t.Run("Test multiple start", func(t *testing.T) { pollFunc := func(ctx context.Context) (Head, error) { return nil, nil } poller, _ := NewPoller[Head](time.Millisecond, pollFunc, time.Second, lggr) err := poller.Start() require.NoError(t, err) err = poller.Start() require.Error(t, err) poller.Unsubscribe() })` $DIR/common/client/poller_test.go: `err = poller.Start()` $DIR/common/client/poller_test.go: `poller.Unsubscribe()` $DIR/common/client/poller_test.go: `t.Run("Test polling for heads", func(t *testing.T) { // Mock polling function that returns a new value every time it's called var pollNumber int pollLock := sync.Mutex{} pollFunc := func(ctx context.Context) (Head, error) { pollLock.Lock() defer pollLock.Unlock() pollNumber++ h := head{ BlockNumber: int64(pollNumber), BlockDifficulty: big.NewInt(int64(pollNumber)), } return h.ToMockHead(t), nil } // Create poller and start to receive data poller, channel := NewPoller[Head](time.Millisecond, pollFunc, time.Second, lggr) require.NoError(t, poller.Start()) defer poller.Unsubscribe() // Receive updates from the poller pollCount := 0 pollMax := 50 for ; pollCount < pollMax; pollCount++ { h := <-channel assert.Equal(t, int64(pollCount+1), h.BlockNumber()) } })` $DIR/common/client/poller_test.go: `pollLock.Lock()` $DIR/common/client/poller_test.go: `pollNumber++` $DIR/common/client/poller_test.go: `t.Run("Test polling errors", func(t *testing.T) { // Mock polling function that returns an error var pollNumber int pollLock := sync.Mutex{} pollFunc := func(ctx context.Context) (Head, error) { pollLock.Lock() defer pollLock.Unlock() pollNumber++ return nil, fmt.Errorf("polling error %d", pollNumber) } olggr, observedLogs := logger.TestObserved(t, zap.WarnLevel) // Create poller and subscribe to receive data poller, _ := NewPoller[Head](time.Millisecond, pollFunc, time.Second, olggr) require.NoError(t, poller.Start()) defer poller.Unsubscribe() // Ensure that all errors were logged as expected logsSeen := func() bool { for pollCount := 0; pollCount < 50; pollCount++ { numLogs := observedLogs.FilterMessage(fmt.Sprintf("polling error: polling error %d", pollCount+1)).Len() if numLogs != 1 { return false } } return true } require.Eventually(t, logsSeen, time.Second, time.Millisecond) })` $DIR/common/client/poller_test.go: `pollLock.Lock()` $DIR/common/client/poller_test.go: `pollNumber++` $DIR/common/client/poller_test.go: `t.Run("Test polling timeout", func(t *testing.T) { pollFunc := func(ctx context.Context) (Head, error) { if <-ctx.Done(); true { return nil, ctx.Err() } return nil, nil } // Set instant timeout pollingTimeout := time.Duration(0) olggr, observedLogs := logger.TestObserved(t, zap.WarnLevel) // Create poller and subscribe to receive data poller, _ := NewPoller[Head](time.Millisecond, pollFunc, pollingTimeout, olggr) require.NoError(t, poller.Start()) defer poller.Unsubscribe() // Ensure that timeout errors were logged as expected logsSeen := func() bool { return observedLogs.FilterMessage("polling error: context deadline exceeded").Len() >= 1 } require.Eventually(t, logsSeen, time.Second, time.Millisecond) })` $DIR/common/client/poller_test.go: `close(wait)` $DIR/common/client/poller_test.go: `<-wait` $DIR/common/client/poller_test.go: `poller.Unsubscribe()` $DIR/common/client/poller_test.go: `t.Run("Test multiple unsubscribe", func(t *testing.T) { poller, channel := NewPoller[Head](time.Millisecond, pollFunc, time.Second, lggr) err := poller.Start() require.NoError(t, err) <-channel poller.Unsubscribe() poller.Unsubscribe() })` $DIR/common/client/poller_test.go: `<-channel` $DIR/common/client/poller_test.go: `poller.Unsubscribe()` $DIR/common/client/poller_test.go: `poller.Unsubscribe()` $DIR/common/client/poller_test.go: `poller.Unsubscribe()` $DIR/common/client/poller_test.go: `.Test(t)` $DIR/common/client/poller_test.go: `.Run("Test multiple start", func(t *testing.T) { pollFunc := func(ctx context.Context) (Head, error) { return nil, nil } poller, _ := NewPoller[Head](time.Millisecond, pollFunc, time.Second, lggr) err := poller.Start() require.NoError(t, err) err = poller.Start() require.Error(t, err) poller.Unsubscribe() })` $DIR/common/client/poller_test.go: `.Start()` $DIR/common/client/poller_test.go: `.Start()` $DIR/common/client/poller_test.go: `.Unsubscribe()` $DIR/common/client/poller_test.go: `.Run("Test polling for heads", func(t *testing.T) { // Mock polling function that returns a new value every time it's called var pollNumber int pollLock := sync.Mutex{} pollFunc := func(ctx context.Context) (Head, error) { pollLock.Lock() defer pollLock.Unlock() pollNumber++ h := head{ BlockNumber: int64(pollNumber), BlockDifficulty: big.NewInt(int64(pollNumber)), } return h.ToMockHead(t), nil } // Create poller and start to receive data poller, channel := NewPoller[Head](time.Millisecond, pollFunc, time.Second, lggr) require.NoError(t, poller.Start()) defer poller.Unsubscribe() // Receive updates from the poller pollCount := 0 pollMax := 50 for ; pollCount < pollMax; pollCount++ { h := <-channel assert.Equal(t, int64(pollCount+1), h.BlockNumber()) } })` $DIR/common/client/poller_test.go: `.Lock()` $DIR/common/client/poller_test.go: `.Unlock()` $DIR/common/client/poller_test.go: `.NewInt(int64(pollNumber))` $DIR/common/client/poller_test.go: `.ToMockHead(t)` $DIR/common/client/poller_test.go: `.Unsubscribe()` $DIR/common/client/poller_test.go: `.Run("Test polling errors", func(t *testing.T) { // Mock polling function that returns an error var pollNumber int pollLock := sync.Mutex{} pollFunc := func(ctx context.Context) (Head, error) { pollLock.Lock() defer pollLock.Unlock() pollNumber++ return nil, fmt.Errorf("polling error %d", pollNumber) } olggr, observedLogs := logger.TestObserved(t, zap.WarnLevel) // Create poller and subscribe to receive data poller, _ := NewPoller[Head](time.Millisecond, pollFunc, time.Second, olggr) require.NoError(t, poller.Start()) defer poller.Unsubscribe() // Ensure that all errors were logged as expected logsSeen := func() bool { for pollCount := 0; pollCount < 50; pollCount++ { numLogs := observedLogs.FilterMessage(fmt.Sprintf("polling error: polling error %d", pollCount+1)).Len() if numLogs != 1 { return false } } return true } require.Eventually(t, logsSeen, time.Second, time.Millisecond) })` $DIR/common/client/poller_test.go: `.Lock()` $DIR/common/client/poller_test.go: `.Unlock()` $DIR/common/client/poller_test.go: `.TestObserved(t, zap.WarnLevel)` $DIR/common/client/poller_test.go: `.Unsubscribe()` $DIR/common/client/poller_test.go: `.FilterMessage(fmt.Sprintf("polling error: polling error %d", pollCount+1))` $DIR/common/client/poller_test.go: `.Sprintf("polling error: polling error %d", pollCount+1)` $DIR/common/client/poller_test.go: `.Len()` $DIR/common/client/poller_test.go: `.Run("Test polling timeout", func(t *testing.T) { pollFunc := func(ctx context.Context) (Head, error) { if <-ctx.Done(); true { return nil, ctx.Err() } return nil, nil } // Set instant timeout pollingTimeout := time.Duration(0) olggr, observedLogs := logger.TestObserved(t, zap.WarnLevel) // Create poller and subscribe to receive data poller, _ := NewPoller[Head](time.Millisecond, pollFunc, pollingTimeout, olggr) require.NoError(t, poller.Start()) defer poller.Unsubscribe() // Ensure that timeout errors were logged as expected logsSeen := func() bool { return observedLogs.FilterMessage("polling error: context deadline exceeded").Len() >= 1 } require.Eventually(t, logsSeen, time.Second, time.Millisecond) })` $DIR/common/client/poller_test.go: `.Done()` $DIR/common/client/poller_test.go: `.Err()` $DIR/common/client/poller_test.go: `.Duration(0)` $DIR/common/client/poller_test.go: `.TestObserved(t, zap.WarnLevel)` $DIR/common/client/poller_test.go: `.Unsubscribe()` $DIR/common/client/poller_test.go: `.FilterMessage("polling error: context deadline exceeded")` $DIR/common/client/poller_test.go: `.Len()` $DIR/common/client/poller_test.go: `.Done()` $DIR/common/client/poller_test.go: `.Err()` $DIR/common/client/poller_test.go: `.TestObserved(t, zap.WarnLevel)` $DIR/common/client/poller_test.go: `.Unsubscribe()` $DIR/common/client/poller_test.go: `.FilterMessage("polling error: context canceled")` $DIR/common/client/poller_test.go: `.Len()` $DIR/common/client/poller_test.go: `.Test(t)` $DIR/common/client/poller_test.go: `.Done()` $DIR/common/client/poller_test.go: `.Err()` $DIR/common/client/poller_test.go: `.NewInt(0)` $DIR/common/client/poller_test.go: `.ToMockHead(t)` $DIR/common/client/poller_test.go: `.Run("Test multiple unsubscribe", func(t *testing.T) { poller, channel := NewPoller[Head](time.Millisecond, pollFunc, time.Second, lggr) err := poller.Start() require.NoError(t, err) <-channel poller.Unsubscribe() poller.Unsubscribe() })` $DIR/common/client/poller_test.go: `.Start()` $DIR/common/client/poller_test.go: `.Unsubscribe()` $DIR/common/client/poller_test.go: `.Unsubscribe()` $DIR/common/client/poller_test.go: `.Start()` $DIR/common/client/poller_test.go: `.Unsubscribe()` $DIR/common/client/send_only_node_test.go: `t.Run("becomes unusable if initial dial fails", func(t *testing.T) { t.Parallel() lggr, observedLogs := logger.TestObserved(t, zap.WarnLevel) client := newMockSendOnlyClient[types.ID](t) client.On("Close").Once() expectedError := errors.New("some http error") client.On("DialHTTP").Return(expectedError).Once() s := NewSendOnlyNode(lggr, url.URL{}, t.Name(), types.RandomID(), client) defer func() { assert.NoError(t, s.Close()) }() err := s.Start(tests.Context(t)) require.NoError(t, err) assert.Equal(t, nodeStateUnusable, s.State()) tests.RequireLogMessage(t, observedLogs, "Dial failed: SendOnly Node is unusable") })` $DIR/common/client/send_only_node_test.go: `client.On("Close").Once()` $DIR/common/client/send_only_node_test.go: `client.On("DialHTTP").Return(expectedError).Once()` $DIR/common/client/send_only_node_test.go: `tests.RequireLogMessage(t, observedLogs, "Dial failed: SendOnly Node is unusable")` $DIR/common/client/send_only_node_test.go: `t.Run("Default ChainID(0) produces warn and skips checks", func(t *testing.T) { t.Parallel() lggr, observedLogs := logger.TestObserved(t, zap.WarnLevel) client := newMockSendOnlyClient[types.ID](t) client.On("Close").Once() client.On("DialHTTP").Return(nil).Once() s := NewSendOnlyNode(lggr, url.URL{}, t.Name(), types.NewIDFromInt(0), client) defer func() { assert.NoError(t, s.Close()) }() err := s.Start(tests.Context(t)) require.NoError(t, err) assert.Equal(t, nodeStateAlive, s.State()) tests.RequireLogMessage(t, observedLogs, "sendonly rpc ChainID verification skipped") })` $DIR/common/client/send_only_node_test.go: `client.On("Close").Once()` $DIR/common/client/send_only_node_test.go: `client.On("DialHTTP").Return(nil).Once()` $DIR/common/client/send_only_node_test.go: `tests.RequireLogMessage(t, observedLogs, "sendonly rpc ChainID verification skipped")` $DIR/common/client/send_only_node_test.go: `t.Run("Can recover from chainID verification failure", func(t *testing.T) { t.Parallel() lggr, observedLogs := logger.TestObserved(t, zap.WarnLevel) client := newMockSendOnlyClient[types.ID](t) client.On("Close").Once() client.On("DialHTTP").Return(nil) expectedError := errors.New("failed to get chain ID") chainID := types.RandomID() const failuresCount = 2 client.On("ChainID", mock.Anything).Return(types.RandomID(), expectedError).Times(failuresCount) client.On("ChainID", mock.Anything).Return(chainID, nil) s := NewSendOnlyNode(lggr, url.URL{}, t.Name(), chainID, client) defer func() { assert.NoError(t, s.Close()) }() err := s.Start(tests.Context(t)) require.NoError(t, err) assert.Equal(t, nodeStateUnreachable, s.State()) tests.AssertLogCountEventually(t, observedLogs, fmt.Sprintf("Verify failed: %v", expectedError), failuresCount) tests.AssertEventually(t, func() bool { return s.State() == nodeStateAlive }) })` $DIR/common/client/send_only_node_test.go: `client.On("Close").Once()` $DIR/common/client/send_only_node_test.go: `client.On("DialHTTP").Return(nil)` $DIR/common/client/send_only_node_test.go: `client.On("ChainID", mock.Anything).Return(types.RandomID(), expectedError).Times(failuresCount)` $DIR/common/client/send_only_node_test.go: `client.On("ChainID", mock.Anything).Return(chainID, nil)` $DIR/common/client/send_only_node_test.go: `tests.AssertLogCountEventually(t, observedLogs, fmt.Sprintf("Verify failed: %v", expectedError), failuresCount)` $DIR/common/client/send_only_node_test.go: `tests.AssertEventually(t, func() bool { return s.State() == nodeStateAlive })` $DIR/common/client/send_only_node_test.go: `t.Run("Can recover from chainID mismatch", func(t *testing.T) { t.Parallel() lggr, observedLogs := logger.TestObserved(t, zap.WarnLevel) client := newMockSendOnlyClient[types.ID](t) client.On("Close").Once() client.On("DialHTTP").Return(nil).Once() configuredChainID := types.NewIDFromInt(11) rpcChainID := types.NewIDFromInt(20) const failuresCount = 2 client.On("ChainID", mock.Anything).Return(rpcChainID, nil).Times(failuresCount) client.On("ChainID", mock.Anything).Return(configuredChainID, nil) s := NewSendOnlyNode(lggr, url.URL{}, t.Name(), configuredChainID, client) defer func() { assert.NoError(t, s.Close()) }() err := s.Start(tests.Context(t)) require.NoError(t, err) assert.Equal(t, nodeStateInvalidChainID, s.State()) tests.AssertLogCountEventually(t, observedLogs, "sendonly rpc ChainID doesn't match local chain ID", failuresCount) tests.AssertEventually(t, func() bool { return s.State() == nodeStateAlive }) })` $DIR/common/client/send_only_node_test.go: `client.On("Close").Once()` $DIR/common/client/send_only_node_test.go: `client.On("DialHTTP").Return(nil).Once()` $DIR/common/client/send_only_node_test.go: `client.On("ChainID", mock.Anything).Return(rpcChainID, nil).Times(failuresCount)` $DIR/common/client/send_only_node_test.go: `client.On("ChainID", mock.Anything).Return(configuredChainID, nil)` $DIR/common/client/send_only_node_test.go: `tests.AssertLogCountEventually(t, observedLogs, "sendonly rpc ChainID doesn't match local chain ID", failuresCount)` $DIR/common/client/send_only_node_test.go: `tests.AssertEventually(t, func() bool { return s.State() == nodeStateAlive })` $DIR/common/client/send_only_node_test.go: `client.On("Close").Once()` $DIR/common/client/send_only_node_test.go: `client.On("DialHTTP").Return(nil).Once()` $DIR/common/client/send_only_node_test.go: `client.On("ChainID", mock.Anything).Return(configuredChainID, nil)` $DIR/common/client/send_only_node_test.go: `tests.AssertEventually(t, func() bool { return s.State() == nodeStateAlive })` $DIR/common/client/send_only_node_test.go: `.Parse(fmt.Sprintf(urlFormat, password))` $DIR/common/client/send_only_node_test.go: `.Sprintf(urlFormat, password)` $DIR/common/client/send_only_node_test.go: `.Sprintf(urlFormat, "xxxxx")` $DIR/common/client/send_only_node_test.go: `.Test(t)` $DIR/common/client/send_only_node_test.go: `.RandomID()` $DIR/common/client/send_only_node_test.go: `.ConfiguredChainID()` $DIR/common/client/send_only_node_test.go: `.Run("becomes unusable if initial dial fails", func(t *testing.T) { t.Parallel() lggr, observedLogs := logger.TestObserved(t, zap.WarnLevel) client := newMockSendOnlyClient[types.ID](t) client.On("Close").Once() expectedError := errors.New("some http error") client.On("DialHTTP").Return(expectedError).Once() s := NewSendOnlyNode(lggr, url.URL{}, t.Name(), types.RandomID(), client) defer func() { assert.NoError(t, s.Close()) }() err := s.Start(tests.Context(t)) require.NoError(t, err) assert.Equal(t, nodeStateUnusable, s.State()) tests.RequireLogMessage(t, observedLogs, "Dial failed: SendOnly Node is unusable") })` $DIR/common/client/send_only_node_test.go: `.TestObserved(t, zap.WarnLevel)` $DIR/common/client/send_only_node_test.go: `.On("Close")` $DIR/common/client/send_only_node_test.go: `.Once()` $DIR/common/client/send_only_node_test.go: `.New("some http error")` $DIR/common/client/send_only_node_test.go: `.On("DialHTTP")` $DIR/common/client/send_only_node_test.go: `.Return(expectedError)` $DIR/common/client/send_only_node_test.go: `.Once()` $DIR/common/client/send_only_node_test.go: `.Name()` $DIR/common/client/send_only_node_test.go: `.RandomID()` $DIR/common/client/send_only_node_test.go: `.Start(tests.Context(t))` $DIR/common/client/send_only_node_test.go: `.Context(t)` $DIR/common/client/send_only_node_test.go: `.RequireLogMessage(t, observedLogs, "Dial failed: SendOnly Node is unusable")` $DIR/common/client/send_only_node_test.go: `.Run("Default ChainID(0) produces warn and skips checks", func(t *testing.T) { t.Parallel() lggr, observedLogs := logger.TestObserved(t, zap.WarnLevel) client := newMockSendOnlyClient[types.ID](t) client.On("Close").Once() client.On("DialHTTP").Return(nil).Once() s := NewSendOnlyNode(lggr, url.URL{}, t.Name(), types.NewIDFromInt(0), client) defer func() { assert.NoError(t, s.Close()) }() err := s.Start(tests.Context(t)) require.NoError(t, err) assert.Equal(t, nodeStateAlive, s.State()) tests.RequireLogMessage(t, observedLogs, "sendonly rpc ChainID verification skipped") })` $DIR/common/client/send_only_node_test.go: `.TestObserved(t, zap.WarnLevel)` $DIR/common/client/send_only_node_test.go: `.On("Close")` $DIR/common/client/send_only_node_test.go: `.Once()` $DIR/common/client/send_only_node_test.go: `.On("DialHTTP")` $DIR/common/client/send_only_node_test.go: `.Return(nil)` $DIR/common/client/send_only_node_test.go: `.Once()` $DIR/common/client/send_only_node_test.go: `.Name()` $DIR/common/client/send_only_node_test.go: `.NewIDFromInt(0)` $DIR/common/client/send_only_node_test.go: `.Start(tests.Context(t))` $DIR/common/client/send_only_node_test.go: `.Context(t)` $DIR/common/client/send_only_node_test.go: `.RequireLogMessage(t, observedLogs, "sendonly rpc ChainID verification skipped")` $DIR/common/client/send_only_node_test.go: `.Run("Can recover from chainID verification failure", func(t *testing.T) { t.Parallel() lggr, observedLogs := logger.TestObserved(t, zap.WarnLevel) client := newMockSendOnlyClient[types.ID](t) client.On("Close").Once() client.On("DialHTTP").Return(nil) expectedError := errors.New("failed to get chain ID") chainID := types.RandomID() const failuresCount = 2 client.On("ChainID", mock.Anything).Return(types.RandomID(), expectedError).Times(failuresCount) client.On("ChainID", mock.Anything).Return(chainID, nil) s := NewSendOnlyNode(lggr, url.URL{}, t.Name(), chainID, client) defer func() { assert.NoError(t, s.Close()) }() err := s.Start(tests.Context(t)) require.NoError(t, err) assert.Equal(t, nodeStateUnreachable, s.State()) tests.AssertLogCountEventually(t, observedLogs, fmt.Sprintf("Verify failed: %v", expectedError), failuresCount) tests.AssertEventually(t, func() bool { return s.State() == nodeStateAlive }) })` $DIR/common/client/send_only_node_test.go: `.TestObserved(t, zap.WarnLevel)` $DIR/common/client/send_only_node_test.go: `.On("Close")` $DIR/common/client/send_only_node_test.go: `.Once()` $DIR/common/client/send_only_node_test.go: `.On("DialHTTP")` $DIR/common/client/send_only_node_test.go: `.Return(nil)` $DIR/common/client/send_only_node_test.go: `.New("failed to get chain ID")` $DIR/common/client/send_only_node_test.go: `.RandomID()` $DIR/common/client/send_only_node_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/send_only_node_test.go: `.Return(types.RandomID(), expectedError)` $DIR/common/client/send_only_node_test.go: `.RandomID()` $DIR/common/client/send_only_node_test.go: `.Times(failuresCount)` $DIR/common/client/send_only_node_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/send_only_node_test.go: `.Return(chainID, nil)` $DIR/common/client/send_only_node_test.go: `.Name()` $DIR/common/client/send_only_node_test.go: `.Start(tests.Context(t))` $DIR/common/client/send_only_node_test.go: `.Context(t)` $DIR/common/client/send_only_node_test.go: `.AssertLogCountEventually(t, observedLogs, fmt.Sprintf("Verify failed: %v", expectedError), failuresCount)` $DIR/common/client/send_only_node_test.go: `.Sprintf("Verify failed: %v", expectedError)` $DIR/common/client/send_only_node_test.go: `.AssertEventually(t, func() bool { return s.State() == nodeStateAlive })` $DIR/common/client/send_only_node_test.go: `.State()` $DIR/common/client/send_only_node_test.go: `.Run("Can recover from chainID mismatch", func(t *testing.T) { t.Parallel() lggr, observedLogs := logger.TestObserved(t, zap.WarnLevel) client := newMockSendOnlyClient[types.ID](t) client.On("Close").Once() client.On("DialHTTP").Return(nil).Once() configuredChainID := types.NewIDFromInt(11) rpcChainID := types.NewIDFromInt(20) const failuresCount = 2 client.On("ChainID", mock.Anything).Return(rpcChainID, nil).Times(failuresCount) client.On("ChainID", mock.Anything).Return(configuredChainID, nil) s := NewSendOnlyNode(lggr, url.URL{}, t.Name(), configuredChainID, client) defer func() { assert.NoError(t, s.Close()) }() err := s.Start(tests.Context(t)) require.NoError(t, err) assert.Equal(t, nodeStateInvalidChainID, s.State()) tests.AssertLogCountEventually(t, observedLogs, "sendonly rpc ChainID doesn't match local chain ID", failuresCount) tests.AssertEventually(t, func() bool { return s.State() == nodeStateAlive }) })` $DIR/common/client/send_only_node_test.go: `.TestObserved(t, zap.WarnLevel)` $DIR/common/client/send_only_node_test.go: `.On("Close")` $DIR/common/client/send_only_node_test.go: `.Once()` $DIR/common/client/send_only_node_test.go: `.On("DialHTTP")` $DIR/common/client/send_only_node_test.go: `.Return(nil)` $DIR/common/client/send_only_node_test.go: `.Once()` $DIR/common/client/send_only_node_test.go: `.NewIDFromInt(11)` $DIR/common/client/send_only_node_test.go: `.NewIDFromInt(20)` $DIR/common/client/send_only_node_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/send_only_node_test.go: `.Return(rpcChainID, nil)` $DIR/common/client/send_only_node_test.go: `.Times(failuresCount)` $DIR/common/client/send_only_node_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/send_only_node_test.go: `.Return(configuredChainID, nil)` $DIR/common/client/send_only_node_test.go: `.Name()` $DIR/common/client/send_only_node_test.go: `.Start(tests.Context(t))` $DIR/common/client/send_only_node_test.go: `.Context(t)` $DIR/common/client/send_only_node_test.go: `.AssertLogCountEventually(t, observedLogs, "sendonly rpc ChainID doesn't match local chain ID", failuresCount)` $DIR/common/client/send_only_node_test.go: `.AssertEventually(t, func() bool { return s.State() == nodeStateAlive })` $DIR/common/client/send_only_node_test.go: `.State()` $DIR/common/client/send_only_node_test.go: `.TestObserved(t, zap.WarnLevel)` $DIR/common/client/send_only_node_test.go: `.On("Close")` $DIR/common/client/send_only_node_test.go: `.Once()` $DIR/common/client/send_only_node_test.go: `.On("DialHTTP")` $DIR/common/client/send_only_node_test.go: `.Return(nil)` $DIR/common/client/send_only_node_test.go: `.Once()` $DIR/common/client/send_only_node_test.go: `.RandomID()` $DIR/common/client/send_only_node_test.go: `.On("ChainID", mock.Anything)` $DIR/common/client/send_only_node_test.go: `.Return(configuredChainID, nil)` $DIR/common/client/send_only_node_test.go: `.Name()` $DIR/common/client/send_only_node_test.go: `.Start(tests.Context(t))` $DIR/common/client/send_only_node_test.go: `.Context(t)` $DIR/common/client/send_only_node_test.go: `.AssertEventually(t, func() bool { return s.State() == nodeStateAlive })` $DIR/common/client/send_only_node_test.go: `.State()` $DIR/common/txmgr/types/tx_test.go: `states = append(states, stateCompare{TxAttemptState(i), v})` $DIR/common/txmgr/types/tx_test.go: `t.Run("NewTxAttemptState", func(t *testing.T) { // string representation addStates := []stateCompare{ {TxAttemptState(0), "invalid_state"}, } allStates := append(states, addStates...) for i := range allStates { s := allStates[i] t.Run(fmt.Sprintf("%s->%d", s.str, s.state), func(t *testing.T) { assert.Equal(t, s.state, NewTxAttemptState(s.str)) }) } })` $DIR/common/txmgr/types/tx_test.go: `t.Run(fmt.Sprintf("%s->%d", s.str, s.state), func(t *testing.T) { assert.Equal(t, s.state, NewTxAttemptState(s.str)) })` $DIR/common/txmgr/types/tx_test.go: `t.Run(fmt.Sprintf("%d->%s", s.state, s.str), func(t *testing.T) { assert.Equal(t, s.str, s.state.String()) })` $DIR/common/txmgr/types/tx_test.go: `.Run("NewTxAttemptState", func(t *testing.T) { // string representation addStates := []stateCompare{ {TxAttemptState(0), "invalid_state"}, } allStates := append(states, addStates...) for i := range allStates { s := allStates[i] t.Run(fmt.Sprintf("%s->%d", s.str, s.state), func(t *testing.T) { assert.Equal(t, s.state, NewTxAttemptState(s.str)) }) } })` $DIR/common/txmgr/types/tx_test.go: `.Run(fmt.Sprintf("%s->%d", s.str, s.state), func(t *testing.T) { assert.Equal(t, s.state, NewTxAttemptState(s.str)) })` $DIR/common/txmgr/types/tx_test.go: `.Sprintf("%s->%d", s.str, s.state)` $DIR/common/txmgr/types/tx_test.go: `.Run(fmt.Sprintf("%d->%s", s.state, s.str), func(t *testing.T) { assert.Equal(t, s.str, s.state.String()) })` $DIR/common/txmgr/types/tx_test.go: `.Sprintf("%d->%s", s.state, s.str)` $DIR/config_docs_test.go: `.GenerateConfig()` $DIR/config_docs_test.go: `.GenerateSecrets()` $DIR/core/bridges/bridge_type_test.go: `t.Run(test.name, func(t *testing.T) { ok, err := bridges.AuthenticateBridgeType(bt, test.token) require.NoError(t, err) if test.wantError { assert.False(t, ok) } else { assert.True(t, ok) } })` $DIR/core/bridges/bridge_type_test.go: `t.Run(tt.name, func(t *testing.T) { got, err := bridges.MarshalBridgeMetaData(tt.latestAnswer, tt.updatedAt) require.NoError(t, err) assert.Equalf(t, tt.want, got, "MarshalBridgeMetaData(%v, %v)", tt.latestAnswer, tt.updatedAt) })` $DIR/core/bridges/bridge_type_test.go: `.Parse("http://example.com/test")` $DIR/core/bridges/bridge_type_test.go: `.MustParseBridgeName("test-bridge-name")` $DIR/core/bridges/bridge_type_test.go: `.WebURL(*u)` $DIR/core/bridges/bridge_type_test.go: `.NewInt(1000)` $DIR/core/bridges/bridge_type_test.go: `.SetID("abc123.,<>/.foobar")` $DIR/core/bridges/bridge_type_test.go: `.NewBridgeType(t, cltest.BridgeOpts{})` $DIR/core/bridges/bridge_type_test.go: `.Run(test.name, func(t *testing.T) { ok, err := bridges.AuthenticateBridgeType(bt, test.token) require.NoError(t, err) if test.wantError { assert.False(t, ok) } else { assert.True(t, ok) } })` $DIR/core/bridges/bridge_type_test.go: `.AuthenticateBridgeType(bt, test.token)` $DIR/core/bridges/bridge_type_test.go: `.Marshal(b)` $DIR/core/bridges/bridge_type_test.go: `.Unmarshal([]byte(`"invalid,.<>/asdf?"`), &b)` $DIR/core/bridges/bridge_type_test.go: `.NewInt(0)` $DIR/core/bridges/bridge_type_test.go: `.NewInt(0)` $DIR/core/bridges/bridge_type_test.go: `.NewInt(1)` $DIR/core/bridges/bridge_type_test.go: `.NewInt(1)` $DIR/core/bridges/bridge_type_test.go: `.NewInt(-100)` $DIR/core/bridges/bridge_type_test.go: `.NewInt(-10)` $DIR/core/bridges/bridge_type_test.go: `.Mul(big.NewInt(math.MaxInt64), big.NewInt(1000))` $DIR/core/bridges/bridge_type_test.go: `.NewInt(math.MaxInt64)` $DIR/core/bridges/bridge_type_test.go: `.NewInt(1000)` $DIR/core/bridges/bridge_type_test.go: `.NewInt(1)` $DIR/core/bridges/bridge_type_test.go: `.Run(tt.name, func(t *testing.T) { got, err := bridges.MarshalBridgeMetaData(tt.latestAnswer, tt.updatedAt) require.NoError(t, err) assert.Equalf(t, tt.want, got, "MarshalBridgeMetaData(%v, %v)", tt.latestAnswer, tt.updatedAt) })` $DIR/core/bridges/bridge_type_test.go: `.MarshalBridgeMetaData(tt.latestAnswer, tt.updatedAt)` $DIR/core/bridges/external_initiator_test.go: `ok, err = bridges.AuthenticateExternalInitiator(eia, &bridges.ExternalInitiator{ Salt: "salt", HashedSecret: hs, })` $DIR/core/bridges/external_initiator_test.go: `.NewToken()` $DIR/core/bridges/external_initiator_test.go: `.WebURL(t, "http://localhost:8888")` $DIR/core/bridges/external_initiator_test.go: `.New()` $DIR/core/bridges/external_initiator_test.go: `.String()` $DIR/core/bridges/external_initiator_test.go: `.NewExternalInitiator(eia, eir)` $DIR/core/bridges/external_initiator_test.go: `.NewToken()` $DIR/core/bridges/external_initiator_test.go: `.AuthenticateExternalInitiator(eia, &bridges.ExternalInitiator{ Salt: "salt", HashedSecret: "secret", })` $DIR/core/bridges/external_initiator_test.go: `.HashedSecret(eia, "salt")` $DIR/core/bridges/external_initiator_test.go: `.AuthenticateExternalInitiator(eia, &bridges.ExternalInitiator{ Salt: "salt", HashedSecret: hs, })` $DIR/core/bridges/orm_test.go: `bts, err = orm.FindBridges(ctx, []bridges.BridgeName{"bridge1"})` $DIR/core/bridges/orm_test.go: `bts, err = orm.FindBridges(ctx, []bridges.BridgeName{"bridge1", "bridgeX"})` $DIR/core/bridges/orm_test.go: `bts, err = orm.FindBridges(ctx, []bridges.BridgeName{"bridgeY", "bridgeX"})` $DIR/core/bridges/orm_test.go: `bts, err = orm.FindBridges(ctx, []bridges.BridgeName{})` $DIR/core/bridges/orm_test.go: `bt.Name = bridges.MustParseBridgeName("solargridreporting")` $DIR/core/bridges/orm_test.go: `bt.URL = cltest.WebURL(t, "https://denergy.eth")` $DIR/core/bridges/orm_test.go: `t.Run(test.description, func(t *testing.T) { tt, err := orm.FindBridge(ctx, test.name) tt.CreatedAt = test.want.CreatedAt tt.UpdatedAt = test.want.UpdatedAt if test.errored { require.Error(t, err) } else { // we can't make any assumptions about the return type if scanning failed require.Equal(t, test.want, tt) } })` $DIR/core/bridges/orm_test.go: `tt.CreatedAt = test.want.CreatedAt` $DIR/core/bridges/orm_test.go: `tt.UpdatedAt = test.want.UpdatedAt` $DIR/core/bridges/orm_test.go: `bs, count, err = orm.BridgeTypes(ctx, 0, 10)` $DIR/core/bridges/orm_test.go: `_, err = orm.GetCachedResponse(ctx, "dot", specID, 1*time.Second)` $DIR/core/bridges/orm_test.go: `err = orm.UpsertBridgeResponse(ctx, "dot", specID, []byte{111, 222, 2})` $DIR/core/bridges/orm_test.go: `_, err = orm.FindExternalInitiator(ctx, token)` $DIR/core/bridges/orm_test.go: `_, err = orm.FindExternalInitiatorByName(ctx, exi.Name)` $DIR/core/bridges/orm_test.go: `err = orm.DeleteExternalInitiator(ctx, exi.Name)` $DIR/core/bridges/orm_test.go: `_, err = orm.FindExternalInitiator(ctx, token)` $DIR/core/bridges/orm_test.go: `_, err = orm.FindExternalInitiatorByName(ctx, exi.Name)` $DIR/core/bridges/orm_test.go: `.WebURL(t, "https://bridge1.com")` $DIR/core/bridges/orm_test.go: `.Context(t)` $DIR/core/bridges/orm_test.go: `.WebURL(t, "https://bridge2.com")` $DIR/core/bridges/orm_test.go: `.FindBridges(ctx, []bridges.BridgeName{"bridge2", "bridge1"})` $DIR/core/bridges/orm_test.go: `.FindBridges(ctx, []bridges.BridgeName{"bridge1"})` $DIR/core/bridges/orm_test.go: `.FindBridges(ctx, []bridges.BridgeName{"bridge1", "bridgeX"})` $DIR/core/bridges/orm_test.go: `.FindBridges(ctx, []bridges.BridgeName{"bridgeY", "bridgeX"})` $DIR/core/bridges/orm_test.go: `.FindBridges(ctx, []bridges.BridgeName{})` $DIR/core/bridges/orm_test.go: `.Context(t)` $DIR/core/bridges/orm_test.go: `.MustParseBridgeName("solargridreporting")` $DIR/core/bridges/orm_test.go: `.WebURL(t, "https://denergy.eth")` $DIR/core/bridges/orm_test.go: `.Run(test.description, func(t *testing.T) { tt, err := orm.FindBridge(ctx, test.name) tt.CreatedAt = test.want.CreatedAt tt.UpdatedAt = test.want.UpdatedAt if test.errored { require.Error(t, err) } else { // we can't make any assumptions about the return type if scanning failed require.Equal(t, test.want, tt) } })` $DIR/core/bridges/orm_test.go: `.FindBridge(ctx, test.name)` $DIR/core/bridges/orm_test.go: `.Context(t)` $DIR/core/bridges/orm_test.go: `.WebURL(t, "http:/oneurl.com")` $DIR/core/bridges/orm_test.go: `.WebURL(t, "http:/updatedurl.com")` $DIR/core/bridges/orm_test.go: `.FindBridge(ctx, "UniqueName")` $DIR/core/bridges/orm_test.go: `.BridgeTypes(ctx, 0, 10)` $DIR/core/bridges/orm_test.go: `.BridgeTypes(ctx, 0, 10)` $DIR/core/bridges/orm_test.go: `.Context(t)` $DIR/core/bridges/orm_test.go: `.NewGeneralConfig(t, nil)` $DIR/core/bridges/orm_test.go: `.NewSqlxDB(t)` $DIR/core/bridges/orm_test.go: `.NewORM(db)` $DIR/core/bridges/orm_test.go: `.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns())` $DIR/core/bridges/orm_test.go: `.TestLogger(t)` $DIR/core/bridges/orm_test.go: `.JobPipeline()` $DIR/core/bridges/orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/bridges/orm_test.go: `.CreateSpec(ctx, pipeline.Pipeline{}, *models.NewInterval(5 * time.Minute))` $DIR/core/bridges/orm_test.go: `.NewInterval(5 * time.Minute)` $DIR/core/bridges/orm_test.go: `.GetCachedResponse(ctx, "dot", specID, 1*time.Second)` $DIR/core/bridges/orm_test.go: `.UpsertBridgeResponse(ctx, "dot", specID, []byte{111, 222, 2})` $DIR/core/bridges/orm_test.go: `.GetCachedResponse(ctx, "dot", specID, 1*time.Second)` $DIR/core/bridges/orm_test.go: `.Context(t)` $DIR/core/bridges/orm_test.go: `.NewToken()` $DIR/core/bridges/orm_test.go: `.New()` $DIR/core/bridges/orm_test.go: `.String()` $DIR/core/bridges/orm_test.go: `.NewExternalInitiator(token, &req)` $DIR/core/bridges/orm_test.go: `.NewExternalInitiator(token, &req)` $DIR/core/bridges/orm_test.go: `.Context(t)` $DIR/core/bridges/orm_test.go: `.NewToken()` $DIR/core/bridges/orm_test.go: `.New()` $DIR/core/bridges/orm_test.go: `.String()` $DIR/core/bridges/orm_test.go: `.NewExternalInitiator(token, &req)` $DIR/core/bridges/orm_test.go: `.FindExternalInitiator(ctx, token)` $DIR/core/bridges/orm_test.go: `.FindExternalInitiatorByName(ctx, exi.Name)` $DIR/core/bridges/orm_test.go: `.DeleteExternalInitiator(ctx, exi.Name)` $DIR/core/bridges/orm_test.go: `.FindExternalInitiator(ctx, token)` $DIR/core/bridges/orm_test.go: `.FindExternalInitiatorByName(ctx, exi.Name)` $DIR/core/bridges/orm_test.go: `.CreateExternalInitiator(ctx, exi)` $DIR/core/capabilities/registry_test.go: `err = r.Add(ctx, c)` $DIR/core/capabilities/registry_test.go: `err = r.Add(ctx, c)` $DIR/core/capabilities/registry_test.go: `ci, err = capabilities.NewCapabilityInfo( id, capabilities.CapabilityTypeConsensus, "capability-2-description", )` $DIR/core/capabilities/registry_test.go: `err = r.Add(ctx, c2)` $DIR/core/capabilities/registry_test.go: `t.Run(tc.name, func(t *testing.T) { id, err := tc.newCapability(ctx, reg) require.NoError(t, err) err = tc.getCapability(ctx, reg, id) require.NoError(t, err) })` $DIR/core/capabilities/registry_test.go: `err = tc.getCapability(ctx, reg, id)` $DIR/core/capabilities/registry_test.go: `.Context(t)` $DIR/core/capabilities/registry_test.go: `.NewRegistry(logger.TestLogger(t))` $DIR/core/capabilities/registry_test.go: `.TestLogger(t)` $DIR/core/capabilities/registry_test.go: `.NewCapabilityInfo( id, capabilities.CapabilityTypeAction, "capability-1-description", )` $DIR/core/capabilities/registry_test.go: `.Add(ctx, c)` $DIR/core/capabilities/registry_test.go: `.Get(ctx, id)` $DIR/core/capabilities/registry_test.go: `.List(ctx)` $DIR/core/capabilities/registry_test.go: `.Context(t)` $DIR/core/capabilities/registry_test.go: `.NewRegistry(logger.TestLogger(t))` $DIR/core/capabilities/registry_test.go: `.TestLogger(t)` $DIR/core/capabilities/registry_test.go: `.NewCapabilityInfo( id, capabilities.CapabilityTypeAction, "capability-1-description", )` $DIR/core/capabilities/registry_test.go: `.Add(ctx, c)` $DIR/core/capabilities/registry_test.go: `.NewCapabilityInfo( id, capabilities.CapabilityTypeConsensus, "capability-2-description", )` $DIR/core/capabilities/registry_test.go: `.Add(ctx, c2)` $DIR/core/capabilities/registry_test.go: `.Sprintf("%s@%s", uuid.New().String(), "1.0.0")` $DIR/core/capabilities/registry_test.go: `.New()` $DIR/core/capabilities/registry_test.go: `.String()` $DIR/core/capabilities/registry_test.go: `.NewCapabilityInfo( id, capabilities.CapabilityTypeAction, "capability-1-description", )` $DIR/core/capabilities/registry_test.go: `.Add(ctx, c)` $DIR/core/capabilities/registry_test.go: `.GetAction(ctx, id)` $DIR/core/capabilities/registry_test.go: `.Sprintf("%s@%s", uuid.New().String(), "1.0.0")` $DIR/core/capabilities/registry_test.go: `.New()` $DIR/core/capabilities/registry_test.go: `.String()` $DIR/core/capabilities/registry_test.go: `.NewCapabilityInfo( id, capabilities.CapabilityTypeTarget, "capability-1-description", )` $DIR/core/capabilities/registry_test.go: `.Add(ctx, c)` $DIR/core/capabilities/registry_test.go: `.GetTarget(ctx, id)` $DIR/core/capabilities/registry_test.go: `.NewOnDemand(logger.TestLogger(t))` $DIR/core/capabilities/registry_test.go: `.TestLogger(t)` $DIR/core/capabilities/registry_test.go: `.Info(ctx)` $DIR/core/capabilities/registry_test.go: `.Add(ctx, odt)` $DIR/core/capabilities/registry_test.go: `.GetTrigger(ctx, id)` $DIR/core/capabilities/registry_test.go: `.Sprintf("%s@%s", uuid.New().String(), "1.0.0")` $DIR/core/capabilities/registry_test.go: `.New()` $DIR/core/capabilities/registry_test.go: `.String()` $DIR/core/capabilities/registry_test.go: `.NewCapabilityInfo( id, capabilities.CapabilityTypeConsensus, "capability-1-description", )` $DIR/core/capabilities/registry_test.go: `.Add(ctx, c)` $DIR/core/capabilities/registry_test.go: `.GetConsensus(ctx, id)` $DIR/core/capabilities/registry_test.go: `.Context(t)` $DIR/core/capabilities/registry_test.go: `.NewRegistry(logger.TestLogger(t))` $DIR/core/capabilities/registry_test.go: `.TestLogger(t)` $DIR/core/capabilities/registry_test.go: `.Run(tc.name, func(t *testing.T) { id, err := tc.newCapability(ctx, reg) require.NoError(t, err) err = tc.getCapability(ctx, reg, id) require.NoError(t, err) })` $DIR/core/capabilities/registry_test.go: `.newCapability(ctx, reg)` $DIR/core/capabilities/registry_test.go: `.getCapability(ctx, reg, id)` $DIR/core/capabilities/remote/dispatcher_test.go: `peer.On("Receive", mock.Anything).Return(recvCh)` $DIR/core/capabilities/remote/dispatcher_test.go: `peer.On("ID", mock.Anything).Return(p2ptypes.PeerID{})` $DIR/core/capabilities/remote/dispatcher_test.go: `wrapper.On("GetPeer").Return(peer)` $DIR/core/capabilities/remote/dispatcher_test.go: `peer.On("Receive", mock.Anything).Return((<-chan p2ptypes.Message)(recvCh))` $DIR/core/capabilities/remote/dispatcher_test.go: `peer.On("ID", mock.Anything).Return(peerId2)` $DIR/core/capabilities/remote/dispatcher_test.go: `wrapper.On("GetPeer").Return(peer)` $DIR/core/capabilities/remote/dispatcher_test.go: `signer.On("Sign", mock.Anything).Return(nil, errors.New("not implemented"))` $DIR/core/capabilities/remote/dispatcher_test.go: `recvCh <- encodeAndSign(t, privKey1, peerId1, peerId2, capId1, donId1, []byte(payload1))` $DIR/core/capabilities/remote/dispatcher_test.go: `recvCh <- encodeAndSign(t, privKey1, peerId1, peerId2, capId2, donId1, []byte(payload1))` $DIR/core/capabilities/remote/dispatcher_test.go: `invalid.Sender = peerId2` $DIR/core/capabilities/remote/dispatcher_test.go: `recvCh <- invalid` $DIR/core/capabilities/remote/dispatcher_test.go: `recvCh <- encodeAndSign(t, privKey1, peerId1, peerId2, capId1, donId1, []byte(payload2))` $DIR/core/capabilities/remote/dispatcher_test.go: `m = <-rcv.ch` $DIR/core/capabilities/remote/dispatcher_test.go: `dispatcher.RemoveReceiver(capId1, donId1)` $DIR/core/capabilities/remote/dispatcher_test.go: `peer.On("Receive", mock.Anything).Return((<-chan p2ptypes.Message)(recvCh))` $DIR/core/capabilities/remote/dispatcher_test.go: `peer.On("ID", mock.Anything).Return(peerId2)` $DIR/core/capabilities/remote/dispatcher_test.go: `peer.On("Send", mock.Anything, mock.Anything).Run(func(args mock.Arguments) { peerID := args.Get(0).(p2ptypes.PeerID) sendCh <- peerID }).Return(nil)` $DIR/core/capabilities/remote/dispatcher_test.go: `sendCh <- peerID` $DIR/core/capabilities/remote/dispatcher_test.go: `wrapper.On("GetPeer").Return(peer)` $DIR/core/capabilities/remote/dispatcher_test.go: `signer.On("Sign", mock.Anything).Return([]byte{}, nil)` $DIR/core/capabilities/remote/dispatcher_test.go: `recvCh <- encodeAndSign(t, privKey1, peerId1, peerId2, capId1, donId1, []byte(payload1))` $DIR/core/capabilities/remote/dispatcher_test.go: `.TestLogger(t)` $DIR/core/capabilities/remote/dispatcher_test.go: `.Context(t)` $DIR/core/capabilities/remote/dispatcher_test.go: `.NewPeer(t)` $DIR/core/capabilities/remote/dispatcher_test.go: `.On("Receive", mock.Anything)` $DIR/core/capabilities/remote/dispatcher_test.go: `.Return(recvCh)` $DIR/core/capabilities/remote/dispatcher_test.go: `.On("ID", mock.Anything)` $DIR/core/capabilities/remote/dispatcher_test.go: `.Return(p2ptypes.PeerID{})` $DIR/core/capabilities/remote/dispatcher_test.go: `.NewPeerWrapper(t)` $DIR/core/capabilities/remote/dispatcher_test.go: `.On("GetPeer")` $DIR/core/capabilities/remote/dispatcher_test.go: `.Return(peer)` $DIR/core/capabilities/remote/dispatcher_test.go: `.NewSigner(t)` $DIR/core/capabilities/remote/dispatcher_test.go: `.NewCapabilitiesRegistry(t)` $DIR/core/capabilities/remote/dispatcher_test.go: `.NewDispatcher(wrapper, signer, registry, lggr)` $DIR/core/capabilities/remote/dispatcher_test.go: `.TestLogger(t)` $DIR/core/capabilities/remote/dispatcher_test.go: `.Context(t)` $DIR/core/capabilities/remote/dispatcher_test.go: `.NewPeer(t)` $DIR/core/capabilities/remote/dispatcher_test.go: `.On("Receive", mock.Anything)` $DIR/core/capabilities/remote/dispatcher_test.go: `.Return((<-chan p2ptypes.Message)(recvCh))` $DIR/core/capabilities/remote/dispatcher_test.go: `.On("ID", mock.Anything)` $DIR/core/capabilities/remote/dispatcher_test.go: `.Return(peerId2)` $DIR/core/capabilities/remote/dispatcher_test.go: `.NewPeerWrapper(t)` $DIR/core/capabilities/remote/dispatcher_test.go: `.On("GetPeer")` $DIR/core/capabilities/remote/dispatcher_test.go: `.Return(peer)` $DIR/core/capabilities/remote/dispatcher_test.go: `.NewSigner(t)` $DIR/core/capabilities/remote/dispatcher_test.go: `.On("Sign", mock.Anything)` $DIR/core/capabilities/remote/dispatcher_test.go: `.Return(nil, errors.New("not implemented"))` $DIR/core/capabilities/remote/dispatcher_test.go: `.New("not implemented")` $DIR/core/capabilities/remote/dispatcher_test.go: `.NewCapabilitiesRegistry(t)` $DIR/core/capabilities/remote/dispatcher_test.go: `.NewDispatcher(wrapper, signer, registry, lggr)` $DIR/core/capabilities/remote/dispatcher_test.go: `.SetReceiver(capId1, donId1, rcv)` $DIR/core/capabilities/remote/dispatcher_test.go: `.RemoveReceiver(capId1, donId1)` $DIR/core/capabilities/remote/dispatcher_test.go: `.TestLogger(t)` $DIR/core/capabilities/remote/dispatcher_test.go: `.Context(t)` $DIR/core/capabilities/remote/dispatcher_test.go: `.NewPeer(t)` $DIR/core/capabilities/remote/dispatcher_test.go: `.On("Receive", mock.Anything)` $DIR/core/capabilities/remote/dispatcher_test.go: `.Return((<-chan p2ptypes.Message)(recvCh))` $DIR/core/capabilities/remote/dispatcher_test.go: `.On("ID", mock.Anything)` $DIR/core/capabilities/remote/dispatcher_test.go: `.Return(peerId2)` $DIR/core/capabilities/remote/dispatcher_test.go: `.On("Send", mock.Anything, mock.Anything)` $DIR/core/capabilities/remote/dispatcher_test.go: `.Run(func(args mock.Arguments) { peerID := args.Get(0).(p2ptypes.PeerID) sendCh <- peerID })` $DIR/core/capabilities/remote/dispatcher_test.go: `.Get(0)` $DIR/core/capabilities/remote/dispatcher_test.go: `.Return(nil)` $DIR/core/capabilities/remote/dispatcher_test.go: `.NewPeerWrapper(t)` $DIR/core/capabilities/remote/dispatcher_test.go: `.On("GetPeer")` $DIR/core/capabilities/remote/dispatcher_test.go: `.Return(peer)` $DIR/core/capabilities/remote/dispatcher_test.go: `.NewSigner(t)` $DIR/core/capabilities/remote/dispatcher_test.go: `.On("Sign", mock.Anything)` $DIR/core/capabilities/remote/dispatcher_test.go: `.Return([]byte{}, nil)` $DIR/core/capabilities/remote/dispatcher_test.go: `.NewCapabilitiesRegistry(t)` $DIR/core/capabilities/remote/dispatcher_test.go: `.NewDispatcher(wrapper, signer, registry, lggr)` $DIR/core/capabilities/remote/message_cache_test.go: `ts = cache.Insert(eventId1, peerId2, 200, []byte(payloadA))` $DIR/core/capabilities/remote/message_cache_test.go: `ready, _ = cache.Ready(eventId1, 2, 150, true)` $DIR/core/capabilities/remote/message_cache_test.go: `ready, _ = cache.Ready(eventId1, 2, 100, true)` $DIR/core/capabilities/remote/message_cache_test.go: `ts = cache.Insert(eventId2, peerId2, 200, []byte(payloadA))` $DIR/core/capabilities/remote/message_cache_test.go: `deleted = cache.DeleteOlderThan(150)` $DIR/core/capabilities/remote/message_cache_test.go: `deleted = cache.DeleteOlderThan(201)` $DIR/core/capabilities/remote/message_cache_test.go: `.NewMessageCache[string, string]()` $DIR/core/capabilities/remote/message_cache_test.go: `.Insert(eventId1, peerId1, 100, []byte(payloadA))` $DIR/core/capabilities/remote/message_cache_test.go: `.Ready(eventId1, 2, 100, true)` $DIR/core/capabilities/remote/message_cache_test.go: `.Insert(eventId1, peerId2, 200, []byte(payloadA))` $DIR/core/capabilities/remote/message_cache_test.go: `.Ready(eventId1, 2, 150, true)` $DIR/core/capabilities/remote/message_cache_test.go: `.Ready(eventId1, 2, 100, true)` $DIR/core/capabilities/remote/message_cache_test.go: `.Ready(eventId1, 2, 100, true)` $DIR/core/capabilities/remote/message_cache_test.go: `.NewMessageCache[string, string]()` $DIR/core/capabilities/remote/message_cache_test.go: `.Insert(eventId1, peerId1, 100, []byte(payloadA))` $DIR/core/capabilities/remote/message_cache_test.go: `.Insert(eventId2, peerId2, 200, []byte(payloadA))` $DIR/core/capabilities/remote/message_cache_test.go: `.DeleteOlderThan(150)` $DIR/core/capabilities/remote/message_cache_test.go: `.DeleteOlderThan(150)` $DIR/core/capabilities/remote/message_cache_test.go: `.DeleteOlderThan(201)` $DIR/core/capabilities/remote/target/client_test.go: `testClient(ctx, t, 1, responseTimeOut, 1, 0, capability, transmissionSchedule, responseTest)` $DIR/core/capabilities/remote/target/client_test.go: `testClient(ctx, t, 10, responseTimeOut, 1, 0, capability, transmissionSchedule, responseTest)` $DIR/core/capabilities/remote/target/client_test.go: `testClient(ctx, t, 1, responseTimeOut, 10, 3, capability, transmissionSchedule, responseTest)` $DIR/core/capabilities/remote/target/client_test.go: `testClient(ctx, t, 10, responseTimeOut, 10, 3, capability, transmissionSchedule, responseTest)` $DIR/core/capabilities/remote/target/client_test.go: `testClient(ctx, t, 1, responseTimeOut, 1, 0, capability, transmissionSchedule, responseTest)` $DIR/core/capabilities/remote/target/client_test.go: `testClient(ctx, t, 10, responseTimeOut, 10, 3, capability, transmissionSchedule, responseTest)` $DIR/core/capabilities/remote/target/client_test.go: `transmissionSchedule, err = values.NewMap(map[string]any{ "schedule": transmission.Schedule_AllAtOnce, "deltaStage": "10ms", })` $DIR/core/capabilities/remote/target/client_test.go: `testClient(ctx, t, 1, responseTimeOut, 1, 0, capability, transmissionSchedule, responseTest)` $DIR/core/capabilities/remote/target/client_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/capabilities/remote/target/client_test.go: `.Context(t)` $DIR/core/capabilities/remote/target/client_test.go: `.NewMap(map[string]any{ "schedule": transmission.Schedule_OneAtATime, "deltaStage": "10ms", })` $DIR/core/capabilities/remote/target/client_test.go: `.Value.Unwrap()` $DIR/core/capabilities/remote/target/client_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/capabilities/remote/target/client_test.go: `.Context(t)` $DIR/core/capabilities/remote/target/client_test.go: `.Value.Unwrap()` $DIR/core/capabilities/remote/target/client_test.go: `.NewMap(map[string]any{ "schedule": transmission.Schedule_OneAtATime, "deltaStage": "10ms", })` $DIR/core/capabilities/remote/target/client_test.go: `.NewMap(map[string]any{ "schedule": transmission.Schedule_AllAtOnce, "deltaStage": "10ms", })` $DIR/core/capabilities/remote/target/client_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/capabilities/remote/target/client_test.go: `.Context(t)` $DIR/core/capabilities/remote/target/client_test.go: `.NewMap(map[string]any{ "schedule": transmission.Schedule_AllAtOnce, "deltaStage": "10ms", })` $DIR/core/capabilities/remote/target/endtoend_test.go: `testRemoteTarget(ctx, t, capability, 10, 9, timeOut, 10, 9, timeOut, transmissionSchedule, responseTest)` $DIR/core/capabilities/remote/target/endtoend_test.go: `transmissionSchedule, err = values.NewMap(map[string]any{ "schedule": transmission.Schedule_AllAtOnce, "deltaStage": "10ms", })` $DIR/core/capabilities/remote/target/endtoend_test.go: `testRemoteTarget(ctx, t, capability, 1, 0, timeOut, 1, 0, timeOut, transmissionSchedule, responseTest)` $DIR/core/capabilities/remote/target/endtoend_test.go: `testRemoteTarget(ctx, t, capability, 4, 3, timeOut, 1, 0, timeOut, transmissionSchedule, responseTest)` $DIR/core/capabilities/remote/target/endtoend_test.go: `testRemoteTarget(ctx, t, capability, 10, 3, timeOut, 1, 0, timeOut, transmissionSchedule, responseTest)` $DIR/core/capabilities/remote/target/endtoend_test.go: `testRemoteTarget(ctx, t, capability, 1, 0, timeOut, 1, 0, timeOut, transmissionSchedule, responseTest)` $DIR/core/capabilities/remote/target/endtoend_test.go: `testRemoteTarget(ctx, t, capability, 1, 0, timeOut, 4, 3, timeOut, transmissionSchedule, responseTest)` $DIR/core/capabilities/remote/target/endtoend_test.go: `testRemoteTarget(ctx, t, capability, 1, 0, timeOut, 10, 3, timeOut, transmissionSchedule, responseTest)` $DIR/core/capabilities/remote/target/endtoend_test.go: `testRemoteTarget(ctx, t, capability, 4, 3, timeOut, 4, 3, timeOut, transmissionSchedule, responseTest)` $DIR/core/capabilities/remote/target/endtoend_test.go: `testRemoteTarget(ctx, t, capability, 10, 3, timeOut, 10, 3, timeOut, transmissionSchedule, responseTest)` $DIR/core/capabilities/remote/target/endtoend_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/capabilities/remote/target/endtoend_test.go: `.Context(t)` $DIR/core/capabilities/remote/target/endtoend_test.go: `.NewMap(map[string]any{ "schedule": transmission.Schedule_AllAtOnce, "deltaStage": "10ms", })` $DIR/core/capabilities/remote/target/endtoend_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/capabilities/remote/target/endtoend_test.go: `.Context(t)` $DIR/core/capabilities/remote/target/endtoend_test.go: `.NewMap(map[string]any{ "schedule": transmission.Schedule_AllAtOnce, "deltaStage": "10ms", })` $DIR/core/capabilities/remote/target/endtoend_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/capabilities/remote/target/endtoend_test.go: `.Context(t)` $DIR/core/capabilities/remote/target/endtoend_test.go: `.Value.Unwrap()` $DIR/core/capabilities/remote/target/endtoend_test.go: `.NewMap(map[string]any{ "schedule": transmission.Schedule_OneAtATime, "deltaStage": "10ms", })` $DIR/core/capabilities/remote/target/endtoend_test.go: `.NewMap(map[string]any{ "schedule": transmission.Schedule_AllAtOnce, "deltaStage": "10ms", })` $DIR/core/capabilities/remote/target/endtoend_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/capabilities/remote/target/endtoend_test.go: `.Context(t)` $DIR/core/capabilities/remote/target/endtoend_test.go: `.Value.Unwrap()` $DIR/core/capabilities/remote/target/endtoend_test.go: `.NewMap(map[string]any{ "schedule": transmission.Schedule_OneAtATime, "deltaStage": "10ms", })` $DIR/core/capabilities/remote/target/endtoend_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/capabilities/remote/target/endtoend_test.go: `.Context(t)` $DIR/core/capabilities/remote/target/endtoend_test.go: `.NewMap(map[string]any{ "schedule": transmission.Schedule_AllAtOnce, "deltaStage": "10ms", })` $DIR/core/capabilities/remote/target/endtoend_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/capabilities/remote/target/endtoend_test.go: `.Context(t)` $DIR/core/capabilities/remote/target/endtoend_test.go: `.NewMap(map[string]any{ "schedule": transmission.Schedule_AllAtOnce, "deltaStage": "10ms", })` $DIR/core/capabilities/remote/target/request/client_request_test.go: `capabilityPeers[i] = NewP2PPeerID(t)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `workflowPeers[i] = NewP2PPeerID(t)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `t.Run("Send second message with different response", func(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() dispatcher := &clientRequestTestDispatcher{msgs: make(chan *types.MessageBody, 100)} request, err := request.NewClientRequest(ctx, lggr, capabilityRequest, messageID, capInfo, workflowDonInfo, dispatcher, 10*time.Minute) require.NoError(t, err) capabilityResponse2 := commoncap.CapabilityResponse{ Value: values.NewString("response2"), Err: nil, } rawResponse2, err := pb.MarshalCapabilityResponse(capabilityResponse2) require.NoError(t, err) msg2 := &types.MessageBody{ CapabilityId: capInfo.ID, CapabilityDonId: capDonInfo.ID, CallerDonId: workflowDonInfo.ID, Method: types.MethodExecute, Payload: rawResponse2, MessageId: []byte("messageID"), } msg.Sender = capabilityPeers[0][:] err = request.OnMessage(ctx, msg) require.NoError(t, err) msg2.Sender = capabilityPeers[1][:] err = request.OnMessage(ctx, msg2) require.NoError(t, err) select { case <-request.ResponseChan(): t.Fatal("expected no response") default: } })` $DIR/core/capabilities/remote/target/request/client_request_test.go: `msg.Sender = capabilityPeers[0][:]` $DIR/core/capabilities/remote/target/request/client_request_test.go: `err = request.OnMessage(ctx, msg)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `msg2.Sender = capabilityPeers[1][:]` $DIR/core/capabilities/remote/target/request/client_request_test.go: `err = request.OnMessage(ctx, msg2)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `t.Run("Send second message from non calling Don peer", func(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() dispatcher := &clientRequestTestDispatcher{msgs: make(chan *types.MessageBody, 100)} request, err := request.NewClientRequest(ctx, lggr, capabilityRequest, messageID, capInfo, workflowDonInfo, dispatcher, 10*time.Minute) require.NoError(t, err) msg.Sender = capabilityPeers[0][:] err = request.OnMessage(ctx, msg) require.NoError(t, err) nonDonPeer := NewP2PPeerID(t) msg.Sender = nonDonPeer[:] err = request.OnMessage(ctx, msg) require.NotNil(t, err) select { case <-request.ResponseChan(): t.Fatal("expected no response") default: } })` $DIR/core/capabilities/remote/target/request/client_request_test.go: `msg.Sender = capabilityPeers[0][:]` $DIR/core/capabilities/remote/target/request/client_request_test.go: `err = request.OnMessage(ctx, msg)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `msg.Sender = nonDonPeer[:]` $DIR/core/capabilities/remote/target/request/client_request_test.go: `err = request.OnMessage(ctx, msg)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `t.Run("Send second message from same peer as first message", func(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() dispatcher := &clientRequestTestDispatcher{msgs: make(chan *types.MessageBody, 100)} request, err := request.NewClientRequest(ctx, lggr, capabilityRequest, messageID, capInfo, workflowDonInfo, dispatcher, 10*time.Minute) require.NoError(t, err) msg.Sender = capabilityPeers[0][:] err = request.OnMessage(ctx, msg) require.NoError(t, err) err = request.OnMessage(ctx, msg) require.NotNil(t, err) select { case <-request.ResponseChan(): t.Fatal("expected no response") default: } })` $DIR/core/capabilities/remote/target/request/client_request_test.go: `msg.Sender = capabilityPeers[0][:]` $DIR/core/capabilities/remote/target/request/client_request_test.go: `err = request.OnMessage(ctx, msg)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `err = request.OnMessage(ctx, msg)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `t.Run("Send second message with same error as first", func(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() dispatcher := &clientRequestTestDispatcher{msgs: make(chan *types.MessageBody, 100)} request, err := request.NewClientRequest(ctx, lggr, capabilityRequest, messageID, capInfo, workflowDonInfo, dispatcher, 10*time.Minute) require.NoError(t, err) <-dispatcher.msgs <-dispatcher.msgs assert.Equal(t, 0, len(dispatcher.msgs)) msgWithError := &types.MessageBody{ CapabilityId: capInfo.ID, CapabilityDonId: capDonInfo.ID, CallerDonId: workflowDonInfo.ID, Method: types.MethodExecute, Payload: rawResponse, MessageId: []byte("messageID"), Error: types.Error_INTERNAL_ERROR, ErrorMsg: "an error", } msgWithError.Sender = capabilityPeers[0][:] err = request.OnMessage(ctx, msgWithError) require.NoError(t, err) msgWithError.Sender = capabilityPeers[1][:] err = request.OnMessage(ctx, msgWithError) require.NoError(t, err) response := <-request.ResponseChan() assert.Equal(t, "an error", response.Err.Error()) })` $DIR/core/capabilities/remote/target/request/client_request_test.go: `<-dispatcher.msgs` $DIR/core/capabilities/remote/target/request/client_request_test.go: `<-dispatcher.msgs` $DIR/core/capabilities/remote/target/request/client_request_test.go: `msgWithError.Sender = capabilityPeers[0][:]` $DIR/core/capabilities/remote/target/request/client_request_test.go: `err = request.OnMessage(ctx, msgWithError)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `msgWithError.Sender = capabilityPeers[1][:]` $DIR/core/capabilities/remote/target/request/client_request_test.go: `err = request.OnMessage(ctx, msgWithError)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `t.Run("Send second message with different error to first", func(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() dispatcher := &clientRequestTestDispatcher{msgs: make(chan *types.MessageBody, 100)} request, err := request.NewClientRequest(ctx, lggr, capabilityRequest, messageID, capInfo, workflowDonInfo, dispatcher, 10*time.Minute) require.NoError(t, err) <-dispatcher.msgs <-dispatcher.msgs assert.Equal(t, 0, len(dispatcher.msgs)) msgWithError := &types.MessageBody{ CapabilityId: capInfo.ID, CapabilityDonId: capDonInfo.ID, CallerDonId: workflowDonInfo.ID, Method: types.MethodExecute, Payload: rawResponse, MessageId: []byte("messageID"), Error: types.Error_INTERNAL_ERROR, ErrorMsg: "an error", Sender: capabilityPeers[0][:], } msgWithError2 := &types.MessageBody{ CapabilityId: capInfo.ID, CapabilityDonId: capDonInfo.ID, CallerDonId: workflowDonInfo.ID, Method: types.MethodExecute, Payload: rawResponse, MessageId: []byte("messageID"), Error: types.Error_INTERNAL_ERROR, ErrorMsg: "an error2", Sender: capabilityPeers[1][:], } err = request.OnMessage(ctx, msgWithError) require.NoError(t, err) err = request.OnMessage(ctx, msgWithError2) require.NoError(t, err) select { case <-request.ResponseChan(): t.Fatal("expected no response") default: } })` $DIR/core/capabilities/remote/target/request/client_request_test.go: `<-dispatcher.msgs` $DIR/core/capabilities/remote/target/request/client_request_test.go: `<-dispatcher.msgs` $DIR/core/capabilities/remote/target/request/client_request_test.go: `err = request.OnMessage(ctx, msgWithError)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `err = request.OnMessage(ctx, msgWithError2)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `<-dispatcher.msgs` $DIR/core/capabilities/remote/target/request/client_request_test.go: `<-dispatcher.msgs` $DIR/core/capabilities/remote/target/request/client_request_test.go: `msg.Sender = capabilityPeers[0][:]` $DIR/core/capabilities/remote/target/request/client_request_test.go: `err = request.OnMessage(ctx, msg)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `msg.Sender = capabilityPeers[1][:]` $DIR/core/capabilities/remote/target/request/client_request_test.go: `err = request.OnMessage(ctx, msg)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.TestLogger(t)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.NewMap( map[string]any{ "executeValue1": "aValue1", }, )` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.NewMap(map[string]any{ "schedule": transmission.Schedule_OneAtATime, "deltaStage": "1000ms", })` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.NewString("response1")` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.MarshalCapabilityResponse(capabilityResponse)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.GetMessageIDForRequest(capabilityRequest)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.Run("Send second message with different response", func(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() dispatcher := &clientRequestTestDispatcher{msgs: make(chan *types.MessageBody, 100)} request, err := request.NewClientRequest(ctx, lggr, capabilityRequest, messageID, capInfo, workflowDonInfo, dispatcher, 10*time.Minute) require.NoError(t, err) capabilityResponse2 := commoncap.CapabilityResponse{ Value: values.NewString("response2"), Err: nil, } rawResponse2, err := pb.MarshalCapabilityResponse(capabilityResponse2) require.NoError(t, err) msg2 := &types.MessageBody{ CapabilityId: capInfo.ID, CapabilityDonId: capDonInfo.ID, CallerDonId: workflowDonInfo.ID, Method: types.MethodExecute, Payload: rawResponse2, MessageId: []byte("messageID"), } msg.Sender = capabilityPeers[0][:] err = request.OnMessage(ctx, msg) require.NoError(t, err) msg2.Sender = capabilityPeers[1][:] err = request.OnMessage(ctx, msg2) require.NoError(t, err) select { case <-request.ResponseChan(): t.Fatal("expected no response") default: } })` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.WithCancel(context.Background())` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.Background()` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.NewClientRequest(ctx, lggr, capabilityRequest, messageID, capInfo, workflowDonInfo, dispatcher, 10*time.Minute)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.NewString("response2")` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.MarshalCapabilityResponse(capabilityResponse2)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.OnMessage(ctx, msg)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.OnMessage(ctx, msg2)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.ResponseChan()` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.Run("Send second message from non calling Don peer", func(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() dispatcher := &clientRequestTestDispatcher{msgs: make(chan *types.MessageBody, 100)} request, err := request.NewClientRequest(ctx, lggr, capabilityRequest, messageID, capInfo, workflowDonInfo, dispatcher, 10*time.Minute) require.NoError(t, err) msg.Sender = capabilityPeers[0][:] err = request.OnMessage(ctx, msg) require.NoError(t, err) nonDonPeer := NewP2PPeerID(t) msg.Sender = nonDonPeer[:] err = request.OnMessage(ctx, msg) require.NotNil(t, err) select { case <-request.ResponseChan(): t.Fatal("expected no response") default: } })` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.WithCancel(context.Background())` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.Background()` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.NewClientRequest(ctx, lggr, capabilityRequest, messageID, capInfo, workflowDonInfo, dispatcher, 10*time.Minute)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.OnMessage(ctx, msg)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.OnMessage(ctx, msg)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.ResponseChan()` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.Run("Send second message from same peer as first message", func(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() dispatcher := &clientRequestTestDispatcher{msgs: make(chan *types.MessageBody, 100)} request, err := request.NewClientRequest(ctx, lggr, capabilityRequest, messageID, capInfo, workflowDonInfo, dispatcher, 10*time.Minute) require.NoError(t, err) msg.Sender = capabilityPeers[0][:] err = request.OnMessage(ctx, msg) require.NoError(t, err) err = request.OnMessage(ctx, msg) require.NotNil(t, err) select { case <-request.ResponseChan(): t.Fatal("expected no response") default: } })` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.WithCancel(context.Background())` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.Background()` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.NewClientRequest(ctx, lggr, capabilityRequest, messageID, capInfo, workflowDonInfo, dispatcher, 10*time.Minute)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.OnMessage(ctx, msg)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.OnMessage(ctx, msg)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.ResponseChan()` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.Run("Send second message with same error as first", func(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() dispatcher := &clientRequestTestDispatcher{msgs: make(chan *types.MessageBody, 100)} request, err := request.NewClientRequest(ctx, lggr, capabilityRequest, messageID, capInfo, workflowDonInfo, dispatcher, 10*time.Minute) require.NoError(t, err) <-dispatcher.msgs <-dispatcher.msgs assert.Equal(t, 0, len(dispatcher.msgs)) msgWithError := &types.MessageBody{ CapabilityId: capInfo.ID, CapabilityDonId: capDonInfo.ID, CallerDonId: workflowDonInfo.ID, Method: types.MethodExecute, Payload: rawResponse, MessageId: []byte("messageID"), Error: types.Error_INTERNAL_ERROR, ErrorMsg: "an error", } msgWithError.Sender = capabilityPeers[0][:] err = request.OnMessage(ctx, msgWithError) require.NoError(t, err) msgWithError.Sender = capabilityPeers[1][:] err = request.OnMessage(ctx, msgWithError) require.NoError(t, err) response := <-request.ResponseChan() assert.Equal(t, "an error", response.Err.Error()) })` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.WithCancel(context.Background())` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.Background()` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.NewClientRequest(ctx, lggr, capabilityRequest, messageID, capInfo, workflowDonInfo, dispatcher, 10*time.Minute)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.OnMessage(ctx, msgWithError)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.OnMessage(ctx, msgWithError)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.ResponseChan()` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.Run("Send second message with different error to first", func(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() dispatcher := &clientRequestTestDispatcher{msgs: make(chan *types.MessageBody, 100)} request, err := request.NewClientRequest(ctx, lggr, capabilityRequest, messageID, capInfo, workflowDonInfo, dispatcher, 10*time.Minute) require.NoError(t, err) <-dispatcher.msgs <-dispatcher.msgs assert.Equal(t, 0, len(dispatcher.msgs)) msgWithError := &types.MessageBody{ CapabilityId: capInfo.ID, CapabilityDonId: capDonInfo.ID, CallerDonId: workflowDonInfo.ID, Method: types.MethodExecute, Payload: rawResponse, MessageId: []byte("messageID"), Error: types.Error_INTERNAL_ERROR, ErrorMsg: "an error", Sender: capabilityPeers[0][:], } msgWithError2 := &types.MessageBody{ CapabilityId: capInfo.ID, CapabilityDonId: capDonInfo.ID, CallerDonId: workflowDonInfo.ID, Method: types.MethodExecute, Payload: rawResponse, MessageId: []byte("messageID"), Error: types.Error_INTERNAL_ERROR, ErrorMsg: "an error2", Sender: capabilityPeers[1][:], } err = request.OnMessage(ctx, msgWithError) require.NoError(t, err) err = request.OnMessage(ctx, msgWithError2) require.NoError(t, err) select { case <-request.ResponseChan(): t.Fatal("expected no response") default: } })` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.WithCancel(context.Background())` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.Background()` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.NewClientRequest(ctx, lggr, capabilityRequest, messageID, capInfo, workflowDonInfo, dispatcher, 10*time.Minute)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.OnMessage(ctx, msgWithError)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.OnMessage(ctx, msgWithError2)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.ResponseChan()` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.WithCancel(context.Background())` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.Background()` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.NewClientRequest(ctx, lggr, capabilityRequest, messageID, capInfo, workflowDonInfo, dispatcher, 10*time.Minute)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.OnMessage(ctx, msg)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.OnMessage(ctx, msg)` $DIR/core/capabilities/remote/target/request/client_request_test.go: `.ResponseChan()` $DIR/core/capabilities/remote/target/request/server_request_test.go: `workflowPeers[i] = NewP2PPeerID(t)` $DIR/core/capabilities/remote/target/request/server_request_test.go: `t.Run("Send duplicate message", func(t *testing.T) { req := request.NewServerRequest(capability, "capabilityID", "capabilityDonID", capabilityPeerID, callingDon, "requestMessageID", dispatcher, 10*time.Minute, lggr) err := sendValidRequest(req, workflowPeers, capabilityPeerID, rawRequest) require.NoError(t, err) err = sendValidRequest(req, workflowPeers, capabilityPeerID, rawRequest) assert.NotNil(t, err) })` $DIR/core/capabilities/remote/target/request/server_request_test.go: `err = sendValidRequest(req, workflowPeers, capabilityPeerID, rawRequest)` $DIR/core/capabilities/remote/target/request/server_request_test.go: `t.Run("Send message with non calling don peer", func(t *testing.T) { req := request.NewServerRequest(capability, "capabilityID", "capabilityDonID", capabilityPeerID, callingDon, "requestMessageID", dispatcher, 10*time.Minute, lggr) err := sendValidRequest(req, workflowPeers, capabilityPeerID, rawRequest) require.NoError(t, err) nonDonPeer := NewP2PPeerID(t) err = req.OnMessage(context.Background(), &types.MessageBody{ Version: 0, Sender: nonDonPeer[:], Receiver: capabilityPeerID[:], MessageId: []byte("workflowID" + "workflowExecutionID"), CapabilityId: "capabilityID", CapabilityDonId: "capabilityDonID", CallerDonId: "workflow-don", Method: types.MethodExecute, Payload: rawRequest, }) assert.NotNil(t, err) })` $DIR/core/capabilities/remote/target/request/server_request_test.go: `err = req.OnMessage(context.Background(), &types.MessageBody{ Version: 0, Sender: nonDonPeer[:], Receiver: capabilityPeerID[:], MessageId: []byte("workflowID" + "workflowExecutionID"), CapabilityId: "capabilityID", CapabilityDonId: "capabilityDonID", CallerDonId: "workflow-don", Method: types.MethodExecute, Payload: rawRequest, })` $DIR/core/capabilities/remote/target/request/server_request_test.go: `t.Run("Send message invalid payload", func(t *testing.T) { req := request.NewServerRequest(capability, "capabilityID", "capabilityDonID", capabilityPeerID, callingDon, "requestMessageID", dispatcher, 10*time.Minute, lggr) err := sendValidRequest(req, workflowPeers, capabilityPeerID, rawRequest) require.NoError(t, err) err = req.OnMessage(context.Background(), &types.MessageBody{ Version: 0, Sender: workflowPeers[1][:], Receiver: capabilityPeerID[:], MessageId: []byte("workflowID" + "workflowExecutionID"), CapabilityId: "capabilityID", CapabilityDonId: "capabilityDonID", CallerDonId: "workflow-don", Method: types.MethodExecute, Payload: append(rawRequest, []byte("asdf")...), }) assert.NoError(t, err) assert.Equal(t, 2, len(dispatcher.msgs)) assert.Equal(t, dispatcher.msgs[0].Error, types.Error_INTERNAL_ERROR) assert.Equal(t, dispatcher.msgs[1].Error, types.Error_INTERNAL_ERROR) })` $DIR/core/capabilities/remote/target/request/server_request_test.go: `err = req.OnMessage(context.Background(), &types.MessageBody{ Version: 0, Sender: workflowPeers[1][:], Receiver: capabilityPeerID[:], MessageId: []byte("workflowID" + "workflowExecutionID"), CapabilityId: "capabilityID", CapabilityDonId: "capabilityDonID", CallerDonId: "workflow-don", Method: types.MethodExecute, Payload: append(rawRequest, []byte("asdf")...), })` $DIR/core/capabilities/remote/target/request/server_request_test.go: `t.Run("Send second valid request when capability errors", func(t *testing.T) { dispatcher := &testDispatcher{} req := request.NewServerRequest(TestErrorCapability{}, "capabilityID", "capabilityDonID", capabilityPeerID, callingDon, "requestMessageID", dispatcher, 10*time.Minute, lggr) err := sendValidRequest(req, workflowPeers, capabilityPeerID, rawRequest) require.NoError(t, err) err = req.OnMessage(context.Background(), &types.MessageBody{ Version: 0, Sender: workflowPeers[1][:], Receiver: capabilityPeerID[:], MessageId: []byte("workflowID" + "workflowExecutionID"), CapabilityId: "capabilityID", CapabilityDonId: "capabilityDonID", CallerDonId: "workflow-don", Method: types.MethodExecute, Payload: rawRequest, }) assert.NoError(t, err) assert.Equal(t, 2, len(dispatcher.msgs)) assert.Equal(t, dispatcher.msgs[0].Error, types.Error_INTERNAL_ERROR) assert.Equal(t, dispatcher.msgs[0].ErrorMsg, "failed to execute capability: an error") assert.Equal(t, dispatcher.msgs[1].Error, types.Error_INTERNAL_ERROR) assert.Equal(t, dispatcher.msgs[1].ErrorMsg, "failed to execute capability: an error") })` $DIR/core/capabilities/remote/target/request/server_request_test.go: `err = req.OnMessage(context.Background(), &types.MessageBody{ Version: 0, Sender: workflowPeers[1][:], Receiver: capabilityPeerID[:], MessageId: []byte("workflowID" + "workflowExecutionID"), CapabilityId: "capabilityID", CapabilityDonId: "capabilityDonID", CallerDonId: "workflow-don", Method: types.MethodExecute, Payload: rawRequest, })` $DIR/core/capabilities/remote/target/request/server_request_test.go: `err = request.OnMessage(context.Background(), &types.MessageBody{ Version: 0, Sender: workflowPeers[1][:], Receiver: capabilityPeerID[:], MessageId: []byte("workflowID" + "workflowExecutionID"), CapabilityId: "capabilityID", CapabilityDonId: "capabilityDonID", CallerDonId: "workflow-don", Method: types.MethodExecute, Payload: rawRequest, })` $DIR/core/capabilities/remote/target/request/server_request_test.go: `.TestLogger(t)` $DIR/core/capabilities/remote/target/request/server_request_test.go: `.NewMap( map[string]any{ "executeValue1": "aValue1", }, )` $DIR/core/capabilities/remote/target/request/server_request_test.go: `.MarshalCapabilityRequest(capabilityRequest)` $DIR/core/capabilities/remote/target/request/server_request_test.go: `.Run("Send duplicate message", func(t *testing.T) { req := request.NewServerRequest(capability, "capabilityID", "capabilityDonID", capabilityPeerID, callingDon, "requestMessageID", dispatcher, 10*time.Minute, lggr) err := sendValidRequest(req, workflowPeers, capabilityPeerID, rawRequest) require.NoError(t, err) err = sendValidRequest(req, workflowPeers, capabilityPeerID, rawRequest) assert.NotNil(t, err) })` $DIR/core/capabilities/remote/target/request/server_request_test.go: `.NewServerRequest(capability, "capabilityID", "capabilityDonID", capabilityPeerID, callingDon, "requestMessageID", dispatcher, 10*time.Minute, lggr)` $DIR/core/capabilities/remote/target/request/server_request_test.go: `.Run("Send message with non calling don peer", func(t *testing.T) { req := request.NewServerRequest(capability, "capabilityID", "capabilityDonID", capabilityPeerID, callingDon, "requestMessageID", dispatcher, 10*time.Minute, lggr) err := sendValidRequest(req, workflowPeers, capabilityPeerID, rawRequest) require.NoError(t, err) nonDonPeer := NewP2PPeerID(t) err = req.OnMessage(context.Background(), &types.MessageBody{ Version: 0, Sender: nonDonPeer[:], Receiver: capabilityPeerID[:], MessageId: []byte("workflowID" + "workflowExecutionID"), CapabilityId: "capabilityID", CapabilityDonId: "capabilityDonID", CallerDonId: "workflow-don", Method: types.MethodExecute, Payload: rawRequest, }) assert.NotNil(t, err) })` $DIR/core/capabilities/remote/target/request/server_request_test.go: `.NewServerRequest(capability, "capabilityID", "capabilityDonID", capabilityPeerID, callingDon, "requestMessageID", dispatcher, 10*time.Minute, lggr)` $DIR/core/capabilities/remote/target/request/server_request_test.go: `.OnMessage(context.Background(), &types.MessageBody{ Version: 0, Sender: nonDonPeer[:], Receiver: capabilityPeerID[:], MessageId: []byte("workflowID" + "workflowExecutionID"), CapabilityId: "capabilityID", CapabilityDonId: "capabilityDonID", CallerDonId: "workflow-don", Method: types.MethodExecute, Payload: rawRequest, })` $DIR/core/capabilities/remote/target/request/server_request_test.go: `.Background()` $DIR/core/capabilities/remote/target/request/server_request_test.go: `.Run("Send message invalid payload", func(t *testing.T) { req := request.NewServerRequest(capability, "capabilityID", "capabilityDonID", capabilityPeerID, callingDon, "requestMessageID", dispatcher, 10*time.Minute, lggr) err := sendValidRequest(req, workflowPeers, capabilityPeerID, rawRequest) require.NoError(t, err) err = req.OnMessage(context.Background(), &types.MessageBody{ Version: 0, Sender: workflowPeers[1][:], Receiver: capabilityPeerID[:], MessageId: []byte("workflowID" + "workflowExecutionID"), CapabilityId: "capabilityID", CapabilityDonId: "capabilityDonID", CallerDonId: "workflow-don", Method: types.MethodExecute, Payload: append(rawRequest, []byte("asdf")...), }) assert.NoError(t, err) assert.Equal(t, 2, len(dispatcher.msgs)) assert.Equal(t, dispatcher.msgs[0].Error, types.Error_INTERNAL_ERROR) assert.Equal(t, dispatcher.msgs[1].Error, types.Error_INTERNAL_ERROR) })` $DIR/core/capabilities/remote/target/request/server_request_test.go: `.NewServerRequest(capability, "capabilityID", "capabilityDonID", capabilityPeerID, callingDon, "requestMessageID", dispatcher, 10*time.Minute, lggr)` $DIR/core/capabilities/remote/target/request/server_request_test.go: `.OnMessage(context.Background(), &types.MessageBody{ Version: 0, Sender: workflowPeers[1][:], Receiver: capabilityPeerID[:], MessageId: []byte("workflowID" + "workflowExecutionID"), CapabilityId: "capabilityID", CapabilityDonId: "capabilityDonID", CallerDonId: "workflow-don", Method: types.MethodExecute, Payload: append(rawRequest, []byte("asdf")...), })` $DIR/core/capabilities/remote/target/request/server_request_test.go: `.Background()` $DIR/core/capabilities/remote/target/request/server_request_test.go: `.Run("Send second valid request when capability errors", func(t *testing.T) { dispatcher := &testDispatcher{} req := request.NewServerRequest(TestErrorCapability{}, "capabilityID", "capabilityDonID", capabilityPeerID, callingDon, "requestMessageID", dispatcher, 10*time.Minute, lggr) err := sendValidRequest(req, workflowPeers, capabilityPeerID, rawRequest) require.NoError(t, err) err = req.OnMessage(context.Background(), &types.MessageBody{ Version: 0, Sender: workflowPeers[1][:], Receiver: capabilityPeerID[:], MessageId: []byte("workflowID" + "workflowExecutionID"), CapabilityId: "capabilityID", CapabilityDonId: "capabilityDonID", CallerDonId: "workflow-don", Method: types.MethodExecute, Payload: rawRequest, }) assert.NoError(t, err) assert.Equal(t, 2, len(dispatcher.msgs)) assert.Equal(t, dispatcher.msgs[0].Error, types.Error_INTERNAL_ERROR) assert.Equal(t, dispatcher.msgs[0].ErrorMsg, "failed to execute capability: an error") assert.Equal(t, dispatcher.msgs[1].Error, types.Error_INTERNAL_ERROR) assert.Equal(t, dispatcher.msgs[1].ErrorMsg, "failed to execute capability: an error") })` $DIR/core/capabilities/remote/target/request/server_request_test.go: `.NewServerRequest(TestErrorCapability{}, "capabilityID", "capabilityDonID", capabilityPeerID, callingDon, "requestMessageID", dispatcher, 10*time.Minute, lggr)` $DIR/core/capabilities/remote/target/request/server_request_test.go: `.OnMessage(context.Background(), &types.MessageBody{ Version: 0, Sender: workflowPeers[1][:], Receiver: capabilityPeerID[:], MessageId: []byte("workflowID" + "workflowExecutionID"), CapabilityId: "capabilityID", CapabilityDonId: "capabilityDonID", CallerDonId: "workflow-don", Method: types.MethodExecute, Payload: rawRequest, })` $DIR/core/capabilities/remote/target/request/server_request_test.go: `.Background()` $DIR/core/capabilities/remote/target/request/server_request_test.go: `.NewServerRequest(capability, "capabilityID", "capabilityDonID", capabilityPeerID, callingDon, "requestMessageID", dispatcher, 10*time.Minute, lggr)` $DIR/core/capabilities/remote/target/request/server_request_test.go: `.OnMessage(context.Background(), &types.MessageBody{ Version: 0, Sender: workflowPeers[1][:], Receiver: capabilityPeerID[:], MessageId: []byte("workflowID" + "workflowExecutionID"), CapabilityId: "capabilityID", CapabilityDonId: "capabilityDonID", CallerDonId: "workflow-don", Method: types.MethodExecute, Payload: rawRequest, })` $DIR/core/capabilities/remote/target/request/server_request_test.go: `.Background()` $DIR/core/capabilities/remote/target/server_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/capabilities/remote/target/server_test.go: `.Context(t)` $DIR/core/capabilities/remote/target/server_test.go: `.Execute(context.Background(), commoncap.CapabilityRequest{ Metadata: commoncap.RequestMetadata{ WorkflowID: "workflowID", WorkflowExecutionID: "workflowExecutionID", }, })` $DIR/core/capabilities/remote/target/server_test.go: `.Background()` $DIR/core/capabilities/remote/target/server_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/capabilities/remote/target/server_test.go: `.Context(t)` $DIR/core/capabilities/remote/target/server_test.go: `.Execute(context.Background(), commoncap.CapabilityRequest{ Metadata: commoncap.RequestMetadata{ WorkflowID: "workflowID", WorkflowExecutionID: "workflowExecutionID", }, })` $DIR/core/capabilities/remote/target/server_test.go: `.Background()` $DIR/core/capabilities/remote/target/server_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/capabilities/remote/target/server_test.go: `.Context(t)` $DIR/core/capabilities/remote/target/server_test.go: `.Execute(context.Background(), commoncap.CapabilityRequest{ Metadata: commoncap.RequestMetadata{ WorkflowID: "workflowID", WorkflowExecutionID: "workflowExecutionID", }, })` $DIR/core/capabilities/remote/target/server_test.go: `.Background()` $DIR/core/capabilities/remote/trigger_publisher_test.go: `publisher.Receive(regEvent)` $DIR/core/capabilities/remote/trigger_publisher_test.go: `.TestLogger(t)` $DIR/core/capabilities/remote/trigger_publisher_test.go: `.Context(t)` $DIR/core/capabilities/remote/trigger_publisher_test.go: `.NewDispatcher(t)` $DIR/core/capabilities/remote/trigger_publisher_test.go: `.NewTriggerPublisher(config, underlying, capInfo, capDonInfo, workflowDONs, dispatcher, lggr)` $DIR/core/capabilities/remote/trigger_publisher_test.go: `.MarshalCapabilityRequest(capRequest)` $DIR/core/capabilities/remote/trigger_publisher_test.go: `.Receive(regEvent)` $DIR/core/capabilities/remote/trigger_subscriber_test.go: `dispatcher.On("Send", mock.Anything, mock.Anything).Return(nil).Run(func(args mock.Arguments) { select { case awaitRegistrationMessageCh <- struct{}{}: default: } })` $DIR/core/capabilities/remote/trigger_subscriber_test.go: `select { case awaitRegistrationMessageCh <- struct{}{}: default: }` $DIR/core/capabilities/remote/trigger_subscriber_test.go: `<-awaitRegistrationMessageCh` $DIR/core/capabilities/remote/trigger_subscriber_test.go: `subscriber.Receive(triggerEvent)` $DIR/core/capabilities/remote/trigger_subscriber_test.go: `.TestLogger(t)` $DIR/core/capabilities/remote/trigger_subscriber_test.go: `.Context(t)` $DIR/core/capabilities/remote/trigger_subscriber_test.go: `.NewDispatcher(t)` $DIR/core/capabilities/remote/trigger_subscriber_test.go: `.On("Send", mock.Anything, mock.Anything)` $DIR/core/capabilities/remote/trigger_subscriber_test.go: `.Return(nil)` $DIR/core/capabilities/remote/trigger_subscriber_test.go: `.Run(func(args mock.Arguments) { select { case awaitRegistrationMessageCh <- struct{}{}: default: } })` $DIR/core/capabilities/remote/trigger_subscriber_test.go: `.NewTriggerSubscriber(config, capInfo, capDonInfo, workflowDonInfo, dispatcher, nil, lggr)` $DIR/core/capabilities/remote/trigger_subscriber_test.go: `.RegisterTrigger(ctx, req)` $DIR/core/capabilities/remote/trigger_subscriber_test.go: `.Wrap(triggerEvent1)` $DIR/core/capabilities/remote/trigger_subscriber_test.go: `.MarshalCapabilityResponse(capResponse)` $DIR/core/capabilities/remote/trigger_subscriber_test.go: `.Receive(triggerEvent)` $DIR/core/capabilities/remote/utils_test.go: `p2pMsg = encodeAndSign(t, privKey1, peerId1, peerId2, capId1, donId1, []byte(payload1))` $DIR/core/capabilities/remote/utils_test.go: `p2pMsg.Sender = peerId2` $DIR/core/capabilities/remote/utils_test.go: `_, err = remote.ValidateMessage(p2pMsg, peerId2)` $DIR/core/capabilities/remote/utils_test.go: `p2pMsg = encodeAndSign(t, privKey1, peerId1, peerId2, capId1, donId1, []byte(payload1))` $DIR/core/capabilities/remote/utils_test.go: `_, err = remote.ValidateMessage(p2pMsg, peerId1)` $DIR/core/capabilities/remote/utils_test.go: `_, err = agg.Aggregate("", [][]byte{marshaled1})` $DIR/core/capabilities/remote/utils_test.go: `_, err = agg.Aggregate("", [][]byte{marshaled1, marshaled2})` $DIR/core/capabilities/remote/utils_test.go: `.ValidateMessage(p2pMsg, peerId2)` $DIR/core/capabilities/remote/utils_test.go: `.ValidateMessage(p2pMsg, peerId2)` $DIR/core/capabilities/remote/utils_test.go: `.ValidateMessage(p2pMsg, peerId1)` $DIR/core/capabilities/remote/utils_test.go: `.ToPeerID([]byte("12345678901234567890123456789012"))` $DIR/core/capabilities/remote/utils_test.go: `.String()` $DIR/core/capabilities/remote/utils_test.go: `.Wrap(triggerEvent1)` $DIR/core/capabilities/remote/utils_test.go: `.MarshalCapabilityResponse(capResponse1)` $DIR/core/capabilities/remote/utils_test.go: `.Wrap(triggerEvent2)` $DIR/core/capabilities/remote/utils_test.go: `.MarshalCapabilityResponse(capResponse2)` $DIR/core/capabilities/remote/utils_test.go: `.NewDefaultModeAggregator(2)` $DIR/core/capabilities/remote/utils_test.go: `.Aggregate("", [][]byte{marshaled1})` $DIR/core/capabilities/remote/utils_test.go: `.Aggregate("", [][]byte{marshaled1, marshaled2})` $DIR/core/capabilities/remote/utils_test.go: `.Aggregate("", [][]byte{marshaled1, marshaled2, marshaled1})` $DIR/core/capabilities/streams/codec_test.go: `_, err = codec.UnwrapValid(values.NewBool(true), nil, 0)` $DIR/core/capabilities/streams/codec_test.go: `_, err = codec.UnwrapValid(wrapped, nil, 1)` $DIR/core/capabilities/streams/codec_test.go: `.NewCodec(logger.TestLogger(t))` $DIR/core/capabilities/streams/codec_test.go: `.TestLogger(t)` $DIR/core/capabilities/streams/codec_test.go: `.NewInt(1)` $DIR/core/capabilities/streams/codec_test.go: `.NewInt(2)` $DIR/core/capabilities/streams/codec_test.go: `.New(chaintype.EVM)` $DIR/core/capabilities/streams/codec_test.go: `.New(chaintype.EVM)` $DIR/core/capabilities/streams/codec_test.go: `.Sign(reportCtx, report1)` $DIR/core/capabilities/streams/codec_test.go: `.Sign(reportCtx, report2)` $DIR/core/capabilities/streams/codec_test.go: `.Sign(reportCtx, report1)` $DIR/core/capabilities/streams/codec_test.go: `.Sign(reportCtx, report2)` $DIR/core/capabilities/streams/codec_test.go: `.PublicKey()` $DIR/core/capabilities/streams/codec_test.go: `.PublicKey()` $DIR/core/capabilities/streams/codec_test.go: `.Wrap([]datastreams.FeedReport{ { FeedID: id1Str, FullReport: report1, ReportContext: rawCtx, Signatures: [][]byte{signatureK1R1, signatureK2R1}, }, { FeedID: id2Str, FullReport: report2, ReportContext: rawCtx, Signatures: [][]byte{signatureK1R2, signatureK2R2}, }, })` $DIR/core/capabilities/streams/codec_test.go: `.UnwrapValid(values.NewBool(true), nil, 0)` $DIR/core/capabilities/streams/codec_test.go: `.NewBool(true)` $DIR/core/capabilities/streams/codec_test.go: `.UnwrapValid(wrapped, nil, 1)` $DIR/core/capabilities/streams/codec_test.go: `.UnwrapValid(wrapped, allowedSigners, 2)` $DIR/core/capabilities/syncer_test.go: `peer.On("UpdateConnections", mock.Anything).Return(nil)` $DIR/core/capabilities/syncer_test.go: `peer.On("ID").Return(pid)` $DIR/core/capabilities/syncer_test.go: `wrapper.On("GetPeer").Return(peer)` $DIR/core/capabilities/syncer_test.go: `registry.On("Add", mock.Anything, mock.Anything).Return(nil)` $DIR/core/capabilities/syncer_test.go: `dispatcher.On("SetReceiver", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/capabilities/syncer_test.go: `.TestLogger(t)` $DIR/core/capabilities/syncer_test.go: `.Context(t)` $DIR/core/capabilities/syncer_test.go: `.UnmarshalText([]byte("12D3KooWBCF1XT5Wi8FzfgNCqRL76Swv8TRU3TiD4QiJm8NMNX7N"))` $DIR/core/capabilities/syncer_test.go: `.NewPeer(t)` $DIR/core/capabilities/syncer_test.go: `.On("UpdateConnections", mock.Anything)` $DIR/core/capabilities/syncer_test.go: `.Return(nil)` $DIR/core/capabilities/syncer_test.go: `.On("ID")` $DIR/core/capabilities/syncer_test.go: `.Return(pid)` $DIR/core/capabilities/syncer_test.go: `.NewPeerWrapper(t)` $DIR/core/capabilities/syncer_test.go: `.On("GetPeer")` $DIR/core/capabilities/syncer_test.go: `.Return(peer)` $DIR/core/capabilities/syncer_test.go: `.NewCapabilitiesRegistry(t)` $DIR/core/capabilities/syncer_test.go: `.On("Add", mock.Anything, mock.Anything)` $DIR/core/capabilities/syncer_test.go: `.Return(nil)` $DIR/core/capabilities/syncer_test.go: `.NewDispatcher(t)` $DIR/core/capabilities/syncer_test.go: `.On("SetReceiver", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/capabilities/syncer_test.go: `.Return(nil)` $DIR/core/capabilities/syncer_test.go: `.NewHardcodedDonNetworkSetup()` $DIR/core/capabilities/syncer_test.go: `.NewRegistrySyncer(wrapper, registry, dispatcher, lggr, networkSetup)` $DIR/core/capabilities/targets/write_target_test.go: `cr.On("GetLatestValue", mock.Anything, "forwarder", "getTransmitter", mock.Anything, mock.Anything).Return(nil).Run(func(args mock.Arguments) { transmitter := args.Get(4).(*common.Address) *transmitter = common.HexToAddress("0x0") }).Once()` $DIR/core/capabilities/targets/write_target_test.go: `*transmitter = common.HexToAddress("0x0")` $DIR/core/capabilities/targets/write_target_test.go: `cw.On("SubmitTransaction", mock.Anything, "forwarder", "report", mock.Anything, mock.Anything, forwarderAddr, mock.Anything, mock.Anything).Return(nil).Once()` $DIR/core/capabilities/targets/write_target_test.go: `t.Run("succeeds with valid report", func(t *testing.T) { req := capabilities.CapabilityRequest{ Metadata: capabilities.RequestMetadata{ WorkflowID: "test-id", }, Config: config, Inputs: validInputs, } ch, err2 := writeTarget.Execute(ctx, req) require.NoError(t, err2) response := <-ch require.NotNil(t, response) })` $DIR/core/capabilities/targets/write_target_test.go: `t.Run("succeeds with empty report", func(t *testing.T) { emptyInputs, err2 := values.NewMap(map[string]any{ "signed_report": map[string]any{ "report": []byte{}, }, "signatures": [][]byte{}, }) require.NoError(t, err2) req := capabilities.CapabilityRequest{ Metadata: capabilities.RequestMetadata{ WorkflowExecutionID: "test-id", }, Config: config, Inputs: emptyInputs, } ch, err2 := writeTarget.Execute(ctx, req) require.NoError(t, err2) response := <-ch require.Nil(t, response.Value) })` $DIR/core/capabilities/targets/write_target_test.go: `t.Run("fails when ChainReader's GetLatestValue returns error", func(t *testing.T) { req := capabilities.CapabilityRequest{ Metadata: capabilities.RequestMetadata{ WorkflowID: "test-id", }, Config: config, Inputs: validInputs, } cr.On("GetLatestValue", mock.Anything, "forwarder", "getTransmitter", mock.Anything, mock.Anything).Return(errors.New("reader error")) _, err = writeTarget.Execute(ctx, req) require.Error(t, err) })` $DIR/core/capabilities/targets/write_target_test.go: `cr.On("GetLatestValue", mock.Anything, "forwarder", "getTransmitter", mock.Anything, mock.Anything).Return(errors.New("reader error"))` $DIR/core/capabilities/targets/write_target_test.go: `_, err = writeTarget.Execute(ctx, req)` $DIR/core/capabilities/targets/write_target_test.go: `t.Run("fails when ChainWriter's SubmitTransaction returns error", func(t *testing.T) { req := capabilities.CapabilityRequest{ Metadata: capabilities.RequestMetadata{ WorkflowID: "test-id", }, Config: config, Inputs: validInputs, } cw.On("SubmitTransaction", mock.Anything, "forwarder", "report", mock.Anything, mock.Anything, forwarderAddr, mock.Anything, mock.Anything).Return(errors.New("writer error")) _, err = writeTarget.Execute(ctx, req) require.Error(t, err) })` $DIR/core/capabilities/targets/write_target_test.go: `cw.On("SubmitTransaction", mock.Anything, "forwarder", "report", mock.Anything, mock.Anything, forwarderAddr, mock.Anything, mock.Anything).Return(errors.New("writer error"))` $DIR/core/capabilities/targets/write_target_test.go: `_, err = writeTarget.Execute(ctx, req)` $DIR/core/capabilities/targets/write_target_test.go: `_, err = writeTarget.Execute(ctx, req)` $DIR/core/capabilities/targets/write_target_test.go: `.TestLogger(t)` $DIR/core/capabilities/targets/write_target_test.go: `.Background()` $DIR/core/capabilities/targets/write_target_test.go: `.NewChainWriter(t)` $DIR/core/capabilities/targets/write_target_test.go: `.NewChainReader(t)` $DIR/core/capabilities/targets/write_target_test.go: `.NewAddress()` $DIR/core/capabilities/targets/write_target_test.go: `.Hex()` $DIR/core/capabilities/targets/write_target_test.go: `.NewWriteTarget(lggr, "test-write-target@1.0.0", cr, cw, forwarderAddr)` $DIR/core/capabilities/targets/write_target_test.go: `.NewMap(map[string]any{ "Address": forwarderAddr, })` $DIR/core/capabilities/targets/write_target_test.go: `.NewMap(map[string]any{ "signed_report": map[string]any{ "report": []byte{1, 2, 3}, "signatures": [][]byte{}, }, })` $DIR/core/capabilities/targets/write_target_test.go: `.On("GetLatestValue", mock.Anything, "forwarder", "getTransmitter", mock.Anything, mock.Anything)` $DIR/core/capabilities/targets/write_target_test.go: `.Return(nil)` $DIR/core/capabilities/targets/write_target_test.go: `.Run(func(args mock.Arguments) { transmitter := args.Get(4).(*common.Address) *transmitter = common.HexToAddress("0x0") })` $DIR/core/capabilities/targets/write_target_test.go: `.Get(4)` $DIR/core/capabilities/targets/write_target_test.go: `.HexToAddress("0x0")` $DIR/core/capabilities/targets/write_target_test.go: `.Once()` $DIR/core/capabilities/targets/write_target_test.go: `.On("SubmitTransaction", mock.Anything, "forwarder", "report", mock.Anything, mock.Anything, forwarderAddr, mock.Anything, mock.Anything)` $DIR/core/capabilities/targets/write_target_test.go: `.Return(nil)` $DIR/core/capabilities/targets/write_target_test.go: `.Once()` $DIR/core/capabilities/targets/write_target_test.go: `.Run("succeeds with valid report", func(t *testing.T) { req := capabilities.CapabilityRequest{ Metadata: capabilities.RequestMetadata{ WorkflowID: "test-id", }, Config: config, Inputs: validInputs, } ch, err2 := writeTarget.Execute(ctx, req) require.NoError(t, err2) response := <-ch require.NotNil(t, response) })` $DIR/core/capabilities/targets/write_target_test.go: `.Execute(ctx, req)` $DIR/core/capabilities/targets/write_target_test.go: `.Run("succeeds with empty report", func(t *testing.T) { emptyInputs, err2 := values.NewMap(map[string]any{ "signed_report": map[string]any{ "report": []byte{}, }, "signatures": [][]byte{}, }) require.NoError(t, err2) req := capabilities.CapabilityRequest{ Metadata: capabilities.RequestMetadata{ WorkflowExecutionID: "test-id", }, Config: config, Inputs: emptyInputs, } ch, err2 := writeTarget.Execute(ctx, req) require.NoError(t, err2) response := <-ch require.Nil(t, response.Value) })` $DIR/core/capabilities/targets/write_target_test.go: `.NewMap(map[string]any{ "signed_report": map[string]any{ "report": []byte{}, }, "signatures": [][]byte{}, })` $DIR/core/capabilities/targets/write_target_test.go: `.Execute(ctx, req)` $DIR/core/capabilities/targets/write_target_test.go: `.Run("fails when ChainReader's GetLatestValue returns error", func(t *testing.T) { req := capabilities.CapabilityRequest{ Metadata: capabilities.RequestMetadata{ WorkflowID: "test-id", }, Config: config, Inputs: validInputs, } cr.On("GetLatestValue", mock.Anything, "forwarder", "getTransmitter", mock.Anything, mock.Anything).Return(errors.New("reader error")) _, err = writeTarget.Execute(ctx, req) require.Error(t, err) })` $DIR/core/capabilities/targets/write_target_test.go: `.On("GetLatestValue", mock.Anything, "forwarder", "getTransmitter", mock.Anything, mock.Anything)` $DIR/core/capabilities/targets/write_target_test.go: `.Return(errors.New("reader error"))` $DIR/core/capabilities/targets/write_target_test.go: `.New("reader error")` $DIR/core/capabilities/targets/write_target_test.go: `.Execute(ctx, req)` $DIR/core/capabilities/targets/write_target_test.go: `.Run("fails when ChainWriter's SubmitTransaction returns error", func(t *testing.T) { req := capabilities.CapabilityRequest{ Metadata: capabilities.RequestMetadata{ WorkflowID: "test-id", }, Config: config, Inputs: validInputs, } cw.On("SubmitTransaction", mock.Anything, "forwarder", "report", mock.Anything, mock.Anything, forwarderAddr, mock.Anything, mock.Anything).Return(errors.New("writer error")) _, err = writeTarget.Execute(ctx, req) require.Error(t, err) })` $DIR/core/capabilities/targets/write_target_test.go: `.On("SubmitTransaction", mock.Anything, "forwarder", "report", mock.Anything, mock.Anything, forwarderAddr, mock.Anything, mock.Anything)` $DIR/core/capabilities/targets/write_target_test.go: `.Return(errors.New("writer error"))` $DIR/core/capabilities/targets/write_target_test.go: `.New("writer error")` $DIR/core/capabilities/targets/write_target_test.go: `.Execute(ctx, req)` $DIR/core/capabilities/targets/write_target_test.go: `.NewMap(map[string]any{ "Address": "invalid-address", })` $DIR/core/capabilities/targets/write_target_test.go: `.Execute(ctx, req)` $DIR/core/capabilities/transmission/local_target_capability_test.go: `gotTime = time.Now()` $DIR/core/capabilities/transmission/local_target_capability_test.go: `called = true` $DIR/core/capabilities/transmission/local_target_capability_test.go: `t.Run(tc.name, func(t *testing.T) { startTime := time.Now() m, err := values.NewMap(map[string]any{ "schedule": tc.schedule, "deltaStage": "100ms", }) require.NoError(t, err) req := capabilities.CapabilityRequest{ Config: m, Metadata: capabilities.RequestMetadata{ WorkflowID: "mock-workflow-id", WorkflowExecutionID: "mock-execution-id", }, } ids := []p2ptypes.PeerID{ randKey(), randKey(), randKey(), randKey(), } don := capabilities.DON{ Members: ids, Config: capabilities.DONConfig{ SharedSecret: [16]byte(key), }, } peerID := ids[tc.position] localTargetCapability := NewLocalTargetCapability(log, peerID, don, mt) _, err = localTargetCapability.Execute(tests.Context(t), req) require.NoError(t, err) require.True(t, called) assertBetween(t, gotTime.Sub(startTime), tc.low, tc.high) })` $DIR/core/capabilities/transmission/local_target_capability_test.go: `_, err = localTargetCapability.Execute(tests.Context(t), req)` $DIR/core/capabilities/transmission/local_target_capability_test.go: `assertBetween(t, gotTime.Sub(startTime), tc.low, tc.high)` $DIR/core/capabilities/transmission/local_target_capability_test.go: `.TestLogger(t)` $DIR/core/capabilities/transmission/local_target_capability_test.go: `.MustNewCapabilityInfo( "write_polygon-testnet-mumbai@1.0.0", capabilities.CapabilityTypeTarget, "a write capability targeting polygon mumbai testnet", )` $DIR/core/capabilities/transmission/local_target_capability_test.go: `.Now()` $DIR/core/capabilities/transmission/local_target_capability_test.go: `.DecodeString("fb13ca015a9ec60089c7141e9522de79")` $DIR/core/capabilities/transmission/local_target_capability_test.go: `.Run(tc.name, func(t *testing.T) { startTime := time.Now() m, err := values.NewMap(map[string]any{ "schedule": tc.schedule, "deltaStage": "100ms", }) require.NoError(t, err) req := capabilities.CapabilityRequest{ Config: m, Metadata: capabilities.RequestMetadata{ WorkflowID: "mock-workflow-id", WorkflowExecutionID: "mock-execution-id", }, } ids := []p2ptypes.PeerID{ randKey(), randKey(), randKey(), randKey(), } don := capabilities.DON{ Members: ids, Config: capabilities.DONConfig{ SharedSecret: [16]byte(key), }, } peerID := ids[tc.position] localTargetCapability := NewLocalTargetCapability(log, peerID, don, mt) _, err = localTargetCapability.Execute(tests.Context(t), req) require.NoError(t, err) require.True(t, called) assertBetween(t, gotTime.Sub(startTime), tc.low, tc.high) })` $DIR/core/capabilities/transmission/local_target_capability_test.go: `.Now()` $DIR/core/capabilities/transmission/local_target_capability_test.go: `.NewMap(map[string]any{ "schedule": tc.schedule, "deltaStage": "100ms", })` $DIR/core/capabilities/transmission/local_target_capability_test.go: `.Execute(tests.Context(t), req)` $DIR/core/capabilities/transmission/local_target_capability_test.go: `.Context(t)` $DIR/core/capabilities/transmission/local_target_capability_test.go: `.Sub(startTime)` $DIR/core/capabilities/transmission/transmission_test.go: `t.Run(tc.name, func(t *testing.T) { sharedSecret, err := hex.DecodeString(tc.sharedSecret) require.NoError(t, err) m, err := values.NewMap(map[string]any{ "schedule": tc.schedule, "deltaStage": tc.deltaStage, }) require.NoError(t, err) transmissionCfg, err := ExtractTransmissionConfig(m) require.NoError(t, err) peerIdToDelay, err := GetPeerIDToTransmissionDelay(ids, [16]byte(sharedSecret), "mock-workflow-id"+tc.workflowExecutionID, transmissionCfg) require.NoError(t, err) assert.Equal(t, tc.expectedDelays["one"], peerIdToDelay[peer1]) assert.Equal(t, tc.expectedDelays["two"], peerIdToDelay[peer2]) assert.Equal(t, tc.expectedDelays["three"], peerIdToDelay[peer3]) assert.Equal(t, tc.expectedDelays["four"], peerIdToDelay[peer4]) })` $DIR/core/capabilities/transmission/transmission_test.go: `.Sprintf("%-32s", "one")` $DIR/core/capabilities/transmission/transmission_test.go: `.Sprintf("%-32s", "two")` $DIR/core/capabilities/transmission/transmission_test.go: `.Sprintf("%-32s", "three")` $DIR/core/capabilities/transmission/transmission_test.go: `.Sprintf("%-32s", "four")` $DIR/core/capabilities/transmission/transmission_test.go: `.Run(tc.name, func(t *testing.T) { sharedSecret, err := hex.DecodeString(tc.sharedSecret) require.NoError(t, err) m, err := values.NewMap(map[string]any{ "schedule": tc.schedule, "deltaStage": tc.deltaStage, }) require.NoError(t, err) transmissionCfg, err := ExtractTransmissionConfig(m) require.NoError(t, err) peerIdToDelay, err := GetPeerIDToTransmissionDelay(ids, [16]byte(sharedSecret), "mock-workflow-id"+tc.workflowExecutionID, transmissionCfg) require.NoError(t, err) assert.Equal(t, tc.expectedDelays["one"], peerIdToDelay[peer1]) assert.Equal(t, tc.expectedDelays["two"], peerIdToDelay[peer2]) assert.Equal(t, tc.expectedDelays["three"], peerIdToDelay[peer3]) assert.Equal(t, tc.expectedDelays["four"], peerIdToDelay[peer4]) })` $DIR/core/capabilities/transmission/transmission_test.go: `.DecodeString(tc.sharedSecret)` $DIR/core/capabilities/transmission/transmission_test.go: `.NewMap(map[string]any{ "schedule": tc.schedule, "deltaStage": tc.deltaStage, })` $DIR/core/cbor/cbor_test.go: `t.Run(test.name, func(t *testing.T) { b, err := hexutil.Decode(test.in) assert.NoError(t, err) json, err := ParseDietCBOR(b) if test.wantErrored { assert.Error(t, err) } else { assert.NoError(t, err) assert.Equal(t, test.want, json) } })` $DIR/core/cbor/cbor_test.go: `err = ParseDietCBORToStruct(bytesCBOR, &parsed)` $DIR/core/cbor/cbor_test.go: `err = ParseDietCBORToStruct(bytesCBOR, &parsed)` $DIR/core/cbor/cbor_test.go: `err = ParseDietCBORToStruct(bytesCBOR, &parsed)` $DIR/core/cbor/cbor_test.go: `t.Run(test.name, func(t *testing.T) { assert.Equal(t, test.want, autoAddMapDelimiters(test.in)) })` $DIR/core/cbor/cbor_test.go: `t.Run(test.name, func(t *testing.T) { decoded, err := CoerceInterfaceMapToStringMap(test.input) require.NoError(t, err) assert.True(t, reflect.DeepEqual(test.want, decoded)) })` $DIR/core/cbor/cbor_test.go: `t.Run(test.name, func(t *testing.T) { _, err := CoerceInterfaceMapToStringMap(test.input) assert.Error(t, err) })` $DIR/core/cbor/cbor_test.go: `t.Run(test.name, func(t *testing.T) { encoded := mustMarshal(t, test.in) var decoded interface{} err := cbor.Unmarshal(encoded, &decoded) require.NoError(t, err) decoded, err = CoerceInterfaceMapToStringMap(decoded) require.NoError(t, err) assert.True(t, reflect.DeepEqual(test.in, decoded)) })` $DIR/core/cbor/cbor_test.go: `decoded, err = CoerceInterfaceMapToStringMap(decoded)` $DIR/core/cbor/cbor_test.go: `.DecodeString("0x8bd112d3f8f92e41c861939545ad387307af9703")` $DIR/core/cbor/cbor_test.go: `.MustParseBigInt(t, "18446744073709551616")` $DIR/core/cbor/cbor_test.go: `.MustParseBigInt(t, "28948022309329048855892746252171976963317496166410141009864396001978282409984")` $DIR/core/cbor/cbor_test.go: `.MustParseBigInt(t, "-18446744073709551617")` $DIR/core/cbor/cbor_test.go: `.MustParseBigInt(t, "-28948022309329048855892746252171976963317496166410141009864396001978282409984")` $DIR/core/cbor/cbor_test.go: `.MustParseBigInt(t, "18446744073709551616")` $DIR/core/cbor/cbor_test.go: `.MustParseBigInt(t, "28948022309329048855892746252171976963317496166410141009864396001978282409984")` $DIR/core/cbor/cbor_test.go: `.MustParseBigInt(t, "-18446744073709551617")` $DIR/core/cbor/cbor_test.go: `.MustParseBigInt(t, "-28948022309329048855892746252171976963317496166410141009864396001978282409984")` $DIR/core/cbor/cbor_test.go: `.Run(test.name, func(t *testing.T) { b, err := hexutil.Decode(test.in) assert.NoError(t, err) json, err := ParseDietCBOR(b) if test.wantErrored { assert.Error(t, err) } else { assert.NoError(t, err) assert.Equal(t, test.want, json) } })` $DIR/core/cbor/cbor_test.go: `.Decode(test.in)` $DIR/core/cbor/cbor_test.go: `.Decode(hexCBOR)` $DIR/core/cbor/cbor_test.go: `.Decode(hexCBOR)` $DIR/core/cbor/cbor_test.go: `.Decode(hexCBOR)` $DIR/core/cbor/cbor_test.go: `.MustDecode("0xA0")` $DIR/core/cbor/cbor_test.go: `.MustDecode("0xA0")` $DIR/core/cbor/cbor_test.go: `.MustDecode("0xA1636B65796576616C7565")` $DIR/core/cbor/cbor_test.go: `.MustDecode("0xA1636B65796576616C7565")` $DIR/core/cbor/cbor_test.go: `.MustDecode("0x80")` $DIR/core/cbor/cbor_test.go: `.MustDecode("0x80")` $DIR/core/cbor/cbor_test.go: `.MustDecode("0xbf636B65796576616C7565ff")` $DIR/core/cbor/cbor_test.go: `.MustDecode("0xbf636B65796576616C7565ff")` $DIR/core/cbor/cbor_test.go: `.MustDecode("0x636B65796576616C7565ff")` $DIR/core/cbor/cbor_test.go: `.MustDecode("0xbf636B65796576616C7565ffff")` $DIR/core/cbor/cbor_test.go: `.MustDecode("0xbf636B65796576616C7565")` $DIR/core/cbor/cbor_test.go: `.MustDecode("0xbf636B65796576616C7565")` $DIR/core/cbor/cbor_test.go: `.MustDecode("0x636B65796576616C7565")` $DIR/core/cbor/cbor_test.go: `.MustDecode("0xbf636B65796576616C7565ff")` $DIR/core/cbor/cbor_test.go: `.Run(test.name, func(t *testing.T) { assert.Equal(t, test.want, autoAddMapDelimiters(test.in)) })` $DIR/core/cbor/cbor_test.go: `.Run(test.name, func(t *testing.T) { decoded, err := CoerceInterfaceMapToStringMap(test.input) require.NoError(t, err) assert.True(t, reflect.DeepEqual(test.want, decoded)) })` $DIR/core/cbor/cbor_test.go: `.Run(test.name, func(t *testing.T) { _, err := CoerceInterfaceMapToStringMap(test.input) assert.Error(t, err) })` $DIR/core/cbor/cbor_test.go: `.Run(test.name, func(t *testing.T) { encoded := mustMarshal(t, test.in) var decoded interface{} err := cbor.Unmarshal(encoded, &decoded) require.NoError(t, err) decoded, err = CoerceInterfaceMapToStringMap(decoded) require.NoError(t, err) assert.True(t, reflect.DeepEqual(test.in, decoded)) })` $DIR/core/cbor/cbor_test.go: `.Unmarshal(encoded, &decoded)` $DIR/core/chains/chain_kv_test.go: `kv = chains.NewChainsKV[*testChainService](onechain)` $DIR/core/chains/chain_kv_test.go: `c, err = kv.Get(testChainID)` $DIR/core/chains/chain_kv_test.go: `cs, err = kv.List()` $DIR/core/chains/chain_kv_test.go: `cs, err = kv.List(testChainID)` $DIR/core/chains/chain_kv_test.go: `cs, err = kv.List("no such id")` $DIR/core/chains/chain_kv_test.go: `.Get(testChainID)` $DIR/core/chains/chain_kv_test.go: `.List()` $DIR/core/chains/chain_kv_test.go: `.Get(testChainID)` $DIR/core/chains/chain_kv_test.go: `.List()` $DIR/core/chains/chain_kv_test.go: `.List(testChainID)` $DIR/core/chains/chain_kv_test.go: `.List("no such id")` $DIR/core/chains/evm/abi/selector_parser_test.go: `result = append(result, abi.ArgumentMarshaling{Name: name, Type: typeName, InternalType: typeName, Components: nil, Indexed: false})` $DIR/core/chains/evm/abi/selector_parser_test.go: `result = append(result, abi.ArgumentMarshaling{Name: name, Type: "tuple", InternalType: "tuple", Components: components, Indexed: false})` $DIR/core/chains/evm/abi/selector_parser_test.go: `result = append(result, abi.ArgumentMarshaling{Name: name, Type: "tuple[]", InternalType: "tuple[]", Components: components[0], Indexed: false})` $DIR/core/chains/evm/abi/selector_parser_test.go: `t.Run(scenario.description, func(t *testing.T) { _, err := ParseSelector(scenario.input) require.Error(t, err) assert.Equal(t, scenario.expectedError, err.Error()) })` $DIR/core/chains/evm/abi/selector_parser_test.go: `.Sprintf("name%d", i)` $DIR/core/chains/evm/abi/selector_parser_test.go: `.DeepEqual(selector.Inputs, tt.args)` $DIR/core/chains/evm/abi/selector_parser_test.go: `.DeepEqual(selector.Inputs, tt.args)` $DIR/core/chains/evm/abi/selector_parser_test.go: `.Run(scenario.description, func(t *testing.T) { _, err := ParseSelector(scenario.input) require.Error(t, err) assert.Equal(t, scenario.expectedError, err.Error()) })` $DIR/core/chains/evm/assets/assets_test.go: `eth.SetInt64(1)` $DIR/core/chains/evm/assets/assets_test.go: `eth.SetString("900000000000000000", 10)` $DIR/core/chains/evm/assets/assets_test.go: `eth.SetString("115792089237316195423570985008687907853269984665640564039457584007913129639935", 10)` $DIR/core/chains/evm/assets/assets_test.go: `eth.SetString("115792089237316195423570985008687907853269984665640564039457584007913129639936", 10)` $DIR/core/chains/evm/assets/assets_test.go: `err = json.Unmarshal([]byte(`1`), ð)` $DIR/core/chains/evm/assets/assets_test.go: `err = eth2.Scan(v)` $DIR/core/chains/evm/assets/assets_test.go: `.NewEth(0)` $DIR/core/chains/evm/assets/assets_test.go: `.SetInt64(1)` $DIR/core/chains/evm/assets/assets_test.go: `.SetString("900000000000000000", 10)` $DIR/core/chains/evm/assets/assets_test.go: `.SetString("115792089237316195423570985008687907853269984665640564039457584007913129639935", 10)` $DIR/core/chains/evm/assets/assets_test.go: `.SetString("115792089237316195423570985008687907853269984665640564039457584007913129639936", 10)` $DIR/core/chains/evm/assets/assets_test.go: `.String()` $DIR/core/chains/evm/assets/assets_test.go: `.NewEth(0)` $DIR/core/chains/evm/assets/assets_test.go: `.NewEth(1)` $DIR/core/chains/evm/assets/assets_test.go: `.IsZero()` $DIR/core/chains/evm/assets/assets_test.go: `.NewEth(1)` $DIR/core/chains/evm/assets/assets_test.go: `.Marshal(eth)` $DIR/core/chains/evm/assets/assets_test.go: `.Unmarshal([]byte(`"1"`), ð)` $DIR/core/chains/evm/assets/assets_test.go: `.String()` $DIR/core/chains/evm/assets/assets_test.go: `.Unmarshal([]byte(`"x"`), ð)` $DIR/core/chains/evm/assets/assets_test.go: `.Unmarshal([]byte(`1`), ð)` $DIR/core/chains/evm/assets/assets_test.go: `.NewEth(123)` $DIR/core/chains/evm/assets/assets_test.go: `.NewEthValue(123)` $DIR/core/chains/evm/assets/assets_test.go: `.NewEthValueS(ethRef.String())` $DIR/core/chains/evm/assets/assets_test.go: `.String()` $DIR/core/chains/evm/assets/assets_test.go: `.NewEth(123)` $DIR/core/chains/evm/assets/assets_test.go: `.Symbol()` $DIR/core/chains/evm/assets/assets_test.go: `.NewEth(123)` $DIR/core/chains/evm/assets/assets_test.go: `.Value()` $DIR/core/chains/evm/assets/assets_test.go: `.NewEth(0)` $DIR/core/chains/evm/assets/assets_test.go: `.Scan(v)` $DIR/core/chains/evm/assets/assets_test.go: `.NewEth(123)` $DIR/core/chains/evm/assets/assets_test.go: `.NewEth(321)` $DIR/core/chains/evm/assets/assets_test.go: `.NewEth(321)` $DIR/core/chains/evm/assets/assets_test.go: `.Cmp(eth2)` $DIR/core/chains/evm/assets/units_test.go: `t.Run(test.name, func(t *testing.T) { t.Parallel() expected := assets.NewWeiI(0) assert.Equal(t, expected, test.fn(0)) expected = assets.NewWeiI(100) expected = expected.Mul(test.factor) assert.Equal(t, expected, test.fn(100)) })` $DIR/core/chains/evm/assets/units_test.go: `expected = assets.NewWeiI(100)` $DIR/core/chains/evm/assets/units_test.go: `expected = expected.Mul(test.factor)` $DIR/core/chains/evm/assets/units_test.go: `.NewInt(params.Wei)` $DIR/core/chains/evm/assets/units_test.go: `.NewInt(params.GWei)` $DIR/core/chains/evm/assets/units_test.go: `.NewInt(params.GWei * 1000)` $DIR/core/chains/evm/assets/units_test.go: `.NewInt(params.Ether)` $DIR/core/chains/evm/assets/units_test.go: `.Run(test.name, func(t *testing.T) { t.Parallel() expected := assets.NewWeiI(0) assert.Equal(t, expected, test.fn(0)) expected = assets.NewWeiI(100) expected = expected.Mul(test.factor) assert.Equal(t, expected, test.fn(100)) })` $DIR/core/chains/evm/assets/units_test.go: `.NewWeiI(0)` $DIR/core/chains/evm/assets/units_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/assets/units_test.go: `.Mul(test.factor)` $DIR/core/chains/evm/assets/wei_test.go: `t.Run(tt.input, func(t *testing.T) { var w Wei err := w.UnmarshalText([]byte(tt.input)) require.NoError(t, err) b, err := w.MarshalText() require.NoError(t, err) assert.Equal(t, tt.exp, string(b)) assert.Equal(t, tt.exp, w.String()) })` $DIR/core/chains/evm/assets/wei_test.go: `got = tryParseExp("0e-80000800")` $DIR/core/chains/evm/assets/wei_test.go: `got = tryParseExp("0e+802444440")` $DIR/core/chains/evm/assets/wei_test.go: `.Run(tt.input, func(t *testing.T) { var w Wei err := w.UnmarshalText([]byte(tt.input)) require.NoError(t, err) b, err := w.MarshalText() require.NoError(t, err) assert.Equal(t, tt.exp, string(b)) assert.Equal(t, tt.exp, w.String()) })` $DIR/core/chains/evm/assets/wei_test.go: `.UnmarshalText([]byte(tt.input))` $DIR/core/chains/evm/assets/wei_test.go: `.MarshalText()` $DIR/core/chains/evm/client/chain_client_test.go: `err = json.Unmarshal(response, &resp)` $DIR/core/chains/evm/client/chain_client_test.go: `t.Run("happy path", func(t *testing.T) { result := mustReadResult(t, "../../../testdata/jsonrpc/getTransactionReceipt.json") wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return } if assert.Equal(t, "eth_getTransactionReceipt", method) && assert.True(t, params.IsArray()) && assert.Equal(t, txHash, params.Array()[0].String()) { resp.Result = string(result) } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(tests.Context(t)) require.NoError(t, err) hash := common.HexToHash(txHash) receipt, err := ethClient.TransactionReceipt(tests.Context(t), hash) require.NoError(t, err) assert.Equal(t, hash, receipt.TxHash) assert.Equal(t, big.NewInt(11), receipt.BlockNumber) })` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"0x00"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Notify = headResult` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = "true"` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = string(result)` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"0x00"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Notify = headResult` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = "true"` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = string(result)` $DIR/core/chains/evm/client/chain_client_test.go: `_, err = ethClient.TransactionReceipt(tests.Context(t), hash)` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"0x00"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Notify = headResult` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = "true"` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"0x100"`` $DIR/core/chains/evm/client/chain_client_test.go: `t.Run(test.name, func(t *testing.T) { wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return } if assert.Equal(t, "eth_getBalance", method) && assert.True(t, params.IsArray()) && assert.Equal(t, strings.ToLower(address.Hex()), strings.ToLower(params.Array()[0].String())) { resp.Result = `"` + hexutil.EncodeBig(test.balance) + `"` } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(tests.Context(t)) require.NoError(t, err) result, err := ethClient.BalanceAt(tests.Context(t), address, nil) require.NoError(t, err) assert.Equal(t, test.balance, result) })` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"0x00"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Notify = headResult` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = "true"` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"` + hexutil.EncodeBig(test.balance) + `"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"0x00"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Notify = headResult` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = "true"` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"0x100"`` $DIR/core/chains/evm/client/chain_client_test.go: `t.Run(test.name, func(t *testing.T) { contractAddress := testutils.NewAddress() userAddress := testutils.NewAddress() functionSelector := evmtypes.HexToFunctionSelector(client.BALANCE_OF_ADDRESS_FUNCTION_SELECTOR) // balanceOf(address) txData := utils.ConcatBytes(functionSelector.Bytes(), common.LeftPadBytes(userAddress.Bytes(), utils.EVMWordByteLen)) wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return } if !assert.Equal(t, "eth_call", method) || !assert.True(t, params.IsArray()) { return } arr := params.Array() callArgs := arr[0] if assert.True(t, callArgs.IsObject()) && assert.Equal(t, strings.ToLower(contractAddress.Hex()), callArgs.Get("to").String()) && assert.Equal(t, hexutil.Encode(txData), callArgs.Get("data").String()) && assert.Equal(t, "latest", arr[1].String()) { resp.Result = `"` + hexutil.EncodeBig(test.balance) + `"` } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(tests.Context(t)) require.NoError(t, err) result, err := ethClient.TokenBalance(ctx, userAddress, contractAddress) require.NoError(t, err) assert.Equal(t, test.balance, result) })` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"0x00"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Notify = headResult` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = "true"` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"` + hexutil.EncodeBig(test.balance) + `"`` $DIR/core/chains/evm/client/chain_client_test.go: `t.Run(test.name, func(t *testing.T) { wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return } if !assert.Equal(t, "eth_getBlockByNumber", method) || !assert.True(t, params.IsArray()) { return } arr := params.Array() blockNumStr := arr[0].String() var blockNum hexutil.Big err := blockNum.UnmarshalText([]byte(blockNumStr)) if assert.NoError(t, err) && assert.Equal(t, test.expectedRequestBlock, blockNum.ToInt()) && assert.Equal(t, false, arr[1].Bool()) { resp.Result = test.rpcResp } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(tests.Context(t)) require.NoError(t, err) ctx, cancel := context.WithTimeout(tests.Context(t), 5*time.Second) result, err := ethClient.HeadByNumber(ctx, expectedBlockNum) if test.error != nil { require.Error(t, err, test.error) } else { require.NoError(t, err) require.Equal(t, expectedBlockHash, result.Hash.Hex()) require.Equal(t, test.expectedResponseBlock, result.Number) require.Zero(t, testutils.FixtureChainID.Cmp(result.EVMChainID.ToInt())) } cancel() })` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"0x00"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Notify = headResult` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = "true"` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = test.rpcResp` $DIR/core/chains/evm/client/chain_client_test.go: `cancel()` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"0x00"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Notify = headResult` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = "true"` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"` + tx.Hash().Hex() + `"`` $DIR/core/chains/evm/client/chain_client_test.go: `err = ethClient.SendTransaction(tests.Context(t), tx)` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"0x00"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Notify = headResult` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = "true"` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"` + tx.Hash().Hex() + `"`` $DIR/core/chains/evm/client/chain_client_test.go: `t.Cleanup(rpcSrv.Stop)` $DIR/core/chains/evm/client/chain_client_test.go: `t.Cleanup(ts.Close)` $DIR/core/chains/evm/client/chain_client_test.go: `err = ethClient.Dial(tests.Context(t))` $DIR/core/chains/evm/client/chain_client_test.go: `err = ethClient.SendTransaction(tests.Context(t), tx)` $DIR/core/chains/evm/client/chain_client_test.go: `t.Run("returns Fatal error type when error message is fatal", func(t *testing.T) { wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_sendRawTransaction": resp.Result = `"` + tx.Hash().Hex() + `"` resp.Error.Message = "invalid sender" } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(tests.Context(t)) require.NoError(t, err) errType, err := ethClient.SendTransactionReturnCode(tests.Context(t), tx, fromAddress) assert.Error(t, err) assert.Equal(t, errType, commonclient.Fatal) })` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"0x00"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Notify = headResult` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = "true"` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"` + tx.Hash().Hex() + `"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Error.Message = "invalid sender"` $DIR/core/chains/evm/client/chain_client_test.go: `t.Run("returns TransactionAlreadyKnown error type when error message is nonce too low", func(t *testing.T) { wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_sendRawTransaction": resp.Result = `"` + tx.Hash().Hex() + `"` resp.Error.Message = "nonce too low" } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(tests.Context(t)) require.NoError(t, err) errType, err := ethClient.SendTransactionReturnCode(tests.Context(t), tx, fromAddress) assert.Error(t, err) assert.Equal(t, errType, commonclient.TransactionAlreadyKnown) })` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"0x00"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Notify = headResult` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = "true"` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"` + tx.Hash().Hex() + `"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Error.Message = "nonce too low"` $DIR/core/chains/evm/client/chain_client_test.go: `t.Run("returns Successful error type when there is no error message", func(t *testing.T) { wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_sendRawTransaction": resp.Result = `"` + tx.Hash().Hex() + `"` } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(tests.Context(t)) require.NoError(t, err) errType, err := ethClient.SendTransactionReturnCode(tests.Context(t), tx, fromAddress) assert.NoError(t, err) assert.Equal(t, errType, commonclient.Successful) })` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"0x00"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Notify = headResult` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = "true"` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"` + tx.Hash().Hex() + `"`` $DIR/core/chains/evm/client/chain_client_test.go: `t.Run("returns Underpriced error type when transaction is terminally underpriced", func(t *testing.T) { wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_sendRawTransaction": resp.Result = `"` + tx.Hash().Hex() + `"` resp.Error.Message = "transaction underpriced" } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(tests.Context(t)) require.NoError(t, err) errType, err := ethClient.SendTransactionReturnCode(tests.Context(t), tx, fromAddress) assert.Error(t, err) assert.Equal(t, errType, commonclient.Underpriced) })` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"0x00"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Notify = headResult` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = "true"` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"` + tx.Hash().Hex() + `"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Error.Message = "transaction underpriced"` $DIR/core/chains/evm/client/chain_client_test.go: `t.Run("returns Unsupported error type when error message is queue full", func(t *testing.T) { wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_sendRawTransaction": resp.Result = `"` + tx.Hash().Hex() + `"` resp.Error.Message = "queue full" } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(tests.Context(t)) require.NoError(t, err) errType, err := ethClient.SendTransactionReturnCode(tests.Context(t), tx, fromAddress) assert.Error(t, err) assert.Equal(t, errType, commonclient.Unsupported) })` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"0x00"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Notify = headResult` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = "true"` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"` + tx.Hash().Hex() + `"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Error.Message = "queue full"` $DIR/core/chains/evm/client/chain_client_test.go: `t.Run("returns Retryable error type when there is a transaction gap", func(t *testing.T) { wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_sendRawTransaction": resp.Result = `"` + tx.Hash().Hex() + `"` resp.Error.Message = "NonceGap" } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(tests.Context(t)) require.NoError(t, err) errType, err := ethClient.SendTransactionReturnCode(tests.Context(t), tx, fromAddress) assert.Error(t, err) assert.Equal(t, errType, commonclient.Retryable) })` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"0x00"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Notify = headResult` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = "true"` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"` + tx.Hash().Hex() + `"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Error.Message = "NonceGap"` $DIR/core/chains/evm/client/chain_client_test.go: `t.Run("returns InsufficientFunds error type when the sender address doesn't have enough funds", func(t *testing.T) { wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_sendRawTransaction": resp.Result = `"` + tx.Hash().Hex() + `"` resp.Error.Message = "insufficient funds for transfer" } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(tests.Context(t)) require.NoError(t, err) errType, err := ethClient.SendTransactionReturnCode(tests.Context(t), tx, fromAddress) assert.Error(t, err) assert.Equal(t, errType, commonclient.InsufficientFunds) })` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"0x00"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Notify = headResult` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = "true"` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"` + tx.Hash().Hex() + `"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Error.Message = "insufficient funds for transfer"` $DIR/core/chains/evm/client/chain_client_test.go: `t.Run("returns ExceedsFeeCap error type when gas price is too high for the node", func(t *testing.T) { wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_sendRawTransaction": resp.Result = `"` + tx.Hash().Hex() + `"` resp.Error.Message = "Transaction fee cap exceeded" } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(tests.Context(t)) require.NoError(t, err) errType, err := ethClient.SendTransactionReturnCode(tests.Context(t), tx, fromAddress) assert.Error(t, err) assert.Equal(t, errType, commonclient.ExceedsMaxFee) })` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"0x00"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Notify = headResult` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = "true"` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"` + tx.Hash().Hex() + `"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Error.Message = "Transaction fee cap exceeded"` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"0x00"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Notify = headResult` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = "true"` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"` + tx.Hash().Hex() + `"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Error.Message = "some random error"` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = "true"` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Result = `"0x00"`` $DIR/core/chains/evm/client/chain_client_test.go: `resp.Notify = headResult` $DIR/core/chains/evm/client/chain_client_test.go: `mockRpc.On("BatchCallContext", mock.Anything, b).Run(func(args mock.Arguments) { reqs := args.Get(1).([]rpc.BatchElem) for i := 0; i < len(reqs); i++ { elem := &reqs[i] elem.Error = rpcError } }).Return(nil).Once()` $DIR/core/chains/evm/client/chain_client_test.go: `elem.Error = rpcError` $DIR/core/chains/evm/client/chain_client_test.go: `err = client.BatchCallContext(ctx, b)` $DIR/core/chains/evm/client/chain_client_test.go: `err = erroringClient.BatchCallContext(ctx, nil)` $DIR/core/chains/evm/client/chain_client_test.go: `err = erroringClient.BatchCallContextAll(ctx, nil)` $DIR/core/chains/evm/client/chain_client_test.go: `_, err = erroringClient.BlockByHash(ctx, common.Hash{})` $DIR/core/chains/evm/client/chain_client_test.go: `_, err = erroringClient.BlockByNumber(ctx, nil)` $DIR/core/chains/evm/client/chain_client_test.go: `err = erroringClient.CallContext(ctx, nil, "")` $DIR/core/chains/evm/client/chain_client_test.go: `_, err = erroringClient.CallContract(ctx, ethereum.CallMsg{}, nil)` $DIR/core/chains/evm/client/chain_client_test.go: `_, err = erroringClient.CodeAt(ctx, common.Address{}, nil)` $DIR/core/chains/evm/client/chain_client_test.go: `id = erroringClient.ConfiguredChainID()` $DIR/core/chains/evm/client/chain_client_test.go: `err = erroringClient.Dial(ctx)` $DIR/core/chains/evm/client/chain_client_test.go: `_, err = erroringClient.EstimateGas(ctx, ethereum.CallMsg{})` $DIR/core/chains/evm/client/chain_client_test.go: `_, err = erroringClient.FilterLogs(ctx, ethereum.FilterQuery{})` $DIR/core/chains/evm/client/chain_client_test.go: `_, err = erroringClient.HeaderByHash(ctx, common.Hash{})` $DIR/core/chains/evm/client/chain_client_test.go: `_, err = erroringClient.HeaderByNumber(ctx, nil)` $DIR/core/chains/evm/client/chain_client_test.go: `_, err = erroringClient.HeadByHash(ctx, common.Hash{})` $DIR/core/chains/evm/client/chain_client_test.go: `_, err = erroringClient.HeadByNumber(ctx, nil)` $DIR/core/chains/evm/client/chain_client_test.go: `_, err = erroringClient.LINKBalance(ctx, common.Address{}, common.Address{})` $DIR/core/chains/evm/client/chain_client_test.go: `_, err = erroringClient.LatestBlockHeight(ctx)` $DIR/core/chains/evm/client/chain_client_test.go: `_, err = erroringClient.PendingCodeAt(ctx, common.Address{})` $DIR/core/chains/evm/client/chain_client_test.go: `_, err = erroringClient.PendingNonceAt(ctx, common.Address{})` $DIR/core/chains/evm/client/chain_client_test.go: `err = erroringClient.SendTransaction(ctx, nil)` $DIR/core/chains/evm/client/chain_client_test.go: `_, err = erroringClient.SequenceAt(ctx, common.Address{}, nil)` $DIR/core/chains/evm/client/chain_client_test.go: `_, err = erroringClient.SubscribeFilterLogs(ctx, ethereum.FilterQuery{}, nil)` $DIR/core/chains/evm/client/chain_client_test.go: `_, err = erroringClient.SubscribeNewHead(ctx, nil)` $DIR/core/chains/evm/client/chain_client_test.go: `_, err = erroringClient.SuggestGasPrice(ctx)` $DIR/core/chains/evm/client/chain_client_test.go: `_, err = erroringClient.SuggestGasTipCap(ctx)` $DIR/core/chains/evm/client/chain_client_test.go: `_, err = erroringClient.TokenBalance(ctx, common.Address{}, common.Address{})` $DIR/core/chains/evm/client/chain_client_test.go: `_, err = erroringClient.TransactionByHash(ctx, common.Hash{})` $DIR/core/chains/evm/client/chain_client_test.go: `_, err = erroringClient.TransactionReceipt(ctx, common.Hash{})` $DIR/core/chains/evm/client/chain_client_test.go: `.ReadFile(file)` $DIR/core/chains/evm/client/chain_client_test.go: `.Unmarshal(response, &resp)` $DIR/core/chains/evm/client/chain_client_test.go: `.Run("happy path", func(t *testing.T) { result := mustReadResult(t, "../../../testdata/jsonrpc/getTransactionReceipt.json") wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return } if assert.Equal(t, "eth_getTransactionReceipt", method) && assert.True(t, params.IsArray()) && assert.Equal(t, txHash, params.Array()[0].String()) { resp.Result = string(result) } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(tests.Context(t)) require.NoError(t, err) hash := common.HexToHash(txHash) receipt, err := ethClient.TransactionReceipt(tests.Context(t), hash) require.NoError(t, err) assert.Equal(t, hash, receipt.TxHash) assert.Equal(t, big.NewInt(11), receipt.BlockNumber) })` $DIR/core/chains/evm/client/chain_client_test.go: `.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return } if assert.Equal(t, "eth_getTransactionReceipt", method) && assert.True(t, params.IsArray()) && assert.Equal(t, txHash, params.Array()[0].String()) { resp.Result = string(result) } return })` $DIR/core/chains/evm/client/chain_client_test.go: `.WSURL()` $DIR/core/chains/evm/client/chain_client_test.go: `.String()` $DIR/core/chains/evm/client/chain_client_test.go: `.Dial(tests.Context(t))` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.HexToHash(txHash)` $DIR/core/chains/evm/client/chain_client_test.go: `.TransactionReceipt(tests.Context(t), hash)` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return } if assert.Equal(t, "eth_getTransactionReceipt", method) && assert.True(t, params.IsArray()) && assert.Equal(t, txHash, params.Array()[0].String()) { resp.Result = string(result) } return })` $DIR/core/chains/evm/client/chain_client_test.go: `.WSURL()` $DIR/core/chains/evm/client/chain_client_test.go: `.String()` $DIR/core/chains/evm/client/chain_client_test.go: `.Dial(tests.Context(t))` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.HexToHash(txHash)` $DIR/core/chains/evm/client/chain_client_test.go: `.TransactionReceipt(tests.Context(t), hash)` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.NewAddress()` $DIR/core/chains/evm/client/chain_client_test.go: `.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return } if !assert.Equal(t, "eth_getTransactionCount", method) || !assert.True(t, params.IsArray()) { return } arr := params.Array() if assert.Equal(t, strings.ToLower(address.Hex()), strings.ToLower(arr[0].String())) && assert.Equal(t, "pending", arr[1].String()) { resp.Result = `"0x100"` } return })` $DIR/core/chains/evm/client/chain_client_test.go: `.Array()` $DIR/core/chains/evm/client/chain_client_test.go: `.WSURL()` $DIR/core/chains/evm/client/chain_client_test.go: `.String()` $DIR/core/chains/evm/client/chain_client_test.go: `.Dial(tests.Context(t))` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.PendingNonceAt(tests.Context(t), address)` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.NewInt(0)` $DIR/core/chains/evm/client/chain_client_test.go: `.SetString("100000000000000000000", 10)` $DIR/core/chains/evm/client/chain_client_test.go: `.NewAddress()` $DIR/core/chains/evm/client/chain_client_test.go: `.NewInt(256)` $DIR/core/chains/evm/client/chain_client_test.go: `.Run(test.name, func(t *testing.T) { wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return } if assert.Equal(t, "eth_getBalance", method) && assert.True(t, params.IsArray()) && assert.Equal(t, strings.ToLower(address.Hex()), strings.ToLower(params.Array()[0].String())) { resp.Result = `"` + hexutil.EncodeBig(test.balance) + `"` } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(tests.Context(t)) require.NoError(t, err) result, err := ethClient.BalanceAt(tests.Context(t), address, nil) require.NoError(t, err) assert.Equal(t, test.balance, result) })` $DIR/core/chains/evm/client/chain_client_test.go: `.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return } if assert.Equal(t, "eth_getBalance", method) && assert.True(t, params.IsArray()) && assert.Equal(t, strings.ToLower(address.Hex()), strings.ToLower(params.Array()[0].String())) { resp.Result = `"` + hexutil.EncodeBig(test.balance) + `"` } return })` $DIR/core/chains/evm/client/chain_client_test.go: `.EncodeBig(test.balance)` $DIR/core/chains/evm/client/chain_client_test.go: `.WSURL()` $DIR/core/chains/evm/client/chain_client_test.go: `.String()` $DIR/core/chains/evm/client/chain_client_test.go: `.Dial(tests.Context(t))` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.BalanceAt(tests.Context(t), address, nil)` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return } if !assert.Equal(t, "eth_blockNumber", method) { return } resp.Result = `"0x100"` return })` $DIR/core/chains/evm/client/chain_client_test.go: `.WSURL()` $DIR/core/chains/evm/client/chain_client_test.go: `.String()` $DIR/core/chains/evm/client/chain_client_test.go: `.Dial(tests.Context(t))` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.LatestBlockHeight(tests.Context(t))` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.NewInt(256)` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.NewInt(0)` $DIR/core/chains/evm/client/chain_client_test.go: `.SetString("100000000000000000000000000000000000000", 10)` $DIR/core/chains/evm/client/chain_client_test.go: `.NewInt(256)` $DIR/core/chains/evm/client/chain_client_test.go: `.Run(test.name, func(t *testing.T) { contractAddress := testutils.NewAddress() userAddress := testutils.NewAddress() functionSelector := evmtypes.HexToFunctionSelector(client.BALANCE_OF_ADDRESS_FUNCTION_SELECTOR) // balanceOf(address) txData := utils.ConcatBytes(functionSelector.Bytes(), common.LeftPadBytes(userAddress.Bytes(), utils.EVMWordByteLen)) wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return } if !assert.Equal(t, "eth_call", method) || !assert.True(t, params.IsArray()) { return } arr := params.Array() callArgs := arr[0] if assert.True(t, callArgs.IsObject()) && assert.Equal(t, strings.ToLower(contractAddress.Hex()), callArgs.Get("to").String()) && assert.Equal(t, hexutil.Encode(txData), callArgs.Get("data").String()) && assert.Equal(t, "latest", arr[1].String()) { resp.Result = `"` + hexutil.EncodeBig(test.balance) + `"` } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(tests.Context(t)) require.NoError(t, err) result, err := ethClient.TokenBalance(ctx, userAddress, contractAddress) require.NoError(t, err) assert.Equal(t, test.balance, result) })` $DIR/core/chains/evm/client/chain_client_test.go: `.NewAddress()` $DIR/core/chains/evm/client/chain_client_test.go: `.NewAddress()` $DIR/core/chains/evm/client/chain_client_test.go: `.HexToFunctionSelector(client.BALANCE_OF_ADDRESS_FUNCTION_SELECTOR)` $DIR/core/chains/evm/client/chain_client_test.go: `.ConcatBytes(functionSelector.Bytes(), common.LeftPadBytes(userAddress.Bytes(), utils.EVMWordByteLen))` $DIR/core/chains/evm/client/chain_client_test.go: `.Bytes()` $DIR/core/chains/evm/client/chain_client_test.go: `.LeftPadBytes(userAddress.Bytes(), utils.EVMWordByteLen)` $DIR/core/chains/evm/client/chain_client_test.go: `.Bytes()` $DIR/core/chains/evm/client/chain_client_test.go: `.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return } if !assert.Equal(t, "eth_call", method) || !assert.True(t, params.IsArray()) { return } arr := params.Array() callArgs := arr[0] if assert.True(t, callArgs.IsObject()) && assert.Equal(t, strings.ToLower(contractAddress.Hex()), callArgs.Get("to").String()) && assert.Equal(t, hexutil.Encode(txData), callArgs.Get("data").String()) && assert.Equal(t, "latest", arr[1].String()) { resp.Result = `"` + hexutil.EncodeBig(test.balance) + `"` } return })` $DIR/core/chains/evm/client/chain_client_test.go: `.Array()` $DIR/core/chains/evm/client/chain_client_test.go: `.EncodeBig(test.balance)` $DIR/core/chains/evm/client/chain_client_test.go: `.WSURL()` $DIR/core/chains/evm/client/chain_client_test.go: `.String()` $DIR/core/chains/evm/client/chain_client_test.go: `.Dial(tests.Context(t))` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.TokenBalance(ctx, userAddress, contractAddress)` $DIR/core/chains/evm/client/chain_client_test.go: `.Unmarshal([]byte(input), &receipt)` $DIR/core/chains/evm/client/chain_client_test.go: `.NewInt(1)` $DIR/core/chains/evm/client/chain_client_test.go: `.Int64()` $DIR/core/chains/evm/client/chain_client_test.go: `.Int64()` $DIR/core/chains/evm/client/chain_client_test.go: `.Run(test.name, func(t *testing.T) { wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return } if !assert.Equal(t, "eth_getBlockByNumber", method) || !assert.True(t, params.IsArray()) { return } arr := params.Array() blockNumStr := arr[0].String() var blockNum hexutil.Big err := blockNum.UnmarshalText([]byte(blockNumStr)) if assert.NoError(t, err) && assert.Equal(t, test.expectedRequestBlock, blockNum.ToInt()) && assert.Equal(t, false, arr[1].Bool()) { resp.Result = test.rpcResp } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(tests.Context(t)) require.NoError(t, err) ctx, cancel := context.WithTimeout(tests.Context(t), 5*time.Second) result, err := ethClient.HeadByNumber(ctx, expectedBlockNum) if test.error != nil { require.Error(t, err, test.error) } else { require.NoError(t, err) require.Equal(t, expectedBlockHash, result.Hash.Hex()) require.Equal(t, test.expectedResponseBlock, result.Number) require.Zero(t, testutils.FixtureChainID.Cmp(result.EVMChainID.ToInt())) } cancel() })` $DIR/core/chains/evm/client/chain_client_test.go: `.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return } if !assert.Equal(t, "eth_getBlockByNumber", method) || !assert.True(t, params.IsArray()) { return } arr := params.Array() blockNumStr := arr[0].String() var blockNum hexutil.Big err := blockNum.UnmarshalText([]byte(blockNumStr)) if assert.NoError(t, err) && assert.Equal(t, test.expectedRequestBlock, blockNum.ToInt()) && assert.Equal(t, false, arr[1].Bool()) { resp.Result = test.rpcResp } return })` $DIR/core/chains/evm/client/chain_client_test.go: `.Array()` $DIR/core/chains/evm/client/chain_client_test.go: `.String()` $DIR/core/chains/evm/client/chain_client_test.go: `.UnmarshalText([]byte(blockNumStr))` $DIR/core/chains/evm/client/chain_client_test.go: `.WSURL()` $DIR/core/chains/evm/client/chain_client_test.go: `.String()` $DIR/core/chains/evm/client/chain_client_test.go: `.Dial(tests.Context(t))` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.WithTimeout(tests.Context(t), 5*time.Second)` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.HeadByNumber(ctx, expectedBlockNum)` $DIR/core/chains/evm/client/chain_client_test.go: `.NewLegacyTransaction(uint64(42), testutils.NewAddress(), big.NewInt(142), 242, big.NewInt(342), []byte{1, 2, 3})` $DIR/core/chains/evm/client/chain_client_test.go: `.NewAddress()` $DIR/core/chains/evm/client/chain_client_test.go: `.NewInt(142)` $DIR/core/chains/evm/client/chain_client_test.go: `.NewInt(342)` $DIR/core/chains/evm/client/chain_client_test.go: `.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return } if !assert.Equal(t, "eth_sendRawTransaction", method) { return } resp.Result = `"` + tx.Hash().Hex() + `"` return })` $DIR/core/chains/evm/client/chain_client_test.go: `.Hash()` $DIR/core/chains/evm/client/chain_client_test.go: `.Hex()` $DIR/core/chains/evm/client/chain_client_test.go: `.WSURL()` $DIR/core/chains/evm/client/chain_client_test.go: `.String()` $DIR/core/chains/evm/client/chain_client_test.go: `.Dial(tests.Context(t))` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.SendTransaction(tests.Context(t), tx)` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.NewLegacyTransaction(uint64(42), testutils.NewAddress(), big.NewInt(142), 242, big.NewInt(342), []byte{1, 2, 3})` $DIR/core/chains/evm/client/chain_client_test.go: `.NewAddress()` $DIR/core/chains/evm/client/chain_client_test.go: `.NewInt(142)` $DIR/core/chains/evm/client/chain_client_test.go: `.NewInt(342)` $DIR/core/chains/evm/client/chain_client_test.go: `.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_sendRawTransaction": resp.Result = `"` + tx.Hash().Hex() + `"` } return })` $DIR/core/chains/evm/client/chain_client_test.go: `.Hash()` $DIR/core/chains/evm/client/chain_client_test.go: `.Hex()` $DIR/core/chains/evm/client/chain_client_test.go: `.WSURL()` $DIR/core/chains/evm/client/chain_client_test.go: `.String()` $DIR/core/chains/evm/client/chain_client_test.go: `.NewServer()` $DIR/core/chains/evm/client/chain_client_test.go: `.Cleanup(rpcSrv.Stop)` $DIR/core/chains/evm/client/chain_client_test.go: `.RegisterName("eth", &service)` $DIR/core/chains/evm/client/chain_client_test.go: `.NewServer(rpcSrv)` $DIR/core/chains/evm/client/chain_client_test.go: `.Cleanup(ts.Close)` $DIR/core/chains/evm/client/chain_client_test.go: `.Parse(ts.URL)` $DIR/core/chains/evm/client/chain_client_test.go: `.Dial(tests.Context(t))` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.SendTransaction(tests.Context(t), tx)` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.sentCount.Load()` $DIR/core/chains/evm/client/chain_client_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.NewAddress()` $DIR/core/chains/evm/client/chain_client_test.go: `.NewLegacyTransaction(uint64(42), testutils.NewAddress(), big.NewInt(142), 242, big.NewInt(342), []byte{1, 2, 3})` $DIR/core/chains/evm/client/chain_client_test.go: `.NewAddress()` $DIR/core/chains/evm/client/chain_client_test.go: `.NewInt(142)` $DIR/core/chains/evm/client/chain_client_test.go: `.NewInt(342)` $DIR/core/chains/evm/client/chain_client_test.go: `.Run("returns Fatal error type when error message is fatal", func(t *testing.T) { wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_sendRawTransaction": resp.Result = `"` + tx.Hash().Hex() + `"` resp.Error.Message = "invalid sender" } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(tests.Context(t)) require.NoError(t, err) errType, err := ethClient.SendTransactionReturnCode(tests.Context(t), tx, fromAddress) assert.Error(t, err) assert.Equal(t, errType, commonclient.Fatal) })` $DIR/core/chains/evm/client/chain_client_test.go: `.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_sendRawTransaction": resp.Result = `"` + tx.Hash().Hex() + `"` resp.Error.Message = "invalid sender" } return })` $DIR/core/chains/evm/client/chain_client_test.go: `.Hash()` $DIR/core/chains/evm/client/chain_client_test.go: `.Hex()` $DIR/core/chains/evm/client/chain_client_test.go: `.WSURL()` $DIR/core/chains/evm/client/chain_client_test.go: `.String()` $DIR/core/chains/evm/client/chain_client_test.go: `.Dial(tests.Context(t))` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.SendTransactionReturnCode(tests.Context(t), tx, fromAddress)` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.Run("returns TransactionAlreadyKnown error type when error message is nonce too low", func(t *testing.T) { wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_sendRawTransaction": resp.Result = `"` + tx.Hash().Hex() + `"` resp.Error.Message = "nonce too low" } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(tests.Context(t)) require.NoError(t, err) errType, err := ethClient.SendTransactionReturnCode(tests.Context(t), tx, fromAddress) assert.Error(t, err) assert.Equal(t, errType, commonclient.TransactionAlreadyKnown) })` $DIR/core/chains/evm/client/chain_client_test.go: `.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_sendRawTransaction": resp.Result = `"` + tx.Hash().Hex() + `"` resp.Error.Message = "nonce too low" } return })` $DIR/core/chains/evm/client/chain_client_test.go: `.Hash()` $DIR/core/chains/evm/client/chain_client_test.go: `.Hex()` $DIR/core/chains/evm/client/chain_client_test.go: `.WSURL()` $DIR/core/chains/evm/client/chain_client_test.go: `.String()` $DIR/core/chains/evm/client/chain_client_test.go: `.Dial(tests.Context(t))` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.SendTransactionReturnCode(tests.Context(t), tx, fromAddress)` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.Run("returns Successful error type when there is no error message", func(t *testing.T) { wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_sendRawTransaction": resp.Result = `"` + tx.Hash().Hex() + `"` } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(tests.Context(t)) require.NoError(t, err) errType, err := ethClient.SendTransactionReturnCode(tests.Context(t), tx, fromAddress) assert.NoError(t, err) assert.Equal(t, errType, commonclient.Successful) })` $DIR/core/chains/evm/client/chain_client_test.go: `.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_sendRawTransaction": resp.Result = `"` + tx.Hash().Hex() + `"` } return })` $DIR/core/chains/evm/client/chain_client_test.go: `.Hash()` $DIR/core/chains/evm/client/chain_client_test.go: `.Hex()` $DIR/core/chains/evm/client/chain_client_test.go: `.WSURL()` $DIR/core/chains/evm/client/chain_client_test.go: `.String()` $DIR/core/chains/evm/client/chain_client_test.go: `.Dial(tests.Context(t))` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.SendTransactionReturnCode(tests.Context(t), tx, fromAddress)` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.Run("returns Underpriced error type when transaction is terminally underpriced", func(t *testing.T) { wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_sendRawTransaction": resp.Result = `"` + tx.Hash().Hex() + `"` resp.Error.Message = "transaction underpriced" } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(tests.Context(t)) require.NoError(t, err) errType, err := ethClient.SendTransactionReturnCode(tests.Context(t), tx, fromAddress) assert.Error(t, err) assert.Equal(t, errType, commonclient.Underpriced) })` $DIR/core/chains/evm/client/chain_client_test.go: `.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_sendRawTransaction": resp.Result = `"` + tx.Hash().Hex() + `"` resp.Error.Message = "transaction underpriced" } return })` $DIR/core/chains/evm/client/chain_client_test.go: `.Hash()` $DIR/core/chains/evm/client/chain_client_test.go: `.Hex()` $DIR/core/chains/evm/client/chain_client_test.go: `.WSURL()` $DIR/core/chains/evm/client/chain_client_test.go: `.String()` $DIR/core/chains/evm/client/chain_client_test.go: `.Dial(tests.Context(t))` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.SendTransactionReturnCode(tests.Context(t), tx, fromAddress)` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.Run("returns Unsupported error type when error message is queue full", func(t *testing.T) { wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_sendRawTransaction": resp.Result = `"` + tx.Hash().Hex() + `"` resp.Error.Message = "queue full" } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(tests.Context(t)) require.NoError(t, err) errType, err := ethClient.SendTransactionReturnCode(tests.Context(t), tx, fromAddress) assert.Error(t, err) assert.Equal(t, errType, commonclient.Unsupported) })` $DIR/core/chains/evm/client/chain_client_test.go: `.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_sendRawTransaction": resp.Result = `"` + tx.Hash().Hex() + `"` resp.Error.Message = "queue full" } return })` $DIR/core/chains/evm/client/chain_client_test.go: `.Hash()` $DIR/core/chains/evm/client/chain_client_test.go: `.Hex()` $DIR/core/chains/evm/client/chain_client_test.go: `.WSURL()` $DIR/core/chains/evm/client/chain_client_test.go: `.String()` $DIR/core/chains/evm/client/chain_client_test.go: `.Dial(tests.Context(t))` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.SendTransactionReturnCode(tests.Context(t), tx, fromAddress)` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.Run("returns Retryable error type when there is a transaction gap", func(t *testing.T) { wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_sendRawTransaction": resp.Result = `"` + tx.Hash().Hex() + `"` resp.Error.Message = "NonceGap" } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(tests.Context(t)) require.NoError(t, err) errType, err := ethClient.SendTransactionReturnCode(tests.Context(t), tx, fromAddress) assert.Error(t, err) assert.Equal(t, errType, commonclient.Retryable) })` $DIR/core/chains/evm/client/chain_client_test.go: `.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_sendRawTransaction": resp.Result = `"` + tx.Hash().Hex() + `"` resp.Error.Message = "NonceGap" } return })` $DIR/core/chains/evm/client/chain_client_test.go: `.Hash()` $DIR/core/chains/evm/client/chain_client_test.go: `.Hex()` $DIR/core/chains/evm/client/chain_client_test.go: `.WSURL()` $DIR/core/chains/evm/client/chain_client_test.go: `.String()` $DIR/core/chains/evm/client/chain_client_test.go: `.Dial(tests.Context(t))` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.SendTransactionReturnCode(tests.Context(t), tx, fromAddress)` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.Run("returns InsufficientFunds error type when the sender address doesn't have enough funds", func(t *testing.T) { wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_sendRawTransaction": resp.Result = `"` + tx.Hash().Hex() + `"` resp.Error.Message = "insufficient funds for transfer" } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(tests.Context(t)) require.NoError(t, err) errType, err := ethClient.SendTransactionReturnCode(tests.Context(t), tx, fromAddress) assert.Error(t, err) assert.Equal(t, errType, commonclient.InsufficientFunds) })` $DIR/core/chains/evm/client/chain_client_test.go: `.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_sendRawTransaction": resp.Result = `"` + tx.Hash().Hex() + `"` resp.Error.Message = "insufficient funds for transfer" } return })` $DIR/core/chains/evm/client/chain_client_test.go: `.Hash()` $DIR/core/chains/evm/client/chain_client_test.go: `.Hex()` $DIR/core/chains/evm/client/chain_client_test.go: `.WSURL()` $DIR/core/chains/evm/client/chain_client_test.go: `.String()` $DIR/core/chains/evm/client/chain_client_test.go: `.Dial(tests.Context(t))` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.SendTransactionReturnCode(tests.Context(t), tx, fromAddress)` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.Run("returns ExceedsFeeCap error type when gas price is too high for the node", func(t *testing.T) { wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_sendRawTransaction": resp.Result = `"` + tx.Hash().Hex() + `"` resp.Error.Message = "Transaction fee cap exceeded" } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(tests.Context(t)) require.NoError(t, err) errType, err := ethClient.SendTransactionReturnCode(tests.Context(t), tx, fromAddress) assert.Error(t, err) assert.Equal(t, errType, commonclient.ExceedsMaxFee) })` $DIR/core/chains/evm/client/chain_client_test.go: `.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_sendRawTransaction": resp.Result = `"` + tx.Hash().Hex() + `"` resp.Error.Message = "Transaction fee cap exceeded" } return })` $DIR/core/chains/evm/client/chain_client_test.go: `.Hash()` $DIR/core/chains/evm/client/chain_client_test.go: `.Hex()` $DIR/core/chains/evm/client/chain_client_test.go: `.WSURL()` $DIR/core/chains/evm/client/chain_client_test.go: `.String()` $DIR/core/chains/evm/client/chain_client_test.go: `.Dial(tests.Context(t))` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.SendTransactionReturnCode(tests.Context(t), tx, fromAddress)` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_sendRawTransaction": resp.Result = `"` + tx.Hash().Hex() + `"` resp.Error.Message = "some random error" } return })` $DIR/core/chains/evm/client/chain_client_test.go: `.Hash()` $DIR/core/chains/evm/client/chain_client_test.go: `.Hex()` $DIR/core/chains/evm/client/chain_client_test.go: `.WSURL()` $DIR/core/chains/evm/client/chain_client_test.go: `.String()` $DIR/core/chains/evm/client/chain_client_test.go: `.Dial(tests.Context(t))` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.SendTransactionReturnCode(tests.Context(t), tx, fromAddress)` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.WithTimeout(tests.Context(t), tests.WaitTimeout(t))` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.NewInt(123456)` $DIR/core/chains/evm/client/chain_client_test.go: `.NewWSServer(t, chainId, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { if method == "eth_unsubscribe" { resp.Result = "true" return } assert.Equal(t, "eth_subscribe", method) if assert.True(t, params.IsArray()) && assert.Equal(t, "newHeads", params.Array()[0].String()) { resp.Result = `"0x00"` resp.Notify = headResult } return })` $DIR/core/chains/evm/client/chain_client_test.go: `.WSURL()` $DIR/core/chains/evm/client/chain_client_test.go: `.String()` $DIR/core/chains/evm/client/chain_client_test.go: `.Dial(tests.Context(t))` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.SubscribeNewHead(ctx, headCh)` $DIR/core/chains/evm/client/chain_client_test.go: `.Err()` $DIR/core/chains/evm/client/chain_client_test.go: `.Done()` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.New("something went wrong")` $DIR/core/chains/evm/client/chain_client_test.go: `.EncodeBig(big.NewInt(42))` $DIR/core/chains/evm/client/chain_client_test.go: `.NewInt(42)` $DIR/core/chains/evm/client/chain_client_test.go: `.On("BatchCallContext", mock.Anything, b)` $DIR/core/chains/evm/client/chain_client_test.go: `.Run(func(args mock.Arguments) { reqs := args.Get(1).([]rpc.BatchElem) for i := 0; i < len(reqs); i++ { elem := &reqs[i] elem.Error = rpcError } })` $DIR/core/chains/evm/client/chain_client_test.go: `.Get(1)` $DIR/core/chains/evm/client/chain_client_test.go: `.Return(nil)` $DIR/core/chains/evm/client/chain_client_test.go: `.Once()` $DIR/core/chains/evm/client/chain_client_test.go: `.NewChainClientWithMockedRpc(t, commonclient.NodeSelectionModeRoundRobin, time.Second*0, time.Second*0, testutils.FixtureChainID, mockRpc)` $DIR/core/chains/evm/client/chain_client_test.go: `.Dial(ctx)` $DIR/core/chains/evm/client/chain_client_test.go: `.BatchCallContext(ctx, b)` $DIR/core/chains/evm/client/chain_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/chain_client_test.go: `.NewChainClientWithEmptyNode(t, commonclient.NodeSelectionModeRoundRobin, time.Second*0, time.Second*0, testutils.FixtureChainID)` $DIR/core/chains/evm/client/chain_client_test.go: `.BalanceAt(ctx, common.Address{}, nil)` $DIR/core/chains/evm/client/chain_client_test.go: `.BatchCallContext(ctx, nil)` $DIR/core/chains/evm/client/chain_client_test.go: `.BatchCallContextAll(ctx, nil)` $DIR/core/chains/evm/client/chain_client_test.go: `.BlockByHash(ctx, common.Hash{})` $DIR/core/chains/evm/client/chain_client_test.go: `.BlockByNumber(ctx, nil)` $DIR/core/chains/evm/client/chain_client_test.go: `.CallContext(ctx, nil, "")` $DIR/core/chains/evm/client/chain_client_test.go: `.CallContract(ctx, ethereum.CallMsg{}, nil)` $DIR/core/chains/evm/client/chain_client_test.go: `.ChainID()` $DIR/core/chains/evm/client/chain_client_test.go: `.CodeAt(ctx, common.Address{}, nil)` $DIR/core/chains/evm/client/chain_client_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/client/chain_client_test.go: `.Dial(ctx)` $DIR/core/chains/evm/client/chain_client_test.go: `.EstimateGas(ctx, ethereum.CallMsg{})` $DIR/core/chains/evm/client/chain_client_test.go: `.FilterLogs(ctx, ethereum.FilterQuery{})` $DIR/core/chains/evm/client/chain_client_test.go: `.HeaderByHash(ctx, common.Hash{})` $DIR/core/chains/evm/client/chain_client_test.go: `.HeaderByNumber(ctx, nil)` $DIR/core/chains/evm/client/chain_client_test.go: `.HeadByHash(ctx, common.Hash{})` $DIR/core/chains/evm/client/chain_client_test.go: `.HeadByNumber(ctx, nil)` $DIR/core/chains/evm/client/chain_client_test.go: `.LINKBalance(ctx, common.Address{}, common.Address{})` $DIR/core/chains/evm/client/chain_client_test.go: `.LatestBlockHeight(ctx)` $DIR/core/chains/evm/client/chain_client_test.go: `.PendingCodeAt(ctx, common.Address{})` $DIR/core/chains/evm/client/chain_client_test.go: `.PendingNonceAt(ctx, common.Address{})` $DIR/core/chains/evm/client/chain_client_test.go: `.SendTransaction(ctx, nil)` $DIR/core/chains/evm/client/chain_client_test.go: `.SendTransactionReturnCode(ctx, nil, common.Address{})` $DIR/core/chains/evm/client/chain_client_test.go: `.SequenceAt(ctx, common.Address{}, nil)` $DIR/core/chains/evm/client/chain_client_test.go: `.SubscribeFilterLogs(ctx, ethereum.FilterQuery{}, nil)` $DIR/core/chains/evm/client/chain_client_test.go: `.SubscribeNewHead(ctx, nil)` $DIR/core/chains/evm/client/chain_client_test.go: `.SuggestGasPrice(ctx)` $DIR/core/chains/evm/client/chain_client_test.go: `.SuggestGasTipCap(ctx)` $DIR/core/chains/evm/client/chain_client_test.go: `.TokenBalance(ctx, common.Address{}, common.Address{})` $DIR/core/chains/evm/client/chain_client_test.go: `.TransactionByHash(ctx, common.Hash{})` $DIR/core/chains/evm/client/chain_client_test.go: `.TransactionReceipt(ctx, common.Hash{})` $DIR/core/chains/evm/client/chain_id_sub_test.go: `t.Run("unsubscribe forwarder", func(t *testing.T) { t.Parallel() ch := make(chan *evmtypes.Head) forwarder := newChainIDSubForwarder(chainID, ch) sub := NewMockSubscription() err := forwarder.start(sub, nil) assert.NoError(t, err) forwarder.Unsubscribe() assert.True(t, sub.unsubscribed) _, ok := <-sub.Err() assert.False(t, ok) _, ok = <-forwarder.Err() assert.False(t, ok) })` $DIR/core/chains/evm/client/chain_id_sub_test.go: `forwarder.Unsubscribe()` $DIR/core/chains/evm/client/chain_id_sub_test.go: `_, ok = <-forwarder.Err()` $DIR/core/chains/evm/client/chain_id_sub_test.go: `t.Run("unsubscribe forwarder with error", func(t *testing.T) { t.Parallel() ch := make(chan *evmtypes.Head) forwarder := newChainIDSubForwarder(chainID, ch) sub := NewMockSubscription() err := forwarder.start(sub, nil) assert.NoError(t, err) sub.Errors <- errors.New("boo") forwarder.Unsubscribe() assert.True(t, sub.unsubscribed) _, ok := <-sub.Err() assert.False(t, ok) _, ok = <-forwarder.Err() assert.False(t, ok) })` $DIR/core/chains/evm/client/chain_id_sub_test.go: `sub.Errors <- errors.New("boo")` $DIR/core/chains/evm/client/chain_id_sub_test.go: `forwarder.Unsubscribe()` $DIR/core/chains/evm/client/chain_id_sub_test.go: `_, ok = <-forwarder.Err()` $DIR/core/chains/evm/client/chain_id_sub_test.go: `t.Run("unsubscribe forwarder with message", func(t *testing.T) { t.Parallel() ch := make(chan *evmtypes.Head) forwarder := newChainIDSubForwarder(chainID, ch) sub := NewMockSubscription() err := forwarder.start(sub, nil) assert.NoError(t, err) forwarder.srcCh <- &evmtypes.Head{} forwarder.Unsubscribe() assert.True(t, sub.unsubscribed) _, ok := <-sub.Err() assert.False(t, ok) _, ok = <-forwarder.Err() assert.False(t, ok) })` $DIR/core/chains/evm/client/chain_id_sub_test.go: `forwarder.srcCh <- &evmtypes.Head{}` $DIR/core/chains/evm/client/chain_id_sub_test.go: `forwarder.Unsubscribe()` $DIR/core/chains/evm/client/chain_id_sub_test.go: `_, ok = <-forwarder.Err()` $DIR/core/chains/evm/client/chain_id_sub_test.go: `t.Run("non nil error parameter", func(t *testing.T) { t.Parallel() ch := make(chan *evmtypes.Head) forwarder := newChainIDSubForwarder(chainID, ch) sub := NewMockSubscription() errIn := errors.New("foo") errOut := forwarder.start(sub, errIn) assert.Equal(t, errIn, errOut) })` $DIR/core/chains/evm/client/chain_id_sub_test.go: `forwarder.srcCh <- head` $DIR/core/chains/evm/client/chain_id_sub_test.go: `sub.Errors <- expectedErr` $DIR/core/chains/evm/client/chain_id_sub_test.go: `.NewInt(123)` $DIR/core/chains/evm/client/chain_id_sub_test.go: `.Run("unsubscribe forwarder", func(t *testing.T) { t.Parallel() ch := make(chan *evmtypes.Head) forwarder := newChainIDSubForwarder(chainID, ch) sub := NewMockSubscription() err := forwarder.start(sub, nil) assert.NoError(t, err) forwarder.Unsubscribe() assert.True(t, sub.unsubscribed) _, ok := <-sub.Err() assert.False(t, ok) _, ok = <-forwarder.Err() assert.False(t, ok) })` $DIR/core/chains/evm/client/chain_id_sub_test.go: `.start(sub, nil)` $DIR/core/chains/evm/client/chain_id_sub_test.go: `.Unsubscribe()` $DIR/core/chains/evm/client/chain_id_sub_test.go: `.Err()` $DIR/core/chains/evm/client/chain_id_sub_test.go: `.Err()` $DIR/core/chains/evm/client/chain_id_sub_test.go: `.Run("unsubscribe forwarder with error", func(t *testing.T) { t.Parallel() ch := make(chan *evmtypes.Head) forwarder := newChainIDSubForwarder(chainID, ch) sub := NewMockSubscription() err := forwarder.start(sub, nil) assert.NoError(t, err) sub.Errors <- errors.New("boo") forwarder.Unsubscribe() assert.True(t, sub.unsubscribed) _, ok := <-sub.Err() assert.False(t, ok) _, ok = <-forwarder.Err() assert.False(t, ok) })` $DIR/core/chains/evm/client/chain_id_sub_test.go: `.start(sub, nil)` $DIR/core/chains/evm/client/chain_id_sub_test.go: `.New("boo")` $DIR/core/chains/evm/client/chain_id_sub_test.go: `.Unsubscribe()` $DIR/core/chains/evm/client/chain_id_sub_test.go: `.Err()` $DIR/core/chains/evm/client/chain_id_sub_test.go: `.Err()` $DIR/core/chains/evm/client/chain_id_sub_test.go: `.Run("unsubscribe forwarder with message", func(t *testing.T) { t.Parallel() ch := make(chan *evmtypes.Head) forwarder := newChainIDSubForwarder(chainID, ch) sub := NewMockSubscription() err := forwarder.start(sub, nil) assert.NoError(t, err) forwarder.srcCh <- &evmtypes.Head{} forwarder.Unsubscribe() assert.True(t, sub.unsubscribed) _, ok := <-sub.Err() assert.False(t, ok) _, ok = <-forwarder.Err() assert.False(t, ok) })` $DIR/core/chains/evm/client/chain_id_sub_test.go: `.start(sub, nil)` $DIR/core/chains/evm/client/chain_id_sub_test.go: `.Unsubscribe()` $DIR/core/chains/evm/client/chain_id_sub_test.go: `.Err()` $DIR/core/chains/evm/client/chain_id_sub_test.go: `.Err()` $DIR/core/chains/evm/client/chain_id_sub_test.go: `.Run("non nil error parameter", func(t *testing.T) { t.Parallel() ch := make(chan *evmtypes.Head) forwarder := newChainIDSubForwarder(chainID, ch) sub := NewMockSubscription() errIn := errors.New("foo") errOut := forwarder.start(sub, errIn) assert.Equal(t, errIn, errOut) })` $DIR/core/chains/evm/client/chain_id_sub_test.go: `.New("foo")` $DIR/core/chains/evm/client/chain_id_sub_test.go: `.start(sub, errIn)` $DIR/core/chains/evm/client/chain_id_sub_test.go: `.start(sub, nil)` $DIR/core/chains/evm/client/chain_id_sub_test.go: `.New("error")` $DIR/core/chains/evm/client/chain_id_sub_test.go: `.Err()` $DIR/core/chains/evm/client/config_builder_test.go: `t.Run("parsing unique node configs succeeds", func(t *testing.T) { nodeConfigs := []client.NodeConfig{ { Name: ptr("foo1"), WSURL: ptr("ws://foo1.test"), HTTPURL: ptr("http://foo1.test"), }, { Name: ptr("foo2"), WSURL: ptr("ws://foo2.test"), HTTPURL: ptr("http://foo2.test"), }, } tomlNodes, err := client.ParseTestNodeConfigs(nodeConfigs) require.NoError(t, err) require.Len(t, tomlNodes, len(nodeConfigs)) })` $DIR/core/chains/evm/client/config_builder_test.go: `t.Run("parsing missing ws url fails", func(t *testing.T) { nodeConfigs := []client.NodeConfig{ { Name: ptr("foo1"), HTTPURL: ptr("http://foo1.test"), }, } _, err := client.ParseTestNodeConfigs(nodeConfigs) require.Error(t, err) })` $DIR/core/chains/evm/client/config_builder_test.go: `t.Run("parsing missing http url fails", func(t *testing.T) { nodeConfigs := []client.NodeConfig{ { Name: ptr("foo1"), WSURL: ptr("ws://foo1.test"), }, } _, err := client.ParseTestNodeConfigs(nodeConfigs) require.Error(t, err) })` $DIR/core/chains/evm/client/config_builder_test.go: `t.Run("parsing invalid ws url fails", func(t *testing.T) { nodeConfigs := []client.NodeConfig{ { Name: ptr("foo1"), WSURL: ptr("http://foo1.test"), HTTPURL: ptr("http://foo1.test"), }, } _, err := client.ParseTestNodeConfigs(nodeConfigs) require.Error(t, err) })` $DIR/core/chains/evm/client/config_builder_test.go: `t.Run("parsing duplicate http url fails", func(t *testing.T) { nodeConfigs := []client.NodeConfig{ { Name: ptr("foo1"), WSURL: ptr("ws://foo1.test"), HTTPURL: ptr("ws://foo1.test"), }, } _, err := client.ParseTestNodeConfigs(nodeConfigs) require.Error(t, err) })` $DIR/core/chains/evm/client/config_builder_test.go: `t.Run("parsing duplicate node names fails", func(t *testing.T) { nodeConfigs := []client.NodeConfig{ { Name: ptr("foo1"), WSURL: ptr("ws://foo1.test"), HTTPURL: ptr("http://foo1.test"), }, { Name: ptr("foo1"), WSURL: ptr("ws://foo2.test"), HTTPURL: ptr("http://foo2.test"), }, } _, err := client.ParseTestNodeConfigs(nodeConfigs) require.Error(t, err) })` $DIR/core/chains/evm/client/config_builder_test.go: `t.Run("parsing duplicate node ws urls fails", func(t *testing.T) { nodeConfigs := []client.NodeConfig{ { Name: ptr("foo1"), WSURL: ptr("ws://foo1.test"), HTTPURL: ptr("http://foo1.test"), }, { Name: ptr("foo2"), WSURL: ptr("ws://foo2.test"), HTTPURL: ptr("http://foo1.test"), }, } _, err := client.ParseTestNodeConfigs(nodeConfigs) require.Error(t, err) })` $DIR/core/chains/evm/client/config_builder_test.go: `t.Run("parsing duplicate node http urls fails", func(t *testing.T) { nodeConfigs := []client.NodeConfig{ { Name: ptr("foo1"), WSURL: ptr("ws://foo1.test"), HTTPURL: ptr("http://foo1.test"), }, { Name: ptr("foo2"), WSURL: ptr("ws://foo1.test"), HTTPURL: ptr("http://foo2.test"), }, } _, err := client.ParseTestNodeConfigs(nodeConfigs) require.Error(t, err) })` $DIR/core/chains/evm/client/config_builder_test.go: `.NewClientConfigs(selectionMode, leaseDuration, chainTypeStr, nodeConfigs, pollFailureThreshold, pollInterval, syncThreshold, nodeIsSyncingEnabled, noNewHeadsThreshold, finalityDepth, finalityTagEnabled)` $DIR/core/chains/evm/client/config_builder_test.go: `.NewEvmClient(nodePool, chainCfg, nil, logger.Test(t), big.NewInt(10), nodes, chaintype.ChainType(chainTypeStr))` $DIR/core/chains/evm/client/config_builder_test.go: `.Test(t)` $DIR/core/chains/evm/client/config_builder_test.go: `.NewInt(10)` $DIR/core/chains/evm/client/config_builder_test.go: `.ChainType(chainTypeStr)` $DIR/core/chains/evm/client/config_builder_test.go: `.Run("parsing unique node configs succeeds", func(t *testing.T) { nodeConfigs := []client.NodeConfig{ { Name: ptr("foo1"), WSURL: ptr("ws://foo1.test"), HTTPURL: ptr("http://foo1.test"), }, { Name: ptr("foo2"), WSURL: ptr("ws://foo2.test"), HTTPURL: ptr("http://foo2.test"), }, } tomlNodes, err := client.ParseTestNodeConfigs(nodeConfigs) require.NoError(t, err) require.Len(t, tomlNodes, len(nodeConfigs)) })` $DIR/core/chains/evm/client/config_builder_test.go: `.ParseTestNodeConfigs(nodeConfigs)` $DIR/core/chains/evm/client/config_builder_test.go: `.Run("parsing missing ws url fails", func(t *testing.T) { nodeConfigs := []client.NodeConfig{ { Name: ptr("foo1"), HTTPURL: ptr("http://foo1.test"), }, } _, err := client.ParseTestNodeConfigs(nodeConfigs) require.Error(t, err) })` $DIR/core/chains/evm/client/config_builder_test.go: `.ParseTestNodeConfigs(nodeConfigs)` $DIR/core/chains/evm/client/config_builder_test.go: `.Run("parsing missing http url fails", func(t *testing.T) { nodeConfigs := []client.NodeConfig{ { Name: ptr("foo1"), WSURL: ptr("ws://foo1.test"), }, } _, err := client.ParseTestNodeConfigs(nodeConfigs) require.Error(t, err) })` $DIR/core/chains/evm/client/config_builder_test.go: `.ParseTestNodeConfigs(nodeConfigs)` $DIR/core/chains/evm/client/config_builder_test.go: `.Run("parsing invalid ws url fails", func(t *testing.T) { nodeConfigs := []client.NodeConfig{ { Name: ptr("foo1"), WSURL: ptr("http://foo1.test"), HTTPURL: ptr("http://foo1.test"), }, } _, err := client.ParseTestNodeConfigs(nodeConfigs) require.Error(t, err) })` $DIR/core/chains/evm/client/config_builder_test.go: `.ParseTestNodeConfigs(nodeConfigs)` $DIR/core/chains/evm/client/config_builder_test.go: `.Run("parsing duplicate http url fails", func(t *testing.T) { nodeConfigs := []client.NodeConfig{ { Name: ptr("foo1"), WSURL: ptr("ws://foo1.test"), HTTPURL: ptr("ws://foo1.test"), }, } _, err := client.ParseTestNodeConfigs(nodeConfigs) require.Error(t, err) })` $DIR/core/chains/evm/client/config_builder_test.go: `.ParseTestNodeConfigs(nodeConfigs)` $DIR/core/chains/evm/client/config_builder_test.go: `.Run("parsing duplicate node names fails", func(t *testing.T) { nodeConfigs := []client.NodeConfig{ { Name: ptr("foo1"), WSURL: ptr("ws://foo1.test"), HTTPURL: ptr("http://foo1.test"), }, { Name: ptr("foo1"), WSURL: ptr("ws://foo2.test"), HTTPURL: ptr("http://foo2.test"), }, } _, err := client.ParseTestNodeConfigs(nodeConfigs) require.Error(t, err) })` $DIR/core/chains/evm/client/config_builder_test.go: `.ParseTestNodeConfigs(nodeConfigs)` $DIR/core/chains/evm/client/config_builder_test.go: `.Run("parsing duplicate node ws urls fails", func(t *testing.T) { nodeConfigs := []client.NodeConfig{ { Name: ptr("foo1"), WSURL: ptr("ws://foo1.test"), HTTPURL: ptr("http://foo1.test"), }, { Name: ptr("foo2"), WSURL: ptr("ws://foo2.test"), HTTPURL: ptr("http://foo1.test"), }, } _, err := client.ParseTestNodeConfigs(nodeConfigs) require.Error(t, err) })` $DIR/core/chains/evm/client/config_builder_test.go: `.ParseTestNodeConfigs(nodeConfigs)` $DIR/core/chains/evm/client/config_builder_test.go: `.Run("parsing duplicate node http urls fails", func(t *testing.T) { nodeConfigs := []client.NodeConfig{ { Name: ptr("foo1"), WSURL: ptr("ws://foo1.test"), HTTPURL: ptr("http://foo1.test"), }, { Name: ptr("foo2"), WSURL: ptr("ws://foo1.test"), HTTPURL: ptr("http://foo2.test"), }, } _, err := client.ParseTestNodeConfigs(nodeConfigs) require.Error(t, err) })` $DIR/core/chains/evm/client/config_builder_test.go: `.ParseTestNodeConfigs(nodeConfigs)` $DIR/core/chains/evm/client/config_builder_test.go: `.ParseTestNodeConfigs(nodeConfigs)` $DIR/core/chains/evm/client/errors_test.go: `t.Run("IsNonceTooLowError", func(t *testing.T) { tests := []errorCase{ {"nonce too low", true, "Geth"}, {"nonce too low: address 0x336394A3219e71D9d9bd18201d34E95C1Bb7122C, tx: 8089 state: 8090", true, "Arbitrum"}, {"Nonce too low", true, "Besu"}, {"nonce too low", true, "Erigon"}, {"nonce too low", true, "Klaytn"}, {"Transaction nonce is too low. Try incrementing the nonce.", true, "Parity"}, {"transaction rejected: nonce too low", true, "Arbitrum"}, {"invalid transaction nonce", true, "Arbitrum"}, {"call failed: nonce too low: address 0x0499BEA33347cb62D79A9C0b1EDA01d8d329894c current nonce (5833) > tx nonce (5511)", true, "Avalanche"}, {"call failed: OldNonce", true, "Nethermind"}, {"call failed: OldNonce, Current nonce: 22, nonce of rejected tx: 17", true, "Nethermind"}, {"nonce too low. allowed nonce range: 427 - 447, actual: 426", true, "zkSync"}, {"client error nonce too low", true, "tomlConfig"}, } for _, test := range tests { t.Run(test.network, func(t *testing.T) { err = evmclient.NewSendErrorS(test.message) assert.Equal(t, err.IsNonceTooLowError(clientErrors), test.expect) err = newSendErrorWrapped(test.message) assert.Equal(t, err.IsNonceTooLowError(clientErrors), test.expect) }) } })` $DIR/core/chains/evm/client/errors_test.go: `t.Run(test.network, func(t *testing.T) { err = evmclient.NewSendErrorS(test.message) assert.Equal(t, err.IsNonceTooLowError(clientErrors), test.expect) err = newSendErrorWrapped(test.message) assert.Equal(t, err.IsNonceTooLowError(clientErrors), test.expect) })` $DIR/core/chains/evm/client/errors_test.go: `err = evmclient.NewSendErrorS(test.message)` $DIR/core/chains/evm/client/errors_test.go: `err = newSendErrorWrapped(test.message)` $DIR/core/chains/evm/client/errors_test.go: `t.Run("IsNonceTooHigh", func(t *testing.T) { tests := []errorCase{ {"call failed: NonceGap", true, "Nethermind"}, {"call failed: NonceGap, Future nonce. Expected nonce: 10", true, "Nethermind"}, {"nonce too high: address 0x336394A3219e71D9d9bd18201d34E95C1Bb7122C, tx: 8089 state: 8090", true, "Arbitrum"}, {"nonce too high", true, "Geth"}, {"nonce too high", true, "Erigon"}, {"nonce too high. allowed nonce range: 427 - 477, actual: 527", true, "zkSync"}, {"client error nonce too high", true, "tomlConfig"}, } for _, test := range tests { err = evmclient.NewSendErrorS(test.message) assert.Equal(t, err.IsNonceTooHighError(clientErrors), test.expect) err = newSendErrorWrapped(test.message) assert.Equal(t, err.IsNonceTooHighError(clientErrors), test.expect) } })` $DIR/core/chains/evm/client/errors_test.go: `err = evmclient.NewSendErrorS(test.message)` $DIR/core/chains/evm/client/errors_test.go: `err = newSendErrorWrapped(test.message)` $DIR/core/chains/evm/client/errors_test.go: `t.Run("IsTransactionAlreadyMined", func(t *testing.T) { assert.False(t, randomError.IsTransactionAlreadyMined(clientErrors)) tests := []errorCase{ {"transaction already finalized", true, "Harmony"}, {"client error transaction already mined", true, "tomlConfig"}, } for _, test := range tests { t.Run(test.network, func(t *testing.T) { err = evmclient.NewSendErrorS(test.message) assert.Equal(t, err.IsTransactionAlreadyMined(clientErrors), test.expect) err = newSendErrorWrapped(test.message) assert.Equal(t, err.IsTransactionAlreadyMined(clientErrors), test.expect) }) } })` $DIR/core/chains/evm/client/errors_test.go: `t.Run(test.network, func(t *testing.T) { err = evmclient.NewSendErrorS(test.message) assert.Equal(t, err.IsTransactionAlreadyMined(clientErrors), test.expect) err = newSendErrorWrapped(test.message) assert.Equal(t, err.IsTransactionAlreadyMined(clientErrors), test.expect) })` $DIR/core/chains/evm/client/errors_test.go: `err = evmclient.NewSendErrorS(test.message)` $DIR/core/chains/evm/client/errors_test.go: `err = newSendErrorWrapped(test.message)` $DIR/core/chains/evm/client/errors_test.go: `t.Run("IsReplacementUnderpriced", func(t *testing.T) { tests := []errorCase{ {"replacement transaction underpriced", true, "geth"}, {"Replacement transaction underpriced", true, "Besu"}, {"replacement transaction underpriced", true, "Erigon"}, {"replacement transaction underpriced", true, "Klaytn"}, {"there is another tx which has the same nonce in the tx pool", true, "Klaytn"}, {"Transaction gas price 100wei is too low. There is another transaction with same nonce in the queue with gas price 150wei. Try increasing the gas price or incrementing the nonce.", true, "Parity"}, {"There are too many transactions in the queue. Your transaction was dropped due to limit. Try increasing the fee.", false, "Parity"}, {"gas price too low", false, "Arbitrum"}, {"client error replacement underpriced", true, "tomlConfig"}, {"", false, "tomlConfig"}, } for _, test := range tests { err = evmclient.NewSendErrorS(test.message) assert.Equal(t, err.IsReplacementUnderpriced(clientErrors), test.expect) err = newSendErrorWrapped(test.message) assert.Equal(t, err.IsReplacementUnderpriced(clientErrors), test.expect) } })` $DIR/core/chains/evm/client/errors_test.go: `err = evmclient.NewSendErrorS(test.message)` $DIR/core/chains/evm/client/errors_test.go: `err = newSendErrorWrapped(test.message)` $DIR/core/chains/evm/client/errors_test.go: `t.Run("IsTransactionAlreadyInMempool", func(t *testing.T) { assert.False(t, randomError.IsTransactionAlreadyInMempool(clientErrors)) tests := []errorCase{ // I have seen this in log output {"known transaction: 0x7f657507aee0511e36d2d1972a6b22e917cc89f92b6c12c4dbd57eaabb236960", true, "Geth"}, // This comes from the geth source - https://github.com/ethereum/go-ethereum/blob/eb9d7d15ecf08cd5104e01a8af64489f01f700b0/core/tx_pool.go#L57 {"already known", true, "Geth"}, // This one is present in the light client (?!) {"Known transaction (7f65)", true, "Geth"}, {"Known transaction", true, "Besu"}, {"already known", true, "Erigon"}, {"block already known", true, "Erigon"}, {"Transaction with the same hash was already imported.", true, "Parity"}, {"call failed: AlreadyKnown", true, "Nethermind"}, {"call failed: OwnNonceAlreadyUsed", true, "Nethermind"}, {"known transaction", true, "Klaytn"}, {"known transaction. transaction with hash 0x6013…3053 is already in the system", true, "zkSync"}, // This seems to be an erroneous message from the zkSync client, we'll have to match it anyway {"ErrorObject { code: ServerError(3), message: \\\"known transaction. transaction with hash 0xf016…ad63 is already in the system\\\", data: Some(RawValue(\\\"0x\\\")) }", true, "zkSync"}, {"client error transaction already in mempool", true, "tomlConfig"}, } for _, test := range tests { err = evmclient.NewSendErrorS(test.message) assert.Equal(t, err.IsTransactionAlreadyInMempool(clientErrors), test.expect) err = newSendErrorWrapped(test.message) assert.Equal(t, err.IsTransactionAlreadyInMempool(clientErrors), test.expect) } })` $DIR/core/chains/evm/client/errors_test.go: `err = evmclient.NewSendErrorS(test.message)` $DIR/core/chains/evm/client/errors_test.go: `err = newSendErrorWrapped(test.message)` $DIR/core/chains/evm/client/errors_test.go: `t.Run("IsTerminallyUnderpriced", func(t *testing.T) { assert.False(t, randomError.IsTerminallyUnderpriced(clientErrors)) tests := []errorCase{ {"transaction underpriced", true, "geth"}, {"replacement transaction underpriced", false, "geth"}, {"Gas price below configured minimum gas price", true, "Besu"}, {"transaction underpriced", true, "Erigon"}, {"There are too many transactions in the queue. Your transaction was dropped due to limit. Try increasing the fee.", false, "Parity"}, {"Transaction gas price is too low. It does not satisfy your node's minimal gas price (minimal: 100 got: 50). Try increasing the gas price.", true, "Parity"}, {"gas price too low", true, "Arbitrum"}, {"FeeTooLow", true, "Nethermind"}, {"FeeTooLow, MaxFeePerGas too low. MaxFeePerGas: 50, BaseFee: 100, MaxPriorityFeePerGas:200, Block number: 5", true, "Nethermind"}, {"FeeTooLow, EffectivePriorityFeePerGas too low 10 < 20, BaseFee: 30", true, "Nethermind"}, {"FeeTooLow, FeePerGas needs to be higher than 100 to be added to the TxPool. Affordable FeePerGas of rejected tx: 50.", true, "Nethermind"}, {"FeeTooLowToCompete", true, "Nethermind"}, {"transaction underpriced", true, "Klaytn"}, {"intrinsic gas too low", true, "Klaytn"}, {"max fee per gas less than block base fee", true, "zkSync"}, {"virtual machine entered unexpected state. please contact developers and provide transaction details that caused this error. Error description: The operator included transaction with an unacceptable gas price", true, "zkSync"}, {"client error terminally underpriced", true, "tomlConfig"}, } for _, test := range tests { err = evmclient.NewSendErrorS(test.message) assert.Equal(t, err.IsTerminallyUnderpriced(clientErrors), test.expect, "expected %q to match %s for client %s", err, "IsTerminallyUnderpriced", test.network) err = newSendErrorWrapped(test.message) assert.Equal(t, err.IsTerminallyUnderpriced(clientErrors), test.expect, "expected %q to match %s for client %s", err, "IsTerminallyUnderpriced", test.network) } })` $DIR/core/chains/evm/client/errors_test.go: `err = evmclient.NewSendErrorS(test.message)` $DIR/core/chains/evm/client/errors_test.go: `err = newSendErrorWrapped(test.message)` $DIR/core/chains/evm/client/errors_test.go: `t.Run("IsTemporarilyUnderpriced", func(t *testing.T) { tests := []errorCase{ {"There are too many transactions in the queue. Your transaction was dropped due to limit. Try increasing the fee.", true, "Parity"}, {"There are too many transactions in the queue. Your transaction was dropped due to limit. Try increasing the fee.", true, "Parity"}, {"Transaction gas price is too low. It does not satisfy your node's minimal gas price (minimal: 100 got: 50). Try increasing the gas price.", false, "Parity"}, {"client error transaction underpriced", false, "tomlConfig"}, } for _, test := range tests { err = evmclient.NewSendErrorS(test.message) assert.Equal(t, err.IsTemporarilyUnderpriced(clientErrors), test.expect) err = newSendErrorWrapped(test.message) assert.Equal(t, err.IsTemporarilyUnderpriced(clientErrors), test.expect) } })` $DIR/core/chains/evm/client/errors_test.go: `err = evmclient.NewSendErrorS(test.message)` $DIR/core/chains/evm/client/errors_test.go: `err = newSendErrorWrapped(test.message)` $DIR/core/chains/evm/client/errors_test.go: `t.Run("IsInsufficientEth", func(t *testing.T) { tests := []errorCase{ {"insufficient funds for transfer", true, "Geth"}, {"insufficient funds for gas * price + value", true, "Geth"}, {"insufficient balance for transfer", true, "Geth"}, {"Upfront cost exceeds account balance", true, "Besu"}, {"insufficient funds for transfer", true, "Erigon"}, {"insufficient funds for gas * price + value", true, "Erigon"}, {"insufficient balance for transfer", true, "Erigon"}, {"Insufficient balance for transaction. Balance=100.25, Cost=200.50", true, "Parity"}, {"Insufficient funds. The account you tried to send transaction from does not have enough funds. Required 200.50 and got: 100.25.", true, "Parity"}, {"transaction rejected: insufficient funds for gas * price + value", true, "Arbitrum"}, {"not enough funds for gas", true, "Arbitrum"}, {"insufficient funds for gas * price + value: address 0xb68D832c1241bc50db1CF09e96c0F4201D5539C9 have 9934612900000000 want 9936662900000000", true, "Arbitrum"}, {"call failed: InsufficientFunds", true, "Nethermind"}, {"call failed: InsufficientFunds, Account balance: 4740799397601480913, cumulative cost: 22019342038993800000", true, "Nethermind"}, {"call failed: InsufficientFunds, Balance is 1092404690719251702 less than sending value + gas 7165512000464000000", true, "Nethermind"}, {"insufficient funds", true, "Klaytn"}, {"insufficient funds for gas * price + value + gatewayFee", true, "celo"}, {"insufficient balance for transfer", true, "zkSync"}, {"insufficient funds for gas + value. balance: 42719769622667482000, fee: 48098250000000, value: 42719769622667482000", true, "celo"}, {"client error insufficient eth", true, "tomlConfig"}, {"transaction would cause overdraft", true, "Geth"}, } for _, test := range tests { err = evmclient.NewSendErrorS(test.message) assert.Equal(t, err.IsInsufficientEth(clientErrors), test.expect) err = newSendErrorWrapped(test.message) assert.Equal(t, err.IsInsufficientEth(clientErrors), test.expect) } })` $DIR/core/chains/evm/client/errors_test.go: `err = evmclient.NewSendErrorS(test.message)` $DIR/core/chains/evm/client/errors_test.go: `err = newSendErrorWrapped(test.message)` $DIR/core/chains/evm/client/errors_test.go: `t.Run("IsServiceUnavailable", func(t *testing.T) { tests := []errorCase{ {"call failed: 503 Service Unavailable: \r\n503 Service Temporarily Unavailable\r\n\r\n

503 Service Temporarily Unavailable

\r\n\r\n\r\n", true, "Nethermind"}, {"call failed: 502 Bad Gateway: \r\n502 Bad Gateway\r\n\r\n

502 Bad Gateway

\r\n
", true, "Arbitrum"}, {"client error service unavailable", true, "tomlConfig"}, } for _, test := range tests { err = evmclient.NewSendErrorS(test.message) assert.Equal(t, err.IsServiceUnavailable(clientErrors), test.expect) err = newSendErrorWrapped(test.message) assert.Equal(t, err.IsServiceUnavailable(clientErrors), test.expect) } })` $DIR/core/chains/evm/client/errors_test.go: `err = evmclient.NewSendErrorS(test.message)` $DIR/core/chains/evm/client/errors_test.go: `err = newSendErrorWrapped(test.message)` $DIR/core/chains/evm/client/errors_test.go: `t.Run("IsTxFeeExceedsCap", func(t *testing.T) { tests := []errorCase{ {"tx fee (1.10 ether) exceeds the configured cap (1.00 ether)", true, "geth"}, {"tx fee (1.10 FTM) exceeds the configured cap (1.00 FTM)", true, "geth"}, {"tx fee (1.10 foocoin) exceeds the configured cap (1.00 foocoin)", true, "geth"}, {"Transaction fee cap exceeded", true, "Besu"}, {"tx fee (1.10 ether) exceeds the configured cap (1.00 ether)", true, "Erigon"}, {"invalid gas fee cap", true, "Klaytn"}, {"max fee per gas higher than max priority fee per gas", true, "Klaytn"}, {"tx fee (1.10 of currency celo) exceeds the configured cap (1.00 celo)", true, "celo"}, {"max priority fee per gas higher than max fee per gas", true, "zkSync"}, {"client error tx fee exceeds cap", true, "tomlConfig"}, } for _, test := range tests { err = evmclient.NewSendErrorS(test.message) assert.Equal(t, err.IsTxFeeExceedsCap(clientErrors), test.expect) err = newSendErrorWrapped(test.message) assert.Equal(t, err.IsTxFeeExceedsCap(clientErrors), test.expect) } assert.False(t, randomError.IsTxFeeExceedsCap(clientErrors)) // Nil err = evmclient.NewSendError(nil) assert.False(t, err.IsTxFeeExceedsCap(clientErrors)) })` $DIR/core/chains/evm/client/errors_test.go: `err = evmclient.NewSendErrorS(test.message)` $DIR/core/chains/evm/client/errors_test.go: `err = newSendErrorWrapped(test.message)` $DIR/core/chains/evm/client/errors_test.go: `err = evmclient.NewSendError(nil)` $DIR/core/chains/evm/client/errors_test.go: `t.Run("L2 Fees errors", func(t *testing.T) { err = evmclient.NewSendErrorS("max fee per gas less than block base fee") assert.False(t, err.IsL2FeeTooHigh(clientErrors)) assert.True(t, err.L2FeeTooLow(clientErrors)) err = newSendErrorWrapped("max fee per gas less than block base fee") assert.False(t, err.IsL2FeeTooHigh(clientErrors)) assert.True(t, err.L2FeeTooLow(clientErrors)) err = evmclient.NewSendErrorS("queue full") assert.True(t, err.IsL2Full(clientErrors)) err = evmclient.NewSendErrorS("sequencer pending tx pool full, please try again") assert.True(t, err.IsL2Full(clientErrors)) assert.False(t, randomError.IsL2FeeTooHigh(clientErrors)) assert.False(t, randomError.L2FeeTooLow(clientErrors)) // Nil err = evmclient.NewSendError(nil) assert.False(t, err.IsL2FeeTooHigh(clientErrors)) assert.False(t, err.L2FeeTooLow(clientErrors)) })` $DIR/core/chains/evm/client/errors_test.go: `err = evmclient.NewSendErrorS("max fee per gas less than block base fee")` $DIR/core/chains/evm/client/errors_test.go: `err = newSendErrorWrapped("max fee per gas less than block base fee")` $DIR/core/chains/evm/client/errors_test.go: `err = evmclient.NewSendErrorS("queue full")` $DIR/core/chains/evm/client/errors_test.go: `err = evmclient.NewSendErrorS("sequencer pending tx pool full, please try again")` $DIR/core/chains/evm/client/errors_test.go: `err = evmclient.NewSendError(nil)` $DIR/core/chains/evm/client/errors_test.go: `t.Run("Metis gas price errors", func(t *testing.T) { err := evmclient.NewSendErrorS("primary websocket (wss://ws-mainnet.metis.io) call failed: gas price too low: 18000000000 wei, use at least tx.gasPrice = 19500000000 wei") assert.True(t, err.L2FeeTooLow(clientErrors)) err = newSendErrorWrapped("primary websocket (wss://ws-mainnet.metis.io) call failed: gas price too low: 18000000000 wei, use at least tx.gasPrice = 19500000000 wei") assert.True(t, err.L2FeeTooLow(clientErrors)) assert.False(t, randomError.L2FeeTooLow(clientErrors)) // Nil err = evmclient.NewSendError(nil) assert.False(t, err.L2FeeTooLow(clientErrors)) })` $DIR/core/chains/evm/client/errors_test.go: `err = newSendErrorWrapped("primary websocket (wss://ws-mainnet.metis.io) call failed: gas price too low: 18000000000 wei, use at least tx.gasPrice = 19500000000 wei")` $DIR/core/chains/evm/client/errors_test.go: `err = evmclient.NewSendError(nil)` $DIR/core/chains/evm/client/errors_test.go: `err = evmclient.NewSendErrorS("primary http (http://***REDACTED***:9933) call failed: submit transaction to pool failed: Pool(AlreadyImported)")` $DIR/core/chains/evm/client/errors_test.go: `t.Run(test.message, func(t *testing.T) { err := evmclient.NewSendError(pkgerrors.New(test.message)) assert.Equal(t, test.expect, err.Fatal(clientErrors)) })` $DIR/core/chains/evm/client/errors_test.go: `.NewSendErrorS("some old bollocks")` $DIR/core/chains/evm/client/errors_test.go: `.NewTestClientErrors()` $DIR/core/chains/evm/client/errors_test.go: `.ClientErrorRegexes(&testErrors)` $DIR/core/chains/evm/client/errors_test.go: `.Run("IsNonceTooLowError", func(t *testing.T) { tests := []errorCase{ {"nonce too low", true, "Geth"}, {"nonce too low: address 0x336394A3219e71D9d9bd18201d34E95C1Bb7122C, tx: 8089 state: 8090", true, "Arbitrum"}, {"Nonce too low", true, "Besu"}, {"nonce too low", true, "Erigon"}, {"nonce too low", true, "Klaytn"}, {"Transaction nonce is too low. Try incrementing the nonce.", true, "Parity"}, {"transaction rejected: nonce too low", true, "Arbitrum"}, {"invalid transaction nonce", true, "Arbitrum"}, {"call failed: nonce too low: address 0x0499BEA33347cb62D79A9C0b1EDA01d8d329894c current nonce (5833) > tx nonce (5511)", true, "Avalanche"}, {"call failed: OldNonce", true, "Nethermind"}, {"call failed: OldNonce, Current nonce: 22, nonce of rejected tx: 17", true, "Nethermind"}, {"nonce too low. allowed nonce range: 427 - 447, actual: 426", true, "zkSync"}, {"client error nonce too low", true, "tomlConfig"}, } for _, test := range tests { t.Run(test.network, func(t *testing.T) { err = evmclient.NewSendErrorS(test.message) assert.Equal(t, err.IsNonceTooLowError(clientErrors), test.expect) err = newSendErrorWrapped(test.message) assert.Equal(t, err.IsNonceTooLowError(clientErrors), test.expect) }) } })` $DIR/core/chains/evm/client/errors_test.go: `.Run(test.network, func(t *testing.T) { err = evmclient.NewSendErrorS(test.message) assert.Equal(t, err.IsNonceTooLowError(clientErrors), test.expect) err = newSendErrorWrapped(test.message) assert.Equal(t, err.IsNonceTooLowError(clientErrors), test.expect) })` $DIR/core/chains/evm/client/errors_test.go: `.NewSendErrorS(test.message)` $DIR/core/chains/evm/client/errors_test.go: `.Run("IsNonceTooHigh", func(t *testing.T) { tests := []errorCase{ {"call failed: NonceGap", true, "Nethermind"}, {"call failed: NonceGap, Future nonce. Expected nonce: 10", true, "Nethermind"}, {"nonce too high: address 0x336394A3219e71D9d9bd18201d34E95C1Bb7122C, tx: 8089 state: 8090", true, "Arbitrum"}, {"nonce too high", true, "Geth"}, {"nonce too high", true, "Erigon"}, {"nonce too high. allowed nonce range: 427 - 477, actual: 527", true, "zkSync"}, {"client error nonce too high", true, "tomlConfig"}, } for _, test := range tests { err = evmclient.NewSendErrorS(test.message) assert.Equal(t, err.IsNonceTooHighError(clientErrors), test.expect) err = newSendErrorWrapped(test.message) assert.Equal(t, err.IsNonceTooHighError(clientErrors), test.expect) } })` $DIR/core/chains/evm/client/errors_test.go: `.NewSendErrorS(test.message)` $DIR/core/chains/evm/client/errors_test.go: `.Run("IsTransactionAlreadyMined", func(t *testing.T) { assert.False(t, randomError.IsTransactionAlreadyMined(clientErrors)) tests := []errorCase{ {"transaction already finalized", true, "Harmony"}, {"client error transaction already mined", true, "tomlConfig"}, } for _, test := range tests { t.Run(test.network, func(t *testing.T) { err = evmclient.NewSendErrorS(test.message) assert.Equal(t, err.IsTransactionAlreadyMined(clientErrors), test.expect) err = newSendErrorWrapped(test.message) assert.Equal(t, err.IsTransactionAlreadyMined(clientErrors), test.expect) }) } })` $DIR/core/chains/evm/client/errors_test.go: `.Run(test.network, func(t *testing.T) { err = evmclient.NewSendErrorS(test.message) assert.Equal(t, err.IsTransactionAlreadyMined(clientErrors), test.expect) err = newSendErrorWrapped(test.message) assert.Equal(t, err.IsTransactionAlreadyMined(clientErrors), test.expect) })` $DIR/core/chains/evm/client/errors_test.go: `.NewSendErrorS(test.message)` $DIR/core/chains/evm/client/errors_test.go: `.Run("IsReplacementUnderpriced", func(t *testing.T) { tests := []errorCase{ {"replacement transaction underpriced", true, "geth"}, {"Replacement transaction underpriced", true, "Besu"}, {"replacement transaction underpriced", true, "Erigon"}, {"replacement transaction underpriced", true, "Klaytn"}, {"there is another tx which has the same nonce in the tx pool", true, "Klaytn"}, {"Transaction gas price 100wei is too low. There is another transaction with same nonce in the queue with gas price 150wei. Try increasing the gas price or incrementing the nonce.", true, "Parity"}, {"There are too many transactions in the queue. Your transaction was dropped due to limit. Try increasing the fee.", false, "Parity"}, {"gas price too low", false, "Arbitrum"}, {"client error replacement underpriced", true, "tomlConfig"}, {"", false, "tomlConfig"}, } for _, test := range tests { err = evmclient.NewSendErrorS(test.message) assert.Equal(t, err.IsReplacementUnderpriced(clientErrors), test.expect) err = newSendErrorWrapped(test.message) assert.Equal(t, err.IsReplacementUnderpriced(clientErrors), test.expect) } })` $DIR/core/chains/evm/client/errors_test.go: `.NewSendErrorS(test.message)` $DIR/core/chains/evm/client/errors_test.go: `.Run("IsTransactionAlreadyInMempool", func(t *testing.T) { assert.False(t, randomError.IsTransactionAlreadyInMempool(clientErrors)) tests := []errorCase{ // I have seen this in log output {"known transaction: 0x7f657507aee0511e36d2d1972a6b22e917cc89f92b6c12c4dbd57eaabb236960", true, "Geth"}, // This comes from the geth source - https://github.com/ethereum/go-ethereum/blob/eb9d7d15ecf08cd5104e01a8af64489f01f700b0/core/tx_pool.go#L57 {"already known", true, "Geth"}, // This one is present in the light client (?!) {"Known transaction (7f65)", true, "Geth"}, {"Known transaction", true, "Besu"}, {"already known", true, "Erigon"}, {"block already known", true, "Erigon"}, {"Transaction with the same hash was already imported.", true, "Parity"}, {"call failed: AlreadyKnown", true, "Nethermind"}, {"call failed: OwnNonceAlreadyUsed", true, "Nethermind"}, {"known transaction", true, "Klaytn"}, {"known transaction. transaction with hash 0x6013…3053 is already in the system", true, "zkSync"}, // This seems to be an erroneous message from the zkSync client, we'll have to match it anyway {"ErrorObject { code: ServerError(3), message: \\\"known transaction. transaction with hash 0xf016…ad63 is already in the system\\\", data: Some(RawValue(\\\"0x\\\")) }", true, "zkSync"}, {"client error transaction already in mempool", true, "tomlConfig"}, } for _, test := range tests { err = evmclient.NewSendErrorS(test.message) assert.Equal(t, err.IsTransactionAlreadyInMempool(clientErrors), test.expect) err = newSendErrorWrapped(test.message) assert.Equal(t, err.IsTransactionAlreadyInMempool(clientErrors), test.expect) } })` $DIR/core/chains/evm/client/errors_test.go: `.NewSendErrorS(test.message)` $DIR/core/chains/evm/client/errors_test.go: `.Run("IsTerminallyUnderpriced", func(t *testing.T) { assert.False(t, randomError.IsTerminallyUnderpriced(clientErrors)) tests := []errorCase{ {"transaction underpriced", true, "geth"}, {"replacement transaction underpriced", false, "geth"}, {"Gas price below configured minimum gas price", true, "Besu"}, {"transaction underpriced", true, "Erigon"}, {"There are too many transactions in the queue. Your transaction was dropped due to limit. Try increasing the fee.", false, "Parity"}, {"Transaction gas price is too low. It does not satisfy your node's minimal gas price (minimal: 100 got: 50). Try increasing the gas price.", true, "Parity"}, {"gas price too low", true, "Arbitrum"}, {"FeeTooLow", true, "Nethermind"}, {"FeeTooLow, MaxFeePerGas too low. MaxFeePerGas: 50, BaseFee: 100, MaxPriorityFeePerGas:200, Block number: 5", true, "Nethermind"}, {"FeeTooLow, EffectivePriorityFeePerGas too low 10 < 20, BaseFee: 30", true, "Nethermind"}, {"FeeTooLow, FeePerGas needs to be higher than 100 to be added to the TxPool. Affordable FeePerGas of rejected tx: 50.", true, "Nethermind"}, {"FeeTooLowToCompete", true, "Nethermind"}, {"transaction underpriced", true, "Klaytn"}, {"intrinsic gas too low", true, "Klaytn"}, {"max fee per gas less than block base fee", true, "zkSync"}, {"virtual machine entered unexpected state. please contact developers and provide transaction details that caused this error. Error description: The operator included transaction with an unacceptable gas price", true, "zkSync"}, {"client error terminally underpriced", true, "tomlConfig"}, } for _, test := range tests { err = evmclient.NewSendErrorS(test.message) assert.Equal(t, err.IsTerminallyUnderpriced(clientErrors), test.expect, "expected %q to match %s for client %s", err, "IsTerminallyUnderpriced", test.network) err = newSendErrorWrapped(test.message) assert.Equal(t, err.IsTerminallyUnderpriced(clientErrors), test.expect, "expected %q to match %s for client %s", err, "IsTerminallyUnderpriced", test.network) } })` $DIR/core/chains/evm/client/errors_test.go: `.NewSendErrorS(test.message)` $DIR/core/chains/evm/client/errors_test.go: `.Run("IsTemporarilyUnderpriced", func(t *testing.T) { tests := []errorCase{ {"There are too many transactions in the queue. Your transaction was dropped due to limit. Try increasing the fee.", true, "Parity"}, {"There are too many transactions in the queue. Your transaction was dropped due to limit. Try increasing the fee.", true, "Parity"}, {"Transaction gas price is too low. It does not satisfy your node's minimal gas price (minimal: 100 got: 50). Try increasing the gas price.", false, "Parity"}, {"client error transaction underpriced", false, "tomlConfig"}, } for _, test := range tests { err = evmclient.NewSendErrorS(test.message) assert.Equal(t, err.IsTemporarilyUnderpriced(clientErrors), test.expect) err = newSendErrorWrapped(test.message) assert.Equal(t, err.IsTemporarilyUnderpriced(clientErrors), test.expect) } })` $DIR/core/chains/evm/client/errors_test.go: `.NewSendErrorS(test.message)` $DIR/core/chains/evm/client/errors_test.go: `.Run("IsInsufficientEth", func(t *testing.T) { tests := []errorCase{ {"insufficient funds for transfer", true, "Geth"}, {"insufficient funds for gas * price + value", true, "Geth"}, {"insufficient balance for transfer", true, "Geth"}, {"Upfront cost exceeds account balance", true, "Besu"}, {"insufficient funds for transfer", true, "Erigon"}, {"insufficient funds for gas * price + value", true, "Erigon"}, {"insufficient balance for transfer", true, "Erigon"}, {"Insufficient balance for transaction. Balance=100.25, Cost=200.50", true, "Parity"}, {"Insufficient funds. The account you tried to send transaction from does not have enough funds. Required 200.50 and got: 100.25.", true, "Parity"}, {"transaction rejected: insufficient funds for gas * price + value", true, "Arbitrum"}, {"not enough funds for gas", true, "Arbitrum"}, {"insufficient funds for gas * price + value: address 0xb68D832c1241bc50db1CF09e96c0F4201D5539C9 have 9934612900000000 want 9936662900000000", true, "Arbitrum"}, {"call failed: InsufficientFunds", true, "Nethermind"}, {"call failed: InsufficientFunds, Account balance: 4740799397601480913, cumulative cost: 22019342038993800000", true, "Nethermind"}, {"call failed: InsufficientFunds, Balance is 1092404690719251702 less than sending value + gas 7165512000464000000", true, "Nethermind"}, {"insufficient funds", true, "Klaytn"}, {"insufficient funds for gas * price + value + gatewayFee", true, "celo"}, {"insufficient balance for transfer", true, "zkSync"}, {"insufficient funds for gas + value. balance: 42719769622667482000, fee: 48098250000000, value: 42719769622667482000", true, "celo"}, {"client error insufficient eth", true, "tomlConfig"}, {"transaction would cause overdraft", true, "Geth"}, } for _, test := range tests { err = evmclient.NewSendErrorS(test.message) assert.Equal(t, err.IsInsufficientEth(clientErrors), test.expect) err = newSendErrorWrapped(test.message) assert.Equal(t, err.IsInsufficientEth(clientErrors), test.expect) } })` $DIR/core/chains/evm/client/errors_test.go: `.NewSendErrorS(test.message)` $DIR/core/chains/evm/client/errors_test.go: `.Run("IsServiceUnavailable", func(t *testing.T) { tests := []errorCase{ {"call failed: 503 Service Unavailable: \r\n503 Service Temporarily Unavailable\r\n\r\n

503 Service Temporarily Unavailable

\r\n\r\n\r\n", true, "Nethermind"}, {"call failed: 502 Bad Gateway: \r\n502 Bad Gateway\r\n\r\n

502 Bad Gateway

\r\n
", true, "Arbitrum"}, {"client error service unavailable", true, "tomlConfig"}, } for _, test := range tests { err = evmclient.NewSendErrorS(test.message) assert.Equal(t, err.IsServiceUnavailable(clientErrors), test.expect) err = newSendErrorWrapped(test.message) assert.Equal(t, err.IsServiceUnavailable(clientErrors), test.expect) } })` $DIR/core/chains/evm/client/errors_test.go: `.NewSendErrorS(test.message)` $DIR/core/chains/evm/client/errors_test.go: `.Run("IsTxFeeExceedsCap", func(t *testing.T) { tests := []errorCase{ {"tx fee (1.10 ether) exceeds the configured cap (1.00 ether)", true, "geth"}, {"tx fee (1.10 FTM) exceeds the configured cap (1.00 FTM)", true, "geth"}, {"tx fee (1.10 foocoin) exceeds the configured cap (1.00 foocoin)", true, "geth"}, {"Transaction fee cap exceeded", true, "Besu"}, {"tx fee (1.10 ether) exceeds the configured cap (1.00 ether)", true, "Erigon"}, {"invalid gas fee cap", true, "Klaytn"}, {"max fee per gas higher than max priority fee per gas", true, "Klaytn"}, {"tx fee (1.10 of currency celo) exceeds the configured cap (1.00 celo)", true, "celo"}, {"max priority fee per gas higher than max fee per gas", true, "zkSync"}, {"client error tx fee exceeds cap", true, "tomlConfig"}, } for _, test := range tests { err = evmclient.NewSendErrorS(test.message) assert.Equal(t, err.IsTxFeeExceedsCap(clientErrors), test.expect) err = newSendErrorWrapped(test.message) assert.Equal(t, err.IsTxFeeExceedsCap(clientErrors), test.expect) } assert.False(t, randomError.IsTxFeeExceedsCap(clientErrors)) // Nil err = evmclient.NewSendError(nil) assert.False(t, err.IsTxFeeExceedsCap(clientErrors)) })` $DIR/core/chains/evm/client/errors_test.go: `.NewSendErrorS(test.message)` $DIR/core/chains/evm/client/errors_test.go: `.NewSendError(nil)` $DIR/core/chains/evm/client/errors_test.go: `.Run("L2 Fees errors", func(t *testing.T) { err = evmclient.NewSendErrorS("max fee per gas less than block base fee") assert.False(t, err.IsL2FeeTooHigh(clientErrors)) assert.True(t, err.L2FeeTooLow(clientErrors)) err = newSendErrorWrapped("max fee per gas less than block base fee") assert.False(t, err.IsL2FeeTooHigh(clientErrors)) assert.True(t, err.L2FeeTooLow(clientErrors)) err = evmclient.NewSendErrorS("queue full") assert.True(t, err.IsL2Full(clientErrors)) err = evmclient.NewSendErrorS("sequencer pending tx pool full, please try again") assert.True(t, err.IsL2Full(clientErrors)) assert.False(t, randomError.IsL2FeeTooHigh(clientErrors)) assert.False(t, randomError.L2FeeTooLow(clientErrors)) // Nil err = evmclient.NewSendError(nil) assert.False(t, err.IsL2FeeTooHigh(clientErrors)) assert.False(t, err.L2FeeTooLow(clientErrors)) })` $DIR/core/chains/evm/client/errors_test.go: `.NewSendErrorS("max fee per gas less than block base fee")` $DIR/core/chains/evm/client/errors_test.go: `.NewSendErrorS("queue full")` $DIR/core/chains/evm/client/errors_test.go: `.NewSendErrorS("sequencer pending tx pool full, please try again")` $DIR/core/chains/evm/client/errors_test.go: `.NewSendError(nil)` $DIR/core/chains/evm/client/errors_test.go: `.Run("Metis gas price errors", func(t *testing.T) { err := evmclient.NewSendErrorS("primary websocket (wss://ws-mainnet.metis.io) call failed: gas price too low: 18000000000 wei, use at least tx.gasPrice = 19500000000 wei") assert.True(t, err.L2FeeTooLow(clientErrors)) err = newSendErrorWrapped("primary websocket (wss://ws-mainnet.metis.io) call failed: gas price too low: 18000000000 wei, use at least tx.gasPrice = 19500000000 wei") assert.True(t, err.L2FeeTooLow(clientErrors)) assert.False(t, randomError.L2FeeTooLow(clientErrors)) // Nil err = evmclient.NewSendError(nil) assert.False(t, err.L2FeeTooLow(clientErrors)) })` $DIR/core/chains/evm/client/errors_test.go: `.NewSendErrorS("primary websocket (wss://ws-mainnet.metis.io) call failed: gas price too low: 18000000000 wei, use at least tx.gasPrice = 19500000000 wei")` $DIR/core/chains/evm/client/errors_test.go: `.NewSendError(nil)` $DIR/core/chains/evm/client/errors_test.go: `.NewSendErrorS("primary http (http://***REDACTED***:9933) call failed: submit transaction to pool failed: Pool(Stale)")` $DIR/core/chains/evm/client/errors_test.go: `.NewSendErrorS("primary http (http://***REDACTED***:9933) call failed: submit transaction to pool failed: Pool(AlreadyImported)")` $DIR/core/chains/evm/client/errors_test.go: `.NewTestClientErrors()` $DIR/core/chains/evm/client/errors_test.go: `.ClientErrorRegexes(&testErrors)` $DIR/core/chains/evm/client/errors_test.go: `.Run(test.message, func(t *testing.T) { err := evmclient.NewSendError(pkgerrors.New(test.message)) assert.Equal(t, test.expect, err.Fatal(clientErrors)) })` $DIR/core/chains/evm/client/errors_test.go: `.NewSendError(pkgerrors.New(test.message))` $DIR/core/chains/evm/client/errors_test.go: `.New(test.message)` $DIR/core/chains/evm/client/errors_test.go: `.NewTestClientErrors()` $DIR/core/chains/evm/client/errors_test.go: `.ClientErrorRegexes(&testErrors)` $DIR/core/chains/evm/client/evm_client_test.go: `.NewClientConfigs(selectionMode, leaseDuration, chainTypeStr, nodeConfigs, pollFailureThreshold, pollInterval, syncThreshold, nodeIsSyncingEnabled, noNewHeadsThreshold, finalityDepth, finalityTagEnabled)` $DIR/core/chains/evm/client/evm_client_test.go: `.NewEvmClient(nodePool, chainCfg, nil, logger.Test(t), testutils.FixtureChainID, nodes, chaintype.ChainType(chainTypeStr))` $DIR/core/chains/evm/client/evm_client_test.go: `.Test(t)` $DIR/core/chains/evm/client/evm_client_test.go: `.ChainType(chainTypeStr)` $DIR/core/chains/evm/client/null_client_test.go: `t.Run("chain id", func(t *testing.T) { lggr := logger.Test(t) cid := big.NewInt(123) nc := client.NewNullClient(cid, lggr) require.Equal(t, cid, nc.ConfiguredChainID()) nc = client.NewNullClient(nil, lggr) require.Equal(t, big.NewInt(client.NullClientChainID), nc.ConfiguredChainID()) })` $DIR/core/chains/evm/client/null_client_test.go: `nc = client.NewNullClient(nil, lggr)` $DIR/core/chains/evm/client/null_client_test.go: `t.Run("CL client methods", func(t *testing.T) { lggr, logs := logger.TestObserved(t, zapcore.DebugLevel) nc := client.NewNullClient(nil, lggr) ctx := tests.Context(t) err := nc.Dial(ctx) require.NoError(t, err) require.Equal(t, 1, logs.FilterMessage("Dial").Len()) nc.Close() require.Equal(t, 1, logs.FilterMessage("Close").Len()) b, err := nc.TokenBalance(ctx, common.Address{}, common.Address{}) require.NoError(t, err) require.Zero(t, b.Int64()) require.Equal(t, 1, logs.FilterMessage("TokenBalance").Len()) l, err := nc.LINKBalance(ctx, common.Address{}, common.Address{}) require.NoError(t, err) require.True(t, l.IsZero()) require.Equal(t, 1, logs.FilterMessage("LINKBalance").Len()) err = nc.CallContext(ctx, nil, "") require.NoError(t, err) require.Equal(t, 1, logs.FilterMessage("CallContext").Len()) h, err := nc.HeadByNumber(ctx, nil) require.NoError(t, err) require.Nil(t, h) require.Equal(t, 1, logs.FilterMessage("HeadByNumber").Len()) chHeads := make(chan *evmtypes.Head) sub, err := nc.SubscribeNewHead(ctx, chHeads) require.NoError(t, err) require.Equal(t, 1, logs.FilterMessage("SubscribeNewHead").Len()) require.Nil(t, sub.Err()) require.Equal(t, 1, logs.FilterMessage("Err").Len()) sub.Unsubscribe() require.Equal(t, 1, logs.FilterMessage("Unsubscribe").Len()) chLogs := make(chan types.Log) _, err = nc.SubscribeFilterLogs(ctx, ethereum.FilterQuery{}, chLogs) require.NoError(t, err) require.Equal(t, 1, logs.FilterMessage("SubscribeFilterLogs").Len()) })` $DIR/core/chains/evm/client/null_client_test.go: `err = nc.CallContext(ctx, nil, "")` $DIR/core/chains/evm/client/null_client_test.go: `sub.Unsubscribe()` $DIR/core/chains/evm/client/null_client_test.go: `_, err = nc.SubscribeFilterLogs(ctx, ethereum.FilterQuery{}, chLogs)` $DIR/core/chains/evm/client/null_client_test.go: `err = nc.SendTransaction(ctx, nil)` $DIR/core/chains/evm/client/null_client_test.go: `b, err = nc.BlockByHash(ctx, common.Hash{})` $DIR/core/chains/evm/client/null_client_test.go: `err = nc.BatchCallContext(ctx, []rpc.BatchElem{})` $DIR/core/chains/evm/client/null_client_test.go: `err = nc.BatchCallContextAll(ctx, []rpc.BatchElem{})` $DIR/core/chains/evm/client/null_client_test.go: `.Run("chain id", func(t *testing.T) { lggr := logger.Test(t) cid := big.NewInt(123) nc := client.NewNullClient(cid, lggr) require.Equal(t, cid, nc.ConfiguredChainID()) nc = client.NewNullClient(nil, lggr) require.Equal(t, big.NewInt(client.NullClientChainID), nc.ConfiguredChainID()) })` $DIR/core/chains/evm/client/null_client_test.go: `.Test(t)` $DIR/core/chains/evm/client/null_client_test.go: `.NewInt(123)` $DIR/core/chains/evm/client/null_client_test.go: `.NewNullClient(cid, lggr)` $DIR/core/chains/evm/client/null_client_test.go: `.NewNullClient(nil, lggr)` $DIR/core/chains/evm/client/null_client_test.go: `.Run("CL client methods", func(t *testing.T) { lggr, logs := logger.TestObserved(t, zapcore.DebugLevel) nc := client.NewNullClient(nil, lggr) ctx := tests.Context(t) err := nc.Dial(ctx) require.NoError(t, err) require.Equal(t, 1, logs.FilterMessage("Dial").Len()) nc.Close() require.Equal(t, 1, logs.FilterMessage("Close").Len()) b, err := nc.TokenBalance(ctx, common.Address{}, common.Address{}) require.NoError(t, err) require.Zero(t, b.Int64()) require.Equal(t, 1, logs.FilterMessage("TokenBalance").Len()) l, err := nc.LINKBalance(ctx, common.Address{}, common.Address{}) require.NoError(t, err) require.True(t, l.IsZero()) require.Equal(t, 1, logs.FilterMessage("LINKBalance").Len()) err = nc.CallContext(ctx, nil, "") require.NoError(t, err) require.Equal(t, 1, logs.FilterMessage("CallContext").Len()) h, err := nc.HeadByNumber(ctx, nil) require.NoError(t, err) require.Nil(t, h) require.Equal(t, 1, logs.FilterMessage("HeadByNumber").Len()) chHeads := make(chan *evmtypes.Head) sub, err := nc.SubscribeNewHead(ctx, chHeads) require.NoError(t, err) require.Equal(t, 1, logs.FilterMessage("SubscribeNewHead").Len()) require.Nil(t, sub.Err()) require.Equal(t, 1, logs.FilterMessage("Err").Len()) sub.Unsubscribe() require.Equal(t, 1, logs.FilterMessage("Unsubscribe").Len()) chLogs := make(chan types.Log) _, err = nc.SubscribeFilterLogs(ctx, ethereum.FilterQuery{}, chLogs) require.NoError(t, err) require.Equal(t, 1, logs.FilterMessage("SubscribeFilterLogs").Len()) })` $DIR/core/chains/evm/client/null_client_test.go: `.TestObserved(t, zapcore.DebugLevel)` $DIR/core/chains/evm/client/null_client_test.go: `.NewNullClient(nil, lggr)` $DIR/core/chains/evm/client/null_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/null_client_test.go: `.Dial(ctx)` $DIR/core/chains/evm/client/null_client_test.go: `.TokenBalance(ctx, common.Address{}, common.Address{})` $DIR/core/chains/evm/client/null_client_test.go: `.LINKBalance(ctx, common.Address{}, common.Address{})` $DIR/core/chains/evm/client/null_client_test.go: `.CallContext(ctx, nil, "")` $DIR/core/chains/evm/client/null_client_test.go: `.HeadByNumber(ctx, nil)` $DIR/core/chains/evm/client/null_client_test.go: `.SubscribeNewHead(ctx, chHeads)` $DIR/core/chains/evm/client/null_client_test.go: `.Unsubscribe()` $DIR/core/chains/evm/client/null_client_test.go: `.SubscribeFilterLogs(ctx, ethereum.FilterQuery{}, chLogs)` $DIR/core/chains/evm/client/null_client_test.go: `.TestObserved(t, zapcore.DebugLevel)` $DIR/core/chains/evm/client/null_client_test.go: `.NewNullClient(nil, lggr)` $DIR/core/chains/evm/client/null_client_test.go: `.Context(t)` $DIR/core/chains/evm/client/null_client_test.go: `.HeaderByNumber(ctx, nil)` $DIR/core/chains/evm/client/null_client_test.go: `.SendTransaction(ctx, nil)` $DIR/core/chains/evm/client/null_client_test.go: `.PendingCodeAt(ctx, common.Address{})` $DIR/core/chains/evm/client/null_client_test.go: `.PendingNonceAt(ctx, common.Address{})` $DIR/core/chains/evm/client/null_client_test.go: `.SequenceAt(ctx, common.Address{}, nil)` $DIR/core/chains/evm/client/null_client_test.go: `.TransactionReceipt(ctx, common.Hash{})` $DIR/core/chains/evm/client/null_client_test.go: `.BlockByNumber(ctx, nil)` $DIR/core/chains/evm/client/null_client_test.go: `.BlockByHash(ctx, common.Hash{})` $DIR/core/chains/evm/client/null_client_test.go: `.BalanceAt(ctx, common.Address{}, nil)` $DIR/core/chains/evm/client/null_client_test.go: `.FilterLogs(ctx, ethereum.FilterQuery{})` $DIR/core/chains/evm/client/null_client_test.go: `.EstimateGas(ctx, ethereum.CallMsg{})` $DIR/core/chains/evm/client/null_client_test.go: `.SuggestGasPrice(ctx)` $DIR/core/chains/evm/client/null_client_test.go: `.CallContract(ctx, ethereum.CallMsg{}, nil)` $DIR/core/chains/evm/client/null_client_test.go: `.CodeAt(ctx, common.Address{}, nil)` $DIR/core/chains/evm/client/null_client_test.go: `.BatchCallContext(ctx, []rpc.BatchElem{})` $DIR/core/chains/evm/client/null_client_test.go: `.BatchCallContextAll(ctx, []rpc.BatchElem{})` $DIR/core/chains/evm/client/null_client_test.go: `.SuggestGasTipCap(ctx)` $DIR/core/chains/evm/client/null_client_test.go: `.NodeStates()` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `t.Run("Unsubscribe wrapper releases resources", func(t *testing.T) { t.Parallel() mockedSub := NewMockSubscription() const prefix = "RPC returned error" wrapper := newSubscriptionErrorWrapper(mockedSub, prefix) wrapper.Unsubscribe() // mock's resources were relased assert.True(t, mockedSub.unsubscribed) _, ok := <-mockedSub.Err() assert.False(t, ok) // wrapper's channels are closed _, ok = <-wrapper.Err() assert.False(t, ok) // subsequence unsubscribe does not causes panic wrapper.Unsubscribe() })` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `wrapper.Unsubscribe()` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `_, ok = <-wrapper.Err()` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `wrapper.Unsubscribe()` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `t.Run("Unsubscribe interrupts error delivery", func(t *testing.T) { t.Parallel() sub := NewMockSubscription() const prefix = "RPC returned error" wrapper := newSubscriptionErrorWrapper(sub, prefix) sub.Errors <- fmt.Errorf("error") wrapper.Unsubscribe() _, ok := <-wrapper.Err() assert.False(t, ok) })` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `sub.Errors <- fmt.Errorf("error")` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `wrapper.Unsubscribe()` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `t.Run("Successfully wraps error", func(t *testing.T) { t.Parallel() sub := NewMockSubscription() const prefix = "RPC returned error" wrapper := newSubscriptionErrorWrapper(sub, prefix) sub.Errors <- fmt.Errorf("root error") err, ok := <-wrapper.Err() assert.True(t, ok) assert.Equal(t, "RPC returned error: root error", err.Error()) wrapper.Unsubscribe() _, ok = <-wrapper.Err() assert.False(t, ok) })` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `sub.Errors <- fmt.Errorf("root error")` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `wrapper.Unsubscribe()` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `_, ok = <-wrapper.Err()` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `mockedSub.Unsubscribe()` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `tests.AssertEventually(t, func() bool { _, ok = <-wrapper.Err() return !ok })` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `_, ok = <-wrapper.Err()` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `.Run("Unsubscribe wrapper releases resources", func(t *testing.T) { t.Parallel() mockedSub := NewMockSubscription() const prefix = "RPC returned error" wrapper := newSubscriptionErrorWrapper(mockedSub, prefix) wrapper.Unsubscribe() // mock's resources were relased assert.True(t, mockedSub.unsubscribed) _, ok := <-mockedSub.Err() assert.False(t, ok) // wrapper's channels are closed _, ok = <-wrapper.Err() assert.False(t, ok) // subsequence unsubscribe does not causes panic wrapper.Unsubscribe() })` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `.Unsubscribe()` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `.Err()` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `.Err()` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `.Unsubscribe()` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `.Run("Unsubscribe interrupts error delivery", func(t *testing.T) { t.Parallel() sub := NewMockSubscription() const prefix = "RPC returned error" wrapper := newSubscriptionErrorWrapper(sub, prefix) sub.Errors <- fmt.Errorf("error") wrapper.Unsubscribe() _, ok := <-wrapper.Err() assert.False(t, ok) })` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `.Unsubscribe()` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `.Err()` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `.Run("Successfully wraps error", func(t *testing.T) { t.Parallel() sub := NewMockSubscription() const prefix = "RPC returned error" wrapper := newSubscriptionErrorWrapper(sub, prefix) sub.Errors <- fmt.Errorf("root error") err, ok := <-wrapper.Err() assert.True(t, ok) assert.Equal(t, "RPC returned error: root error", err.Error()) wrapper.Unsubscribe() _, ok = <-wrapper.Err() assert.False(t, ok) })` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `.Err()` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `.Unsubscribe()` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `.Err()` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `.Unsubscribe()` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `.Err()` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `.AssertEventually(t, func() bool { _, ok = <-wrapper.Err() return !ok })` $DIR/core/chains/evm/client/sub_error_wrapper_test.go: `.Err()` $DIR/core/chains/evm/client/tx_simulator_test.go: `t.Run("returns without error if simulation passes", func(t *testing.T) { wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_estimateGas": resp.Result = `"0x100"` } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(ctx) require.NoError(t, err) msg := ethereum.CallMsg{ From: fromAddress, To: &toAddress, Data: []byte("0x00"), } sendErr := client.SimulateTransaction(ctx, ethClient, logger.TestSugared(t), "", msg) require.Empty(t, sendErr) })` $DIR/core/chains/evm/client/tx_simulator_test.go: `resp.Result = `"0x00"`` $DIR/core/chains/evm/client/tx_simulator_test.go: `resp.Notify = headResult` $DIR/core/chains/evm/client/tx_simulator_test.go: `resp.Result = "true"` $DIR/core/chains/evm/client/tx_simulator_test.go: `resp.Result = `"0x100"`` $DIR/core/chains/evm/client/tx_simulator_test.go: `t.Run("returns error if simulation returns zk out-of-counters error", func(t *testing.T) { wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_estimateGas": resp.Error.Code = -32000 resp.Result = `"0x100"` resp.Error.Message = "not enough keccak counters to continue the execution" } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(ctx) require.NoError(t, err) msg := ethereum.CallMsg{ From: fromAddress, To: &toAddress, Data: []byte("0x00"), } sendErr := client.SimulateTransaction(ctx, ethClient, logger.TestSugared(t), "", msg) require.Equal(t, true, sendErr.IsOutOfCounters(nil)) })` $DIR/core/chains/evm/client/tx_simulator_test.go: `resp.Result = `"0x00"`` $DIR/core/chains/evm/client/tx_simulator_test.go: `resp.Notify = headResult` $DIR/core/chains/evm/client/tx_simulator_test.go: `resp.Result = "true"` $DIR/core/chains/evm/client/tx_simulator_test.go: `resp.Error.Code = -32000` $DIR/core/chains/evm/client/tx_simulator_test.go: `resp.Result = `"0x100"`` $DIR/core/chains/evm/client/tx_simulator_test.go: `resp.Error.Message = "not enough keccak counters to continue the execution"` $DIR/core/chains/evm/client/tx_simulator_test.go: `resp.Result = `"0x00"`` $DIR/core/chains/evm/client/tx_simulator_test.go: `resp.Notify = headResult` $DIR/core/chains/evm/client/tx_simulator_test.go: `resp.Result = "true"` $DIR/core/chains/evm/client/tx_simulator_test.go: `resp.Error.Code = -32000` $DIR/core/chains/evm/client/tx_simulator_test.go: `resp.Error.Message = "something went wrong"` $DIR/core/chains/evm/client/tx_simulator_test.go: `.NewAddress()` $DIR/core/chains/evm/client/tx_simulator_test.go: `.NewAddress()` $DIR/core/chains/evm/client/tx_simulator_test.go: `.Context(t)` $DIR/core/chains/evm/client/tx_simulator_test.go: `.Run("returns without error if simulation passes", func(t *testing.T) { wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_estimateGas": resp.Result = `"0x100"` } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(ctx) require.NoError(t, err) msg := ethereum.CallMsg{ From: fromAddress, To: &toAddress, Data: []byte("0x00"), } sendErr := client.SimulateTransaction(ctx, ethClient, logger.TestSugared(t), "", msg) require.Empty(t, sendErr) })` $DIR/core/chains/evm/client/tx_simulator_test.go: `.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_estimateGas": resp.Result = `"0x100"` } return })` $DIR/core/chains/evm/client/tx_simulator_test.go: `.WSURL()` $DIR/core/chains/evm/client/tx_simulator_test.go: `.String()` $DIR/core/chains/evm/client/tx_simulator_test.go: `.Dial(ctx)` $DIR/core/chains/evm/client/tx_simulator_test.go: `.SimulateTransaction(ctx, ethClient, logger.TestSugared(t), "", msg)` $DIR/core/chains/evm/client/tx_simulator_test.go: `.TestSugared(t)` $DIR/core/chains/evm/client/tx_simulator_test.go: `.Run("returns error if simulation returns zk out-of-counters error", func(t *testing.T) { wsURL := testutils.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_estimateGas": resp.Error.Code = -32000 resp.Result = `"0x100"` resp.Error.Message = "not enough keccak counters to continue the execution" } return }).WSURL().String() ethClient := mustNewChainClient(t, wsURL) err := ethClient.Dial(ctx) require.NoError(t, err) msg := ethereum.CallMsg{ From: fromAddress, To: &toAddress, Data: []byte("0x00"), } sendErr := client.SimulateTransaction(ctx, ethClient, logger.TestSugared(t), "", msg) require.Equal(t, true, sendErr.IsOutOfCounters(nil)) })` $DIR/core/chains/evm/client/tx_simulator_test.go: `.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_estimateGas": resp.Error.Code = -32000 resp.Result = `"0x100"` resp.Error.Message = "not enough keccak counters to continue the execution" } return })` $DIR/core/chains/evm/client/tx_simulator_test.go: `.WSURL()` $DIR/core/chains/evm/client/tx_simulator_test.go: `.String()` $DIR/core/chains/evm/client/tx_simulator_test.go: `.Dial(ctx)` $DIR/core/chains/evm/client/tx_simulator_test.go: `.SimulateTransaction(ctx, ethClient, logger.TestSugared(t), "", msg)` $DIR/core/chains/evm/client/tx_simulator_test.go: `.TestSugared(t)` $DIR/core/chains/evm/client/tx_simulator_test.go: `.NewWSServer(t, testutils.FixtureChainID, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) { switch method { case "eth_subscribe": resp.Result = `"0x00"` resp.Notify = headResult return case "eth_unsubscribe": resp.Result = "true" return case "eth_estimateGas": resp.Error.Code = -32000 resp.Error.Message = "something went wrong" } return })` $DIR/core/chains/evm/client/tx_simulator_test.go: `.WSURL()` $DIR/core/chains/evm/client/tx_simulator_test.go: `.String()` $DIR/core/chains/evm/client/tx_simulator_test.go: `.Dial(ctx)` $DIR/core/chains/evm/client/tx_simulator_test.go: `.SimulateTransaction(ctx, ethClient, logger.TestSugared(t), "", msg)` $DIR/core/chains/evm/client/tx_simulator_test.go: `.TestSugared(t)` $DIR/core/chains/evm/config/chain_scoped_ocr2_test.go: `.NewTestChainScopedConfig(t, nil)` $DIR/core/chains/evm/config/chain_scoped_ocr2_test.go: `.EVM()` $DIR/core/chains/evm/config/chain_scoped_ocr2_test.go: `.OCR2()` $DIR/core/chains/evm/config/chain_scoped_ocr2_test.go: `.Automation()` $DIR/core/chains/evm/config/chain_scoped_ocr2_test.go: `.GasLimit()` $DIR/core/chains/evm/config/chain_scoped_ocr_test.go: `.NewTestChainScopedConfig(t, nil)` $DIR/core/chains/evm/config/chain_scoped_ocr_test.go: `.EVM()` $DIR/core/chains/evm/config/chain_scoped_ocr_test.go: `.OCR()` $DIR/core/chains/evm/config/chain_scoped_ocr_test.go: `.ObservationGracePeriod()` $DIR/core/chains/evm/config/config_test.go: `c.GasEstimator.PriceMax = assets.NewWeiI(100000000000000)` $DIR/core/chains/evm/config/config_test.go: `c.GasEstimator.PriceMax = assets.NewWeiI(100000000000000)` $DIR/core/chains/evm/config/config_test.go: `c.GasEstimator.PriceDefault = assets.NewWeiI(42000000000)` $DIR/core/chains/evm/config/config_test.go: `t.Run("EVM().GasEstimator().PriceDefault()", func(t *testing.T) { assert.Equal(t, assets.NewWeiI(20000000000), cfg.EVM().GasEstimator().PriceDefault()) assert.Equal(t, assets.NewWeiI(42000000000), cfg2.EVM().GasEstimator().PriceDefault()) })` $DIR/core/chains/evm/config/config_test.go: `t.Run("EvmGasBumpTxDepthDefault", func(t *testing.T) { t.Run("uses MaxInFlightTransactions when not set", func(t *testing.T) { assert.Equal(t, cfg.EVM().Transactions().MaxInFlight(), cfg.EVM().GasEstimator().BumpTxDepth()) }) t.Run("uses customer configured value when set", func(t *testing.T) { var bumpTxDepth uint32 = 10 cfg2 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.BumpTxDepth = &bumpTxDepth }) assert.NotEqual(t, cfg2.EVM().Transactions().MaxInFlight(), cfg2.EVM().GasEstimator().BumpTxDepth()) assert.Equal(t, bumpTxDepth, cfg2.EVM().GasEstimator().BumpTxDepth()) }) })` $DIR/core/chains/evm/config/config_test.go: `t.Run("uses MaxInFlightTransactions when not set", func(t *testing.T) { assert.Equal(t, cfg.EVM().Transactions().MaxInFlight(), cfg.EVM().GasEstimator().BumpTxDepth()) })` $DIR/core/chains/evm/config/config_test.go: `t.Run("uses customer configured value when set", func(t *testing.T) { var bumpTxDepth uint32 = 10 cfg2 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.BumpTxDepth = &bumpTxDepth }) assert.NotEqual(t, cfg2.EVM().Transactions().MaxInFlight(), cfg2.EVM().GasEstimator().BumpTxDepth()) assert.Equal(t, bumpTxDepth, cfg2.EVM().GasEstimator().BumpTxDepth()) })` $DIR/core/chains/evm/config/config_test.go: `c.GasEstimator.BumpTxDepth = &bumpTxDepth` $DIR/core/chains/evm/config/config_test.go: `t.Run("PriceMaxKey", func(t *testing.T) { addr := testutils.NewAddress() randomOtherAddr := testutils.NewAddress() cfg2 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(randomOtherAddr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: assets.GWei(850), }, }, } c.GasEstimator.PriceMax = assets.NewWeiI(100000000000000) c.GasEstimator.PriceDefault = assets.NewWeiI(42000000000) }) t.Run("uses chain-specific default value when nothing is set", func(t *testing.T) { assert.Equal(t, assets.NewWeiI(100000000000000), cfg2.EVM().GasEstimator().PriceMaxKey(addr)) }) t.Run("uses chain-specific override value when that is set", func(t *testing.T) { priceMax := assets.NewWeiI(rand.Int63()) cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = priceMax }) assert.Equal(t, priceMax.String(), cfg3.EVM().GasEstimator().PriceMaxKey(addr).String()) }) t.Run("uses key-specific override value when set", func(t *testing.T) { tests := []struct { name string val *assets.Wei }{ {"Test with 250 GWei", assets.GWei(250)}, {"Test with 0 GWei", assets.GWei(0)}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: tt.val, }, }, } }) assert.Equal(t, tt.val.String(), cfg3.EVM().GasEstimator().PriceMaxKey(addr).String()) }) } }) t.Run("uses key-specific override value when set and lower than chain specific config", func(t *testing.T) { keySpecificPrice := assets.GWei(900) chainSpecificPrice := assets.GWei(1200) cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = chainSpecificPrice c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: keySpecificPrice, }, }, } }) assert.Equal(t, keySpecificPrice.String(), cfg3.EVM().GasEstimator().PriceMaxKey(addr).String()) }) t.Run("uses chain-specific value when higher than key-specific value", func(t *testing.T) { keySpecificPrice := assets.GWei(1400) chainSpecificPrice := assets.GWei(1200) cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = chainSpecificPrice c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: keySpecificPrice, }, }, } }) assert.Equal(t, chainSpecificPrice.String(), cfg3.EVM().GasEstimator().PriceMaxKey(addr).String()) }) t.Run("uses key-specific override value when set and lower than global config", func(t *testing.T) { keySpecificPrice := assets.GWei(900) cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: keySpecificPrice, }, }, } }) assert.Equal(t, keySpecificPrice.String(), cfg3.EVM().GasEstimator().PriceMaxKey(addr).String()) }) t.Run("uses global value when higher than key-specific value", func(t *testing.T) { keySpecificPrice := assets.GWei(1400) chainSpecificPrice := assets.GWei(1200) cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = chainSpecificPrice c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: keySpecificPrice, }, }, } }) assert.Equal(t, chainSpecificPrice.String(), cfg3.EVM().GasEstimator().PriceMaxKey(addr).String()) }) t.Run("uses global value when there is no key-specific price", func(t *testing.T) { priceMax := assets.NewWeiI(rand.Int63()) unsetAddr := testutils.NewAddress() cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = priceMax }) assert.Equal(t, priceMax.String(), cfg3.EVM().GasEstimator().PriceMaxKey(unsetAddr).String()) }) })` $DIR/core/chains/evm/config/config_test.go: `c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(randomOtherAddr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: assets.GWei(850), }, }, }` $DIR/core/chains/evm/config/config_test.go: `c.GasEstimator.PriceMax = assets.NewWeiI(100000000000000)` $DIR/core/chains/evm/config/config_test.go: `c.GasEstimator.PriceDefault = assets.NewWeiI(42000000000)` $DIR/core/chains/evm/config/config_test.go: `t.Run("uses chain-specific default value when nothing is set", func(t *testing.T) { assert.Equal(t, assets.NewWeiI(100000000000000), cfg2.EVM().GasEstimator().PriceMaxKey(addr)) })` $DIR/core/chains/evm/config/config_test.go: `t.Run("uses chain-specific override value when that is set", func(t *testing.T) { priceMax := assets.NewWeiI(rand.Int63()) cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = priceMax }) assert.Equal(t, priceMax.String(), cfg3.EVM().GasEstimator().PriceMaxKey(addr).String()) })` $DIR/core/chains/evm/config/config_test.go: `c.GasEstimator.PriceMax = priceMax` $DIR/core/chains/evm/config/config_test.go: `t.Run("uses key-specific override value when set", func(t *testing.T) { tests := []struct { name string val *assets.Wei }{ {"Test with 250 GWei", assets.GWei(250)}, {"Test with 0 GWei", assets.GWei(0)}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: tt.val, }, }, } }) assert.Equal(t, tt.val.String(), cfg3.EVM().GasEstimator().PriceMaxKey(addr).String()) }) } })` $DIR/core/chains/evm/config/config_test.go: `t.Run(tt.name, func(t *testing.T) { cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: tt.val, }, }, } }) assert.Equal(t, tt.val.String(), cfg3.EVM().GasEstimator().PriceMaxKey(addr).String()) })` $DIR/core/chains/evm/config/config_test.go: `c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: tt.val, }, }, }` $DIR/core/chains/evm/config/config_test.go: `t.Run("uses key-specific override value when set and lower than chain specific config", func(t *testing.T) { keySpecificPrice := assets.GWei(900) chainSpecificPrice := assets.GWei(1200) cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = chainSpecificPrice c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: keySpecificPrice, }, }, } }) assert.Equal(t, keySpecificPrice.String(), cfg3.EVM().GasEstimator().PriceMaxKey(addr).String()) })` $DIR/core/chains/evm/config/config_test.go: `c.GasEstimator.PriceMax = chainSpecificPrice` $DIR/core/chains/evm/config/config_test.go: `c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: keySpecificPrice, }, }, }` $DIR/core/chains/evm/config/config_test.go: `t.Run("uses chain-specific value when higher than key-specific value", func(t *testing.T) { keySpecificPrice := assets.GWei(1400) chainSpecificPrice := assets.GWei(1200) cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = chainSpecificPrice c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: keySpecificPrice, }, }, } }) assert.Equal(t, chainSpecificPrice.String(), cfg3.EVM().GasEstimator().PriceMaxKey(addr).String()) })` $DIR/core/chains/evm/config/config_test.go: `c.GasEstimator.PriceMax = chainSpecificPrice` $DIR/core/chains/evm/config/config_test.go: `c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: keySpecificPrice, }, }, }` $DIR/core/chains/evm/config/config_test.go: `t.Run("uses key-specific override value when set and lower than global config", func(t *testing.T) { keySpecificPrice := assets.GWei(900) cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: keySpecificPrice, }, }, } }) assert.Equal(t, keySpecificPrice.String(), cfg3.EVM().GasEstimator().PriceMaxKey(addr).String()) })` $DIR/core/chains/evm/config/config_test.go: `c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: keySpecificPrice, }, }, }` $DIR/core/chains/evm/config/config_test.go: `t.Run("uses global value when higher than key-specific value", func(t *testing.T) { keySpecificPrice := assets.GWei(1400) chainSpecificPrice := assets.GWei(1200) cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = chainSpecificPrice c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: keySpecificPrice, }, }, } }) assert.Equal(t, chainSpecificPrice.String(), cfg3.EVM().GasEstimator().PriceMaxKey(addr).String()) })` $DIR/core/chains/evm/config/config_test.go: `c.GasEstimator.PriceMax = chainSpecificPrice` $DIR/core/chains/evm/config/config_test.go: `c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: keySpecificPrice, }, }, }` $DIR/core/chains/evm/config/config_test.go: `t.Run("uses global value when there is no key-specific price", func(t *testing.T) { priceMax := assets.NewWeiI(rand.Int63()) unsetAddr := testutils.NewAddress() cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = priceMax }) assert.Equal(t, priceMax.String(), cfg3.EVM().GasEstimator().PriceMaxKey(unsetAddr).String()) })` $DIR/core/chains/evm/config/config_test.go: `c.GasEstimator.PriceMax = priceMax` $DIR/core/chains/evm/config/config_test.go: `t.Run("LinkContractAddress", func(t *testing.T) { t.Run("uses chain-specific default value when nothing is set", func(t *testing.T) { assert.Equal(t, "", cfg.EVM().LinkContractAddress()) }) t.Run("uses chain-specific override value when that is set", func(t *testing.T) { addr := testutils.NewAddress() cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.LinkContractAddress = ptr(types.EIP55AddressFromAddress(addr)) }) assert.Equal(t, addr.String(), cfg3.EVM().LinkContractAddress()) }) })` $DIR/core/chains/evm/config/config_test.go: `t.Run("uses chain-specific default value when nothing is set", func(t *testing.T) { assert.Equal(t, "", cfg.EVM().LinkContractAddress()) })` $DIR/core/chains/evm/config/config_test.go: `t.Run("uses chain-specific override value when that is set", func(t *testing.T) { addr := testutils.NewAddress() cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.LinkContractAddress = ptr(types.EIP55AddressFromAddress(addr)) }) assert.Equal(t, addr.String(), cfg3.EVM().LinkContractAddress()) })` $DIR/core/chains/evm/config/config_test.go: `c.LinkContractAddress = ptr(types.EIP55AddressFromAddress(addr))` $DIR/core/chains/evm/config/config_test.go: `t.Run("uses chain-specific default value when nothing is set", func(t *testing.T) { assert.Equal(t, "", cfg.EVM().OperatorFactoryAddress()) })` $DIR/core/chains/evm/config/config_test.go: `t.Run("uses chain-specific override value when that is set", func(t *testing.T) { val := testutils.NewAddress() cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.OperatorFactoryAddress = ptr(types.EIP55AddressFromAddress(val)) }) assert.Equal(t, val.String(), cfg3.EVM().OperatorFactoryAddress()) })` $DIR/core/chains/evm/config/config_test.go: `c.OperatorFactoryAddress = ptr(types.EIP55AddressFromAddress(val))` $DIR/core/chains/evm/config/config_test.go: `c.GasEstimator.PriceMax = assets.GWei(500)` $DIR/core/chains/evm/config/config_test.go: `c.ChainID = (*ubig.Big)(big.NewInt(56))` $DIR/core/chains/evm/config/config_test.go: `timeout = cfg.EVM().OCR().ContractTransmitterTransmitTimeout()` $DIR/core/chains/evm/config/config_test.go: `timeout = cfg.EVM().OCR().ObservationGracePeriod()` $DIR/core/chains/evm/config/config_test.go: `t.Run(tt.name, func(t *testing.T) { t.Parallel() config := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.ChainID = ubig.NewI(tt.chainID) }) assert.Equal(t, tt.expectedGasLimitDefault, config.EVM().GasEstimator().LimitDefault()) assert.Nil(t, config.EVM().GasEstimator().LimitJobType().OCR()) assert.Nil(t, config.EVM().GasEstimator().LimitJobType().DR()) assert.Nil(t, config.EVM().GasEstimator().LimitJobType().VRF()) assert.Nil(t, config.EVM().GasEstimator().LimitJobType().FM()) assert.Nil(t, config.EVM().GasEstimator().LimitJobType().Keeper()) assert.Equal(t, tt.expectedMinimumContractPayment, strings.TrimRight(config.EVM().MinContractPayment().Link(), "0")) })` $DIR/core/chains/evm/config/config_test.go: `c.ChainID = ubig.NewI(tt.chainID)` $DIR/core/chains/evm/config/config_test.go: `c.ChainID = id` $DIR/core/chains/evm/config/config_test.go: `c.NodePool = toml.NodePool{ Errors: toml.ClientErrors{ NonceTooLow: ptr("client error nonce too low"), NonceTooHigh: ptr("client error nonce too high"), ReplacementTransactionUnderpriced: ptr("client error replacement underpriced"), LimitReached: ptr("client error limit reached"), TransactionAlreadyInMempool: ptr("client error transaction already in mempool"), TerminallyUnderpriced: ptr("client error terminally underpriced"), InsufficientEth: ptr("client error insufficient eth"), TxFeeExceedsCap: ptr("client error tx fee exceeds cap"), L2FeeTooLow: ptr("client error l2 fee too low"), L2FeeTooHigh: ptr("client error l2 fee too high"), L2Full: ptr("client error l2 full"), TransactionAlreadyMined: ptr("client error transaction already mined"), Fatal: ptr("client error fatal"), ServiceUnavailable: ptr("client error service unavailable"), }, }` $DIR/core/chains/evm/config/config_test.go: `.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = assets.NewWeiI(100000000000000) })` $DIR/core/chains/evm/config/config_test.go: `.NewWeiI(100000000000000)` $DIR/core/chains/evm/config/config_test.go: `.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = assets.NewWeiI(100000000000000) c.GasEstimator.PriceDefault = assets.NewWeiI(42000000000) })` $DIR/core/chains/evm/config/config_test.go: `.NewWeiI(100000000000000)` $DIR/core/chains/evm/config/config_test.go: `.NewWeiI(42000000000)` $DIR/core/chains/evm/config/config_test.go: `.Run("EVM().GasEstimator().PriceDefault()", func(t *testing.T) { assert.Equal(t, assets.NewWeiI(20000000000), cfg.EVM().GasEstimator().PriceDefault()) assert.Equal(t, assets.NewWeiI(42000000000), cfg2.EVM().GasEstimator().PriceDefault()) })` $DIR/core/chains/evm/config/config_test.go: `.Run("EvmGasBumpTxDepthDefault", func(t *testing.T) { t.Run("uses MaxInFlightTransactions when not set", func(t *testing.T) { assert.Equal(t, cfg.EVM().Transactions().MaxInFlight(), cfg.EVM().GasEstimator().BumpTxDepth()) }) t.Run("uses customer configured value when set", func(t *testing.T) { var bumpTxDepth uint32 = 10 cfg2 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.BumpTxDepth = &bumpTxDepth }) assert.NotEqual(t, cfg2.EVM().Transactions().MaxInFlight(), cfg2.EVM().GasEstimator().BumpTxDepth()) assert.Equal(t, bumpTxDepth, cfg2.EVM().GasEstimator().BumpTxDepth()) }) })` $DIR/core/chains/evm/config/config_test.go: `.Run("uses MaxInFlightTransactions when not set", func(t *testing.T) { assert.Equal(t, cfg.EVM().Transactions().MaxInFlight(), cfg.EVM().GasEstimator().BumpTxDepth()) })` $DIR/core/chains/evm/config/config_test.go: `.Run("uses customer configured value when set", func(t *testing.T) { var bumpTxDepth uint32 = 10 cfg2 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.BumpTxDepth = &bumpTxDepth }) assert.NotEqual(t, cfg2.EVM().Transactions().MaxInFlight(), cfg2.EVM().GasEstimator().BumpTxDepth()) assert.Equal(t, bumpTxDepth, cfg2.EVM().GasEstimator().BumpTxDepth()) })` $DIR/core/chains/evm/config/config_test.go: `.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.BumpTxDepth = &bumpTxDepth })` $DIR/core/chains/evm/config/config_test.go: `.Run("PriceMaxKey", func(t *testing.T) { addr := testutils.NewAddress() randomOtherAddr := testutils.NewAddress() cfg2 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(randomOtherAddr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: assets.GWei(850), }, }, } c.GasEstimator.PriceMax = assets.NewWeiI(100000000000000) c.GasEstimator.PriceDefault = assets.NewWeiI(42000000000) }) t.Run("uses chain-specific default value when nothing is set", func(t *testing.T) { assert.Equal(t, assets.NewWeiI(100000000000000), cfg2.EVM().GasEstimator().PriceMaxKey(addr)) }) t.Run("uses chain-specific override value when that is set", func(t *testing.T) { priceMax := assets.NewWeiI(rand.Int63()) cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = priceMax }) assert.Equal(t, priceMax.String(), cfg3.EVM().GasEstimator().PriceMaxKey(addr).String()) }) t.Run("uses key-specific override value when set", func(t *testing.T) { tests := []struct { name string val *assets.Wei }{ {"Test with 250 GWei", assets.GWei(250)}, {"Test with 0 GWei", assets.GWei(0)}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: tt.val, }, }, } }) assert.Equal(t, tt.val.String(), cfg3.EVM().GasEstimator().PriceMaxKey(addr).String()) }) } }) t.Run("uses key-specific override value when set and lower than chain specific config", func(t *testing.T) { keySpecificPrice := assets.GWei(900) chainSpecificPrice := assets.GWei(1200) cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = chainSpecificPrice c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: keySpecificPrice, }, }, } }) assert.Equal(t, keySpecificPrice.String(), cfg3.EVM().GasEstimator().PriceMaxKey(addr).String()) }) t.Run("uses chain-specific value when higher than key-specific value", func(t *testing.T) { keySpecificPrice := assets.GWei(1400) chainSpecificPrice := assets.GWei(1200) cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = chainSpecificPrice c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: keySpecificPrice, }, }, } }) assert.Equal(t, chainSpecificPrice.String(), cfg3.EVM().GasEstimator().PriceMaxKey(addr).String()) }) t.Run("uses key-specific override value when set and lower than global config", func(t *testing.T) { keySpecificPrice := assets.GWei(900) cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: keySpecificPrice, }, }, } }) assert.Equal(t, keySpecificPrice.String(), cfg3.EVM().GasEstimator().PriceMaxKey(addr).String()) }) t.Run("uses global value when higher than key-specific value", func(t *testing.T) { keySpecificPrice := assets.GWei(1400) chainSpecificPrice := assets.GWei(1200) cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = chainSpecificPrice c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: keySpecificPrice, }, }, } }) assert.Equal(t, chainSpecificPrice.String(), cfg3.EVM().GasEstimator().PriceMaxKey(addr).String()) }) t.Run("uses global value when there is no key-specific price", func(t *testing.T) { priceMax := assets.NewWeiI(rand.Int63()) unsetAddr := testutils.NewAddress() cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = priceMax }) assert.Equal(t, priceMax.String(), cfg3.EVM().GasEstimator().PriceMaxKey(unsetAddr).String()) }) })` $DIR/core/chains/evm/config/config_test.go: `.NewAddress()` $DIR/core/chains/evm/config/config_test.go: `.NewAddress()` $DIR/core/chains/evm/config/config_test.go: `.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(randomOtherAddr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: assets.GWei(850), }, }, } c.GasEstimator.PriceMax = assets.NewWeiI(100000000000000) c.GasEstimator.PriceDefault = assets.NewWeiI(42000000000) })` $DIR/core/chains/evm/config/config_test.go: `.EIP55AddressFromAddress(randomOtherAddr)` $DIR/core/chains/evm/config/config_test.go: `.GWei(850)` $DIR/core/chains/evm/config/config_test.go: `.NewWeiI(100000000000000)` $DIR/core/chains/evm/config/config_test.go: `.NewWeiI(42000000000)` $DIR/core/chains/evm/config/config_test.go: `.Run("uses chain-specific default value when nothing is set", func(t *testing.T) { assert.Equal(t, assets.NewWeiI(100000000000000), cfg2.EVM().GasEstimator().PriceMaxKey(addr)) })` $DIR/core/chains/evm/config/config_test.go: `.Run("uses chain-specific override value when that is set", func(t *testing.T) { priceMax := assets.NewWeiI(rand.Int63()) cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = priceMax }) assert.Equal(t, priceMax.String(), cfg3.EVM().GasEstimator().PriceMaxKey(addr).String()) })` $DIR/core/chains/evm/config/config_test.go: `.NewWeiI(rand.Int63())` $DIR/core/chains/evm/config/config_test.go: `.Int63()` $DIR/core/chains/evm/config/config_test.go: `.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = priceMax })` $DIR/core/chains/evm/config/config_test.go: `.Run("uses key-specific override value when set", func(t *testing.T) { tests := []struct { name string val *assets.Wei }{ {"Test with 250 GWei", assets.GWei(250)}, {"Test with 0 GWei", assets.GWei(0)}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: tt.val, }, }, } }) assert.Equal(t, tt.val.String(), cfg3.EVM().GasEstimator().PriceMaxKey(addr).String()) }) } })` $DIR/core/chains/evm/config/config_test.go: `.GWei(250)` $DIR/core/chains/evm/config/config_test.go: `.GWei(0)` $DIR/core/chains/evm/config/config_test.go: `.Run(tt.name, func(t *testing.T) { cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: tt.val, }, }, } }) assert.Equal(t, tt.val.String(), cfg3.EVM().GasEstimator().PriceMaxKey(addr).String()) })` $DIR/core/chains/evm/config/config_test.go: `.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: tt.val, }, }, } })` $DIR/core/chains/evm/config/config_test.go: `.EIP55AddressFromAddress(addr)` $DIR/core/chains/evm/config/config_test.go: `.Run("uses key-specific override value when set and lower than chain specific config", func(t *testing.T) { keySpecificPrice := assets.GWei(900) chainSpecificPrice := assets.GWei(1200) cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = chainSpecificPrice c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: keySpecificPrice, }, }, } }) assert.Equal(t, keySpecificPrice.String(), cfg3.EVM().GasEstimator().PriceMaxKey(addr).String()) })` $DIR/core/chains/evm/config/config_test.go: `.GWei(900)` $DIR/core/chains/evm/config/config_test.go: `.GWei(1200)` $DIR/core/chains/evm/config/config_test.go: `.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = chainSpecificPrice c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: keySpecificPrice, }, }, } })` $DIR/core/chains/evm/config/config_test.go: `.EIP55AddressFromAddress(addr)` $DIR/core/chains/evm/config/config_test.go: `.Run("uses chain-specific value when higher than key-specific value", func(t *testing.T) { keySpecificPrice := assets.GWei(1400) chainSpecificPrice := assets.GWei(1200) cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = chainSpecificPrice c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: keySpecificPrice, }, }, } }) assert.Equal(t, chainSpecificPrice.String(), cfg3.EVM().GasEstimator().PriceMaxKey(addr).String()) })` $DIR/core/chains/evm/config/config_test.go: `.GWei(1400)` $DIR/core/chains/evm/config/config_test.go: `.GWei(1200)` $DIR/core/chains/evm/config/config_test.go: `.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = chainSpecificPrice c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: keySpecificPrice, }, }, } })` $DIR/core/chains/evm/config/config_test.go: `.EIP55AddressFromAddress(addr)` $DIR/core/chains/evm/config/config_test.go: `.Run("uses key-specific override value when set and lower than global config", func(t *testing.T) { keySpecificPrice := assets.GWei(900) cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: keySpecificPrice, }, }, } }) assert.Equal(t, keySpecificPrice.String(), cfg3.EVM().GasEstimator().PriceMaxKey(addr).String()) })` $DIR/core/chains/evm/config/config_test.go: `.GWei(900)` $DIR/core/chains/evm/config/config_test.go: `.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: keySpecificPrice, }, }, } })` $DIR/core/chains/evm/config/config_test.go: `.EIP55AddressFromAddress(addr)` $DIR/core/chains/evm/config/config_test.go: `.Run("uses global value when higher than key-specific value", func(t *testing.T) { keySpecificPrice := assets.GWei(1400) chainSpecificPrice := assets.GWei(1200) cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = chainSpecificPrice c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: keySpecificPrice, }, }, } }) assert.Equal(t, chainSpecificPrice.String(), cfg3.EVM().GasEstimator().PriceMaxKey(addr).String()) })` $DIR/core/chains/evm/config/config_test.go: `.GWei(1400)` $DIR/core/chains/evm/config/config_test.go: `.GWei(1200)` $DIR/core/chains/evm/config/config_test.go: `.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = chainSpecificPrice c.KeySpecific = toml.KeySpecificConfig{ {Key: ptr(types.EIP55AddressFromAddress(addr)), GasEstimator: toml.KeySpecificGasEstimator{ PriceMax: keySpecificPrice, }, }, } })` $DIR/core/chains/evm/config/config_test.go: `.EIP55AddressFromAddress(addr)` $DIR/core/chains/evm/config/config_test.go: `.Run("uses global value when there is no key-specific price", func(t *testing.T) { priceMax := assets.NewWeiI(rand.Int63()) unsetAddr := testutils.NewAddress() cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = priceMax }) assert.Equal(t, priceMax.String(), cfg3.EVM().GasEstimator().PriceMaxKey(unsetAddr).String()) })` $DIR/core/chains/evm/config/config_test.go: `.NewWeiI(rand.Int63())` $DIR/core/chains/evm/config/config_test.go: `.Int63()` $DIR/core/chains/evm/config/config_test.go: `.NewAddress()` $DIR/core/chains/evm/config/config_test.go: `.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = priceMax })` $DIR/core/chains/evm/config/config_test.go: `.Run("LinkContractAddress", func(t *testing.T) { t.Run("uses chain-specific default value when nothing is set", func(t *testing.T) { assert.Equal(t, "", cfg.EVM().LinkContractAddress()) }) t.Run("uses chain-specific override value when that is set", func(t *testing.T) { addr := testutils.NewAddress() cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.LinkContractAddress = ptr(types.EIP55AddressFromAddress(addr)) }) assert.Equal(t, addr.String(), cfg3.EVM().LinkContractAddress()) }) })` $DIR/core/chains/evm/config/config_test.go: `.Run("uses chain-specific default value when nothing is set", func(t *testing.T) { assert.Equal(t, "", cfg.EVM().LinkContractAddress()) })` $DIR/core/chains/evm/config/config_test.go: `.Run("uses chain-specific override value when that is set", func(t *testing.T) { addr := testutils.NewAddress() cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.LinkContractAddress = ptr(types.EIP55AddressFromAddress(addr)) }) assert.Equal(t, addr.String(), cfg3.EVM().LinkContractAddress()) })` $DIR/core/chains/evm/config/config_test.go: `.NewAddress()` $DIR/core/chains/evm/config/config_test.go: `.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.LinkContractAddress = ptr(types.EIP55AddressFromAddress(addr)) })` $DIR/core/chains/evm/config/config_test.go: `.EIP55AddressFromAddress(addr)` $DIR/core/chains/evm/config/config_test.go: `.Run("uses chain-specific default value when nothing is set", func(t *testing.T) { assert.Equal(t, "", cfg.EVM().OperatorFactoryAddress()) })` $DIR/core/chains/evm/config/config_test.go: `.Run("uses chain-specific override value when that is set", func(t *testing.T) { val := testutils.NewAddress() cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.OperatorFactoryAddress = ptr(types.EIP55AddressFromAddress(val)) }) assert.Equal(t, val.String(), cfg3.EVM().OperatorFactoryAddress()) })` $DIR/core/chains/evm/config/config_test.go: `.NewAddress()` $DIR/core/chains/evm/config/config_test.go: `.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.OperatorFactoryAddress = ptr(types.EIP55AddressFromAddress(val)) })` $DIR/core/chains/evm/config/config_test.go: `.EIP55AddressFromAddress(val)` $DIR/core/chains/evm/config/config_test.go: `.NewTestChainScopedConfig(t, nil)` $DIR/core/chains/evm/config/config_test.go: `.EVM()` $DIR/core/chains/evm/config/config_test.go: `.GasEstimator()` $DIR/core/chains/evm/config/config_test.go: `.BlockHistory()` $DIR/core/chains/evm/config/config_test.go: `.EIP1559FeeCapBufferBlocks()` $DIR/core/chains/evm/config/config_test.go: `.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.GasEstimator.PriceMax = assets.GWei(500) })` $DIR/core/chains/evm/config/config_test.go: `.GWei(500)` $DIR/core/chains/evm/config/config_test.go: `.EVM()` $DIR/core/chains/evm/config/config_test.go: `.GasEstimator()` $DIR/core/chains/evm/config/config_test.go: `.NewWeiI(1)` $DIR/core/chains/evm/config/config_test.go: `.TipCapMin()` $DIR/core/chains/evm/config/config_test.go: `.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.ChainID = (*ubig.Big)(big.NewInt(56)) })` $DIR/core/chains/evm/config/config_test.go: `.NewInt(56)` $DIR/core/chains/evm/config/config_test.go: `.EVM()` $DIR/core/chains/evm/config/config_test.go: `.OCR()` $DIR/core/chains/evm/config/config_test.go: `.DatabaseTimeout()` $DIR/core/chains/evm/config/config_test.go: `.EVM()` $DIR/core/chains/evm/config/config_test.go: `.OCR()` $DIR/core/chains/evm/config/config_test.go: `.ContractTransmitterTransmitTimeout()` $DIR/core/chains/evm/config/config_test.go: `.EVM()` $DIR/core/chains/evm/config/config_test.go: `.OCR()` $DIR/core/chains/evm/config/config_test.go: `.ObservationGracePeriod()` $DIR/core/chains/evm/config/config_test.go: `.Run(tt.name, func(t *testing.T) { t.Parallel() config := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.ChainID = ubig.NewI(tt.chainID) }) assert.Equal(t, tt.expectedGasLimitDefault, config.EVM().GasEstimator().LimitDefault()) assert.Nil(t, config.EVM().GasEstimator().LimitJobType().OCR()) assert.Nil(t, config.EVM().GasEstimator().LimitJobType().DR()) assert.Nil(t, config.EVM().GasEstimator().LimitJobType().VRF()) assert.Nil(t, config.EVM().GasEstimator().LimitJobType().FM()) assert.Nil(t, config.EVM().GasEstimator().LimitJobType().Keeper()) assert.Equal(t, tt.expectedMinimumContractPayment, strings.TrimRight(config.EVM().MinContractPayment().Link(), "0")) })` $DIR/core/chains/evm/config/config_test.go: `.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.ChainID = ubig.NewI(tt.chainID) })` $DIR/core/chains/evm/config/config_test.go: `.NewI(tt.chainID)` $DIR/core/chains/evm/config/config_test.go: `.NewTestChainScopedConfig(t, nil)` $DIR/core/chains/evm/config/config_test.go: `.EVM()` $DIR/core/chains/evm/config/config_test.go: `.HeadTracker()` $DIR/core/chains/evm/config/config_test.go: `.MaxAllowedFinalityDepth()` $DIR/core/chains/evm/config/config_test.go: `.NewTestChainScopedConfig(t, nil)` $DIR/core/chains/evm/config/config_test.go: `.EVM()` $DIR/core/chains/evm/config/config_test.go: `.NodePool()` $DIR/core/chains/evm/config/config_test.go: `.NodeIsSyncingEnabled()` $DIR/core/chains/evm/config/config_test.go: `.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { id := ubig.New(big.NewInt(rand.Int63())) c.ChainID = id c.NodePool = toml.NodePool{ Errors: toml.ClientErrors{ NonceTooLow: ptr("client error nonce too low"), NonceTooHigh: ptr("client error nonce too high"), ReplacementTransactionUnderpriced: ptr("client error replacement underpriced"), LimitReached: ptr("client error limit reached"), TransactionAlreadyInMempool: ptr("client error transaction already in mempool"), TerminallyUnderpriced: ptr("client error terminally underpriced"), InsufficientEth: ptr("client error insufficient eth"), TxFeeExceedsCap: ptr("client error tx fee exceeds cap"), L2FeeTooLow: ptr("client error l2 fee too low"), L2FeeTooHigh: ptr("client error l2 fee too high"), L2Full: ptr("client error l2 full"), TransactionAlreadyMined: ptr("client error transaction already mined"), Fatal: ptr("client error fatal"), ServiceUnavailable: ptr("client error service unavailable"), }, } })` $DIR/core/chains/evm/config/config_test.go: `.New(big.NewInt(rand.Int63()))` $DIR/core/chains/evm/config/config_test.go: `.NewInt(rand.Int63())` $DIR/core/chains/evm/config/config_test.go: `.Int63()` $DIR/core/chains/evm/config/config_test.go: `.EVM()` $DIR/core/chains/evm/config/config_test.go: `.NodePool()` $DIR/core/chains/evm/config/config_test.go: `.Errors()` $DIR/core/chains/evm/config/toml/config_test.go: `t.Run(fmt.Sprintf("chainID-%s", id), func(t *testing.T) { evmCfg := &toml.EVMConfig{ ChainID: id, Chain: toml.Defaults(id), Nodes: toml.EVMNodes{{ Name: &name, WSURL: config.MustParseURL("wss://foo.test/ws"), HTTPURL: config.MustParseURL("http://foo.test"), }}, } assert.NoError(t, config.Validate(evmCfg)) })` $DIR/core/chains/evm/config/toml/config_test.go: `.Run(fmt.Sprintf("chainID-%s", id), func(t *testing.T) { evmCfg := &toml.EVMConfig{ ChainID: id, Chain: toml.Defaults(id), Nodes: toml.EVMNodes{{ Name: &name, WSURL: config.MustParseURL("wss://foo.test/ws"), HTTPURL: config.MustParseURL("http://foo.test"), }}, } assert.NoError(t, config.Validate(evmCfg)) })` $DIR/core/chains/evm/config/toml/config_test.go: `.Sprintf("chainID-%s", id)` $DIR/core/chains/evm/config/toml/config_test.go: `.Defaults(id)` $DIR/core/chains/evm/config/toml/config_test.go: `.MustParseURL("wss://foo.test/ws")` $DIR/core/chains/evm/config/toml/config_test.go: `.MustParseURL("http://foo.test")` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `t.Cleanup(func() { ec.Close() })` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `ec.Commit()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `_, err = forwarder.SetAuthorizedSenders(owner, []common.Address{owner.From})` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `ec.Commit()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `fwdMgr.ORM = forwarders.NewORM(db)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `err = fwdMgr.Close()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `cleanupCalled = true` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `err = fwdMgr.ORM.DeleteForwarder(ctx, fwd.ID, cleanup)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `t.Cleanup(func() { ec.Close() })` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `ec.Commit()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `fwdMgr.ORM = forwarders.NewORM(db)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `_, err = fwdMgr.ORM.CreateForwarder(ctx, forwarderAddr, ubig.Big(*testutils.FixtureChainID))` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `err = fwdMgr.Start(testutils.Context(t))` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `err = fwdMgr.Close()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `t.Cleanup(func() { ec.Close() })` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `ec.Commit()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `ec.Commit()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `fwdMgr.ORM = forwarders.NewORM(db)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `_, err = fwdMgr.ORM.CreateForwarder(ctx, forwarderAddr, ubig.Big(*testutils.FixtureChainID))` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `fwdMgr = forwarders.NewFwdMgr(db, evmClient, lp, lggr, evmcfg.EVM())` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `_, err = forwarder.SetAuthorizedSenders(owner, []common.Address{owner.From})` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `ec.Commit()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `addr, err = fwdMgr.ForwarderForOCR2Feeds(ctx, owner.From, ocr2Address)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `_, err = ocr2.SetConfig(owner, []common.Address{testutils.NewAddress(), testutils.NewAddress(), testutils.NewAddress(), testutils.NewAddress()}, []common.Address{forwarderAddr, testutils.NewAddress(), testutils.NewAddress(), testutils.NewAddress()}, 1, onchainConfig, 0, []byte{})` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `ec.Commit()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `fwdMgr = forwarders.NewFwdMgr(db, evmClient, lp, lggr, evmcfg.EVM())` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `addr, err = fwdMgr.ForwarderForOCR2Feeds(ctx, owner.From, ocr2Address)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.Test(t)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewTestGeneralConfig(t)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.MustNewSimTransactor(t)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.Context(t)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewSimulatedBackend(map[common.Address]core.GenesisAccount{ owner.From: { Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), }, }, 10e6)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewInt(0)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.Mul(big.NewInt(10), big.NewInt(1e18))` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewInt(10)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewInt(1e18)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.Cleanup(func() { ec.Close() })` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.HexToAddress("0x01BE23585060835E02B77ef475b0Cc51aA1e0709")` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.DeployOperator(owner, ec, linkAddr, owner.From)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.DeployAuthorizedForwarder(owner, ec, linkAddr, owner.From, operatorAddr, []byte{})` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.Commit()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.SetAuthorizedSenders(owner, []common.Address{owner.From})` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.Commit()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.GetAuthorizedSenders(nil)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewSimulatedBackendClient(t, ec, testutils.FixtureChainID)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewLogPoller(logpoller.NewORM(testutils.FixtureChainID, db, lggr), evmClient, lggr, lpOpts)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewORM(testutils.FixtureChainID, db, lggr)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewFwdMgr(db, evmClient, lp, lggr, evmcfg.EVM())` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.EVM()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewORM(db)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.ORM.CreateForwarder(ctx, forwarderAddr, ubig.Big(*testutils.FixtureChainID))` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.Big(*testutils.FixtureChainID)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.ORM.FindForwardersByChain(ctx, ubig.Big(*testutils.FixtureChainID))` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.Big(*testutils.FixtureChainID)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.ForwarderFor(ctx, owner.From)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.ORM.DeleteForwarder(ctx, fwd.ID, cleanup)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.Test(t)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.Context(t)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewTestGeneralConfig(t)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.MustNewSimTransactor(t)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewSimulatedBackend(map[common.Address]core.GenesisAccount{ owner.From: { Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), }, }, 10e6)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewInt(0)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.Mul(big.NewInt(10), big.NewInt(1e18))` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewInt(10)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewInt(1e18)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.Cleanup(func() { ec.Close() })` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.HexToAddress("0x01BE23585060835E02B77ef475b0Cc51aA1e0709")` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.DeployOperator(owner, ec, linkAddr, owner.From)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.DeployAuthorizedForwarder(owner, ec, linkAddr, owner.From, operatorAddr, []byte{})` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.Commit()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewSimulatedBackendClient(t, ec, testutils.FixtureChainID)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewLogPoller(logpoller.NewORM(testutils.FixtureChainID, db, lggr), evmClient, lggr, lpOpts)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewORM(testutils.FixtureChainID, db, lggr)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewFwdMgr(db, evmClient, lp, lggr, evmcfg.EVM())` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.EVM()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewORM(db)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.ORM.CreateForwarder(ctx, forwarderAddr, ubig.Big(*testutils.FixtureChainID))` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.Big(*testutils.FixtureChainID)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.ORM.FindForwardersByChain(ctx, ubig.Big(*testutils.FixtureChainID))` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.Big(*testutils.FixtureChainID)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.Start(testutils.Context(t))` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.Context(t)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.ForwarderFor(ctx, owner.From)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.Test(t)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.Context(t)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewTestGeneralConfig(t)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.MustNewSimTransactor(t)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewSimulatedBackend(map[common.Address]core.GenesisAccount{ owner.From: { Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), }, }, 10e6)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewInt(0)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.Mul(big.NewInt(10), big.NewInt(1e18))` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewInt(10)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewInt(1e18)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.Cleanup(func() { ec.Close() })` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.HexToAddress("0x01BE23585060835E02B77ef475b0Cc51aA1e0709")` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.DeployOperator(owner, ec, linkAddr, owner.From)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.DeployAuthorizedForwarder(owner, ec, linkAddr, owner.From, operatorAddr, []byte{})` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.Commit()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.DeploySimpleWriteAccessController(owner, ec)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.DeployOCR2Aggregator( owner, ec, linkAddr, big.NewInt(0), big.NewInt(10), accessAddress, accessAddress, 9, "TEST", )` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewInt(0)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewInt(10)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.Commit()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewSimulatedBackendClient(t, ec, testutils.FixtureChainID)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewLogPoller(logpoller.NewORM(testutils.FixtureChainID, db, lggr), evmClient, lggr, lpOpts)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewORM(testutils.FixtureChainID, db, lggr)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewFwdMgr(db, evmClient, lp, lggr, evmcfg.EVM())` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.EVM()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewORM(db)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.ORM.CreateForwarder(ctx, forwarderAddr, ubig.Big(*testutils.FixtureChainID))` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.Big(*testutils.FixtureChainID)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.ORM.FindForwardersByChain(ctx, ubig.Big(*testutils.FixtureChainID))` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.Big(*testutils.FixtureChainID)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewFwdMgr(db, evmClient, lp, lggr, evmcfg.EVM())` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.EVM()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.ForwarderForOCR2Feeds(ctx, owner.From, ocr2Address)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.SetAuthorizedSenders(owner, []common.Address{owner.From})` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.Commit()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.GetAuthorizedSenders(&bind.CallOpts{Context: ctx})` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.ForwarderForOCR2Feeds(ctx, owner.From, ocr2Address)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.GenerateDefaultOCR2OnchainConfig(big.NewInt(0), big.NewInt(10))` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewInt(0)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewInt(10)` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.SetConfig(owner, []common.Address{testutils.NewAddress(), testutils.NewAddress(), testutils.NewAddress(), testutils.NewAddress()}, []common.Address{forwarderAddr, testutils.NewAddress(), testutils.NewAddress(), testutils.NewAddress()}, 1, onchainConfig, 0, []byte{})` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewAddress()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewAddress()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewAddress()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewAddress()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewAddress()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewAddress()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewAddress()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.Commit()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.GetTransmitters(&bind.CallOpts{Context: ctx})` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.NewFwdMgr(db, evmClient, lp, lggr, evmcfg.EVM())` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.EVM()` $DIR/core/chains/evm/forwarders/forwarder_manager_test.go: `.ForwarderForOCR2Feeds(ctx, owner.From, ocr2Address)` $DIR/core/chains/evm/forwarders/orm_test.go: `cleanupCalled++` $DIR/core/chains/evm/forwarders/orm_test.go: `err = orm.DeleteForwarder(ctx, fwd.ID, testCleanupFn)` $DIR/core/chains/evm/forwarders/orm_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/forwarders/orm_test.go: `.NewAddress()` $DIR/core/chains/evm/forwarders/orm_test.go: `.Context(t)` $DIR/core/chains/evm/forwarders/orm_test.go: `.CreateForwarder(ctx, addr, *big.New(chainID))` $DIR/core/chains/evm/forwarders/orm_test.go: `.New(chainID)` $DIR/core/chains/evm/forwarders/orm_test.go: `.New("error during cleanup")` $DIR/core/chains/evm/forwarders/orm_test.go: `.DeleteForwarder(ctx, fwd.ID, testCleanupFn)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `t.Run("calling GetLegacyGas on unstarted estimator returns error", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollups.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient) o := gas.NewArbitrumEstimator(logger.Test(t), &arbConfig{}, feeEstimatorClient, l1Oracle) _, _, err := o.GetLegacyGas(tests.Context(t), calldata, gasLimit, maxGasPrice) assert.EqualError(t, err, "estimator is not started") })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `zeros.Write(common.BigToHash(big.NewInt(0)).Bytes())` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `zeros.Write(common.BigToHash(big.NewInt(0)).Bytes())` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `zeros.Write(common.BigToHash(big.NewInt(123455)).Bytes())` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `t.Run("calling GetLegacyGas on started estimator returns estimates", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollups.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(42) }) feeEstimatorClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) assert.Equal(t, rollups.ArbGasInfoAddress, callMsg.To.String()) assert.Equal(t, rollups.ArbGasInfo_getPricesInArbGas, fmt.Sprintf("%x", callMsg.Data)) assert.Equal(t, big.NewInt(-1), blockNumber) }).Return(zeros.Bytes(), nil) o := gas.NewArbitrumEstimator(logger.Test(t), &arbConfig{v: maxGasLimit, bumpPercent: bumpPercent, bumpMin: bumpMin}, feeEstimatorClient, l1Oracle) servicetest.RunHealthy(t, o) gasPrice, chainSpecificGasLimit, err := o.GetLegacyGas(tests.Context(t), calldata, gasLimit, maxGasPrice) require.NoError(t, err) // Expected price for a standard l2_suggested_estimator would be 42, but we add a fixed gasPriceBufferPercentage. assert.Equal(t, assets.NewWeiI(42).AddPercentage(gasPriceBufferPercentage), gasPrice) assert.Equal(t, gasLimit, chainSpecificGasLimit) })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(42) })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `(*big.Int)(res).SetInt64(42)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `feeEstimatorClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) assert.Equal(t, rollups.ArbGasInfoAddress, callMsg.To.String()) assert.Equal(t, rollups.ArbGasInfo_getPricesInArbGas, fmt.Sprintf("%x", callMsg.Data)) assert.Equal(t, big.NewInt(-1), blockNumber) }).Return(zeros.Bytes(), nil)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `servicetest.RunHealthy(t, o)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `t.Run("gas price is lower than user specified max gas price", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollups.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient) o := gas.NewArbitrumEstimator(logger.Test(t), &arbConfig{}, feeEstimatorClient, l1Oracle) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(42) }) feeEstimatorClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) assert.Equal(t, rollups.ArbGasInfoAddress, callMsg.To.String()) assert.Equal(t, rollups.ArbGasInfo_getPricesInArbGas, fmt.Sprintf("%x", callMsg.Data)) assert.Equal(t, big.NewInt(-1), blockNumber) }).Return(zeros.Bytes(), nil) servicetest.RunHealthy(t, o) gasPrice, chainSpecificGasLimit, err := o.GetLegacyGas(tests.Context(t), calldata, gasLimit, assets.NewWeiI(40)) require.Error(t, err) assert.EqualError(t, err, "estimated gas price: 42 wei is greater than the maximum gas price configured: 40 wei") assert.Nil(t, gasPrice) assert.Equal(t, uint64(0), chainSpecificGasLimit) })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(42) })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `(*big.Int)(res).SetInt64(42)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `feeEstimatorClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) assert.Equal(t, rollups.ArbGasInfoAddress, callMsg.To.String()) assert.Equal(t, rollups.ArbGasInfo_getPricesInArbGas, fmt.Sprintf("%x", callMsg.Data)) assert.Equal(t, big.NewInt(-1), blockNumber) }).Return(zeros.Bytes(), nil)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `servicetest.RunHealthy(t, o)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `t.Run("gas price is lower than global max gas price", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollups.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient) o := gas.NewArbitrumEstimator(logger.Test(t), &arbConfig{}, feeEstimatorClient, l1Oracle) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(120) }) feeEstimatorClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) assert.Equal(t, rollups.ArbGasInfoAddress, callMsg.To.String()) assert.Equal(t, rollups.ArbGasInfo_getPricesInArbGas, fmt.Sprintf("%x", callMsg.Data)) assert.Equal(t, big.NewInt(-1), blockNumber) }).Return(zeros.Bytes(), nil) servicetest.RunHealthy(t, o) gasPrice, chainSpecificGasLimit, err := o.GetLegacyGas(tests.Context(t), calldata, gasLimit, assets.NewWeiI(110)) assert.EqualError(t, err, "estimated gas price: 120 wei is greater than the maximum gas price configured: 110 wei") assert.Nil(t, gasPrice) assert.Equal(t, uint64(0), chainSpecificGasLimit) })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(120) })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `(*big.Int)(res).SetInt64(120)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `feeEstimatorClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) assert.Equal(t, rollups.ArbGasInfoAddress, callMsg.To.String()) assert.Equal(t, rollups.ArbGasInfo_getPricesInArbGas, fmt.Sprintf("%x", callMsg.Data)) assert.Equal(t, big.NewInt(-1), blockNumber) }).Return(zeros.Bytes(), nil)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `servicetest.RunHealthy(t, o)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `t.Run("calling BumpLegacyGas on unstarted arbitrum estimator returns error", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollups.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient) o := gas.NewArbitrumEstimator(logger.Test(t), &arbConfig{}, feeEstimatorClient, l1Oracle) _, _, err := o.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), gasLimit, assets.NewWeiI(10), nil) assert.EqualError(t, err, "estimator is not started") })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `t.Run("calling GetLegacyGas on started estimator if initial call failed returns error", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollups.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient) o := gas.NewArbitrumEstimator(logger.Test(t), &arbConfig{}, feeEstimatorClient, l1Oracle) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(pkgerrors.New("kaboom")) feeEstimatorClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) assert.Equal(t, rollups.ArbGasInfoAddress, callMsg.To.String()) assert.Equal(t, rollups.ArbGasInfo_getPricesInArbGas, fmt.Sprintf("%x", callMsg.Data)) assert.Equal(t, big.NewInt(-1), blockNumber) }).Return(zeros.Bytes(), nil) servicetest.RunHealthy(t, o) _, _, err := o.GetLegacyGas(tests.Context(t), calldata, gasLimit, maxGasPrice) assert.EqualError(t, err, "failed to estimate gas; gas price not set") })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(pkgerrors.New("kaboom"))` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `feeEstimatorClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) assert.Equal(t, rollups.ArbGasInfoAddress, callMsg.To.String()) assert.Equal(t, rollups.ArbGasInfo_getPricesInArbGas, fmt.Sprintf("%x", callMsg.Data)) assert.Equal(t, big.NewInt(-1), blockNumber) }).Return(zeros.Bytes(), nil)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `servicetest.RunHealthy(t, o)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `t.Run("calling GetDynamicFee always returns error", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollups.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient) o := gas.NewArbitrumEstimator(logger.Test(t), &arbConfig{}, feeEstimatorClient, l1Oracle) _, err := o.GetDynamicFee(tests.Context(t), maxGasPrice) assert.EqualError(t, err, "dynamic fees are not implemented for this estimator") })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `t.Run("calling BumpDynamicFee always returns error", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollups.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient) o := gas.NewArbitrumEstimator(logger.Test(t), &arbConfig{}, feeEstimatorClient, l1Oracle) fee := gas.DynamicFee{ FeeCap: assets.NewWeiI(42), TipCap: assets.NewWeiI(5), } _, err := o.BumpDynamicFee(tests.Context(t), fee, maxGasPrice, nil) assert.EqualError(t, err, "dynamic fees are not implemented for this estimator") })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `t.Run("limit computes", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollups.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(42) }) const ( perL2Tx = 50_000 perL1Calldata = 10_000 ) var expLimit = gasLimit + perL2Tx + perL1Calldata*uint64(len(calldata)) var b bytes.Buffer b.Write(common.BigToHash(big.NewInt(perL2Tx)).Bytes()) b.Write(common.BigToHash(big.NewInt(perL1Calldata)).Bytes()) b.Write(common.BigToHash(big.NewInt(123455)).Bytes()) feeEstimatorClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) assert.Equal(t, rollups.ArbGasInfoAddress, callMsg.To.String()) assert.Equal(t, rollups.ArbGasInfo_getPricesInArbGas, fmt.Sprintf("%x", callMsg.Data)) assert.Equal(t, big.NewInt(-1), blockNumber) }).Return(b.Bytes(), nil) o := gas.NewArbitrumEstimator(logger.Test(t), &arbConfig{v: maxGasLimit, bumpPercent: bumpPercent, bumpMin: bumpMin}, feeEstimatorClient, l1Oracle) servicetest.RunHealthy(t, o) gasPrice, chainSpecificGasLimit, err := o.GetLegacyGas(tests.Context(t), calldata, gasLimit, maxGasPrice) require.NoError(t, err) require.NotNil(t, gasPrice) // Again, a normal l2_suggested_estimator would return 42, but arbitrum_estimator adds a buffer. assert.Equal(t, "63 wei", gasPrice.String()) assert.Equal(t, expLimit, chainSpecificGasLimit, "expected %d but got %d", expLimit, chainSpecificGasLimit) })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(42) })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `(*big.Int)(res).SetInt64(42)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `b.Write(common.BigToHash(big.NewInt(perL2Tx)).Bytes())` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `b.Write(common.BigToHash(big.NewInt(perL1Calldata)).Bytes())` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `b.Write(common.BigToHash(big.NewInt(123455)).Bytes())` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `feeEstimatorClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) assert.Equal(t, rollups.ArbGasInfoAddress, callMsg.To.String()) assert.Equal(t, rollups.ArbGasInfo_getPricesInArbGas, fmt.Sprintf("%x", callMsg.Data)) assert.Equal(t, big.NewInt(-1), blockNumber) }).Return(b.Bytes(), nil)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `servicetest.RunHealthy(t, o)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(42) })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `(*big.Int)(res).SetInt64(42)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `b.Write(common.BigToHash(big.NewInt(perL2Tx)).Bytes())` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `b.Write(common.BigToHash(big.NewInt(perL1Calldata)).Bytes())` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `b.Write(common.BigToHash(big.NewInt(123455)).Bytes())` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `feeEstimatorClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) assert.Equal(t, rollups.ArbGasInfoAddress, callMsg.To.String()) assert.Equal(t, rollups.ArbGasInfo_getPricesInArbGas, fmt.Sprintf("%x", callMsg.Data)) assert.Equal(t, big.NewInt(-1), blockNumber) }).Return(b.Bytes(), nil)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `servicetest.RunHealthy(t, o)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewWei(big.NewInt(1))` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewInt(1)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Run("calling GetLegacyGas on unstarted estimator returns error", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollups.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient) o := gas.NewArbitrumEstimator(logger.Test(t), &arbConfig{}, feeEstimatorClient, l1Oracle) _, _, err := o.GetLegacyGas(tests.Context(t), calldata, gasLimit, maxGasPrice) assert.EqualError(t, err, "estimator is not started") })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewFeeEstimatorClient(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewArbitrumEstimator(logger.Test(t), &arbConfig{}, feeEstimatorClient, l1Oracle)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.GetLegacyGas(tests.Context(t), calldata, gasLimit, maxGasPrice)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Write(common.BigToHash(big.NewInt(0)).Bytes())` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.BigToHash(big.NewInt(0))` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewInt(0)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Bytes()` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Write(common.BigToHash(big.NewInt(0)).Bytes())` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.BigToHash(big.NewInt(0))` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewInt(0)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Bytes()` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Write(common.BigToHash(big.NewInt(123455)).Bytes())` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.BigToHash(big.NewInt(123455))` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewInt(123455)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Bytes()` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Run("calling GetLegacyGas on started estimator returns estimates", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollups.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(42) }) feeEstimatorClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) assert.Equal(t, rollups.ArbGasInfoAddress, callMsg.To.String()) assert.Equal(t, rollups.ArbGasInfo_getPricesInArbGas, fmt.Sprintf("%x", callMsg.Data)) assert.Equal(t, big.NewInt(-1), blockNumber) }).Return(zeros.Bytes(), nil) o := gas.NewArbitrumEstimator(logger.Test(t), &arbConfig{v: maxGasLimit, bumpPercent: bumpPercent, bumpMin: bumpMin}, feeEstimatorClient, l1Oracle) servicetest.RunHealthy(t, o) gasPrice, chainSpecificGasLimit, err := o.GetLegacyGas(tests.Context(t), calldata, gasLimit, maxGasPrice) require.NoError(t, err) // Expected price for a standard l2_suggested_estimator would be 42, but we add a fixed gasPriceBufferPercentage. assert.Equal(t, assets.NewWeiI(42).AddPercentage(gasPriceBufferPercentage), gasPrice) assert.Equal(t, gasLimit, chainSpecificGasLimit) })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewFeeEstimatorClient(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice")` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(42) })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.SetInt64(42)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{}))` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.IsType(ethereum.CallMsg{})` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.IsType(&big.Int{})` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) assert.Equal(t, rollups.ArbGasInfoAddress, callMsg.To.String()) assert.Equal(t, rollups.ArbGasInfo_getPricesInArbGas, fmt.Sprintf("%x", callMsg.Data)) assert.Equal(t, big.NewInt(-1), blockNumber) })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Get(2)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Return(zeros.Bytes(), nil)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Bytes()` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewArbitrumEstimator(logger.Test(t), &arbConfig{v: maxGasLimit, bumpPercent: bumpPercent, bumpMin: bumpMin}, feeEstimatorClient, l1Oracle)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.RunHealthy(t, o)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.GetLegacyGas(tests.Context(t), calldata, gasLimit, maxGasPrice)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Run("gas price is lower than user specified max gas price", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollups.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient) o := gas.NewArbitrumEstimator(logger.Test(t), &arbConfig{}, feeEstimatorClient, l1Oracle) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(42) }) feeEstimatorClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) assert.Equal(t, rollups.ArbGasInfoAddress, callMsg.To.String()) assert.Equal(t, rollups.ArbGasInfo_getPricesInArbGas, fmt.Sprintf("%x", callMsg.Data)) assert.Equal(t, big.NewInt(-1), blockNumber) }).Return(zeros.Bytes(), nil) servicetest.RunHealthy(t, o) gasPrice, chainSpecificGasLimit, err := o.GetLegacyGas(tests.Context(t), calldata, gasLimit, assets.NewWeiI(40)) require.Error(t, err) assert.EqualError(t, err, "estimated gas price: 42 wei is greater than the maximum gas price configured: 40 wei") assert.Nil(t, gasPrice) assert.Equal(t, uint64(0), chainSpecificGasLimit) })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewFeeEstimatorClient(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewArbitrumEstimator(logger.Test(t), &arbConfig{}, feeEstimatorClient, l1Oracle)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice")` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(42) })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.SetInt64(42)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{}))` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.IsType(ethereum.CallMsg{})` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.IsType(&big.Int{})` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) assert.Equal(t, rollups.ArbGasInfoAddress, callMsg.To.String()) assert.Equal(t, rollups.ArbGasInfo_getPricesInArbGas, fmt.Sprintf("%x", callMsg.Data)) assert.Equal(t, big.NewInt(-1), blockNumber) })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Get(2)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Return(zeros.Bytes(), nil)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Bytes()` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.RunHealthy(t, o)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.GetLegacyGas(tests.Context(t), calldata, gasLimit, assets.NewWeiI(40))` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewWeiI(40)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Run("gas price is lower than global max gas price", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollups.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient) o := gas.NewArbitrumEstimator(logger.Test(t), &arbConfig{}, feeEstimatorClient, l1Oracle) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(120) }) feeEstimatorClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) assert.Equal(t, rollups.ArbGasInfoAddress, callMsg.To.String()) assert.Equal(t, rollups.ArbGasInfo_getPricesInArbGas, fmt.Sprintf("%x", callMsg.Data)) assert.Equal(t, big.NewInt(-1), blockNumber) }).Return(zeros.Bytes(), nil) servicetest.RunHealthy(t, o) gasPrice, chainSpecificGasLimit, err := o.GetLegacyGas(tests.Context(t), calldata, gasLimit, assets.NewWeiI(110)) assert.EqualError(t, err, "estimated gas price: 120 wei is greater than the maximum gas price configured: 110 wei") assert.Nil(t, gasPrice) assert.Equal(t, uint64(0), chainSpecificGasLimit) })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewFeeEstimatorClient(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewArbitrumEstimator(logger.Test(t), &arbConfig{}, feeEstimatorClient, l1Oracle)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice")` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(120) })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.SetInt64(120)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{}))` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.IsType(ethereum.CallMsg{})` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.IsType(&big.Int{})` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) assert.Equal(t, rollups.ArbGasInfoAddress, callMsg.To.String()) assert.Equal(t, rollups.ArbGasInfo_getPricesInArbGas, fmt.Sprintf("%x", callMsg.Data)) assert.Equal(t, big.NewInt(-1), blockNumber) })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Get(2)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Return(zeros.Bytes(), nil)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Bytes()` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.RunHealthy(t, o)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.GetLegacyGas(tests.Context(t), calldata, gasLimit, assets.NewWeiI(110))` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewWeiI(110)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Run("calling BumpLegacyGas on unstarted arbitrum estimator returns error", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollups.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient) o := gas.NewArbitrumEstimator(logger.Test(t), &arbConfig{}, feeEstimatorClient, l1Oracle) _, _, err := o.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), gasLimit, assets.NewWeiI(10), nil) assert.EqualError(t, err, "estimator is not started") })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewFeeEstimatorClient(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewArbitrumEstimator(logger.Test(t), &arbConfig{}, feeEstimatorClient, l1Oracle)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), gasLimit, assets.NewWeiI(10), nil)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewWeiI(42)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Run("calling GetLegacyGas on started estimator if initial call failed returns error", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollups.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient) o := gas.NewArbitrumEstimator(logger.Test(t), &arbConfig{}, feeEstimatorClient, l1Oracle) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(pkgerrors.New("kaboom")) feeEstimatorClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) assert.Equal(t, rollups.ArbGasInfoAddress, callMsg.To.String()) assert.Equal(t, rollups.ArbGasInfo_getPricesInArbGas, fmt.Sprintf("%x", callMsg.Data)) assert.Equal(t, big.NewInt(-1), blockNumber) }).Return(zeros.Bytes(), nil) servicetest.RunHealthy(t, o) _, _, err := o.GetLegacyGas(tests.Context(t), calldata, gasLimit, maxGasPrice) assert.EqualError(t, err, "failed to estimate gas; gas price not set") })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewFeeEstimatorClient(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewArbitrumEstimator(logger.Test(t), &arbConfig{}, feeEstimatorClient, l1Oracle)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice")` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Return(pkgerrors.New("kaboom"))` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.New("kaboom")` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{}))` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.IsType(ethereum.CallMsg{})` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.IsType(&big.Int{})` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) assert.Equal(t, rollups.ArbGasInfoAddress, callMsg.To.String()) assert.Equal(t, rollups.ArbGasInfo_getPricesInArbGas, fmt.Sprintf("%x", callMsg.Data)) assert.Equal(t, big.NewInt(-1), blockNumber) })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Get(2)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Return(zeros.Bytes(), nil)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Bytes()` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.RunHealthy(t, o)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.GetLegacyGas(tests.Context(t), calldata, gasLimit, maxGasPrice)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Run("calling GetDynamicFee always returns error", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollups.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient) o := gas.NewArbitrumEstimator(logger.Test(t), &arbConfig{}, feeEstimatorClient, l1Oracle) _, err := o.GetDynamicFee(tests.Context(t), maxGasPrice) assert.EqualError(t, err, "dynamic fees are not implemented for this estimator") })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewFeeEstimatorClient(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewArbitrumEstimator(logger.Test(t), &arbConfig{}, feeEstimatorClient, l1Oracle)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.GetDynamicFee(tests.Context(t), maxGasPrice)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Run("calling BumpDynamicFee always returns error", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollups.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient) o := gas.NewArbitrumEstimator(logger.Test(t), &arbConfig{}, feeEstimatorClient, l1Oracle) fee := gas.DynamicFee{ FeeCap: assets.NewWeiI(42), TipCap: assets.NewWeiI(5), } _, err := o.BumpDynamicFee(tests.Context(t), fee, maxGasPrice, nil) assert.EqualError(t, err, "dynamic fees are not implemented for this estimator") })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewFeeEstimatorClient(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewArbitrumEstimator(logger.Test(t), &arbConfig{}, feeEstimatorClient, l1Oracle)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewWeiI(42)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewWeiI(5)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.BumpDynamicFee(tests.Context(t), fee, maxGasPrice, nil)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Run("limit computes", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollups.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(42) }) const ( perL2Tx = 50_000 perL1Calldata = 10_000 ) var expLimit = gasLimit + perL2Tx + perL1Calldata*uint64(len(calldata)) var b bytes.Buffer b.Write(common.BigToHash(big.NewInt(perL2Tx)).Bytes()) b.Write(common.BigToHash(big.NewInt(perL1Calldata)).Bytes()) b.Write(common.BigToHash(big.NewInt(123455)).Bytes()) feeEstimatorClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) assert.Equal(t, rollups.ArbGasInfoAddress, callMsg.To.String()) assert.Equal(t, rollups.ArbGasInfo_getPricesInArbGas, fmt.Sprintf("%x", callMsg.Data)) assert.Equal(t, big.NewInt(-1), blockNumber) }).Return(b.Bytes(), nil) o := gas.NewArbitrumEstimator(logger.Test(t), &arbConfig{v: maxGasLimit, bumpPercent: bumpPercent, bumpMin: bumpMin}, feeEstimatorClient, l1Oracle) servicetest.RunHealthy(t, o) gasPrice, chainSpecificGasLimit, err := o.GetLegacyGas(tests.Context(t), calldata, gasLimit, maxGasPrice) require.NoError(t, err) require.NotNil(t, gasPrice) // Again, a normal l2_suggested_estimator would return 42, but arbitrum_estimator adds a buffer. assert.Equal(t, "63 wei", gasPrice.String()) assert.Equal(t, expLimit, chainSpecificGasLimit, "expected %d but got %d", expLimit, chainSpecificGasLimit) })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewFeeEstimatorClient(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice")` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(42) })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.SetInt64(42)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Write(common.BigToHash(big.NewInt(perL2Tx)).Bytes())` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.BigToHash(big.NewInt(perL2Tx))` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewInt(perL2Tx)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Bytes()` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Write(common.BigToHash(big.NewInt(perL1Calldata)).Bytes())` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.BigToHash(big.NewInt(perL1Calldata))` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewInt(perL1Calldata)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Bytes()` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Write(common.BigToHash(big.NewInt(123455)).Bytes())` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.BigToHash(big.NewInt(123455))` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewInt(123455)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Bytes()` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{}))` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.IsType(ethereum.CallMsg{})` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.IsType(&big.Int{})` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) assert.Equal(t, rollups.ArbGasInfoAddress, callMsg.To.String()) assert.Equal(t, rollups.ArbGasInfo_getPricesInArbGas, fmt.Sprintf("%x", callMsg.Data)) assert.Equal(t, big.NewInt(-1), blockNumber) })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Get(2)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Return(b.Bytes(), nil)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Bytes()` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewArbitrumEstimator(logger.Test(t), &arbConfig{v: maxGasLimit, bumpPercent: bumpPercent, bumpMin: bumpMin}, feeEstimatorClient, l1Oracle)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.RunHealthy(t, o)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.GetLegacyGas(tests.Context(t), calldata, gasLimit, maxGasPrice)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewFeeEstimatorClient(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewArbitrumL1GasOracle(logger.Test(t), feeEstimatorClient)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice")` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(42) })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.SetInt64(42)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Write(common.BigToHash(big.NewInt(perL2Tx)).Bytes())` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.BigToHash(big.NewInt(perL2Tx))` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewInt(perL2Tx)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Bytes()` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Write(common.BigToHash(big.NewInt(perL1Calldata)).Bytes())` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.BigToHash(big.NewInt(perL1Calldata))` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewInt(perL1Calldata)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Bytes()` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Write(common.BigToHash(big.NewInt(123455)).Bytes())` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.BigToHash(big.NewInt(123455))` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewInt(123455)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Bytes()` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{}))` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.IsType(ethereum.CallMsg{})` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.IsType(&big.Int{})` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) assert.Equal(t, rollups.ArbGasInfoAddress, callMsg.To.String()) assert.Equal(t, rollups.ArbGasInfo_getPricesInArbGas, fmt.Sprintf("%x", callMsg.Data)) assert.Equal(t, big.NewInt(-1), blockNumber) })` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Get(2)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Return(b.Bytes(), nil)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Bytes()` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.NewArbitrumEstimator(logger.Test(t), &arbConfig{v: maxGasLimit, bumpPercent: bumpPercent, bumpMin: bumpMin}, feeEstimatorClient, l1Oracle)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.RunHealthy(t, o)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.GetLegacyGas(tests.Context(t), calldata, gasLimit, maxGasPrice)` $DIR/core/chains/evm/gas/arbitrum_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = true` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMinF = minGasPrice` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMaxF = maxGasPrice` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BatchSizeF = batchSize` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BlockDelayF = blockDelay` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BlockHistorySizeF = historySize` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.TransactionPercentileF = percentile` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("loads initial state", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) h := &evmtypes.Head{Hash: utils.NewHash(), Number: 42, BaseFeePerGas: assets.NewWeiI(420)} ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h, nil) ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == "0x2a" && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == "0x29" && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &evmtypes.Block{ Number: 42, Hash: utils.NewHash(), } elems[1].Result = &evmtypes.Block{ Number: 41, Hash: utils.NewHash(), } }).Once() err := bhe.Start(tests.Context(t)) require.NoError(t, err) assert.Len(t, gas.GetRollingBlockHistory(bhe), 2) assert.Equal(t, int(gas.GetRollingBlockHistory(bhe)[0].Number), 41) assert.Equal(t, int(gas.GetRollingBlockHistory(bhe)[1].Number), 42) assert.Equal(t, assets.NewWeiI(420), gas.GetLatestBaseFee(bhe)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h, nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == "0x2a" && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == "0x29" && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &evmtypes.Block{ Number: 42, Hash: utils.NewHash(), } elems[1].Result = &evmtypes.Block{ Number: 41, Hash: utils.NewHash(), } }).Once()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `elems[0].Result = &evmtypes.Block{ Number: 42, Hash: utils.NewHash(), }` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `elems[1].Result = &evmtypes.Block{ Number: 41, Hash: utils.NewHash(), }` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("starts and loads partial history if fetch context times out", func(t *testing.T) { geCfg2 := &gas.MockGasEstimatorConfig{} geCfg2.EIP1559DynamicFeesF = true geCfg2.PriceMinF = minGasPrice bhCfg2 := newBlockHistoryConfig() bhCfg2.BatchSizeF = uint32(1) bhCfg2.BlockDelayF = blockDelay bhCfg2.BlockHistorySizeF = historySize bhCfg2.TransactionPercentileF = percentile cfg2 := gas.NewMockConfig() ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) bhe := newBlockHistoryEstimator(t, ethClient, cfg2, geCfg2, bhCfg2, l1Oracle) h := &evmtypes.Head{Hash: utils.NewHash(), Number: 42, BaseFeePerGas: assets.NewWeiI(420)} ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h, nil) // First succeeds (42) ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(42) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &evmtypes.Block{ Number: 42, Hash: utils.NewHash(), } }).Once() // Second fails (41) ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(41) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Return(pkgerrors.Wrap(context.DeadlineExceeded, "some error message")).Once() err := bhe.Start(tests.Context(t)) require.NoError(t, err) require.Len(t, gas.GetRollingBlockHistory(bhe), 1) assert.Equal(t, int(gas.GetRollingBlockHistory(bhe)[0].Number), 42) assert.Equal(t, assets.NewWeiI(420), gas.GetLatestBaseFee(bhe)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg2.EIP1559DynamicFeesF = true` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg2.PriceMinF = minGasPrice` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg2.BatchSizeF = uint32(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg2.BlockDelayF = blockDelay` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg2.BlockHistorySizeF = historySize` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg2.TransactionPercentileF = percentile` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h, nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(42) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &evmtypes.Block{ Number: 42, Hash: utils.NewHash(), } }).Once()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `elems[0].Result = &evmtypes.Block{ Number: 42, Hash: utils.NewHash(), }` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(41) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Return(pkgerrors.Wrap(context.DeadlineExceeded, "some error message")).Once()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("boots even if initial batch call returns nothing", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) h := &evmtypes.Head{Hash: utils.NewHash(), Number: 42} ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h, nil) ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == int(historySize) })).Return(nil) err := bhe.Start(tests.Context(t)) require.NoError(t, err) // non-eip1559 block assert.Nil(t, gas.GetLatestBaseFee(bhe)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h, nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == int(historySize) })).Return(nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("starts anyway if fetching latest head fails", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(nil, pkgerrors.New("something exploded")) err := bhe.Start(tests.Context(t)) require.NoError(t, err) assert.Nil(t, gas.GetLatestBaseFee(bhe)) _, _, err = bhe.GetLegacyGas(tests.Context(t), make([]byte, 0), 100, maxGasPrice) require.Error(t, err) require.Contains(t, err.Error(), "has not finished the first gas estimation yet, likely because a failure on start") _, err = bhe.GetDynamicFee(tests.Context(t), maxGasPrice) require.Error(t, err) require.Contains(t, err.Error(), "has not finished the first gas estimation yet, likely because a failure on start") })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(nil, pkgerrors.New("something exploded"))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `_, _, err = bhe.GetLegacyGas(tests.Context(t), make([]byte, 0), 100, maxGasPrice)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `_, err = bhe.GetDynamicFee(tests.Context(t), maxGasPrice)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("starts anyway if fetching first fetch fails, but errors on estimation", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) h := &evmtypes.Head{Hash: utils.NewHash(), Number: 42, BaseFeePerGas: assets.NewWeiI(420)} ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h, nil) ethClient.On("BatchCallContext", mock.Anything, mock.Anything).Return(pkgerrors.New("something went wrong")) err := bhe.Start(tests.Context(t)) require.NoError(t, err) assert.Equal(t, assets.NewWeiI(420), gas.GetLatestBaseFee(bhe)) _, _, err = bhe.GetLegacyGas(tests.Context(t), make([]byte, 0), 100, maxGasPrice) require.Error(t, err) require.Contains(t, err.Error(), "has not finished the first gas estimation yet, likely because a failure on start") _, err = bhe.GetDynamicFee(tests.Context(t), maxGasPrice) require.Error(t, err) require.Contains(t, err.Error(), "has not finished the first gas estimation yet, likely because a failure on start") })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h, nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.Anything).Return(pkgerrors.New("something went wrong"))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `_, _, err = bhe.GetLegacyGas(tests.Context(t), make([]byte, 0), 100, maxGasPrice)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `_, err = bhe.GetDynamicFee(tests.Context(t), maxGasPrice)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("returns error if main context is cancelled", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) h := &evmtypes.Head{Hash: utils.NewHash(), Number: 42, BaseFeePerGas: assets.NewWeiI(420)} ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h, nil) ethClient.On("BatchCallContext", mock.Anything, mock.Anything).Return(pkgerrors.New("this error doesn't matter")) ctx, cancel := context.WithCancel(tests.Context(t)) cancel() err := bhe.Start(ctx) require.Error(t, err) assert.Contains(t, err.Error(), "context canceled") })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h, nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.Anything).Return(pkgerrors.New("this error doesn't matter"))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `cancel()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h, nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.Anything).Return(pkgerrors.New("this error doesn't matter")).Run(func(_ mock.Arguments) { time.Sleep(gas.MaxStartTime + 1*time.Second) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `time.Sleep(gas.MaxStartTime + 1*time.Second)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `_, _, err = bhe.GetLegacyGas(tests.Context(t), make([]byte, 0), 100, maxGasPrice)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `_, err = bhe.GetDynamicFee(tests.Context(t), maxGasPrice)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = false` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.OnNewLongestChain(tests.Context(t), h)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `h = testutils.Head(2)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `h.BaseFeePerGas = assets.NewWeiI(500)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.OnNewLongestChain(tests.Context(t), h)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("with history size of 0, errors", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() var blockDelay uint16 = 3 var historySize uint16 bhCfg.BlockDelayF = blockDelay bhCfg.BlockHistorySizeF = historySize geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = true bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) head := testutils.Head(42) err := bhe.FetchBlocks(tests.Context(t), head) require.Error(t, err) require.EqualError(t, err, "BlockHistoryEstimator: history size must be > 0, got: 0") })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BlockDelayF = blockDelay` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BlockHistorySizeF = historySize` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = true` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("with current block height less than block delay does nothing", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() var blockDelay uint16 = 3 var historySize uint16 = 1 bhCfg.BlockDelayF = blockDelay bhCfg.BlockHistorySizeF = historySize geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = true bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) for i := -1; i < 3; i++ { head := testutils.Head(i) err := bhe.FetchBlocks(tests.Context(t), head) require.Error(t, err) require.EqualError(t, err, fmt.Sprintf("BlockHistoryEstimator: cannot fetch, current block height %v is lower than EVM.RPCBlockQueryDelay=3", i)) } })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BlockDelayF = blockDelay` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BlockHistorySizeF = historySize` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = true` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("with error retrieving blocks returns error", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() var blockDelay uint16 = 3 var historySize uint16 = 3 var batchSize uint32 bhCfg.BlockDelayF = blockDelay bhCfg.BlockHistorySizeF = historySize bhCfg.BatchSizeF = batchSize geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = true bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) ethClient.On("BatchCallContext", mock.Anything, mock.Anything).Return(pkgerrors.New("something exploded")) err := bhe.FetchBlocks(tests.Context(t), testutils.Head(42)) require.Error(t, err) assert.EqualError(t, err, "BlockHistoryEstimator#fetchBlocks error fetching blocks with BatchCallContext: something exploded") })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BlockDelayF = blockDelay` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BlockHistorySizeF = historySize` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BatchSizeF = batchSize` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = true` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.Anything).Return(pkgerrors.New("something exploded"))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("batch fetches heads and transactions and sets them on the block history estimator instance", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() var blockDelay uint16 var historySize uint16 = 3 var batchSize uint32 = 2 bhCfg.BlockDelayF = blockDelay bhCfg.BlockHistorySizeF = historySize // Test batching bhCfg.BatchSizeF = batchSize geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = true bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) b41 := evmtypes.Block{ Number: 41, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(1, 2), } b42 := evmtypes.Block{ Number: 42, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(3), } b43 := evmtypes.Block{ Number: 43, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(), } ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(43) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(42) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Once().Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &b43 // This errored block (42) will be ignored elems[1].Error = pkgerrors.New("something went wrong") }) ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(41) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Once().Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &b41 }) err := bhe.FetchBlocks(tests.Context(t), testutils.Head(43)) require.NoError(t, err) require.Len(t, gas.GetRollingBlockHistory(bhe), 2) assert.Equal(t, 41, int(gas.GetRollingBlockHistory(bhe)[0].Number)) // 42 is missing because the fetch errored assert.Equal(t, 43, int(gas.GetRollingBlockHistory(bhe)[1].Number)) assert.Len(t, gas.GetRollingBlockHistory(bhe)[0].Transactions, 2) assert.Len(t, gas.GetRollingBlockHistory(bhe)[1].Transactions, 0) // On new fetch, rolls over the history and drops the old heads b44 := evmtypes.Block{ Number: 44, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(4), } // We are gonna refetch blocks 42 and 44 // 43 is skipped because it was already in the history ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(44) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(42) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Once().Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &b44 elems[1].Result = &b42 }) head := evmtypes.NewHead(big.NewInt(44), b44.Hash, b43.Hash, uint64(time.Now().Unix()), ubig.New(testutils.FixtureChainID)) err = bhe.FetchBlocks(tests.Context(t), &head) require.NoError(t, err) require.Len(t, gas.GetRollingBlockHistory(bhe), 3) assert.Equal(t, 42, int(gas.GetRollingBlockHistory(bhe)[0].Number)) assert.Equal(t, 43, int(gas.GetRollingBlockHistory(bhe)[1].Number)) assert.Equal(t, 44, int(gas.GetRollingBlockHistory(bhe)[2].Number)) assert.Len(t, gas.GetRollingBlockHistory(bhe)[0].Transactions, 1) assert.Len(t, gas.GetRollingBlockHistory(bhe)[1].Transactions, 0) assert.Len(t, gas.GetRollingBlockHistory(bhe)[2].Transactions, 1) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BlockDelayF = blockDelay` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BlockHistorySizeF = historySize` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BatchSizeF = batchSize` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = true` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(43) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(42) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Once().Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &b43 // This errored block (42) will be ignored elems[1].Error = pkgerrors.New("something went wrong") })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `elems[0].Result = &b43` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `elems[1].Error = pkgerrors.New("something went wrong")` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(41) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Once().Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &b41 })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `elems[0].Result = &b41` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(44) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(42) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Once().Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &b44 elems[1].Result = &b42 })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `elems[0].Result = &b44` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `elems[1].Result = &b42` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `err = bhe.FetchBlocks(tests.Context(t), &head)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("does not refetch blocks below EVM.FinalityDepth", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() var blockDelay uint16 var historySize uint16 = 3 var batchSize uint32 = 2 bhCfg.BlockDelayF = blockDelay bhCfg.BlockHistorySizeF = historySize bhCfg.BatchSizeF = batchSize geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = true bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) b0 := evmtypes.Block{ Number: 0, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(9001), } b1 := evmtypes.Block{ Number: 1, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(9002), } blocks := []evmtypes.Block{b0, b1} gas.SetRollingBlockHistory(bhe, blocks) b2 := evmtypes.Block{ Number: 2, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(1, 2), } b3 := evmtypes.Block{ Number: 3, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(1, 2), } ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(3) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(2) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Once().Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &b3 elems[1].Result = &b2 }) head2 := evmtypes.NewHead(big.NewInt(2), b2.Hash, b1.Hash, uint64(time.Now().Unix()), ubig.New(testutils.FixtureChainID)) head3 := evmtypes.NewHead(big.NewInt(3), b3.Hash, b2.Hash, uint64(time.Now().Unix()), ubig.New(testutils.FixtureChainID)) head3.Parent = &head2 err := bhe.FetchBlocks(tests.Context(t), &head3) require.NoError(t, err) require.Len(t, gas.GetRollingBlockHistory(bhe), 3) assert.Equal(t, 1, int(gas.GetRollingBlockHistory(bhe)[0].Number)) assert.Equal(t, 2, int(gas.GetRollingBlockHistory(bhe)[1].Number)) assert.Equal(t, 3, int(gas.GetRollingBlockHistory(bhe)[2].Number)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BlockDelayF = blockDelay` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BlockHistorySizeF = historySize` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BatchSizeF = batchSize` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = true` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(3) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(2) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Once().Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &b3 elems[1].Result = &b2 })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `elems[0].Result = &b3` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `elems[1].Result = &b2` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `head3.Parent = &head2` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("replaces blocks on re-org within EVM.FinalityDepth", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() var blockDelay uint16 var historySize uint16 = 3 var batchSize uint32 = 2 bhCfg.BlockDelayF = blockDelay bhCfg.BlockHistorySizeF = historySize bhCfg.BatchSizeF = batchSize geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = true bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) b0 := evmtypes.Block{ Number: 0, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(9001), } b1 := evmtypes.Block{ Number: 1, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(9002), } b2 := evmtypes.Block{ Number: 2, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(1, 2), } b3 := evmtypes.Block{ Number: 3, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(1, 2), } blocks := []evmtypes.Block{b0, b1, b2, b3} gas.SetRollingBlockHistory(bhe, blocks) // RE-ORG, head2 and head3 have different hash than saved b2 and b3 head2 := evmtypes.NewHead(big.NewInt(2), utils.NewHash(), b1.Hash, uint64(time.Now().Unix()), ubig.New(testutils.FixtureChainID)) head3 := evmtypes.NewHead(big.NewInt(3), utils.NewHash(), head2.Hash, uint64(time.Now().Unix()), ubig.New(testutils.FixtureChainID)) head3.Parent = &head2 ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(3) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(2) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Once().Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) b2New := b2 b2New.Hash = head2.Hash elems[1].Result = &b2New b3New := b3 b3New.Hash = head3.Hash elems[0].Result = &b3New }) err := bhe.FetchBlocks(tests.Context(t), &head3) require.NoError(t, err) require.Len(t, gas.GetRollingBlockHistory(bhe), 3) assert.Equal(t, 1, int(gas.GetRollingBlockHistory(bhe)[0].Number)) assert.Equal(t, 2, int(gas.GetRollingBlockHistory(bhe)[1].Number)) assert.Equal(t, 3, int(gas.GetRollingBlockHistory(bhe)[2].Number)) assert.Equal(t, b1.Hash.Hex(), gas.GetRollingBlockHistory(bhe)[0].Hash.Hex()) assert.Equal(t, head2.Hash.Hex(), gas.GetRollingBlockHistory(bhe)[1].Hash.Hex()) assert.Equal(t, head3.Hash.Hex(), gas.GetRollingBlockHistory(bhe)[2].Hash.Hex()) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BlockDelayF = blockDelay` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BlockHistorySizeF = historySize` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BatchSizeF = batchSize` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = true` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `head3.Parent = &head2` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(3) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(2) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Once().Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) b2New := b2 b2New.Hash = head2.Hash elems[1].Result = &b2New b3New := b3 b3New.Hash = head3.Hash elems[0].Result = &b3New })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `b2New.Hash = head2.Hash` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `elems[1].Result = &b2New` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `b3New.Hash = head3.Hash` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `elems[0].Result = &b3New` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("uses locally cached blocks if they are in the chain", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() var blockDelay uint16 var historySize uint16 = 3 var batchSize uint32 = 2 bhCfg := newBlockHistoryConfig() bhCfg.BlockDelayF = blockDelay bhCfg.BlockHistorySizeF = historySize bhCfg.BatchSizeF = batchSize geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = true bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) b0 := evmtypes.Block{ Number: 0, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(9001), } b1 := evmtypes.Block{ Number: 1, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(9002), } b2 := evmtypes.Block{ Number: 2, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(1, 2), } b3 := evmtypes.Block{ Number: 3, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(1, 2), } blocks := []evmtypes.Block{b0, b1, b2, b3} gas.SetRollingBlockHistory(bhe, blocks) // head2 and head3 have identical hash to saved blocks head2 := evmtypes.NewHead(big.NewInt(2), b2.Hash, b1.Hash, uint64(time.Now().Unix()), ubig.New(testutils.FixtureChainID)) head3 := evmtypes.NewHead(big.NewInt(3), b3.Hash, head2.Hash, uint64(time.Now().Unix()), ubig.New(testutils.FixtureChainID)) head3.Parent = &head2 err := bhe.FetchBlocks(tests.Context(t), &head3) require.NoError(t, err) require.Len(t, gas.GetRollingBlockHistory(bhe), 3) assert.Equal(t, 1, int(gas.GetRollingBlockHistory(bhe)[0].Number)) assert.Equal(t, 2, int(gas.GetRollingBlockHistory(bhe)[1].Number)) assert.Equal(t, 3, int(gas.GetRollingBlockHistory(bhe)[2].Number)) assert.Equal(t, b1.Hash.Hex(), gas.GetRollingBlockHistory(bhe)[0].Hash.Hex()) assert.Equal(t, head2.Hash.Hex(), gas.GetRollingBlockHistory(bhe)[1].Hash.Hex()) assert.Equal(t, head3.Hash.Hex(), gas.GetRollingBlockHistory(bhe)[2].Hash.Hex()) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BlockDelayF = blockDelay` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BlockHistorySizeF = historySize` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BatchSizeF = batchSize` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = true` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `head3.Parent = &head2` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BlockDelayF = blockDelay` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BlockHistorySizeF = historySize` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BatchSizeF = batchSize` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionBlocksF = checkInclusionBlocks` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = true` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(43) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(42) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Once().Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &b43 elems[1].Result = &b42 })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `elems[0].Result = &b43` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `elems[1].Result = &b42` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BlockDelayF = uint16(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.TransactionPercentileF = uint16(35)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BlockHistorySizeF = uint16(3)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BatchSizeF = uint32(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = false` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMaxF = assets.NewWeiI(1000)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMinF = assets.NewWeiI(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 3 && b[0].Args[0] == "0x3" && b[1].Args[0] == "0x2" && b[2].Args[0] == "0x1" })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &b3 elems[1].Result = &b2 elems[2].Result = &b1 })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `elems[0].Result = &b3` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `elems[1].Result = &b2` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `elems[2].Result = &b1` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.FetchBlocksAndRecalculate(tests.Context(t), testutils.Head(3))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("does not crash or set gas price to zero if there are no transactions", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() bhCfg.TransactionPercentileF = uint16(35) geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = false bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) blocks := []evmtypes.Block{} gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(1)) blocks = []evmtypes.Block{{}} gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(1)) blocks = []evmtypes.Block{{Transactions: []evmtypes.Transaction{}}} gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(1)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.TransactionPercentileF = uint16(35)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = false` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `blocks = []evmtypes.Block{{}}` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `blocks = []evmtypes.Block{{Transactions: []evmtypes.Transaction{}}}` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("sets gas price to EVM.GasEstimator.PriceMax if the calculation would otherwise exceed it", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() bhCfg.TransactionPercentileF = uint16(35) geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = false geCfg.PriceMaxF = maxGasPrice geCfg.PriceMinF = minGasPrice bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) blocks := []evmtypes.Block{ { Number: 0, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(9001), }, { Number: 1, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(9002), }, } gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(1)) price := gas.GetGasPrice(bhe) require.Equal(t, maxGasPrice, price) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.TransactionPercentileF = uint16(35)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = false` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMaxF = maxGasPrice` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMinF = minGasPrice` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("sets gas price to EVM.GasEstimator.PriceMin if the calculation would otherwise fall below it", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() bhCfg.TransactionPercentileF = uint16(35) geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = false geCfg.PriceMaxF = maxGasPrice geCfg.PriceMinF = minGasPrice bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) blocks := []evmtypes.Block{ { Number: 0, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(5), }, { Number: 1, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(7), }, } gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(1)) price := gas.GetGasPrice(bhe) require.Equal(t, minGasPrice, price) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.TransactionPercentileF = uint16(35)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = false` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMaxF = maxGasPrice` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMinF = minGasPrice` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("ignores any transaction with a zero gas limit", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() bhCfg.TransactionPercentileF = uint16(100) geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = false geCfg.PriceMaxF = maxGasPrice geCfg.PriceMinF = minGasPrice bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) b1Hash := utils.NewHash() b2Hash := utils.NewHash() blocks := []evmtypes.Block{ { Number: 0, Hash: b1Hash, ParentHash: common.Hash{}, Transactions: legacyTransactionsFromGasPrices(50), }, { Number: 1, Hash: b2Hash, ParentHash: b1Hash, Transactions: []evmtypes.Transaction{{GasPrice: assets.NewWeiI(70), GasLimit: 42}}, }, { Number: 2, Hash: utils.NewHash(), ParentHash: b2Hash, Transactions: []evmtypes.Transaction{{GasPrice: assets.NewWeiI(90), GasLimit: 0}}, }, } gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(2)) price := gas.GetGasPrice(bhe) require.Equal(t, assets.NewWeiI(70), price) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.TransactionPercentileF = uint16(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = false` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMaxF = maxGasPrice` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMinF = minGasPrice` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.Recalculate(testutils.Head(2))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("takes into account zero priced transactions if chain is not Gnosis", func(t *testing.T) { // Because everyone loves free gas! ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() bhCfg.TransactionPercentileF = uint16(50) geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = false geCfg.PriceMaxF = maxGasPrice geCfg.PriceMinF = assets.NewWeiI(0) bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) b1Hash := utils.NewHash() blocks := []evmtypes.Block{ { Number: 0, Hash: b1Hash, ParentHash: common.Hash{}, Transactions: legacyTransactionsFromGasPrices(0, 0, 25, 50, 100), }, } gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(0)) price := gas.GetGasPrice(bhe) require.Equal(t, assets.NewWeiI(25), price) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.TransactionPercentileF = uint16(50)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = false` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMaxF = maxGasPrice` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMinF = assets.NewWeiI(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.Recalculate(testutils.Head(0))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("ignores zero priced transactions only on Gnosis", func(t *testing.T) { ethClient := evmmocks.NewClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() bhCfg.TransactionPercentileF = uint16(50) geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = false geCfg.PriceMaxF = maxGasPrice geCfg.PriceMinF = assets.NewWeiI(11) // Has to be set as Gnosis will only ignore transactions below this price ibhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) bhe := gas.BlockHistoryEstimatorFromInterface(ibhe) b1Hash := utils.NewHash() blocks := []evmtypes.Block{ { Number: 0, Hash: b1Hash, ParentHash: common.Hash{}, Transactions: legacyTransactionsFromGasPrices(0, 0, 0, 0, 80), }, } gas.SetRollingBlockHistory(bhe, blocks) // chainType is not set - GasEstimator should not ignore zero priced transactions and instead default to PriceMin==11 bhe.Recalculate(testutils.Head(0)) require.Equal(t, assets.NewWeiI(11), gas.GetGasPrice(bhe)) // Set chainType to Gnosis - GasEstimator should now ignore zero priced transactions cfg.ChainTypeF = string(chaintype.ChainGnosis) bhe.Recalculate(testutils.Head(0)) require.Equal(t, assets.NewWeiI(80), gas.GetGasPrice(bhe)) // And for X Layer cfg.ChainTypeF = string(chaintype.ChainXLayer) bhe.Recalculate(testutils.Head(0)) require.Equal(t, assets.NewWeiI(80), gas.GetGasPrice(bhe)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.TransactionPercentileF = uint16(50)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = false` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMaxF = maxGasPrice` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMinF = assets.NewWeiI(11)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.Recalculate(testutils.Head(0))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `cfg.ChainTypeF = string(chaintype.ChainGnosis)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.Recalculate(testutils.Head(0))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `cfg.ChainTypeF = string(chaintype.ChainXLayer)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.Recalculate(testutils.Head(0))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("handles unreasonably large gas prices (larger than a 64 bit int can hold)", func(t *testing.T) { // Seems unlikely we will ever experience gas prices > 9 Petawei on mainnet (praying to the eth Gods 🙏) // But other chains could easily use a different base of account ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() reasonablyHugeGasPrice := assets.NewWeiI(1000).Mul(big.NewInt(math.MaxInt64)) bhCfg.TransactionPercentileF = uint16(50) geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = false geCfg.PriceMaxF = reasonablyHugeGasPrice geCfg.PriceMinF = assets.NewWeiI(10) bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) unreasonablyHugeGasPrice := assets.NewWeiI(1000000).Mul(big.NewInt(math.MaxInt64)) b1Hash := utils.NewHash() blocks := []evmtypes.Block{ { Number: 0, Hash: b1Hash, ParentHash: common.Hash{}, Transactions: []evmtypes.Transaction{ {GasPrice: assets.NewWeiI(50), GasLimit: 42}, {GasPrice: unreasonablyHugeGasPrice, GasLimit: 42}, {GasPrice: unreasonablyHugeGasPrice, GasLimit: 42}, {GasPrice: unreasonablyHugeGasPrice, GasLimit: 42}, {GasPrice: unreasonablyHugeGasPrice, GasLimit: 42}, {GasPrice: unreasonablyHugeGasPrice, GasLimit: 42}, {GasPrice: unreasonablyHugeGasPrice, GasLimit: 42}, {GasPrice: unreasonablyHugeGasPrice, GasLimit: 42}, {GasPrice: unreasonablyHugeGasPrice, GasLimit: 42}, }, }, } gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(0)) price := gas.GetGasPrice(bhe) require.Equal(t, reasonablyHugeGasPrice, price) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.TransactionPercentileF = uint16(50)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = false` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMaxF = reasonablyHugeGasPrice` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMinF = assets.NewWeiI(10)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.Recalculate(testutils.Head(0))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.TransactionPercentileF = uint16(50)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = false` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMaxF = maxGasPrice` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMinF = assets.NewWeiI(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.Recalculate(testutils.Head(0))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("does not crash or set gas price to zero if there are no transactions", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() bhCfg.TransactionPercentileF = uint16(35) geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = true bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) blocks := []evmtypes.Block{} gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(1)) blocks = []evmtypes.Block{{}} // No base fee (doesn't crash) gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(1)) blocks = []evmtypes.Block{newBlockWithBaseFee()} gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(1)) empty := newBlockWithBaseFee() empty.Transactions = []evmtypes.Transaction{} blocks = []evmtypes.Block{empty} gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(1)) withOnlyLegacyTransactions := newBlockWithBaseFee() withOnlyLegacyTransactions.Transactions = legacyTransactionsFromGasPrices(9001) blocks = []evmtypes.Block{withOnlyLegacyTransactions} gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(1)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.TransactionPercentileF = uint16(35)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = true` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `blocks = []evmtypes.Block{{}}` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `blocks = []evmtypes.Block{newBlockWithBaseFee()}` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `empty.Transactions = []evmtypes.Transaction{}` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `blocks = []evmtypes.Block{empty}` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `withOnlyLegacyTransactions.Transactions = legacyTransactionsFromGasPrices(9001)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `blocks = []evmtypes.Block{withOnlyLegacyTransactions}` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("does not set tip higher than EVM.GasEstimator.PriceMax", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() bhCfg.TransactionPercentileF = uint16(35) geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = true geCfg.PriceMaxF = maxGasPrice geCfg.PriceMinF = assets.NewWeiI(0) geCfg.TipCapMinF = assets.NewWeiI(0) bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) blocks := []evmtypes.Block{ { BaseFeePerGas: assets.NewWeiI(1), Number: 0, Hash: utils.NewHash(), Transactions: dynamicFeeTransactionsFromTipCaps(9001), }, { BaseFeePerGas: assets.NewWeiI(1), Number: 1, Hash: utils.NewHash(), Transactions: dynamicFeeTransactionsFromTipCaps(9002), }, } gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(1)) tipCap := gas.GetTipCap(bhe) require.Equal(t, tipCap.Int64(), maxGasPrice.Int64()) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.TransactionPercentileF = uint16(35)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = true` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMaxF = maxGasPrice` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMinF = assets.NewWeiI(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.TipCapMinF = assets.NewWeiI(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("sets tip cap to EVM.GasEstimator.TipCapMin if the calculation would otherwise fall below it", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() bhCfg.TransactionPercentileF = uint16(35) geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = true geCfg.PriceMaxF = maxGasPrice geCfg.PriceMinF = assets.NewWeiI(0) geCfg.TipCapMinF = assets.NewWeiI(10) bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) blocks := []evmtypes.Block{ { BaseFeePerGas: assets.NewWeiI(1), Number: 0, Hash: utils.NewHash(), Transactions: dynamicFeeTransactionsFromTipCaps(5), }, { BaseFeePerGas: assets.NewWeiI(1), Number: 1, Hash: utils.NewHash(), Transactions: dynamicFeeTransactionsFromTipCaps(7), }, } gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(1)) price := gas.GetTipCap(bhe) require.Equal(t, assets.NewWeiI(10), price) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.TransactionPercentileF = uint16(35)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = true` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMaxF = maxGasPrice` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMinF = assets.NewWeiI(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.TipCapMinF = assets.NewWeiI(10)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("ignores any transaction with a zero gas limit", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() bhCfg.TransactionPercentileF = uint16(95) geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = true geCfg.PriceMaxF = maxGasPrice geCfg.PriceMinF = assets.NewWeiI(0) geCfg.TipCapMinF = assets.NewWeiI(10) bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) b1Hash := utils.NewHash() b2Hash := utils.NewHash() blocks := []evmtypes.Block{ { Number: 0, Hash: b1Hash, ParentHash: common.Hash{}, Transactions: legacyTransactionsFromGasPrices(50), }, { BaseFeePerGas: assets.NewWeiI(10), Number: 1, Hash: b2Hash, ParentHash: b1Hash, Transactions: []evmtypes.Transaction{{Type: 0x2, MaxFeePerGas: assets.NewWeiI(1000), MaxPriorityFeePerGas: assets.NewWeiI(60), GasLimit: 42}}, }, { Number: 2, Hash: utils.NewHash(), ParentHash: b2Hash, Transactions: []evmtypes.Transaction{{Type: 0x2, MaxFeePerGas: assets.NewWeiI(1000), MaxPriorityFeePerGas: assets.NewWeiI(80), GasLimit: 0}}, }, } gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(2)) price := gas.GetTipCap(bhe) require.Equal(t, assets.NewWeiI(60), price) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.TransactionPercentileF = uint16(95)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = true` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMaxF = maxGasPrice` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMinF = assets.NewWeiI(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.TipCapMinF = assets.NewWeiI(10)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.Recalculate(testutils.Head(2))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("respects minimum gas tip cap", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() bhCfg.TransactionPercentileF = uint16(35) geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = true geCfg.PriceMaxF = maxGasPrice geCfg.PriceMinF = assets.NewWeiI(0) geCfg.TipCapMinF = assets.NewWeiI(1) bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) b1Hash := utils.NewHash() blocks := []evmtypes.Block{ { BaseFeePerGas: assets.NewWeiI(10), Number: 0, Hash: b1Hash, ParentHash: common.Hash{}, Transactions: dynamicFeeTransactionsFromTipCaps(0, 0, 0, 0, 100), }, } gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(0)) price := gas.GetTipCap(bhe) assert.Equal(t, assets.NewWeiI(1), price) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.TransactionPercentileF = uint16(35)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = true` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMaxF = maxGasPrice` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMinF = assets.NewWeiI(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.TipCapMinF = assets.NewWeiI(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.Recalculate(testutils.Head(0))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.TransactionPercentileF = uint16(35)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = true` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMaxF = maxGasPrice` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMinF = assets.NewWeiI(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.TipCapMinF = assets.NewWeiI(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.Recalculate(testutils.Head(0))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = true` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("returns false if transaction has 0 gas limit", func(t *testing.T) { tx := evmtypes.Transaction{Type: 0x0, GasPrice: assets.NewWeiI(10), GasLimit: 0, Hash: utils.NewHash()} assert.Equal(t, false, bhe.IsUsable(tx, block, cfg.ChainType(), geCfg.PriceMin(), logger.Test(t))) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("returns false if transaction gas limit is nil and tx type is 0x0", func(t *testing.T) { tx := evmtypes.Transaction{Type: 0x0, GasPrice: nil, GasLimit: 42, Hash: utils.NewHash()} assert.Equal(t, false, bhe.IsUsable(tx, block, cfg.ChainType(), geCfg.PriceMin(), logger.Test(t))) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("returns false if transaction is of type 0x7e only on Optimism", func(t *testing.T) { cfg.ChainTypeF = "optimismBedrock" tx := evmtypes.Transaction{Type: 0x7e, GasPrice: assets.NewWeiI(10), GasLimit: 42, Hash: utils.NewHash()} assert.Equal(t, false, bhe.IsUsable(tx, block, cfg.ChainType(), geCfg.PriceMin(), logger.Test(t))) cfg.ChainTypeF = "" assert.Equal(t, true, bhe.IsUsable(tx, block, cfg.ChainType(), geCfg.PriceMin(), logger.Test(t))) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `cfg.ChainTypeF = "optimismBedrock"` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `cfg.ChainTypeF = ""` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("returns false if transaction is of type 0x7c or 0x7b only on Celo", func(t *testing.T) { cfg.ChainTypeF = "celo" tx := evmtypes.Transaction{Type: 0x7c, GasPrice: assets.NewWeiI(10), GasLimit: 42, Hash: utils.NewHash()} assert.Equal(t, false, bhe.IsUsable(tx, block, cfg.ChainType(), geCfg.PriceMin(), logger.Test(t))) tx2 := evmtypes.Transaction{Type: 0x7b, GasPrice: assets.NewWeiI(10), GasLimit: 42, Hash: utils.NewHash()} assert.Equal(t, false, bhe.IsUsable(tx2, block, cfg.ChainType(), geCfg.PriceMin(), logger.Test(t))) cfg.ChainTypeF = "" assert.Equal(t, true, bhe.IsUsable(tx, block, cfg.ChainType(), geCfg.PriceMin(), logger.Test(t))) assert.Equal(t, true, bhe.IsUsable(tx2, block, cfg.ChainType(), geCfg.PriceMin(), logger.Test(t))) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `cfg.ChainTypeF = "celo"` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `cfg.ChainTypeF = ""` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("returns false if transaction is of type 0x16 only on WeMix", func(t *testing.T) { cfg.ChainTypeF = "wemix" tx := evmtypes.Transaction{Type: 0x16, GasPrice: assets.NewWeiI(10), GasLimit: 42, Hash: utils.NewHash()} assert.Equal(t, false, bhe.IsUsable(tx, block, cfg.ChainType(), geCfg.PriceMin(), logger.Test(t))) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `cfg.ChainTypeF = "wemix"` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("returns false if transaction has base fee higher than the gas price only on Celo", func(t *testing.T) { cfg.ChainTypeF = "celo" tx := evmtypes.Transaction{Type: 0x0, GasPrice: assets.NewWeiI(10), GasLimit: 42, Hash: utils.NewHash()} assert.Equal(t, false, bhe.IsUsable(tx, block, cfg.ChainType(), geCfg.PriceMin(), logger.Test(t))) tx2 := evmtypes.Transaction{Type: 0x2, MaxPriorityFeePerGas: assets.NewWeiI(200), MaxFeePerGas: assets.NewWeiI(250), GasPrice: assets.NewWeiI(50), GasLimit: 42, Hash: utils.NewHash()} assert.Equal(t, false, bhe.IsUsable(tx, block, cfg.ChainType(), geCfg.PriceMin(), logger.Test(t))) cfg.ChainTypeF = "" assert.Equal(t, true, bhe.IsUsable(tx, block, cfg.ChainType(), geCfg.PriceMin(), logger.Test(t))) assert.Equal(t, true, bhe.IsUsable(tx2, block, cfg.ChainType(), geCfg.PriceMin(), logger.Test(t))) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `cfg.ChainTypeF = "celo"` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `cfg.ChainTypeF = ""` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `cfg.ChainTypeF = string(chaintype.ChainZkSync)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `tx.Type = 0x02` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `tx.Type = 0xff` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `cfg.ChainTypeF = ""` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = true` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `eipblock.BaseFeePerGas = assets.NewWeiI(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("returns nil if block is missing base fee", func(t *testing.T) { tx := evmtypes.Transaction{Type: 0x0, GasPrice: assets.NewWeiI(42), GasLimit: 42, Hash: utils.NewHash()} res := bhe.EffectiveTipCap(block, tx) assert.Nil(t, res) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("legacy transaction type infers tip cap from tx.gas_price - block.base_fee_per_gas", func(t *testing.T) { tx := evmtypes.Transaction{Type: 0x0, GasPrice: assets.NewWeiI(142), GasLimit: 42, Hash: utils.NewHash()} res := bhe.EffectiveTipCap(eipblock, tx) assert.Equal(t, "42 wei", res.String()) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("tx type 2 & type 3 should calculate gas price", func(t *testing.T) { // 0x2 transaction (should use MaxPriorityFeePerGas) tx := evmtypes.Transaction{Type: 0x2, MaxPriorityFeePerGas: assets.NewWeiI(200), MaxFeePerGas: assets.NewWeiI(250), GasLimit: 42, Hash: utils.NewHash()} res := bhe.EffectiveTipCap(eipblock, tx) assert.Equal(t, "200 wei", res.String()) // 0x2 transaction (should use MaxPriorityFeePerGas, ignoring gas price) tx = evmtypes.Transaction{Type: 0x2, GasPrice: assets.NewWeiI(400), MaxPriorityFeePerGas: assets.NewWeiI(200), MaxFeePerGas: assets.NewWeiI(350), GasLimit: 42, Hash: utils.NewHash()} res = bhe.EffectiveTipCap(eipblock, tx) assert.Equal(t, "200 wei", res.String()) // 0x3 transaction (should use MaxPriorityFeePerGas) tx = evmtypes.Transaction{Type: 0x3, MaxPriorityFeePerGas: assets.NewWeiI(100), MaxFeePerGas: assets.NewWeiI(250), GasLimit: 42, Hash: utils.NewHash()} res = bhe.EffectiveTipCap(eipblock, tx) assert.Equal(t, "100 wei", res.String()) // 0x3 transaction (should use MaxPriorityFeePerGas, ignoring gas price) tx = evmtypes.Transaction{Type: 0x3, GasPrice: assets.NewWeiI(400), MaxPriorityFeePerGas: assets.NewWeiI(100), MaxFeePerGas: assets.NewWeiI(350), GasLimit: 42, Hash: utils.NewHash()} res = bhe.EffectiveTipCap(eipblock, tx) assert.Equal(t, "100 wei", res.String()) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `tx = evmtypes.Transaction{Type: 0x2, GasPrice: assets.NewWeiI(400), MaxPriorityFeePerGas: assets.NewWeiI(200), MaxFeePerGas: assets.NewWeiI(350), GasLimit: 42, Hash: utils.NewHash()}` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `res = bhe.EffectiveTipCap(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `tx = evmtypes.Transaction{Type: 0x3, MaxPriorityFeePerGas: assets.NewWeiI(100), MaxFeePerGas: assets.NewWeiI(250), GasLimit: 42, Hash: utils.NewHash()}` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `res = bhe.EffectiveTipCap(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `tx = evmtypes.Transaction{Type: 0x3, GasPrice: assets.NewWeiI(400), MaxPriorityFeePerGas: assets.NewWeiI(100), MaxFeePerGas: assets.NewWeiI(350), GasLimit: 42, Hash: utils.NewHash()}` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `res = bhe.EffectiveTipCap(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("missing field returns nil", func(t *testing.T) { tx := evmtypes.Transaction{Type: 0x2, GasPrice: assets.NewWeiI(132), MaxFeePerGas: assets.NewWeiI(200), GasLimit: 42, Hash: utils.NewHash()} res := bhe.EffectiveTipCap(eipblock, tx) assert.Nil(t, res) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = false` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `eipblock.BaseFeePerGas = assets.NewWeiI(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("legacy transaction type should use GasPrice", func(t *testing.T) { tx := evmtypes.Transaction{Type: 0x0, GasPrice: assets.NewWeiI(42), GasLimit: 42, Hash: utils.NewHash()} res := bhe.EffectiveGasPrice(eipblock, tx) assert.Equal(t, "42 wei", res.String()) tx = evmtypes.Transaction{Type: 0x0, GasLimit: 42, Hash: utils.NewHash()} res = bhe.EffectiveGasPrice(eipblock, tx) assert.Nil(t, res) tx = evmtypes.Transaction{Type: 0x1, GasPrice: assets.NewWeiI(42), GasLimit: 42, Hash: utils.NewHash()} res = bhe.EffectiveGasPrice(eipblock, tx) assert.Equal(t, "42 wei", res.String()) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `tx = evmtypes.Transaction{Type: 0x0, GasLimit: 42, Hash: utils.NewHash()}` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `res = bhe.EffectiveGasPrice(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `tx = evmtypes.Transaction{Type: 0x1, GasPrice: assets.NewWeiI(42), GasLimit: 42, Hash: utils.NewHash()}` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `res = bhe.EffectiveGasPrice(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("tx type 2 should calculate gas price", func(t *testing.T) { // 0x2 transaction (should calculate to 250) tx := evmtypes.Transaction{Type: 0x2, MaxPriorityFeePerGas: assets.NewWeiI(200), MaxFeePerGas: assets.NewWeiI(250), GasLimit: 42, Hash: utils.NewHash()} res := bhe.EffectiveGasPrice(eipblock, tx) assert.Equal(t, "250 wei", res.String()) // 0x2 transaction (should calculate to 300) tx = evmtypes.Transaction{Type: 0x2, MaxPriorityFeePerGas: assets.NewWeiI(200), MaxFeePerGas: assets.NewWeiI(350), GasLimit: 42, Hash: utils.NewHash()} res = bhe.EffectiveGasPrice(eipblock, tx) assert.Equal(t, "300 wei", res.String()) // 0x2 transaction (should calculate to 300, ignoring gas price) tx = evmtypes.Transaction{Type: 0x2, MaxPriorityFeePerGas: assets.NewWeiI(200), MaxFeePerGas: assets.NewWeiI(350), GasLimit: 42, Hash: utils.NewHash()} res = bhe.EffectiveGasPrice(eipblock, tx) assert.Equal(t, "300 wei", res.String()) // 0x2 transaction (should fall back to gas price since MaxFeePerGas is missing) tx = evmtypes.Transaction{Type: 0x2, GasPrice: assets.NewWeiI(32), MaxPriorityFeePerGas: assets.NewWeiI(200), GasLimit: 42, Hash: utils.NewHash()} res = bhe.EffectiveGasPrice(eipblock, tx) assert.Equal(t, "32 wei", res.String()) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `tx = evmtypes.Transaction{Type: 0x2, MaxPriorityFeePerGas: assets.NewWeiI(200), MaxFeePerGas: assets.NewWeiI(350), GasLimit: 42, Hash: utils.NewHash()}` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `res = bhe.EffectiveGasPrice(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `tx = evmtypes.Transaction{Type: 0x2, MaxPriorityFeePerGas: assets.NewWeiI(200), MaxFeePerGas: assets.NewWeiI(350), GasLimit: 42, Hash: utils.NewHash()}` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `res = bhe.EffectiveGasPrice(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `tx = evmtypes.Transaction{Type: 0x2, GasPrice: assets.NewWeiI(32), MaxPriorityFeePerGas: assets.NewWeiI(200), GasLimit: 42, Hash: utils.NewHash()}` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `res = bhe.EffectiveGasPrice(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("tx type 3 should calculate gas price", func(t *testing.T) { // 0x3 transaction (should calculate to 250) tx := evmtypes.Transaction{Type: 0x3, MaxPriorityFeePerGas: assets.NewWeiI(100), MaxFeePerGas: assets.NewWeiI(110), GasLimit: 42, Hash: utils.NewHash()} res := bhe.EffectiveGasPrice(eipblock, tx) assert.Equal(t, "110 wei", res.String()) // 0x3 transaction (should calculate to 300) tx = evmtypes.Transaction{Type: 0x3, MaxPriorityFeePerGas: assets.NewWeiI(200), MaxFeePerGas: assets.NewWeiI(350), GasLimit: 42, Hash: utils.NewHash()} res = bhe.EffectiveGasPrice(eipblock, tx) assert.Equal(t, "300 wei", res.String()) // 0x3 transaction (should calculate to 300, ignoring gas price) tx = evmtypes.Transaction{Type: 0x3, MaxPriorityFeePerGas: assets.NewWeiI(200), MaxFeePerGas: assets.NewWeiI(350), GasLimit: 42, Hash: utils.NewHash()} res = bhe.EffectiveGasPrice(eipblock, tx) assert.Equal(t, "300 wei", res.String()) // 0x3 transaction (should fall back to gas price since MaxFeePerGas is missing) tx = evmtypes.Transaction{Type: 0x3, GasPrice: assets.NewWeiI(5), MaxPriorityFeePerGas: assets.NewWeiI(200), GasLimit: 42, Hash: utils.NewHash()} res = bhe.EffectiveGasPrice(eipblock, tx) assert.Equal(t, "5 wei", res.String()) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `tx = evmtypes.Transaction{Type: 0x3, MaxPriorityFeePerGas: assets.NewWeiI(200), MaxFeePerGas: assets.NewWeiI(350), GasLimit: 42, Hash: utils.NewHash()}` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `res = bhe.EffectiveGasPrice(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `tx = evmtypes.Transaction{Type: 0x3, MaxPriorityFeePerGas: assets.NewWeiI(200), MaxFeePerGas: assets.NewWeiI(350), GasLimit: 42, Hash: utils.NewHash()}` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `res = bhe.EffectiveGasPrice(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `tx = evmtypes.Transaction{Type: 0x3, GasPrice: assets.NewWeiI(5), MaxPriorityFeePerGas: assets.NewWeiI(200), GasLimit: 42, Hash: utils.NewHash()}` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `res = bhe.EffectiveGasPrice(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("tx type 2 has block missing base fee (should never happen but must handle gracefully)", func(t *testing.T) { // 0x2 transaction (should calculate to 250) tx := evmtypes.Transaction{Type: 0x2, GasPrice: assets.NewWeiI(55555), MaxPriorityFeePerGas: assets.NewWeiI(200), MaxFeePerGas: assets.NewWeiI(250), GasLimit: 42, Hash: utils.NewHash()} res := bhe.EffectiveGasPrice(block, tx) assert.Equal(t, "55.555 kwei", res.String()) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("unknown type returns nil", func(t *testing.T) { tx := evmtypes.Transaction{Type: 0x4, GasPrice: assets.NewWeiI(55555), MaxPriorityFeePerGas: assets.NewWeiI(200), MaxFeePerGas: assets.NewWeiI(250), GasLimit: 42, Hash: utils.NewHash()} res := bhe.EffectiveGasPrice(block, tx) assert.Nil(t, res) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("Assumption violation of MaxFeePerGas >= BaseFeePerGas returns gas price if specified", func(t *testing.T) { // Max: 1, Base: 100 tx := evmtypes.Transaction{Type: 0x2, GasPrice: assets.NewWeiI(42), MaxPriorityFeePerGas: assets.NewWeiI(1), MaxFeePerGas: assets.NewWeiI(1), GasLimit: 42, Hash: utils.NewHash()} res := bhe.EffectiveGasPrice(eipblock, tx) assert.Equal(t, "42 wei", res.String()) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("Assumption violation of MaxFeePerGas >= MaxPriorityFeePerGas returns gas price if specified", func(t *testing.T) { // Max Priority: 201, Max: 200, Base: 100 tx := evmtypes.Transaction{Type: 0x2, GasPrice: assets.NewWeiI(42), MaxPriorityFeePerGas: assets.NewWeiI(201), MaxFeePerGas: assets.NewWeiI(200), GasLimit: 42, Hash: utils.NewHash()} res := bhe.EffectiveGasPrice(eipblock, tx) assert.Equal(t, "42 wei", res.String()) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("Assumption violation of MaxFeePerGas >= BaseFeePerGas returns nil if no gas price is specified", func(t *testing.T) { // Max: 1, Base: 100 tx := evmtypes.Transaction{Type: 0x2, MaxPriorityFeePerGas: assets.NewWeiI(1), MaxFeePerGas: assets.NewWeiI(1), GasLimit: 42, Hash: utils.NewHash()} res := bhe.EffectiveGasPrice(eipblock, tx) assert.Nil(t, res) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.TransactionPercentileF = uint16(35)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionBlocksF = uint16(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BlockHistorySizeF = uint16(8)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = false` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMaxF = maxGasPrice` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMinF = assets.NewWeiI(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SimulateStart(t, bhe)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("if gas price is lower than global max and user specified max gas price", func(t *testing.T) { fee, limit, err := bhe.GetLegacyGas(tests.Context(t), make([]byte, 0), 10000, maxGasPrice) require.NoError(t, err) assert.Equal(t, assets.NewWeiI(1000), fee) assert.Equal(t, 10000, int(limit)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("if gas price is higher than user-specified max", func(t *testing.T) { fee, limit, err := bhe.GetLegacyGas(tests.Context(t), make([]byte, 0), 10000, assets.NewWeiI(800)) require.NoError(t, err) assert.Equal(t, assets.NewWeiI(800), fee) assert.Equal(t, 10000, int(limit)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.TransactionPercentileF = uint16(35)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `cfg = gas.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMaxF = assets.NewWeiI(700)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMinF = assets.NewWeiI(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = false` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe = newBlockHistoryEstimator(t, nil, cfg, geCfg, bhCfg, l1Oracle)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SimulateStart(t, bhe)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("fallbacks to EvmGasPriceDefault if there aren't any valid transactions to estimate from.", func(t *testing.T) { cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() bhCfg.BatchSizeF = batchSize bhCfg.TransactionPercentileF = uint16(35) bhCfg.BlockDelayF = blockDelay bhCfg.BlockHistorySizeF = historySize geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = false geCfg.PriceMaxF = assets.NewWeiI(1000000) geCfg.PriceDefaultF = assets.NewWeiI(100) ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) h := &evmtypes.Head{Hash: utils.NewHash(), Number: 42, BaseFeePerGas: nil} ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h, nil) ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 3 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(42) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(41) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[2].Method == "eth_getBlockByNumber" && b[2].Args[0] == gas.Int64ToHex(40) && b[1].Args[1].(bool) && reflect.TypeOf(b[2].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &evmtypes.Block{ Number: 42, Hash: utils.NewHash(), } elems[1].Result = &evmtypes.Block{ Number: 41, Hash: utils.NewHash(), } elems[2].Result = &evmtypes.Block{ Number: 40, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPricesTxType(specialTxTypeCode, 1), } }).Once() err := bhe.Start(tests.Context(t)) require.NoError(t, err) fee, limit, err := bhe.GetLegacyGas(tests.Context(t), make([]byte, 0), 10000, assets.NewWeiI(800)) require.NoError(t, err) require.Equal(t, geCfg.PriceDefault(), fee) assert.Equal(t, 10000, int(limit)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BatchSizeF = batchSize` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.TransactionPercentileF = uint16(35)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BlockDelayF = blockDelay` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BlockHistorySizeF = historySize` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = false` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMaxF = assets.NewWeiI(1000000)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceDefaultF = assets.NewWeiI(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h, nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 3 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(42) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(41) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[2].Method == "eth_getBlockByNumber" && b[2].Args[0] == gas.Int64ToHex(40) && b[1].Args[1].(bool) && reflect.TypeOf(b[2].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &evmtypes.Block{ Number: 42, Hash: utils.NewHash(), } elems[1].Result = &evmtypes.Block{ Number: 41, Hash: utils.NewHash(), } elems[2].Result = &evmtypes.Block{ Number: 40, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPricesTxType(specialTxTypeCode, 1), } }).Once()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `elems[0].Result = &evmtypes.Block{ Number: 42, Hash: utils.NewHash(), }` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `elems[1].Result = &evmtypes.Block{ Number: 41, Hash: utils.NewHash(), }` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `elems[2].Result = &evmtypes.Block{ Number: 40, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPricesTxType(specialTxTypeCode, 1), }` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BatchSizeF = batchSize` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.TransactionPercentileF = uint16(35)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BlockDelayF = blockDelay` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.BlockHistorySizeF = historySize` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.EIP1559FeeCapBufferBlocksF = uint16(4)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = true` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMaxF = assets.NewWeiI(1000000)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceDefaultF = assets.NewWeiI(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.TipCapDefaultF = assets.NewWeiI(50)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.BumpThresholdF = uint64(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h, nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 3 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(42) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(41) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[2].Method == "eth_getBlockByNumber" && b[2].Args[0] == gas.Int64ToHex(40) && b[1].Args[1].(bool) && reflect.TypeOf(b[2].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &evmtypes.Block{ Number: 42, Hash: utils.NewHash(), } elems[1].Result = &evmtypes.Block{ Number: 41, Hash: utils.NewHash(), } elems[2].Result = &evmtypes.Block{ Number: 40, Hash: utils.NewHash(), Transactions: dynamicFeeTransactionsFromTipCapsTxType(specialTxTypeCode, 1), } }).Once()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `elems[0].Result = &evmtypes.Block{ Number: 42, Hash: utils.NewHash(), }` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `elems[1].Result = &evmtypes.Block{ Number: 41, Hash: utils.NewHash(), }` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `elems[2].Result = &evmtypes.Block{ Number: 40, Hash: utils.NewHash(), Transactions: dynamicFeeTransactionsFromTipCapsTxType(specialTxTypeCode, 1), }` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.EIP1559FeeCapBufferBlocksF = uint16(4)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.TransactionPercentileF = uint16(35)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = true` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMaxF = maxGasPrice` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.TipCapMinF = assets.NewWeiI(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMinF = assets.NewWeiI(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SimulateStart(t, bhe)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("if estimator is missing base fee and gas bumping is enabled", func(t *testing.T) { geCfg.BumpThresholdF = uint64(1) _, err := bhe.GetDynamicFee(tests.Context(t), maxGasPrice) require.Error(t, err) assert.Contains(t, err.Error(), "BlockHistoryEstimator: no value for latest block base fee; cannot estimate EIP-1559 base fee. Are you trying to run with EIP1559 enabled on a non-EIP1559 chain?") })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.BumpThresholdF = uint64(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("if estimator is missing base fee and gas bumping is disabled", func(t *testing.T) { geCfg.BumpThresholdF = uint64(0) fee, err := bhe.GetDynamicFee(tests.Context(t), maxGasPrice) require.NoError(t, err) assert.Equal(t, gas.DynamicFee{FeeCap: maxGasPrice, TipCap: assets.NewWeiI(6000)}, fee) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.BumpThresholdF = uint64(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `h.BaseFeePerGas = assets.NewWeiI(112500)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.OnNewLongestChain(tests.Context(t), h)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("if gas bumping is enabled", func(t *testing.T) { geCfg.BumpThresholdF = uint64(1) fee, err := bhe.GetDynamicFee(tests.Context(t), maxGasPrice) require.NoError(t, err) assert.Equal(t, gas.DynamicFee{FeeCap: assets.NewWeiI(186203), TipCap: assets.NewWeiI(6000)}, fee) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.BumpThresholdF = uint64(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("if gas bumping is disabled", func(t *testing.T) { geCfg.BumpThresholdF = uint64(0) fee, err := bhe.GetDynamicFee(tests.Context(t), maxGasPrice) require.NoError(t, err) assert.Equal(t, gas.DynamicFee{FeeCap: maxGasPrice, TipCap: assets.NewWeiI(6000)}, fee) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.BumpThresholdF = uint64(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("if gas bumping is enabled and local max gas price set", func(t *testing.T) { geCfg.BumpThresholdF = uint64(1) fee, err := bhe.GetDynamicFee(tests.Context(t), assets.NewWeiI(180000)) require.NoError(t, err) assert.Equal(t, gas.DynamicFee{FeeCap: assets.NewWeiI(180000), TipCap: assets.NewWeiI(6000)}, fee) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.BumpThresholdF = uint64(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("if bump threshold is 0 and local max gas price set", func(t *testing.T) { geCfg.BumpThresholdF = uint64(0) fee, err := bhe.GetDynamicFee(tests.Context(t), assets.NewWeiI(100)) require.NoError(t, err) assert.Equal(t, gas.DynamicFee{FeeCap: assets.NewWeiI(100), TipCap: assets.NewWeiI(6000)}, fee) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.BumpThresholdF = uint64(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `h = testutils.Head(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `h.BaseFeePerGas = assets.NewWeiI(900000)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.OnNewLongestChain(tests.Context(t), h)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.BumpThresholdF = uint64(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionBlocksF = uint16(4)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = false` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("skips connectivity check if latest block is not present", func(t *testing.T) { err := bhe.CheckConnectivity(attempts) require.NoError(t, err) tests.AssertLogEventually(t, obs, "Latest block is unknown; skipping inclusion check") })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `tests.AssertLogEventually(t, obs, "Latest block is unknown; skipping inclusion check")` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `h.BaseFeePerGas = assets.NewWeiI(112500)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.OnNewLongestChain(tests.Context(t), h)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, []evmtypes.Block{b0})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("skips connectivity check if block history has insufficient size", func(t *testing.T) { err := bhe.CheckConnectivity(attempts) require.NoError(t, err) tests.AssertLogEventually(t, obs, "Block history in memory with length 1 is insufficient to determine whether transaction should have been included within the past 4 blocks") })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `tests.AssertLogEventually(t, obs, "Block history in memory with length 1 is insufficient to determine whether transaction should have been included within the past 4 blocks")` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("skips connectivity check if attempts is nil or empty", func(t *testing.T) { err := bhe.CheckConnectivity(nil) require.NoError(t, err) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, []evmtypes.Block{b0, b1, b2, b3})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `h = testutils.Head(5)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `h.BaseFeePerGas = assets.NewWeiI(112500)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.OnNewLongestChain(tests.Context(t), h)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("returns error if one of the supplied attempts is missing BroadcastBeforeBlockNum", func(t *testing.T) { err := bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("BroadcastBeforeBlockNum was unexpectedly nil for attempt %s", attempts[0].TxHash)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `attempts = []gas.EvmPriorAttempt{ {TxType: 0x3, BroadcastBeforeBlockNum: &num, TxHash: hash}, }` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("returns error if one of the supplied attempts has an unknown transaction type", func(t *testing.T) { err := bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("attempt %s has unknown transaction type 0x3", hash)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `attempts = []gas.EvmPriorAttempt{ {TxType: 0x0, BroadcastBeforeBlockNum: &num, TxHash: hash}, }` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("skips connectivity check if no transactions are suitable", func(t *testing.T) { err := bhe.CheckConnectivity(attempts) require.NoError(t, err) tests.AssertLogEventually(t, obs, fmt.Sprintf("no suitable transactions found to verify if transaction %s has been included within expected inclusion blocks of 4", hash)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `tests.AssertLogEventually(t, obs, fmt.Sprintf("no suitable transactions found to verify if transaction %s has been included within expected inclusion blocks of 4", hash))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("in legacy mode", func(t *testing.T) { b0 = evmtypes.Block{ Number: 0, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(1000), } b1 = evmtypes.Block{ Number: 1, Hash: utils.NewHash(), ParentHash: b0.Hash, Transactions: legacyTransactionsFromGasPrices(2, 3, 4, 5, 6), } b2 = evmtypes.Block{ Number: 2, Hash: utils.NewHash(), ParentHash: b1.Hash, Transactions: legacyTransactionsFromGasPrices(4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9), } b3 = evmtypes.Block{ Number: 3, Hash: utils.NewHash(), ParentHash: b2.Hash, Transactions: legacyTransactionsFromGasPrices(3, 4, 5, 6, 7), } gas.SetRollingBlockHistory(bhe, []evmtypes.Block{b0, b1, b2, b3}) attempts = []gas.EvmPriorAttempt{ {TxType: 0x0, TxHash: NewEvmHash(), GasPrice: assets.NewWeiI(1000), BroadcastBeforeBlockNum: ptr(int64(4))}, // This is very expensive but will be ignored due to BroadcastBeforeBlockNum being too recent {TxType: 0x0, TxHash: NewEvmHash(), GasPrice: assets.NewWeiI(3), BroadcastBeforeBlockNum: ptr(int64(0))}, {TxType: 0x0, TxHash: NewEvmHash(), GasPrice: assets.NewWeiI(5), BroadcastBeforeBlockNum: ptr(int64(1))}, {TxType: 0x0, TxHash: NewEvmHash(), GasPrice: assets.NewWeiI(7), BroadcastBeforeBlockNum: ptr(int64(1))}, } t.Run("passes check if all blocks have percentile price higher or exactly at the highest transaction gas price", func(t *testing.T) { bhCfg.CheckInclusionBlocksF = 3 bhCfg.CheckInclusionPercentileF = 80 // percentile price is 7 wei err := bhe.CheckConnectivity(attempts) require.NoError(t, err) }) t.Run("fails check if one or more blocks has percentile price higher than highest transaction gas price", func(t *testing.T) { bhCfg.CheckInclusionBlocksF = 3 bhCfg.CheckInclusionPercentileF = 40 // percentile price is 5 wei err := bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has gas price of 7 wei, which is above percentile=40%% (percentile price: 5 wei) for blocks 2 thru 0 (checking 3 blocks)", attempts[3].TxHash)) require.ErrorIs(t, err, commonfee.ErrConnectivity) }) t.Run("fails check if one or more blocks has percentile price higher than any transaction gas price", func(t *testing.T) { bhCfg.CheckInclusionBlocksF = 3 bhCfg.CheckInclusionPercentileF = 30 // percentile price is 4 wei err := bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has gas price of 5 wei, which is above percentile=30%% (percentile price: 4 wei) for blocks 2 thru 0 (checking 3 blocks)", attempts[2].TxHash)) bhCfg.CheckInclusionBlocksF = 3 bhCfg.CheckInclusionPercentileF = 5 // percentile price is 2 wei err = bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has gas price of 3 wei, which is above percentile=5%% (percentile price: 2 wei) for blocks 2 thru 0 (checking 3 blocks)", attempts[1].TxHash)) require.ErrorIs(t, err, commonfee.ErrConnectivity) }) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `b0 = evmtypes.Block{ Number: 0, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(1000), }` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `b1 = evmtypes.Block{ Number: 1, Hash: utils.NewHash(), ParentHash: b0.Hash, Transactions: legacyTransactionsFromGasPrices(2, 3, 4, 5, 6), }` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `b2 = evmtypes.Block{ Number: 2, Hash: utils.NewHash(), ParentHash: b1.Hash, Transactions: legacyTransactionsFromGasPrices(4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9), }` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `b3 = evmtypes.Block{ Number: 3, Hash: utils.NewHash(), ParentHash: b2.Hash, Transactions: legacyTransactionsFromGasPrices(3, 4, 5, 6, 7), }` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, []evmtypes.Block{b0, b1, b2, b3})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `attempts = []gas.EvmPriorAttempt{ {TxType: 0x0, TxHash: NewEvmHash(), GasPrice: assets.NewWeiI(1000), BroadcastBeforeBlockNum: ptr(int64(4))}, // This is very expensive but will be ignored due to BroadcastBeforeBlockNum being too recent {TxType: 0x0, TxHash: NewEvmHash(), GasPrice: assets.NewWeiI(3), BroadcastBeforeBlockNum: ptr(int64(0))}, {TxType: 0x0, TxHash: NewEvmHash(), GasPrice: assets.NewWeiI(5), BroadcastBeforeBlockNum: ptr(int64(1))}, {TxType: 0x0, TxHash: NewEvmHash(), GasPrice: assets.NewWeiI(7), BroadcastBeforeBlockNum: ptr(int64(1))}, }` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("passes check if all blocks have percentile price higher or exactly at the highest transaction gas price", func(t *testing.T) { bhCfg.CheckInclusionBlocksF = 3 bhCfg.CheckInclusionPercentileF = 80 // percentile price is 7 wei err := bhe.CheckConnectivity(attempts) require.NoError(t, err) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionBlocksF = 3` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionPercentileF = 80` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("fails check if one or more blocks has percentile price higher than highest transaction gas price", func(t *testing.T) { bhCfg.CheckInclusionBlocksF = 3 bhCfg.CheckInclusionPercentileF = 40 // percentile price is 5 wei err := bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has gas price of 7 wei, which is above percentile=40%% (percentile price: 5 wei) for blocks 2 thru 0 (checking 3 blocks)", attempts[3].TxHash)) require.ErrorIs(t, err, commonfee.ErrConnectivity) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionBlocksF = 3` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionPercentileF = 40` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("fails check if one or more blocks has percentile price higher than any transaction gas price", func(t *testing.T) { bhCfg.CheckInclusionBlocksF = 3 bhCfg.CheckInclusionPercentileF = 30 // percentile price is 4 wei err := bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has gas price of 5 wei, which is above percentile=30%% (percentile price: 4 wei) for blocks 2 thru 0 (checking 3 blocks)", attempts[2].TxHash)) bhCfg.CheckInclusionBlocksF = 3 bhCfg.CheckInclusionPercentileF = 5 // percentile price is 2 wei err = bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has gas price of 3 wei, which is above percentile=5%% (percentile price: 2 wei) for blocks 2 thru 0 (checking 3 blocks)", attempts[1].TxHash)) require.ErrorIs(t, err, commonfee.ErrConnectivity) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionBlocksF = 3` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionPercentileF = 30` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionBlocksF = 3` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionPercentileF = 5` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `err = bhe.CheckConnectivity(attempts)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("handles mixed legacy and EIP-1559 transactions", func(t *testing.T) { b0 = evmtypes.Block{ BaseFeePerGas: assets.NewWeiI(1), Number: 3, Hash: utils.NewHash(), Transactions: append(legacyTransactionsFromGasPrices(1, 2, 3, 4, 5), dynamicFeeTransactionsFromTipCaps(6, 7, 8, 9, 10)...), } gas.SetRollingBlockHistory(bhe, []evmtypes.Block{b0}) attempts = []gas.EvmPriorAttempt{ {TxType: 0x2, TxHash: NewEvmHash(), DynamicFee: gas.DynamicFee{FeeCap: assets.NewWeiI(1), TipCap: assets.NewWeiI(3)}, BroadcastBeforeBlockNum: ptr(int64(0))}, {TxType: 0x0, TxHash: NewEvmHash(), GasPrice: assets.NewWeiI(10), BroadcastBeforeBlockNum: ptr(int64(0))}, } t.Run("passes check if both transactions are ok", func(t *testing.T) { bhCfg.CheckInclusionBlocksF = 1 bhCfg.CheckInclusionPercentileF = 90 // percentile price is 5 wei err := bhe.CheckConnectivity(attempts) require.NoError(t, err) }) t.Run("fails check if legacy transaction fails", func(t *testing.T) { bhCfg.CheckInclusionBlocksF = 1 bhCfg.CheckInclusionPercentileF = 60 err := bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has gas price of 10 wei, which is above percentile=60%% (percentile price: 7 wei) for blocks 3 thru 3 (checking 1 blocks)", attempts[1].TxHash)) require.ErrorIs(t, err, commonfee.ErrConnectivity) }) attempts = []gas.EvmPriorAttempt{ {TxType: 0x2, TxHash: NewEvmHash(), DynamicFee: gas.DynamicFee{FeeCap: assets.NewWeiI(11), TipCap: assets.NewWeiI(10)}, BroadcastBeforeBlockNum: ptr(int64(0))}, {TxType: 0x0, TxHash: NewEvmHash(), GasPrice: assets.NewWeiI(3), BroadcastBeforeBlockNum: ptr(int64(0))}, } t.Run("fails check if dynamic fee transaction fails", func(t *testing.T) { gas.SetRollingBlockHistory(bhe, []evmtypes.Block{b0}) bhCfg.CheckInclusionBlocksF = 1 bhCfg.CheckInclusionPercentileF = 60 err := bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has tip cap of 10 wei, which is above percentile=60%% (percentile tip cap: 6 wei) for blocks 3 thru 3 (checking 1 blocks)", attempts[0].TxHash)) require.ErrorIs(t, err, commonfee.ErrConnectivity) }) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `b0 = evmtypes.Block{ BaseFeePerGas: assets.NewWeiI(1), Number: 3, Hash: utils.NewHash(), Transactions: append(legacyTransactionsFromGasPrices(1, 2, 3, 4, 5), dynamicFeeTransactionsFromTipCaps(6, 7, 8, 9, 10)...), }` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, []evmtypes.Block{b0})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `attempts = []gas.EvmPriorAttempt{ {TxType: 0x2, TxHash: NewEvmHash(), DynamicFee: gas.DynamicFee{FeeCap: assets.NewWeiI(1), TipCap: assets.NewWeiI(3)}, BroadcastBeforeBlockNum: ptr(int64(0))}, {TxType: 0x0, TxHash: NewEvmHash(), GasPrice: assets.NewWeiI(10), BroadcastBeforeBlockNum: ptr(int64(0))}, }` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("passes check if both transactions are ok", func(t *testing.T) { bhCfg.CheckInclusionBlocksF = 1 bhCfg.CheckInclusionPercentileF = 90 // percentile price is 5 wei err := bhe.CheckConnectivity(attempts) require.NoError(t, err) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionBlocksF = 1` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionPercentileF = 90` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("fails check if legacy transaction fails", func(t *testing.T) { bhCfg.CheckInclusionBlocksF = 1 bhCfg.CheckInclusionPercentileF = 60 err := bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has gas price of 10 wei, which is above percentile=60%% (percentile price: 7 wei) for blocks 3 thru 3 (checking 1 blocks)", attempts[1].TxHash)) require.ErrorIs(t, err, commonfee.ErrConnectivity) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionBlocksF = 1` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionPercentileF = 60` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `attempts = []gas.EvmPriorAttempt{ {TxType: 0x2, TxHash: NewEvmHash(), DynamicFee: gas.DynamicFee{FeeCap: assets.NewWeiI(11), TipCap: assets.NewWeiI(10)}, BroadcastBeforeBlockNum: ptr(int64(0))}, {TxType: 0x0, TxHash: NewEvmHash(), GasPrice: assets.NewWeiI(3), BroadcastBeforeBlockNum: ptr(int64(0))}, }` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("fails check if dynamic fee transaction fails", func(t *testing.T) { gas.SetRollingBlockHistory(bhe, []evmtypes.Block{b0}) bhCfg.CheckInclusionBlocksF = 1 bhCfg.CheckInclusionPercentileF = 60 err := bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has tip cap of 10 wei, which is above percentile=60%% (percentile tip cap: 6 wei) for blocks 3 thru 3 (checking 1 blocks)", attempts[0].TxHash)) require.ErrorIs(t, err, commonfee.ErrConnectivity) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, []evmtypes.Block{b0})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionBlocksF = 1` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionPercentileF = 60` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `b0 = evmtypes.Block{ BaseFeePerGas: assets.NewWeiI(5), Number: 0, Hash: utils.NewHash(), Transactions: dynamicFeeTransactionsFromTipCaps(1000), }` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `b1 = evmtypes.Block{ BaseFeePerGas: assets.NewWeiI(8), Number: 1, Hash: utils.NewHash(), ParentHash: b0.Hash, Transactions: dynamicFeeTransactionsFromTipCaps(2, 3, 4, 5, 6), }` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `b2 = evmtypes.Block{ BaseFeePerGas: assets.NewWeiI(13), Number: 2, Hash: utils.NewHash(), ParentHash: b1.Hash, Transactions: dynamicFeeTransactionsFromTipCaps(4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9), }` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `b3 = evmtypes.Block{ BaseFeePerGas: assets.NewWeiI(21), Number: 3, Hash: utils.NewHash(), ParentHash: b2.Hash, Transactions: dynamicFeeTransactionsFromTipCaps(3, 4, 5, 6, 7), }` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `attempts = []gas.EvmPriorAttempt{ {TxType: 0x2, TxHash: NewEvmHash(), DynamicFee: gas.DynamicFee{FeeCap: assets.NewWeiI(30), TipCap: assets.NewWeiI(1000)}, BroadcastBeforeBlockNum: ptr(int64(4))}, // This is very expensive but will be ignored due to BroadcastBeforeBlockNum being too recent {TxType: 0x2, TxHash: NewEvmHash(), DynamicFee: gas.DynamicFee{FeeCap: assets.NewWeiI(30), TipCap: assets.NewWeiI(3)}, BroadcastBeforeBlockNum: ptr(int64(0))}, {TxType: 0x2, TxHash: NewEvmHash(), DynamicFee: gas.DynamicFee{FeeCap: assets.NewWeiI(30), TipCap: assets.NewWeiI(5)}, BroadcastBeforeBlockNum: ptr(int64(1))}, {TxType: 0x2, TxHash: NewEvmHash(), DynamicFee: gas.DynamicFee{FeeCap: assets.NewWeiI(30), TipCap: assets.NewWeiI(7)}, BroadcastBeforeBlockNum: ptr(int64(1))}, }` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("passes check if all blocks have 90th percentile price higher than highest transaction tip cap", func(t *testing.T) { bhCfg.CheckInclusionBlocksF = 3 bhCfg.CheckInclusionPercentileF = 80 err := bhe.CheckConnectivity(attempts) require.NoError(t, err) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionBlocksF = 3` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionPercentileF = 80` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("fails check if one or more blocks has percentile tip cap higher than any transaction tip cap, and base fee higher than the block base fee", func(t *testing.T) { bhCfg.CheckInclusionBlocksF = 3 bhCfg.CheckInclusionPercentileF = 20 err := bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has tip cap of 5 wei, which is above percentile=20%% (percentile tip cap: 4 wei) for blocks 2 thru 0 (checking 3 blocks)", attempts[2].TxHash)) require.ErrorIs(t, err, commonfee.ErrConnectivity) bhCfg.CheckInclusionBlocksF = 3 bhCfg.CheckInclusionPercentileF = 5 err = bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has tip cap of 3 wei, which is above percentile=5%% (percentile tip cap: 2 wei) for blocks 2 thru 0 (checking 3 blocks)", attempts[1].TxHash)) require.ErrorIs(t, err, commonfee.ErrConnectivity) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionBlocksF = 3` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionPercentileF = 20` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionBlocksF = 3` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionPercentileF = 5` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `err = bhe.CheckConnectivity(attempts)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("passes check if, for at least one block, feecap < tipcap+basefee, even if percentile is not reached", func(t *testing.T) { bhCfg.CheckInclusionBlocksF = 3 bhCfg.CheckInclusionPercentileF = 5 attempts = []gas.EvmPriorAttempt{ {TxType: 0x2, TxHash: NewEvmHash(), DynamicFee: gas.DynamicFee{FeeCap: assets.NewWeiI(4), TipCap: assets.NewWeiI(7)}, BroadcastBeforeBlockNum: ptr(int64(1))}, } err := bhe.CheckConnectivity(attempts) require.NoError(t, err) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionBlocksF = 3` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionPercentileF = 5` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `attempts = []gas.EvmPriorAttempt{ {TxType: 0x2, TxHash: NewEvmHash(), DynamicFee: gas.DynamicFee{FeeCap: assets.NewWeiI(4), TipCap: assets.NewWeiI(7)}, BroadcastBeforeBlockNum: ptr(int64(1))}, }` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("BumpLegacyGas checks connectivity", func(t *testing.T) { cfg := gas.NewMockConfig() bhCfg.CheckInclusionBlocksF = 1 bhCfg.CheckInclusionPercentileF = 10 geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = false geCfg.BumpPercentF = 10 geCfg.BumpMinF = assets.NewWeiI(150) geCfg.PriceMaxF = maxGasPrice l1Oracle := rollupMocks.NewL1Oracle(t) bhe := newBlockHistoryEstimator(t, nil, cfg, geCfg, bhCfg, l1Oracle) b1 := evmtypes.Block{ Number: 1, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(1), } gas.SetRollingBlockHistory(bhe, []evmtypes.Block{b1}) head := testutils.Head(1) bhe.OnNewLongestChain(tests.Context(t), head) attempts := []gas.EvmPriorAttempt{ {TxType: 0x0, TxHash: NewEvmHash(), GasPrice: assets.NewWeiI(1000), BroadcastBeforeBlockNum: ptr(int64(0))}, } _, _, err := bhe.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, maxGasPrice, attempts) require.Error(t, err) assert.True(t, pkgerrors.Is(err, commonfee.ErrConnectivity)) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has gas price of 1 kwei, which is above percentile=10%% (percentile price: 1 wei) for blocks 1 thru 1 (checking 1 blocks)", attempts[0].TxHash)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionBlocksF = 1` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionPercentileF = 10` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = false` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.BumpPercentF = 10` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.BumpMinF = assets.NewWeiI(150)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMaxF = maxGasPrice` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, []evmtypes.Block{b1})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.OnNewLongestChain(tests.Context(t), head)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("BumpLegacyGas calls BumpLegacyGasPriceOnly with proper current gas price", func(t *testing.T) { cfg := gas.NewMockConfig() geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = false geCfg.BumpPercentF = 10 geCfg.BumpMinF = assets.NewWeiI(150) geCfg.PriceMaxF = maxGasPrice l1Oracle := rollupMocks.NewL1Oracle(t) bhe := newBlockHistoryEstimator(t, nil, cfg, geCfg, bhCfg, l1Oracle) t.Run("ignores nil current gas price", func(t *testing.T) { gasPrice, gasLimit, err := bhe.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, maxGasPrice, nil) require.NoError(t, err) expectedGasPrice, err := gas.BumpLegacyGasPriceOnly(geCfg, logger.TestSugared(t), nil, assets.NewWeiI(42), maxGasPrice) require.NoError(t, err) assert.Equal(t, 100000, int(gasLimit)) assert.Equal(t, expectedGasPrice, gasPrice) }) t.Run("ignores current gas price > max gas price", func(t *testing.T) { gasPrice, gasLimit, err := bhe.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, maxGasPrice, nil) require.NoError(t, err) massive := assets.NewWeiI(100000000000000) gas.SetGasPrice(bhe, massive) expectedGasPrice, err := gas.BumpLegacyGasPriceOnly(geCfg, logger.TestSugared(t), massive, assets.NewWeiI(42), maxGasPrice) require.NoError(t, err) assert.Equal(t, 100000, int(gasLimit)) assert.Equal(t, expectedGasPrice, gasPrice) }) t.Run("ignores current gas price < bumped gas price", func(t *testing.T) { gas.SetGasPrice(bhe, assets.NewWeiI(191)) gasPrice, gasLimit, err := bhe.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, maxGasPrice, nil) require.NoError(t, err) assert.Equal(t, 100000, int(gasLimit)) assert.Equal(t, assets.NewWeiI(192), gasPrice) }) t.Run("uses current gas price > bumped gas price", func(t *testing.T) { gas.SetGasPrice(bhe, assets.NewWeiI(193)) gasPrice, gasLimit, err := bhe.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, maxGasPrice, nil) require.NoError(t, err) assert.Equal(t, 100000, int(gasLimit)) assert.Equal(t, assets.NewWeiI(193), gasPrice) }) t.Run("bumped gas price > max gas price", func(t *testing.T) { gas.SetGasPrice(bhe, assets.NewWeiI(191)) gasPrice, gasLimit, err := bhe.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, assets.NewWeiI(100), nil) require.Error(t, err) assert.Nil(t, gasPrice) assert.Equal(t, 0, int(gasLimit)) assert.Contains(t, err.Error(), "bumped gas price of 192 wei would exceed configured max gas price of 100 wei (original price was 42 wei).") }) t.Run("current gas price > max gas price", func(t *testing.T) { gas.SetGasPrice(bhe, assets.NewWeiI(193)) gasPrice, gasLimit, err := bhe.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, assets.NewWeiI(100), nil) require.Error(t, err) assert.Nil(t, gasPrice) assert.Equal(t, 0, int(gasLimit)) assert.Contains(t, err.Error(), "bumped gas price of 192 wei would exceed configured max gas price of 100 wei (original price was 42 wei).") }) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = false` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.BumpPercentF = 10` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.BumpMinF = assets.NewWeiI(150)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMaxF = maxGasPrice` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("ignores nil current gas price", func(t *testing.T) { gasPrice, gasLimit, err := bhe.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, maxGasPrice, nil) require.NoError(t, err) expectedGasPrice, err := gas.BumpLegacyGasPriceOnly(geCfg, logger.TestSugared(t), nil, assets.NewWeiI(42), maxGasPrice) require.NoError(t, err) assert.Equal(t, 100000, int(gasLimit)) assert.Equal(t, expectedGasPrice, gasPrice) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("ignores current gas price > max gas price", func(t *testing.T) { gasPrice, gasLimit, err := bhe.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, maxGasPrice, nil) require.NoError(t, err) massive := assets.NewWeiI(100000000000000) gas.SetGasPrice(bhe, massive) expectedGasPrice, err := gas.BumpLegacyGasPriceOnly(geCfg, logger.TestSugared(t), massive, assets.NewWeiI(42), maxGasPrice) require.NoError(t, err) assert.Equal(t, 100000, int(gasLimit)) assert.Equal(t, expectedGasPrice, gasPrice) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetGasPrice(bhe, massive)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("ignores current gas price < bumped gas price", func(t *testing.T) { gas.SetGasPrice(bhe, assets.NewWeiI(191)) gasPrice, gasLimit, err := bhe.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, maxGasPrice, nil) require.NoError(t, err) assert.Equal(t, 100000, int(gasLimit)) assert.Equal(t, assets.NewWeiI(192), gasPrice) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetGasPrice(bhe, assets.NewWeiI(191))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("uses current gas price > bumped gas price", func(t *testing.T) { gas.SetGasPrice(bhe, assets.NewWeiI(193)) gasPrice, gasLimit, err := bhe.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, maxGasPrice, nil) require.NoError(t, err) assert.Equal(t, 100000, int(gasLimit)) assert.Equal(t, assets.NewWeiI(193), gasPrice) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetGasPrice(bhe, assets.NewWeiI(193))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("bumped gas price > max gas price", func(t *testing.T) { gas.SetGasPrice(bhe, assets.NewWeiI(191)) gasPrice, gasLimit, err := bhe.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, assets.NewWeiI(100), nil) require.Error(t, err) assert.Nil(t, gasPrice) assert.Equal(t, 0, int(gasLimit)) assert.Contains(t, err.Error(), "bumped gas price of 192 wei would exceed configured max gas price of 100 wei (original price was 42 wei).") })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetGasPrice(bhe, assets.NewWeiI(191))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("current gas price > max gas price", func(t *testing.T) { gas.SetGasPrice(bhe, assets.NewWeiI(193)) gasPrice, gasLimit, err := bhe.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, assets.NewWeiI(100), nil) require.Error(t, err) assert.Nil(t, gasPrice) assert.Equal(t, 0, int(gasLimit)) assert.Contains(t, err.Error(), "bumped gas price of 192 wei would exceed configured max gas price of 100 wei (original price was 42 wei).") })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetGasPrice(bhe, assets.NewWeiI(193))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("BumpDynamicFee checks connectivity", func(t *testing.T) { cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() bhCfg.CheckInclusionBlocksF = 1 bhCfg.CheckInclusionPercentileF = 10 geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = true geCfg.BumpPercentF = 10 geCfg.BumpMinF = assets.NewWeiI(150) geCfg.PriceMaxF = maxGasPrice l1Oracle := rollupMocks.NewL1Oracle(t) bhe := newBlockHistoryEstimator(t, nil, cfg, geCfg, bhCfg, l1Oracle) b1 := evmtypes.Block{ BaseFeePerGas: assets.NewWeiI(1), Number: 1, Hash: utils.NewHash(), Transactions: dynamicFeeTransactionsFromTipCaps(1), } gas.SetRollingBlockHistory(bhe, []evmtypes.Block{b1}) head := testutils.Head(1) bhe.OnNewLongestChain(tests.Context(t), head) originalFee := gas.DynamicFee{FeeCap: assets.NewWeiI(100), TipCap: assets.NewWeiI(25)} attempts := []gas.EvmPriorAttempt{ {TxType: 0x2, TxHash: NewEvmHash(), DynamicFee: gas.DynamicFee{TipCap: originalFee.TipCap, FeeCap: originalFee.FeeCap}, BroadcastBeforeBlockNum: ptr(int64(0))}} _, err := bhe.BumpDynamicFee(tests.Context(t), originalFee, maxGasPrice, attempts) require.Error(t, err) assert.True(t, pkgerrors.Is(err, commonfee.ErrConnectivity)) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has tip cap of 25 wei, which is above percentile=10%% (percentile tip cap: 1 wei) for blocks 1 thru 1 (checking 1 blocks)", attempts[0].TxHash)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionBlocksF = 1` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhCfg.CheckInclusionPercentileF = 10` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = true` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.BumpPercentF = 10` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.BumpMinF = assets.NewWeiI(150)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMaxF = maxGasPrice` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetRollingBlockHistory(bhe, []evmtypes.Block{b1})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `bhe.OnNewLongestChain(tests.Context(t), head)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.EIP1559DynamicFeesF = true` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.BumpPercentF = 10` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.BumpMinF = assets.NewWeiI(150)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.PriceMaxF = maxGasPrice` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `geCfg.TipCapDefaultF = assets.NewWeiI(52)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("when current tip cap is nil", func(t *testing.T) { originalFee := gas.DynamicFee{FeeCap: assets.NewWeiI(100), TipCap: assets.NewWeiI(25)} fee, err := bhe.BumpDynamicFee(tests.Context(t), originalFee, maxGasPrice, nil) require.NoError(t, err) assert.Equal(t, gas.DynamicFee{FeeCap: assets.NewWeiI(250), TipCap: assets.NewWeiI(202)}, fee) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("ignores current tip cap that is smaller than original fee with bump applied", func(t *testing.T) { gas.SetTipCap(bhe, assets.NewWeiI(201)) originalFee := gas.DynamicFee{FeeCap: assets.NewWeiI(100), TipCap: assets.NewWeiI(25)} fee, err := bhe.BumpDynamicFee(tests.Context(t), originalFee, maxGasPrice, nil) require.NoError(t, err) assert.Equal(t, gas.DynamicFee{FeeCap: assets.NewWeiI(250), TipCap: assets.NewWeiI(202)}, fee) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetTipCap(bhe, assets.NewWeiI(201))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("uses current tip cap that is larger than original fee with bump applied", func(t *testing.T) { gas.SetTipCap(bhe, assets.NewWeiI(203)) originalFee := gas.DynamicFee{FeeCap: assets.NewWeiI(100), TipCap: assets.NewWeiI(25)} fee, err := bhe.BumpDynamicFee(tests.Context(t), originalFee, maxGasPrice, nil) require.NoError(t, err) assert.Equal(t, gas.DynamicFee{FeeCap: assets.NewWeiI(250), TipCap: assets.NewWeiI(203)}, fee) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetTipCap(bhe, assets.NewWeiI(203))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("ignores absurdly large current tip cap", func(t *testing.T) { gas.SetTipCap(bhe, assets.NewWeiI(1000000000000000)) originalFee := gas.DynamicFee{FeeCap: assets.NewWeiI(100), TipCap: assets.NewWeiI(25)} fee, err := bhe.BumpDynamicFee(tests.Context(t), originalFee, maxGasPrice, nil) require.NoError(t, err) assert.Equal(t, gas.DynamicFee{FeeCap: assets.NewWeiI(250), TipCap: assets.NewWeiI(202)}, fee) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetTipCap(bhe, assets.NewWeiI(1000000000000000))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("bumped tip cap price > max gas price", func(t *testing.T) { gas.SetTipCap(bhe, assets.NewWeiI(203)) originalFee := gas.DynamicFee{FeeCap: assets.NewWeiI(100), TipCap: assets.NewWeiI(990000)} fee, err := bhe.BumpDynamicFee(tests.Context(t), originalFee, maxGasPrice, nil) require.Error(t, err) assert.Equal(t, gas.DynamicFee{}, fee) assert.Contains(t, err.Error(), "bumped tip cap of 1.089 mwei would exceed configured max gas price of 1 mwei (original fee: tip cap 990 kwei, fee cap 100 wei)") })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetTipCap(bhe, assets.NewWeiI(203))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `t.Run("bumped fee cap price > max gas price", func(t *testing.T) { gas.SetTipCap(bhe, assets.NewWeiI(203)) originalFee := gas.DynamicFee{FeeCap: assets.NewWeiI(990000), TipCap: assets.NewWeiI(25)} fee, err := bhe.BumpDynamicFee(tests.Context(t), originalFee, maxGasPrice, nil) require.Error(t, err) assert.Equal(t, gas.DynamicFee{}, fee) assert.Contains(t, err.Error(), "bumped fee cap of 1.089 mwei would exceed configured max gas price of 1 mwei (original fee: tip cap 25 wei, fee cap 990 kwei)") })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `gas.SetTipCap(bhe, assets.NewWeiI(203))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("loads initial state", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) h := &evmtypes.Head{Hash: utils.NewHash(), Number: 42, BaseFeePerGas: assets.NewWeiI(420)} ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h, nil) ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == "0x2a" && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == "0x29" && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &evmtypes.Block{ Number: 42, Hash: utils.NewHash(), } elems[1].Result = &evmtypes.Block{ Number: 41, Hash: utils.NewHash(), } }).Once() err := bhe.Start(tests.Context(t)) require.NoError(t, err) assert.Len(t, gas.GetRollingBlockHistory(bhe), 2) assert.Equal(t, int(gas.GetRollingBlockHistory(bhe)[0].Number), 41) assert.Equal(t, int(gas.GetRollingBlockHistory(bhe)[1].Number), 42) assert.Equal(t, assets.NewWeiI(420), gas.GetLatestBaseFee(bhe)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(420)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Return(h, nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == "0x2a" && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == "0x29" && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) }))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == "0x2a" && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == "0x29" && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(b[0].Result)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(&evmtypes.Block{})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(b[1].Result)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(&evmtypes.Block{})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &evmtypes.Block{ Number: 42, Hash: utils.NewHash(), } elems[1].Result = &evmtypes.Block{ Number: 41, Hash: utils.NewHash(), } })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Once()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Start(tests.Context(t))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("starts and loads partial history if fetch context times out", func(t *testing.T) { geCfg2 := &gas.MockGasEstimatorConfig{} geCfg2.EIP1559DynamicFeesF = true geCfg2.PriceMinF = minGasPrice bhCfg2 := newBlockHistoryConfig() bhCfg2.BatchSizeF = uint32(1) bhCfg2.BlockDelayF = blockDelay bhCfg2.BlockHistorySizeF = historySize bhCfg2.TransactionPercentileF = percentile cfg2 := gas.NewMockConfig() ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) bhe := newBlockHistoryEstimator(t, ethClient, cfg2, geCfg2, bhCfg2, l1Oracle) h := &evmtypes.Head{Hash: utils.NewHash(), Number: 42, BaseFeePerGas: assets.NewWeiI(420)} ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h, nil) // First succeeds (42) ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(42) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &evmtypes.Block{ Number: 42, Hash: utils.NewHash(), } }).Once() // Second fails (41) ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(41) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Return(pkgerrors.Wrap(context.DeadlineExceeded, "some error message")).Once() err := bhe.Start(tests.Context(t)) require.NoError(t, err) require.Len(t, gas.GetRollingBlockHistory(bhe), 1) assert.Equal(t, int(gas.GetRollingBlockHistory(bhe)[0].Number), 42) assert.Equal(t, assets.NewWeiI(420), gas.GetLatestBaseFee(bhe)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(420)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Return(h, nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(42) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) }))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(42) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Int64ToHex(42)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(b[0].Result)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(&evmtypes.Block{})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &evmtypes.Block{ Number: 42, Hash: utils.NewHash(), } })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Once()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(41) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) }))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(41) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Int64ToHex(41)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(b[0].Result)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(&evmtypes.Block{})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Return(pkgerrors.Wrap(context.DeadlineExceeded, "some error message"))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Wrap(context.DeadlineExceeded, "some error message")` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Once()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Start(tests.Context(t))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("boots even if initial batch call returns nothing", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) h := &evmtypes.Head{Hash: utils.NewHash(), Number: 42} ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h, nil) ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == int(historySize) })).Return(nil) err := bhe.Start(tests.Context(t)) require.NoError(t, err) // non-eip1559 block assert.Nil(t, gas.GetLatestBaseFee(bhe)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Return(h, nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == int(historySize) }))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == int(historySize) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Start(tests.Context(t))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("starts anyway if fetching latest head fails", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(nil, pkgerrors.New("something exploded")) err := bhe.Start(tests.Context(t)) require.NoError(t, err) assert.Nil(t, gas.GetLatestBaseFee(bhe)) _, _, err = bhe.GetLegacyGas(tests.Context(t), make([]byte, 0), 100, maxGasPrice) require.Error(t, err) require.Contains(t, err.Error(), "has not finished the first gas estimation yet, likely because a failure on start") _, err = bhe.GetDynamicFee(tests.Context(t), maxGasPrice) require.Error(t, err) require.Contains(t, err.Error(), "has not finished the first gas estimation yet, likely because a failure on start") })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Return(nil, pkgerrors.New("something exploded"))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.New("something exploded")` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Start(tests.Context(t))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetLegacyGas(tests.Context(t), make([]byte, 0), 100, maxGasPrice)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetDynamicFee(tests.Context(t), maxGasPrice)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("starts anyway if fetching first fetch fails, but errors on estimation", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) h := &evmtypes.Head{Hash: utils.NewHash(), Number: 42, BaseFeePerGas: assets.NewWeiI(420)} ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h, nil) ethClient.On("BatchCallContext", mock.Anything, mock.Anything).Return(pkgerrors.New("something went wrong")) err := bhe.Start(tests.Context(t)) require.NoError(t, err) assert.Equal(t, assets.NewWeiI(420), gas.GetLatestBaseFee(bhe)) _, _, err = bhe.GetLegacyGas(tests.Context(t), make([]byte, 0), 100, maxGasPrice) require.Error(t, err) require.Contains(t, err.Error(), "has not finished the first gas estimation yet, likely because a failure on start") _, err = bhe.GetDynamicFee(tests.Context(t), maxGasPrice) require.Error(t, err) require.Contains(t, err.Error(), "has not finished the first gas estimation yet, likely because a failure on start") })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(420)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Return(h, nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.On("BatchCallContext", mock.Anything, mock.Anything)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Return(pkgerrors.New("something went wrong"))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.New("something went wrong")` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Start(tests.Context(t))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetLegacyGas(tests.Context(t), make([]byte, 0), 100, maxGasPrice)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetDynamicFee(tests.Context(t), maxGasPrice)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("returns error if main context is cancelled", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) h := &evmtypes.Head{Hash: utils.NewHash(), Number: 42, BaseFeePerGas: assets.NewWeiI(420)} ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h, nil) ethClient.On("BatchCallContext", mock.Anything, mock.Anything).Return(pkgerrors.New("this error doesn't matter")) ctx, cancel := context.WithCancel(tests.Context(t)) cancel() err := bhe.Start(ctx) require.Error(t, err) assert.Contains(t, err.Error(), "context canceled") })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(420)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Return(h, nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.On("BatchCallContext", mock.Anything, mock.Anything)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Return(pkgerrors.New("this error doesn't matter"))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.New("this error doesn't matter")` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.WithCancel(tests.Context(t))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Start(ctx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(420)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Return(h, nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.On("BatchCallContext", mock.Anything, mock.Anything)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Return(pkgerrors.New("this error doesn't matter"))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.New("this error doesn't matter")` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run(func(_ mock.Arguments) { time.Sleep(gas.MaxStartTime + 1*time.Second) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Sleep(gas.MaxStartTime + 1*time.Second)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Start(tests.Context(t))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetLegacyGas(tests.Context(t), make([]byte, 0), 100, maxGasPrice)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetDynamicFee(tests.Context(t), maxGasPrice)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.OnNewLongestChain(tests.Context(t), h)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(2)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(500)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.OnNewLongestChain(tests.Context(t), h)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(500)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetLatestBaseFee(bhe)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("with history size of 0, errors", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() var blockDelay uint16 = 3 var historySize uint16 bhCfg.BlockDelayF = blockDelay bhCfg.BlockHistorySizeF = historySize geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = true bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) head := testutils.Head(42) err := bhe.FetchBlocks(tests.Context(t), head) require.Error(t, err) require.EqualError(t, err, "BlockHistoryEstimator: history size must be > 0, got: 0") })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(42)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.FetchBlocks(tests.Context(t), head)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("with current block height less than block delay does nothing", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() var blockDelay uint16 = 3 var historySize uint16 = 1 bhCfg.BlockDelayF = blockDelay bhCfg.BlockHistorySizeF = historySize geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = true bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) for i := -1; i < 3; i++ { head := testutils.Head(i) err := bhe.FetchBlocks(tests.Context(t), head) require.Error(t, err) require.EqualError(t, err, fmt.Sprintf("BlockHistoryEstimator: cannot fetch, current block height %v is lower than EVM.RPCBlockQueryDelay=3", i)) } })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(i)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.FetchBlocks(tests.Context(t), head)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("with error retrieving blocks returns error", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() var blockDelay uint16 = 3 var historySize uint16 = 3 var batchSize uint32 bhCfg.BlockDelayF = blockDelay bhCfg.BlockHistorySizeF = historySize bhCfg.BatchSizeF = batchSize geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = true bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) ethClient.On("BatchCallContext", mock.Anything, mock.Anything).Return(pkgerrors.New("something exploded")) err := bhe.FetchBlocks(tests.Context(t), testutils.Head(42)) require.Error(t, err) assert.EqualError(t, err, "BlockHistoryEstimator#fetchBlocks error fetching blocks with BatchCallContext: something exploded") })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.On("BatchCallContext", mock.Anything, mock.Anything)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Return(pkgerrors.New("something exploded"))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.New("something exploded")` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.FetchBlocks(tests.Context(t), testutils.Head(42))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(42)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("batch fetches heads and transactions and sets them on the block history estimator instance", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() var blockDelay uint16 var historySize uint16 = 3 var batchSize uint32 = 2 bhCfg.BlockDelayF = blockDelay bhCfg.BlockHistorySizeF = historySize // Test batching bhCfg.BatchSizeF = batchSize geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = true bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) b41 := evmtypes.Block{ Number: 41, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(1, 2), } b42 := evmtypes.Block{ Number: 42, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(3), } b43 := evmtypes.Block{ Number: 43, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(), } ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(43) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(42) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Once().Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &b43 // This errored block (42) will be ignored elems[1].Error = pkgerrors.New("something went wrong") }) ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(41) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Once().Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &b41 }) err := bhe.FetchBlocks(tests.Context(t), testutils.Head(43)) require.NoError(t, err) require.Len(t, gas.GetRollingBlockHistory(bhe), 2) assert.Equal(t, 41, int(gas.GetRollingBlockHistory(bhe)[0].Number)) // 42 is missing because the fetch errored assert.Equal(t, 43, int(gas.GetRollingBlockHistory(bhe)[1].Number)) assert.Len(t, gas.GetRollingBlockHistory(bhe)[0].Transactions, 2) assert.Len(t, gas.GetRollingBlockHistory(bhe)[1].Transactions, 0) // On new fetch, rolls over the history and drops the old heads b44 := evmtypes.Block{ Number: 44, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(4), } // We are gonna refetch blocks 42 and 44 // 43 is skipped because it was already in the history ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(44) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(42) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Once().Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &b44 elems[1].Result = &b42 }) head := evmtypes.NewHead(big.NewInt(44), b44.Hash, b43.Hash, uint64(time.Now().Unix()), ubig.New(testutils.FixtureChainID)) err = bhe.FetchBlocks(tests.Context(t), &head) require.NoError(t, err) require.Len(t, gas.GetRollingBlockHistory(bhe), 3) assert.Equal(t, 42, int(gas.GetRollingBlockHistory(bhe)[0].Number)) assert.Equal(t, 43, int(gas.GetRollingBlockHistory(bhe)[1].Number)) assert.Equal(t, 44, int(gas.GetRollingBlockHistory(bhe)[2].Number)) assert.Len(t, gas.GetRollingBlockHistory(bhe)[0].Transactions, 1) assert.Len(t, gas.GetRollingBlockHistory(bhe)[1].Transactions, 0) assert.Len(t, gas.GetRollingBlockHistory(bhe)[2].Transactions, 1) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(43) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(42) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) }))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(43) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(42) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Int64ToHex(43)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(b[0].Result)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(&evmtypes.Block{})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Int64ToHex(42)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(b[1].Result)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(&evmtypes.Block{})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Once()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &b43 // This errored block (42) will be ignored elems[1].Error = pkgerrors.New("something went wrong") })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.New("something went wrong")` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(41) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) }))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(41) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Int64ToHex(41)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(b[0].Result)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(&evmtypes.Block{})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Once()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &b41 })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.FetchBlocks(tests.Context(t), testutils.Head(43))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(43)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(44) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(42) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) }))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(44) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(42) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Int64ToHex(44)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(b[0].Result)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(&evmtypes.Block{})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Int64ToHex(42)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(b[1].Result)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(&evmtypes.Block{})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Once()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &b44 elems[1].Result = &b42 })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHead(big.NewInt(44), b44.Hash, b43.Hash, uint64(time.Now().Unix()), ubig.New(testutils.FixtureChainID))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewInt(44)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Now()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Unix()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.New(testutils.FixtureChainID)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.FetchBlocks(tests.Context(t), &head)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("does not refetch blocks below EVM.FinalityDepth", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() var blockDelay uint16 var historySize uint16 = 3 var batchSize uint32 = 2 bhCfg.BlockDelayF = blockDelay bhCfg.BlockHistorySizeF = historySize bhCfg.BatchSizeF = batchSize geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = true bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) b0 := evmtypes.Block{ Number: 0, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(9001), } b1 := evmtypes.Block{ Number: 1, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(9002), } blocks := []evmtypes.Block{b0, b1} gas.SetRollingBlockHistory(bhe, blocks) b2 := evmtypes.Block{ Number: 2, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(1, 2), } b3 := evmtypes.Block{ Number: 3, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(1, 2), } ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(3) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(2) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Once().Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &b3 elems[1].Result = &b2 }) head2 := evmtypes.NewHead(big.NewInt(2), b2.Hash, b1.Hash, uint64(time.Now().Unix()), ubig.New(testutils.FixtureChainID)) head3 := evmtypes.NewHead(big.NewInt(3), b3.Hash, b2.Hash, uint64(time.Now().Unix()), ubig.New(testutils.FixtureChainID)) head3.Parent = &head2 err := bhe.FetchBlocks(tests.Context(t), &head3) require.NoError(t, err) require.Len(t, gas.GetRollingBlockHistory(bhe), 3) assert.Equal(t, 1, int(gas.GetRollingBlockHistory(bhe)[0].Number)) assert.Equal(t, 2, int(gas.GetRollingBlockHistory(bhe)[1].Number)) assert.Equal(t, 3, int(gas.GetRollingBlockHistory(bhe)[2].Number)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(3) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(2) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) }))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(3) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(2) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Int64ToHex(3)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(b[0].Result)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(&evmtypes.Block{})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Int64ToHex(2)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(b[1].Result)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(&evmtypes.Block{})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Once()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &b3 elems[1].Result = &b2 })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHead(big.NewInt(2), b2.Hash, b1.Hash, uint64(time.Now().Unix()), ubig.New(testutils.FixtureChainID))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewInt(2)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Now()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Unix()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.New(testutils.FixtureChainID)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHead(big.NewInt(3), b3.Hash, b2.Hash, uint64(time.Now().Unix()), ubig.New(testutils.FixtureChainID))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewInt(3)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Now()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Unix()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.New(testutils.FixtureChainID)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.FetchBlocks(tests.Context(t), &head3)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("replaces blocks on re-org within EVM.FinalityDepth", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() var blockDelay uint16 var historySize uint16 = 3 var batchSize uint32 = 2 bhCfg.BlockDelayF = blockDelay bhCfg.BlockHistorySizeF = historySize bhCfg.BatchSizeF = batchSize geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = true bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) b0 := evmtypes.Block{ Number: 0, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(9001), } b1 := evmtypes.Block{ Number: 1, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(9002), } b2 := evmtypes.Block{ Number: 2, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(1, 2), } b3 := evmtypes.Block{ Number: 3, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(1, 2), } blocks := []evmtypes.Block{b0, b1, b2, b3} gas.SetRollingBlockHistory(bhe, blocks) // RE-ORG, head2 and head3 have different hash than saved b2 and b3 head2 := evmtypes.NewHead(big.NewInt(2), utils.NewHash(), b1.Hash, uint64(time.Now().Unix()), ubig.New(testutils.FixtureChainID)) head3 := evmtypes.NewHead(big.NewInt(3), utils.NewHash(), head2.Hash, uint64(time.Now().Unix()), ubig.New(testutils.FixtureChainID)) head3.Parent = &head2 ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(3) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(2) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Once().Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) b2New := b2 b2New.Hash = head2.Hash elems[1].Result = &b2New b3New := b3 b3New.Hash = head3.Hash elems[0].Result = &b3New }) err := bhe.FetchBlocks(tests.Context(t), &head3) require.NoError(t, err) require.Len(t, gas.GetRollingBlockHistory(bhe), 3) assert.Equal(t, 1, int(gas.GetRollingBlockHistory(bhe)[0].Number)) assert.Equal(t, 2, int(gas.GetRollingBlockHistory(bhe)[1].Number)) assert.Equal(t, 3, int(gas.GetRollingBlockHistory(bhe)[2].Number)) assert.Equal(t, b1.Hash.Hex(), gas.GetRollingBlockHistory(bhe)[0].Hash.Hex()) assert.Equal(t, head2.Hash.Hex(), gas.GetRollingBlockHistory(bhe)[1].Hash.Hex()) assert.Equal(t, head3.Hash.Hex(), gas.GetRollingBlockHistory(bhe)[2].Hash.Hex()) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHead(big.NewInt(2), utils.NewHash(), b1.Hash, uint64(time.Now().Unix()), ubig.New(testutils.FixtureChainID))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewInt(2)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Now()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Unix()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.New(testutils.FixtureChainID)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHead(big.NewInt(3), utils.NewHash(), head2.Hash, uint64(time.Now().Unix()), ubig.New(testutils.FixtureChainID))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewInt(3)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Now()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Unix()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.New(testutils.FixtureChainID)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(3) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(2) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) }))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(3) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(2) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Int64ToHex(3)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(b[0].Result)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(&evmtypes.Block{})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Int64ToHex(2)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(b[1].Result)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(&evmtypes.Block{})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Once()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) b2New := b2 b2New.Hash = head2.Hash elems[1].Result = &b2New b3New := b3 b3New.Hash = head3.Hash elems[0].Result = &b3New })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.FetchBlocks(tests.Context(t), &head3)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("uses locally cached blocks if they are in the chain", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() var blockDelay uint16 var historySize uint16 = 3 var batchSize uint32 = 2 bhCfg := newBlockHistoryConfig() bhCfg.BlockDelayF = blockDelay bhCfg.BlockHistorySizeF = historySize bhCfg.BatchSizeF = batchSize geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = true bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) b0 := evmtypes.Block{ Number: 0, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(9001), } b1 := evmtypes.Block{ Number: 1, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(9002), } b2 := evmtypes.Block{ Number: 2, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(1, 2), } b3 := evmtypes.Block{ Number: 3, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(1, 2), } blocks := []evmtypes.Block{b0, b1, b2, b3} gas.SetRollingBlockHistory(bhe, blocks) // head2 and head3 have identical hash to saved blocks head2 := evmtypes.NewHead(big.NewInt(2), b2.Hash, b1.Hash, uint64(time.Now().Unix()), ubig.New(testutils.FixtureChainID)) head3 := evmtypes.NewHead(big.NewInt(3), b3.Hash, head2.Hash, uint64(time.Now().Unix()), ubig.New(testutils.FixtureChainID)) head3.Parent = &head2 err := bhe.FetchBlocks(tests.Context(t), &head3) require.NoError(t, err) require.Len(t, gas.GetRollingBlockHistory(bhe), 3) assert.Equal(t, 1, int(gas.GetRollingBlockHistory(bhe)[0].Number)) assert.Equal(t, 2, int(gas.GetRollingBlockHistory(bhe)[1].Number)) assert.Equal(t, 3, int(gas.GetRollingBlockHistory(bhe)[2].Number)) assert.Equal(t, b1.Hash.Hex(), gas.GetRollingBlockHistory(bhe)[0].Hash.Hex()) assert.Equal(t, head2.Hash.Hex(), gas.GetRollingBlockHistory(bhe)[1].Hash.Hex()) assert.Equal(t, head3.Hash.Hex(), gas.GetRollingBlockHistory(bhe)[2].Hash.Hex()) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHead(big.NewInt(2), b2.Hash, b1.Hash, uint64(time.Now().Unix()), ubig.New(testutils.FixtureChainID))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewInt(2)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Now()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Unix()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.New(testutils.FixtureChainID)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHead(big.NewInt(3), b3.Hash, head2.Hash, uint64(time.Now().Unix()), ubig.New(testutils.FixtureChainID))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewInt(3)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Now()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Unix()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.New(testutils.FixtureChainID)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.FetchBlocks(tests.Context(t), &head3)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(43) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(42) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) }))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(43) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(42) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Int64ToHex(43)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(b[0].Result)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(&evmtypes.Block{})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Int64ToHex(42)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(b[1].Result)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(&evmtypes.Block{})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Once()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &b43 elems[1].Result = &b42 })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.FetchBlocks(tests.Context(t), testutils.Head(43))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(43)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1000)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 3 && b[0].Args[0] == "0x3" && b[1].Args[0] == "0x2" && b[2].Args[0] == "0x1" }))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 3 && b[0].Args[0] == "0x3" && b[1].Args[0] == "0x2" && b[2].Args[0] == "0x1" })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &b3 elems[1].Result = &b2 elems[2].Result = &b1 })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.FetchBlocksAndRecalculate(tests.Context(t), testutils.Head(3))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(3)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetGasPrice(bhe)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetRollingBlockHistory(bhe)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("does not crash or set gas price to zero if there are no transactions", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() bhCfg.TransactionPercentileF = uint16(35) geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = false bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) blocks := []evmtypes.Block{} gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(1)) blocks = []evmtypes.Block{{}} gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(1)) blocks = []evmtypes.Block{{Transactions: []evmtypes.Transaction{}}} gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(1)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("sets gas price to EVM.GasEstimator.PriceMax if the calculation would otherwise exceed it", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() bhCfg.TransactionPercentileF = uint16(35) geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = false geCfg.PriceMaxF = maxGasPrice geCfg.PriceMinF = minGasPrice bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) blocks := []evmtypes.Block{ { Number: 0, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(9001), }, { Number: 1, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(9002), }, } gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(1)) price := gas.GetGasPrice(bhe) require.Equal(t, maxGasPrice, price) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetGasPrice(bhe)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("sets gas price to EVM.GasEstimator.PriceMin if the calculation would otherwise fall below it", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() bhCfg.TransactionPercentileF = uint16(35) geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = false geCfg.PriceMaxF = maxGasPrice geCfg.PriceMinF = minGasPrice bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) blocks := []evmtypes.Block{ { Number: 0, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(5), }, { Number: 1, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(7), }, } gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(1)) price := gas.GetGasPrice(bhe) require.Equal(t, minGasPrice, price) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetGasPrice(bhe)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("ignores any transaction with a zero gas limit", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() bhCfg.TransactionPercentileF = uint16(100) geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = false geCfg.PriceMaxF = maxGasPrice geCfg.PriceMinF = minGasPrice bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) b1Hash := utils.NewHash() b2Hash := utils.NewHash() blocks := []evmtypes.Block{ { Number: 0, Hash: b1Hash, ParentHash: common.Hash{}, Transactions: legacyTransactionsFromGasPrices(50), }, { Number: 1, Hash: b2Hash, ParentHash: b1Hash, Transactions: []evmtypes.Transaction{{GasPrice: assets.NewWeiI(70), GasLimit: 42}}, }, { Number: 2, Hash: utils.NewHash(), ParentHash: b2Hash, Transactions: []evmtypes.Transaction{{GasPrice: assets.NewWeiI(90), GasLimit: 0}}, }, } gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(2)) price := gas.GetGasPrice(bhe) require.Equal(t, assets.NewWeiI(70), price) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(70)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(90)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Recalculate(testutils.Head(2))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(2)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetGasPrice(bhe)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("takes into account zero priced transactions if chain is not Gnosis", func(t *testing.T) { // Because everyone loves free gas! ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() bhCfg.TransactionPercentileF = uint16(50) geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = false geCfg.PriceMaxF = maxGasPrice geCfg.PriceMinF = assets.NewWeiI(0) bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) b1Hash := utils.NewHash() blocks := []evmtypes.Block{ { Number: 0, Hash: b1Hash, ParentHash: common.Hash{}, Transactions: legacyTransactionsFromGasPrices(0, 0, 25, 50, 100), }, } gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(0)) price := gas.GetGasPrice(bhe) require.Equal(t, assets.NewWeiI(25), price) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Recalculate(testutils.Head(0))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetGasPrice(bhe)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("ignores zero priced transactions only on Gnosis", func(t *testing.T) { ethClient := evmmocks.NewClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() bhCfg.TransactionPercentileF = uint16(50) geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = false geCfg.PriceMaxF = maxGasPrice geCfg.PriceMinF = assets.NewWeiI(11) // Has to be set as Gnosis will only ignore transactions below this price ibhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) bhe := gas.BlockHistoryEstimatorFromInterface(ibhe) b1Hash := utils.NewHash() blocks := []evmtypes.Block{ { Number: 0, Hash: b1Hash, ParentHash: common.Hash{}, Transactions: legacyTransactionsFromGasPrices(0, 0, 0, 0, 80), }, } gas.SetRollingBlockHistory(bhe, blocks) // chainType is not set - GasEstimator should not ignore zero priced transactions and instead default to PriceMin==11 bhe.Recalculate(testutils.Head(0)) require.Equal(t, assets.NewWeiI(11), gas.GetGasPrice(bhe)) // Set chainType to Gnosis - GasEstimator should now ignore zero priced transactions cfg.ChainTypeF = string(chaintype.ChainGnosis) bhe.Recalculate(testutils.Head(0)) require.Equal(t, assets.NewWeiI(80), gas.GetGasPrice(bhe)) // And for X Layer cfg.ChainTypeF = string(chaintype.ChainXLayer) bhe.Recalculate(testutils.Head(0)) require.Equal(t, assets.NewWeiI(80), gas.GetGasPrice(bhe)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewClient(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(11)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.BlockHistoryEstimatorFromInterface(ibhe)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Recalculate(testutils.Head(0))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Recalculate(testutils.Head(0))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Recalculate(testutils.Head(0))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("handles unreasonably large gas prices (larger than a 64 bit int can hold)", func(t *testing.T) { // Seems unlikely we will ever experience gas prices > 9 Petawei on mainnet (praying to the eth Gods 🙏) // But other chains could easily use a different base of account ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() reasonablyHugeGasPrice := assets.NewWeiI(1000).Mul(big.NewInt(math.MaxInt64)) bhCfg.TransactionPercentileF = uint16(50) geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = false geCfg.PriceMaxF = reasonablyHugeGasPrice geCfg.PriceMinF = assets.NewWeiI(10) bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) unreasonablyHugeGasPrice := assets.NewWeiI(1000000).Mul(big.NewInt(math.MaxInt64)) b1Hash := utils.NewHash() blocks := []evmtypes.Block{ { Number: 0, Hash: b1Hash, ParentHash: common.Hash{}, Transactions: []evmtypes.Transaction{ {GasPrice: assets.NewWeiI(50), GasLimit: 42}, {GasPrice: unreasonablyHugeGasPrice, GasLimit: 42}, {GasPrice: unreasonablyHugeGasPrice, GasLimit: 42}, {GasPrice: unreasonablyHugeGasPrice, GasLimit: 42}, {GasPrice: unreasonablyHugeGasPrice, GasLimit: 42}, {GasPrice: unreasonablyHugeGasPrice, GasLimit: 42}, {GasPrice: unreasonablyHugeGasPrice, GasLimit: 42}, {GasPrice: unreasonablyHugeGasPrice, GasLimit: 42}, {GasPrice: unreasonablyHugeGasPrice, GasLimit: 42}, }, }, } gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(0)) price := gas.GetGasPrice(bhe) require.Equal(t, reasonablyHugeGasPrice, price) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1000)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Mul(big.NewInt(math.MaxInt64))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewInt(math.MaxInt64)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1000000)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Mul(big.NewInt(math.MaxInt64))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewInt(math.MaxInt64)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(50)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Recalculate(testutils.Head(0))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetGasPrice(bhe)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Recalculate(testutils.Head(0))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetGasPrice(bhe)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("does not crash or set gas price to zero if there are no transactions", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() bhCfg.TransactionPercentileF = uint16(35) geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = true bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) blocks := []evmtypes.Block{} gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(1)) blocks = []evmtypes.Block{{}} // No base fee (doesn't crash) gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(1)) blocks = []evmtypes.Block{newBlockWithBaseFee()} gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(1)) empty := newBlockWithBaseFee() empty.Transactions = []evmtypes.Transaction{} blocks = []evmtypes.Block{empty} gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(1)) withOnlyLegacyTransactions := newBlockWithBaseFee() withOnlyLegacyTransactions.Transactions = legacyTransactionsFromGasPrices(9001) blocks = []evmtypes.Block{withOnlyLegacyTransactions} gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(1)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("does not set tip higher than EVM.GasEstimator.PriceMax", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() bhCfg.TransactionPercentileF = uint16(35) geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = true geCfg.PriceMaxF = maxGasPrice geCfg.PriceMinF = assets.NewWeiI(0) geCfg.TipCapMinF = assets.NewWeiI(0) bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) blocks := []evmtypes.Block{ { BaseFeePerGas: assets.NewWeiI(1), Number: 0, Hash: utils.NewHash(), Transactions: dynamicFeeTransactionsFromTipCaps(9001), }, { BaseFeePerGas: assets.NewWeiI(1), Number: 1, Hash: utils.NewHash(), Transactions: dynamicFeeTransactionsFromTipCaps(9002), }, } gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(1)) tipCap := gas.GetTipCap(bhe) require.Equal(t, tipCap.Int64(), maxGasPrice.Int64()) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetTipCap(bhe)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("sets tip cap to EVM.GasEstimator.TipCapMin if the calculation would otherwise fall below it", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() bhCfg.TransactionPercentileF = uint16(35) geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = true geCfg.PriceMaxF = maxGasPrice geCfg.PriceMinF = assets.NewWeiI(0) geCfg.TipCapMinF = assets.NewWeiI(10) bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) blocks := []evmtypes.Block{ { BaseFeePerGas: assets.NewWeiI(1), Number: 0, Hash: utils.NewHash(), Transactions: dynamicFeeTransactionsFromTipCaps(5), }, { BaseFeePerGas: assets.NewWeiI(1), Number: 1, Hash: utils.NewHash(), Transactions: dynamicFeeTransactionsFromTipCaps(7), }, } gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(1)) price := gas.GetTipCap(bhe) require.Equal(t, assets.NewWeiI(10), price) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetTipCap(bhe)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("ignores any transaction with a zero gas limit", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() bhCfg.TransactionPercentileF = uint16(95) geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = true geCfg.PriceMaxF = maxGasPrice geCfg.PriceMinF = assets.NewWeiI(0) geCfg.TipCapMinF = assets.NewWeiI(10) bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) b1Hash := utils.NewHash() b2Hash := utils.NewHash() blocks := []evmtypes.Block{ { Number: 0, Hash: b1Hash, ParentHash: common.Hash{}, Transactions: legacyTransactionsFromGasPrices(50), }, { BaseFeePerGas: assets.NewWeiI(10), Number: 1, Hash: b2Hash, ParentHash: b1Hash, Transactions: []evmtypes.Transaction{{Type: 0x2, MaxFeePerGas: assets.NewWeiI(1000), MaxPriorityFeePerGas: assets.NewWeiI(60), GasLimit: 42}}, }, { Number: 2, Hash: utils.NewHash(), ParentHash: b2Hash, Transactions: []evmtypes.Transaction{{Type: 0x2, MaxFeePerGas: assets.NewWeiI(1000), MaxPriorityFeePerGas: assets.NewWeiI(80), GasLimit: 0}}, }, } gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(2)) price := gas.GetTipCap(bhe) require.Equal(t, assets.NewWeiI(60), price) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1000)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(60)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1000)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(80)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Recalculate(testutils.Head(2))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(2)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetTipCap(bhe)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("respects minimum gas tip cap", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() bhCfg.TransactionPercentileF = uint16(35) geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = true geCfg.PriceMaxF = maxGasPrice geCfg.PriceMinF = assets.NewWeiI(0) geCfg.TipCapMinF = assets.NewWeiI(1) bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) b1Hash := utils.NewHash() blocks := []evmtypes.Block{ { BaseFeePerGas: assets.NewWeiI(10), Number: 0, Hash: b1Hash, ParentHash: common.Hash{}, Transactions: dynamicFeeTransactionsFromTipCaps(0, 0, 0, 0, 100), }, } gas.SetRollingBlockHistory(bhe, blocks) bhe.Recalculate(testutils.Head(0)) price := gas.GetTipCap(bhe) assert.Equal(t, assets.NewWeiI(1), price) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Recalculate(testutils.Head(0))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetTipCap(bhe)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Recalculate(testutils.Head(0))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetTipCap(bhe)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("returns false if transaction has 0 gas limit", func(t *testing.T) { tx := evmtypes.Transaction{Type: 0x0, GasPrice: assets.NewWeiI(10), GasLimit: 0, Hash: utils.NewHash()} assert.Equal(t, false, bhe.IsUsable(tx, block, cfg.ChainType(), geCfg.PriceMin(), logger.Test(t))) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("returns false if transaction gas limit is nil and tx type is 0x0", func(t *testing.T) { tx := evmtypes.Transaction{Type: 0x0, GasPrice: nil, GasLimit: 42, Hash: utils.NewHash()} assert.Equal(t, false, bhe.IsUsable(tx, block, cfg.ChainType(), geCfg.PriceMin(), logger.Test(t))) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("returns false if transaction is of type 0x7e only on Optimism", func(t *testing.T) { cfg.ChainTypeF = "optimismBedrock" tx := evmtypes.Transaction{Type: 0x7e, GasPrice: assets.NewWeiI(10), GasLimit: 42, Hash: utils.NewHash()} assert.Equal(t, false, bhe.IsUsable(tx, block, cfg.ChainType(), geCfg.PriceMin(), logger.Test(t))) cfg.ChainTypeF = "" assert.Equal(t, true, bhe.IsUsable(tx, block, cfg.ChainType(), geCfg.PriceMin(), logger.Test(t))) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("returns false if transaction is of type 0x7c or 0x7b only on Celo", func(t *testing.T) { cfg.ChainTypeF = "celo" tx := evmtypes.Transaction{Type: 0x7c, GasPrice: assets.NewWeiI(10), GasLimit: 42, Hash: utils.NewHash()} assert.Equal(t, false, bhe.IsUsable(tx, block, cfg.ChainType(), geCfg.PriceMin(), logger.Test(t))) tx2 := evmtypes.Transaction{Type: 0x7b, GasPrice: assets.NewWeiI(10), GasLimit: 42, Hash: utils.NewHash()} assert.Equal(t, false, bhe.IsUsable(tx2, block, cfg.ChainType(), geCfg.PriceMin(), logger.Test(t))) cfg.ChainTypeF = "" assert.Equal(t, true, bhe.IsUsable(tx, block, cfg.ChainType(), geCfg.PriceMin(), logger.Test(t))) assert.Equal(t, true, bhe.IsUsable(tx2, block, cfg.ChainType(), geCfg.PriceMin(), logger.Test(t))) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("returns false if transaction is of type 0x16 only on WeMix", func(t *testing.T) { cfg.ChainTypeF = "wemix" tx := evmtypes.Transaction{Type: 0x16, GasPrice: assets.NewWeiI(10), GasLimit: 42, Hash: utils.NewHash()} assert.Equal(t, false, bhe.IsUsable(tx, block, cfg.ChainType(), geCfg.PriceMin(), logger.Test(t))) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("returns false if transaction has base fee higher than the gas price only on Celo", func(t *testing.T) { cfg.ChainTypeF = "celo" tx := evmtypes.Transaction{Type: 0x0, GasPrice: assets.NewWeiI(10), GasLimit: 42, Hash: utils.NewHash()} assert.Equal(t, false, bhe.IsUsable(tx, block, cfg.ChainType(), geCfg.PriceMin(), logger.Test(t))) tx2 := evmtypes.Transaction{Type: 0x2, MaxPriorityFeePerGas: assets.NewWeiI(200), MaxFeePerGas: assets.NewWeiI(250), GasPrice: assets.NewWeiI(50), GasLimit: 42, Hash: utils.NewHash()} assert.Equal(t, false, bhe.IsUsable(tx, block, cfg.ChainType(), geCfg.PriceMin(), logger.Test(t))) cfg.ChainTypeF = "" assert.Equal(t, true, bhe.IsUsable(tx, block, cfg.ChainType(), geCfg.PriceMin(), logger.Test(t))) assert.Equal(t, true, bhe.IsUsable(tx2, block, cfg.ChainType(), geCfg.PriceMin(), logger.Test(t))) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(200)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(250)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(50)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("returns nil if block is missing base fee", func(t *testing.T) { tx := evmtypes.Transaction{Type: 0x0, GasPrice: assets.NewWeiI(42), GasLimit: 42, Hash: utils.NewHash()} res := bhe.EffectiveTipCap(block, tx) assert.Nil(t, res) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(42)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.EffectiveTipCap(block, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("legacy transaction type infers tip cap from tx.gas_price - block.base_fee_per_gas", func(t *testing.T) { tx := evmtypes.Transaction{Type: 0x0, GasPrice: assets.NewWeiI(142), GasLimit: 42, Hash: utils.NewHash()} res := bhe.EffectiveTipCap(eipblock, tx) assert.Equal(t, "42 wei", res.String()) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(142)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.EffectiveTipCap(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("tx type 2 & type 3 should calculate gas price", func(t *testing.T) { // 0x2 transaction (should use MaxPriorityFeePerGas) tx := evmtypes.Transaction{Type: 0x2, MaxPriorityFeePerGas: assets.NewWeiI(200), MaxFeePerGas: assets.NewWeiI(250), GasLimit: 42, Hash: utils.NewHash()} res := bhe.EffectiveTipCap(eipblock, tx) assert.Equal(t, "200 wei", res.String()) // 0x2 transaction (should use MaxPriorityFeePerGas, ignoring gas price) tx = evmtypes.Transaction{Type: 0x2, GasPrice: assets.NewWeiI(400), MaxPriorityFeePerGas: assets.NewWeiI(200), MaxFeePerGas: assets.NewWeiI(350), GasLimit: 42, Hash: utils.NewHash()} res = bhe.EffectiveTipCap(eipblock, tx) assert.Equal(t, "200 wei", res.String()) // 0x3 transaction (should use MaxPriorityFeePerGas) tx = evmtypes.Transaction{Type: 0x3, MaxPriorityFeePerGas: assets.NewWeiI(100), MaxFeePerGas: assets.NewWeiI(250), GasLimit: 42, Hash: utils.NewHash()} res = bhe.EffectiveTipCap(eipblock, tx) assert.Equal(t, "100 wei", res.String()) // 0x3 transaction (should use MaxPriorityFeePerGas, ignoring gas price) tx = evmtypes.Transaction{Type: 0x3, GasPrice: assets.NewWeiI(400), MaxPriorityFeePerGas: assets.NewWeiI(100), MaxFeePerGas: assets.NewWeiI(350), GasLimit: 42, Hash: utils.NewHash()} res = bhe.EffectiveTipCap(eipblock, tx) assert.Equal(t, "100 wei", res.String()) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(200)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(250)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.EffectiveTipCap(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(400)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(200)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(350)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.EffectiveTipCap(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(250)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.EffectiveTipCap(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(400)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(350)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.EffectiveTipCap(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("missing field returns nil", func(t *testing.T) { tx := evmtypes.Transaction{Type: 0x2, GasPrice: assets.NewWeiI(132), MaxFeePerGas: assets.NewWeiI(200), GasLimit: 42, Hash: utils.NewHash()} res := bhe.EffectiveTipCap(eipblock, tx) assert.Nil(t, res) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(132)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(200)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.EffectiveTipCap(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(55555)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(200)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(250)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.EffectiveTipCap(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("legacy transaction type should use GasPrice", func(t *testing.T) { tx := evmtypes.Transaction{Type: 0x0, GasPrice: assets.NewWeiI(42), GasLimit: 42, Hash: utils.NewHash()} res := bhe.EffectiveGasPrice(eipblock, tx) assert.Equal(t, "42 wei", res.String()) tx = evmtypes.Transaction{Type: 0x0, GasLimit: 42, Hash: utils.NewHash()} res = bhe.EffectiveGasPrice(eipblock, tx) assert.Nil(t, res) tx = evmtypes.Transaction{Type: 0x1, GasPrice: assets.NewWeiI(42), GasLimit: 42, Hash: utils.NewHash()} res = bhe.EffectiveGasPrice(eipblock, tx) assert.Equal(t, "42 wei", res.String()) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(42)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.EffectiveGasPrice(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.EffectiveGasPrice(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(42)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.EffectiveGasPrice(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("tx type 2 should calculate gas price", func(t *testing.T) { // 0x2 transaction (should calculate to 250) tx := evmtypes.Transaction{Type: 0x2, MaxPriorityFeePerGas: assets.NewWeiI(200), MaxFeePerGas: assets.NewWeiI(250), GasLimit: 42, Hash: utils.NewHash()} res := bhe.EffectiveGasPrice(eipblock, tx) assert.Equal(t, "250 wei", res.String()) // 0x2 transaction (should calculate to 300) tx = evmtypes.Transaction{Type: 0x2, MaxPriorityFeePerGas: assets.NewWeiI(200), MaxFeePerGas: assets.NewWeiI(350), GasLimit: 42, Hash: utils.NewHash()} res = bhe.EffectiveGasPrice(eipblock, tx) assert.Equal(t, "300 wei", res.String()) // 0x2 transaction (should calculate to 300, ignoring gas price) tx = evmtypes.Transaction{Type: 0x2, MaxPriorityFeePerGas: assets.NewWeiI(200), MaxFeePerGas: assets.NewWeiI(350), GasLimit: 42, Hash: utils.NewHash()} res = bhe.EffectiveGasPrice(eipblock, tx) assert.Equal(t, "300 wei", res.String()) // 0x2 transaction (should fall back to gas price since MaxFeePerGas is missing) tx = evmtypes.Transaction{Type: 0x2, GasPrice: assets.NewWeiI(32), MaxPriorityFeePerGas: assets.NewWeiI(200), GasLimit: 42, Hash: utils.NewHash()} res = bhe.EffectiveGasPrice(eipblock, tx) assert.Equal(t, "32 wei", res.String()) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(200)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(250)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.EffectiveGasPrice(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(200)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(350)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.EffectiveGasPrice(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(200)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(350)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.EffectiveGasPrice(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(32)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(200)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.EffectiveGasPrice(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("tx type 3 should calculate gas price", func(t *testing.T) { // 0x3 transaction (should calculate to 250) tx := evmtypes.Transaction{Type: 0x3, MaxPriorityFeePerGas: assets.NewWeiI(100), MaxFeePerGas: assets.NewWeiI(110), GasLimit: 42, Hash: utils.NewHash()} res := bhe.EffectiveGasPrice(eipblock, tx) assert.Equal(t, "110 wei", res.String()) // 0x3 transaction (should calculate to 300) tx = evmtypes.Transaction{Type: 0x3, MaxPriorityFeePerGas: assets.NewWeiI(200), MaxFeePerGas: assets.NewWeiI(350), GasLimit: 42, Hash: utils.NewHash()} res = bhe.EffectiveGasPrice(eipblock, tx) assert.Equal(t, "300 wei", res.String()) // 0x3 transaction (should calculate to 300, ignoring gas price) tx = evmtypes.Transaction{Type: 0x3, MaxPriorityFeePerGas: assets.NewWeiI(200), MaxFeePerGas: assets.NewWeiI(350), GasLimit: 42, Hash: utils.NewHash()} res = bhe.EffectiveGasPrice(eipblock, tx) assert.Equal(t, "300 wei", res.String()) // 0x3 transaction (should fall back to gas price since MaxFeePerGas is missing) tx = evmtypes.Transaction{Type: 0x3, GasPrice: assets.NewWeiI(5), MaxPriorityFeePerGas: assets.NewWeiI(200), GasLimit: 42, Hash: utils.NewHash()} res = bhe.EffectiveGasPrice(eipblock, tx) assert.Equal(t, "5 wei", res.String()) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(110)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.EffectiveGasPrice(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(200)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(350)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.EffectiveGasPrice(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(200)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(350)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.EffectiveGasPrice(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(5)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(200)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.EffectiveGasPrice(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("tx type 2 has block missing base fee (should never happen but must handle gracefully)", func(t *testing.T) { // 0x2 transaction (should calculate to 250) tx := evmtypes.Transaction{Type: 0x2, GasPrice: assets.NewWeiI(55555), MaxPriorityFeePerGas: assets.NewWeiI(200), MaxFeePerGas: assets.NewWeiI(250), GasLimit: 42, Hash: utils.NewHash()} res := bhe.EffectiveGasPrice(block, tx) assert.Equal(t, "55.555 kwei", res.String()) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(55555)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(200)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(250)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.EffectiveGasPrice(block, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("unknown type returns nil", func(t *testing.T) { tx := evmtypes.Transaction{Type: 0x4, GasPrice: assets.NewWeiI(55555), MaxPriorityFeePerGas: assets.NewWeiI(200), MaxFeePerGas: assets.NewWeiI(250), GasLimit: 42, Hash: utils.NewHash()} res := bhe.EffectiveGasPrice(block, tx) assert.Nil(t, res) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(55555)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(200)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(250)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.EffectiveGasPrice(block, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("Assumption violation of MaxFeePerGas >= BaseFeePerGas returns gas price if specified", func(t *testing.T) { // Max: 1, Base: 100 tx := evmtypes.Transaction{Type: 0x2, GasPrice: assets.NewWeiI(42), MaxPriorityFeePerGas: assets.NewWeiI(1), MaxFeePerGas: assets.NewWeiI(1), GasLimit: 42, Hash: utils.NewHash()} res := bhe.EffectiveGasPrice(eipblock, tx) assert.Equal(t, "42 wei", res.String()) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(42)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.EffectiveGasPrice(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("Assumption violation of MaxFeePerGas >= MaxPriorityFeePerGas returns gas price if specified", func(t *testing.T) { // Max Priority: 201, Max: 200, Base: 100 tx := evmtypes.Transaction{Type: 0x2, GasPrice: assets.NewWeiI(42), MaxPriorityFeePerGas: assets.NewWeiI(201), MaxFeePerGas: assets.NewWeiI(200), GasLimit: 42, Hash: utils.NewHash()} res := bhe.EffectiveGasPrice(eipblock, tx) assert.Equal(t, "42 wei", res.String()) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(42)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(201)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(200)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.EffectiveGasPrice(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("Assumption violation of MaxFeePerGas >= BaseFeePerGas returns nil if no gas price is specified", func(t *testing.T) { // Max: 1, Base: 100 tx := evmtypes.Transaction{Type: 0x2, MaxPriorityFeePerGas: assets.NewWeiI(1), MaxFeePerGas: assets.NewWeiI(1), GasLimit: 42, Hash: utils.NewHash()} res := bhe.EffectiveGasPrice(eipblock, tx) assert.Nil(t, res) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.EffectiveGasPrice(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(201)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(200)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.EffectiveGasPrice(eipblock, tx)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Unmarshal([]byte(blockJSON), &block)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Unmarshal([]byte(blockJSON), &block)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Hash.String()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1000000)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SimulateStart(t, bhe)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("if gas price is lower than global max and user specified max gas price", func(t *testing.T) { fee, limit, err := bhe.GetLegacyGas(tests.Context(t), make([]byte, 0), 10000, maxGasPrice) require.NoError(t, err) assert.Equal(t, assets.NewWeiI(1000), fee) assert.Equal(t, 10000, int(limit)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetLegacyGas(tests.Context(t), make([]byte, 0), 10000, maxGasPrice)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("if gas price is higher than user-specified max", func(t *testing.T) { fee, limit, err := bhe.GetLegacyGas(tests.Context(t), make([]byte, 0), 10000, assets.NewWeiI(800)) require.NoError(t, err) assert.Equal(t, assets.NewWeiI(800), fee) assert.Equal(t, 10000, int(limit)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetLegacyGas(tests.Context(t), make([]byte, 0), 10000, assets.NewWeiI(800))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(800)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(700)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SimulateStart(t, bhe)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetLegacyGas(tests.Context(t), make([]byte, 0), 10000, maxGasPrice)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("fallbacks to EvmGasPriceDefault if there aren't any valid transactions to estimate from.", func(t *testing.T) { cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() bhCfg.BatchSizeF = batchSize bhCfg.TransactionPercentileF = uint16(35) bhCfg.BlockDelayF = blockDelay bhCfg.BlockHistorySizeF = historySize geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = false geCfg.PriceMaxF = assets.NewWeiI(1000000) geCfg.PriceDefaultF = assets.NewWeiI(100) ethClient := testutils.NewEthClientMockWithDefaultChain(t) l1Oracle := rollupMocks.NewL1Oracle(t) bhe := newBlockHistoryEstimator(t, ethClient, cfg, geCfg, bhCfg, l1Oracle) h := &evmtypes.Head{Hash: utils.NewHash(), Number: 42, BaseFeePerGas: nil} ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h, nil) ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 3 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(42) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(41) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[2].Method == "eth_getBlockByNumber" && b[2].Args[0] == gas.Int64ToHex(40) && b[1].Args[1].(bool) && reflect.TypeOf(b[2].Result) == reflect.TypeOf(&evmtypes.Block{}) })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &evmtypes.Block{ Number: 42, Hash: utils.NewHash(), } elems[1].Result = &evmtypes.Block{ Number: 41, Hash: utils.NewHash(), } elems[2].Result = &evmtypes.Block{ Number: 40, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPricesTxType(specialTxTypeCode, 1), } }).Once() err := bhe.Start(tests.Context(t)) require.NoError(t, err) fee, limit, err := bhe.GetLegacyGas(tests.Context(t), make([]byte, 0), 10000, assets.NewWeiI(800)) require.NoError(t, err) require.Equal(t, geCfg.PriceDefault(), fee) assert.Equal(t, 10000, int(limit)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1000000)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Return(h, nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 3 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(42) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(41) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[2].Method == "eth_getBlockByNumber" && b[2].Args[0] == gas.Int64ToHex(40) && b[1].Args[1].(bool) && reflect.TypeOf(b[2].Result) == reflect.TypeOf(&evmtypes.Block{}) }))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 3 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(42) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(41) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[2].Method == "eth_getBlockByNumber" && b[2].Args[0] == gas.Int64ToHex(40) && b[1].Args[1].(bool) && reflect.TypeOf(b[2].Result) == reflect.TypeOf(&evmtypes.Block{}) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Int64ToHex(42)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(b[0].Result)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(&evmtypes.Block{})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Int64ToHex(41)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(b[1].Result)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(&evmtypes.Block{})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Int64ToHex(40)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(b[2].Result)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(&evmtypes.Block{})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &evmtypes.Block{ Number: 42, Hash: utils.NewHash(), } elems[1].Result = &evmtypes.Block{ Number: 41, Hash: utils.NewHash(), } elems[2].Result = &evmtypes.Block{ Number: 40, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPricesTxType(specialTxTypeCode, 1), } })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Once()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Start(tests.Context(t))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetLegacyGas(tests.Context(t), make([]byte, 0), 10000, assets.NewWeiI(800))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(800)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1000000)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(50)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(40)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Return(h, nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 3 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(42) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(41) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[2].Method == "eth_getBlockByNumber" && b[2].Args[0] == gas.Int64ToHex(40) && b[1].Args[1].(bool) && reflect.TypeOf(b[2].Result) == reflect.TypeOf(&evmtypes.Block{}) }))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 3 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == gas.Int64ToHex(42) && b[0].Args[1].(bool) && reflect.TypeOf(b[0].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == gas.Int64ToHex(41) && b[1].Args[1].(bool) && reflect.TypeOf(b[1].Result) == reflect.TypeOf(&evmtypes.Block{}) && b[2].Method == "eth_getBlockByNumber" && b[2].Args[0] == gas.Int64ToHex(40) && b[1].Args[1].(bool) && reflect.TypeOf(b[2].Result) == reflect.TypeOf(&evmtypes.Block{}) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Int64ToHex(42)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(b[0].Result)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(&evmtypes.Block{})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Int64ToHex(41)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(b[1].Result)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(&evmtypes.Block{})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Int64ToHex(40)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(b[2].Result)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TypeOf(&evmtypes.Block{})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &evmtypes.Block{ Number: 42, Hash: utils.NewHash(), } elems[1].Result = &evmtypes.Block{ Number: 41, Hash: utils.NewHash(), } elems[2].Result = &evmtypes.Block{ Number: 40, Hash: utils.NewHash(), Transactions: dynamicFeeTransactionsFromTipCapsTxType(specialTxTypeCode, 1), } })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Once()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Start(tests.Context(t))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetDynamicFee(tests.Context(t), assets.NewWeiI(200))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(200)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1000000)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(0)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(88889)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(100000)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Recalculate(testutils.Head(1))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SimulateStart(t, bhe)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("if estimator is missing base fee and gas bumping is enabled", func(t *testing.T) { geCfg.BumpThresholdF = uint64(1) _, err := bhe.GetDynamicFee(tests.Context(t), maxGasPrice) require.Error(t, err) assert.Contains(t, err.Error(), "BlockHistoryEstimator: no value for latest block base fee; cannot estimate EIP-1559 base fee. Are you trying to run with EIP1559 enabled on a non-EIP1559 chain?") })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetDynamicFee(tests.Context(t), maxGasPrice)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("if estimator is missing base fee and gas bumping is disabled", func(t *testing.T) { geCfg.BumpThresholdF = uint64(0) fee, err := bhe.GetDynamicFee(tests.Context(t), maxGasPrice) require.NoError(t, err) assert.Equal(t, gas.DynamicFee{FeeCap: maxGasPrice, TipCap: assets.NewWeiI(6000)}, fee) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetDynamicFee(tests.Context(t), maxGasPrice)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(112500)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.OnNewLongestChain(tests.Context(t), h)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("if gas bumping is enabled", func(t *testing.T) { geCfg.BumpThresholdF = uint64(1) fee, err := bhe.GetDynamicFee(tests.Context(t), maxGasPrice) require.NoError(t, err) assert.Equal(t, gas.DynamicFee{FeeCap: assets.NewWeiI(186203), TipCap: assets.NewWeiI(6000)}, fee) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetDynamicFee(tests.Context(t), maxGasPrice)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("if gas bumping is disabled", func(t *testing.T) { geCfg.BumpThresholdF = uint64(0) fee, err := bhe.GetDynamicFee(tests.Context(t), maxGasPrice) require.NoError(t, err) assert.Equal(t, gas.DynamicFee{FeeCap: maxGasPrice, TipCap: assets.NewWeiI(6000)}, fee) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetDynamicFee(tests.Context(t), maxGasPrice)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("if gas bumping is enabled and local max gas price set", func(t *testing.T) { geCfg.BumpThresholdF = uint64(1) fee, err := bhe.GetDynamicFee(tests.Context(t), assets.NewWeiI(180000)) require.NoError(t, err) assert.Equal(t, gas.DynamicFee{FeeCap: assets.NewWeiI(180000), TipCap: assets.NewWeiI(6000)}, fee) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetDynamicFee(tests.Context(t), assets.NewWeiI(180000))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(180000)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("if bump threshold is 0 and local max gas price set", func(t *testing.T) { geCfg.BumpThresholdF = uint64(0) fee, err := bhe.GetDynamicFee(tests.Context(t), assets.NewWeiI(100)) require.NoError(t, err) assert.Equal(t, gas.DynamicFee{FeeCap: assets.NewWeiI(100), TipCap: assets.NewWeiI(6000)}, fee) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetDynamicFee(tests.Context(t), assets.NewWeiI(100))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(900000)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.OnNewLongestChain(tests.Context(t), h)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.GetDynamicFee(tests.Context(t), assets.NewWeiI(1200000))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1200000)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TestObserved(t, zapcore.DebugLevel)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.BlockHistoryEstimatorFromInterface( gas.NewBlockHistoryEstimator(lggr, nil, cfg, geCfg, bhCfg, testutils.NewRandomEVMChainID(), l1Oracle), )` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewBlockHistoryEstimator(lggr, nil, cfg, geCfg, bhCfg, testutils.NewRandomEVMChainID(), l1Oracle)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewRandomEVMChainID()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("skips connectivity check if latest block is not present", func(t *testing.T) { err := bhe.CheckConnectivity(attempts) require.NoError(t, err) tests.AssertLogEventually(t, obs, "Latest block is unknown; skipping inclusion check") })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.CheckConnectivity(attempts)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.AssertLogEventually(t, obs, "Latest block is unknown; skipping inclusion check")` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(112500)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.OnNewLongestChain(tests.Context(t), h)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, []evmtypes.Block{b0})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("skips connectivity check if block history has insufficient size", func(t *testing.T) { err := bhe.CheckConnectivity(attempts) require.NoError(t, err) tests.AssertLogEventually(t, obs, "Block history in memory with length 1 is insufficient to determine whether transaction should have been included within the past 4 blocks") })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.CheckConnectivity(attempts)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.AssertLogEventually(t, obs, "Block history in memory with length 1 is insufficient to determine whether transaction should have been included within the past 4 blocks")` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("skips connectivity check if attempts is nil or empty", func(t *testing.T) { err := bhe.CheckConnectivity(nil) require.NoError(t, err) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.CheckConnectivity(nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, []evmtypes.Block{b0, b1, b2, b3})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(5)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(112500)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.OnNewLongestChain(tests.Context(t), h)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("returns error if one of the supplied attempts is missing BroadcastBeforeBlockNum", func(t *testing.T) { err := bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("BroadcastBeforeBlockNum was unexpectedly nil for attempt %s", attempts[0].TxHash)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.CheckConnectivity(attempts)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("returns error if one of the supplied attempts has an unknown transaction type", func(t *testing.T) { err := bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("attempt %s has unknown transaction type 0x3", hash)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.CheckConnectivity(attempts)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("skips connectivity check if no transactions are suitable", func(t *testing.T) { err := bhe.CheckConnectivity(attempts) require.NoError(t, err) tests.AssertLogEventually(t, obs, fmt.Sprintf("no suitable transactions found to verify if transaction %s has been included within expected inclusion blocks of 4", hash)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.CheckConnectivity(attempts)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.AssertLogEventually(t, obs, fmt.Sprintf("no suitable transactions found to verify if transaction %s has been included within expected inclusion blocks of 4", hash))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Sprintf("no suitable transactions found to verify if transaction %s has been included within expected inclusion blocks of 4", hash)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("in legacy mode", func(t *testing.T) { b0 = evmtypes.Block{ Number: 0, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(1000), } b1 = evmtypes.Block{ Number: 1, Hash: utils.NewHash(), ParentHash: b0.Hash, Transactions: legacyTransactionsFromGasPrices(2, 3, 4, 5, 6), } b2 = evmtypes.Block{ Number: 2, Hash: utils.NewHash(), ParentHash: b1.Hash, Transactions: legacyTransactionsFromGasPrices(4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9), } b3 = evmtypes.Block{ Number: 3, Hash: utils.NewHash(), ParentHash: b2.Hash, Transactions: legacyTransactionsFromGasPrices(3, 4, 5, 6, 7), } gas.SetRollingBlockHistory(bhe, []evmtypes.Block{b0, b1, b2, b3}) attempts = []gas.EvmPriorAttempt{ {TxType: 0x0, TxHash: NewEvmHash(), GasPrice: assets.NewWeiI(1000), BroadcastBeforeBlockNum: ptr(int64(4))}, // This is very expensive but will be ignored due to BroadcastBeforeBlockNum being too recent {TxType: 0x0, TxHash: NewEvmHash(), GasPrice: assets.NewWeiI(3), BroadcastBeforeBlockNum: ptr(int64(0))}, {TxType: 0x0, TxHash: NewEvmHash(), GasPrice: assets.NewWeiI(5), BroadcastBeforeBlockNum: ptr(int64(1))}, {TxType: 0x0, TxHash: NewEvmHash(), GasPrice: assets.NewWeiI(7), BroadcastBeforeBlockNum: ptr(int64(1))}, } t.Run("passes check if all blocks have percentile price higher or exactly at the highest transaction gas price", func(t *testing.T) { bhCfg.CheckInclusionBlocksF = 3 bhCfg.CheckInclusionPercentileF = 80 // percentile price is 7 wei err := bhe.CheckConnectivity(attempts) require.NoError(t, err) }) t.Run("fails check if one or more blocks has percentile price higher than highest transaction gas price", func(t *testing.T) { bhCfg.CheckInclusionBlocksF = 3 bhCfg.CheckInclusionPercentileF = 40 // percentile price is 5 wei err := bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has gas price of 7 wei, which is above percentile=40%% (percentile price: 5 wei) for blocks 2 thru 0 (checking 3 blocks)", attempts[3].TxHash)) require.ErrorIs(t, err, commonfee.ErrConnectivity) }) t.Run("fails check if one or more blocks has percentile price higher than any transaction gas price", func(t *testing.T) { bhCfg.CheckInclusionBlocksF = 3 bhCfg.CheckInclusionPercentileF = 30 // percentile price is 4 wei err := bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has gas price of 5 wei, which is above percentile=30%% (percentile price: 4 wei) for blocks 2 thru 0 (checking 3 blocks)", attempts[2].TxHash)) bhCfg.CheckInclusionBlocksF = 3 bhCfg.CheckInclusionPercentileF = 5 // percentile price is 2 wei err = bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has gas price of 3 wei, which is above percentile=5%% (percentile price: 2 wei) for blocks 2 thru 0 (checking 3 blocks)", attempts[1].TxHash)) require.ErrorIs(t, err, commonfee.ErrConnectivity) }) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, []evmtypes.Block{b0, b1, b2, b3})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1000)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(3)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(5)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(7)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("passes check if all blocks have percentile price higher or exactly at the highest transaction gas price", func(t *testing.T) { bhCfg.CheckInclusionBlocksF = 3 bhCfg.CheckInclusionPercentileF = 80 // percentile price is 7 wei err := bhe.CheckConnectivity(attempts) require.NoError(t, err) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.CheckConnectivity(attempts)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("fails check if one or more blocks has percentile price higher than highest transaction gas price", func(t *testing.T) { bhCfg.CheckInclusionBlocksF = 3 bhCfg.CheckInclusionPercentileF = 40 // percentile price is 5 wei err := bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has gas price of 7 wei, which is above percentile=40%% (percentile price: 5 wei) for blocks 2 thru 0 (checking 3 blocks)", attempts[3].TxHash)) require.ErrorIs(t, err, commonfee.ErrConnectivity) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.CheckConnectivity(attempts)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("fails check if one or more blocks has percentile price higher than any transaction gas price", func(t *testing.T) { bhCfg.CheckInclusionBlocksF = 3 bhCfg.CheckInclusionPercentileF = 30 // percentile price is 4 wei err := bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has gas price of 5 wei, which is above percentile=30%% (percentile price: 4 wei) for blocks 2 thru 0 (checking 3 blocks)", attempts[2].TxHash)) bhCfg.CheckInclusionBlocksF = 3 bhCfg.CheckInclusionPercentileF = 5 // percentile price is 2 wei err = bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has gas price of 3 wei, which is above percentile=5%% (percentile price: 2 wei) for blocks 2 thru 0 (checking 3 blocks)", attempts[1].TxHash)) require.ErrorIs(t, err, commonfee.ErrConnectivity) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.CheckConnectivity(attempts)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.CheckConnectivity(attempts)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("handles mixed legacy and EIP-1559 transactions", func(t *testing.T) { b0 = evmtypes.Block{ BaseFeePerGas: assets.NewWeiI(1), Number: 3, Hash: utils.NewHash(), Transactions: append(legacyTransactionsFromGasPrices(1, 2, 3, 4, 5), dynamicFeeTransactionsFromTipCaps(6, 7, 8, 9, 10)...), } gas.SetRollingBlockHistory(bhe, []evmtypes.Block{b0}) attempts = []gas.EvmPriorAttempt{ {TxType: 0x2, TxHash: NewEvmHash(), DynamicFee: gas.DynamicFee{FeeCap: assets.NewWeiI(1), TipCap: assets.NewWeiI(3)}, BroadcastBeforeBlockNum: ptr(int64(0))}, {TxType: 0x0, TxHash: NewEvmHash(), GasPrice: assets.NewWeiI(10), BroadcastBeforeBlockNum: ptr(int64(0))}, } t.Run("passes check if both transactions are ok", func(t *testing.T) { bhCfg.CheckInclusionBlocksF = 1 bhCfg.CheckInclusionPercentileF = 90 // percentile price is 5 wei err := bhe.CheckConnectivity(attempts) require.NoError(t, err) }) t.Run("fails check if legacy transaction fails", func(t *testing.T) { bhCfg.CheckInclusionBlocksF = 1 bhCfg.CheckInclusionPercentileF = 60 err := bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has gas price of 10 wei, which is above percentile=60%% (percentile price: 7 wei) for blocks 3 thru 3 (checking 1 blocks)", attempts[1].TxHash)) require.ErrorIs(t, err, commonfee.ErrConnectivity) }) attempts = []gas.EvmPriorAttempt{ {TxType: 0x2, TxHash: NewEvmHash(), DynamicFee: gas.DynamicFee{FeeCap: assets.NewWeiI(11), TipCap: assets.NewWeiI(10)}, BroadcastBeforeBlockNum: ptr(int64(0))}, {TxType: 0x0, TxHash: NewEvmHash(), GasPrice: assets.NewWeiI(3), BroadcastBeforeBlockNum: ptr(int64(0))}, } t.Run("fails check if dynamic fee transaction fails", func(t *testing.T) { gas.SetRollingBlockHistory(bhe, []evmtypes.Block{b0}) bhCfg.CheckInclusionBlocksF = 1 bhCfg.CheckInclusionPercentileF = 60 err := bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has tip cap of 10 wei, which is above percentile=60%% (percentile tip cap: 6 wei) for blocks 3 thru 3 (checking 1 blocks)", attempts[0].TxHash)) require.ErrorIs(t, err, commonfee.ErrConnectivity) }) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, []evmtypes.Block{b0})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(3)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("passes check if both transactions are ok", func(t *testing.T) { bhCfg.CheckInclusionBlocksF = 1 bhCfg.CheckInclusionPercentileF = 90 // percentile price is 5 wei err := bhe.CheckConnectivity(attempts) require.NoError(t, err) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.CheckConnectivity(attempts)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("fails check if legacy transaction fails", func(t *testing.T) { bhCfg.CheckInclusionBlocksF = 1 bhCfg.CheckInclusionPercentileF = 60 err := bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has gas price of 10 wei, which is above percentile=60%% (percentile price: 7 wei) for blocks 3 thru 3 (checking 1 blocks)", attempts[1].TxHash)) require.ErrorIs(t, err, commonfee.ErrConnectivity) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.CheckConnectivity(attempts)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(11)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(3)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("fails check if dynamic fee transaction fails", func(t *testing.T) { gas.SetRollingBlockHistory(bhe, []evmtypes.Block{b0}) bhCfg.CheckInclusionBlocksF = 1 bhCfg.CheckInclusionPercentileF = 60 err := bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has tip cap of 10 wei, which is above percentile=60%% (percentile tip cap: 6 wei) for blocks 3 thru 3 (checking 1 blocks)", attempts[0].TxHash)) require.ErrorIs(t, err, commonfee.ErrConnectivity) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, []evmtypes.Block{b0})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.CheckConnectivity(attempts)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(5)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(8)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(13)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(21)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, blocks)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(30)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1000)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(30)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(3)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(30)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(5)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(30)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(7)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("passes check if all blocks have 90th percentile price higher than highest transaction tip cap", func(t *testing.T) { bhCfg.CheckInclusionBlocksF = 3 bhCfg.CheckInclusionPercentileF = 80 err := bhe.CheckConnectivity(attempts) require.NoError(t, err) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.CheckConnectivity(attempts)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("fails check if one or more blocks has percentile tip cap higher than any transaction tip cap, and base fee higher than the block base fee", func(t *testing.T) { bhCfg.CheckInclusionBlocksF = 3 bhCfg.CheckInclusionPercentileF = 20 err := bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has tip cap of 5 wei, which is above percentile=20%% (percentile tip cap: 4 wei) for blocks 2 thru 0 (checking 3 blocks)", attempts[2].TxHash)) require.ErrorIs(t, err, commonfee.ErrConnectivity) bhCfg.CheckInclusionBlocksF = 3 bhCfg.CheckInclusionPercentileF = 5 err = bhe.CheckConnectivity(attempts) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has tip cap of 3 wei, which is above percentile=5%% (percentile tip cap: 2 wei) for blocks 2 thru 0 (checking 3 blocks)", attempts[1].TxHash)) require.ErrorIs(t, err, commonfee.ErrConnectivity) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.CheckConnectivity(attempts)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.CheckConnectivity(attempts)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("passes check if, for at least one block, feecap < tipcap+basefee, even if percentile is not reached", func(t *testing.T) { bhCfg.CheckInclusionBlocksF = 3 bhCfg.CheckInclusionPercentileF = 5 attempts = []gas.EvmPriorAttempt{ {TxType: 0x2, TxHash: NewEvmHash(), DynamicFee: gas.DynamicFee{FeeCap: assets.NewWeiI(4), TipCap: assets.NewWeiI(7)}, BroadcastBeforeBlockNum: ptr(int64(1))}, } err := bhe.CheckConnectivity(attempts) require.NoError(t, err) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(4)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(7)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.CheckConnectivity(attempts)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1000000)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("BumpLegacyGas checks connectivity", func(t *testing.T) { cfg := gas.NewMockConfig() bhCfg.CheckInclusionBlocksF = 1 bhCfg.CheckInclusionPercentileF = 10 geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = false geCfg.BumpPercentF = 10 geCfg.BumpMinF = assets.NewWeiI(150) geCfg.PriceMaxF = maxGasPrice l1Oracle := rollupMocks.NewL1Oracle(t) bhe := newBlockHistoryEstimator(t, nil, cfg, geCfg, bhCfg, l1Oracle) b1 := evmtypes.Block{ Number: 1, Hash: utils.NewHash(), Transactions: legacyTransactionsFromGasPrices(1), } gas.SetRollingBlockHistory(bhe, []evmtypes.Block{b1}) head := testutils.Head(1) bhe.OnNewLongestChain(tests.Context(t), head) attempts := []gas.EvmPriorAttempt{ {TxType: 0x0, TxHash: NewEvmHash(), GasPrice: assets.NewWeiI(1000), BroadcastBeforeBlockNum: ptr(int64(0))}, } _, _, err := bhe.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, maxGasPrice, attempts) require.Error(t, err) assert.True(t, pkgerrors.Is(err, commonfee.ErrConnectivity)) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has gas price of 1 kwei, which is above percentile=10%% (percentile price: 1 wei) for blocks 1 thru 1 (checking 1 blocks)", attempts[0].TxHash)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(150)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, []evmtypes.Block{b1})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.OnNewLongestChain(tests.Context(t), head)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1000)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, maxGasPrice, attempts)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(42)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("BumpLegacyGas calls BumpLegacyGasPriceOnly with proper current gas price", func(t *testing.T) { cfg := gas.NewMockConfig() geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = false geCfg.BumpPercentF = 10 geCfg.BumpMinF = assets.NewWeiI(150) geCfg.PriceMaxF = maxGasPrice l1Oracle := rollupMocks.NewL1Oracle(t) bhe := newBlockHistoryEstimator(t, nil, cfg, geCfg, bhCfg, l1Oracle) t.Run("ignores nil current gas price", func(t *testing.T) { gasPrice, gasLimit, err := bhe.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, maxGasPrice, nil) require.NoError(t, err) expectedGasPrice, err := gas.BumpLegacyGasPriceOnly(geCfg, logger.TestSugared(t), nil, assets.NewWeiI(42), maxGasPrice) require.NoError(t, err) assert.Equal(t, 100000, int(gasLimit)) assert.Equal(t, expectedGasPrice, gasPrice) }) t.Run("ignores current gas price > max gas price", func(t *testing.T) { gasPrice, gasLimit, err := bhe.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, maxGasPrice, nil) require.NoError(t, err) massive := assets.NewWeiI(100000000000000) gas.SetGasPrice(bhe, massive) expectedGasPrice, err := gas.BumpLegacyGasPriceOnly(geCfg, logger.TestSugared(t), massive, assets.NewWeiI(42), maxGasPrice) require.NoError(t, err) assert.Equal(t, 100000, int(gasLimit)) assert.Equal(t, expectedGasPrice, gasPrice) }) t.Run("ignores current gas price < bumped gas price", func(t *testing.T) { gas.SetGasPrice(bhe, assets.NewWeiI(191)) gasPrice, gasLimit, err := bhe.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, maxGasPrice, nil) require.NoError(t, err) assert.Equal(t, 100000, int(gasLimit)) assert.Equal(t, assets.NewWeiI(192), gasPrice) }) t.Run("uses current gas price > bumped gas price", func(t *testing.T) { gas.SetGasPrice(bhe, assets.NewWeiI(193)) gasPrice, gasLimit, err := bhe.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, maxGasPrice, nil) require.NoError(t, err) assert.Equal(t, 100000, int(gasLimit)) assert.Equal(t, assets.NewWeiI(193), gasPrice) }) t.Run("bumped gas price > max gas price", func(t *testing.T) { gas.SetGasPrice(bhe, assets.NewWeiI(191)) gasPrice, gasLimit, err := bhe.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, assets.NewWeiI(100), nil) require.Error(t, err) assert.Nil(t, gasPrice) assert.Equal(t, 0, int(gasLimit)) assert.Contains(t, err.Error(), "bumped gas price of 192 wei would exceed configured max gas price of 100 wei (original price was 42 wei).") }) t.Run("current gas price > max gas price", func(t *testing.T) { gas.SetGasPrice(bhe, assets.NewWeiI(193)) gasPrice, gasLimit, err := bhe.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, assets.NewWeiI(100), nil) require.Error(t, err) assert.Nil(t, gasPrice) assert.Equal(t, 0, int(gasLimit)) assert.Contains(t, err.Error(), "bumped gas price of 192 wei would exceed configured max gas price of 100 wei (original price was 42 wei).") }) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(150)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("ignores nil current gas price", func(t *testing.T) { gasPrice, gasLimit, err := bhe.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, maxGasPrice, nil) require.NoError(t, err) expectedGasPrice, err := gas.BumpLegacyGasPriceOnly(geCfg, logger.TestSugared(t), nil, assets.NewWeiI(42), maxGasPrice) require.NoError(t, err) assert.Equal(t, 100000, int(gasLimit)) assert.Equal(t, expectedGasPrice, gasPrice) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, maxGasPrice, nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(42)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.BumpLegacyGasPriceOnly(geCfg, logger.TestSugared(t), nil, assets.NewWeiI(42), maxGasPrice)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TestSugared(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(42)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("ignores current gas price > max gas price", func(t *testing.T) { gasPrice, gasLimit, err := bhe.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, maxGasPrice, nil) require.NoError(t, err) massive := assets.NewWeiI(100000000000000) gas.SetGasPrice(bhe, massive) expectedGasPrice, err := gas.BumpLegacyGasPriceOnly(geCfg, logger.TestSugared(t), massive, assets.NewWeiI(42), maxGasPrice) require.NoError(t, err) assert.Equal(t, 100000, int(gasLimit)) assert.Equal(t, expectedGasPrice, gasPrice) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, maxGasPrice, nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(42)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(100000000000000)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetGasPrice(bhe, massive)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.BumpLegacyGasPriceOnly(geCfg, logger.TestSugared(t), massive, assets.NewWeiI(42), maxGasPrice)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.TestSugared(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(42)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("ignores current gas price < bumped gas price", func(t *testing.T) { gas.SetGasPrice(bhe, assets.NewWeiI(191)) gasPrice, gasLimit, err := bhe.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, maxGasPrice, nil) require.NoError(t, err) assert.Equal(t, 100000, int(gasLimit)) assert.Equal(t, assets.NewWeiI(192), gasPrice) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetGasPrice(bhe, assets.NewWeiI(191))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(191)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, maxGasPrice, nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(42)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("uses current gas price > bumped gas price", func(t *testing.T) { gas.SetGasPrice(bhe, assets.NewWeiI(193)) gasPrice, gasLimit, err := bhe.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, maxGasPrice, nil) require.NoError(t, err) assert.Equal(t, 100000, int(gasLimit)) assert.Equal(t, assets.NewWeiI(193), gasPrice) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetGasPrice(bhe, assets.NewWeiI(193))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(193)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, maxGasPrice, nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(42)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("bumped gas price > max gas price", func(t *testing.T) { gas.SetGasPrice(bhe, assets.NewWeiI(191)) gasPrice, gasLimit, err := bhe.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, assets.NewWeiI(100), nil) require.Error(t, err) assert.Nil(t, gasPrice) assert.Equal(t, 0, int(gasLimit)) assert.Contains(t, err.Error(), "bumped gas price of 192 wei would exceed configured max gas price of 100 wei (original price was 42 wei).") })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetGasPrice(bhe, assets.NewWeiI(191))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(191)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, assets.NewWeiI(100), nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(42)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("current gas price > max gas price", func(t *testing.T) { gas.SetGasPrice(bhe, assets.NewWeiI(193)) gasPrice, gasLimit, err := bhe.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, assets.NewWeiI(100), nil) require.Error(t, err) assert.Nil(t, gasPrice) assert.Equal(t, 0, int(gasLimit)) assert.Contains(t, err.Error(), "bumped gas price of 192 wei would exceed configured max gas price of 100 wei (original price was 42 wei).") })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetGasPrice(bhe, assets.NewWeiI(193))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(193)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, assets.NewWeiI(100), nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(42)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("BumpDynamicFee checks connectivity", func(t *testing.T) { cfg := gas.NewMockConfig() bhCfg := newBlockHistoryConfig() bhCfg.CheckInclusionBlocksF = 1 bhCfg.CheckInclusionPercentileF = 10 geCfg := &gas.MockGasEstimatorConfig{} geCfg.EIP1559DynamicFeesF = true geCfg.BumpPercentF = 10 geCfg.BumpMinF = assets.NewWeiI(150) geCfg.PriceMaxF = maxGasPrice l1Oracle := rollupMocks.NewL1Oracle(t) bhe := newBlockHistoryEstimator(t, nil, cfg, geCfg, bhCfg, l1Oracle) b1 := evmtypes.Block{ BaseFeePerGas: assets.NewWeiI(1), Number: 1, Hash: utils.NewHash(), Transactions: dynamicFeeTransactionsFromTipCaps(1), } gas.SetRollingBlockHistory(bhe, []evmtypes.Block{b1}) head := testutils.Head(1) bhe.OnNewLongestChain(tests.Context(t), head) originalFee := gas.DynamicFee{FeeCap: assets.NewWeiI(100), TipCap: assets.NewWeiI(25)} attempts := []gas.EvmPriorAttempt{ {TxType: 0x2, TxHash: NewEvmHash(), DynamicFee: gas.DynamicFee{TipCap: originalFee.TipCap, FeeCap: originalFee.FeeCap}, BroadcastBeforeBlockNum: ptr(int64(0))}} _, err := bhe.BumpDynamicFee(tests.Context(t), originalFee, maxGasPrice, attempts) require.Error(t, err) assert.True(t, pkgerrors.Is(err, commonfee.ErrConnectivity)) assert.Contains(t, err.Error(), fmt.Sprintf("transaction %s has tip cap of 25 wei, which is above percentile=10%% (percentile tip cap: 1 wei) for blocks 1 thru 1 (checking 1 blocks)", attempts[0].TxHash)) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(150)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewHash()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetRollingBlockHistory(bhe, []evmtypes.Block{b1})` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Head(1)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.OnNewLongestChain(tests.Context(t), head)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(25)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.BumpDynamicFee(tests.Context(t), originalFee, maxGasPrice, attempts)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewMockConfig()` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(150)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(52)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("when current tip cap is nil", func(t *testing.T) { originalFee := gas.DynamicFee{FeeCap: assets.NewWeiI(100), TipCap: assets.NewWeiI(25)} fee, err := bhe.BumpDynamicFee(tests.Context(t), originalFee, maxGasPrice, nil) require.NoError(t, err) assert.Equal(t, gas.DynamicFee{FeeCap: assets.NewWeiI(250), TipCap: assets.NewWeiI(202)}, fee) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(25)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.BumpDynamicFee(tests.Context(t), originalFee, maxGasPrice, nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("ignores current tip cap that is smaller than original fee with bump applied", func(t *testing.T) { gas.SetTipCap(bhe, assets.NewWeiI(201)) originalFee := gas.DynamicFee{FeeCap: assets.NewWeiI(100), TipCap: assets.NewWeiI(25)} fee, err := bhe.BumpDynamicFee(tests.Context(t), originalFee, maxGasPrice, nil) require.NoError(t, err) assert.Equal(t, gas.DynamicFee{FeeCap: assets.NewWeiI(250), TipCap: assets.NewWeiI(202)}, fee) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetTipCap(bhe, assets.NewWeiI(201))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(201)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(25)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.BumpDynamicFee(tests.Context(t), originalFee, maxGasPrice, nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("uses current tip cap that is larger than original fee with bump applied", func(t *testing.T) { gas.SetTipCap(bhe, assets.NewWeiI(203)) originalFee := gas.DynamicFee{FeeCap: assets.NewWeiI(100), TipCap: assets.NewWeiI(25)} fee, err := bhe.BumpDynamicFee(tests.Context(t), originalFee, maxGasPrice, nil) require.NoError(t, err) assert.Equal(t, gas.DynamicFee{FeeCap: assets.NewWeiI(250), TipCap: assets.NewWeiI(203)}, fee) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetTipCap(bhe, assets.NewWeiI(203))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(203)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(25)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.BumpDynamicFee(tests.Context(t), originalFee, maxGasPrice, nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("ignores absurdly large current tip cap", func(t *testing.T) { gas.SetTipCap(bhe, assets.NewWeiI(1000000000000000)) originalFee := gas.DynamicFee{FeeCap: assets.NewWeiI(100), TipCap: assets.NewWeiI(25)} fee, err := bhe.BumpDynamicFee(tests.Context(t), originalFee, maxGasPrice, nil) require.NoError(t, err) assert.Equal(t, gas.DynamicFee{FeeCap: assets.NewWeiI(250), TipCap: assets.NewWeiI(202)}, fee) })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetTipCap(bhe, assets.NewWeiI(1000000000000000))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(1000000000000000)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(25)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.BumpDynamicFee(tests.Context(t), originalFee, maxGasPrice, nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("bumped tip cap price > max gas price", func(t *testing.T) { gas.SetTipCap(bhe, assets.NewWeiI(203)) originalFee := gas.DynamicFee{FeeCap: assets.NewWeiI(100), TipCap: assets.NewWeiI(990000)} fee, err := bhe.BumpDynamicFee(tests.Context(t), originalFee, maxGasPrice, nil) require.Error(t, err) assert.Equal(t, gas.DynamicFee{}, fee) assert.Contains(t, err.Error(), "bumped tip cap of 1.089 mwei would exceed configured max gas price of 1 mwei (original fee: tip cap 990 kwei, fee cap 100 wei)") })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetTipCap(bhe, assets.NewWeiI(203))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(203)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(990000)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.BumpDynamicFee(tests.Context(t), originalFee, maxGasPrice, nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Run("bumped fee cap price > max gas price", func(t *testing.T) { gas.SetTipCap(bhe, assets.NewWeiI(203)) originalFee := gas.DynamicFee{FeeCap: assets.NewWeiI(990000), TipCap: assets.NewWeiI(25)} fee, err := bhe.BumpDynamicFee(tests.Context(t), originalFee, maxGasPrice, nil) require.Error(t, err) assert.Equal(t, gas.DynamicFee{}, fee) assert.Contains(t, err.Error(), "bumped fee cap of 1.089 mwei would exceed configured max gas price of 1 mwei (original fee: tip cap 25 wei, fee cap 990 kwei)") })` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.SetTipCap(bhe, assets.NewWeiI(203))` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(203)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(990000)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.NewWeiI(25)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.BumpDynamicFee(tests.Context(t), originalFee, maxGasPrice, nil)` $DIR/core/chains/evm/gas/block_history_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `t.Run("GetLegacyGas returns EvmGasPriceDefault from config", func(t *testing.T) { config := &gas.MockGasEstimatorConfig{} l1Oracle := rollupMocks.NewL1Oracle(t) f := gas.NewFixedPriceEstimator(config, nil, &blockHistoryConfig{}, logger.Test(t), l1Oracle) config.PriceDefaultF = assets.NewWeiI(42) config.PriceMaxF = maxGasPrice gasPrice, gasLimit, err := f.GetLegacyGas(tests.Context(t), nil, 100000, maxGasPrice) require.NoError(t, err) assert.Equal(t, 100000, int(gasLimit)) assert.Equal(t, assets.NewWeiI(42), gasPrice) })` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `config.PriceDefaultF = assets.NewWeiI(42)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `config.PriceMaxF = maxGasPrice` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `t.Run("GetLegacyGas returns user specified maximum gas price", func(t *testing.T) { config := &gas.MockGasEstimatorConfig{} config.PriceDefaultF = assets.NewWeiI(42) config.PriceMaxF = assets.NewWeiI(35) l1Oracle := rollupMocks.NewL1Oracle(t) f := gas.NewFixedPriceEstimator(config, nil, &blockHistoryConfig{}, logger.Test(t), l1Oracle) gasPrice, gasLimit, err := f.GetLegacyGas(tests.Context(t), nil, 100000, assets.NewWeiI(30)) require.NoError(t, err) assert.Equal(t, 100000, int(gasLimit)) assert.Equal(t, assets.NewWeiI(30), gasPrice) })` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `config.PriceDefaultF = assets.NewWeiI(42)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `config.PriceMaxF = assets.NewWeiI(35)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `t.Run("GetLegacyGas returns global maximum gas price", func(t *testing.T) { config := &gas.MockGasEstimatorConfig{} config.PriceDefaultF = assets.NewWeiI(42) config.PriceMaxF = assets.NewWeiI(20) l1Oracle := rollupMocks.NewL1Oracle(t) f := gas.NewFixedPriceEstimator(config, nil, &blockHistoryConfig{}, logger.Test(t), l1Oracle) gasPrice, gasLimit, err := f.GetLegacyGas(tests.Context(t), nil, 100000, assets.NewWeiI(30)) require.NoError(t, err) assert.Equal(t, 100000, int(gasLimit)) assert.Equal(t, assets.NewWeiI(20), gasPrice) })` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `config.PriceDefaultF = assets.NewWeiI(42)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `config.PriceMaxF = assets.NewWeiI(20)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `t.Run("BumpLegacyGas calls BumpLegacyGasPriceOnly", func(t *testing.T) { config := &gas.MockGasEstimatorConfig{} config.PriceDefaultF = assets.NewWeiI(42) config.PriceMaxF = maxGasPrice config.BumpPercentF = uint16(10) config.BumpMinF = assets.NewWeiI(150) l1Oracle := rollupMocks.NewL1Oracle(t) lggr := logger.TestSugared(t) f := gas.NewFixedPriceEstimator(config, nil, &blockHistoryConfig{}, lggr, l1Oracle) gasPrice, gasLimit, err := f.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, maxGasPrice, nil) require.NoError(t, err) expectedGasPrice, err := gas.BumpLegacyGasPriceOnly(config, lggr, nil, assets.NewWeiI(42), maxGasPrice) require.NoError(t, err) assert.Equal(t, 100000, int(gasLimit)) assert.Equal(t, expectedGasPrice, gasPrice) })` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `config.PriceDefaultF = assets.NewWeiI(42)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `config.PriceMaxF = maxGasPrice` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `config.BumpPercentF = uint16(10)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `config.BumpMinF = assets.NewWeiI(150)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `t.Run("GetDynamicFee returns defaults from config", func(t *testing.T) { config := &gas.MockGasEstimatorConfig{} config.PriceMaxF = maxGasPrice config.TipCapDefaultF = assets.NewWeiI(52) config.FeeCapDefaultF = assets.NewWeiI(100) config.BumpThresholdF = uint64(3) l1Oracle := rollupMocks.NewL1Oracle(t) lggr := logger.Test(t) f := gas.NewFixedPriceEstimator(config, nil, &blockHistoryConfig{}, lggr, l1Oracle) fee, err := f.GetDynamicFee(tests.Context(t), maxGasPrice) require.NoError(t, err) assert.Equal(t, assets.NewWeiI(52), fee.TipCap) assert.Equal(t, assets.NewWeiI(100), fee.FeeCap) // Gas bumping disabled config.BumpThresholdF = uint64(0) fee, err = f.GetDynamicFee(tests.Context(t), maxGasPrice) require.NoError(t, err) assert.Equal(t, assets.NewWeiI(52), fee.TipCap) assert.Equal(t, maxGasPrice, fee.FeeCap) // override max gas price fee, err = f.GetDynamicFee(tests.Context(t), assets.NewWeiI(10)) require.NoError(t, err) assert.Equal(t, assets.NewWeiI(52), fee.TipCap) assert.Equal(t, assets.NewWeiI(10), fee.FeeCap) })` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `config.PriceMaxF = maxGasPrice` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `config.TipCapDefaultF = assets.NewWeiI(52)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `config.FeeCapDefaultF = assets.NewWeiI(100)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `config.BumpThresholdF = uint64(3)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `config.BumpThresholdF = uint64(0)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `fee, err = f.GetDynamicFee(tests.Context(t), maxGasPrice)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `fee, err = f.GetDynamicFee(tests.Context(t), assets.NewWeiI(10))` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `config.PriceMaxF = maxGasPrice` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `config.TipCapDefaultF = assets.NewWeiI(52)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `config.BumpMinF = assets.NewWeiI(150)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `config.BumpPercentF = uint16(10)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewWeiI(1000000)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.Run("GetLegacyGas returns EvmGasPriceDefault from config", func(t *testing.T) { config := &gas.MockGasEstimatorConfig{} l1Oracle := rollupMocks.NewL1Oracle(t) f := gas.NewFixedPriceEstimator(config, nil, &blockHistoryConfig{}, logger.Test(t), l1Oracle) config.PriceDefaultF = assets.NewWeiI(42) config.PriceMaxF = maxGasPrice gasPrice, gasLimit, err := f.GetLegacyGas(tests.Context(t), nil, 100000, maxGasPrice) require.NoError(t, err) assert.Equal(t, 100000, int(gasLimit)) assert.Equal(t, assets.NewWeiI(42), gasPrice) })` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewFixedPriceEstimator(config, nil, &blockHistoryConfig{}, logger.Test(t), l1Oracle)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewWeiI(42)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.GetLegacyGas(tests.Context(t), nil, 100000, maxGasPrice)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.Run("GetLegacyGas returns user specified maximum gas price", func(t *testing.T) { config := &gas.MockGasEstimatorConfig{} config.PriceDefaultF = assets.NewWeiI(42) config.PriceMaxF = assets.NewWeiI(35) l1Oracle := rollupMocks.NewL1Oracle(t) f := gas.NewFixedPriceEstimator(config, nil, &blockHistoryConfig{}, logger.Test(t), l1Oracle) gasPrice, gasLimit, err := f.GetLegacyGas(tests.Context(t), nil, 100000, assets.NewWeiI(30)) require.NoError(t, err) assert.Equal(t, 100000, int(gasLimit)) assert.Equal(t, assets.NewWeiI(30), gasPrice) })` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewWeiI(42)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewWeiI(35)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewFixedPriceEstimator(config, nil, &blockHistoryConfig{}, logger.Test(t), l1Oracle)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.GetLegacyGas(tests.Context(t), nil, 100000, assets.NewWeiI(30))` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewWeiI(30)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.Run("GetLegacyGas returns global maximum gas price", func(t *testing.T) { config := &gas.MockGasEstimatorConfig{} config.PriceDefaultF = assets.NewWeiI(42) config.PriceMaxF = assets.NewWeiI(20) l1Oracle := rollupMocks.NewL1Oracle(t) f := gas.NewFixedPriceEstimator(config, nil, &blockHistoryConfig{}, logger.Test(t), l1Oracle) gasPrice, gasLimit, err := f.GetLegacyGas(tests.Context(t), nil, 100000, assets.NewWeiI(30)) require.NoError(t, err) assert.Equal(t, 100000, int(gasLimit)) assert.Equal(t, assets.NewWeiI(20), gasPrice) })` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewWeiI(42)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewWeiI(20)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewFixedPriceEstimator(config, nil, &blockHistoryConfig{}, logger.Test(t), l1Oracle)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.GetLegacyGas(tests.Context(t), nil, 100000, assets.NewWeiI(30))` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewWeiI(30)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.Run("BumpLegacyGas calls BumpLegacyGasPriceOnly", func(t *testing.T) { config := &gas.MockGasEstimatorConfig{} config.PriceDefaultF = assets.NewWeiI(42) config.PriceMaxF = maxGasPrice config.BumpPercentF = uint16(10) config.BumpMinF = assets.NewWeiI(150) l1Oracle := rollupMocks.NewL1Oracle(t) lggr := logger.TestSugared(t) f := gas.NewFixedPriceEstimator(config, nil, &blockHistoryConfig{}, lggr, l1Oracle) gasPrice, gasLimit, err := f.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, maxGasPrice, nil) require.NoError(t, err) expectedGasPrice, err := gas.BumpLegacyGasPriceOnly(config, lggr, nil, assets.NewWeiI(42), maxGasPrice) require.NoError(t, err) assert.Equal(t, 100000, int(gasLimit)) assert.Equal(t, expectedGasPrice, gasPrice) })` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewWeiI(42)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewWeiI(150)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.TestSugared(t)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewFixedPriceEstimator(config, nil, &blockHistoryConfig{}, lggr, l1Oracle)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), 100000, maxGasPrice, nil)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewWeiI(42)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.BumpLegacyGasPriceOnly(config, lggr, nil, assets.NewWeiI(42), maxGasPrice)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewWeiI(42)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.Run("GetDynamicFee returns defaults from config", func(t *testing.T) { config := &gas.MockGasEstimatorConfig{} config.PriceMaxF = maxGasPrice config.TipCapDefaultF = assets.NewWeiI(52) config.FeeCapDefaultF = assets.NewWeiI(100) config.BumpThresholdF = uint64(3) l1Oracle := rollupMocks.NewL1Oracle(t) lggr := logger.Test(t) f := gas.NewFixedPriceEstimator(config, nil, &blockHistoryConfig{}, lggr, l1Oracle) fee, err := f.GetDynamicFee(tests.Context(t), maxGasPrice) require.NoError(t, err) assert.Equal(t, assets.NewWeiI(52), fee.TipCap) assert.Equal(t, assets.NewWeiI(100), fee.FeeCap) // Gas bumping disabled config.BumpThresholdF = uint64(0) fee, err = f.GetDynamicFee(tests.Context(t), maxGasPrice) require.NoError(t, err) assert.Equal(t, assets.NewWeiI(52), fee.TipCap) assert.Equal(t, maxGasPrice, fee.FeeCap) // override max gas price fee, err = f.GetDynamicFee(tests.Context(t), assets.NewWeiI(10)) require.NoError(t, err) assert.Equal(t, assets.NewWeiI(52), fee.TipCap) assert.Equal(t, assets.NewWeiI(10), fee.FeeCap) })` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewWeiI(52)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewFixedPriceEstimator(config, nil, &blockHistoryConfig{}, lggr, l1Oracle)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.GetDynamicFee(tests.Context(t), maxGasPrice)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.GetDynamicFee(tests.Context(t), maxGasPrice)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.GetDynamicFee(tests.Context(t), assets.NewWeiI(10))` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewWeiI(52)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewWeiI(150)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.TestSugared(t)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewFixedPriceEstimator(config, nil, &blockHistoryConfig{}, lggr, l1Oracle)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.NewWeiI(25)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.BumpDynamicFee(tests.Context(t), originalFee, maxGasPrice, nil)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/fixed_price_estimator_test.go: `.BumpDynamicFeeOnly(config, 0, lggr, nil, nil, originalFee, maxGasPrice)` $DIR/core/chains/evm/gas/gas_test.go: `t.Run(test.name, func(t *testing.T) { cfg := &gas.MockGasEstimatorConfig{} cfg.BumpPercentF = test.bumpPercent cfg.BumpMinF = test.bumpMin cfg.PriceMaxF = test.priceMax cfg.LimitMultiplierF = test.limitMultiplierPercent actual, err := gas.BumpLegacyGasPriceOnly(cfg, logger.TestSugared(t), test.currentGasPrice, test.originalGasPrice, test.priceMax) require.NoError(t, err) if actual.Cmp(test.expectedGasPrice) != 0 { t.Fatalf("Expected %s but got %s", test.expectedGasPrice.String(), actual.String()) } })` $DIR/core/chains/evm/gas/gas_test.go: `cfg.BumpPercentF = test.bumpPercent` $DIR/core/chains/evm/gas/gas_test.go: `cfg.BumpMinF = test.bumpMin` $DIR/core/chains/evm/gas/gas_test.go: `cfg.PriceMaxF = test.priceMax` $DIR/core/chains/evm/gas/gas_test.go: `cfg.LimitMultiplierF = test.limitMultiplierPercent` $DIR/core/chains/evm/gas/gas_test.go: `cfg.BumpPercentF = uint16(50)` $DIR/core/chains/evm/gas/gas_test.go: `cfg.BumpMinF = assets.NewWeiI(5000000000)` $DIR/core/chains/evm/gas/gas_test.go: `cfg.PriceMaxF = priceMax` $DIR/core/chains/evm/gas/gas_test.go: `cfg.BumpPercentF = uint16(0)` $DIR/core/chains/evm/gas/gas_test.go: `cfg.BumpMinF = assets.NewWeiI(0)` $DIR/core/chains/evm/gas/gas_test.go: `cfg.PriceMaxF = priceMax` $DIR/core/chains/evm/gas/gas_test.go: `originalGasPrice = toWei("4e10")` $DIR/core/chains/evm/gas/gas_test.go: `_, err = gas.BumpLegacyGasPriceOnly(cfg, lggr, nil, originalGasPrice, priceMax)` $DIR/core/chains/evm/gas/gas_test.go: `t.Run(test.name, func(t *testing.T) { cfg := &gas.MockGasEstimatorConfig{} cfg.BumpPercentF = test.bumpPercent cfg.TipCapDefaultF = test.tipCapDefault cfg.BumpMinF = test.bumpMin cfg.PriceMaxF = test.priceMax cfg.LimitMultiplierF = test.limitMultiplierPercent bufferBlocks := uint16(4) actual, err := gas.BumpDynamicFeeOnly(cfg, bufferBlocks, logger.TestSugared(t), test.currentTipCap, test.currentBaseFee, test.originalFee, test.priceMax) require.NoError(t, err) if actual.TipCap.Cmp(test.expectedFee.TipCap) != 0 { t.Fatalf("TipCap not equal, expected %s but got %s", test.expectedFee.TipCap.String(), actual.TipCap.String()) } if actual.FeeCap.Cmp(test.expectedFee.FeeCap) != 0 { t.Fatalf("FeeCap not equal, expected %s but got %s", test.expectedFee.FeeCap.String(), actual.FeeCap.String()) } })` $DIR/core/chains/evm/gas/gas_test.go: `cfg.BumpPercentF = test.bumpPercent` $DIR/core/chains/evm/gas/gas_test.go: `cfg.TipCapDefaultF = test.tipCapDefault` $DIR/core/chains/evm/gas/gas_test.go: `cfg.BumpMinF = test.bumpMin` $DIR/core/chains/evm/gas/gas_test.go: `cfg.PriceMaxF = test.priceMax` $DIR/core/chains/evm/gas/gas_test.go: `cfg.LimitMultiplierF = test.limitMultiplierPercent` $DIR/core/chains/evm/gas/gas_test.go: `cfg.BumpPercentF = uint16(50)` $DIR/core/chains/evm/gas/gas_test.go: `cfg.TipCapDefaultF = assets.GWei(0)` $DIR/core/chains/evm/gas/gas_test.go: `cfg.BumpMinF = assets.NewWeiI(5000000000)` $DIR/core/chains/evm/gas/gas_test.go: `cfg.PriceMaxF = priceMax` $DIR/core/chains/evm/gas/gas_test.go: `t.Run("tip cap hits max", func(t *testing.T) { originalFee := gas.DynamicFee{TipCap: assets.GWei(30), FeeCap: assets.GWei(100)} _, err := gas.BumpDynamicFeeOnly(cfg, 0, logger.TestSugared(t), nil, nil, originalFee, priceMax) require.Error(t, err) require.Contains(t, err.Error(), "bumped tip cap of 45 gwei would exceed configured max gas price of 40 gwei (original fee: tip cap 30 gwei, fee cap 100 gwei)") })` $DIR/core/chains/evm/gas/gas_test.go: `.Run(test.name, func(t *testing.T) { cfg := &gas.MockGasEstimatorConfig{} cfg.BumpPercentF = test.bumpPercent cfg.BumpMinF = test.bumpMin cfg.PriceMaxF = test.priceMax cfg.LimitMultiplierF = test.limitMultiplierPercent actual, err := gas.BumpLegacyGasPriceOnly(cfg, logger.TestSugared(t), test.currentGasPrice, test.originalGasPrice, test.priceMax) require.NoError(t, err) if actual.Cmp(test.expectedGasPrice) != 0 { t.Fatalf("Expected %s but got %s", test.expectedGasPrice.String(), actual.String()) } })` $DIR/core/chains/evm/gas/gas_test.go: `.BumpLegacyGasPriceOnly(cfg, logger.TestSugared(t), test.currentGasPrice, test.originalGasPrice, test.priceMax)` $DIR/core/chains/evm/gas/gas_test.go: `.TestSugared(t)` $DIR/core/chains/evm/gas/gas_test.go: `.Cmp(test.expectedGasPrice)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(40)` $DIR/core/chains/evm/gas/gas_test.go: `.NewWeiI(5000000000)` $DIR/core/chains/evm/gas/gas_test.go: `.BumpLegacyGasPriceOnly(cfg, logger.TestSugared(t), nil, originalGasPrice, priceMax)` $DIR/core/chains/evm/gas/gas_test.go: `.TestSugared(t)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(40)` $DIR/core/chains/evm/gas/gas_test.go: `.TestSugared(t)` $DIR/core/chains/evm/gas/gas_test.go: `.NewWeiI(0)` $DIR/core/chains/evm/gas/gas_test.go: `.BumpLegacyGasPriceOnly(cfg, lggr, nil, originalGasPrice, priceMax)` $DIR/core/chains/evm/gas/gas_test.go: `.BumpLegacyGasPriceOnly(cfg, lggr, nil, originalGasPrice, priceMax)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(30)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(4000)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(20)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(5000)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(36)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(4800)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(30)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(100)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(20)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(39)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(130)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(30)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(400)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(20)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(38)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(480)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(30)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(400)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(40)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(48)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(480)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(48)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(30)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(400)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(40)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(49)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(480)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(50)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(30)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(400)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(40)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(50)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(480)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(10)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(20)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(5)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(50)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(60)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(70)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(20)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(100)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(30)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(400)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(20)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(5000)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(36)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(480)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(20)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(1000)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(30)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(400)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(20)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(5000)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(36)` $DIR/core/chains/evm/gas/gas_test.go: `.NewWeiI(1637806640625)` $DIR/core/chains/evm/gas/gas_test.go: `.Run(test.name, func(t *testing.T) { cfg := &gas.MockGasEstimatorConfig{} cfg.BumpPercentF = test.bumpPercent cfg.TipCapDefaultF = test.tipCapDefault cfg.BumpMinF = test.bumpMin cfg.PriceMaxF = test.priceMax cfg.LimitMultiplierF = test.limitMultiplierPercent bufferBlocks := uint16(4) actual, err := gas.BumpDynamicFeeOnly(cfg, bufferBlocks, logger.TestSugared(t), test.currentTipCap, test.currentBaseFee, test.originalFee, test.priceMax) require.NoError(t, err) if actual.TipCap.Cmp(test.expectedFee.TipCap) != 0 { t.Fatalf("TipCap not equal, expected %s but got %s", test.expectedFee.TipCap.String(), actual.TipCap.String()) } if actual.FeeCap.Cmp(test.expectedFee.FeeCap) != 0 { t.Fatalf("FeeCap not equal, expected %s but got %s", test.expectedFee.FeeCap.String(), actual.FeeCap.String()) } })` $DIR/core/chains/evm/gas/gas_test.go: `.BumpDynamicFeeOnly(cfg, bufferBlocks, logger.TestSugared(t), test.currentTipCap, test.currentBaseFee, test.originalFee, test.priceMax)` $DIR/core/chains/evm/gas/gas_test.go: `.TestSugared(t)` $DIR/core/chains/evm/gas/gas_test.go: `.TipCap.Cmp(test.expectedFee.TipCap)` $DIR/core/chains/evm/gas/gas_test.go: `.FeeCap.Cmp(test.expectedFee.FeeCap)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(40)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(0)` $DIR/core/chains/evm/gas/gas_test.go: `.NewWeiI(5000000000)` $DIR/core/chains/evm/gas/gas_test.go: `.Run("tip cap hits max", func(t *testing.T) { originalFee := gas.DynamicFee{TipCap: assets.GWei(30), FeeCap: assets.GWei(100)} _, err := gas.BumpDynamicFeeOnly(cfg, 0, logger.TestSugared(t), nil, nil, originalFee, priceMax) require.Error(t, err) require.Contains(t, err.Error(), "bumped tip cap of 45 gwei would exceed configured max gas price of 40 gwei (original fee: tip cap 30 gwei, fee cap 100 gwei)") })` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(30)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(100)` $DIR/core/chains/evm/gas/gas_test.go: `.BumpDynamicFeeOnly(cfg, 0, logger.TestSugared(t), nil, nil, originalFee, priceMax)` $DIR/core/chains/evm/gas/gas_test.go: `.TestSugared(t)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(10)` $DIR/core/chains/evm/gas/gas_test.go: `.GWei(100)` $DIR/core/chains/evm/gas/gas_test.go: `.BumpDynamicFeeOnly(cfg, 0, logger.TestSugared(t), nil, nil, originalFee, priceMax)` $DIR/core/chains/evm/gas/gas_test.go: `.TestSugared(t)` $DIR/core/chains/evm/gas/models_test.go: `est.On("GetDynamicFee", mock.Anything, mock.Anything). Return(dynamicFee, nil).Twice()` $DIR/core/chains/evm/gas/models_test.go: `est.On("GetLegacyGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything). Return(legacyFee, gasLimit, nil).Twice()` $DIR/core/chains/evm/gas/models_test.go: `est.On("BumpDynamicFee", mock.Anything, mock.Anything, mock.Anything, mock.Anything). Return(dynamicFee, nil).Once()` $DIR/core/chains/evm/gas/models_test.go: `est.On("BumpLegacyGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything). Return(legacyFee, gasLimit, nil).Once()` $DIR/core/chains/evm/gas/models_test.go: `geCfg.LimitMultiplierF = limitMultiplier` $DIR/core/chains/evm/gas/models_test.go: `t.Run("L1Oracle", func(t *testing.T) { lggr := logger.Test(t) evmEstimator := mocks.NewEvmEstimator(t) evmEstimator.On("L1Oracle").Return(nil).Once() getEst := func(logger.Logger) gas.EvmEstimator { return evmEstimator } // expect nil estimator := gas.NewEvmFeeEstimator(lggr, getEst, false, nil) l1Oracle := estimator.L1Oracle() assert.Nil(t, l1Oracle) // expect l1Oracle oracle := rollups.NewL1GasOracle(lggr, nil, chaintype.ChainOptimismBedrock) // cast oracle to L1Oracle interface estimator = gas.NewEvmFeeEstimator(lggr, getEst, false, geCfg) evmEstimator.On("L1Oracle").Return(oracle).Once() l1Oracle = estimator.L1Oracle() assert.Equal(t, oracle, l1Oracle) })` $DIR/core/chains/evm/gas/models_test.go: `evmEstimator.On("L1Oracle").Return(nil).Once()` $DIR/core/chains/evm/gas/models_test.go: `estimator = gas.NewEvmFeeEstimator(lggr, getEst, false, geCfg)` $DIR/core/chains/evm/gas/models_test.go: `evmEstimator.On("L1Oracle").Return(oracle).Once()` $DIR/core/chains/evm/gas/models_test.go: `l1Oracle = estimator.L1Oracle()` $DIR/core/chains/evm/gas/models_test.go: `t.Run("GetFee", func(t *testing.T) { lggr := logger.Test(t) // expect legacy fee data dynamicFees := false estimator := gas.NewEvmFeeEstimator(lggr, getRootEst, dynamicFees, geCfg) fee, max, err := estimator.GetFee(ctx, nil, 0, nil) require.NoError(t, err) assert.Equal(t, uint64(float32(gasLimit)*limitMultiplier), max) assert.True(t, legacyFee.Equal(fee.Legacy)) assert.Nil(t, fee.DynamicTipCap) assert.Nil(t, fee.DynamicFeeCap) // expect dynamic fee data dynamicFees = true estimator = gas.NewEvmFeeEstimator(lggr, getRootEst, dynamicFees, geCfg) fee, max, err = estimator.GetFee(ctx, nil, gasLimit, nil) require.NoError(t, err) assert.Equal(t, uint64(float32(gasLimit)*limitMultiplier), max) assert.True(t, dynamicFee.FeeCap.Equal(fee.DynamicFeeCap)) assert.True(t, dynamicFee.TipCap.Equal(fee.DynamicTipCap)) assert.Nil(t, fee.Legacy) })` $DIR/core/chains/evm/gas/models_test.go: `dynamicFees = true` $DIR/core/chains/evm/gas/models_test.go: `estimator = gas.NewEvmFeeEstimator(lggr, getRootEst, dynamicFees, geCfg)` $DIR/core/chains/evm/gas/models_test.go: `fee, max, err = estimator.GetFee(ctx, nil, gasLimit, nil)` $DIR/core/chains/evm/gas/models_test.go: `t.Run("BumpFee", func(t *testing.T) { lggr := logger.Test(t) dynamicFees := false estimator := gas.NewEvmFeeEstimator(lggr, getRootEst, dynamicFees, geCfg) // expect legacy fee data fee, max, err := estimator.BumpFee(ctx, gas.EvmFee{Legacy: assets.NewWeiI(0)}, 0, nil, nil) require.NoError(t, err) assert.Equal(t, uint64(float32(gasLimit)*limitMultiplier), max) assert.True(t, legacyFee.Equal(fee.Legacy)) assert.Nil(t, fee.DynamicTipCap) assert.Nil(t, fee.DynamicFeeCap) // expect dynamic fee data fee, max, err = estimator.BumpFee(ctx, gas.EvmFee{ DynamicFeeCap: assets.NewWeiI(0), DynamicTipCap: assets.NewWeiI(0), }, gasLimit, nil, nil) require.NoError(t, err) assert.Equal(t, uint64(float32(gasLimit)*limitMultiplier), max) assert.True(t, dynamicFee.FeeCap.Equal(fee.DynamicFeeCap)) assert.True(t, dynamicFee.TipCap.Equal(fee.DynamicTipCap)) assert.Nil(t, fee.Legacy) // expect error _, _, err = estimator.BumpFee(ctx, gas.EvmFee{}, 0, nil, nil) assert.Error(t, err) _, _, err = estimator.BumpFee(ctx, gas.EvmFee{ Legacy: legacyFee, DynamicFeeCap: dynamicFee.FeeCap, DynamicTipCap: dynamicFee.TipCap, }, 0, nil, nil) assert.Error(t, err) })` $DIR/core/chains/evm/gas/models_test.go: `fee, max, err = estimator.BumpFee(ctx, gas.EvmFee{ DynamicFeeCap: assets.NewWeiI(0), DynamicTipCap: assets.NewWeiI(0), }, gasLimit, nil, nil)` $DIR/core/chains/evm/gas/models_test.go: `_, _, err = estimator.BumpFee(ctx, gas.EvmFee{}, 0, nil, nil)` $DIR/core/chains/evm/gas/models_test.go: `_, _, err = estimator.BumpFee(ctx, gas.EvmFee{ Legacy: legacyFee, DynamicFeeCap: dynamicFee.FeeCap, DynamicTipCap: dynamicFee.TipCap, }, 0, nil, nil)` $DIR/core/chains/evm/gas/models_test.go: `t.Run("GetMaxCost", func(t *testing.T) { lggr := logger.Test(t) val := assets.NewEthValue(1) // expect legacy fee data dynamicFees := false estimator := gas.NewEvmFeeEstimator(lggr, getRootEst, dynamicFees, geCfg) total, err := estimator.GetMaxCost(ctx, val, nil, gasLimit, nil) require.NoError(t, err) fee := new(big.Int).Mul(legacyFee.ToInt(), big.NewInt(int64(gasLimit))) fee, _ = new(big.Float).Mul(new(big.Float).SetInt(fee), big.NewFloat(float64(limitMultiplier))).Int(nil) assert.Equal(t, new(big.Int).Add(val.ToInt(), fee), total) // expect dynamic fee data dynamicFees = true estimator = gas.NewEvmFeeEstimator(lggr, getRootEst, dynamicFees, geCfg) total, err = estimator.GetMaxCost(ctx, val, nil, gasLimit, nil) require.NoError(t, err) fee = new(big.Int).Mul(dynamicFee.FeeCap.ToInt(), big.NewInt(int64(gasLimit))) fee, _ = new(big.Float).Mul(new(big.Float).SetInt(fee), big.NewFloat(float64(limitMultiplier))).Int(nil) assert.Equal(t, new(big.Int).Add(val.ToInt(), fee), total) })` $DIR/core/chains/evm/gas/models_test.go: `fee, _ = new(big.Float).Mul(new(big.Float).SetInt(fee), big.NewFloat(float64(limitMultiplier))).Int(nil)` $DIR/core/chains/evm/gas/models_test.go: `dynamicFees = true` $DIR/core/chains/evm/gas/models_test.go: `estimator = gas.NewEvmFeeEstimator(lggr, getRootEst, dynamicFees, geCfg)` $DIR/core/chains/evm/gas/models_test.go: `total, err = estimator.GetMaxCost(ctx, val, nil, gasLimit, nil)` $DIR/core/chains/evm/gas/models_test.go: `fee = new(big.Int).Mul(dynamicFee.FeeCap.ToInt(), big.NewInt(int64(gasLimit)))` $DIR/core/chains/evm/gas/models_test.go: `fee, _ = new(big.Float).Mul(new(big.Float).SetInt(fee), big.NewFloat(float64(limitMultiplier))).Int(nil)` $DIR/core/chains/evm/gas/models_test.go: `t.Run("Name", func(t *testing.T) { lggr := logger.Test(t) evmEstimator := mocks.NewEvmEstimator(t) evmEstimator.On("Name").Return(mockEvmEstimatorName, nil).Once() estimator := gas.NewEvmFeeEstimator(lggr, func(logger.Logger) gas.EvmEstimator { return evmEstimator }, false, geCfg) require.Equal(t, mockEstimatorName, estimator.Name()) require.Equal(t, mockEvmEstimatorName, evmEstimator.Name()) })` $DIR/core/chains/evm/gas/models_test.go: `evmEstimator.On("Name").Return(mockEvmEstimatorName, nil).Once()` $DIR/core/chains/evm/gas/models_test.go: `t.Run("Start and stop calls both EVM estimator and L1Oracle", func(t *testing.T) { lggr := logger.Test(t) oracle := rollupMocks.NewL1Oracle(t) evmEstimator := mocks.NewEvmEstimator(t) evmEstimator.On("Start", mock.Anything).Return(nil).Twice() evmEstimator.On("Close").Return(nil).Twice() oracle.On("Start", mock.Anything).Return(nil).Once() oracle.On("Close").Return(nil).Once() getEst := func(logger.Logger) gas.EvmEstimator { return evmEstimator } evmEstimator.On("L1Oracle", mock.Anything).Return(nil).Twice() estimator := gas.NewEvmFeeEstimator(lggr, getEst, false, geCfg) err := estimator.Start(ctx) require.NoError(t, err) err = estimator.Close() require.NoError(t, err) evmEstimator.On("L1Oracle", mock.Anything).Return(oracle).Twice() estimator = gas.NewEvmFeeEstimator(lggr, getEst, false, geCfg) err = estimator.Start(ctx) require.NoError(t, err) err = estimator.Close() require.NoError(t, err) })` $DIR/core/chains/evm/gas/models_test.go: `evmEstimator.On("Start", mock.Anything).Return(nil).Twice()` $DIR/core/chains/evm/gas/models_test.go: `evmEstimator.On("Close").Return(nil).Twice()` $DIR/core/chains/evm/gas/models_test.go: `oracle.On("Start", mock.Anything).Return(nil).Once()` $DIR/core/chains/evm/gas/models_test.go: `oracle.On("Close").Return(nil).Once()` $DIR/core/chains/evm/gas/models_test.go: `evmEstimator.On("L1Oracle", mock.Anything).Return(nil).Twice()` $DIR/core/chains/evm/gas/models_test.go: `err = estimator.Close()` $DIR/core/chains/evm/gas/models_test.go: `evmEstimator.On("L1Oracle", mock.Anything).Return(oracle).Twice()` $DIR/core/chains/evm/gas/models_test.go: `estimator = gas.NewEvmFeeEstimator(lggr, getEst, false, geCfg)` $DIR/core/chains/evm/gas/models_test.go: `err = estimator.Start(ctx)` $DIR/core/chains/evm/gas/models_test.go: `err = estimator.Close()` $DIR/core/chains/evm/gas/models_test.go: `t.Run("Read calls both EVM estimator and L1Oracle", func(t *testing.T) { lggr := logger.Test(t) evmEstimator := mocks.NewEvmEstimator(t) oracle := rollupMocks.NewL1Oracle(t) evmEstimator.On("L1Oracle").Return(oracle).Twice() evmEstimator.On("Ready").Return(nil).Twice() oracle.On("Ready").Return(nil).Twice() getEst := func(logger.Logger) gas.EvmEstimator { return evmEstimator } estimator := gas.NewEvmFeeEstimator(lggr, getEst, false, geCfg) err := estimator.Ready() require.NoError(t, err) estimator = gas.NewEvmFeeEstimator(lggr, getEst, false, geCfg) err = estimator.Ready() require.NoError(t, err) })` $DIR/core/chains/evm/gas/models_test.go: `evmEstimator.On("L1Oracle").Return(oracle).Twice()` $DIR/core/chains/evm/gas/models_test.go: `evmEstimator.On("Ready").Return(nil).Twice()` $DIR/core/chains/evm/gas/models_test.go: `oracle.On("Ready").Return(nil).Twice()` $DIR/core/chains/evm/gas/models_test.go: `estimator = gas.NewEvmFeeEstimator(lggr, getEst, false, geCfg)` $DIR/core/chains/evm/gas/models_test.go: `err = estimator.Ready()` $DIR/core/chains/evm/gas/models_test.go: `evmEstimator.On("L1Oracle").Return(nil).Once()` $DIR/core/chains/evm/gas/models_test.go: `evmEstimator.On("HealthReport").Return(map[string]error{evmEstimatorKey: evmEstimatorError}).Twice()` $DIR/core/chains/evm/gas/models_test.go: `oracle.On("HealthReport").Return(map[string]error{oracleKey: oracleError}).Once()` $DIR/core/chains/evm/gas/models_test.go: `evmEstimator.On("L1Oracle").Return(oracle).Once()` $DIR/core/chains/evm/gas/models_test.go: `estimator = gas.NewEvmFeeEstimator(lggr, getEst, false, geCfg)` $DIR/core/chains/evm/gas/models_test.go: `report = estimator.HealthReport()` $DIR/core/chains/evm/gas/models_test.go: `.Context(t)` $DIR/core/chains/evm/gas/models_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/gas/models_test.go: `.NewWeiI(20)` $DIR/core/chains/evm/gas/models_test.go: `.NewWeiI(1)` $DIR/core/chains/evm/gas/models_test.go: `.NewEvmEstimator(t)` $DIR/core/chains/evm/gas/models_test.go: `.On("GetDynamicFee", mock.Anything, mock.Anything)` $DIR/core/chains/evm/gas/models_test.go: `. Return(dynamicFee, nil)` $DIR/core/chains/evm/gas/models_test.go: `.Twice()` $DIR/core/chains/evm/gas/models_test.go: `.On("GetLegacyGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/gas/models_test.go: `. Return(legacyFee, gasLimit, nil)` $DIR/core/chains/evm/gas/models_test.go: `.Twice()` $DIR/core/chains/evm/gas/models_test.go: `.On("BumpDynamicFee", mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/gas/models_test.go: `. Return(dynamicFee, nil)` $DIR/core/chains/evm/gas/models_test.go: `.Once()` $DIR/core/chains/evm/gas/models_test.go: `.On("BumpLegacyGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/gas/models_test.go: `. Return(legacyFee, gasLimit, nil)` $DIR/core/chains/evm/gas/models_test.go: `.Once()` $DIR/core/chains/evm/gas/models_test.go: `.NewMockGasConfig()` $DIR/core/chains/evm/gas/models_test.go: `.Run("L1Oracle", func(t *testing.T) { lggr := logger.Test(t) evmEstimator := mocks.NewEvmEstimator(t) evmEstimator.On("L1Oracle").Return(nil).Once() getEst := func(logger.Logger) gas.EvmEstimator { return evmEstimator } // expect nil estimator := gas.NewEvmFeeEstimator(lggr, getEst, false, nil) l1Oracle := estimator.L1Oracle() assert.Nil(t, l1Oracle) // expect l1Oracle oracle := rollups.NewL1GasOracle(lggr, nil, chaintype.ChainOptimismBedrock) // cast oracle to L1Oracle interface estimator = gas.NewEvmFeeEstimator(lggr, getEst, false, geCfg) evmEstimator.On("L1Oracle").Return(oracle).Once() l1Oracle = estimator.L1Oracle() assert.Equal(t, oracle, l1Oracle) })` $DIR/core/chains/evm/gas/models_test.go: `.Test(t)` $DIR/core/chains/evm/gas/models_test.go: `.NewEvmEstimator(t)` $DIR/core/chains/evm/gas/models_test.go: `.On("L1Oracle")` $DIR/core/chains/evm/gas/models_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/models_test.go: `.Once()` $DIR/core/chains/evm/gas/models_test.go: `.NewEvmFeeEstimator(lggr, getEst, false, nil)` $DIR/core/chains/evm/gas/models_test.go: `.L1Oracle()` $DIR/core/chains/evm/gas/models_test.go: `.NewL1GasOracle(lggr, nil, chaintype.ChainOptimismBedrock)` $DIR/core/chains/evm/gas/models_test.go: `.NewEvmFeeEstimator(lggr, getEst, false, geCfg)` $DIR/core/chains/evm/gas/models_test.go: `.On("L1Oracle")` $DIR/core/chains/evm/gas/models_test.go: `.Return(oracle)` $DIR/core/chains/evm/gas/models_test.go: `.Once()` $DIR/core/chains/evm/gas/models_test.go: `.L1Oracle()` $DIR/core/chains/evm/gas/models_test.go: `.Run("GetFee", func(t *testing.T) { lggr := logger.Test(t) // expect legacy fee data dynamicFees := false estimator := gas.NewEvmFeeEstimator(lggr, getRootEst, dynamicFees, geCfg) fee, max, err := estimator.GetFee(ctx, nil, 0, nil) require.NoError(t, err) assert.Equal(t, uint64(float32(gasLimit)*limitMultiplier), max) assert.True(t, legacyFee.Equal(fee.Legacy)) assert.Nil(t, fee.DynamicTipCap) assert.Nil(t, fee.DynamicFeeCap) // expect dynamic fee data dynamicFees = true estimator = gas.NewEvmFeeEstimator(lggr, getRootEst, dynamicFees, geCfg) fee, max, err = estimator.GetFee(ctx, nil, gasLimit, nil) require.NoError(t, err) assert.Equal(t, uint64(float32(gasLimit)*limitMultiplier), max) assert.True(t, dynamicFee.FeeCap.Equal(fee.DynamicFeeCap)) assert.True(t, dynamicFee.TipCap.Equal(fee.DynamicTipCap)) assert.Nil(t, fee.Legacy) })` $DIR/core/chains/evm/gas/models_test.go: `.Test(t)` $DIR/core/chains/evm/gas/models_test.go: `.NewEvmFeeEstimator(lggr, getRootEst, dynamicFees, geCfg)` $DIR/core/chains/evm/gas/models_test.go: `.GetFee(ctx, nil, 0, nil)` $DIR/core/chains/evm/gas/models_test.go: `.NewEvmFeeEstimator(lggr, getRootEst, dynamicFees, geCfg)` $DIR/core/chains/evm/gas/models_test.go: `.GetFee(ctx, nil, gasLimit, nil)` $DIR/core/chains/evm/gas/models_test.go: `.Run("BumpFee", func(t *testing.T) { lggr := logger.Test(t) dynamicFees := false estimator := gas.NewEvmFeeEstimator(lggr, getRootEst, dynamicFees, geCfg) // expect legacy fee data fee, max, err := estimator.BumpFee(ctx, gas.EvmFee{Legacy: assets.NewWeiI(0)}, 0, nil, nil) require.NoError(t, err) assert.Equal(t, uint64(float32(gasLimit)*limitMultiplier), max) assert.True(t, legacyFee.Equal(fee.Legacy)) assert.Nil(t, fee.DynamicTipCap) assert.Nil(t, fee.DynamicFeeCap) // expect dynamic fee data fee, max, err = estimator.BumpFee(ctx, gas.EvmFee{ DynamicFeeCap: assets.NewWeiI(0), DynamicTipCap: assets.NewWeiI(0), }, gasLimit, nil, nil) require.NoError(t, err) assert.Equal(t, uint64(float32(gasLimit)*limitMultiplier), max) assert.True(t, dynamicFee.FeeCap.Equal(fee.DynamicFeeCap)) assert.True(t, dynamicFee.TipCap.Equal(fee.DynamicTipCap)) assert.Nil(t, fee.Legacy) // expect error _, _, err = estimator.BumpFee(ctx, gas.EvmFee{}, 0, nil, nil) assert.Error(t, err) _, _, err = estimator.BumpFee(ctx, gas.EvmFee{ Legacy: legacyFee, DynamicFeeCap: dynamicFee.FeeCap, DynamicTipCap: dynamicFee.TipCap, }, 0, nil, nil) assert.Error(t, err) })` $DIR/core/chains/evm/gas/models_test.go: `.Test(t)` $DIR/core/chains/evm/gas/models_test.go: `.NewEvmFeeEstimator(lggr, getRootEst, dynamicFees, geCfg)` $DIR/core/chains/evm/gas/models_test.go: `.BumpFee(ctx, gas.EvmFee{Legacy: assets.NewWeiI(0)}, 0, nil, nil)` $DIR/core/chains/evm/gas/models_test.go: `.NewWeiI(0)` $DIR/core/chains/evm/gas/models_test.go: `.BumpFee(ctx, gas.EvmFee{ DynamicFeeCap: assets.NewWeiI(0), DynamicTipCap: assets.NewWeiI(0), }, gasLimit, nil, nil)` $DIR/core/chains/evm/gas/models_test.go: `.NewWeiI(0)` $DIR/core/chains/evm/gas/models_test.go: `.NewWeiI(0)` $DIR/core/chains/evm/gas/models_test.go: `.BumpFee(ctx, gas.EvmFee{}, 0, nil, nil)` $DIR/core/chains/evm/gas/models_test.go: `.BumpFee(ctx, gas.EvmFee{ Legacy: legacyFee, DynamicFeeCap: dynamicFee.FeeCap, DynamicTipCap: dynamicFee.TipCap, }, 0, nil, nil)` $DIR/core/chains/evm/gas/models_test.go: `.Run("GetMaxCost", func(t *testing.T) { lggr := logger.Test(t) val := assets.NewEthValue(1) // expect legacy fee data dynamicFees := false estimator := gas.NewEvmFeeEstimator(lggr, getRootEst, dynamicFees, geCfg) total, err := estimator.GetMaxCost(ctx, val, nil, gasLimit, nil) require.NoError(t, err) fee := new(big.Int).Mul(legacyFee.ToInt(), big.NewInt(int64(gasLimit))) fee, _ = new(big.Float).Mul(new(big.Float).SetInt(fee), big.NewFloat(float64(limitMultiplier))).Int(nil) assert.Equal(t, new(big.Int).Add(val.ToInt(), fee), total) // expect dynamic fee data dynamicFees = true estimator = gas.NewEvmFeeEstimator(lggr, getRootEst, dynamicFees, geCfg) total, err = estimator.GetMaxCost(ctx, val, nil, gasLimit, nil) require.NoError(t, err) fee = new(big.Int).Mul(dynamicFee.FeeCap.ToInt(), big.NewInt(int64(gasLimit))) fee, _ = new(big.Float).Mul(new(big.Float).SetInt(fee), big.NewFloat(float64(limitMultiplier))).Int(nil) assert.Equal(t, new(big.Int).Add(val.ToInt(), fee), total) })` $DIR/core/chains/evm/gas/models_test.go: `.Test(t)` $DIR/core/chains/evm/gas/models_test.go: `.NewEthValue(1)` $DIR/core/chains/evm/gas/models_test.go: `.NewEvmFeeEstimator(lggr, getRootEst, dynamicFees, geCfg)` $DIR/core/chains/evm/gas/models_test.go: `.GetMaxCost(ctx, val, nil, gasLimit, nil)` $DIR/core/chains/evm/gas/models_test.go: `.Mul(legacyFee.ToInt(), big.NewInt(int64(gasLimit)))` $DIR/core/chains/evm/gas/models_test.go: `.ToInt()` $DIR/core/chains/evm/gas/models_test.go: `.NewInt(int64(gasLimit))` $DIR/core/chains/evm/gas/models_test.go: `.Mul(new(big.Float).SetInt(fee), big.NewFloat(float64(limitMultiplier)))` $DIR/core/chains/evm/gas/models_test.go: `.SetInt(fee)` $DIR/core/chains/evm/gas/models_test.go: `.NewFloat(float64(limitMultiplier))` $DIR/core/chains/evm/gas/models_test.go: `.Int(nil)` $DIR/core/chains/evm/gas/models_test.go: `.NewEvmFeeEstimator(lggr, getRootEst, dynamicFees, geCfg)` $DIR/core/chains/evm/gas/models_test.go: `.GetMaxCost(ctx, val, nil, gasLimit, nil)` $DIR/core/chains/evm/gas/models_test.go: `.Mul(dynamicFee.FeeCap.ToInt(), big.NewInt(int64(gasLimit)))` $DIR/core/chains/evm/gas/models_test.go: `.FeeCap.ToInt()` $DIR/core/chains/evm/gas/models_test.go: `.NewInt(int64(gasLimit))` $DIR/core/chains/evm/gas/models_test.go: `.Mul(new(big.Float).SetInt(fee), big.NewFloat(float64(limitMultiplier)))` $DIR/core/chains/evm/gas/models_test.go: `.SetInt(fee)` $DIR/core/chains/evm/gas/models_test.go: `.NewFloat(float64(limitMultiplier))` $DIR/core/chains/evm/gas/models_test.go: `.Int(nil)` $DIR/core/chains/evm/gas/models_test.go: `.Run("Name", func(t *testing.T) { lggr := logger.Test(t) evmEstimator := mocks.NewEvmEstimator(t) evmEstimator.On("Name").Return(mockEvmEstimatorName, nil).Once() estimator := gas.NewEvmFeeEstimator(lggr, func(logger.Logger) gas.EvmEstimator { return evmEstimator }, false, geCfg) require.Equal(t, mockEstimatorName, estimator.Name()) require.Equal(t, mockEvmEstimatorName, evmEstimator.Name()) })` $DIR/core/chains/evm/gas/models_test.go: `.Test(t)` $DIR/core/chains/evm/gas/models_test.go: `.NewEvmEstimator(t)` $DIR/core/chains/evm/gas/models_test.go: `.On("Name")` $DIR/core/chains/evm/gas/models_test.go: `.Return(mockEvmEstimatorName, nil)` $DIR/core/chains/evm/gas/models_test.go: `.Once()` $DIR/core/chains/evm/gas/models_test.go: `.NewEvmFeeEstimator(lggr, func(logger.Logger) gas.EvmEstimator { return evmEstimator }, false, geCfg)` $DIR/core/chains/evm/gas/models_test.go: `.Run("Start and stop calls both EVM estimator and L1Oracle", func(t *testing.T) { lggr := logger.Test(t) oracle := rollupMocks.NewL1Oracle(t) evmEstimator := mocks.NewEvmEstimator(t) evmEstimator.On("Start", mock.Anything).Return(nil).Twice() evmEstimator.On("Close").Return(nil).Twice() oracle.On("Start", mock.Anything).Return(nil).Once() oracle.On("Close").Return(nil).Once() getEst := func(logger.Logger) gas.EvmEstimator { return evmEstimator } evmEstimator.On("L1Oracle", mock.Anything).Return(nil).Twice() estimator := gas.NewEvmFeeEstimator(lggr, getEst, false, geCfg) err := estimator.Start(ctx) require.NoError(t, err) err = estimator.Close() require.NoError(t, err) evmEstimator.On("L1Oracle", mock.Anything).Return(oracle).Twice() estimator = gas.NewEvmFeeEstimator(lggr, getEst, false, geCfg) err = estimator.Start(ctx) require.NoError(t, err) err = estimator.Close() require.NoError(t, err) })` $DIR/core/chains/evm/gas/models_test.go: `.Test(t)` $DIR/core/chains/evm/gas/models_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/models_test.go: `.NewEvmEstimator(t)` $DIR/core/chains/evm/gas/models_test.go: `.On("Start", mock.Anything)` $DIR/core/chains/evm/gas/models_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/models_test.go: `.Twice()` $DIR/core/chains/evm/gas/models_test.go: `.On("Close")` $DIR/core/chains/evm/gas/models_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/models_test.go: `.Twice()` $DIR/core/chains/evm/gas/models_test.go: `.On("Start", mock.Anything)` $DIR/core/chains/evm/gas/models_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/models_test.go: `.Once()` $DIR/core/chains/evm/gas/models_test.go: `.On("Close")` $DIR/core/chains/evm/gas/models_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/models_test.go: `.Once()` $DIR/core/chains/evm/gas/models_test.go: `.On("L1Oracle", mock.Anything)` $DIR/core/chains/evm/gas/models_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/models_test.go: `.Twice()` $DIR/core/chains/evm/gas/models_test.go: `.NewEvmFeeEstimator(lggr, getEst, false, geCfg)` $DIR/core/chains/evm/gas/models_test.go: `.Start(ctx)` $DIR/core/chains/evm/gas/models_test.go: `.On("L1Oracle", mock.Anything)` $DIR/core/chains/evm/gas/models_test.go: `.Return(oracle)` $DIR/core/chains/evm/gas/models_test.go: `.Twice()` $DIR/core/chains/evm/gas/models_test.go: `.NewEvmFeeEstimator(lggr, getEst, false, geCfg)` $DIR/core/chains/evm/gas/models_test.go: `.Start(ctx)` $DIR/core/chains/evm/gas/models_test.go: `.Run("Read calls both EVM estimator and L1Oracle", func(t *testing.T) { lggr := logger.Test(t) evmEstimator := mocks.NewEvmEstimator(t) oracle := rollupMocks.NewL1Oracle(t) evmEstimator.On("L1Oracle").Return(oracle).Twice() evmEstimator.On("Ready").Return(nil).Twice() oracle.On("Ready").Return(nil).Twice() getEst := func(logger.Logger) gas.EvmEstimator { return evmEstimator } estimator := gas.NewEvmFeeEstimator(lggr, getEst, false, geCfg) err := estimator.Ready() require.NoError(t, err) estimator = gas.NewEvmFeeEstimator(lggr, getEst, false, geCfg) err = estimator.Ready() require.NoError(t, err) })` $DIR/core/chains/evm/gas/models_test.go: `.Test(t)` $DIR/core/chains/evm/gas/models_test.go: `.NewEvmEstimator(t)` $DIR/core/chains/evm/gas/models_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/models_test.go: `.On("L1Oracle")` $DIR/core/chains/evm/gas/models_test.go: `.Return(oracle)` $DIR/core/chains/evm/gas/models_test.go: `.Twice()` $DIR/core/chains/evm/gas/models_test.go: `.On("Ready")` $DIR/core/chains/evm/gas/models_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/models_test.go: `.Twice()` $DIR/core/chains/evm/gas/models_test.go: `.On("Ready")` $DIR/core/chains/evm/gas/models_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/models_test.go: `.Twice()` $DIR/core/chains/evm/gas/models_test.go: `.NewEvmFeeEstimator(lggr, getEst, false, geCfg)` $DIR/core/chains/evm/gas/models_test.go: `.Ready()` $DIR/core/chains/evm/gas/models_test.go: `.NewEvmFeeEstimator(lggr, getEst, false, geCfg)` $DIR/core/chains/evm/gas/models_test.go: `.Ready()` $DIR/core/chains/evm/gas/models_test.go: `.Test(t)` $DIR/core/chains/evm/gas/models_test.go: `.NewEvmEstimator(t)` $DIR/core/chains/evm/gas/models_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/models_test.go: `.New("evm error")` $DIR/core/chains/evm/gas/models_test.go: `.New("oracle error")` $DIR/core/chains/evm/gas/models_test.go: `.On("L1Oracle")` $DIR/core/chains/evm/gas/models_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/models_test.go: `.Once()` $DIR/core/chains/evm/gas/models_test.go: `.On("HealthReport")` $DIR/core/chains/evm/gas/models_test.go: `.Return(map[string]error{evmEstimatorKey: evmEstimatorError})` $DIR/core/chains/evm/gas/models_test.go: `.Twice()` $DIR/core/chains/evm/gas/models_test.go: `.On("HealthReport")` $DIR/core/chains/evm/gas/models_test.go: `.Return(map[string]error{oracleKey: oracleError})` $DIR/core/chains/evm/gas/models_test.go: `.Once()` $DIR/core/chains/evm/gas/models_test.go: `.NewEvmFeeEstimator(lggr, getEst, false, geCfg)` $DIR/core/chains/evm/gas/models_test.go: `.HealthReport()` $DIR/core/chains/evm/gas/models_test.go: `.On("L1Oracle")` $DIR/core/chains/evm/gas/models_test.go: `.Return(oracle)` $DIR/core/chains/evm/gas/models_test.go: `.Once()` $DIR/core/chains/evm/gas/models_test.go: `.NewEvmFeeEstimator(lggr, getEst, false, geCfg)` $DIR/core/chains/evm/gas/models_test.go: `.HealthReport()` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `t.Run("Calling GasPrice on unstarted L1Oracle returns error", func(t *testing.T) { ethClient := mocks.NewL1OracleClient(t) oracle := NewL1GasOracle(logger.Test(t), ethClient, chaintype.ChainOptimismBedrock) _, err := oracle.GasPrice(tests.Context(t)) assert.EqualError(t, err, "L1GasOracle is not started; cannot estimate gas") })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `t.Run("Calling GasPrice on started Arbitrum L1Oracle returns Arbitrum l1GasPrice", func(t *testing.T) { l1BaseFee := big.NewInt(100) l1GasPriceMethodAbi, err := abi.JSON(strings.NewReader(GetL1BaseFeeEstimateAbiString)) require.NoError(t, err) ethClient := mocks.NewL1OracleClient(t) ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = l1GasPriceMethodAbi.Pack("getL1BaseFeeEstimate") require.NoError(t, err) require.Equal(t, payload, callMsg.Data) assert.Nil(t, blockNumber) }).Return(common.BigToHash(l1BaseFee).Bytes(), nil) oracle := NewL1GasOracle(logger.Test(t), ethClient, chaintype.ChainArbitrum) servicetest.RunHealthy(t, oracle) gasPrice, err := oracle.GasPrice(tests.Context(t)) require.NoError(t, err) assert.Equal(t, assets.NewWei(l1BaseFee), gasPrice) })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = l1GasPriceMethodAbi.Pack("getL1BaseFeeEstimate") require.NoError(t, err) require.Equal(t, payload, callMsg.Data) assert.Nil(t, blockNumber) }).Return(common.BigToHash(l1BaseFee).Bytes(), nil)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `payload, err = l1GasPriceMethodAbi.Pack("getL1BaseFeeEstimate")` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `servicetest.RunHealthy(t, oracle)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `t.Run("Calling GasPrice on started Kroma L1Oracle returns Kroma l1GasPrice", func(t *testing.T) { l1BaseFee := big.NewInt(100) l1GasPriceMethodAbi, err := abi.JSON(strings.NewReader(L1BaseFeeAbiString)) require.NoError(t, err) isEcotoneAbiString, err := abi.JSON(strings.NewReader(OPIsEcotoneAbiString)) require.NoError(t, err) ethClient := mocks.NewL1OracleClient(t) ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = isEcotoneAbiString.Pack("isEcotone") require.NoError(t, err) require.Equal(t, payload, callMsg.Data) assert.Nil(t, blockNumber) }).Return(nil, errors.New("not ecotone")).Once() ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = l1GasPriceMethodAbi.Pack("l1BaseFee") require.NoError(t, err) require.Equal(t, payload, callMsg.Data) assert.Nil(t, blockNumber) }).Return(common.BigToHash(l1BaseFee).Bytes(), nil) oracle := newOpStackL1GasOracle(logger.Test(t), ethClient, chaintype.ChainKroma, KromaGasOracleAddress) servicetest.RunHealthy(t, oracle) gasPrice, err := oracle.GasPrice(tests.Context(t)) require.NoError(t, err) assert.Equal(t, assets.NewWei(l1BaseFee), gasPrice) })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = isEcotoneAbiString.Pack("isEcotone") require.NoError(t, err) require.Equal(t, payload, callMsg.Data) assert.Nil(t, blockNumber) }).Return(nil, errors.New("not ecotone")).Once()` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `payload, err = isEcotoneAbiString.Pack("isEcotone")` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = l1GasPriceMethodAbi.Pack("l1BaseFee") require.NoError(t, err) require.Equal(t, payload, callMsg.Data) assert.Nil(t, blockNumber) }).Return(common.BigToHash(l1BaseFee).Bytes(), nil)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `payload, err = l1GasPriceMethodAbi.Pack("l1BaseFee")` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `servicetest.RunHealthy(t, oracle)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `t.Run("Calling GasPrice on started OPStack L1Oracle returns OPStack l1GasPrice", func(t *testing.T) { l1BaseFee := big.NewInt(100) l1GasPriceMethodAbi, err := abi.JSON(strings.NewReader(L1BaseFeeAbiString)) require.NoError(t, err) isEcotoneAbiString, err := abi.JSON(strings.NewReader(OPIsEcotoneAbiString)) require.NoError(t, err) ethClient := mocks.NewL1OracleClient(t) ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = isEcotoneAbiString.Pack("isEcotone") require.NoError(t, err) require.Equal(t, payload, callMsg.Data) assert.Nil(t, blockNumber) }).Return(nil, errors.New("not ecotone")).Once() ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = l1GasPriceMethodAbi.Pack("l1BaseFee") require.NoError(t, err) require.Equal(t, payload, callMsg.Data) assert.Nil(t, blockNumber) }).Return(common.BigToHash(l1BaseFee).Bytes(), nil) oracle := newOpStackL1GasOracle(logger.Test(t), ethClient, chaintype.ChainOptimismBedrock, OPGasOracleAddress) servicetest.RunHealthy(t, oracle) gasPrice, err := oracle.GasPrice(tests.Context(t)) require.NoError(t, err) assert.Equal(t, assets.NewWei(l1BaseFee), gasPrice) })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = isEcotoneAbiString.Pack("isEcotone") require.NoError(t, err) require.Equal(t, payload, callMsg.Data) assert.Nil(t, blockNumber) }).Return(nil, errors.New("not ecotone")).Once()` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `payload, err = isEcotoneAbiString.Pack("isEcotone")` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = l1GasPriceMethodAbi.Pack("l1BaseFee") require.NoError(t, err) require.Equal(t, payload, callMsg.Data) assert.Nil(t, blockNumber) }).Return(common.BigToHash(l1BaseFee).Bytes(), nil)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `payload, err = l1GasPriceMethodAbi.Pack("l1BaseFee")` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `servicetest.RunHealthy(t, oracle)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = isEcotoneAbiString.Pack("isEcotone") require.NoError(t, err) require.Equal(t, payload, callMsg.Data) assert.Nil(t, blockNumber) }).Return(nil, errors.New("not ecotone")).Once()` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `payload, err = isEcotoneAbiString.Pack("isEcotone")` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = l1GasPriceMethodAbi.Pack("l1BaseFee") require.NoError(t, err) require.Equal(t, payload, callMsg.Data) assert.Nil(t, blockNumber) }).Return(common.BigToHash(l1BaseFee).Bytes(), nil)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `payload, err = l1GasPriceMethodAbi.Pack("l1BaseFee")` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `t.Cleanup(func() { assert.NoError(t, oracle.Close()) })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `t.Run("Calling GetGasCost on started Arbitrum L1Oracle returns Arbitrum getL1Fee", func(t *testing.T) { l1GasCost := big.NewInt(100) baseFee := utils.Uint256ToBytes32(big.NewInt(1000)) l1BaseFeeEstimate := utils.Uint256ToBytes32(big.NewInt(500)) blockNum := big.NewInt(1000) toAddress := utils.RandomAddress() callData := []byte{1, 2, 3, 4, 5, 6, 7} l1GasCostMethodAbi, err := abi.JSON(strings.NewReader(GasEstimateL1ComponentAbiString)) require.NoError(t, err) tx := types.NewTx(&types.LegacyTx{ Nonce: 42, To: &toAddress, Data: callData, }) result := common.LeftPadBytes(l1GasCost.Bytes(), 8) result = append(result, baseFee...) result = append(result, l1BaseFeeEstimate...) ethClient := mocks.NewL1OracleClient(t) ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = l1GasCostMethodAbi.Pack("gasEstimateL1Component", toAddress, false, callData) require.NoError(t, err) require.Equal(t, payload, callMsg.Data) require.Equal(t, blockNum, blockNumber) }).Return(result, nil) oracle := NewL1GasOracle(logger.Test(t), ethClient, chaintype.ChainArbitrum) gasCost, err := oracle.GetGasCost(tests.Context(t), tx, blockNum) require.NoError(t, err) require.Equal(t, assets.NewWei(l1GasCost), gasCost) })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `result = append(result, baseFee...)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `result = append(result, l1BaseFeeEstimate...)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = l1GasCostMethodAbi.Pack("gasEstimateL1Component", toAddress, false, callData) require.NoError(t, err) require.Equal(t, payload, callMsg.Data) require.Equal(t, blockNum, blockNumber) }).Return(result, nil)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `payload, err = l1GasCostMethodAbi.Pack("gasEstimateL1Component", toAddress, false, callData)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `t.Run("Calling GetGasCost on started Kroma L1Oracle returns error", func(t *testing.T) { blockNum := big.NewInt(1000) tx := types.NewTx(&types.LegacyTx{}) ethClient := mocks.NewL1OracleClient(t) oracle := NewL1GasOracle(logger.Test(t), ethClient, chaintype.ChainKroma) _, err := oracle.GetGasCost(tests.Context(t), tx, blockNum) require.Error(t, err, "L1 gas cost not supported for this chain: kroma") })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `t.Run("Calling GetGasCost on started OPStack L1Oracle returns OPStack getL1Fee", func(t *testing.T) { l1GasCost := big.NewInt(100) blockNum := big.NewInt(1000) toAddress := utils.RandomAddress() callData := []byte{1, 2, 3} l1GasCostMethodAbi, err := abi.JSON(strings.NewReader(GetL1FeeAbiString)) require.NoError(t, err) tx := types.NewTx(&types.LegacyTx{ Nonce: 42, To: &toAddress, Data: callData, }) encodedTx, err := tx.MarshalBinary() require.NoError(t, err) ethClient := mocks.NewL1OracleClient(t) ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = l1GasCostMethodAbi.Pack("getL1Fee", encodedTx) require.NoError(t, err) require.Equal(t, payload, callMsg.Data) require.Equal(t, blockNum, blockNumber) }).Return(common.BigToHash(l1GasCost).Bytes(), nil) oracle := NewL1GasOracle(logger.Test(t), ethClient, chaintype.ChainOptimismBedrock) gasCost, err := oracle.GetGasCost(tests.Context(t), tx, blockNum) require.NoError(t, err) require.Equal(t, assets.NewWei(l1GasCost), gasCost) })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = l1GasCostMethodAbi.Pack("getL1Fee", encodedTx) require.NoError(t, err) require.Equal(t, payload, callMsg.Data) require.Equal(t, blockNum, blockNumber) }).Return(common.BigToHash(l1GasCost).Bytes(), nil)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `payload, err = l1GasCostMethodAbi.Pack("getL1Fee", encodedTx)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = l1GasCostMethodAbi.Pack("getL1Fee", encodedTx) require.NoError(t, err) require.Equal(t, payload, callMsg.Data) require.Equal(t, blockNum, blockNumber) }).Return(common.BigToHash(l1GasCost).Bytes(), nil)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `payload, err = l1GasCostMethodAbi.Pack("getL1Fee", encodedTx)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewL1OracleClient(t)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Run("Calling GasPrice on unstarted L1Oracle returns error", func(t *testing.T) { ethClient := mocks.NewL1OracleClient(t) oracle := NewL1GasOracle(logger.Test(t), ethClient, chaintype.ChainOptimismBedrock) _, err := oracle.GasPrice(tests.Context(t)) assert.EqualError(t, err, "L1GasOracle is not started; cannot estimate gas") })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewL1OracleClient(t)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Test(t)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.GasPrice(tests.Context(t))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Context(t)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Run("Calling GasPrice on started Arbitrum L1Oracle returns Arbitrum l1GasPrice", func(t *testing.T) { l1BaseFee := big.NewInt(100) l1GasPriceMethodAbi, err := abi.JSON(strings.NewReader(GetL1BaseFeeEstimateAbiString)) require.NoError(t, err) ethClient := mocks.NewL1OracleClient(t) ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = l1GasPriceMethodAbi.Pack("getL1BaseFeeEstimate") require.NoError(t, err) require.Equal(t, payload, callMsg.Data) assert.Nil(t, blockNumber) }).Return(common.BigToHash(l1BaseFee).Bytes(), nil) oracle := NewL1GasOracle(logger.Test(t), ethClient, chaintype.ChainArbitrum) servicetest.RunHealthy(t, oracle) gasPrice, err := oracle.GasPrice(tests.Context(t)) require.NoError(t, err) assert.Equal(t, assets.NewWei(l1BaseFee), gasPrice) })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewInt(100)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.JSON(strings.NewReader(GetL1BaseFeeEstimateAbiString))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewReader(GetL1BaseFeeEstimateAbiString)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewL1OracleClient(t)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{}))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.IsType(ethereum.CallMsg{})` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.IsType(&big.Int{})` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = l1GasPriceMethodAbi.Pack("getL1BaseFeeEstimate") require.NoError(t, err) require.Equal(t, payload, callMsg.Data) assert.Nil(t, blockNumber) })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Get(1)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Get(2)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Pack("getL1BaseFeeEstimate")` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Return(common.BigToHash(l1BaseFee).Bytes(), nil)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.BigToHash(l1BaseFee)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Bytes()` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Test(t)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.RunHealthy(t, oracle)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.GasPrice(tests.Context(t))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Context(t)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Run("Calling GasPrice on started Kroma L1Oracle returns Kroma l1GasPrice", func(t *testing.T) { l1BaseFee := big.NewInt(100) l1GasPriceMethodAbi, err := abi.JSON(strings.NewReader(L1BaseFeeAbiString)) require.NoError(t, err) isEcotoneAbiString, err := abi.JSON(strings.NewReader(OPIsEcotoneAbiString)) require.NoError(t, err) ethClient := mocks.NewL1OracleClient(t) ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = isEcotoneAbiString.Pack("isEcotone") require.NoError(t, err) require.Equal(t, payload, callMsg.Data) assert.Nil(t, blockNumber) }).Return(nil, errors.New("not ecotone")).Once() ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = l1GasPriceMethodAbi.Pack("l1BaseFee") require.NoError(t, err) require.Equal(t, payload, callMsg.Data) assert.Nil(t, blockNumber) }).Return(common.BigToHash(l1BaseFee).Bytes(), nil) oracle := newOpStackL1GasOracle(logger.Test(t), ethClient, chaintype.ChainKroma, KromaGasOracleAddress) servicetest.RunHealthy(t, oracle) gasPrice, err := oracle.GasPrice(tests.Context(t)) require.NoError(t, err) assert.Equal(t, assets.NewWei(l1BaseFee), gasPrice) })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewInt(100)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.JSON(strings.NewReader(L1BaseFeeAbiString))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewReader(L1BaseFeeAbiString)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.JSON(strings.NewReader(OPIsEcotoneAbiString))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewReader(OPIsEcotoneAbiString)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewL1OracleClient(t)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{}))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.IsType(ethereum.CallMsg{})` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.IsType(&big.Int{})` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = isEcotoneAbiString.Pack("isEcotone") require.NoError(t, err) require.Equal(t, payload, callMsg.Data) assert.Nil(t, blockNumber) })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Get(1)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Get(2)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Pack("isEcotone")` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Return(nil, errors.New("not ecotone"))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.New("not ecotone")` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Once()` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{}))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.IsType(ethereum.CallMsg{})` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.IsType(&big.Int{})` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = l1GasPriceMethodAbi.Pack("l1BaseFee") require.NoError(t, err) require.Equal(t, payload, callMsg.Data) assert.Nil(t, blockNumber) })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Get(1)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Get(2)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Pack("l1BaseFee")` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Return(common.BigToHash(l1BaseFee).Bytes(), nil)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.BigToHash(l1BaseFee)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Bytes()` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Test(t)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.RunHealthy(t, oracle)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.GasPrice(tests.Context(t))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Context(t)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Run("Calling GasPrice on started OPStack L1Oracle returns OPStack l1GasPrice", func(t *testing.T) { l1BaseFee := big.NewInt(100) l1GasPriceMethodAbi, err := abi.JSON(strings.NewReader(L1BaseFeeAbiString)) require.NoError(t, err) isEcotoneAbiString, err := abi.JSON(strings.NewReader(OPIsEcotoneAbiString)) require.NoError(t, err) ethClient := mocks.NewL1OracleClient(t) ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = isEcotoneAbiString.Pack("isEcotone") require.NoError(t, err) require.Equal(t, payload, callMsg.Data) assert.Nil(t, blockNumber) }).Return(nil, errors.New("not ecotone")).Once() ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = l1GasPriceMethodAbi.Pack("l1BaseFee") require.NoError(t, err) require.Equal(t, payload, callMsg.Data) assert.Nil(t, blockNumber) }).Return(common.BigToHash(l1BaseFee).Bytes(), nil) oracle := newOpStackL1GasOracle(logger.Test(t), ethClient, chaintype.ChainOptimismBedrock, OPGasOracleAddress) servicetest.RunHealthy(t, oracle) gasPrice, err := oracle.GasPrice(tests.Context(t)) require.NoError(t, err) assert.Equal(t, assets.NewWei(l1BaseFee), gasPrice) })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewInt(100)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.JSON(strings.NewReader(L1BaseFeeAbiString))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewReader(L1BaseFeeAbiString)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.JSON(strings.NewReader(OPIsEcotoneAbiString))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewReader(OPIsEcotoneAbiString)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewL1OracleClient(t)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{}))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.IsType(ethereum.CallMsg{})` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.IsType(&big.Int{})` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = isEcotoneAbiString.Pack("isEcotone") require.NoError(t, err) require.Equal(t, payload, callMsg.Data) assert.Nil(t, blockNumber) })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Get(1)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Get(2)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Pack("isEcotone")` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Return(nil, errors.New("not ecotone"))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.New("not ecotone")` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Once()` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{}))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.IsType(ethereum.CallMsg{})` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.IsType(&big.Int{})` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = l1GasPriceMethodAbi.Pack("l1BaseFee") require.NoError(t, err) require.Equal(t, payload, callMsg.Data) assert.Nil(t, blockNumber) })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Get(1)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Get(2)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Pack("l1BaseFee")` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Return(common.BigToHash(l1BaseFee).Bytes(), nil)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.BigToHash(l1BaseFee)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Bytes()` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Test(t)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.RunHealthy(t, oracle)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.GasPrice(tests.Context(t))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Context(t)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewInt(200)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.JSON(strings.NewReader(L1BaseFeeAbiString))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewReader(L1BaseFeeAbiString)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.JSON(strings.NewReader(OPIsEcotoneAbiString))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewReader(OPIsEcotoneAbiString)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewL1OracleClient(t)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{}))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.IsType(ethereum.CallMsg{})` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.IsType(&big.Int{})` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = isEcotoneAbiString.Pack("isEcotone") require.NoError(t, err) require.Equal(t, payload, callMsg.Data) assert.Nil(t, blockNumber) })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Get(1)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Get(2)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Pack("isEcotone")` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Return(nil, errors.New("not ecotone"))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.New("not ecotone")` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Once()` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{}))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.IsType(ethereum.CallMsg{})` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.IsType(&big.Int{})` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = l1GasPriceMethodAbi.Pack("l1BaseFee") require.NoError(t, err) require.Equal(t, payload, callMsg.Data) assert.Nil(t, blockNumber) })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Get(1)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Get(2)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Pack("l1BaseFee")` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Return(common.BigToHash(l1BaseFee).Bytes(), nil)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.BigToHash(l1BaseFee)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Bytes()` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Test(t)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Cleanup(func() { assert.NoError(t, oracle.Close()) })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.GasPrice(tests.Context(t))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Context(t)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Run("Calling GetGasCost on started Arbitrum L1Oracle returns Arbitrum getL1Fee", func(t *testing.T) { l1GasCost := big.NewInt(100) baseFee := utils.Uint256ToBytes32(big.NewInt(1000)) l1BaseFeeEstimate := utils.Uint256ToBytes32(big.NewInt(500)) blockNum := big.NewInt(1000) toAddress := utils.RandomAddress() callData := []byte{1, 2, 3, 4, 5, 6, 7} l1GasCostMethodAbi, err := abi.JSON(strings.NewReader(GasEstimateL1ComponentAbiString)) require.NoError(t, err) tx := types.NewTx(&types.LegacyTx{ Nonce: 42, To: &toAddress, Data: callData, }) result := common.LeftPadBytes(l1GasCost.Bytes(), 8) result = append(result, baseFee...) result = append(result, l1BaseFeeEstimate...) ethClient := mocks.NewL1OracleClient(t) ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = l1GasCostMethodAbi.Pack("gasEstimateL1Component", toAddress, false, callData) require.NoError(t, err) require.Equal(t, payload, callMsg.Data) require.Equal(t, blockNum, blockNumber) }).Return(result, nil) oracle := NewL1GasOracle(logger.Test(t), ethClient, chaintype.ChainArbitrum) gasCost, err := oracle.GetGasCost(tests.Context(t), tx, blockNum) require.NoError(t, err) require.Equal(t, assets.NewWei(l1GasCost), gasCost) })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewInt(100)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Uint256ToBytes32(big.NewInt(1000))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewInt(1000)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Uint256ToBytes32(big.NewInt(500))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewInt(500)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewInt(1000)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.RandomAddress()` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.JSON(strings.NewReader(GasEstimateL1ComponentAbiString))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewReader(GasEstimateL1ComponentAbiString)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewTx(&types.LegacyTx{ Nonce: 42, To: &toAddress, Data: callData, })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.LeftPadBytes(l1GasCost.Bytes(), 8)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Bytes()` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewL1OracleClient(t)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{}))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.IsType(ethereum.CallMsg{})` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.IsType(&big.Int{})` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = l1GasCostMethodAbi.Pack("gasEstimateL1Component", toAddress, false, callData) require.NoError(t, err) require.Equal(t, payload, callMsg.Data) require.Equal(t, blockNum, blockNumber) })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Get(1)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Get(2)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Pack("gasEstimateL1Component", toAddress, false, callData)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Return(result, nil)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Test(t)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.GetGasCost(tests.Context(t), tx, blockNum)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Context(t)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Run("Calling GetGasCost on started Kroma L1Oracle returns error", func(t *testing.T) { blockNum := big.NewInt(1000) tx := types.NewTx(&types.LegacyTx{}) ethClient := mocks.NewL1OracleClient(t) oracle := NewL1GasOracle(logger.Test(t), ethClient, chaintype.ChainKroma) _, err := oracle.GetGasCost(tests.Context(t), tx, blockNum) require.Error(t, err, "L1 gas cost not supported for this chain: kroma") })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewInt(1000)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewTx(&types.LegacyTx{})` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewL1OracleClient(t)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Test(t)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.GetGasCost(tests.Context(t), tx, blockNum)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Context(t)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Run("Calling GetGasCost on started OPStack L1Oracle returns OPStack getL1Fee", func(t *testing.T) { l1GasCost := big.NewInt(100) blockNum := big.NewInt(1000) toAddress := utils.RandomAddress() callData := []byte{1, 2, 3} l1GasCostMethodAbi, err := abi.JSON(strings.NewReader(GetL1FeeAbiString)) require.NoError(t, err) tx := types.NewTx(&types.LegacyTx{ Nonce: 42, To: &toAddress, Data: callData, }) encodedTx, err := tx.MarshalBinary() require.NoError(t, err) ethClient := mocks.NewL1OracleClient(t) ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = l1GasCostMethodAbi.Pack("getL1Fee", encodedTx) require.NoError(t, err) require.Equal(t, payload, callMsg.Data) require.Equal(t, blockNum, blockNumber) }).Return(common.BigToHash(l1GasCost).Bytes(), nil) oracle := NewL1GasOracle(logger.Test(t), ethClient, chaintype.ChainOptimismBedrock) gasCost, err := oracle.GetGasCost(tests.Context(t), tx, blockNum) require.NoError(t, err) require.Equal(t, assets.NewWei(l1GasCost), gasCost) })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewInt(100)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewInt(1000)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.RandomAddress()` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.JSON(strings.NewReader(GetL1FeeAbiString))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewReader(GetL1FeeAbiString)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewTx(&types.LegacyTx{ Nonce: 42, To: &toAddress, Data: callData, })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.MarshalBinary()` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewL1OracleClient(t)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{}))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.IsType(ethereum.CallMsg{})` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.IsType(&big.Int{})` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = l1GasCostMethodAbi.Pack("getL1Fee", encodedTx) require.NoError(t, err) require.Equal(t, payload, callMsg.Data) require.Equal(t, blockNum, blockNumber) })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Get(1)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Get(2)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Pack("getL1Fee", encodedTx)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Return(common.BigToHash(l1GasCost).Bytes(), nil)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.BigToHash(l1GasCost)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Bytes()` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Test(t)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.GetGasCost(tests.Context(t), tx, blockNum)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Context(t)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewInt(100)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewInt(1000)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.RandomAddress()` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.JSON(strings.NewReader(GetL1FeeAbiString))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewReader(GetL1FeeAbiString)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewTx(&types.LegacyTx{ Nonce: 42, To: &toAddress, Data: callData, })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.MarshalBinary()` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.NewL1OracleClient(t)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{}))` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.IsType(ethereum.CallMsg{})` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.IsType(&big.Int{})` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) var payload []byte payload, err = l1GasCostMethodAbi.Pack("getL1Fee", encodedTx) require.NoError(t, err) require.Equal(t, payload, callMsg.Data) require.Equal(t, blockNum, blockNumber) })` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Get(1)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Get(2)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Pack("getL1Fee", encodedTx)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Return(common.BigToHash(l1GasCost).Bytes(), nil)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.BigToHash(l1GasCost)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Bytes()` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Test(t)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.GetGasCost(tests.Context(t), tx, blockNum)` $DIR/core/chains/evm/gas/rollups/l1_oracle_test.go: `.Context(t)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `t.Run(tc.name, func(t *testing.T) { l1BaseFee := big.NewInt(100) oracleAddress := common.HexToAddress("0x1234").String() l1BaseFeeMethodAbi, err := abi.JSON(strings.NewReader(L1BaseFeeAbiString)) require.NoError(t, err) l1BaseFeeCalldata, err := l1BaseFeeMethodAbi.Pack(OPStackGasOracle_l1BaseFee) require.NoError(t, err) isEcotoneMethodAbi, err := abi.JSON(strings.NewReader(OPIsEcotoneAbiString)) require.NoError(t, err) isEcotoneCalldata, err := isEcotoneMethodAbi.Pack(OPStackGasOracle_isEcotone) require.NoError(t, err) ethClient := mocks.NewL1OracleClient(t) call := ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) require.Equal(t, isEcotoneCalldata, callMsg.Data) require.Equal(t, oracleAddress, callMsg.To.String()) assert.Nil(t, blockNumber) }) if tc.returnBadData { call.Return([]byte{0x2, 0x2}, nil).Once() } else if tc.isEcotoneError { call.Return(nil, fmt.Errorf("test error")).Once() } else { call.Return(isEcotoneMethodAbi.Methods["isEcotone"].Outputs.Pack(false)).Once() } if !tc.returnBadData { ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) require.Equal(t, l1BaseFeeCalldata, callMsg.Data) require.Equal(t, oracleAddress, callMsg.To.String()) assert.Nil(t, blockNumber) }).Return(common.BigToHash(l1BaseFee).Bytes(), nil).Once() } oracle := newOpStackL1GasOracle(logger.Test(t), ethClient, chaintype.ChainOptimismBedrock, oracleAddress) gasPrice, err := oracle.GetDAGasPrice(tests.Context(t)) if tc.returnBadData { assert.Error(t, err) } else { require.NoError(t, err) assert.Equal(t, l1BaseFee, gasPrice) } })` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `call.Return([]byte{0x2, 0x2}, nil).Once()` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `call.Return(nil, fmt.Errorf("test error")).Once()` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `call.Return(isEcotoneMethodAbi.Methods["isEcotone"].Outputs.Pack(false)).Once()` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) require.Equal(t, l1BaseFeeCalldata, callMsg.Data) require.Equal(t, oracleAddress, callMsg.To.String()) assert.Nil(t, blockNumber) }).Return(common.BigToHash(l1BaseFee).Bytes(), nil).Once()` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `t.Run("correctly fetches weighted gas price if chain has upgraded to Ecotone", func(t *testing.T) { ethClient := setupIsEcotone(t, oracleAddress) getL1GasUsedMethodAbi, err := abi.JSON(strings.NewReader(OPGetL1GasUsedAbiString)) require.NoError(t, err) getL1GasUsedCalldata, err := getL1GasUsedMethodAbi.Pack(OPStackGasOracle_getL1GasUsed, []byte{0x1}) require.NoError(t, err) getL1FeeMethodAbi, err := abi.JSON(strings.NewReader(GetL1FeeAbiString)) require.NoError(t, err) getL1FeeCalldata, err := getL1FeeMethodAbi.Pack(OPStackGasOracle_getL1Fee, []byte{0x1}) require.NoError(t, err) ethClient.On("BatchCallContext", mock.Anything, mock.IsType([]rpc.BatchElem{})).Run(func(args mock.Arguments) { rpcElements := args.Get(1).([]rpc.BatchElem) require.Equal(t, 2, len(rpcElements)) for _, rE := range rpcElements { require.Equal(t, "eth_call", rE.Method) require.Equal(t, oracleAddress, rE.Args[0].(map[string]interface{})["to"]) require.Equal(t, "latest", rE.Args[1]) } require.Equal(t, hexutil.Bytes(getL1GasUsedCalldata), rpcElements[0].Args[0].(map[string]interface{})["data"]) require.Equal(t, hexutil.Bytes(getL1FeeCalldata), rpcElements[1].Args[0].(map[string]interface{})["data"]) res1 := common.BigToHash(big.NewInt(1)).Hex() res2 := common.BigToHash(l1BaseFee).Hex() rpcElements[0].Result = &res1 rpcElements[1].Result = &res2 }).Return(nil).Once() oracle := newOpStackL1GasOracle(logger.Test(t), ethClient, chaintype.ChainOptimismBedrock, oracleAddress) gasPrice, err := oracle.GetDAGasPrice(tests.Context(t)) require.NoError(t, err) assert.Equal(t, l1BaseFee, gasPrice) })` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.IsType([]rpc.BatchElem{})).Run(func(args mock.Arguments) { rpcElements := args.Get(1).([]rpc.BatchElem) require.Equal(t, 2, len(rpcElements)) for _, rE := range rpcElements { require.Equal(t, "eth_call", rE.Method) require.Equal(t, oracleAddress, rE.Args[0].(map[string]interface{})["to"]) require.Equal(t, "latest", rE.Args[1]) } require.Equal(t, hexutil.Bytes(getL1GasUsedCalldata), rpcElements[0].Args[0].(map[string]interface{})["data"]) require.Equal(t, hexutil.Bytes(getL1FeeCalldata), rpcElements[1].Args[0].(map[string]interface{})["data"]) res1 := common.BigToHash(big.NewInt(1)).Hex() res2 := common.BigToHash(l1BaseFee).Hex() rpcElements[0].Result = &res1 rpcElements[1].Result = &res2 }).Return(nil).Once()` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `rpcElements[0].Result = &res1` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `rpcElements[1].Result = &res2` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `t.Run("fetching Ecotone price but rpc returns bad data", func(t *testing.T) { ethClient := setupIsEcotone(t, oracleAddress) ethClient.On("BatchCallContext", mock.Anything, mock.IsType([]rpc.BatchElem{})).Run(func(args mock.Arguments) { rpcElements := args.Get(1).([]rpc.BatchElem) var badData = "zzz" rpcElements[0].Result = &badData rpcElements[1].Result = &badData }).Return(nil).Once() oracle := newOpStackL1GasOracle(logger.Test(t), ethClient, chaintype.ChainOptimismBedrock, oracleAddress) _, err := oracle.GetDAGasPrice(tests.Context(t)) assert.Error(t, err) })` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.IsType([]rpc.BatchElem{})).Run(func(args mock.Arguments) { rpcElements := args.Get(1).([]rpc.BatchElem) var badData = "zzz" rpcElements[0].Result = &badData rpcElements[1].Result = &badData }).Return(nil).Once()` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `rpcElements[0].Result = &badData` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `rpcElements[1].Result = &badData` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `t.Run("fetching Ecotone price but rpc parent call errors", func(t *testing.T) { ethClient := setupIsEcotone(t, oracleAddress) ethClient.On("BatchCallContext", mock.Anything, mock.IsType([]rpc.BatchElem{})).Return(fmt.Errorf("revert")).Once() oracle := newOpStackL1GasOracle(logger.Test(t), ethClient, chaintype.ChainOptimismBedrock, oracleAddress) _, err := oracle.GetDAGasPrice(tests.Context(t)) assert.Error(t, err) })` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.IsType([]rpc.BatchElem{})).Return(fmt.Errorf("revert")).Once()` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.IsType([]rpc.BatchElem{})).Run(func(args mock.Arguments) { rpcElements := args.Get(1).([]rpc.BatchElem) res := common.BigToHash(l1BaseFee).Hex() rpcElements[0].Result = &res rpcElements[1].Error = fmt.Errorf("revert") }).Return(nil).Once()` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `rpcElements[0].Result = &res` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `rpcElements[1].Error = fmt.Errorf("revert")` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Run(tc.name, func(t *testing.T) { l1BaseFee := big.NewInt(100) oracleAddress := common.HexToAddress("0x1234").String() l1BaseFeeMethodAbi, err := abi.JSON(strings.NewReader(L1BaseFeeAbiString)) require.NoError(t, err) l1BaseFeeCalldata, err := l1BaseFeeMethodAbi.Pack(OPStackGasOracle_l1BaseFee) require.NoError(t, err) isEcotoneMethodAbi, err := abi.JSON(strings.NewReader(OPIsEcotoneAbiString)) require.NoError(t, err) isEcotoneCalldata, err := isEcotoneMethodAbi.Pack(OPStackGasOracle_isEcotone) require.NoError(t, err) ethClient := mocks.NewL1OracleClient(t) call := ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) require.Equal(t, isEcotoneCalldata, callMsg.Data) require.Equal(t, oracleAddress, callMsg.To.String()) assert.Nil(t, blockNumber) }) if tc.returnBadData { call.Return([]byte{0x2, 0x2}, nil).Once() } else if tc.isEcotoneError { call.Return(nil, fmt.Errorf("test error")).Once() } else { call.Return(isEcotoneMethodAbi.Methods["isEcotone"].Outputs.Pack(false)).Once() } if !tc.returnBadData { ethClient.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{})).Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) require.Equal(t, l1BaseFeeCalldata, callMsg.Data) require.Equal(t, oracleAddress, callMsg.To.String()) assert.Nil(t, blockNumber) }).Return(common.BigToHash(l1BaseFee).Bytes(), nil).Once() } oracle := newOpStackL1GasOracle(logger.Test(t), ethClient, chaintype.ChainOptimismBedrock, oracleAddress) gasPrice, err := oracle.GetDAGasPrice(tests.Context(t)) if tc.returnBadData { assert.Error(t, err) } else { require.NoError(t, err) assert.Equal(t, l1BaseFee, gasPrice) } })` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.NewInt(100)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.HexToAddress("0x1234")` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.String()` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.JSON(strings.NewReader(L1BaseFeeAbiString))` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.NewReader(L1BaseFeeAbiString)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Pack(OPStackGasOracle_l1BaseFee)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.JSON(strings.NewReader(OPIsEcotoneAbiString))` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.NewReader(OPIsEcotoneAbiString)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Pack(OPStackGasOracle_isEcotone)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.NewL1OracleClient(t)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{}))` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.IsType(ethereum.CallMsg{})` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.IsType(&big.Int{})` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) require.Equal(t, isEcotoneCalldata, callMsg.Data) require.Equal(t, oracleAddress, callMsg.To.String()) assert.Nil(t, blockNumber) })` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Get(1)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Get(2)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Return([]byte{0x2, 0x2}, nil)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Once()` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Return(nil, fmt.Errorf("test error"))` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Once()` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Return(isEcotoneMethodAbi.Methods["isEcotone"].Outputs.Pack(false))` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Outputs.Pack(false)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Once()` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.On("CallContract", mock.Anything, mock.IsType(ethereum.CallMsg{}), mock.IsType(&big.Int{}))` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.IsType(ethereum.CallMsg{})` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.IsType(&big.Int{})` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Run(func(args mock.Arguments) { callMsg := args.Get(1).(ethereum.CallMsg) blockNumber := args.Get(2).(*big.Int) require.Equal(t, l1BaseFeeCalldata, callMsg.Data) require.Equal(t, oracleAddress, callMsg.To.String()) assert.Nil(t, blockNumber) })` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Get(1)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Get(2)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Return(common.BigToHash(l1BaseFee).Bytes(), nil)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.BigToHash(l1BaseFee)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Bytes()` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Once()` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Test(t)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.GetDAGasPrice(tests.Context(t))` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Context(t)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.NewInt(100)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.HexToAddress("0x1234")` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.String()` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Run("correctly fetches weighted gas price if chain has upgraded to Ecotone", func(t *testing.T) { ethClient := setupIsEcotone(t, oracleAddress) getL1GasUsedMethodAbi, err := abi.JSON(strings.NewReader(OPGetL1GasUsedAbiString)) require.NoError(t, err) getL1GasUsedCalldata, err := getL1GasUsedMethodAbi.Pack(OPStackGasOracle_getL1GasUsed, []byte{0x1}) require.NoError(t, err) getL1FeeMethodAbi, err := abi.JSON(strings.NewReader(GetL1FeeAbiString)) require.NoError(t, err) getL1FeeCalldata, err := getL1FeeMethodAbi.Pack(OPStackGasOracle_getL1Fee, []byte{0x1}) require.NoError(t, err) ethClient.On("BatchCallContext", mock.Anything, mock.IsType([]rpc.BatchElem{})).Run(func(args mock.Arguments) { rpcElements := args.Get(1).([]rpc.BatchElem) require.Equal(t, 2, len(rpcElements)) for _, rE := range rpcElements { require.Equal(t, "eth_call", rE.Method) require.Equal(t, oracleAddress, rE.Args[0].(map[string]interface{})["to"]) require.Equal(t, "latest", rE.Args[1]) } require.Equal(t, hexutil.Bytes(getL1GasUsedCalldata), rpcElements[0].Args[0].(map[string]interface{})["data"]) require.Equal(t, hexutil.Bytes(getL1FeeCalldata), rpcElements[1].Args[0].(map[string]interface{})["data"]) res1 := common.BigToHash(big.NewInt(1)).Hex() res2 := common.BigToHash(l1BaseFee).Hex() rpcElements[0].Result = &res1 rpcElements[1].Result = &res2 }).Return(nil).Once() oracle := newOpStackL1GasOracle(logger.Test(t), ethClient, chaintype.ChainOptimismBedrock, oracleAddress) gasPrice, err := oracle.GetDAGasPrice(tests.Context(t)) require.NoError(t, err) assert.Equal(t, l1BaseFee, gasPrice) })` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.JSON(strings.NewReader(OPGetL1GasUsedAbiString))` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.NewReader(OPGetL1GasUsedAbiString)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Pack(OPStackGasOracle_getL1GasUsed, []byte{0x1})` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.JSON(strings.NewReader(GetL1FeeAbiString))` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.NewReader(GetL1FeeAbiString)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Pack(OPStackGasOracle_getL1Fee, []byte{0x1})` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.On("BatchCallContext", mock.Anything, mock.IsType([]rpc.BatchElem{}))` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.IsType([]rpc.BatchElem{})` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Run(func(args mock.Arguments) { rpcElements := args.Get(1).([]rpc.BatchElem) require.Equal(t, 2, len(rpcElements)) for _, rE := range rpcElements { require.Equal(t, "eth_call", rE.Method) require.Equal(t, oracleAddress, rE.Args[0].(map[string]interface{})["to"]) require.Equal(t, "latest", rE.Args[1]) } require.Equal(t, hexutil.Bytes(getL1GasUsedCalldata), rpcElements[0].Args[0].(map[string]interface{})["data"]) require.Equal(t, hexutil.Bytes(getL1FeeCalldata), rpcElements[1].Args[0].(map[string]interface{})["data"]) res1 := common.BigToHash(big.NewInt(1)).Hex() res2 := common.BigToHash(l1BaseFee).Hex() rpcElements[0].Result = &res1 rpcElements[1].Result = &res2 })` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Get(1)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.BigToHash(big.NewInt(1))` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.NewInt(1)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Hex()` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.BigToHash(l1BaseFee)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Hex()` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Once()` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Test(t)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.GetDAGasPrice(tests.Context(t))` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Context(t)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Run("fetching Ecotone price but rpc returns bad data", func(t *testing.T) { ethClient := setupIsEcotone(t, oracleAddress) ethClient.On("BatchCallContext", mock.Anything, mock.IsType([]rpc.BatchElem{})).Run(func(args mock.Arguments) { rpcElements := args.Get(1).([]rpc.BatchElem) var badData = "zzz" rpcElements[0].Result = &badData rpcElements[1].Result = &badData }).Return(nil).Once() oracle := newOpStackL1GasOracle(logger.Test(t), ethClient, chaintype.ChainOptimismBedrock, oracleAddress) _, err := oracle.GetDAGasPrice(tests.Context(t)) assert.Error(t, err) })` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.On("BatchCallContext", mock.Anything, mock.IsType([]rpc.BatchElem{}))` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.IsType([]rpc.BatchElem{})` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Run(func(args mock.Arguments) { rpcElements := args.Get(1).([]rpc.BatchElem) var badData = "zzz" rpcElements[0].Result = &badData rpcElements[1].Result = &badData })` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Get(1)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Once()` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Test(t)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.GetDAGasPrice(tests.Context(t))` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Context(t)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Run("fetching Ecotone price but rpc parent call errors", func(t *testing.T) { ethClient := setupIsEcotone(t, oracleAddress) ethClient.On("BatchCallContext", mock.Anything, mock.IsType([]rpc.BatchElem{})).Return(fmt.Errorf("revert")).Once() oracle := newOpStackL1GasOracle(logger.Test(t), ethClient, chaintype.ChainOptimismBedrock, oracleAddress) _, err := oracle.GetDAGasPrice(tests.Context(t)) assert.Error(t, err) })` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.On("BatchCallContext", mock.Anything, mock.IsType([]rpc.BatchElem{}))` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.IsType([]rpc.BatchElem{})` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Return(fmt.Errorf("revert"))` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Once()` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Test(t)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.GetDAGasPrice(tests.Context(t))` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Context(t)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.On("BatchCallContext", mock.Anything, mock.IsType([]rpc.BatchElem{}))` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.IsType([]rpc.BatchElem{})` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Run(func(args mock.Arguments) { rpcElements := args.Get(1).([]rpc.BatchElem) res := common.BigToHash(l1BaseFee).Hex() rpcElements[0].Result = &res rpcElements[1].Error = fmt.Errorf("revert") })` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Get(1)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.BigToHash(l1BaseFee)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Hex()` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Once()` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Test(t)` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.GetDAGasPrice(tests.Context(t))` $DIR/core/chains/evm/gas/rollups/op_l1_oracle_test.go: `.Context(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `t.Run("calling GetLegacyGas on unstarted estimator returns error", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle) _, _, err := o.GetLegacyGas(tests.Context(t), calldata, gasLimit, maxGasPrice) assert.EqualError(t, err, "estimator is not started") })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `t.Run("calling GetLegacyGas on started estimator returns prices", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(42) }) o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle) servicetest.RunHealthy(t, o) gasPrice, chainSpecificGasLimit, err := o.GetLegacyGas(tests.Context(t), calldata, gasLimit, maxGasPrice) require.NoError(t, err) assert.Equal(t, assets.NewWeiI(42), gasPrice) assert.Equal(t, gasLimit, chainSpecificGasLimit) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(42) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `(*big.Int)(res).SetInt64(42)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `servicetest.RunHealthy(t, o)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `t.Run("gas price is lower than user specified max gas price", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(42) }) servicetest.RunHealthy(t, o) gasPrice, chainSpecificGasLimit, err := o.GetLegacyGas(tests.Context(t), calldata, gasLimit, assets.NewWeiI(40)) require.Error(t, err) assert.EqualError(t, err, "estimated gas price: 42 wei is greater than the maximum gas price configured: 40 wei") assert.Nil(t, gasPrice) assert.Equal(t, uint64(0), chainSpecificGasLimit) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(42) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `(*big.Int)(res).SetInt64(42)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `servicetest.RunHealthy(t, o)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `t.Run("gas price is lower than global max gas price", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(120) }) servicetest.RunHealthy(t, o) gasPrice, chainSpecificGasLimit, err := o.GetLegacyGas(tests.Context(t), calldata, gasLimit, assets.NewWeiI(110)) assert.EqualError(t, err, "estimated gas price: 120 wei is greater than the maximum gas price configured: 110 wei") assert.Nil(t, gasPrice) assert.Equal(t, uint64(0), chainSpecificGasLimit) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(120) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `(*big.Int)(res).SetInt64(120)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `servicetest.RunHealthy(t, o)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `t.Run("calling GetLegacyGas on started estimator if initial call failed returns error", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(pkgerrors.New("kaboom")) servicetest.RunHealthy(t, o) _, _, err := o.GetLegacyGas(tests.Context(t), calldata, gasLimit, maxGasPrice) assert.EqualError(t, err, "failed to estimate gas; gas price not set") })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(pkgerrors.New("kaboom"))` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `servicetest.RunHealthy(t, o)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `t.Run("calling GetDynamicFee always returns error", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle) _, err := o.GetDynamicFee(tests.Context(t), maxGasPrice) assert.EqualError(t, err, "dynamic fees are not implemented for this estimator") })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `t.Run("calling BumpLegacyGas on unstarted estimator returns error", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle) _, _, err := o.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), gasLimit, maxGasPrice, nil) assert.EqualError(t, err, "estimator is not started") })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `t.Run("calling BumpDynamicFee always returns error", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle) fee := gas.DynamicFee{ FeeCap: assets.NewWeiI(42), TipCap: assets.NewWeiI(5), } _, err := o.BumpDynamicFee(tests.Context(t), fee, maxGasPrice, nil) assert.EqualError(t, err, "dynamic fees are not implemented for this estimator") })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `t.Run("calling BumpLegacyGas on started estimator returns new price buffered with bumpPercent", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(40) }) o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle) servicetest.RunHealthy(t, o) gasPrice, chainSpecificGasLimit, err := o.BumpLegacyGas(tests.Context(t), assets.NewWeiI(10), gasLimit, maxGasPrice, nil) require.NoError(t, err) assert.Equal(t, assets.NewWeiI(44), gasPrice) assert.Equal(t, gasLimit, chainSpecificGasLimit) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(40) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `(*big.Int)(res).SetInt64(40)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `servicetest.RunHealthy(t, o)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `t.Run("calling BumpLegacyGas on started estimator returns new price buffered with bumpMin", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(40) }) testCfg := &gas.MockGasEstimatorConfig{BumpPercentF: 1, BumpMinF: assets.NewWei(big.NewInt(1)), BumpThresholdF: 1, LimitMultiplierF: 1} o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, testCfg, l1Oracle) servicetest.RunHealthy(t, o) gasPrice, chainSpecificGasLimit, err := o.BumpLegacyGas(tests.Context(t), assets.NewWeiI(10), gasLimit, maxGasPrice, nil) require.NoError(t, err) assert.Equal(t, assets.NewWeiI(41), gasPrice) assert.Equal(t, gasLimit, chainSpecificGasLimit) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(40) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `(*big.Int)(res).SetInt64(40)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `servicetest.RunHealthy(t, o)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `t.Run("calling BumpLegacyGas on started estimator returns original price when lower than previous", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(5) }) o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle) servicetest.RunHealthy(t, o) gasPrice, chainSpecificGasLimit, err := o.BumpLegacyGas(tests.Context(t), assets.NewWeiI(10), gasLimit, maxGasPrice, nil) require.NoError(t, err) assert.Equal(t, assets.NewWeiI(10), gasPrice) assert.Equal(t, gasLimit, chainSpecificGasLimit) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(5) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `(*big.Int)(res).SetInt64(5)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `servicetest.RunHealthy(t, o)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `t.Run("calling BumpLegacyGas on started estimator returns error, suggested gas price is higher than max gas price", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(42) }) servicetest.RunHealthy(t, o) gasPrice, chainSpecificGasLimit, err := o.BumpLegacyGas(tests.Context(t), assets.NewWeiI(10), gasLimit, assets.NewWeiI(40), nil) require.Error(t, err) assert.EqualError(t, err, "estimated gas price: 42 wei is greater than the maximum gas price configured: 40 wei") assert.Nil(t, gasPrice) assert.Equal(t, uint64(0), chainSpecificGasLimit) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(42) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `(*big.Int)(res).SetInt64(42)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `servicetest.RunHealthy(t, o)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `t.Run("calling BumpLegacyGas on started estimator returns max gas price when suggested price under max but the buffer exceeds it", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(39) }) servicetest.RunHealthy(t, o) gasPrice, chainSpecificGasLimit, err := o.BumpLegacyGas(tests.Context(t), assets.NewWeiI(10), gasLimit, assets.NewWeiI(40), nil) require.NoError(t, err) assert.Equal(t, assets.NewWeiI(40), gasPrice) assert.Equal(t, gasLimit, chainSpecificGasLimit) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(39) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `(*big.Int)(res).SetInt64(39)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `servicetest.RunHealthy(t, o)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `t.Run("calling BumpLegacyGas on started estimator if initial call failed returns error", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(pkgerrors.New("kaboom")) servicetest.RunHealthy(t, o) _, _, err := o.BumpLegacyGas(tests.Context(t), assets.NewWeiI(10), gasLimit, maxGasPrice, nil) assert.EqualError(t, err, "failed to refresh and return gas; gas price not set") })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(pkgerrors.New("kaboom"))` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `servicetest.RunHealthy(t, o)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(40) }).Once()` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `(*big.Int)(res).SetInt64(40)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(pkgerrors.New("kaboom"))` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `servicetest.RunHealthy(t, o)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewWei(big.NewInt(1))` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewInt(1)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Run("calling GetLegacyGas on unstarted estimator returns error", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle) _, _, err := o.GetLegacyGas(tests.Context(t), calldata, gasLimit, maxGasPrice) assert.EqualError(t, err, "estimator is not started") })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewFeeEstimatorClient(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.GetLegacyGas(tests.Context(t), calldata, gasLimit, maxGasPrice)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Run("calling GetLegacyGas on started estimator returns prices", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(42) }) o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle) servicetest.RunHealthy(t, o) gasPrice, chainSpecificGasLimit, err := o.GetLegacyGas(tests.Context(t), calldata, gasLimit, maxGasPrice) require.NoError(t, err) assert.Equal(t, assets.NewWeiI(42), gasPrice) assert.Equal(t, gasLimit, chainSpecificGasLimit) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewFeeEstimatorClient(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice")` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(42) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.SetInt64(42)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.RunHealthy(t, o)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.GetLegacyGas(tests.Context(t), calldata, gasLimit, maxGasPrice)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Run("gas price is lower than user specified max gas price", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(42) }) servicetest.RunHealthy(t, o) gasPrice, chainSpecificGasLimit, err := o.GetLegacyGas(tests.Context(t), calldata, gasLimit, assets.NewWeiI(40)) require.Error(t, err) assert.EqualError(t, err, "estimated gas price: 42 wei is greater than the maximum gas price configured: 40 wei") assert.Nil(t, gasPrice) assert.Equal(t, uint64(0), chainSpecificGasLimit) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewFeeEstimatorClient(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice")` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(42) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.SetInt64(42)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.RunHealthy(t, o)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.GetLegacyGas(tests.Context(t), calldata, gasLimit, assets.NewWeiI(40))` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewWeiI(40)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Run("gas price is lower than global max gas price", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(120) }) servicetest.RunHealthy(t, o) gasPrice, chainSpecificGasLimit, err := o.GetLegacyGas(tests.Context(t), calldata, gasLimit, assets.NewWeiI(110)) assert.EqualError(t, err, "estimated gas price: 120 wei is greater than the maximum gas price configured: 110 wei") assert.Nil(t, gasPrice) assert.Equal(t, uint64(0), chainSpecificGasLimit) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewFeeEstimatorClient(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice")` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(120) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.SetInt64(120)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.RunHealthy(t, o)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.GetLegacyGas(tests.Context(t), calldata, gasLimit, assets.NewWeiI(110))` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewWeiI(110)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Run("calling GetLegacyGas on started estimator if initial call failed returns error", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(pkgerrors.New("kaboom")) servicetest.RunHealthy(t, o) _, _, err := o.GetLegacyGas(tests.Context(t), calldata, gasLimit, maxGasPrice) assert.EqualError(t, err, "failed to estimate gas; gas price not set") })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewFeeEstimatorClient(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice")` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Return(pkgerrors.New("kaboom"))` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.New("kaboom")` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.RunHealthy(t, o)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.GetLegacyGas(tests.Context(t), calldata, gasLimit, maxGasPrice)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Run("calling GetDynamicFee always returns error", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle) _, err := o.GetDynamicFee(tests.Context(t), maxGasPrice) assert.EqualError(t, err, "dynamic fees are not implemented for this estimator") })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewFeeEstimatorClient(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.GetDynamicFee(tests.Context(t), maxGasPrice)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Run("calling BumpLegacyGas on unstarted estimator returns error", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle) _, _, err := o.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), gasLimit, maxGasPrice, nil) assert.EqualError(t, err, "estimator is not started") })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewFeeEstimatorClient(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.BumpLegacyGas(tests.Context(t), assets.NewWeiI(42), gasLimit, maxGasPrice, nil)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewWeiI(42)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Run("calling BumpDynamicFee always returns error", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle) fee := gas.DynamicFee{ FeeCap: assets.NewWeiI(42), TipCap: assets.NewWeiI(5), } _, err := o.BumpDynamicFee(tests.Context(t), fee, maxGasPrice, nil) assert.EqualError(t, err, "dynamic fees are not implemented for this estimator") })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewFeeEstimatorClient(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewWeiI(42)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewWeiI(5)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.BumpDynamicFee(tests.Context(t), fee, maxGasPrice, nil)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Run("calling BumpLegacyGas on started estimator returns new price buffered with bumpPercent", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(40) }) o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle) servicetest.RunHealthy(t, o) gasPrice, chainSpecificGasLimit, err := o.BumpLegacyGas(tests.Context(t), assets.NewWeiI(10), gasLimit, maxGasPrice, nil) require.NoError(t, err) assert.Equal(t, assets.NewWeiI(44), gasPrice) assert.Equal(t, gasLimit, chainSpecificGasLimit) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewFeeEstimatorClient(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice")` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(40) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.SetInt64(40)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.RunHealthy(t, o)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.BumpLegacyGas(tests.Context(t), assets.NewWeiI(10), gasLimit, maxGasPrice, nil)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Run("calling BumpLegacyGas on started estimator returns new price buffered with bumpMin", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(40) }) testCfg := &gas.MockGasEstimatorConfig{BumpPercentF: 1, BumpMinF: assets.NewWei(big.NewInt(1)), BumpThresholdF: 1, LimitMultiplierF: 1} o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, testCfg, l1Oracle) servicetest.RunHealthy(t, o) gasPrice, chainSpecificGasLimit, err := o.BumpLegacyGas(tests.Context(t), assets.NewWeiI(10), gasLimit, maxGasPrice, nil) require.NoError(t, err) assert.Equal(t, assets.NewWeiI(41), gasPrice) assert.Equal(t, gasLimit, chainSpecificGasLimit) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewFeeEstimatorClient(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice")` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(40) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.SetInt64(40)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewWei(big.NewInt(1))` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewInt(1)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, testCfg, l1Oracle)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.RunHealthy(t, o)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.BumpLegacyGas(tests.Context(t), assets.NewWeiI(10), gasLimit, maxGasPrice, nil)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Run("calling BumpLegacyGas on started estimator returns original price when lower than previous", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(5) }) o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle) servicetest.RunHealthy(t, o) gasPrice, chainSpecificGasLimit, err := o.BumpLegacyGas(tests.Context(t), assets.NewWeiI(10), gasLimit, maxGasPrice, nil) require.NoError(t, err) assert.Equal(t, assets.NewWeiI(10), gasPrice) assert.Equal(t, gasLimit, chainSpecificGasLimit) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewFeeEstimatorClient(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice")` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(5) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.SetInt64(5)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.RunHealthy(t, o)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.BumpLegacyGas(tests.Context(t), assets.NewWeiI(10), gasLimit, maxGasPrice, nil)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Run("calling BumpLegacyGas on started estimator returns error, suggested gas price is higher than max gas price", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(42) }) servicetest.RunHealthy(t, o) gasPrice, chainSpecificGasLimit, err := o.BumpLegacyGas(tests.Context(t), assets.NewWeiI(10), gasLimit, assets.NewWeiI(40), nil) require.Error(t, err) assert.EqualError(t, err, "estimated gas price: 42 wei is greater than the maximum gas price configured: 40 wei") assert.Nil(t, gasPrice) assert.Equal(t, uint64(0), chainSpecificGasLimit) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewFeeEstimatorClient(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice")` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(42) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.SetInt64(42)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.RunHealthy(t, o)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.BumpLegacyGas(tests.Context(t), assets.NewWeiI(10), gasLimit, assets.NewWeiI(40), nil)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewWeiI(40)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Run("calling BumpLegacyGas on started estimator returns max gas price when suggested price under max but the buffer exceeds it", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(nil).Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(39) }) servicetest.RunHealthy(t, o) gasPrice, chainSpecificGasLimit, err := o.BumpLegacyGas(tests.Context(t), assets.NewWeiI(10), gasLimit, assets.NewWeiI(40), nil) require.NoError(t, err) assert.Equal(t, assets.NewWeiI(40), gasPrice) assert.Equal(t, gasLimit, chainSpecificGasLimit) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewFeeEstimatorClient(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice")` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(39) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.SetInt64(39)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.RunHealthy(t, o)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.BumpLegacyGas(tests.Context(t), assets.NewWeiI(10), gasLimit, assets.NewWeiI(40), nil)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewWeiI(40)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Run("calling BumpLegacyGas on started estimator if initial call failed returns error", func(t *testing.T) { feeEstimatorClient := mocks.NewFeeEstimatorClient(t) l1Oracle := rollupMocks.NewL1Oracle(t) o := gas.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle) feeEstimatorClient.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice").Return(pkgerrors.New("kaboom")) servicetest.RunHealthy(t, o) _, _, err := o.BumpLegacyGas(tests.Context(t), assets.NewWeiI(10), gasLimit, maxGasPrice, nil) assert.EqualError(t, err, "failed to refresh and return gas; gas price not set") })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewFeeEstimatorClient(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice")` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Return(pkgerrors.New("kaboom"))` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.New("kaboom")` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.RunHealthy(t, o)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.BumpLegacyGas(tests.Context(t), assets.NewWeiI(10), gasLimit, maxGasPrice, nil)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewFeeEstimatorClient(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewL1Oracle(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewSuggestedPriceEstimator(logger.Test(t), feeEstimatorClient, cfg, l1Oracle)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Test(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice")` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Return(nil)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Run(func(args mock.Arguments) { res := args.Get(1).(*hexutil.Big) (*big.Int)(res).SetInt64(40) })` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Get(1)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.SetInt64(40)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Once()` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.On("CallContext", mock.Anything, mock.Anything, "eth_gasPrice")` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Return(pkgerrors.New("kaboom"))` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.New("kaboom")` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.RunHealthy(t, o)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.BumpLegacyGas(tests.Context(t), assets.NewWeiI(10), gasLimit, maxGasPrice, nil)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.Context(t)` $DIR/core/chains/evm/gas/suggested_price_estimator_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `c.HeadTracker.SamplingInterval = &commonconfig.Duration{}` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything). Run(func(args mock.Arguments) { chchHeaders <- args.Get(1).(chan<- *evmtypes.Head) }). Return(sub, nil)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `chchHeaders <- args.Get(1).(chan<- *evmtypes.Head)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `ethClient.On("HeadByNumber", mock.Anything, mock.Anything).Return(testutils.Head(1), nil).Times(4)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `sub.On("Unsubscribe").Return()` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `sub.On("Err").Return(nil)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `servicetest.Run(t, mailMon)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `servicetest.Run(t, hb)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `servicetest.Run(t, ht)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `headers <- &h` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `g.Eventually(checker1.OnNewLongestChainCount).Should(gomega.Equal(int32(1)))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `unsubscribe1()` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `headers <- &evmtypes.Head{Number: 2, Hash: utils.NewHash(), ParentHash: h.Hash, EVMChainID: big.New(testutils.FixtureChainID)}` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `waitHeadBroadcasterToStart(t, broadcaster)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `broadcaster.BroadcastNewLongestChain(testutils.Head(1))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `g.Eventually(subscriber1.OnNewLongestChainCount).Should(gomega.Equal(int32(1)))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `unsubscribe1()` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `broadcaster.BroadcastNewLongestChain(testutils.Head(2))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `g.Eventually(subscriber2.OnNewLongestChainCount).Should(gomega.Equal(int32(2)))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `unsubscribe2()` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `broadcaster.BroadcastNewLongestChain(testutils.Head(1))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `g.Eventually(subscriber3.OnNewLongestChainCount).Should(gomega.Equal(int32(1)))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `unsubscribe3()` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `broadcaster.BroadcastNewLongestChain(testutils.Head(0))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `err = broadcaster.Close()` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `waitHeadBroadcasterToStart(t, broadcaster)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `broadcaster.BroadcastNewLongestChain(testutils.Head(1))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `slowAwaiter.AwaitOrFail(t, tests.WaitTimeout(t))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `fastAwaiter.AwaitOrFail(t, tests.WaitTimeout(t))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `unsubscribe1()` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `unsubscribe2()` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `err = broadcaster.Close()` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.NewWithT(t)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.HeadTracker.SamplingInterval = &commonconfig.Duration{} })` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Test(t)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.NewSubscription(t)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.On("SubscribeNewHead", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `. Run(func(args mock.Arguments) { chchHeaders <- args.Get(1).(chan<- *evmtypes.Head) })` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Get(1)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `. Return(sub, nil)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.On("HeadByNumber", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Return(testutils.Head(1), nil)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Head(1)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Times(4)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.On("Unsubscribe")` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Return()` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.On("Err")` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Return(nil)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.NewORM(*ethClient.ConfiguredChainID(), db)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.NewHeadSaver(logger, orm, evmCfg.EVM(), evmCfg.EVM().HeadTracker())` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.HeadTracker()` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.NewMonitor(t)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Run(t, mailMon)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.NewHeadBroadcaster(logger)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Run(t, hb)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.NewHeadTracker(logger, ethClient, evmCfg.EVM(), evmCfg.EVM().HeadTracker(), hb, hs, mailMon)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.HeadTracker()` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Run(t, ht)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Subscribe(checker1)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.NewHash()` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.NewHash()` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.New(testutils.FixtureChainID)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Eventually(checker1.OnNewLongestChainCount)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Should(gomega.Equal(int32(1)))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Equal(int32(1))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Subscribe(checker2)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.NewHash()` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.New(testutils.FixtureChainID)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Eventually(checker2.OnNewLongestChainCount)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Equal(int32(1))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.NewWithT(t)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Test(t)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.NewHeadBroadcaster(lggr)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Start(tests.Context(t))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Subscribe(subscriber1)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Subscribe(subscriber2)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.BroadcastNewLongestChain(testutils.Head(1))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Head(1)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Eventually(subscriber1.OnNewLongestChainCount)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Should(gomega.Equal(int32(1)))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Equal(int32(1))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.BroadcastNewLongestChain(testutils.Head(2))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Head(2)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Eventually(subscriber2.OnNewLongestChainCount)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Should(gomega.Equal(int32(2)))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Equal(int32(2))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Subscribe(subscriber3)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.BroadcastNewLongestChain(testutils.Head(1))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Head(1)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Eventually(subscriber3.OnNewLongestChainCount)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Should(gomega.Equal(int32(1)))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Equal(int32(1))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.BroadcastNewLongestChain(testutils.Head(0))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Head(0)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.OnNewLongestChainCount()` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Test(t)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.NewHeadBroadcaster(lggr)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Start(tests.Context(t))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.NewAwaiter()` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.NewAwaiter()` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Subscribe(slow)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Subscribe(fast)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.BroadcastNewLongestChain(testutils.Head(1))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.Head(1)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.AwaitOrFail(t, tests.WaitTimeout(t))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.AwaitOrFail(t, tests.WaitTimeout(t))` $DIR/core/chains/evm/headtracker/head_broadcaster_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `c.NoNewHeadsThreshold = &commonconfig.Duration{}` $DIR/core/chains/evm/headtracker/head_listener_test.go: `headCount.Add(1)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `ethClient.On("SubscribeNewHead", mock.Anything, mock.AnythingOfType("chan<- *types.Head")).Return(sub, nil).Once().Run(func(args mock.Arguments) { chHeads = args.Get(1).(chan<- *evmtypes.Head) subscribeAwaiter.ItHappened() })` $DIR/core/chains/evm/headtracker/head_listener_test.go: `chHeads = args.Get(1).(chan<- *evmtypes.Head)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `subscribeAwaiter.ItHappened()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `sub.On("Err").Return(chSubErr)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `sub.On("Unsubscribe").Return().Once().Run(func(mock.Arguments) { unsubscribeAwaiter.ItHappened() close(chHeads) close(chErr) })` $DIR/core/chains/evm/headtracker/head_listener_test.go: `unsubscribeAwaiter.ItHappened()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `close(chHeads)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `close(chErr)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `doneAwaiter.ItHappened()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `go hl.ListenForNewHeads(handler, done)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `subscribeAwaiter.AwaitOrFail(t, tests.WaitTimeout(t))` $DIR/core/chains/evm/headtracker/head_listener_test.go: `chHeads <- testutils.Head(0)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `chHeads <- testutils.Head(1)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `chHeads <- testutils.Head(2)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `close(chStop)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `doneAwaiter.AwaitOrFail(t)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `unsubscribeAwaiter.AwaitOrFail(t)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `c.NoNewHeadsThreshold = commonconfig.MustNewDuration(time.Second)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `firstHeadAwaiter.ItHappened()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `ethClient.On("SubscribeNewHead", mock.Anything, mock.AnythingOfType("chan<- *types.Head")).Return(sub, nil).Once().Run(func(args mock.Arguments) { chHeads = args.Get(1).(chan<- *evmtypes.Head) subscribeAwaiter.ItHappened() })` $DIR/core/chains/evm/headtracker/head_listener_test.go: `chHeads = args.Get(1).(chan<- *evmtypes.Head)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `subscribeAwaiter.ItHappened()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `sub.On("Err").Return(chSubErr)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `sub.On("Unsubscribe").Return().Once().Run(func(_ mock.Arguments) { close(chHeads) close(chErr) })` $DIR/core/chains/evm/headtracker/head_listener_test.go: `close(chHeads)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `close(chErr)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `doneAwaiter.ItHappened()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `go hl.ListenForNewHeads(handler, done)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `subscribeAwaiter.AwaitOrFail(t, tests.WaitTimeout(t))` $DIR/core/chains/evm/headtracker/head_listener_test.go: `chHeads <- testutils.Head(0)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `firstHeadAwaiter.AwaitOrFail(t)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `time.Sleep(time.Second * 2)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `close(chStop)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `t.Run(test.name, func(t *testing.T) { l := logger.Test(t) ethClient := testutils.NewEthClientMockWithDefaultChain(t) evmcfg := testutils.NewTestChainScopedConfig(t, nil) chStop := make(chan struct{}) hl := headtracker.NewHeadListener(l, ethClient, evmcfg.EVM(), chStop) hnhCalled := make(chan *evmtypes.Head) hnh := func(_ context.Context, header *evmtypes.Head) error { hnhCalled <- header return nil } doneAwaiter := testutils.NewAwaiter() done := doneAwaiter.ItHappened chSubErrTest := make(chan error) var chSubErr <-chan error = chSubErrTest sub := commonmocks.NewSubscription(t) // sub.Err is called twice because we enter the select loop two times: once // initially and once again after exactly one head has been received sub.On("Err").Return(chSubErr).Twice() subscribeAwaiter := testutils.NewAwaiter() var headsCh chan<- *evmtypes.Head // Initial subscribe ethClient.On("SubscribeNewHead", mock.Anything, mock.AnythingOfType("chan<- *types.Head")).Return(sub, nil).Once().Run(func(args mock.Arguments) { headsCh = args.Get(1).(chan<- *evmtypes.Head) subscribeAwaiter.ItHappened() }) go func() { hl.ListenForNewHeads(hnh, done) }() // Put a head on the channel to ensure we test all code paths subscribeAwaiter.AwaitOrFail(t, tests.WaitTimeout(t)) head := testutils.Head(0) headsCh <- head h := <-hnhCalled assert.Equal(t, head, h) // Expect a call to unsubscribe on error sub.On("Unsubscribe").Once().Run(func(_ mock.Arguments) { close(headsCh) // geth guarantees that Unsubscribe closes the errors channel if !test.closeErr { close(chSubErrTest) } }) // Expect a resubscribe chSubErrTest2 := make(chan error) var chSubErr2 <-chan error = chSubErrTest2 sub2 := commonmocks.NewSubscription(t) sub2.On("Err").Return(chSubErr2) subscribeAwaiter2 := testutils.NewAwaiter() var headsCh2 chan<- *evmtypes.Head ethClient.On("SubscribeNewHead", mock.Anything, mock.AnythingOfType("chan<- *types.Head")).Return(sub2, nil).Once().Run(func(args mock.Arguments) { headsCh2 = args.Get(1).(chan<- *evmtypes.Head) subscribeAwaiter2.ItHappened() }) // Sending test error if test.closeErr { close(chSubErrTest) } else { chSubErrTest <- test.err } // Wait for it to resubscribe subscribeAwaiter2.AwaitOrFail(t, tests.WaitTimeout(t)) head2 := testutils.Head(1) headsCh2 <- head2 h2 := <-hnhCalled assert.Equal(t, head2, h2) // Second call to unsubscribe on close sub2.On("Unsubscribe").Once().Run(func(_ mock.Arguments) { close(headsCh2) // geth guarantees that Unsubscribe closes the errors channel close(chSubErrTest2) }) close(chStop) doneAwaiter.AwaitOrFail(t) })` $DIR/core/chains/evm/headtracker/head_listener_test.go: `hnhCalled <- header` $DIR/core/chains/evm/headtracker/head_listener_test.go: `sub.On("Err").Return(chSubErr).Twice()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `ethClient.On("SubscribeNewHead", mock.Anything, mock.AnythingOfType("chan<- *types.Head")).Return(sub, nil).Once().Run(func(args mock.Arguments) { headsCh = args.Get(1).(chan<- *evmtypes.Head) subscribeAwaiter.ItHappened() })` $DIR/core/chains/evm/headtracker/head_listener_test.go: `headsCh = args.Get(1).(chan<- *evmtypes.Head)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `subscribeAwaiter.ItHappened()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `hl.ListenForNewHeads(hnh, done)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `subscribeAwaiter.AwaitOrFail(t, tests.WaitTimeout(t))` $DIR/core/chains/evm/headtracker/head_listener_test.go: `headsCh <- head` $DIR/core/chains/evm/headtracker/head_listener_test.go: `sub.On("Unsubscribe").Once().Run(func(_ mock.Arguments) { close(headsCh) // geth guarantees that Unsubscribe closes the errors channel if !test.closeErr { close(chSubErrTest) } })` $DIR/core/chains/evm/headtracker/head_listener_test.go: `close(headsCh)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `close(chSubErrTest)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `sub2.On("Err").Return(chSubErr2)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `ethClient.On("SubscribeNewHead", mock.Anything, mock.AnythingOfType("chan<- *types.Head")).Return(sub2, nil).Once().Run(func(args mock.Arguments) { headsCh2 = args.Get(1).(chan<- *evmtypes.Head) subscribeAwaiter2.ItHappened() })` $DIR/core/chains/evm/headtracker/head_listener_test.go: `headsCh2 = args.Get(1).(chan<- *evmtypes.Head)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `subscribeAwaiter2.ItHappened()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `close(chSubErrTest)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `chSubErrTest <- test.err` $DIR/core/chains/evm/headtracker/head_listener_test.go: `subscribeAwaiter2.AwaitOrFail(t, tests.WaitTimeout(t))` $DIR/core/chains/evm/headtracker/head_listener_test.go: `headsCh2 <- head2` $DIR/core/chains/evm/headtracker/head_listener_test.go: `sub2.On("Unsubscribe").Once().Run(func(_ mock.Arguments) { close(headsCh2) // geth guarantees that Unsubscribe closes the errors channel close(chSubErrTest2) })` $DIR/core/chains/evm/headtracker/head_listener_test.go: `close(headsCh2)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `close(chSubErrTest2)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `close(chStop)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `doneAwaiter.AwaitOrFail(t)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Test(t)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.NoNewHeadsThreshold = &commonconfig.Duration{} })` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.NewHeadListener(lggr, ethClient, evmcfg.EVM(), chStop)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Add(1)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.NewAwaiter()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.NewAwaiter()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.NewSubscription(t)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.On("SubscribeNewHead", mock.Anything, mock.AnythingOfType("chan<- *types.Head"))` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.AnythingOfType("chan<- *types.Head")` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Return(sub, nil)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Run(func(args mock.Arguments) { chHeads = args.Get(1).(chan<- *evmtypes.Head) subscribeAwaiter.ItHappened() })` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Get(1)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.ItHappened()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.On("Err")` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Return(chSubErr)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.On("Unsubscribe")` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Return()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Run(func(mock.Arguments) { unsubscribeAwaiter.ItHappened() close(chHeads) close(chErr) })` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.ItHappened()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.NewAwaiter()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.ItHappened()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.ListenForNewHeads(handler, done)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.AwaitOrFail(t, tests.WaitTimeout(t))` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Head(0)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Head(1)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Head(2)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.AwaitOrFail(t)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.AwaitOrFail(t)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Load()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Test(t)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.NoNewHeadsThreshold = commonconfig.MustNewDuration(time.Second) })` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.MustNewDuration(time.Second)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.NewHeadListener(lggr, ethClient, evmcfg.EVM(), chStop)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.NewAwaiter()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.ItHappened()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.NewAwaiter()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.NewSubscription(t)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.On("SubscribeNewHead", mock.Anything, mock.AnythingOfType("chan<- *types.Head"))` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.AnythingOfType("chan<- *types.Head")` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Return(sub, nil)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Run(func(args mock.Arguments) { chHeads = args.Get(1).(chan<- *evmtypes.Head) subscribeAwaiter.ItHappened() })` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Get(1)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.ItHappened()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.On("Err")` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Return(chSubErr)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.On("Unsubscribe")` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Return()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Run(func(_ mock.Arguments) { close(chHeads) close(chErr) })` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.NewAwaiter()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.ItHappened()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.ListenForNewHeads(handler, done)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.AwaitOrFail(t, tests.WaitTimeout(t))` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Head(0)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.AwaitOrFail(t)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Sleep(time.Second * 2)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.New("close 1006 (abnormal closure): unexpected EOF")` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Run(test.name, func(t *testing.T) { l := logger.Test(t) ethClient := testutils.NewEthClientMockWithDefaultChain(t) evmcfg := testutils.NewTestChainScopedConfig(t, nil) chStop := make(chan struct{}) hl := headtracker.NewHeadListener(l, ethClient, evmcfg.EVM(), chStop) hnhCalled := make(chan *evmtypes.Head) hnh := func(_ context.Context, header *evmtypes.Head) error { hnhCalled <- header return nil } doneAwaiter := testutils.NewAwaiter() done := doneAwaiter.ItHappened chSubErrTest := make(chan error) var chSubErr <-chan error = chSubErrTest sub := commonmocks.NewSubscription(t) // sub.Err is called twice because we enter the select loop two times: once // initially and once again after exactly one head has been received sub.On("Err").Return(chSubErr).Twice() subscribeAwaiter := testutils.NewAwaiter() var headsCh chan<- *evmtypes.Head // Initial subscribe ethClient.On("SubscribeNewHead", mock.Anything, mock.AnythingOfType("chan<- *types.Head")).Return(sub, nil).Once().Run(func(args mock.Arguments) { headsCh = args.Get(1).(chan<- *evmtypes.Head) subscribeAwaiter.ItHappened() }) go func() { hl.ListenForNewHeads(hnh, done) }() // Put a head on the channel to ensure we test all code paths subscribeAwaiter.AwaitOrFail(t, tests.WaitTimeout(t)) head := testutils.Head(0) headsCh <- head h := <-hnhCalled assert.Equal(t, head, h) // Expect a call to unsubscribe on error sub.On("Unsubscribe").Once().Run(func(_ mock.Arguments) { close(headsCh) // geth guarantees that Unsubscribe closes the errors channel if !test.closeErr { close(chSubErrTest) } }) // Expect a resubscribe chSubErrTest2 := make(chan error) var chSubErr2 <-chan error = chSubErrTest2 sub2 := commonmocks.NewSubscription(t) sub2.On("Err").Return(chSubErr2) subscribeAwaiter2 := testutils.NewAwaiter() var headsCh2 chan<- *evmtypes.Head ethClient.On("SubscribeNewHead", mock.Anything, mock.AnythingOfType("chan<- *types.Head")).Return(sub2, nil).Once().Run(func(args mock.Arguments) { headsCh2 = args.Get(1).(chan<- *evmtypes.Head) subscribeAwaiter2.ItHappened() }) // Sending test error if test.closeErr { close(chSubErrTest) } else { chSubErrTest <- test.err } // Wait for it to resubscribe subscribeAwaiter2.AwaitOrFail(t, tests.WaitTimeout(t)) head2 := testutils.Head(1) headsCh2 <- head2 h2 := <-hnhCalled assert.Equal(t, head2, h2) // Second call to unsubscribe on close sub2.On("Unsubscribe").Once().Run(func(_ mock.Arguments) { close(headsCh2) // geth guarantees that Unsubscribe closes the errors channel close(chSubErrTest2) }) close(chStop) doneAwaiter.AwaitOrFail(t) })` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Test(t)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.NewTestChainScopedConfig(t, nil)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.NewHeadListener(l, ethClient, evmcfg.EVM(), chStop)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.NewAwaiter()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.NewSubscription(t)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.On("Err")` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Return(chSubErr)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Twice()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.NewAwaiter()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.On("SubscribeNewHead", mock.Anything, mock.AnythingOfType("chan<- *types.Head"))` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.AnythingOfType("chan<- *types.Head")` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Return(sub, nil)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Run(func(args mock.Arguments) { headsCh = args.Get(1).(chan<- *evmtypes.Head) subscribeAwaiter.ItHappened() })` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Get(1)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.ItHappened()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.ListenForNewHeads(hnh, done)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.AwaitOrFail(t, tests.WaitTimeout(t))` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Head(0)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.On("Unsubscribe")` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Run(func(_ mock.Arguments) { close(headsCh) // geth guarantees that Unsubscribe closes the errors channel if !test.closeErr { close(chSubErrTest) } })` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.NewSubscription(t)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.On("Err")` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Return(chSubErr2)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.NewAwaiter()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.On("SubscribeNewHead", mock.Anything, mock.AnythingOfType("chan<- *types.Head"))` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.AnythingOfType("chan<- *types.Head")` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Return(sub2, nil)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Run(func(args mock.Arguments) { headsCh2 = args.Get(1).(chan<- *evmtypes.Head) subscribeAwaiter2.ItHappened() })` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Get(1)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.ItHappened()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.AwaitOrFail(t, tests.WaitTimeout(t))` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Head(1)` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.On("Unsubscribe")` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.Run(func(_ mock.Arguments) { close(headsCh2) // geth guarantees that Unsubscribe closes the errors channel close(chSubErrTest2) })` $DIR/core/chains/evm/headtracker/head_listener_test.go: `.AwaitOrFail(t)` $DIR/core/chains/evm/headtracker/head_saver_test.go: `latest = saver.LatestChain()` $DIR/core/chains/evm/headtracker/head_saver_test.go: `latest = saver.Chain(head.Hash)` $DIR/core/chains/evm/headtracker/head_saver_test.go: `verifyLatestHead(latestHead)` $DIR/core/chains/evm/headtracker/head_saver_test.go: `latestHead = saver.LatestChain()` $DIR/core/chains/evm/headtracker/head_saver_test.go: `verifyLatestHead(latestHead)` $DIR/core/chains/evm/headtracker/head_saver_test.go: `.Head(1)` $DIR/core/chains/evm/headtracker/head_saver_test.go: `.Save(tests.Context(t), head)` $DIR/core/chains/evm/headtracker/head_saver_test.go: `.Context(t)` $DIR/core/chains/evm/headtracker/head_saver_test.go: `.LatestHeadFromDB(tests.Context(t))` $DIR/core/chains/evm/headtracker/head_saver_test.go: `.Context(t)` $DIR/core/chains/evm/headtracker/head_saver_test.go: `.LatestChain()` $DIR/core/chains/evm/headtracker/head_saver_test.go: `.Chain(head.Hash)` $DIR/core/chains/evm/headtracker/head_saver_test.go: `.NewHead(big.NewInt(int64(num)), utils.NewHash(), parent, uint64(time.Now().Unix()), ubig.NewI(0))` $DIR/core/chains/evm/headtracker/head_saver_test.go: `.NewInt(int64(num))` $DIR/core/chains/evm/headtracker/head_saver_test.go: `.NewHash()` $DIR/core/chains/evm/headtracker/head_saver_test.go: `.Now()` $DIR/core/chains/evm/headtracker/head_saver_test.go: `.Unix()` $DIR/core/chains/evm/headtracker/head_saver_test.go: `.NewI(0)` $DIR/core/chains/evm/headtracker/head_saver_test.go: `.NewHash()` $DIR/core/chains/evm/headtracker/head_saver_test.go: `.IdempotentInsertHead(tests.Context(t), h)` $DIR/core/chains/evm/headtracker/head_saver_test.go: `.Context(t)` $DIR/core/chains/evm/headtracker/head_saver_test.go: `.Load(tests.Context(t), h5.BlockNumber())` $DIR/core/chains/evm/headtracker/head_saver_test.go: `.Context(t)` $DIR/core/chains/evm/headtracker/head_saver_test.go: `.BlockNumber()` $DIR/core/chains/evm/headtracker/head_saver_test.go: `.LatestChain()` $DIR/core/chains/evm/headtracker/head_saver_test.go: `.Chain(h2Uncle.Hash)` $DIR/core/chains/evm/headtracker/head_saver_test.go: `.ChainLength()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(testutils.Head(0), nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("HeadByNumber", mock.Anything, big.NewInt(0)).Return(testutils.Head(0), nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `c.HeadTracker.HistoryDepth = ptr[uint32](100)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `t.Run(test.name, func(t *testing.T) { db := pgtest.NewSqlxDB(t) config := testutils.NewTestChainScopedConfig(t, nil) orm := headtracker.NewORM(*testutils.FixtureChainID, db) ethClient := testutils.NewEthClientMockWithDefaultChain(t) chStarted := make(chan struct{}) mockEth := &testutils.MockEth{ EthClient: ethClient, } ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything). Maybe(). Return( func(ctx context.Context, ch chan<- *evmtypes.Head) ethereum.Subscription { defer close(chStarted) return mockEth.NewSub(t) }, func(ctx context.Context, ch chan<- *evmtypes.Head) error { return nil }, ) ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(testutils.Head(0), nil) fnCall := ethClient.On("HeadByNumber", mock.Anything, mock.Anything) fnCall.RunFn = func(args mock.Arguments) { num := args.Get(1).(*big.Int) fnCall.ReturnArguments = mock.Arguments{testutils.Head(num.Int64()), nil} } if test.initial != nil { assert.Nil(t, orm.IdempotentInsertHead(tests.Context(t), test.initial)) } ht := createHeadTracker(t, ethClient, config.EVM(), config.EVM().HeadTracker(), orm) ht.Start(t) if test.toSave != nil { err := ht.headSaver.Save(tests.Context(t), test.toSave) assert.NoError(t, err) } assert.Equal(t, test.want, ht.headSaver.LatestChain().ToInt()) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything). Maybe(). Return( func(ctx context.Context, ch chan<- *evmtypes.Head) ethereum.Subscription { defer close(chStarted) return mockEth.NewSub(t) }, func(ctx context.Context, ch chan<- *evmtypes.Head) error { return nil }, )` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(testutils.Head(0), nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `fnCall.ReturnArguments = mock.Arguments{testutils.Head(num.Int64()), nil}` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(testutils.Head(0), nil).Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("HeadByNumber", mock.Anything, mock.Anything).Return(testutils.Head(0), nil).Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("HeadByNumber", mock.Anything, mock.Anything).Return(testutils.Head(0), nil).Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything). Run(func(mock.Arguments) { close(chStarted) }). Return(sub, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `close(chStarted)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `c.FinalityTagEnabled = opts.FinalityTagEnable` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `c.HeadTracker.HistoryDepth = ptr[uint32](historyDepth)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `c.FinalityDepth = ptr[uint32](finalityDepth)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `c.HeadTracker.MaxAllowedFinalityDepth = opts.MaxAllowedFinalityDepth` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `c.HeadTracker.FinalityTagBypass = opts.FinalityTagBypass` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `t.Run("Fail start if context was canceled", func(t *testing.T) { ctx, cancel := context.WithCancel(tests.Context(t)) ht := newHeadTracker(t, opts{}) ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Run(func(args mock.Arguments) { cancel() }).Return(testutils.Head(0), context.Canceled) err := ht.headTracker.Start(ctx) require.ErrorIs(t, err, context.Canceled) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Run(func(args mock.Arguments) { cancel() }).Return(testutils.Head(0), context.Canceled)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `cancel()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `t.Run("Starts even if failed to get initialHead", func(t *testing.T) { ht := newHeadTracker(t, opts{}) ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(testutils.Head(0), errors.New("failed to get init head")) ht.Start(t) tests.AssertLogEventually(t, ht.observer, "Error handling initial head") })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(testutils.Head(0), errors.New("failed to get init head"))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `tests.AssertLogEventually(t, ht.observer, "Error handling initial head")` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `t.Run("Starts even if received invalid head", func(t *testing.T) { ht := newHeadTracker(t, opts{}) ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(nil, nil) ht.Start(t) tests.AssertLogEventually(t, ht.observer, "Got nil initial head") })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(nil, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `tests.AssertLogEventually(t, ht.observer, "Got nil initial head")` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `t.Run("Starts even if fails to get finalizedHead", func(t *testing.T) { ht := newHeadTracker(t, opts{FinalityTagEnable: ptr(true), FinalityTagBypass: ptr(false)}) head := testutils.Head(1000) ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(head, nil).Once() ht.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(nil, errors.New("failed to load latest finalized")).Once() ht.Start(t) tests.AssertLogEventually(t, ht.observer, "Error handling initial head") })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(head, nil).Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(nil, errors.New("failed to load latest finalized")).Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `tests.AssertLogEventually(t, ht.observer, "Error handling initial head")` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `t.Run("Starts even if latest finalizedHead is nil", func(t *testing.T) { ht := newHeadTracker(t, opts{FinalityTagEnable: ptr(true), FinalityTagBypass: ptr(false)}) head := testutils.Head(1000) ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(head, nil).Once() ht.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(nil, nil).Once() ht.ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything).Return(nil, errors.New("failed to connect")).Maybe() ht.Start(t) tests.AssertLogEventually(t, ht.observer, "Error handling initial head") })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(head, nil).Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(nil, nil).Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything).Return(nil, errors.New("failed to connect")).Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `tests.AssertLogEventually(t, ht.observer, "Error handling initial head")` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `t.Run("Logs error if finality gap is too big", func(t *testing.T) { ht := newHeadTracker(t, opts{FinalityTagEnable: ptr(true), FinalityTagBypass: ptr(false), MaxAllowedFinalityDepth: ptr(uint32(10))}) head := testutils.Head(1000) ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(head, nil).Once() ht.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(testutils.Head(989), nil).Once() ht.ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything).Return(nil, errors.New("failed to connect")).Maybe() ht.Start(t) tests.AssertEventually(t, func() bool { // must exactly match the error passed to logger field := zap.String("err", "failed to calculate latest finalized head: gap between latest finalized block (989) and current head (1000) is too large (> 10)") filtered := ht.observer.FilterMessage("Error handling initial head").FilterField(field) return filtered.Len() > 0 }) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(head, nil).Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(testutils.Head(989), nil).Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything).Return(nil, errors.New("failed to connect")).Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `tests.AssertEventually(t, func() bool { // must exactly match the error passed to logger field := zap.String("err", "failed to calculate latest finalized head: gap between latest finalized block (989) and current head (1000) is too large (> 10)") filtered := ht.observer.FilterMessage("Error handling initial head").FilterField(field) return filtered.Len() > 0 })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `t.Run("Happy path (finality tag)", func(t *testing.T) { head := testutils.Head(1000) ht := newHeadTracker(t, opts{FinalityTagEnable: ptr(true), FinalityTagBypass: ptr(false)}) ctx := tests.Context(t) require.NoError(t, ht.orm.IdempotentInsertHead(ctx, testutils.Head(799))) ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(head, nil).Once() finalizedHead := testutils.Head(800) // on start ht.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(finalizedHead, nil).Once() // on backfill ht.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(nil, errors.New("backfill call to finalized failed")).Maybe() ht.ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything).Return(nil, errors.New("failed to connect")).Maybe() ht.Start(t) tests.AssertLogEventually(t, ht.observer, "Loaded chain from DB") })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(head, nil).Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(finalizedHead, nil).Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(nil, errors.New("backfill call to finalized failed")).Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything).Return(nil, errors.New("failed to connect")).Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `tests.AssertLogEventually(t, ht.observer, "Loaded chain from DB")` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(head, nil).Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.ethClient.On("HeadByNumber", mock.Anything, big.NewInt(finalizedHead.Number)).Return(finalizedHead, nil).Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.ethClient.On("HeadByNumber", mock.Anything, mock.Anything).Return(nil, errors.New("backfill call to finalized failed")).Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything).Return(nil, errors.New("failed to connect")).Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `tests.AssertLogEventually(t, ht.observer, "Loaded chain from DB")` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `t.Run(tc.Name, func(t *testing.T) { happyPathFD(t, tc.Opts) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `happyPathFD(t, tc.Opts)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything). Return( func(ctx context.Context, ch chan<- *evmtypes.Head) ethereum.Subscription { sub := mockEth.NewSub(t) chchHeaders <- testutils.NewRawSub(ch, sub.Err()) return sub }, func(ctx context.Context, ch chan<- *evmtypes.Head) error { return nil }, )` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `chchHeaders <- testutils.NewRawSub(ch, sub.Err())` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("HeadByNumber", mock.Anything, mock.Anything).Return(testutils.Head(0), nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("HeadByHash", mock.Anything, mock.Anything).Return(testutils.Head(0), nil).Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `headers.TrySend(&evmtypes.Head{Number: 1, Hash: utils.NewHash(), EVMChainID: ubig.New(testutils.FixtureChainID)})` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `g.Eventually(checker.OnNewLongestChainCount).Should(gomega.Equal(int32(1)))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.Stop(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything). Return( func(ctx context.Context, ch chan<- *evmtypes.Head) ethereum.Subscription { return mockEth.NewSub(t) }, func(ctx context.Context, ch chan<- *evmtypes.Head) error { return nil }, )` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything).Return(nil, errors.New("cannot reconnect"))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything). Return( func(ctx context.Context, ch chan<- *evmtypes.Head) ethereum.Subscription { return mockEth.NewSub(t) }, func(ctx context.Context, ch chan<- *evmtypes.Head) error { return nil }, )` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("HeadByNumber", mock.Anything, mock.Anything).Return(testutils.Head(0), nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `mockEth.SubsErr(errors.New("test error to force reconnect"))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything). Return( func(ctx context.Context, ch chan<- *evmtypes.Head) ethereum.Subscription { sub := mockEth.NewSub(t) chchHeaders <- testutils.NewRawSub(ch, sub.Err()) return sub }, func(ctx context.Context, ch chan<- *evmtypes.Head) error { return nil }, )` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `chchHeaders <- testutils.NewRawSub(ch, sub.Err())` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("HeadByNumber", mock.Anything, mock.Anything).Return(testutils.Head(0), nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("HeadByHash", mock.Anything, mock.Anything).Return(testutils.Head(0), nil).Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `headers.TrySend(testutils.Head(1))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `g.Eventually(func() bool { report := ht.headTracker.HealthReport() return !slices.ContainsFunc(maps.Values(report), func(e error) bool { return e != nil }) }, 5*time.Second, tests.TestInterval).Should(gomega.Equal(true))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `headers.CloseCh()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `heads[i].ParentHash = parentHash` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `parentHash = heads[i].Hash` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(heads[3], nil).Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("HeadByNumber", mock.Anything, big.NewInt(0)).Return(heads[0], nil).Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("HeadByHash", mock.Anything, heads[2].Hash).Return(heads[2], nil).Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("HeadByHash", mock.Anything, heads[1].Hash).Return(heads[1], nil).Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("HeadByHash", mock.Anything, heads[0].Hash).Return(heads[0], nil).Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything). Return( func(ctx context.Context, ch chan<- *evmtypes.Head) ethereum.Subscription { sub := mockEth.NewSub(t) chchHeaders <- testutils.NewRawSub(ch, sub.Err()) return sub }, func(ctx context.Context, ch chan<- *evmtypes.Head) error { return nil }, )` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `chchHeaders <- testutils.NewRawSub(ch, sub.Err())` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `headers.TrySend(testutils.Head(1))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `gomega.NewWithT(t).Eventually(func() bool { report := ht.headTracker.HealthReport() services.CopyHealth(report, ht.headBroadcaster.HealthReport()) return !slices.ContainsFunc(maps.Values(report), func(e error) bool { return e != nil }) }, 5*time.Second, tests.TestInterval).Should(gomega.Equal(true))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `services.CopyHealth(report, ht.headBroadcaster.HealthReport())` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `c.FinalityDepth = ptr[uint32](50)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `c.HeadTracker.MaxBufferSize = ptr[uint32](100)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `c.HeadTracker.SamplingInterval = commonconfig.MustNewDuration(2500 * time.Millisecond)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything). Return( func(ctx context.Context, ch chan<- *evmtypes.Head) ethereum.Subscription { sub := mockEth.NewSub(t) chchHeaders <- testutils.NewRawSub(ch, sub.Err()) return sub }, func(ctx context.Context, ch chan<- *evmtypes.Head) error { return nil }, )` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `chchHeaders <- testutils.NewRawSub(ch, sub.Err())` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(head0, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("HeadByNumber", mock.Anything, big.NewInt(0)).Return(head0, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `headSeq.Append(blocks.Head(0))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `headSeq.Append(blocks.Head(1))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `headSeq.Append(blocks.Head(3))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `headSeq.Append(blocks.Head(2))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `headSeq.Append(blocks.Head(4))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `headSeq.Append(blocks.NewHead(4))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `headSeq.Append(blocksForked.Head(2))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `headSeq.Append(blocksForked.Head(3))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `headSeq.Append(blocksForked.Head(4))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `headSeq.Append(blocksForked.Head(5))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `checker.On("OnNewLongestChain", mock.Anything, mock.Anything). Run(func(args mock.Arguments) { h := args.Get(1).(*evmtypes.Head) assert.Equal(t, int64(5), h.Number) assert.Equal(t, blocksForked.Head(5).Hash, h.Hash) // This is the new longest chain, check that it came with its parents if !assert.NotNil(t, h.Parent) { return } assert.Equal(t, h.Parent.Hash, blocksForked.Head(4).Hash) if !assert.NotNil(t, h.Parent.Parent) { return } assert.Equal(t, h.Parent.Parent.Hash, blocksForked.Head(3).Hash) if !assert.NotNil(t, h.Parent.Parent.Parent) { return } assert.Equal(t, h.Parent.Parent.Parent.Hash, blocksForked.Head(2).Hash) if !assert.NotNil(t, h.Parent.Parent.Parent.Parent) { return } assert.Equal(t, h.Parent.Parent.Parent.Parent.Hash, blocksForked.Head(1).Hash) lastLongestChainAwaiter.ItHappened() }).Return().Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `lastLongestChainAwaiter.ItHappened()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `latestHeadByHashMu.Lock()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `fnCall.ReturnArguments = mock.Arguments{head, nil}` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `latestHeadByHashMu.Lock()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `latestHeadByHash[h.Hash] = h` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `latestHeadByHashMu.Unlock()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `headers.TrySend(h)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `lastLongestChainAwaiter.AwaitOrFail(t, tests.WaitTimeout(t))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.Stop(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `c.FinalityDepth = ptr[uint32](50)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `c.HeadTracker.MaxBufferSize = ptr[uint32](100)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `c.HeadTracker.SamplingInterval = commonconfig.MustNewDuration(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything). Return( func(ctx context.Context, ch chan<- *evmtypes.Head) ethereum.Subscription { sub := mockEth.NewSub(t) chchHeaders <- testutils.NewRawSub(ch, sub.Err()) return sub }, func(ctx context.Context, ch chan<- *evmtypes.Head) error { return nil }, )` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `chchHeaders <- testutils.NewRawSub(ch, sub.Err())` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(head0, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("HeadByNumber", mock.Anything, big.NewInt(0)).Return(head0, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `headSeq.Append(blocks.Head(0))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `headSeq.Append(blocks.Head(1))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `headSeq.Append(blocks.Head(3))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `headSeq.Append(blocks.Head(2))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `headSeq.Append(blocks.Head(4))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `headSeq.Append(blocks.NewHead(4))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `headSeq.Append(blocksForked.Head(2))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `headSeq.Append(blocksForked.Head(3))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `headSeq.Append(blocksForked.Head(4))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `headSeq.Append(blocksForked.Head(5))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `checker.On("OnNewLongestChain", mock.Anything, mock.Anything). Run(func(args mock.Arguments) { h := args.Get(1).(*evmtypes.Head) require.Equal(t, int64(0), h.Number) require.Equal(t, blocks.Head(0).Hash, h.Hash) }).Return().Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `checker.On("OnNewLongestChain", mock.Anything, mock.Anything). Run(func(args mock.Arguments) { h := args.Get(1).(*evmtypes.Head) require.Equal(t, int64(1), h.Number) require.Equal(t, blocks.Head(1).Hash, h.Hash) }).Return().Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `checker.On("OnNewLongestChain", mock.Anything, mock.Anything). Run(func(args mock.Arguments) { h := args.Get(1).(*evmtypes.Head) require.Equal(t, int64(3), h.Number) require.Equal(t, blocks.Head(3).Hash, h.Hash) }).Return().Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `checker.On("OnNewLongestChain", mock.Anything, mock.Anything). Run(func(args mock.Arguments) { h := args.Get(1).(*evmtypes.Head) require.Equal(t, int64(4), h.Number) require.Equal(t, blocks.Head(4).Hash, h.Hash) // Check that the block came with its parents require.NotNil(t, h.Parent) require.Equal(t, h.Parent.Hash, blocks.Head(3).Hash) require.NotNil(t, h.Parent.Parent.Hash) require.Equal(t, h.Parent.Parent.Hash, blocks.Head(2).Hash) require.NotNil(t, h.Parent.Parent.Parent) require.Equal(t, h.Parent.Parent.Parent.Hash, blocks.Head(1).Hash) }).Return().Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `checker.On("OnNewLongestChain", mock.Anything, mock.Anything). Run(func(args mock.Arguments) { h := args.Get(1).(*evmtypes.Head) require.Equal(t, int64(5), h.Number) require.Equal(t, blocksForked.Head(5).Hash, h.Hash) // This is the new longest chain, check that it came with its parents require.NotNil(t, h.Parent) require.Equal(t, h.Parent.Hash, blocksForked.Head(4).Hash) require.NotNil(t, h.Parent.Parent) require.Equal(t, h.Parent.Parent.Hash, blocksForked.Head(3).Hash) require.NotNil(t, h.Parent.Parent.Parent) require.Equal(t, h.Parent.Parent.Parent.Hash, blocksForked.Head(2).Hash) require.NotNil(t, h.Parent.Parent.Parent.Parent) require.Equal(t, h.Parent.Parent.Parent.Parent.Hash, blocksForked.Head(1).Hash) lastLongestChainAwaiter.ItHappened() }).Return().Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `lastLongestChainAwaiter.ItHappened()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `latestHeadByHashMu.Lock()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `fnCall.ReturnArguments = mock.Arguments{head, nil}` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `latestHeadByHashMu.Lock()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `latestHeadByHash[h.Hash] = h` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `latestHeadByHashMu.Unlock()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `headers.TrySend(h)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `time.Sleep(tests.TestInterval)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `lastLongestChainAwaiter.AwaitOrFail(t, tests.WaitTimeout(t))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ht.Stop(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `h1.ParentHash = head0.Hash` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `h9.ParentHash = head8.Hash` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `h11.ParentHash = head10.Hash` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `h12.ParentHash = h11.Hash` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `h13.ParentHash = h12.Hash` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `h14Orphaned.ParentHash = h13.Hash` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `h14.ParentHash = h13.Hash` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `h15.ParentHash = h14.Hash` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `ethClient.On("ConfiguredChainID", mock.Anything).Return(evmcfg.EVM().ChainID(), nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `t.Run("returns error if latestFinalized is not valid", func(t *testing.T) { htu := newHeadTrackerUniverse(t, opts{}) err := htu.headTracker.Backfill(ctx, &h12, nil) require.EqualError(t, err, "can not perform backfill without a valid latestFinalized head") })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `t.Run("Returns error if finalized head is ahead of canonical", func(t *testing.T) { htu := newHeadTrackerUniverse(t, opts{}) err := htu.headTracker.Backfill(ctx, &h12, &h14Orphaned) require.EqualError(t, err, "invariant violation: expected head of canonical chain to be ahead of the latestFinalized") })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `t.Run("Returns error if finalizedHead is not present in the canonical chain", func(t *testing.T) { htu := newHeadTrackerUniverse(t, opts{Heads: heads}) err := htu.headTracker.Backfill(ctx, &h15, &h14Orphaned) require.EqualError(t, err, "expected finalized block to be present in canonical chain") })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `t.Run("Marks all blocks in chain that are older than finalized", func(t *testing.T) { htu := newHeadTrackerUniverse(t, opts{Heads: heads}) assertFinalized := func(expectedFinalized bool, msg string, heads ...evmtypes.Head) { for _, h := range heads { storedHead := htu.headSaver.Chain(h.Hash) assert.Equal(t, expectedFinalized, storedHead != nil && storedHead.IsFinalized, msg, "block_number", h.Number) } } err := htu.headTracker.Backfill(ctx, &h15, &h14) require.NoError(t, err) assertFinalized(true, "expected heads to be marked as finalized after backfill", h14, h13, h12, h11) assertFinalized(false, "expected heads to remain unfinalized", h15, head10) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `assertFinalized(true, "expected heads to be marked as finalized after backfill", h14, h13, h12, h11)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `assertFinalized(false, "expected heads to remain unfinalized", h15, head10)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `t.Run("fetches a missing head", func(t *testing.T) { htu := newHeadTrackerUniverse(t, opts{Heads: heads}) htu.ethClient.On("HeadByHash", mock.Anything, head10.Hash). Return(&head10, nil) err := htu.headTracker.Backfill(ctx, &h12, &h9) require.NoError(t, err) h := htu.headSaver.Chain(h12.Hash) assert.Equal(t, int64(12), h.Number) require.NotNil(t, h.Parent) assert.Equal(t, int64(11), h.Parent.Number) require.NotNil(t, h.Parent.Parent) assert.Equal(t, int64(10), h.Parent.Parent.Number) require.NotNil(t, h.Parent.Parent.Parent) assert.Equal(t, int64(9), h.Parent.Parent.Parent.Number) writtenHead, err := htu.orm.HeadByHash(tests.Context(t), head10.Hash) require.NoError(t, err) assert.Equal(t, int64(10), writtenHead.Number) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `htu.ethClient.On("HeadByHash", mock.Anything, head10.Hash). Return(&head10, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `t.Run("fetches only heads that are missing", func(t *testing.T) { htu := newHeadTrackerUniverse(t, opts{Heads: heads}) htu.ethClient.On("HeadByHash", mock.Anything, head10.Hash). Return(&head10, nil) htu.ethClient.On("HeadByHash", mock.Anything, head8.Hash). Return(&head8, nil) err := htu.headTracker.Backfill(ctx, &h15, &head8) require.NoError(t, err) h := htu.headSaver.Chain(h15.Hash) require.Equal(t, uint32(8), h.ChainLength()) earliestInChain := h.EarliestInChain() assert.Equal(t, head8.Number, earliestInChain.BlockNumber()) assert.Equal(t, head8.Hash, earliestInChain.BlockHash()) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `htu.ethClient.On("HeadByHash", mock.Anything, head10.Hash). Return(&head10, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `htu.ethClient.On("HeadByHash", mock.Anything, head8.Hash). Return(&head8, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `t.Run("abandons backfill and returns error if the eth node returns not found", func(t *testing.T) { htu := newHeadTrackerUniverse(t, opts{Heads: heads}) htu.ethClient.On("HeadByHash", mock.Anything, head10.Hash). Return(&head10, nil). Once() htu.ethClient.On("HeadByHash", mock.Anything, head8.Hash). Return(nil, ethereum.NotFound). Once() err := htu.headTracker.Backfill(ctx, &h12, &head8) require.Error(t, err) require.EqualError(t, err, "fetchAndSaveHead failed: not found") h := htu.headSaver.Chain(h12.Hash) // Should contain 12, 11, 10, 9 assert.Equal(t, 4, int(h.ChainLength())) assert.Equal(t, int64(9), h.EarliestInChain().BlockNumber()) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `htu.ethClient.On("HeadByHash", mock.Anything, head10.Hash). Return(&head10, nil). Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `htu.ethClient.On("HeadByHash", mock.Anything, head8.Hash). Return(nil, ethereum.NotFound). Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `t.Run("abandons backfill and returns error if the context time budget is exceeded", func(t *testing.T) { htu := newHeadTrackerUniverse(t, opts{Heads: heads}) htu.ethClient.On("HeadByHash", mock.Anything, head10.Hash). Return(&head10, nil) lctx, cancel := context.WithCancel(ctx) htu.ethClient.On("HeadByHash", mock.Anything, head8.Hash). Return(nil, context.DeadlineExceeded).Run(func(args mock.Arguments) { cancel() }) err := htu.headTracker.Backfill(lctx, &h12, &head8) require.Error(t, err) require.EqualError(t, err, "fetchAndSaveHead failed: context canceled") h := htu.headSaver.Chain(h12.Hash) // Should contain 12, 11, 10, 9 assert.Equal(t, 4, int(h.ChainLength())) assert.Equal(t, int64(9), h.EarliestInChain().BlockNumber()) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `htu.ethClient.On("HeadByHash", mock.Anything, head10.Hash). Return(&head10, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `htu.ethClient.On("HeadByHash", mock.Anything, head8.Hash). Return(nil, context.DeadlineExceeded).Run(func(args mock.Arguments) { cancel() })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `cancel()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `t.Run("abandons backfill and returns error when fetching a block by hash fails, indicating a reorg", func(t *testing.T) { htu := newHeadTrackerUniverse(t, opts{}) htu.ethClient.On("HeadByHash", mock.Anything, h14.Hash).Return(&h14, nil).Once() htu.ethClient.On("HeadByHash", mock.Anything, h13.Hash).Return(&h13, nil).Once() htu.ethClient.On("HeadByHash", mock.Anything, h12.Hash).Return(nil, errors.New("not found")).Once() err := htu.headTracker.Backfill(ctx, &h15, &h11) require.Error(t, err) require.EqualError(t, err, "fetchAndSaveHead failed: not found") h := htu.headSaver.Chain(h14.Hash) // Should contain 14, 13 (15 was never added). When trying to get the parent of h13 by hash, a reorg happened and backfill exited. assert.Equal(t, 2, int(h.ChainLength())) assert.Equal(t, int64(13), h.EarliestInChain().BlockNumber()) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `htu.ethClient.On("HeadByHash", mock.Anything, h14.Hash).Return(&h14, nil).Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `htu.ethClient.On("HeadByHash", mock.Anything, h13.Hash).Return(&h13, nil).Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `htu.ethClient.On("HeadByHash", mock.Anything, h12.Hash).Return(nil, errors.New("not found")).Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(testutils.Head(0), nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("HeadByNumber", mock.Anything, big.NewInt(0))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewInt(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(testutils.Head(0), nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewORM(*testutils.FixtureChainID, db)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(16)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewTestChainScopedConfig(t, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.HeadTracker()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.headSaver.LatestChain()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.HeadTracker.HistoryDepth = ptr[uint32](100) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewORM(*testutils.FixtureChainID, db)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(201)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.HeadTracker()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.headSaver.Load(tests.Context(t), latest.Number)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Context(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.LatestHead(tests.Context(t))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Context(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(5)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(6)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewInt(6)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(1)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewInt(5)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewInt(5)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewInt(5)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewInt(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Run(test.name, func(t *testing.T) { db := pgtest.NewSqlxDB(t) config := testutils.NewTestChainScopedConfig(t, nil) orm := headtracker.NewORM(*testutils.FixtureChainID, db) ethClient := testutils.NewEthClientMockWithDefaultChain(t) chStarted := make(chan struct{}) mockEth := &testutils.MockEth{ EthClient: ethClient, } ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything). Maybe(). Return( func(ctx context.Context, ch chan<- *evmtypes.Head) ethereum.Subscription { defer close(chStarted) return mockEth.NewSub(t) }, func(ctx context.Context, ch chan<- *evmtypes.Head) error { return nil }, ) ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(testutils.Head(0), nil) fnCall := ethClient.On("HeadByNumber", mock.Anything, mock.Anything) fnCall.RunFn = func(args mock.Arguments) { num := args.Get(1).(*big.Int) fnCall.ReturnArguments = mock.Arguments{testutils.Head(num.Int64()), nil} } if test.initial != nil { assert.Nil(t, orm.IdempotentInsertHead(tests.Context(t), test.initial)) } ht := createHeadTracker(t, ethClient, config.EVM(), config.EVM().HeadTracker(), orm) ht.Start(t) if test.toSave != nil { err := ht.headSaver.Save(tests.Context(t), test.toSave) assert.NoError(t, err) } assert.Equal(t, test.want, ht.headSaver.LatestChain().ToInt()) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewTestChainScopedConfig(t, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewORM(*testutils.FixtureChainID, db)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("SubscribeNewHead", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `. Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `. Return( func(ctx context.Context, ch chan<- *evmtypes.Head) ethereum.Subscription { defer close(chStarted) return mockEth.NewSub(t) }, func(ctx context.Context, ch chan<- *evmtypes.Head) error { return nil }, )` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewSub(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(testutils.Head(0), nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("HeadByNumber", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Get(1)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(num.Int64())` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Int64()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.HeadTracker()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.headSaver.Save(tests.Context(t), test.toSave)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Context(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewTestChainScopedConfig(t, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewORM(*testutils.FixtureChainID, db)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewSub(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(testutils.Head(0), nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("HeadByNumber", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(testutils.Head(0), nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("HeadByNumber", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(testutils.Head(0), nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("SubscribeNewHead", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `. Run(func(mock.Arguments) { close(chStarted) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `. Return(sub, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.HeadTracker()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { if opts.FinalityTagEnable != nil { c.FinalityTagEnabled = opts.FinalityTagEnable } c.HeadTracker.HistoryDepth = ptr[uint32](historyDepth) c.FinalityDepth = ptr[uint32](finalityDepth) if opts.MaxAllowedFinalityDepth != nil { c.HeadTracker.MaxAllowedFinalityDepth = opts.MaxAllowedFinalityDepth } if opts.FinalityTagBypass != nil { c.HeadTracker.FinalityTagBypass = opts.FinalityTagBypass } })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewORM(*testutils.FixtureChainID, db)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.HeadTracker()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Run("Fail start if context was canceled", func(t *testing.T) { ctx, cancel := context.WithCancel(tests.Context(t)) ht := newHeadTracker(t, opts{}) ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Run(func(args mock.Arguments) { cancel() }).Return(testutils.Head(0), context.Canceled) err := ht.headTracker.Start(ctx) require.ErrorIs(t, err, context.Canceled) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.WithCancel(tests.Context(t))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Context(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Run(func(args mock.Arguments) { cancel() })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(testutils.Head(0), context.Canceled)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.headTracker.Start(ctx)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Run("Starts even if failed to get initialHead", func(t *testing.T) { ht := newHeadTracker(t, opts{}) ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(testutils.Head(0), errors.New("failed to get init head")) ht.Start(t) tests.AssertLogEventually(t, ht.observer, "Error handling initial head") })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(testutils.Head(0), errors.New("failed to get init head"))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.New("failed to get init head")` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.AssertLogEventually(t, ht.observer, "Error handling initial head")` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Run("Starts even if received invalid head", func(t *testing.T) { ht := newHeadTracker(t, opts{}) ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(nil, nil) ht.Start(t) tests.AssertLogEventually(t, ht.observer, "Got nil initial head") })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(nil, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.AssertLogEventually(t, ht.observer, "Got nil initial head")` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Run("Starts even if fails to get finalizedHead", func(t *testing.T) { ht := newHeadTracker(t, opts{FinalityTagEnable: ptr(true), FinalityTagBypass: ptr(false)}) head := testutils.Head(1000) ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(head, nil).Once() ht.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(nil, errors.New("failed to load latest finalized")).Once() ht.Start(t) tests.AssertLogEventually(t, ht.observer, "Error handling initial head") })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(1000)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(head, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("LatestFinalizedBlock", mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(nil, errors.New("failed to load latest finalized"))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.New("failed to load latest finalized")` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.AssertLogEventually(t, ht.observer, "Error handling initial head")` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Run("Starts even if latest finalizedHead is nil", func(t *testing.T) { ht := newHeadTracker(t, opts{FinalityTagEnable: ptr(true), FinalityTagBypass: ptr(false)}) head := testutils.Head(1000) ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(head, nil).Once() ht.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(nil, nil).Once() ht.ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything).Return(nil, errors.New("failed to connect")).Maybe() ht.Start(t) tests.AssertLogEventually(t, ht.observer, "Error handling initial head") })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(1000)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(head, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("LatestFinalizedBlock", mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(nil, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(nil, errors.New("failed to connect"))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.New("failed to connect")` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.AssertLogEventually(t, ht.observer, "Error handling initial head")` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Run("Logs error if finality gap is too big", func(t *testing.T) { ht := newHeadTracker(t, opts{FinalityTagEnable: ptr(true), FinalityTagBypass: ptr(false), MaxAllowedFinalityDepth: ptr(uint32(10))}) head := testutils.Head(1000) ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(head, nil).Once() ht.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(testutils.Head(989), nil).Once() ht.ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything).Return(nil, errors.New("failed to connect")).Maybe() ht.Start(t) tests.AssertEventually(t, func() bool { // must exactly match the error passed to logger field := zap.String("err", "failed to calculate latest finalized head: gap between latest finalized block (989) and current head (1000) is too large (> 10)") filtered := ht.observer.FilterMessage("Error handling initial head").FilterField(field) return filtered.Len() > 0 }) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(1000)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(head, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("LatestFinalizedBlock", mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(testutils.Head(989), nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(989)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(nil, errors.New("failed to connect"))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.New("failed to connect")` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.AssertEventually(t, func() bool { // must exactly match the error passed to logger field := zap.String("err", "failed to calculate latest finalized head: gap between latest finalized block (989) and current head (1000) is too large (> 10)") filtered := ht.observer.FilterMessage("Error handling initial head").FilterField(field) return filtered.Len() > 0 })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.String("err", "failed to calculate latest finalized head: gap between latest finalized block (989) and current head (1000) is too large (> 10)")` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.observer.FilterMessage("Error handling initial head")` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.FilterField(field)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Len()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Run("Happy path (finality tag)", func(t *testing.T) { head := testutils.Head(1000) ht := newHeadTracker(t, opts{FinalityTagEnable: ptr(true), FinalityTagBypass: ptr(false)}) ctx := tests.Context(t) require.NoError(t, ht.orm.IdempotentInsertHead(ctx, testutils.Head(799))) ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(head, nil).Once() finalizedHead := testutils.Head(800) // on start ht.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(finalizedHead, nil).Once() // on backfill ht.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(nil, errors.New("backfill call to finalized failed")).Maybe() ht.ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything).Return(nil, errors.New("failed to connect")).Maybe() ht.Start(t) tests.AssertLogEventually(t, ht.observer, "Loaded chain from DB") })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(1000)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Context(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(head, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(800)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("LatestFinalizedBlock", mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(finalizedHead, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("LatestFinalizedBlock", mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(nil, errors.New("backfill call to finalized failed"))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.New("backfill call to finalized failed")` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(nil, errors.New("failed to connect"))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.New("failed to connect")` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.AssertLogEventually(t, ht.observer, "Loaded chain from DB")` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(1000)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(head, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(head.Number - finalityDepth)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("HeadByNumber", mock.Anything, big.NewInt(finalizedHead.Number))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewInt(finalizedHead.Number)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(finalizedHead, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Context(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("HeadByNumber", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(nil, errors.New("backfill call to finalized failed"))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.New("backfill call to finalized failed")` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(nil, errors.New("failed to connect"))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.New("failed to connect")` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.AssertLogEventually(t, ht.observer, "Loaded chain from DB")` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Run(tc.Name, func(t *testing.T) { happyPathFD(t, tc.Opts) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewWithT(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewTestChainScopedConfig(t, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewORM(*testutils.FixtureChainID, db)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("SubscribeNewHead", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `. Return( func(ctx context.Context, ch chan<- *evmtypes.Head) ethereum.Subscription { sub := mockEth.NewSub(t) chchHeaders <- testutils.NewRawSub(ch, sub.Err()) return sub }, func(ctx context.Context, ch chan<- *evmtypes.Head) error { return nil }, )` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewSub(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewRawSub(ch, sub.Err())` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Err()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("HeadByNumber", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(testutils.Head(0), nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("HeadByHash", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(testutils.Head(0), nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.HeadTracker()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.TrySend(&evmtypes.Head{Number: 1, Hash: utils.NewHash(), EVMChainID: ubig.New(testutils.FixtureChainID)})` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewHash()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.New(testutils.FixtureChainID)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Eventually(checker.OnNewLongestChainCount)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Should(gomega.Equal(int32(1)))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Equal(int32(1))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Stop(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.OnNewLongestChainCount()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewWithT(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewTestChainScopedConfig(t, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewORM(*testutils.FixtureChainID, db)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("SubscribeNewHead", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `. Return( func(ctx context.Context, ch chan<- *evmtypes.Head) ethereum.Subscription { return mockEth.NewSub(t) }, func(ctx context.Context, ch chan<- *evmtypes.Head) error { return nil }, )` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewSub(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("SubscribeNewHead", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(nil, errors.New("cannot reconnect"))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.New("cannot reconnect")` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("SubscribeNewHead", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `. Return( func(ctx context.Context, ch chan<- *evmtypes.Head) ethereum.Subscription { return mockEth.NewSub(t) }, func(ctx context.Context, ch chan<- *evmtypes.Head) error { return nil }, )` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewSub(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("HeadByNumber", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(testutils.Head(0), nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.HeadTracker()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.SubsErr(errors.New("test error to force reconnect"))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.New("test error to force reconnect")` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Eventually(checker.OnNewLongestChainCount, 5*time.Second, tests.TestInterval)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Equal(int32(1))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewWithT(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewTestChainScopedConfig(t, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewORM(*testutils.FixtureChainID, db)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("SubscribeNewHead", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `. Return( func(ctx context.Context, ch chan<- *evmtypes.Head) ethereum.Subscription { sub := mockEth.NewSub(t) chchHeaders <- testutils.NewRawSub(ch, sub.Err()) return sub }, func(ctx context.Context, ch chan<- *evmtypes.Head) error { return nil }, )` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewSub(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewRawSub(ch, sub.Err())` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Err()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("HeadByNumber", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(testutils.Head(0), nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("HeadByHash", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(testutils.Head(0), nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.HeadTracker()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.TrySend(testutils.Head(1))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(1)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Eventually(func() bool { report := ht.headTracker.HealthReport() return !slices.ContainsFunc(maps.Values(report), func(e error) bool { return e != nil }) }, 5*time.Second, tests.TestInterval)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.headTracker.HealthReport()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ContainsFunc(maps.Values(report), func(e error) bool { return e != nil })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Values(report)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Should(gomega.Equal(true))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Equal(true)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.CloseCh()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Eventually(checker.OnNewLongestChainCount, 5*time.Second, tests.TestInterval)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Equal(int32(1))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewTestChainScopedConfig(t, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(1)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(2)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(3)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(heads[3], nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("HeadByNumber", mock.Anything, big.NewInt(0))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewInt(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(heads[0], nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("HeadByHash", mock.Anything, heads[2].Hash)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(heads[2], nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("HeadByHash", mock.Anything, heads[1].Hash)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(heads[1], nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("HeadByHash", mock.Anything, heads[0].Hash)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(heads[0], nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("SubscribeNewHead", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `. Return( func(ctx context.Context, ch chan<- *evmtypes.Head) ethereum.Subscription { sub := mockEth.NewSub(t) chchHeaders <- testutils.NewRawSub(ch, sub.Err()) return sub }, func(ctx context.Context, ch chan<- *evmtypes.Head) error { return nil }, )` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewSub(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewRawSub(ch, sub.Err())` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Err()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewORM(*testutils.FixtureChainID, db)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.HeadTracker()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.TrySend(testutils.Head(1))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(1)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewWithT(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Eventually(func() bool { report := ht.headTracker.HealthReport() services.CopyHealth(report, ht.headBroadcaster.HealthReport()) return !slices.ContainsFunc(maps.Values(report), func(e error) bool { return e != nil }) }, 5*time.Second, tests.TestInterval)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.headTracker.HealthReport()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.CopyHealth(report, ht.headBroadcaster.HealthReport())` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.headBroadcaster.HealthReport()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ContainsFunc(maps.Values(report), func(e error) bool { return e != nil })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Values(report)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Should(gomega.Equal(true))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Equal(true)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.LatestHead(tests.Context(t))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Context(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.FinalityDepth = ptr[uint32](50) // Need to set the buffer to something large since we inject a lot of heads at once and otherwise they will be dropped c.HeadTracker.MaxBufferSize = ptr[uint32](100) c.HeadTracker.SamplingInterval = commonconfig.MustNewDuration(2500 * time.Millisecond) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.MustNewDuration(2500 * time.Millisecond)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewORM(*config.EVM().ChainID(), db)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ChainID()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.HeadTracker()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("SubscribeNewHead", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `. Return( func(ctx context.Context, ch chan<- *evmtypes.Head) ethereum.Subscription { sub := mockEth.NewSub(t) chchHeaders <- testutils.NewRawSub(ch, sub.Err()) return sub }, func(ctx context.Context, ch chan<- *evmtypes.Head) error { return nil }, )` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewSub(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewRawSub(ch, sub.Err())` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Err()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(head0, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("HeadByNumber", mock.Anything, big.NewInt(0))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewInt(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(head0, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Append(blocks.Head(0))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Append(blocks.Head(1))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(1)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Append(blocks.Head(3))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(3)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Append(blocks.Head(2))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(2)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Append(blocks.Head(4))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(4)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Append(blocks.NewHead(4))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewHead(4)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ForkAt(t, 2, 5)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Append(blocksForked.Head(2))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(2)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Append(blocksForked.Head(3))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(3)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Append(blocksForked.Head(4))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(4)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Append(blocksForked.Head(5))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(5)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewAwaiter()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("OnNewLongestChain", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `. Run(func(args mock.Arguments) { h := args.Get(1).(*evmtypes.Head) assert.Equal(t, int64(5), h.Number) assert.Equal(t, blocksForked.Head(5).Hash, h.Hash) // This is the new longest chain, check that it came with its parents if !assert.NotNil(t, h.Parent) { return } assert.Equal(t, h.Parent.Hash, blocksForked.Head(4).Hash) if !assert.NotNil(t, h.Parent.Parent) { return } assert.Equal(t, h.Parent.Parent.Hash, blocksForked.Head(3).Hash) if !assert.NotNil(t, h.Parent.Parent.Parent) { return } assert.Equal(t, h.Parent.Parent.Parent.Hash, blocksForked.Head(2).Hash) if !assert.NotNil(t, h.Parent.Parent.Parent.Parent) { return } assert.Equal(t, h.Parent.Parent.Parent.Parent.Hash, blocksForked.Head(1).Hash) lastLongestChainAwaiter.ItHappened() })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Get(1)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ItHappened()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("HeadByHash", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Lock()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Unlock()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Get(1)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Lock()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Unlock()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.TrySend(h)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.AwaitOrFail(t, tests.WaitTimeout(t))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Stop(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.headSaver.Chain(h.Hash)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.FinalityDepth = ptr[uint32](50) // Need to set the buffer to something large since we inject a lot of heads at once and otherwise they will be dropped c.HeadTracker.MaxBufferSize = ptr[uint32](100) c.HeadTracker.SamplingInterval = commonconfig.MustNewDuration(0) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.MustNewDuration(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewORM(*testutils.FixtureChainID, db)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.HeadTracker()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("SubscribeNewHead", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `. Return( func(ctx context.Context, ch chan<- *evmtypes.Head) ethereum.Subscription { sub := mockEth.NewSub(t) chchHeaders <- testutils.NewRawSub(ch, sub.Err()) return sub }, func(ctx context.Context, ch chan<- *evmtypes.Head) error { return nil }, )` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewSub(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewRawSub(ch, sub.Err())` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Err()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(head0, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("HeadByNumber", mock.Anything, big.NewInt(0))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewInt(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(head0, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Append(blocks.Head(0))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Append(blocks.Head(1))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(1)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Append(blocks.Head(3))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(3)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Append(blocks.Head(2))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(2)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Append(blocks.Head(4))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(4)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Append(blocks.NewHead(4))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewHead(4)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ForkAt(t, 2, 5)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Append(blocksForked.Head(2))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(2)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Append(blocksForked.Head(3))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(3)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Append(blocksForked.Head(4))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(4)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Append(blocksForked.Head(5))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(5)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewAwaiter()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("OnNewLongestChain", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `. Run(func(args mock.Arguments) { h := args.Get(1).(*evmtypes.Head) require.Equal(t, int64(0), h.Number) require.Equal(t, blocks.Head(0).Hash, h.Hash) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Get(1)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("OnNewLongestChain", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `. Run(func(args mock.Arguments) { h := args.Get(1).(*evmtypes.Head) require.Equal(t, int64(1), h.Number) require.Equal(t, blocks.Head(1).Hash, h.Hash) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Get(1)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("OnNewLongestChain", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `. Run(func(args mock.Arguments) { h := args.Get(1).(*evmtypes.Head) require.Equal(t, int64(3), h.Number) require.Equal(t, blocks.Head(3).Hash, h.Hash) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Get(1)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("OnNewLongestChain", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `. Run(func(args mock.Arguments) { h := args.Get(1).(*evmtypes.Head) require.Equal(t, int64(4), h.Number) require.Equal(t, blocks.Head(4).Hash, h.Hash) // Check that the block came with its parents require.NotNil(t, h.Parent) require.Equal(t, h.Parent.Hash, blocks.Head(3).Hash) require.NotNil(t, h.Parent.Parent.Hash) require.Equal(t, h.Parent.Parent.Hash, blocks.Head(2).Hash) require.NotNil(t, h.Parent.Parent.Parent) require.Equal(t, h.Parent.Parent.Parent.Hash, blocks.Head(1).Hash) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Get(1)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("OnNewLongestChain", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `. Run(func(args mock.Arguments) { h := args.Get(1).(*evmtypes.Head) require.Equal(t, int64(5), h.Number) require.Equal(t, blocksForked.Head(5).Hash, h.Hash) // This is the new longest chain, check that it came with its parents require.NotNil(t, h.Parent) require.Equal(t, h.Parent.Hash, blocksForked.Head(4).Hash) require.NotNil(t, h.Parent.Parent) require.Equal(t, h.Parent.Parent.Hash, blocksForked.Head(3).Hash) require.NotNil(t, h.Parent.Parent.Parent) require.Equal(t, h.Parent.Parent.Parent.Hash, blocksForked.Head(2).Hash) require.NotNil(t, h.Parent.Parent.Parent.Parent) require.Equal(t, h.Parent.Parent.Parent.Parent.Hash, blocksForked.Head(1).Hash) lastLongestChainAwaiter.ItHappened() })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Get(1)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ItHappened()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Start(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("HeadByHash", mock.Anything, mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Maybe()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Lock()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Unlock()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Get(1)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Lock()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Unlock()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.TrySend(h)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Sleep(tests.TestInterval)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.AwaitOrFail(t, tests.WaitTimeout(t))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Stop(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.headSaver.Chain(h.Hash)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Now()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.UTC()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Unix()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewInt(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.BigToHash(big.NewInt(0))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewInt(0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewHead(gethHead0.Number, utils.NewHash(), gethHead0.ParentHash, gethHead0.Time, ubig.New(testutils.FixtureChainID))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewHash()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.New(testutils.FixtureChainID)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(1)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewInt(8)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewHash()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewHead(gethHead8.Number, utils.NewHash(), gethHead8.ParentHash, gethHead8.Time, ubig.New(testutils.FixtureChainID))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewHash()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.New(testutils.FixtureChainID)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(9)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewInt(10)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewHead(gethHead10.Number, utils.NewHash(), gethHead10.ParentHash, gethHead10.Time, ubig.New(testutils.FixtureChainID))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewHash()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.New(testutils.FixtureChainID)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(11)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(12)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(13)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(14)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(14)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Head(15)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Context(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewTestChainScopedConfig(t, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewORM(*testutils.FixtureChainID, db)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.NewEthClientMock(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.On("ConfiguredChainID", mock.Anything)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(evmcfg.EVM().ChainID(), nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ChainID()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.EVM()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.HeadTracker()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.headSaver.Load(tests.Context(t), 0)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Context(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Run("returns error if latestFinalized is not valid", func(t *testing.T) { htu := newHeadTrackerUniverse(t, opts{}) err := htu.headTracker.Backfill(ctx, &h12, nil) require.EqualError(t, err, "can not perform backfill without a valid latestFinalized head") })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.headTracker.Backfill(ctx, &h12, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Run("Returns error if finalized head is ahead of canonical", func(t *testing.T) { htu := newHeadTrackerUniverse(t, opts{}) err := htu.headTracker.Backfill(ctx, &h12, &h14Orphaned) require.EqualError(t, err, "invariant violation: expected head of canonical chain to be ahead of the latestFinalized") })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.headTracker.Backfill(ctx, &h12, &h14Orphaned)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Run("Returns error if finalizedHead is not present in the canonical chain", func(t *testing.T) { htu := newHeadTrackerUniverse(t, opts{Heads: heads}) err := htu.headTracker.Backfill(ctx, &h15, &h14Orphaned) require.EqualError(t, err, "expected finalized block to be present in canonical chain") })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.headTracker.Backfill(ctx, &h15, &h14Orphaned)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Run("Marks all blocks in chain that are older than finalized", func(t *testing.T) { htu := newHeadTrackerUniverse(t, opts{Heads: heads}) assertFinalized := func(expectedFinalized bool, msg string, heads ...evmtypes.Head) { for _, h := range heads { storedHead := htu.headSaver.Chain(h.Hash) assert.Equal(t, expectedFinalized, storedHead != nil && storedHead.IsFinalized, msg, "block_number", h.Number) } } err := htu.headTracker.Backfill(ctx, &h15, &h14) require.NoError(t, err) assertFinalized(true, "expected heads to be marked as finalized after backfill", h14, h13, h12, h11) assertFinalized(false, "expected heads to remain unfinalized", h15, head10) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.headSaver.Chain(h.Hash)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.headTracker.Backfill(ctx, &h15, &h14)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Run("fetches a missing head", func(t *testing.T) { htu := newHeadTrackerUniverse(t, opts{Heads: heads}) htu.ethClient.On("HeadByHash", mock.Anything, head10.Hash). Return(&head10, nil) err := htu.headTracker.Backfill(ctx, &h12, &h9) require.NoError(t, err) h := htu.headSaver.Chain(h12.Hash) assert.Equal(t, int64(12), h.Number) require.NotNil(t, h.Parent) assert.Equal(t, int64(11), h.Parent.Number) require.NotNil(t, h.Parent.Parent) assert.Equal(t, int64(10), h.Parent.Parent.Number) require.NotNil(t, h.Parent.Parent.Parent) assert.Equal(t, int64(9), h.Parent.Parent.Parent.Number) writtenHead, err := htu.orm.HeadByHash(tests.Context(t), head10.Hash) require.NoError(t, err) assert.Equal(t, int64(10), writtenHead.Number) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("HeadByHash", mock.Anything, head10.Hash)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `. Return(&head10, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.headTracker.Backfill(ctx, &h12, &h9)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.headSaver.Chain(h12.Hash)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.orm.HeadByHash(tests.Context(t), head10.Hash)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Context(t)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Run("fetches only heads that are missing", func(t *testing.T) { htu := newHeadTrackerUniverse(t, opts{Heads: heads}) htu.ethClient.On("HeadByHash", mock.Anything, head10.Hash). Return(&head10, nil) htu.ethClient.On("HeadByHash", mock.Anything, head8.Hash). Return(&head8, nil) err := htu.headTracker.Backfill(ctx, &h15, &head8) require.NoError(t, err) h := htu.headSaver.Chain(h15.Hash) require.Equal(t, uint32(8), h.ChainLength()) earliestInChain := h.EarliestInChain() assert.Equal(t, head8.Number, earliestInChain.BlockNumber()) assert.Equal(t, head8.Hash, earliestInChain.BlockHash()) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("HeadByHash", mock.Anything, head10.Hash)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `. Return(&head10, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("HeadByHash", mock.Anything, head8.Hash)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `. Return(&head8, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.headTracker.Backfill(ctx, &h15, &head8)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.headSaver.Chain(h15.Hash)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.EarliestInChain()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Run("abandons backfill and returns error if the eth node returns not found", func(t *testing.T) { htu := newHeadTrackerUniverse(t, opts{Heads: heads}) htu.ethClient.On("HeadByHash", mock.Anything, head10.Hash). Return(&head10, nil). Once() htu.ethClient.On("HeadByHash", mock.Anything, head8.Hash). Return(nil, ethereum.NotFound). Once() err := htu.headTracker.Backfill(ctx, &h12, &head8) require.Error(t, err) require.EqualError(t, err, "fetchAndSaveHead failed: not found") h := htu.headSaver.Chain(h12.Hash) // Should contain 12, 11, 10, 9 assert.Equal(t, 4, int(h.ChainLength())) assert.Equal(t, int64(9), h.EarliestInChain().BlockNumber()) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("HeadByHash", mock.Anything, head10.Hash)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `. Return(&head10, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `. Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("HeadByHash", mock.Anything, head8.Hash)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `. Return(nil, ethereum.NotFound)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `. Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.headTracker.Backfill(ctx, &h12, &head8)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.headSaver.Chain(h12.Hash)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Run("abandons backfill and returns error if the context time budget is exceeded", func(t *testing.T) { htu := newHeadTrackerUniverse(t, opts{Heads: heads}) htu.ethClient.On("HeadByHash", mock.Anything, head10.Hash). Return(&head10, nil) lctx, cancel := context.WithCancel(ctx) htu.ethClient.On("HeadByHash", mock.Anything, head8.Hash). Return(nil, context.DeadlineExceeded).Run(func(args mock.Arguments) { cancel() }) err := htu.headTracker.Backfill(lctx, &h12, &head8) require.Error(t, err) require.EqualError(t, err, "fetchAndSaveHead failed: context canceled") h := htu.headSaver.Chain(h12.Hash) // Should contain 12, 11, 10, 9 assert.Equal(t, 4, int(h.ChainLength())) assert.Equal(t, int64(9), h.EarliestInChain().BlockNumber()) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("HeadByHash", mock.Anything, head10.Hash)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `. Return(&head10, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.WithCancel(ctx)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("HeadByHash", mock.Anything, head8.Hash)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `. Return(nil, context.DeadlineExceeded)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Run(func(args mock.Arguments) { cancel() })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.headTracker.Backfill(lctx, &h12, &head8)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.headSaver.Chain(h12.Hash)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Run("abandons backfill and returns error when fetching a block by hash fails, indicating a reorg", func(t *testing.T) { htu := newHeadTrackerUniverse(t, opts{}) htu.ethClient.On("HeadByHash", mock.Anything, h14.Hash).Return(&h14, nil).Once() htu.ethClient.On("HeadByHash", mock.Anything, h13.Hash).Return(&h13, nil).Once() htu.ethClient.On("HeadByHash", mock.Anything, h12.Hash).Return(nil, errors.New("not found")).Once() err := htu.headTracker.Backfill(ctx, &h15, &h11) require.Error(t, err) require.EqualError(t, err, "fetchAndSaveHead failed: not found") h := htu.headSaver.Chain(h14.Hash) // Should contain 14, 13 (15 was never added). When trying to get the parent of h13 by hash, a reorg happened and backfill exited. assert.Equal(t, 2, int(h.ChainLength())) assert.Equal(t, int64(13), h.EarliestInChain().BlockNumber()) })` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("HeadByHash", mock.Anything, h14.Hash)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(&h14, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("HeadByHash", mock.Anything, h13.Hash)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(&h13, nil)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.ethClient.On("HeadByHash", mock.Anything, h12.Hash)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Return(nil, errors.New("not found"))` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.New("not found")` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.Once()` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.headTracker.Backfill(ctx, &h15, &h11)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.headSaver.Chain(h14.Hash)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.headTracker.Backfill(ctx, &h15, &finalizedH15)` $DIR/core/chains/evm/headtracker/head_tracker_test.go: `.headSaver.LatestChain()` $DIR/core/chains/evm/headtracker/heads_test.go: `heads.AddHeads(testutils.Head(100), testutils.Head(200), testutils.Head(300))` $DIR/core/chains/evm/headtracker/heads_test.go: `heads.AddHeads(testutils.Head(250))` $DIR/core/chains/evm/headtracker/heads_test.go: `latest = heads.LatestHead()` $DIR/core/chains/evm/headtracker/heads_test.go: `heads.AddHeads(testutils.Head(400))` $DIR/core/chains/evm/headtracker/heads_test.go: `latest = heads.LatestHead()` $DIR/core/chains/evm/headtracker/heads_test.go: `heads.AddHeads(testHeads...)` $DIR/core/chains/evm/headtracker/heads_test.go: `head = heads.HeadByHash(utils.NewHash())` $DIR/core/chains/evm/headtracker/heads_test.go: `heads.AddHeads(testutils.Head(100), testutils.Head(200), testutils.Head(300))` $DIR/core/chains/evm/headtracker/heads_test.go: `heads.AddHeads(testutils.Head(400))` $DIR/core/chains/evm/headtracker/heads_test.go: `testHeads = append(testHeads, &h)` $DIR/core/chains/evm/headtracker/heads_test.go: `testHeads = append(testHeads, &h)` $DIR/core/chains/evm/headtracker/heads_test.go: `parentHash = hash` $DIR/core/chains/evm/headtracker/heads_test.go: `heads.AddHeads(testHeads...)` $DIR/core/chains/evm/headtracker/heads_test.go: `heads.AddHeads(testHeads[2:5]...)` $DIR/core/chains/evm/headtracker/heads_test.go: `head = heads.HeadByHash(uncleHash)` $DIR/core/chains/evm/headtracker/heads_test.go: `heads.AddHeads(allHeads...)` $DIR/core/chains/evm/headtracker/heads_test.go: `t.Helper()` $DIR/core/chains/evm/headtracker/heads_test.go: `t.Run("blocks were correctly marked as finalized", ensureProperFinalization)` $DIR/core/chains/evm/headtracker/heads_test.go: `heads.AddHeads(h0, h1, h2, h2Uncle, h3, h4, h5)` $DIR/core/chains/evm/headtracker/heads_test.go: `.NewHeads()` $DIR/core/chains/evm/headtracker/heads_test.go: `.AddHeads(testutils.Head(100), testutils.Head(200), testutils.Head(300))` $DIR/core/chains/evm/headtracker/heads_test.go: `.Head(100)` $DIR/core/chains/evm/headtracker/heads_test.go: `.Head(200)` $DIR/core/chains/evm/headtracker/heads_test.go: `.Head(300)` $DIR/core/chains/evm/headtracker/heads_test.go: `.LatestHead()` $DIR/core/chains/evm/headtracker/heads_test.go: `.AddHeads(testutils.Head(250))` $DIR/core/chains/evm/headtracker/heads_test.go: `.Head(250)` $DIR/core/chains/evm/headtracker/heads_test.go: `.LatestHead()` $DIR/core/chains/evm/headtracker/heads_test.go: `.AddHeads(testutils.Head(400))` $DIR/core/chains/evm/headtracker/heads_test.go: `.Head(400)` $DIR/core/chains/evm/headtracker/heads_test.go: `.LatestHead()` $DIR/core/chains/evm/headtracker/heads_test.go: `.Head(100)` $DIR/core/chains/evm/headtracker/heads_test.go: `.Head(200)` $DIR/core/chains/evm/headtracker/heads_test.go: `.Head(300)` $DIR/core/chains/evm/headtracker/heads_test.go: `.NewHeads()` $DIR/core/chains/evm/headtracker/heads_test.go: `.AddHeads(testHeads...)` $DIR/core/chains/evm/headtracker/heads_test.go: `.HeadByHash(testHeads[1].Hash)` $DIR/core/chains/evm/headtracker/heads_test.go: `.HeadByHash(utils.NewHash())` $DIR/core/chains/evm/headtracker/heads_test.go: `.NewHash()` $DIR/core/chains/evm/headtracker/heads_test.go: `.NewHeads()` $DIR/core/chains/evm/headtracker/heads_test.go: `.AddHeads(testutils.Head(100), testutils.Head(200), testutils.Head(300))` $DIR/core/chains/evm/headtracker/heads_test.go: `.Head(100)` $DIR/core/chains/evm/headtracker/heads_test.go: `.Head(200)` $DIR/core/chains/evm/headtracker/heads_test.go: `.Head(300)` $DIR/core/chains/evm/headtracker/heads_test.go: `.AddHeads(testutils.Head(400))` $DIR/core/chains/evm/headtracker/heads_test.go: `.Head(400)` $DIR/core/chains/evm/headtracker/heads_test.go: `.Count()` $DIR/core/chains/evm/headtracker/heads_test.go: `.NewHash()` $DIR/core/chains/evm/headtracker/heads_test.go: `.NewHeads()` $DIR/core/chains/evm/headtracker/heads_test.go: `.NewHash()` $DIR/core/chains/evm/headtracker/heads_test.go: `.NewHead(big.NewInt(int64(i)), hash, parentHash, uint64(time.Now().Unix()), ubig.NewI(0))` $DIR/core/chains/evm/headtracker/heads_test.go: `.NewInt(int64(i))` $DIR/core/chains/evm/headtracker/heads_test.go: `.Now()` $DIR/core/chains/evm/headtracker/heads_test.go: `.Unix()` $DIR/core/chains/evm/headtracker/heads_test.go: `.NewI(0)` $DIR/core/chains/evm/headtracker/heads_test.go: `.NewHead(big.NewInt(int64(i)), uncleHash, parentHash, uint64(time.Now().Unix()), ubig.NewI(0))` $DIR/core/chains/evm/headtracker/heads_test.go: `.NewInt(int64(i))` $DIR/core/chains/evm/headtracker/heads_test.go: `.Now()` $DIR/core/chains/evm/headtracker/heads_test.go: `.Unix()` $DIR/core/chains/evm/headtracker/heads_test.go: `.NewI(0)` $DIR/core/chains/evm/headtracker/heads_test.go: `.AddHeads(testHeads...)` $DIR/core/chains/evm/headtracker/heads_test.go: `.AddHeads(testHeads[2:5]...)` $DIR/core/chains/evm/headtracker/heads_test.go: `.LatestHead()` $DIR/core/chains/evm/headtracker/heads_test.go: `.HeadByHash(uncleHash)` $DIR/core/chains/evm/headtracker/heads_test.go: `.ChainLength()` $DIR/core/chains/evm/headtracker/heads_test.go: `.NewHeads()` $DIR/core/chains/evm/headtracker/heads_test.go: `.NewHead(big.NewInt(int64(num)), utils.NewHash(), parent, uint64(time.Now().Unix()), ubig.NewI(0))` $DIR/core/chains/evm/headtracker/heads_test.go: `.NewInt(int64(num))` $DIR/core/chains/evm/headtracker/heads_test.go: `.NewHash()` $DIR/core/chains/evm/headtracker/heads_test.go: `.Now()` $DIR/core/chains/evm/headtracker/heads_test.go: `.Unix()` $DIR/core/chains/evm/headtracker/heads_test.go: `.NewI(0)` $DIR/core/chains/evm/headtracker/heads_test.go: `.NewHash()` $DIR/core/chains/evm/headtracker/heads_test.go: `.AddHeads(allHeads...)` $DIR/core/chains/evm/headtracker/heads_test.go: `.Helper()` $DIR/core/chains/evm/headtracker/heads_test.go: `.Run("blocks were correctly marked as finalized", ensureProperFinalization)` $DIR/core/chains/evm/headtracker/heads_test.go: `.AddHeads(h0, h1, h2, h2Uncle, h3, h4, h5)` $DIR/core/chains/evm/headtracker/orm_test.go: `foundHead, err = orm.LatestHead(tests.Context(t))` $DIR/core/chains/evm/headtracker/orm_test.go: `hash = head.Hash` $DIR/core/chains/evm/headtracker/orm_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/headtracker/orm_test.go: `.NewORM(*testutils.FixtureChainID, db)` $DIR/core/chains/evm/headtracker/orm_test.go: `.Head(0)` $DIR/core/chains/evm/headtracker/orm_test.go: `.LatestHead(tests.Context(t))` $DIR/core/chains/evm/headtracker/orm_test.go: `.Context(t)` $DIR/core/chains/evm/headtracker/orm_test.go: `.LatestHead(tests.Context(t))` $DIR/core/chains/evm/headtracker/orm_test.go: `.Context(t)` $DIR/core/chains/evm/headtracker/orm_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/headtracker/orm_test.go: `.NewORM(*testutils.FixtureChainID, db)` $DIR/core/chains/evm/headtracker/orm_test.go: `.Head(i)` $DIR/core/chains/evm/headtracker/orm_test.go: `.Head(5)` $DIR/core/chains/evm/headtracker/orm_test.go: `.TrimOldHeads(tests.Context(t), 5)` $DIR/core/chains/evm/headtracker/orm_test.go: `.Context(t)` $DIR/core/chains/evm/headtracker/orm_test.go: `.LatestHeads(tests.Context(t), 0)` $DIR/core/chains/evm/headtracker/orm_test.go: `.Context(t)` $DIR/core/chains/evm/headtracker/orm_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/headtracker/orm_test.go: `.NewORM(*testutils.FixtureChainID, db)` $DIR/core/chains/evm/headtracker/orm_test.go: `.Head(i)` $DIR/core/chains/evm/headtracker/orm_test.go: `.HeadByHash(tests.Context(t), hash)` $DIR/core/chains/evm/headtracker/orm_test.go: `.Context(t)` $DIR/core/chains/evm/headtracker/orm_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/headtracker/orm_test.go: `.NewORM(*testutils.FixtureChainID, db)` $DIR/core/chains/evm/headtracker/orm_test.go: `.Head(123)` $DIR/core/chains/evm/headtracker/orm_test.go: `.HeadByHash(tests.Context(t), hash)` $DIR/core/chains/evm/headtracker/orm_test.go: `.Context(t)` $DIR/core/chains/evm/headtracker/orm_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/headtracker/orm_test.go: `.NewORM(*testutils.FixtureChainID, db)` $DIR/core/chains/evm/headtracker/orm_test.go: `.LatestHeads(tests.Context(t), 100)` $DIR/core/chains/evm/headtracker/orm_test.go: `.Context(t)` $DIR/core/chains/evm/log/integration_test.go: `helper.lb.AddDependents(2)` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener, newMockContract(t), 1)` $DIR/core/chains/evm/log/integration_test.go: `helper.start()` $DIR/core/chains/evm/log/integration_test.go: `g.Consistently(func() int32 { return helper.mockEth.SubscribeCallCount() }, 1*time.Second, cltest.DBPollingInterval).Should(gomega.Equal(int32(0)))` $DIR/core/chains/evm/log/integration_test.go: `helper.lb.DependentReady()` $DIR/core/chains/evm/log/integration_test.go: `g.Consistently(func() int32 { return helper.mockEth.SubscribeCallCount() }, 1*time.Second, cltest.DBPollingInterval).Should(gomega.Equal(int32(0)))` $DIR/core/chains/evm/log/integration_test.go: `helper.lb.DependentReady()` $DIR/core/chains/evm/log/integration_test.go: `g.Consistently(func() int32 { return helper.mockEth.SubscribeCallCount() }, 1*time.Second, cltest.DBPollingInterval).Should(gomega.Equal(int32(1)))` $DIR/core/chains/evm/log/integration_test.go: `helper.unsubscribeAll()` $DIR/core/chains/evm/log/integration_test.go: `testutils.SkipShortDB(t)` $DIR/core/chains/evm/log/integration_test.go: `helper.mockEth = mockEth` $DIR/core/chains/evm/log/integration_test.go: `backfillCount.Store(1)` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener, newMockContract(t), numConfirmations)` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener, newMockContract(t), 1)` $DIR/core/chains/evm/log/integration_test.go: `helper.start()` $DIR/core/chains/evm/log/integration_test.go: `gomega.NewWithT(t).Consistently(func() int32 { return helper.mockEth.SubscribeCallCount() }, 1*time.Second, cltest.DBPollingInterval).Should(gomega.Equal(int32(1)))` $DIR/core/chains/evm/log/integration_test.go: `gomega.NewWithT(t).Consistently(func() int32 { return helper.mockEth.UnsubscribeCallCount() }, 1*time.Second, cltest.DBPollingInterval).Should(gomega.Equal(int32(0)))` $DIR/core/chains/evm/log/integration_test.go: `helper.unsubscribeAll()` $DIR/core/chains/evm/log/integration_test.go: `backfillCount.Store(2)` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listenerLast, newMockContract(t), 1)` $DIR/core/chains/evm/log/integration_test.go: `gomega.NewWithT(t).Consistently(func() int32 { return helper.mockEth.SubscribeCallCount() }, 1*time.Second, cltest.DBPollingInterval).Should(gomega.Equal(int32(2)))` $DIR/core/chains/evm/log/integration_test.go: `gomega.NewWithT(t).Consistently(func() int32 { return helper.mockEth.UnsubscribeCallCount() }, 1*time.Second, cltest.DBPollingInterval).Should(gomega.Equal(int32(1)))` $DIR/core/chains/evm/log/integration_test.go: `testutils.SkipShortDB(t)` $DIR/core/chains/evm/log/integration_test.go: `helper.mockEth = mockEth` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener, newMockContract(t), uint32(maxNumConfirmations))` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener2, newMockContract(t), uint32(2))` $DIR/core/chains/evm/log/integration_test.go: `func() { helper.start() defer helper.stop() require.Eventually(t, func() bool { return helper.mockEth.SubscribeCallCount() == 1 }, testutils.WaitTimeout(t), time.Second) require.Eventually(t, func() bool { return backfillCount.Load() == 1 }, testutils.WaitTimeout(t), time.Second) helper.lb.ReplayFromBlock(replayFrom, false) require.Eventually(t, func() bool { return backfillCount.Load() >= 2 }, testutils.WaitTimeout(t), time.Second) }()` $DIR/core/chains/evm/log/integration_test.go: `helper.start()` $DIR/core/chains/evm/log/integration_test.go: `helper.lb.ReplayFromBlock(replayFrom, false)` $DIR/core/chains/evm/log/integration_test.go: `testutils.SkipShortDB(t)` $DIR/core/chains/evm/log/integration_test.go: `helper.mockEth = mockEth` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener, contract, 2)` $DIR/core/chains/evm/log/integration_test.go: `func() { helper.start() defer helper.stop() // To start, no logs are sent require.Eventually(t, func() bool { return len(listener.getUniqueLogs()) == 0 }, testutils.WaitTimeout(t), time.Second, "expected unique logs to be 0 but was %d", len(listener.getUniqueLogs())) // Replay from block 2, the logs should be delivered. An incoming head must be simulated to // trigger log delivery. helper.lb.ReplayFromBlock(2, false) <-cltest.SimulateIncomingHeads(t, blocks.Slice(10, 11), helper.lb) require.Eventually(t, func() bool { return len(listener.getUniqueLogs()) == 2 }, testutils.WaitTimeout(t), time.Second, "expected unique logs to be 2 but was %d", len(listener.getUniqueLogs())) // Replay again, the logs are already marked consumed, so they should not be included in // getUniqueLogs. helper.lb.ReplayFromBlock(2, false) <-cltest.SimulateIncomingHeads(t, blocks.Slice(11, 12), helper.lb) require.Eventually(t, func() bool { return len(listener.getUniqueLogs()) == 2 }, testutils.WaitTimeout(t), time.Second, "expected unique logs to be 2 but was %d", len(listener.getUniqueLogs())) // Replay again with forceBroadcast. The logs are consumed again. helper.lb.ReplayFromBlock(2, true) <-cltest.SimulateIncomingHeads(t, blocks.Slice(12, 13), helper.lb) require.Eventually(t, func() bool { return len(listener.getUniqueLogs()) == 4 }, testutils.WaitTimeout(t), time.Second, "expected unique logs to be 4 but was %d", len(listener.getUniqueLogs())) }()` $DIR/core/chains/evm/log/integration_test.go: `helper.start()` $DIR/core/chains/evm/log/integration_test.go: `helper.lb.ReplayFromBlock(2, false)` $DIR/core/chains/evm/log/integration_test.go: `<-cltest.SimulateIncomingHeads(t, blocks.Slice(10, 11), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `helper.lb.ReplayFromBlock(2, false)` $DIR/core/chains/evm/log/integration_test.go: `<-cltest.SimulateIncomingHeads(t, blocks.Slice(11, 12), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `helper.lb.ReplayFromBlock(2, true)` $DIR/core/chains/evm/log/integration_test.go: `<-cltest.SimulateIncomingHeads(t, blocks.Slice(12, 13), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `t.Run("pool two logs from subscription, then shut down", func(t *testing.T) { helper := newBroadcasterHelper(t, 0, 1, logs, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].FinalityDepth = ptr[uint32](confs) }) ctx := testutils.Context(t) orm := log.NewORM(helper.db, cltest.FixtureChainID) listener := helper.newLogListenerWithJob("one") listener.SkipMarkingConsumed(true) listener2 := helper.newLogListenerWithJob("two") listener2.SkipMarkingConsumed(true) expBlock := int64(log1.BlockNumber) helper.simulateHeads(t, listener, listener2, contract1, contract2, confs, blocks.Slice(0, 2), orm, &expBlock, func() { chRawLogs := <-helper.chchRawLogs chRawLogs.TrySend(log1) chRawLogs.TrySend(log2) }) // Pool min block in DB and neither listener received a broadcast blockNum, err := orm.GetPendingMinBlock(ctx) require.NoError(t, err) require.NotNil(t, blockNum) require.Equal(t, int64(log1.BlockNumber), *blockNum) require.Empty(t, listener.getUniqueLogs()) require.Empty(t, listener2.getUniqueLogs()) helper.requireBroadcastCount(0) })` $DIR/core/chains/evm/log/integration_test.go: `c.EVM[0].FinalityDepth = ptr[uint32](confs)` $DIR/core/chains/evm/log/integration_test.go: `listener.SkipMarkingConsumed(true)` $DIR/core/chains/evm/log/integration_test.go: `listener2.SkipMarkingConsumed(true)` $DIR/core/chains/evm/log/integration_test.go: `helper.simulateHeads(t, listener, listener2, contract1, contract2, confs, blocks.Slice(0, 2), orm, &expBlock, func() { chRawLogs := <-helper.chchRawLogs chRawLogs.TrySend(log1) chRawLogs.TrySend(log2) })` $DIR/core/chains/evm/log/integration_test.go: `chRawLogs.TrySend(log1)` $DIR/core/chains/evm/log/integration_test.go: `chRawLogs.TrySend(log2)` $DIR/core/chains/evm/log/integration_test.go: `helper.requireBroadcastCount(0)` $DIR/core/chains/evm/log/integration_test.go: `t.Run("backfill pool with both, then broadcast one, but don't consume", func(t *testing.T) { helper := newBroadcasterHelper(t, 2, 1, logs, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].FinalityDepth = ptr[uint32](confs) }) ctx := testutils.Context(t) orm := log.NewORM(helper.db, cltest.FixtureChainID) contract1.On("ParseLog", log1).Return(flux_aggregator_wrapper.FluxAggregatorNewRound{}, nil) contract2.On("ParseLog", log2).Return(flux_aggregator_wrapper.FluxAggregatorAnswerUpdated{}, nil) listener := helper.newLogListenerWithJob("one") listener.SkipMarkingConsumed(true) listener2 := helper.newLogListenerWithJob("two") listener2.SkipMarkingConsumed(true) expBlock := int64(log2.BlockNumber) helper.simulateHeads(t, listener, listener2, contract1, contract2, confs, blocks.Slice(2, 5), orm, &expBlock, nil) // Pool min block in DB and one listener received but didn't consume blockNum, err := orm.GetPendingMinBlock(ctx) require.NoError(t, err) require.NotNil(t, blockNum) require.Equal(t, int64(log2.BlockNumber), *blockNum) require.NotEmpty(t, listener.getUniqueLogs()) require.Empty(t, listener2.getUniqueLogs()) c, err := orm.WasBroadcastConsumed(ctx, log1.BlockHash, log1.Index, listener.JobID()) require.NoError(t, err) require.False(t, c) })` $DIR/core/chains/evm/log/integration_test.go: `c.EVM[0].FinalityDepth = ptr[uint32](confs)` $DIR/core/chains/evm/log/integration_test.go: `contract1.On("ParseLog", log1).Return(flux_aggregator_wrapper.FluxAggregatorNewRound{}, nil)` $DIR/core/chains/evm/log/integration_test.go: `contract2.On("ParseLog", log2).Return(flux_aggregator_wrapper.FluxAggregatorAnswerUpdated{}, nil)` $DIR/core/chains/evm/log/integration_test.go: `listener.SkipMarkingConsumed(true)` $DIR/core/chains/evm/log/integration_test.go: `listener2.SkipMarkingConsumed(true)` $DIR/core/chains/evm/log/integration_test.go: `helper.simulateHeads(t, listener, listener2, contract1, contract2, confs, blocks.Slice(2, 5), orm, &expBlock, nil)` $DIR/core/chains/evm/log/integration_test.go: `t.Run("backfill pool and broadcast two, but only consume one", func(t *testing.T) { helper := newBroadcasterHelper(t, 4, 1, logs, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].FinalityDepth = ptr[uint32](confs) }) ctx := testutils.Context(t) orm := log.NewORM(helper.db, cltest.FixtureChainID) listener := helper.newLogListenerWithJob("one") listener2 := helper.newLogListenerWithJob("two") listener2.SkipMarkingConsumed(true) helper.simulateHeads(t, listener, listener2, contract1, contract2, confs, blocks.Slice(5, 8), orm, nil, nil) // Pool empty and one consumed but other didn't blockNum, err := orm.GetPendingMinBlock(ctx) require.NoError(t, err) require.Nil(t, blockNum) require.NotEmpty(t, listener.getUniqueLogs()) require.NotEmpty(t, listener2.getUniqueLogs()) c, err := orm.WasBroadcastConsumed(ctx, log1.BlockHash, log1.Index, listener.JobID()) require.NoError(t, err) require.True(t, c) c, err = orm.WasBroadcastConsumed(ctx, log2.BlockHash, log2.Index, listener2.JobID()) require.NoError(t, err) require.False(t, c) })` $DIR/core/chains/evm/log/integration_test.go: `c.EVM[0].FinalityDepth = ptr[uint32](confs)` $DIR/core/chains/evm/log/integration_test.go: `listener2.SkipMarkingConsumed(true)` $DIR/core/chains/evm/log/integration_test.go: `helper.simulateHeads(t, listener, listener2, contract1, contract2, confs, blocks.Slice(5, 8), orm, nil, nil)` $DIR/core/chains/evm/log/integration_test.go: `c, err = orm.WasBroadcastConsumed(ctx, log2.BlockHash, log2.Index, listener2.JobID())` $DIR/core/chains/evm/log/integration_test.go: `c.EVM[0].FinalityDepth = ptr[uint32](confs)` $DIR/core/chains/evm/log/integration_test.go: `helper.simulateHeads(t, listener, listener2, contract1, contract2, confs, blocks.Slice(8, 9), orm, nil, nil)` $DIR/core/chains/evm/log/integration_test.go: `testutils.SkipShortDB(t)` $DIR/core/chains/evm/log/integration_test.go: `c.EVM[0].BlockBackfillSkip = ptr(true)` $DIR/core/chains/evm/log/integration_test.go: `c.EVM[0].BlockBackfillDepth = ptr[uint32](15)` $DIR/core/chains/evm/log/integration_test.go: `helper.mockEth = mockEth` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener, newMockContract(t), uint32(10))` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener2, newMockContract(t), uint32(2))` $DIR/core/chains/evm/log/integration_test.go: `backfillCount.Store(1)` $DIR/core/chains/evm/log/integration_test.go: `func() { helper.start() defer helper.stop() require.Eventually(t, func() bool { return helper.mockEth.SubscribeCallCount() == 1 }, testutils.WaitTimeout(t), time.Second) require.Eventually(t, func() bool { return backfillCount.Load() == 1 }, testutils.WaitTimeout(t), time.Second) }()` $DIR/core/chains/evm/log/integration_test.go: `helper.start()` $DIR/core/chains/evm/log/integration_test.go: `testutils.SkipShortDB(t)` $DIR/core/chains/evm/log/integration_test.go: `c.EVM[0].LogBackfillBatchSize = ptr(uint32(batchSize))` $DIR/core/chains/evm/log/integration_test.go: `helper.mockEth = mockEth` $DIR/core/chains/evm/log/integration_test.go: `lggr.Infof("Log Batch: --------- times %v - %v, %v", times, fromBlock, toBlock)` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener, newMockContract(t), numConfirmations)` $DIR/core/chains/evm/log/integration_test.go: `helper.start()` $DIR/core/chains/evm/log/integration_test.go: `helper.unsubscribeAll()` $DIR/core/chains/evm/log/integration_test.go: `testutils.SkipShortDB(t)` $DIR/core/chains/evm/log/integration_test.go: `backfilledLogs = append(backfilledLogs, aLog)` $DIR/core/chains/evm/log/integration_test.go: `c.EVM[0].LogBackfillBatchSize = ptr(batchSize)` $DIR/core/chains/evm/log/integration_test.go: `helper.mockEth = mockEth` $DIR/core/chains/evm/log/integration_test.go: `lggr.Warnf("Log Batch: --------- times %v - %v, %v", times, fromBlock, toBlock)` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener, newMockContract(t), 1)` $DIR/core/chains/evm/log/integration_test.go: `helper.start()` $DIR/core/chains/evm/log/integration_test.go: `g.Eventually(func() int64 { return backfillCount.Load() }, testutils.WaitTimeout(t), time.Second).Should(gomega.Equal(int64(expectedBatches)))` $DIR/core/chains/evm/log/integration_test.go: `helper.unsubscribeAll()` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener1, contract1, 1)` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener2, contract1, 1)` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener3, contract2, 1)` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener4, contract2, 1)` $DIR/core/chains/evm/log/integration_test.go: `helper.start()` $DIR/core/chains/evm/log/integration_test.go: `chRawLogs.TrySend(log)` $DIR/core/chains/evm/log/integration_test.go: `chRawLogs.TrySend(log)` $DIR/core/chains/evm/log/integration_test.go: `<-headsDone` $DIR/core/chains/evm/log/integration_test.go: `helper.requireBroadcastCount(12)` $DIR/core/chains/evm/log/integration_test.go: `requireEqualLogs(t, addr1SentLogs, listener1.received.getUniqueLogs())` $DIR/core/chains/evm/log/integration_test.go: `requireEqualLogs(t, addr1SentLogs, listener2.received.getUniqueLogs())` $DIR/core/chains/evm/log/integration_test.go: `requireEqualLogs(t, addr2SentLogs, listener3.received.getUniqueLogs())` $DIR/core/chains/evm/log/integration_test.go: `requireEqualLogs(t, addr2SentLogs, listener4.received.getUniqueLogs())` $DIR/core/chains/evm/log/integration_test.go: `helper.start()` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener1, contract1, 1)` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener2, contract1, 8)` $DIR/core/chains/evm/log/integration_test.go: `_ = cltest.SimulateIncomingHeads(t, blocks.Slice(0, 10), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `chRawLogs.TrySend(log)` $DIR/core/chains/evm/log/integration_test.go: `helper.requireBroadcastCount(5)` $DIR/core/chains/evm/log/integration_test.go: `helper.stop()` $DIR/core/chains/evm/log/integration_test.go: `requireEqualLogs(t, addr1SentLogs, listener1.received.getUniqueLogs(), )` $DIR/core/chains/evm/log/integration_test.go: `requireEqualLogs(t, []types.Log{ addr1SentLogs[0], addr1SentLogs[1], }, listener2.received.getUniqueLogs(), )` $DIR/core/chains/evm/log/integration_test.go: `requireEqualLogs(t, listener1.received.getUniqueLogs(), listener1.received.getLogs(), )` $DIR/core/chains/evm/log/integration_test.go: `requireEqualLogs(t, listener2.received.getUniqueLogs(), listener2.received.getLogs(), )` $DIR/core/chains/evm/log/integration_test.go: `c.EVM[0].FinalityDepth = ptr[uint32](1)` $DIR/core/chains/evm/log/integration_test.go: `helper.start()` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener1, contract1, 1)` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener2, contract1, 3)` $DIR/core/chains/evm/log/integration_test.go: `chRawLogs.TrySend(log)` $DIR/core/chains/evm/log/integration_test.go: `helper.requireBroadcastCount(6)` $DIR/core/chains/evm/log/integration_test.go: `<-headsDone` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener3, contract1, 1)` $DIR/core/chains/evm/log/integration_test.go: `<-cltest.SimulateIncomingHeads(t, blocks.Slice(6, 9), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `helper.requireBroadcastCount(8)` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener4, contract1, 1)` $DIR/core/chains/evm/log/integration_test.go: `<-cltest.SimulateIncomingHeads(t, blocks.Slice(9, 12), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `c.EVM[0].FinalityDepth = ptr[uint32](4)` $DIR/core/chains/evm/log/integration_test.go: `helper.start()` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener1, contract1, 1)` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener2, contract1, 3)` $DIR/core/chains/evm/log/integration_test.go: `chRawLogs.TrySend(log)` $DIR/core/chains/evm/log/integration_test.go: `<-headsDone` $DIR/core/chains/evm/log/integration_test.go: `helper.requireBroadcastCount(6)` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener3, contract1, 1)` $DIR/core/chains/evm/log/integration_test.go: `<-cltest.SimulateIncomingHeads(t, blocks.Slice(7, 9), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `helper.requireBroadcastCount(9)` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener4, contract1, 1)` $DIR/core/chains/evm/log/integration_test.go: `<-cltest.SimulateIncomingHeads(t, blocks.Slice(10, 12), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `c.EVM[0].FinalityDepth = ptr[uint32](3)` $DIR/core/chains/evm/log/integration_test.go: `helper.start()` $DIR/core/chains/evm/log/integration_test.go: `helper.registerWithTopicValues(listener0, contract1, 1, map[common.Hash][][]log.Topic{ topic: {}, // no filters, so all values allowed }, )` $DIR/core/chains/evm/log/integration_test.go: `helper.registerWithTopicValues(listener1, contract1, 1, map[common.Hash][][]log.Topic{ topic: {{} /**/, {}}, // two empty filters, so all values allowed }, )` $DIR/core/chains/evm/log/integration_test.go: `helper.registerWithTopicValues(listener2, contract1, 1, map[common.Hash][][]log.Topic{ topic: { {log.Topic(field1Value1), log.Topic(field1Value2)} /**/, {log.Topic(field2Value1), log.Topic(field2Value2)}, // two values for each field allowed }, }, )` $DIR/core/chains/evm/log/integration_test.go: `helper.registerWithTopicValues(listener3, contract1, 1, map[common.Hash][][]log.Topic{ topic: { {log.Topic(field1Value1), log.Topic(field1Value2)} /**/, {}, // two values allowed for field 1, and any values for field 2 }, }, )` $DIR/core/chains/evm/log/integration_test.go: `helper.registerWithTopicValues(listener4, contract1, 1, map[common.Hash][][]log.Topic{ topic: { {log.Topic(field1Value1)} /**/, {log.Topic(field2Value1)}, // some values allowed }, }, )` $DIR/core/chains/evm/log/integration_test.go: `chRawLogs.TrySend(log)` $DIR/core/chains/evm/log/integration_test.go: `<-headsDone` $DIR/core/chains/evm/log/integration_test.go: `c.EVM[0].FinalityDepth = ptr[uint32](2)` $DIR/core/chains/evm/log/integration_test.go: `helper.start()` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener1, contract1, 1)` $DIR/core/chains/evm/log/integration_test.go: `chRawLogs.TrySend(addr1SentLogs[0])` $DIR/core/chains/evm/log/integration_test.go: `chRawLogs.TrySend(addr1SentLogs[1])` $DIR/core/chains/evm/log/integration_test.go: `chRawLogs.TrySend(addr1SentLogs[2])` $DIR/core/chains/evm/log/integration_test.go: `<-cltest.SimulateIncomingHeads(t, blocks.Slice(0, 4), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `chRawLogs.TrySend(addr1SentLogs[3])` $DIR/core/chains/evm/log/integration_test.go: `<-cltest.SimulateIncomingHeads(t, blocks.Slice(4, 9), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `helper.requireBroadcastCount(4)` $DIR/core/chains/evm/log/integration_test.go: `helper.start()` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener1, contract1, 1)` $DIR/core/chains/evm/log/integration_test.go: `chRawLogs.TrySend(log)` $DIR/core/chains/evm/log/integration_test.go: `<-cltest.SimulateIncomingHeads(t, blocks.Slice(0, 10), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `helper.requireBroadcastCount(3)` $DIR/core/chains/evm/log/integration_test.go: `helper.stop()` $DIR/core/chains/evm/log/integration_test.go: `requireEqualLogs(t, addr1SentLogs, listener1.received.getUniqueLogs(), )` $DIR/core/chains/evm/log/integration_test.go: `c.EVM[0].FinalityDepth = ptr[uint32](2)` $DIR/core/chains/evm/log/integration_test.go: `helper.start()` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener1, contract1, 1)` $DIR/core/chains/evm/log/integration_test.go: `<-cltest.SimulateIncomingHeads(t, blocks.Slice(0, 7), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `chRawLogs.TrySend(log)` $DIR/core/chains/evm/log/integration_test.go: `<-cltest.SimulateIncomingHeads(t, blocks.Slice(7, 9), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `helper.requireBroadcastCount(3)` $DIR/core/chains/evm/log/integration_test.go: `helper.stop()` $DIR/core/chains/evm/log/integration_test.go: `requireEqualLogs(t, addr1SentLogs, listener1.received.getUniqueLogs(), )` $DIR/core/chains/evm/log/integration_test.go: `testutils.SkipShortDB(t)` $DIR/core/chains/evm/log/integration_test.go: `ethClient.On("ConfiguredChainID", mock.Anything).Return(&cltest.FixtureChainID)` $DIR/core/chains/evm/log/integration_test.go: `ethClient.On("SubscribeFilterLogs", mock.Anything, mock.Anything, mock.Anything). Return( func(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log) ethereum.Subscription { defer close(chStarted) sub := mockEth.NewSub(t) chchRawLogs <- evmtestutils.NewRawSub(ch, sub.Err()) return sub }, func(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log) error { return nil }, ). Once()` $DIR/core/chains/evm/log/integration_test.go: `chchRawLogs <- evmtestutils.NewRawSub(ch, sub.Err())` $DIR/core/chains/evm/log/integration_test.go: `ethClient.On("SubscribeFilterLogs", mock.Anything, mock.Anything, mock.Anything). Return( func(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log) ethereum.Subscription { sub := mockEth.NewSub(t) chchRawLogs <- evmtestutils.NewRawSub(ch, sub.Err()) return sub }, func(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log) error { return nil }, ). Times(3)` $DIR/core/chains/evm/log/integration_test.go: `chchRawLogs <- evmtestutils.NewRawSub(ch, sub.Err())` $DIR/core/chains/evm/log/integration_test.go: `ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)). Return(&evmtypes.Head{Number: blockHeight}, nil)` $DIR/core/chains/evm/log/integration_test.go: `ethClient.On("FilterLogs", mock.Anything, mock.Anything). Run(func(args mock.Arguments) { query := args.Get(1).(ethereum.FilterQuery) require.Equal(t, big.NewInt(expectedBlock), query.FromBlock) require.Contains(t, query.Addresses, contract0.Address()) require.Len(t, query.Addresses, 1) }). Return(nil, nil). Times(backfillTimes)` $DIR/core/chains/evm/log/integration_test.go: `ethClient.On("FilterLogs", mock.Anything, mock.Anything). Run(func(args mock.Arguments) { query := args.Get(1).(ethereum.FilterQuery) require.Equal(t, big.NewInt(expectedBlock), query.FromBlock) require.Contains(t, query.Addresses, contract0.Address()) require.Contains(t, query.Addresses, contract1.Address()) require.Len(t, query.Addresses, 2) }). Return(nil, nil). Once()` $DIR/core/chains/evm/log/integration_test.go: `ethClient.On("FilterLogs", mock.Anything, mock.Anything). Run(func(args mock.Arguments) { query := args.Get(1).(ethereum.FilterQuery) require.Equal(t, big.NewInt(expectedBlock), query.FromBlock) require.Contains(t, query.Addresses, contract0.Address()) require.Contains(t, query.Addresses, contract1.Address()) require.Contains(t, query.Addresses, contract2.Address()) require.Len(t, query.Addresses, 3) }). Return(nil, nil). Once()` $DIR/core/chains/evm/log/integration_test.go: `helper.lb.AddDependents(1)` $DIR/core/chains/evm/log/integration_test.go: `helper.start()` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener0, contract0, 1)` $DIR/core/chains/evm/log/integration_test.go: `helper.lb.DependentReady()` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener1, contract1, 1)` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener2, contract2, 1)` $DIR/core/chains/evm/log/integration_test.go: `helper.lb.ReplayFromBlock(125, false)` $DIR/core/chains/evm/log/integration_test.go: `logsA[uint(n)] = blocks.LogOnBlockNumWithIndex(uint64(n), 0, addrA)` $DIR/core/chains/evm/log/integration_test.go: `logsB[uint(n)] = blocks.LogOnBlockNumWithIndex(uint64(n), 1, addrB)` $DIR/core/chains/evm/log/integration_test.go: `t.Run(test.name, func(t *testing.T) { const backfillDepth = 5 helper := newBroadcasterHelper(t, int64(test.blockHeight1), 2, nil, func(c *chainlink.Config, s *chainlink.Secrets) { // something other than default c.EVM[0].BlockBackfillDepth = ptr[uint32](backfillDepth) }) helper.start() defer helper.stop() logListenerA := helper.newLogListenerWithJob("logListenerA") logListenerB := helper.newLogListenerWithJob("logListenerB") contractA, err := flux_aggregator_wrapper.NewFluxAggregator(addrA, nil) require.NoError(t, err) contractB, err := flux_aggregator_wrapper.NewFluxAggregator(addrB, nil) require.NoError(t, err) // Register listener A helper.register(logListenerA, contractA, 1) // Send initial logs chRawLogs1 := <-helper.chchRawLogs headsDone := cltest.SimulateIncomingHeads(t, blocks.Slice(test.blockHeight1, test.blockHeight2+2), helper.lb, cltest.HeadTrackableFunc(func(_ context.Context, head *evmtypes.Head) { n := uint(head.Number) if l, ok := logsA[n]; ok && slices.Contains(test.batch1, n) { chRawLogs1.TrySend(l) } })) helper.requireBroadcastCount(len(test.batch1)) expectedA := newReceived(pickLogs(logsA, test.batch1)) logListenerA.requireAllReceived(t, expectedA) <-headsDone helper.mockEth.EthClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(&evmtypes.Head{Number: int64(test.blockHeight2)}, nil).Once() combinedLogs := append(pickLogs(logsA, test.backfillableLogs), pickLogs(logsB, test.backfillableLogs)...) call := helper.mockEth.EthClient.On("FilterLogs", mock.Anything, mock.Anything).Return(combinedLogs, nil).Once() call.Run(func(args mock.Arguments) { // Validate that the ethereum.FilterQuery is specified correctly for the backfill that we expect fromBlock := args.Get(1).(ethereum.FilterQuery).FromBlock expected := big.NewInt(0) blockNumber := helper.lb.BackfillBlockNumber() if blockNumber.Valid && blockNumber.Int64 > int64(test.blockHeight2-backfillDepth) { expected = big.NewInt(blockNumber.Int64) } else if test.blockHeight2 > backfillDepth { expected = big.NewInt(int64(test.blockHeight2) - backfillDepth) } require.Equal(t, expected, fromBlock) }) // Register listener B (triggers re-subscription) helper.register(logListenerB, contractB, 1) // Send second batch of new logs chRawLogs2 := <-helper.chchRawLogs headsDone = cltest.SimulateIncomingHeads(t, blocks.Slice(test.blockHeight2, -1), helper.lb, cltest.HeadTrackableFunc(func(_ context.Context, head *evmtypes.Head) { n := uint(head.Number) if l, ok := logsA[n]; ok && slices.Contains(test.batch2, n) { chRawLogs2.TrySend(l) } if l, ok := logsB[n]; ok && slices.Contains(test.batch2, n) { chRawLogs2.TrySend(l) } })) defer func() { <-headsDone }() expectedA = newReceived(pickLogs(logsA, test.expectedFilteredA)) expectedB := newReceived(pickLogs(logsB, test.expectedFilteredB)) logListenerA.requireAllReceived(t, expectedA) logListenerB.requireAllReceived(t, expectedB) helper.requireBroadcastCount(len(test.expectedFilteredA) + len(test.expectedFilteredB)) })` $DIR/core/chains/evm/log/integration_test.go: `c.EVM[0].BlockBackfillDepth = ptr[uint32](backfillDepth)` $DIR/core/chains/evm/log/integration_test.go: `helper.start()` $DIR/core/chains/evm/log/integration_test.go: `helper.register(logListenerA, contractA, 1)` $DIR/core/chains/evm/log/integration_test.go: `chRawLogs1.TrySend(l)` $DIR/core/chains/evm/log/integration_test.go: `helper.requireBroadcastCount(len(test.batch1))` $DIR/core/chains/evm/log/integration_test.go: `logListenerA.requireAllReceived(t, expectedA)` $DIR/core/chains/evm/log/integration_test.go: `<-headsDone` $DIR/core/chains/evm/log/integration_test.go: `helper.mockEth.EthClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(&evmtypes.Head{Number: int64(test.blockHeight2)}, nil).Once()` $DIR/core/chains/evm/log/integration_test.go: `call.Run(func(args mock.Arguments) { // Validate that the ethereum.FilterQuery is specified correctly for the backfill that we expect fromBlock := args.Get(1).(ethereum.FilterQuery).FromBlock expected := big.NewInt(0) blockNumber := helper.lb.BackfillBlockNumber() if blockNumber.Valid && blockNumber.Int64 > int64(test.blockHeight2-backfillDepth) { expected = big.NewInt(blockNumber.Int64) } else if test.blockHeight2 > backfillDepth { expected = big.NewInt(int64(test.blockHeight2) - backfillDepth) } require.Equal(t, expected, fromBlock) })` $DIR/core/chains/evm/log/integration_test.go: `expected = big.NewInt(blockNumber.Int64)` $DIR/core/chains/evm/log/integration_test.go: `expected = big.NewInt(int64(test.blockHeight2) - backfillDepth)` $DIR/core/chains/evm/log/integration_test.go: `helper.register(logListenerB, contractB, 1)` $DIR/core/chains/evm/log/integration_test.go: `chRawLogs2.TrySend(l)` $DIR/core/chains/evm/log/integration_test.go: `chRawLogs2.TrySend(l)` $DIR/core/chains/evm/log/integration_test.go: `<-headsDone` $DIR/core/chains/evm/log/integration_test.go: `expectedA = newReceived(pickLogs(logsA, test.expectedFilteredA))` $DIR/core/chains/evm/log/integration_test.go: `logListenerA.requireAllReceived(t, expectedA)` $DIR/core/chains/evm/log/integration_test.go: `logListenerB.requireAllReceived(t, expectedB)` $DIR/core/chains/evm/log/integration_test.go: `helper.requireBroadcastCount(len(test.expectedFilteredA) + len(test.expectedFilteredB))` $DIR/core/chains/evm/log/integration_test.go: `chCombined = lb.ExportedAppendLogChannel(chCombined, ch3)` $DIR/core/chains/evm/log/integration_test.go: `ch1 <- log` $DIR/core/chains/evm/log/integration_test.go: `ch2 <- log` $DIR/core/chains/evm/log/integration_test.go: `ch3 <- log` $DIR/core/chains/evm/log/integration_test.go: `expected = append(expected, logs3...)` $DIR/core/chains/evm/log/integration_test.go: `i++` $DIR/core/chains/evm/log/integration_test.go: `helper.start()` $DIR/core/chains/evm/log/integration_test.go: `contract.On("ParseLog", log1).Return(flux_aggregator_wrapper.FluxAggregatorNewRound{}, nil)` $DIR/core/chains/evm/log/integration_test.go: `contract.On("ParseLog", log2).Return(flux_aggregator_wrapper.FluxAggregatorAnswerUpdated{}, nil)` $DIR/core/chains/evm/log/integration_test.go: `helper.register(logListener, contract, uint32(5))` $DIR/core/chains/evm/log/integration_test.go: `chRawLogs.TrySend(log1)` $DIR/core/chains/evm/log/integration_test.go: `chRawLogs.TrySend(log2)` $DIR/core/chains/evm/log/integration_test.go: `<-headsDone` $DIR/core/chains/evm/log/integration_test.go: `helper.start()` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listenerA, contract, 1)` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listenerB, contract, 3)` $DIR/core/chains/evm/log/integration_test.go: `helper.lb.OnNewLongestChain(ctx, x)` $DIR/core/chains/evm/log/integration_test.go: `chRawLogs.TrySend(x)` $DIR/core/chains/evm/log/integration_test.go: `time.Sleep(250 * time.Millisecond)` $DIR/core/chains/evm/log/integration_test.go: `g.Eventually(func() []uint64 { return listenerA.getUniqueLogsBlockNumbers() }, testutils.WaitTimeout(t), time.Second). Should(gomega.Equal([]uint64{0, 1, 2, 1, 2, 3, 3}))` $DIR/core/chains/evm/log/integration_test.go: `g.Eventually(func() []uint64 { return listenerB.getUniqueLogsBlockNumbers() }, testutils.WaitTimeout(t), time.Second). Should(gomega.Equal([]uint64{0, 1, 1, 2, 2}))` $DIR/core/chains/evm/log/integration_test.go: `helper.unsubscribeAll()` $DIR/core/chains/evm/log/integration_test.go: `helper.mockEth.EthClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(&evmtypes.Head{Number: blockHeight}, nil).Times(1)` $DIR/core/chains/evm/log/integration_test.go: `helper.mockEth.EthClient.On("FilterLogs", mock.Anything, mock.Anything).Return(nil, nil).Times(1)` $DIR/core/chains/evm/log/integration_test.go: `helper.start()` $DIR/core/chains/evm/log/integration_test.go: `helper.registerWithTopics(listener1, contract, topics1, 1)` $DIR/core/chains/evm/log/integration_test.go: `g.Consistently(func() int32 { return helper.mockEth.SubscribeCallCount() }, 1*time.Second, cltest.DBPollingInterval).Should(gomega.Equal(int32(1)))` $DIR/core/chains/evm/log/integration_test.go: `<-helper.chchRawLogs` $DIR/core/chains/evm/log/integration_test.go: `helper.registerWithTopics(listener2, contract, topics2, 1)` $DIR/core/chains/evm/log/integration_test.go: `g.Consistently(func() int32 { return helper.mockEth.SubscribeCallCount() }, 1*time.Second, cltest.DBPollingInterval).Should(gomega.Equal(int32(2)))` $DIR/core/chains/evm/log/integration_test.go: `testutils.SkipShortDB(t)` $DIR/core/chains/evm/log/integration_test.go: `ethClient.On("ConfiguredChainID").Return(big.NewInt(0)).Maybe()` $DIR/core/chains/evm/log/integration_test.go: `ethClient.On("SubscribeFilterLogs", mock.Anything, mock.Anything, mock.Anything). Return( func(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log) ethereum.Subscription { sub := mockEth.NewSub(t) logsChCh <- evmtestutils.NewRawSub(ch, sub.Err()) return sub }, func(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log) error { return nil }, ). Once()` $DIR/core/chains/evm/log/integration_test.go: `logsChCh <- evmtestutils.NewRawSub(ch, sub.Err())` $DIR/core/chains/evm/log/integration_test.go: `ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)). Return(&evmtypes.Head{Number: 1}, nil)` $DIR/core/chains/evm/log/integration_test.go: `ethClient.On("FilterLogs", mock.Anything, mock.Anything). Return(nil, nil)` $DIR/core/chains/evm/log/integration_test.go: `helper.start()` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener1, contract1, 0)` $DIR/core/chains/evm/log/integration_test.go: `helper.register(listener2, contract1, 0)` $DIR/core/chains/evm/log/integration_test.go: `logs.TrySend(log)` $DIR/core/chains/evm/log/integration_test.go: `gm.Eventually(func() bool { helper.lb.Pause() defer helper.lb.Resume() return helper.lb.LogsFromBlock(bh) == len(addr1SentLogs) }, 2*time.Second, 100*time.Millisecond).Should(gomega.BeTrue())` $DIR/core/chains/evm/log/integration_test.go: `helper.lb.Pause()` $DIR/core/chains/evm/log/integration_test.go: `helper.lb.OnNewLongestChain(testutils.Context(t), &evmtypes.Head{Number: 2})` $DIR/core/chains/evm/log/integration_test.go: `gm.Eventually(func() bool { return len(listener1.getUniqueLogs()) == len(addr1SentLogs) && len(listener2.getUniqueLogs()) == len(addr1SentLogs) }, 2*time.Second, cltest.DBPollingInterval).Should(gomega.BeTrue())` $DIR/core/chains/evm/log/integration_test.go: `.NewWithT(t)` $DIR/core/chains/evm/log/integration_test.go: `.lb.AddDependents(2)` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("A")` $DIR/core/chains/evm/log/integration_test.go: `.register(listener, newMockContract(t), 1)` $DIR/core/chains/evm/log/integration_test.go: `.start()` $DIR/core/chains/evm/log/integration_test.go: `.stop()` $DIR/core/chains/evm/log/integration_test.go: `.Consistently(func() int32 { return helper.mockEth.SubscribeCallCount() }, 1*time.Second, cltest.DBPollingInterval)` $DIR/core/chains/evm/log/integration_test.go: `.mockEth.SubscribeCallCount()` $DIR/core/chains/evm/log/integration_test.go: `.Should(gomega.Equal(int32(0)))` $DIR/core/chains/evm/log/integration_test.go: `.Equal(int32(0))` $DIR/core/chains/evm/log/integration_test.go: `.lb.DependentReady()` $DIR/core/chains/evm/log/integration_test.go: `.Consistently(func() int32 { return helper.mockEth.SubscribeCallCount() }, 1*time.Second, cltest.DBPollingInterval)` $DIR/core/chains/evm/log/integration_test.go: `.mockEth.SubscribeCallCount()` $DIR/core/chains/evm/log/integration_test.go: `.Should(gomega.Equal(int32(0)))` $DIR/core/chains/evm/log/integration_test.go: `.Equal(int32(0))` $DIR/core/chains/evm/log/integration_test.go: `.lb.DependentReady()` $DIR/core/chains/evm/log/integration_test.go: `.Consistently(func() int32 { return helper.mockEth.SubscribeCallCount() }, 1*time.Second, cltest.DBPollingInterval)` $DIR/core/chains/evm/log/integration_test.go: `.mockEth.SubscribeCallCount()` $DIR/core/chains/evm/log/integration_test.go: `.Should(gomega.Equal(int32(1)))` $DIR/core/chains/evm/log/integration_test.go: `.Equal(int32(1))` $DIR/core/chains/evm/log/integration_test.go: `.unsubscribeAll()` $DIR/core/chains/evm/log/integration_test.go: `.Consistently(func() int32 { return helper.mockEth.UnsubscribeCallCount() }, 1*time.Second, cltest.DBPollingInterval)` $DIR/core/chains/evm/log/integration_test.go: `.mockEth.UnsubscribeCallCount()` $DIR/core/chains/evm/log/integration_test.go: `.Equal(int32(1))` $DIR/core/chains/evm/log/integration_test.go: `.SkipShortDB(t)` $DIR/core/chains/evm/log/integration_test.go: `.Head(lastStoredBlockHeight)` $DIR/core/chains/evm/log/integration_test.go: `.config.EVM()` $DIR/core/chains/evm/log/integration_test.go: `.BlockBackfillDepth()` $DIR/core/chains/evm/log/integration_test.go: `.Store(1)` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("initial")` $DIR/core/chains/evm/log/integration_test.go: `.register(listener, newMockContract(t), numConfirmations)` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("")` $DIR/core/chains/evm/log/integration_test.go: `.register(listener, newMockContract(t), 1)` $DIR/core/chains/evm/log/integration_test.go: `.start()` $DIR/core/chains/evm/log/integration_test.go: `.stop()` $DIR/core/chains/evm/log/integration_test.go: `.NewWithT(t)` $DIR/core/chains/evm/log/integration_test.go: `.Consistently(func() int32 { return helper.mockEth.SubscribeCallCount() }, 1*time.Second, cltest.DBPollingInterval)` $DIR/core/chains/evm/log/integration_test.go: `.mockEth.SubscribeCallCount()` $DIR/core/chains/evm/log/integration_test.go: `.Should(gomega.Equal(int32(1)))` $DIR/core/chains/evm/log/integration_test.go: `.Equal(int32(1))` $DIR/core/chains/evm/log/integration_test.go: `.NewWithT(t)` $DIR/core/chains/evm/log/integration_test.go: `.Consistently(func() int32 { return helper.mockEth.UnsubscribeCallCount() }, 1*time.Second, cltest.DBPollingInterval)` $DIR/core/chains/evm/log/integration_test.go: `.mockEth.UnsubscribeCallCount()` $DIR/core/chains/evm/log/integration_test.go: `.Should(gomega.Equal(int32(0)))` $DIR/core/chains/evm/log/integration_test.go: `.Equal(int32(0))` $DIR/core/chains/evm/log/integration_test.go: `.unsubscribeAll()` $DIR/core/chains/evm/log/integration_test.go: `.Store(2)` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("last")` $DIR/core/chains/evm/log/integration_test.go: `.register(listenerLast, newMockContract(t), 1)` $DIR/core/chains/evm/log/integration_test.go: `.NewWithT(t)` $DIR/core/chains/evm/log/integration_test.go: `.Consistently(func() int32 { return helper.mockEth.SubscribeCallCount() }, 1*time.Second, cltest.DBPollingInterval)` $DIR/core/chains/evm/log/integration_test.go: `.mockEth.SubscribeCallCount()` $DIR/core/chains/evm/log/integration_test.go: `.Should(gomega.Equal(int32(2)))` $DIR/core/chains/evm/log/integration_test.go: `.Equal(int32(2))` $DIR/core/chains/evm/log/integration_test.go: `.NewWithT(t)` $DIR/core/chains/evm/log/integration_test.go: `.Consistently(func() int32 { return helper.mockEth.UnsubscribeCallCount() }, 1*time.Second, cltest.DBPollingInterval)` $DIR/core/chains/evm/log/integration_test.go: `.mockEth.UnsubscribeCallCount()` $DIR/core/chains/evm/log/integration_test.go: `.Should(gomega.Equal(int32(1)))` $DIR/core/chains/evm/log/integration_test.go: `.Equal(int32(1))` $DIR/core/chains/evm/log/integration_test.go: `.Load()` $DIR/core/chains/evm/log/integration_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/log/integration_test.go: `.SkipShortDB(t)` $DIR/core/chains/evm/log/integration_test.go: `.Head(lastStoredBlockHeight)` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("one")` $DIR/core/chains/evm/log/integration_test.go: `.register(listener, newMockContract(t), uint32(maxNumConfirmations))` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("two")` $DIR/core/chains/evm/log/integration_test.go: `.register(listener2, newMockContract(t), uint32(2))` $DIR/core/chains/evm/log/integration_test.go: `.config.EVM()` $DIR/core/chains/evm/log/integration_test.go: `.BlockBackfillDepth()` $DIR/core/chains/evm/log/integration_test.go: `.Add(1)` $DIR/core/chains/evm/log/integration_test.go: `.start()` $DIR/core/chains/evm/log/integration_test.go: `.stop()` $DIR/core/chains/evm/log/integration_test.go: `.lb.ReplayFromBlock(replayFrom, false)` $DIR/core/chains/evm/log/integration_test.go: `.mockEth.UnsubscribeCallCount()` $DIR/core/chains/evm/log/integration_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/log/integration_test.go: `.SkipShortDB(t)` $DIR/core/chains/evm/log/integration_test.go: `.NewBlocks(t, blockHeight+3)` $DIR/core/chains/evm/log/integration_test.go: `.NewFluxAggregator(testutils.NewAddress(), nil)` $DIR/core/chains/evm/log/integration_test.go: `.NewAddress()` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(3, contract.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(7, contract.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.Head(blockHeight)` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("listener")` $DIR/core/chains/evm/log/integration_test.go: `.register(listener, contract, 2)` $DIR/core/chains/evm/log/integration_test.go: `.start()` $DIR/core/chains/evm/log/integration_test.go: `.stop()` $DIR/core/chains/evm/log/integration_test.go: `.lb.ReplayFromBlock(2, false)` $DIR/core/chains/evm/log/integration_test.go: `.SimulateIncomingHeads(t, blocks.Slice(10, 11), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `.Slice(10, 11)` $DIR/core/chains/evm/log/integration_test.go: `.lb.ReplayFromBlock(2, false)` $DIR/core/chains/evm/log/integration_test.go: `.SimulateIncomingHeads(t, blocks.Slice(11, 12), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `.Slice(11, 12)` $DIR/core/chains/evm/log/integration_test.go: `.lb.ReplayFromBlock(2, true)` $DIR/core/chains/evm/log/integration_test.go: `.SimulateIncomingHeads(t, blocks.Slice(12, 13), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `.Slice(12, 13)` $DIR/core/chains/evm/log/integration_test.go: `.mockEth.UnsubscribeCallCount()` $DIR/core/chains/evm/log/integration_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/log/integration_test.go: `.NewBlocks(t, 10)` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(log1Block, contract1.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(log2Block, contract2.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.Run("pool two logs from subscription, then shut down", func(t *testing.T) { helper := newBroadcasterHelper(t, 0, 1, logs, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].FinalityDepth = ptr[uint32](confs) }) ctx := testutils.Context(t) orm := log.NewORM(helper.db, cltest.FixtureChainID) listener := helper.newLogListenerWithJob("one") listener.SkipMarkingConsumed(true) listener2 := helper.newLogListenerWithJob("two") listener2.SkipMarkingConsumed(true) expBlock := int64(log1.BlockNumber) helper.simulateHeads(t, listener, listener2, contract1, contract2, confs, blocks.Slice(0, 2), orm, &expBlock, func() { chRawLogs := <-helper.chchRawLogs chRawLogs.TrySend(log1) chRawLogs.TrySend(log2) }) // Pool min block in DB and neither listener received a broadcast blockNum, err := orm.GetPendingMinBlock(ctx) require.NoError(t, err) require.NotNil(t, blockNum) require.Equal(t, int64(log1.BlockNumber), *blockNum) require.Empty(t, listener.getUniqueLogs()) require.Empty(t, listener2.getUniqueLogs()) helper.requireBroadcastCount(0) })` $DIR/core/chains/evm/log/integration_test.go: `.Context(t)` $DIR/core/chains/evm/log/integration_test.go: `.NewORM(helper.db, cltest.FixtureChainID)` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("one")` $DIR/core/chains/evm/log/integration_test.go: `.SkipMarkingConsumed(true)` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("two")` $DIR/core/chains/evm/log/integration_test.go: `.SkipMarkingConsumed(true)` $DIR/core/chains/evm/log/integration_test.go: `.simulateHeads(t, listener, listener2, contract1, contract2, confs, blocks.Slice(0, 2), orm, &expBlock, func() { chRawLogs := <-helper.chchRawLogs chRawLogs.TrySend(log1) chRawLogs.TrySend(log2) })` $DIR/core/chains/evm/log/integration_test.go: `.Slice(0, 2)` $DIR/core/chains/evm/log/integration_test.go: `.TrySend(log1)` $DIR/core/chains/evm/log/integration_test.go: `.TrySend(log2)` $DIR/core/chains/evm/log/integration_test.go: `.GetPendingMinBlock(ctx)` $DIR/core/chains/evm/log/integration_test.go: `.requireBroadcastCount(0)` $DIR/core/chains/evm/log/integration_test.go: `.Run("backfill pool with both, then broadcast one, but don't consume", func(t *testing.T) { helper := newBroadcasterHelper(t, 2, 1, logs, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].FinalityDepth = ptr[uint32](confs) }) ctx := testutils.Context(t) orm := log.NewORM(helper.db, cltest.FixtureChainID) contract1.On("ParseLog", log1).Return(flux_aggregator_wrapper.FluxAggregatorNewRound{}, nil) contract2.On("ParseLog", log2).Return(flux_aggregator_wrapper.FluxAggregatorAnswerUpdated{}, nil) listener := helper.newLogListenerWithJob("one") listener.SkipMarkingConsumed(true) listener2 := helper.newLogListenerWithJob("two") listener2.SkipMarkingConsumed(true) expBlock := int64(log2.BlockNumber) helper.simulateHeads(t, listener, listener2, contract1, contract2, confs, blocks.Slice(2, 5), orm, &expBlock, nil) // Pool min block in DB and one listener received but didn't consume blockNum, err := orm.GetPendingMinBlock(ctx) require.NoError(t, err) require.NotNil(t, blockNum) require.Equal(t, int64(log2.BlockNumber), *blockNum) require.NotEmpty(t, listener.getUniqueLogs()) require.Empty(t, listener2.getUniqueLogs()) c, err := orm.WasBroadcastConsumed(ctx, log1.BlockHash, log1.Index, listener.JobID()) require.NoError(t, err) require.False(t, c) })` $DIR/core/chains/evm/log/integration_test.go: `.Context(t)` $DIR/core/chains/evm/log/integration_test.go: `.NewORM(helper.db, cltest.FixtureChainID)` $DIR/core/chains/evm/log/integration_test.go: `.On("ParseLog", log1)` $DIR/core/chains/evm/log/integration_test.go: `.Return(flux_aggregator_wrapper.FluxAggregatorNewRound{}, nil)` $DIR/core/chains/evm/log/integration_test.go: `.On("ParseLog", log2)` $DIR/core/chains/evm/log/integration_test.go: `.Return(flux_aggregator_wrapper.FluxAggregatorAnswerUpdated{}, nil)` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("one")` $DIR/core/chains/evm/log/integration_test.go: `.SkipMarkingConsumed(true)` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("two")` $DIR/core/chains/evm/log/integration_test.go: `.SkipMarkingConsumed(true)` $DIR/core/chains/evm/log/integration_test.go: `.simulateHeads(t, listener, listener2, contract1, contract2, confs, blocks.Slice(2, 5), orm, &expBlock, nil)` $DIR/core/chains/evm/log/integration_test.go: `.Slice(2, 5)` $DIR/core/chains/evm/log/integration_test.go: `.GetPendingMinBlock(ctx)` $DIR/core/chains/evm/log/integration_test.go: `.WasBroadcastConsumed(ctx, log1.BlockHash, log1.Index, listener.JobID())` $DIR/core/chains/evm/log/integration_test.go: `.JobID()` $DIR/core/chains/evm/log/integration_test.go: `.Run("backfill pool and broadcast two, but only consume one", func(t *testing.T) { helper := newBroadcasterHelper(t, 4, 1, logs, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].FinalityDepth = ptr[uint32](confs) }) ctx := testutils.Context(t) orm := log.NewORM(helper.db, cltest.FixtureChainID) listener := helper.newLogListenerWithJob("one") listener2 := helper.newLogListenerWithJob("two") listener2.SkipMarkingConsumed(true) helper.simulateHeads(t, listener, listener2, contract1, contract2, confs, blocks.Slice(5, 8), orm, nil, nil) // Pool empty and one consumed but other didn't blockNum, err := orm.GetPendingMinBlock(ctx) require.NoError(t, err) require.Nil(t, blockNum) require.NotEmpty(t, listener.getUniqueLogs()) require.NotEmpty(t, listener2.getUniqueLogs()) c, err := orm.WasBroadcastConsumed(ctx, log1.BlockHash, log1.Index, listener.JobID()) require.NoError(t, err) require.True(t, c) c, err = orm.WasBroadcastConsumed(ctx, log2.BlockHash, log2.Index, listener2.JobID()) require.NoError(t, err) require.False(t, c) })` $DIR/core/chains/evm/log/integration_test.go: `.Context(t)` $DIR/core/chains/evm/log/integration_test.go: `.NewORM(helper.db, cltest.FixtureChainID)` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("one")` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("two")` $DIR/core/chains/evm/log/integration_test.go: `.SkipMarkingConsumed(true)` $DIR/core/chains/evm/log/integration_test.go: `.simulateHeads(t, listener, listener2, contract1, contract2, confs, blocks.Slice(5, 8), orm, nil, nil)` $DIR/core/chains/evm/log/integration_test.go: `.Slice(5, 8)` $DIR/core/chains/evm/log/integration_test.go: `.GetPendingMinBlock(ctx)` $DIR/core/chains/evm/log/integration_test.go: `.WasBroadcastConsumed(ctx, log1.BlockHash, log1.Index, listener.JobID())` $DIR/core/chains/evm/log/integration_test.go: `.JobID()` $DIR/core/chains/evm/log/integration_test.go: `.WasBroadcastConsumed(ctx, log2.BlockHash, log2.Index, listener2.JobID())` $DIR/core/chains/evm/log/integration_test.go: `.JobID()` $DIR/core/chains/evm/log/integration_test.go: `.Context(t)` $DIR/core/chains/evm/log/integration_test.go: `.NewORM(helper.db, cltest.FixtureChainID)` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("one")` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("two")` $DIR/core/chains/evm/log/integration_test.go: `.simulateHeads(t, listener, listener2, contract1, contract2, confs, blocks.Slice(8, 9), orm, nil, nil)` $DIR/core/chains/evm/log/integration_test.go: `.Slice(8, 9)` $DIR/core/chains/evm/log/integration_test.go: `.GetPendingMinBlock(ctx)` $DIR/core/chains/evm/log/integration_test.go: `.WasBroadcastConsumed(ctx, log2.BlockHash, log2.Index, listener2.JobID())` $DIR/core/chains/evm/log/integration_test.go: `.JobID()` $DIR/core/chains/evm/log/integration_test.go: `.SkipShortDB(t)` $DIR/core/chains/evm/log/integration_test.go: `.Head(lastStoredBlockHeight)` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("one")` $DIR/core/chains/evm/log/integration_test.go: `.register(listener, newMockContract(t), uint32(10))` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("two")` $DIR/core/chains/evm/log/integration_test.go: `.register(listener2, newMockContract(t), uint32(2))` $DIR/core/chains/evm/log/integration_test.go: `.Store(1)` $DIR/core/chains/evm/log/integration_test.go: `.start()` $DIR/core/chains/evm/log/integration_test.go: `.stop()` $DIR/core/chains/evm/log/integration_test.go: `.mockEth.UnsubscribeCallCount()` $DIR/core/chains/evm/log/integration_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/log/integration_test.go: `.SkipShortDB(t)` $DIR/core/chains/evm/log/integration_test.go: `.Head(lastStoredBlockHeight)` $DIR/core/chains/evm/log/integration_test.go: `.config.EVM()` $DIR/core/chains/evm/log/integration_test.go: `.BlockBackfillDepth()` $DIR/core/chains/evm/log/integration_test.go: `.Test(t)` $DIR/core/chains/evm/log/integration_test.go: `.Add(1)` $DIR/core/chains/evm/log/integration_test.go: `.Infof("Log Batch: --------- times %v - %v, %v", times, fromBlock, toBlock)` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("initial")` $DIR/core/chains/evm/log/integration_test.go: `.register(listener, newMockContract(t), numConfirmations)` $DIR/core/chains/evm/log/integration_test.go: `.start()` $DIR/core/chains/evm/log/integration_test.go: `.stop()` $DIR/core/chains/evm/log/integration_test.go: `.unsubscribeAll()` $DIR/core/chains/evm/log/integration_test.go: `.mockEth.UnsubscribeCallCount()` $DIR/core/chains/evm/log/integration_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/log/integration_test.go: `.SkipShortDB(t)` $DIR/core/chains/evm/log/integration_test.go: `.NewWithT(t)` $DIR/core/chains/evm/log/integration_test.go: `.NewFluxAggregator(testutils.NewAddress(), nil)` $DIR/core/chains/evm/log/integration_test.go: `.NewAddress()` $DIR/core/chains/evm/log/integration_test.go: `.NewBlocks(t, 7)` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(0, contract1.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.Head(lastStoredBlockHeight)` $DIR/core/chains/evm/log/integration_test.go: `.Test(t)` $DIR/core/chains/evm/log/integration_test.go: `.Add(1)` $DIR/core/chains/evm/log/integration_test.go: `.Warnf("Log Batch: --------- times %v - %v, %v", times, fromBlock, toBlock)` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("initial")` $DIR/core/chains/evm/log/integration_test.go: `.register(listener, newMockContract(t), 1)` $DIR/core/chains/evm/log/integration_test.go: `.start()` $DIR/core/chains/evm/log/integration_test.go: `.stop()` $DIR/core/chains/evm/log/integration_test.go: `.Eventually(func() int64 { return backfillCount.Load() }, testutils.WaitTimeout(t), time.Second)` $DIR/core/chains/evm/log/integration_test.go: `.Load()` $DIR/core/chains/evm/log/integration_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/log/integration_test.go: `.Should(gomega.Equal(int64(expectedBatches)))` $DIR/core/chains/evm/log/integration_test.go: `.Equal(int64(expectedBatches))` $DIR/core/chains/evm/log/integration_test.go: `.unsubscribeAll()` $DIR/core/chains/evm/log/integration_test.go: `.Eventually(func() int32 { return helper.mockEth.UnsubscribeCallCount() }, testutils.WaitTimeout(t), time.Second)` $DIR/core/chains/evm/log/integration_test.go: `.mockEth.UnsubscribeCallCount()` $DIR/core/chains/evm/log/integration_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/log/integration_test.go: `.BeNumerically(">=", int32(1))` $DIR/core/chains/evm/log/integration_test.go: `.NewFluxAggregator(testutils.NewAddress(), nil)` $DIR/core/chains/evm/log/integration_test.go: `.NewAddress()` $DIR/core/chains/evm/log/integration_test.go: `.NewFluxAggregator(testutils.NewAddress(), nil)` $DIR/core/chains/evm/log/integration_test.go: `.NewAddress()` $DIR/core/chains/evm/log/integration_test.go: `.NewBlocks(t, 10)` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(1, contract1.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(2, contract1.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(3, contract1.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(4, contract2.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(5, contract2.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(6, contract2.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("listener 1")` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("listener 2")` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("listener 3")` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("listener 4")` $DIR/core/chains/evm/log/integration_test.go: `.register(listener1, contract1, 1)` $DIR/core/chains/evm/log/integration_test.go: `.register(listener2, contract1, 1)` $DIR/core/chains/evm/log/integration_test.go: `.register(listener3, contract2, 1)` $DIR/core/chains/evm/log/integration_test.go: `.register(listener4, contract2, 1)` $DIR/core/chains/evm/log/integration_test.go: `.start()` $DIR/core/chains/evm/log/integration_test.go: `.stop()` $DIR/core/chains/evm/log/integration_test.go: `.SimulateIncomingHeads(t, blocks.Slice(0, 10), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `.Slice(0, 10)` $DIR/core/chains/evm/log/integration_test.go: `.unsubscribeAll()` $DIR/core/chains/evm/log/integration_test.go: `.TrySend(log)` $DIR/core/chains/evm/log/integration_test.go: `.TrySend(log)` $DIR/core/chains/evm/log/integration_test.go: `.requireBroadcastCount(12)` $DIR/core/chains/evm/log/integration_test.go: `.received.getUniqueLogs()` $DIR/core/chains/evm/log/integration_test.go: `.received.getUniqueLogs()` $DIR/core/chains/evm/log/integration_test.go: `.received.getUniqueLogs()` $DIR/core/chains/evm/log/integration_test.go: `.received.getUniqueLogs()` $DIR/core/chains/evm/log/integration_test.go: `.start()` $DIR/core/chains/evm/log/integration_test.go: `.NewFluxAggregator(testutils.NewAddress(), nil)` $DIR/core/chains/evm/log/integration_test.go: `.NewAddress()` $DIR/core/chains/evm/log/integration_test.go: `.NewBlocks(t, 10)` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(1, contract1.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(2, contract1.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(3, contract1.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("listener 1")` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("listener 2")` $DIR/core/chains/evm/log/integration_test.go: `.register(listener1, contract1, 1)` $DIR/core/chains/evm/log/integration_test.go: `.register(listener2, contract1, 8)` $DIR/core/chains/evm/log/integration_test.go: `.SimulateIncomingHeads(t, blocks.Slice(0, 10), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `.Slice(0, 10)` $DIR/core/chains/evm/log/integration_test.go: `.TrySend(log)` $DIR/core/chains/evm/log/integration_test.go: `.requireBroadcastCount(5)` $DIR/core/chains/evm/log/integration_test.go: `.stop()` $DIR/core/chains/evm/log/integration_test.go: `.received.getUniqueLogs()` $DIR/core/chains/evm/log/integration_test.go: `.received.getUniqueLogs()` $DIR/core/chains/evm/log/integration_test.go: `.received.getUniqueLogs()` $DIR/core/chains/evm/log/integration_test.go: `.received.getLogs()` $DIR/core/chains/evm/log/integration_test.go: `.received.getUniqueLogs()` $DIR/core/chains/evm/log/integration_test.go: `.received.getLogs()` $DIR/core/chains/evm/log/integration_test.go: `.received.logsOnBlocks()` $DIR/core/chains/evm/log/integration_test.go: `.start()` $DIR/core/chains/evm/log/integration_test.go: `.stop()` $DIR/core/chains/evm/log/integration_test.go: `.NewFluxAggregator(testutils.NewAddress(), nil)` $DIR/core/chains/evm/log/integration_test.go: `.NewAddress()` $DIR/core/chains/evm/log/integration_test.go: `.NewBlocks(t, 20)` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(1, contract1.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(2, contract1.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(3, contract1.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("listener 1")` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("listener 2")` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("listener 3")` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("listener 4")` $DIR/core/chains/evm/log/integration_test.go: `.register(listener1, contract1, 1)` $DIR/core/chains/evm/log/integration_test.go: `.register(listener2, contract1, 3)` $DIR/core/chains/evm/log/integration_test.go: `.SimulateIncomingHeads(t, blocks.Slice(0, 6), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `.Slice(0, 6)` $DIR/core/chains/evm/log/integration_test.go: `.TrySend(log)` $DIR/core/chains/evm/log/integration_test.go: `.requireBroadcastCount(6)` $DIR/core/chains/evm/log/integration_test.go: `.register(listener3, contract1, 1)` $DIR/core/chains/evm/log/integration_test.go: `.SimulateIncomingHeads(t, blocks.Slice(6, 9), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `.Slice(6, 9)` $DIR/core/chains/evm/log/integration_test.go: `.requireBroadcastCount(8)` $DIR/core/chains/evm/log/integration_test.go: `.register(listener4, contract1, 1)` $DIR/core/chains/evm/log/integration_test.go: `.SimulateIncomingHeads(t, blocks.Slice(9, 12), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `.Slice(9, 12)` $DIR/core/chains/evm/log/integration_test.go: `.received.getUniqueLogs()` $DIR/core/chains/evm/log/integration_test.go: `.start()` $DIR/core/chains/evm/log/integration_test.go: `.stop()` $DIR/core/chains/evm/log/integration_test.go: `.NewFluxAggregator(testutils.NewAddress(), nil)` $DIR/core/chains/evm/log/integration_test.go: `.NewAddress()` $DIR/core/chains/evm/log/integration_test.go: `.NewBlocks(t, 20)` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(1, contract1.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(2, contract1.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(3, contract1.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("listener 1")` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("listener 2")` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("listener 3")` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("listener 4")` $DIR/core/chains/evm/log/integration_test.go: `.register(listener1, contract1, 1)` $DIR/core/chains/evm/log/integration_test.go: `.register(listener2, contract1, 3)` $DIR/core/chains/evm/log/integration_test.go: `.SimulateIncomingHeads(t, blocks.Slice(0, 6), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `.Slice(0, 6)` $DIR/core/chains/evm/log/integration_test.go: `.TrySend(log)` $DIR/core/chains/evm/log/integration_test.go: `.requireBroadcastCount(6)` $DIR/core/chains/evm/log/integration_test.go: `.register(listener3, contract1, 1)` $DIR/core/chains/evm/log/integration_test.go: `.SimulateIncomingHeads(t, blocks.Slice(7, 9), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `.Slice(7, 9)` $DIR/core/chains/evm/log/integration_test.go: `.requireBroadcastCount(9)` $DIR/core/chains/evm/log/integration_test.go: `.register(listener4, contract1, 1)` $DIR/core/chains/evm/log/integration_test.go: `.SimulateIncomingHeads(t, blocks.Slice(10, 12), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `.Slice(10, 12)` $DIR/core/chains/evm/log/integration_test.go: `.received.getUniqueLogs()` $DIR/core/chains/evm/log/integration_test.go: `.start()` $DIR/core/chains/evm/log/integration_test.go: `.stop()` $DIR/core/chains/evm/log/integration_test.go: `.NewFluxAggregator(testutils.NewAddress(), nil)` $DIR/core/chains/evm/log/integration_test.go: `.NewAddress()` $DIR/core/chains/evm/log/integration_test.go: `.NewBlocks(t, 20)` $DIR/core/chains/evm/log/integration_test.go: `.Topic()` $DIR/core/chains/evm/log/integration_test.go: `.NewHash()` $DIR/core/chains/evm/log/integration_test.go: `.NewHash()` $DIR/core/chains/evm/log/integration_test.go: `.NewHash()` $DIR/core/chains/evm/log/integration_test.go: `.NewHash()` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNumWithTopics(1, 0, contract1.Address(), []common.Hash{topic, field1Value1, field2Value1})` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNumWithTopics(1, 1, contract1.Address(), []common.Hash{topic, field1Value2, field2Value2})` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNumWithTopics(2, 0, contract1.Address(), []common.Hash{topic, utils.NewHash(), field2Value2})` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.NewHash()` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNumWithTopics(2, 1, contract1.Address(), []common.Hash{topic, field1Value2, utils.NewHash()})` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.NewHash()` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("listener 0")` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("listener 1")` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("listener 2")` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("listener 3")` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("listener 4")` $DIR/core/chains/evm/log/integration_test.go: `.registerWithTopicValues(listener0, contract1, 1, map[common.Hash][][]log.Topic{ topic: {}, // no filters, so all values allowed }, )` $DIR/core/chains/evm/log/integration_test.go: `.registerWithTopicValues(listener1, contract1, 1, map[common.Hash][][]log.Topic{ topic: {{} /**/, {}}, // two empty filters, so all values allowed }, )` $DIR/core/chains/evm/log/integration_test.go: `.registerWithTopicValues(listener2, contract1, 1, map[common.Hash][][]log.Topic{ topic: { {log.Topic(field1Value1), log.Topic(field1Value2)} /**/, {log.Topic(field2Value1), log.Topic(field2Value2)}, // two values for each field allowed }, }, )` $DIR/core/chains/evm/log/integration_test.go: `.Topic(field1Value1)` $DIR/core/chains/evm/log/integration_test.go: `.Topic(field1Value2)` $DIR/core/chains/evm/log/integration_test.go: `.Topic(field2Value1)` $DIR/core/chains/evm/log/integration_test.go: `.Topic(field2Value2)` $DIR/core/chains/evm/log/integration_test.go: `.registerWithTopicValues(listener3, contract1, 1, map[common.Hash][][]log.Topic{ topic: { {log.Topic(field1Value1), log.Topic(field1Value2)} /**/, {}, // two values allowed for field 1, and any values for field 2 }, }, )` $DIR/core/chains/evm/log/integration_test.go: `.Topic(field1Value1)` $DIR/core/chains/evm/log/integration_test.go: `.Topic(field1Value2)` $DIR/core/chains/evm/log/integration_test.go: `.registerWithTopicValues(listener4, contract1, 1, map[common.Hash][][]log.Topic{ topic: { {log.Topic(field1Value1)} /**/, {log.Topic(field2Value1)}, // some values allowed }, }, )` $DIR/core/chains/evm/log/integration_test.go: `.Topic(field1Value1)` $DIR/core/chains/evm/log/integration_test.go: `.Topic(field2Value1)` $DIR/core/chains/evm/log/integration_test.go: `.SimulateIncomingHeads(t, blocks.Slice(0, 6), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `.Slice(0, 6)` $DIR/core/chains/evm/log/integration_test.go: `.TrySend(log)` $DIR/core/chains/evm/log/integration_test.go: `.received.getUniqueLogs()` $DIR/core/chains/evm/log/integration_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/log/integration_test.go: `.start()` $DIR/core/chains/evm/log/integration_test.go: `.NewFluxAggregator(testutils.NewAddress(), nil)` $DIR/core/chains/evm/log/integration_test.go: `.NewAddress()` $DIR/core/chains/evm/log/integration_test.go: `.NewBlocks(t, 12)` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(1, contract1.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(2, contract1.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(3, contract1.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNumWithIndex(3, 1, contract1.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("listener 1")` $DIR/core/chains/evm/log/integration_test.go: `.register(listener1, contract1, 1)` $DIR/core/chains/evm/log/integration_test.go: `.TrySend(addr1SentLogs[0])` $DIR/core/chains/evm/log/integration_test.go: `.TrySend(addr1SentLogs[1])` $DIR/core/chains/evm/log/integration_test.go: `.TrySend(addr1SentLogs[2])` $DIR/core/chains/evm/log/integration_test.go: `.SimulateIncomingHeads(t, blocks.Slice(0, 4), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `.Slice(0, 4)` $DIR/core/chains/evm/log/integration_test.go: `.TrySend(addr1SentLogs[3])` $DIR/core/chains/evm/log/integration_test.go: `.SimulateIncomingHeads(t, blocks.Slice(4, 9), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `.Slice(4, 9)` $DIR/core/chains/evm/log/integration_test.go: `.requireBroadcastCount(4)` $DIR/core/chains/evm/log/integration_test.go: `.start()` $DIR/core/chains/evm/log/integration_test.go: `.NewFluxAggregator(testutils.NewAddress(), nil)` $DIR/core/chains/evm/log/integration_test.go: `.NewAddress()` $DIR/core/chains/evm/log/integration_test.go: `.NewBlocks(t, 10)` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(1, contract1.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(2, contract1.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(3, contract1.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("listener 1")` $DIR/core/chains/evm/log/integration_test.go: `.register(listener1, contract1, 1)` $DIR/core/chains/evm/log/integration_test.go: `.TrySend(log)` $DIR/core/chains/evm/log/integration_test.go: `.SimulateIncomingHeads(t, blocks.Slice(0, 10), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `.Slice(0, 10)` $DIR/core/chains/evm/log/integration_test.go: `.requireBroadcastCount(3)` $DIR/core/chains/evm/log/integration_test.go: `.stop()` $DIR/core/chains/evm/log/integration_test.go: `.received.getUniqueLogs()` $DIR/core/chains/evm/log/integration_test.go: `.received.getUniqueLogs()` $DIR/core/chains/evm/log/integration_test.go: `.received.getLogs()` $DIR/core/chains/evm/log/integration_test.go: `.start()` $DIR/core/chains/evm/log/integration_test.go: `.NewFluxAggregator(testutils.NewAddress(), nil)` $DIR/core/chains/evm/log/integration_test.go: `.NewAddress()` $DIR/core/chains/evm/log/integration_test.go: `.NewBlocks(t, 12)` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(1, contract1.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(2, contract1.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(3, contract1.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("listener 1")` $DIR/core/chains/evm/log/integration_test.go: `.register(listener1, contract1, 1)` $DIR/core/chains/evm/log/integration_test.go: `.SimulateIncomingHeads(t, blocks.Slice(0, 7), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `.Slice(0, 7)` $DIR/core/chains/evm/log/integration_test.go: `.TrySend(log)` $DIR/core/chains/evm/log/integration_test.go: `.SimulateIncomingHeads(t, blocks.Slice(7, 9), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `.Slice(7, 9)` $DIR/core/chains/evm/log/integration_test.go: `.requireBroadcastCount(3)` $DIR/core/chains/evm/log/integration_test.go: `.stop()` $DIR/core/chains/evm/log/integration_test.go: `.received.getUniqueLogs()` $DIR/core/chains/evm/log/integration_test.go: `.received.getUniqueLogs()` $DIR/core/chains/evm/log/integration_test.go: `.received.getLogs()` $DIR/core/chains/evm/log/integration_test.go: `.SkipShortDB(t)` $DIR/core/chains/evm/log/integration_test.go: `.NewClient(t)` $DIR/core/chains/evm/log/integration_test.go: `.On("ConfiguredChainID", mock.Anything)` $DIR/core/chains/evm/log/integration_test.go: `.Return(&cltest.FixtureChainID)` $DIR/core/chains/evm/log/integration_test.go: `.On("SubscribeFilterLogs", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/log/integration_test.go: `. Return( func(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log) ethereum.Subscription { defer close(chStarted) sub := mockEth.NewSub(t) chchRawLogs <- evmtestutils.NewRawSub(ch, sub.Err()) return sub }, func(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log) error { return nil }, )` $DIR/core/chains/evm/log/integration_test.go: `.NewSub(t)` $DIR/core/chains/evm/log/integration_test.go: `.NewRawSub(ch, sub.Err())` $DIR/core/chains/evm/log/integration_test.go: `.Err()` $DIR/core/chains/evm/log/integration_test.go: `. Once()` $DIR/core/chains/evm/log/integration_test.go: `.On("SubscribeFilterLogs", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/log/integration_test.go: `. Return( func(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log) ethereum.Subscription { sub := mockEth.NewSub(t) chchRawLogs <- evmtestutils.NewRawSub(ch, sub.Err()) return sub }, func(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log) error { return nil }, )` $DIR/core/chains/evm/log/integration_test.go: `.NewSub(t)` $DIR/core/chains/evm/log/integration_test.go: `.NewRawSub(ch, sub.Err())` $DIR/core/chains/evm/log/integration_test.go: `.Err()` $DIR/core/chains/evm/log/integration_test.go: `. Times(3)` $DIR/core/chains/evm/log/integration_test.go: `.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/log/integration_test.go: `. Return(&evmtypes.Head{Number: blockHeight}, nil)` $DIR/core/chains/evm/log/integration_test.go: `.On("FilterLogs", mock.Anything, mock.Anything)` $DIR/core/chains/evm/log/integration_test.go: `. Run(func(args mock.Arguments) { query := args.Get(1).(ethereum.FilterQuery) require.Equal(t, big.NewInt(expectedBlock), query.FromBlock) require.Contains(t, query.Addresses, contract0.Address()) require.Len(t, query.Addresses, 1) })` $DIR/core/chains/evm/log/integration_test.go: `.Get(1)` $DIR/core/chains/evm/log/integration_test.go: `. Return(nil, nil)` $DIR/core/chains/evm/log/integration_test.go: `. Times(backfillTimes)` $DIR/core/chains/evm/log/integration_test.go: `.On("FilterLogs", mock.Anything, mock.Anything)` $DIR/core/chains/evm/log/integration_test.go: `. Run(func(args mock.Arguments) { query := args.Get(1).(ethereum.FilterQuery) require.Equal(t, big.NewInt(expectedBlock), query.FromBlock) require.Contains(t, query.Addresses, contract0.Address()) require.Contains(t, query.Addresses, contract1.Address()) require.Len(t, query.Addresses, 2) })` $DIR/core/chains/evm/log/integration_test.go: `.Get(1)` $DIR/core/chains/evm/log/integration_test.go: `. Return(nil, nil)` $DIR/core/chains/evm/log/integration_test.go: `. Once()` $DIR/core/chains/evm/log/integration_test.go: `.On("FilterLogs", mock.Anything, mock.Anything)` $DIR/core/chains/evm/log/integration_test.go: `. Run(func(args mock.Arguments) { query := args.Get(1).(ethereum.FilterQuery) require.Equal(t, big.NewInt(expectedBlock), query.FromBlock) require.Contains(t, query.Addresses, contract0.Address()) require.Contains(t, query.Addresses, contract1.Address()) require.Contains(t, query.Addresses, contract2.Address()) require.Len(t, query.Addresses, 3) })` $DIR/core/chains/evm/log/integration_test.go: `.Get(1)` $DIR/core/chains/evm/log/integration_test.go: `. Return(nil, nil)` $DIR/core/chains/evm/log/integration_test.go: `. Once()` $DIR/core/chains/evm/log/integration_test.go: `.lb.AddDependents(1)` $DIR/core/chains/evm/log/integration_test.go: `.start()` $DIR/core/chains/evm/log/integration_test.go: `.stop()` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("0")` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("1")` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("2")` $DIR/core/chains/evm/log/integration_test.go: `.register(listener0, contract0, 1)` $DIR/core/chains/evm/log/integration_test.go: `.unsubscribeAll()` $DIR/core/chains/evm/log/integration_test.go: `.lb.DependentReady()` $DIR/core/chains/evm/log/integration_test.go: `.After(testutils.WaitTimeout(t))` $DIR/core/chains/evm/log/integration_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/log/integration_test.go: `.After(testutils.WaitTimeout(t))` $DIR/core/chains/evm/log/integration_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/log/integration_test.go: `.register(listener1, contract1, 1)` $DIR/core/chains/evm/log/integration_test.go: `.After(testutils.WaitTimeout(t))` $DIR/core/chains/evm/log/integration_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/log/integration_test.go: `.register(listener2, contract2, 1)` $DIR/core/chains/evm/log/integration_test.go: `.After(testutils.WaitTimeout(t))` $DIR/core/chains/evm/log/integration_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/log/integration_test.go: `.lb.ReplayFromBlock(125, false)` $DIR/core/chains/evm/log/integration_test.go: `.After(testutils.WaitTimeout(t))` $DIR/core/chains/evm/log/integration_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/log/integration_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/log/integration_test.go: `.HexToAddress("0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")` $DIR/core/chains/evm/log/integration_test.go: `.HexToAddress("0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb")` $DIR/core/chains/evm/log/integration_test.go: `.NewBlocks(t, 20)` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNumWithIndex(uint64(n), 0, addrA)` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNumWithIndex(uint64(n), 1, addrB)` $DIR/core/chains/evm/log/integration_test.go: `.Run(test.name, func(t *testing.T) { const backfillDepth = 5 helper := newBroadcasterHelper(t, int64(test.blockHeight1), 2, nil, func(c *chainlink.Config, s *chainlink.Secrets) { // something other than default c.EVM[0].BlockBackfillDepth = ptr[uint32](backfillDepth) }) helper.start() defer helper.stop() logListenerA := helper.newLogListenerWithJob("logListenerA") logListenerB := helper.newLogListenerWithJob("logListenerB") contractA, err := flux_aggregator_wrapper.NewFluxAggregator(addrA, nil) require.NoError(t, err) contractB, err := flux_aggregator_wrapper.NewFluxAggregator(addrB, nil) require.NoError(t, err) // Register listener A helper.register(logListenerA, contractA, 1) // Send initial logs chRawLogs1 := <-helper.chchRawLogs headsDone := cltest.SimulateIncomingHeads(t, blocks.Slice(test.blockHeight1, test.blockHeight2+2), helper.lb, cltest.HeadTrackableFunc(func(_ context.Context, head *evmtypes.Head) { n := uint(head.Number) if l, ok := logsA[n]; ok && slices.Contains(test.batch1, n) { chRawLogs1.TrySend(l) } })) helper.requireBroadcastCount(len(test.batch1)) expectedA := newReceived(pickLogs(logsA, test.batch1)) logListenerA.requireAllReceived(t, expectedA) <-headsDone helper.mockEth.EthClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(&evmtypes.Head{Number: int64(test.blockHeight2)}, nil).Once() combinedLogs := append(pickLogs(logsA, test.backfillableLogs), pickLogs(logsB, test.backfillableLogs)...) call := helper.mockEth.EthClient.On("FilterLogs", mock.Anything, mock.Anything).Return(combinedLogs, nil).Once() call.Run(func(args mock.Arguments) { // Validate that the ethereum.FilterQuery is specified correctly for the backfill that we expect fromBlock := args.Get(1).(ethereum.FilterQuery).FromBlock expected := big.NewInt(0) blockNumber := helper.lb.BackfillBlockNumber() if blockNumber.Valid && blockNumber.Int64 > int64(test.blockHeight2-backfillDepth) { expected = big.NewInt(blockNumber.Int64) } else if test.blockHeight2 > backfillDepth { expected = big.NewInt(int64(test.blockHeight2) - backfillDepth) } require.Equal(t, expected, fromBlock) }) // Register listener B (triggers re-subscription) helper.register(logListenerB, contractB, 1) // Send second batch of new logs chRawLogs2 := <-helper.chchRawLogs headsDone = cltest.SimulateIncomingHeads(t, blocks.Slice(test.blockHeight2, -1), helper.lb, cltest.HeadTrackableFunc(func(_ context.Context, head *evmtypes.Head) { n := uint(head.Number) if l, ok := logsA[n]; ok && slices.Contains(test.batch2, n) { chRawLogs2.TrySend(l) } if l, ok := logsB[n]; ok && slices.Contains(test.batch2, n) { chRawLogs2.TrySend(l) } })) defer func() { <-headsDone }() expectedA = newReceived(pickLogs(logsA, test.expectedFilteredA)) expectedB := newReceived(pickLogs(logsB, test.expectedFilteredB)) logListenerA.requireAllReceived(t, expectedA) logListenerB.requireAllReceived(t, expectedB) helper.requireBroadcastCount(len(test.expectedFilteredA) + len(test.expectedFilteredB)) })` $DIR/core/chains/evm/log/integration_test.go: `.start()` $DIR/core/chains/evm/log/integration_test.go: `.stop()` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("logListenerA")` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("logListenerB")` $DIR/core/chains/evm/log/integration_test.go: `.NewFluxAggregator(addrA, nil)` $DIR/core/chains/evm/log/integration_test.go: `.NewFluxAggregator(addrB, nil)` $DIR/core/chains/evm/log/integration_test.go: `.register(logListenerA, contractA, 1)` $DIR/core/chains/evm/log/integration_test.go: `.SimulateIncomingHeads(t, blocks.Slice(test.blockHeight1, test.blockHeight2+2), helper.lb, cltest.HeadTrackableFunc(func(_ context.Context, head *evmtypes.Head) { n := uint(head.Number) if l, ok := logsA[n]; ok && slices.Contains(test.batch1, n) { chRawLogs1.TrySend(l) } }))` $DIR/core/chains/evm/log/integration_test.go: `.Slice(test.blockHeight1, test.blockHeight2+2)` $DIR/core/chains/evm/log/integration_test.go: `.HeadTrackableFunc(func(_ context.Context, head *evmtypes.Head) { n := uint(head.Number) if l, ok := logsA[n]; ok && slices.Contains(test.batch1, n) { chRawLogs1.TrySend(l) } })` $DIR/core/chains/evm/log/integration_test.go: `.Contains(test.batch1, n)` $DIR/core/chains/evm/log/integration_test.go: `.TrySend(l)` $DIR/core/chains/evm/log/integration_test.go: `.requireBroadcastCount(len(test.batch1))` $DIR/core/chains/evm/log/integration_test.go: `.requireAllReceived(t, expectedA)` $DIR/core/chains/evm/log/integration_test.go: `.mockEth.EthClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/log/integration_test.go: `.Return(&evmtypes.Head{Number: int64(test.blockHeight2)}, nil)` $DIR/core/chains/evm/log/integration_test.go: `.Once()` $DIR/core/chains/evm/log/integration_test.go: `.mockEth.EthClient.On("FilterLogs", mock.Anything, mock.Anything)` $DIR/core/chains/evm/log/integration_test.go: `.Return(combinedLogs, nil)` $DIR/core/chains/evm/log/integration_test.go: `.Once()` $DIR/core/chains/evm/log/integration_test.go: `.Run(func(args mock.Arguments) { // Validate that the ethereum.FilterQuery is specified correctly for the backfill that we expect fromBlock := args.Get(1).(ethereum.FilterQuery).FromBlock expected := big.NewInt(0) blockNumber := helper.lb.BackfillBlockNumber() if blockNumber.Valid && blockNumber.Int64 > int64(test.blockHeight2-backfillDepth) { expected = big.NewInt(blockNumber.Int64) } else if test.blockHeight2 > backfillDepth { expected = big.NewInt(int64(test.blockHeight2) - backfillDepth) } require.Equal(t, expected, fromBlock) })` $DIR/core/chains/evm/log/integration_test.go: `.Get(1)` $DIR/core/chains/evm/log/integration_test.go: `.NewInt(0)` $DIR/core/chains/evm/log/integration_test.go: `.lb.BackfillBlockNumber()` $DIR/core/chains/evm/log/integration_test.go: `.NewInt(blockNumber.Int64)` $DIR/core/chains/evm/log/integration_test.go: `.NewInt(int64(test.blockHeight2) - backfillDepth)` $DIR/core/chains/evm/log/integration_test.go: `.register(logListenerB, contractB, 1)` $DIR/core/chains/evm/log/integration_test.go: `.SimulateIncomingHeads(t, blocks.Slice(test.blockHeight2, -1), helper.lb, cltest.HeadTrackableFunc(func(_ context.Context, head *evmtypes.Head) { n := uint(head.Number) if l, ok := logsA[n]; ok && slices.Contains(test.batch2, n) { chRawLogs2.TrySend(l) } if l, ok := logsB[n]; ok && slices.Contains(test.batch2, n) { chRawLogs2.TrySend(l) } }))` $DIR/core/chains/evm/log/integration_test.go: `.Slice(test.blockHeight2, -1)` $DIR/core/chains/evm/log/integration_test.go: `.HeadTrackableFunc(func(_ context.Context, head *evmtypes.Head) { n := uint(head.Number) if l, ok := logsA[n]; ok && slices.Contains(test.batch2, n) { chRawLogs2.TrySend(l) } if l, ok := logsB[n]; ok && slices.Contains(test.batch2, n) { chRawLogs2.TrySend(l) } })` $DIR/core/chains/evm/log/integration_test.go: `.Contains(test.batch2, n)` $DIR/core/chains/evm/log/integration_test.go: `.TrySend(l)` $DIR/core/chains/evm/log/integration_test.go: `.Contains(test.batch2, n)` $DIR/core/chains/evm/log/integration_test.go: `.TrySend(l)` $DIR/core/chains/evm/log/integration_test.go: `.requireAllReceived(t, expectedA)` $DIR/core/chains/evm/log/integration_test.go: `.requireAllReceived(t, expectedB)` $DIR/core/chains/evm/log/integration_test.go: `.requireBroadcastCount(len(test.expectedFilteredA) + len(test.expectedFilteredB))` $DIR/core/chains/evm/log/integration_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/log/integration_test.go: `.RunHealthy(t, mailboxtest.NewMonitor(t))` $DIR/core/chains/evm/log/integration_test.go: `.NewMonitor(t)` $DIR/core/chains/evm/log/integration_test.go: `.NewBroadcaster(nil, ethClient, nil, logger.Test(t), nil, mailMon)` $DIR/core/chains/evm/log/integration_test.go: `.Test(t)` $DIR/core/chains/evm/log/integration_test.go: `.ExportedAppendLogChannel(ch1, ch2)` $DIR/core/chains/evm/log/integration_test.go: `.ExportedAppendLogChannel(chCombined, ch3)` $DIR/core/chains/evm/log/integration_test.go: `.start()` $DIR/core/chains/evm/log/integration_test.go: `.stop()` $DIR/core/chains/evm/log/integration_test.go: `.NewBlocks(t, 20)` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("logListener")` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(0, contract.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(1, contract.Address())` $DIR/core/chains/evm/log/integration_test.go: `.Address()` $DIR/core/chains/evm/log/integration_test.go: `.On("ParseLog", log1)` $DIR/core/chains/evm/log/integration_test.go: `.Return(flux_aggregator_wrapper.FluxAggregatorNewRound{}, nil)` $DIR/core/chains/evm/log/integration_test.go: `.On("ParseLog", log2)` $DIR/core/chains/evm/log/integration_test.go: `.Return(flux_aggregator_wrapper.FluxAggregatorAnswerUpdated{}, nil)` $DIR/core/chains/evm/log/integration_test.go: `.register(logListener, contract, uint32(5))` $DIR/core/chains/evm/log/integration_test.go: `.SimulateIncomingHeads(t, blocks.Slice(3, 20), helper.lb)` $DIR/core/chains/evm/log/integration_test.go: `.Slice(3, 20)` $DIR/core/chains/evm/log/integration_test.go: `.TrySend(log1)` $DIR/core/chains/evm/log/integration_test.go: `.TrySend(log2)` $DIR/core/chains/evm/log/integration_test.go: `.NewWithT(t)` $DIR/core/chains/evm/log/integration_test.go: `.start()` $DIR/core/chains/evm/log/integration_test.go: `.stop()` $DIR/core/chains/evm/log/integration_test.go: `.NewBlocks(t, 10)` $DIR/core/chains/evm/log/integration_test.go: `.ForkAt(t, 1, 5)` $DIR/core/chains/evm/log/integration_test.go: `.NewAddress()` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(0, addr)` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(1, addr)` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(2, addr)` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNumRemoved(1, addr)` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNumRemoved(2, addr)` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(1, addr)` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNum(2, addr)` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNumWithIndex(3, 0, addr)` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNumWithIndex(3, 1, addr)` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNumRemoved(1, addr)` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNumRemoved(2, addr)` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNumWithIndexRemoved(3, 0, addr)` $DIR/core/chains/evm/log/integration_test.go: `.LogOnBlockNumWithIndexRemoved(3, 1, addr)` $DIR/core/chains/evm/log/integration_test.go: `.Head(0)` $DIR/core/chains/evm/log/integration_test.go: `.Head(2)` $DIR/core/chains/evm/log/integration_test.go: `.Head(3)` $DIR/core/chains/evm/log/integration_test.go: `.Head(1)` $DIR/core/chains/evm/log/integration_test.go: `.Head(2)` $DIR/core/chains/evm/log/integration_test.go: `.Head(3)` $DIR/core/chains/evm/log/integration_test.go: `.Head(4)` $DIR/core/chains/evm/log/integration_test.go: `.Head(4)` $DIR/core/chains/evm/log/integration_test.go: `.Head(5)` $DIR/core/chains/evm/log/integration_test.go: `.Head(6)` $DIR/core/chains/evm/log/integration_test.go: `.Head(7)` $DIR/core/chains/evm/log/integration_test.go: `.NewFluxAggregator(addr, nil)` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("listenerA")` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("listenerB")` $DIR/core/chains/evm/log/integration_test.go: `.register(listenerA, contract, 1)` $DIR/core/chains/evm/log/integration_test.go: `.register(listenerB, contract, 3)` $DIR/core/chains/evm/log/integration_test.go: `.Context(t)` $DIR/core/chains/evm/log/integration_test.go: `.lb.OnNewLongestChain(ctx, x)` $DIR/core/chains/evm/log/integration_test.go: `.TrySend(x)` $DIR/core/chains/evm/log/integration_test.go: `.Sleep(250 * time.Millisecond)` $DIR/core/chains/evm/log/integration_test.go: `.Eventually(func() []uint64 { return listenerA.getUniqueLogsBlockNumbers() }, testutils.WaitTimeout(t), time.Second)` $DIR/core/chains/evm/log/integration_test.go: `.getUniqueLogsBlockNumbers()` $DIR/core/chains/evm/log/integration_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/log/integration_test.go: `. Should(gomega.Equal([]uint64{0, 1, 2, 1, 2, 3, 3}))` $DIR/core/chains/evm/log/integration_test.go: `.Equal([]uint64{0, 1, 2, 1, 2, 3, 3})` $DIR/core/chains/evm/log/integration_test.go: `.Eventually(func() []uint64 { return listenerB.getUniqueLogsBlockNumbers() }, testutils.WaitTimeout(t), time.Second)` $DIR/core/chains/evm/log/integration_test.go: `.getUniqueLogsBlockNumbers()` $DIR/core/chains/evm/log/integration_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/log/integration_test.go: `. Should(gomega.Equal([]uint64{0, 1, 1, 2, 2}))` $DIR/core/chains/evm/log/integration_test.go: `.Equal([]uint64{0, 1, 1, 2, 2})` $DIR/core/chains/evm/log/integration_test.go: `.unsubscribeAll()` $DIR/core/chains/evm/log/integration_test.go: `.getUniqueLogs()` $DIR/core/chains/evm/log/integration_test.go: `.NewWithT(t)` $DIR/core/chains/evm/log/integration_test.go: `.mockEth.EthClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/log/integration_test.go: `.Return(&evmtypes.Head{Number: blockHeight}, nil)` $DIR/core/chains/evm/log/integration_test.go: `.Times(1)` $DIR/core/chains/evm/log/integration_test.go: `.mockEth.EthClient.On("FilterLogs", mock.Anything, mock.Anything)` $DIR/core/chains/evm/log/integration_test.go: `.Return(nil, nil)` $DIR/core/chains/evm/log/integration_test.go: `.Times(1)` $DIR/core/chains/evm/log/integration_test.go: `.start()` $DIR/core/chains/evm/log/integration_test.go: `.stop()` $DIR/core/chains/evm/log/integration_test.go: `.NewAddress()` $DIR/core/chains/evm/log/integration_test.go: `.NewFluxAggregator(addr1, nil)` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("1")` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("2")` $DIR/core/chains/evm/log/integration_test.go: `.registerWithTopics(listener1, contract, topics1, 1)` $DIR/core/chains/evm/log/integration_test.go: `.Consistently(func() int32 { return helper.mockEth.SubscribeCallCount() }, 1*time.Second, cltest.DBPollingInterval)` $DIR/core/chains/evm/log/integration_test.go: `.mockEth.SubscribeCallCount()` $DIR/core/chains/evm/log/integration_test.go: `.Should(gomega.Equal(int32(1)))` $DIR/core/chains/evm/log/integration_test.go: `.Equal(int32(1))` $DIR/core/chains/evm/log/integration_test.go: `.registerWithTopics(listener2, contract, topics2, 1)` $DIR/core/chains/evm/log/integration_test.go: `.Consistently(func() int32 { return helper.mockEth.SubscribeCallCount() }, 1*time.Second, cltest.DBPollingInterval)` $DIR/core/chains/evm/log/integration_test.go: `.mockEth.SubscribeCallCount()` $DIR/core/chains/evm/log/integration_test.go: `.Should(gomega.Equal(int32(2)))` $DIR/core/chains/evm/log/integration_test.go: `.Equal(int32(2))` $DIR/core/chains/evm/log/integration_test.go: `.SkipShortDB(t)` $DIR/core/chains/evm/log/integration_test.go: `.NewWithT(t)` $DIR/core/chains/evm/log/integration_test.go: `.NewClient(t)` $DIR/core/chains/evm/log/integration_test.go: `.On("ConfiguredChainID")` $DIR/core/chains/evm/log/integration_test.go: `.Return(big.NewInt(0))` $DIR/core/chains/evm/log/integration_test.go: `.NewInt(0)` $DIR/core/chains/evm/log/integration_test.go: `.Maybe()` $DIR/core/chains/evm/log/integration_test.go: `.On("SubscribeFilterLogs", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/log/integration_test.go: `. Return( func(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log) ethereum.Subscription { sub := mockEth.NewSub(t) logsChCh <- evmtestutils.NewRawSub(ch, sub.Err()) return sub }, func(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log) error { return nil }, )` $DIR/core/chains/evm/log/integration_test.go: `.NewSub(t)` $DIR/core/chains/evm/log/integration_test.go: `.NewRawSub(ch, sub.Err())` $DIR/core/chains/evm/log/integration_test.go: `.Err()` $DIR/core/chains/evm/log/integration_test.go: `. Once()` $DIR/core/chains/evm/log/integration_test.go: `.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/log/integration_test.go: `. Return(&evmtypes.Head{Number: 1}, nil)` $DIR/core/chains/evm/log/integration_test.go: `.On("FilterLogs", mock.Anything, mock.Anything)` $DIR/core/chains/evm/log/integration_test.go: `. Return(nil, nil)` $DIR/core/chains/evm/log/integration_test.go: `.start()` $DIR/core/chains/evm/log/integration_test.go: `.stop()` $DIR/core/chains/evm/log/integration_test.go: `.HexToAddress("0xf0d54349aDdcf704F77AE15b96510dEA15cb7952")` $DIR/core/chains/evm/log/integration_test.go: `.NewFluxAggregator(addr, nil)` $DIR/core/chains/evm/log/integration_test.go: `.NewHash()` $DIR/core/chains/evm/log/integration_test.go: `.Topic()` $DIR/core/chains/evm/log/integration_test.go: `.NewHash()` $DIR/core/chains/evm/log/integration_test.go: `.NewHash()` $DIR/core/chains/evm/log/integration_test.go: `.Topic()` $DIR/core/chains/evm/log/integration_test.go: `.NewHash()` $DIR/core/chains/evm/log/integration_test.go: `.NewHash()` $DIR/core/chains/evm/log/integration_test.go: `.Topic()` $DIR/core/chains/evm/log/integration_test.go: `.NewHash()` $DIR/core/chains/evm/log/integration_test.go: `.NewHash()` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("1")` $DIR/core/chains/evm/log/integration_test.go: `.register(listener1, contract1, 0)` $DIR/core/chains/evm/log/integration_test.go: `.newLogListenerWithJob("2")` $DIR/core/chains/evm/log/integration_test.go: `.register(listener2, contract1, 0)` $DIR/core/chains/evm/log/integration_test.go: `.TrySend(log)` $DIR/core/chains/evm/log/integration_test.go: `.Eventually(func() bool { helper.lb.Pause() defer helper.lb.Resume() return helper.lb.LogsFromBlock(bh) == len(addr1SentLogs) }, 2*time.Second, 100*time.Millisecond)` $DIR/core/chains/evm/log/integration_test.go: `.lb.Pause()` $DIR/core/chains/evm/log/integration_test.go: `.lb.Resume()` $DIR/core/chains/evm/log/integration_test.go: `.lb.LogsFromBlock(bh)` $DIR/core/chains/evm/log/integration_test.go: `.Should(gomega.BeTrue())` $DIR/core/chains/evm/log/integration_test.go: `.BeTrue()` $DIR/core/chains/evm/log/integration_test.go: `.lb.OnNewLongestChain(testutils.Context(t), &evmtypes.Head{Number: 2})` $DIR/core/chains/evm/log/integration_test.go: `.Context(t)` $DIR/core/chains/evm/log/integration_test.go: `.Eventually(func() bool { return len(listener1.getUniqueLogs()) == len(addr1SentLogs) && len(listener2.getUniqueLogs()) == len(addr1SentLogs) }, 2*time.Second, cltest.DBPollingInterval)` $DIR/core/chains/evm/log/integration_test.go: `.getUniqueLogs()` $DIR/core/chains/evm/log/integration_test.go: `.getUniqueLogs()` $DIR/core/chains/evm/log/integration_test.go: `.Should(gomega.BeTrue())` $DIR/core/chains/evm/log/integration_test.go: `.BeTrue()` $DIR/core/chains/evm/log/integration_test.go: `.Consistently(func() bool { return len(listener1.getUniqueLogs()) == len(addr1SentLogs) && len(listener2.getUniqueLogs()) == len(addr1SentLogs) }, 1*time.Second, cltest.DBPollingInterval)` $DIR/core/chains/evm/log/integration_test.go: `.getUniqueLogs()` $DIR/core/chains/evm/log/integration_test.go: `.getUniqueLogs()` $DIR/core/chains/evm/log/integration_test.go: `.BeTrue()` $DIR/core/chains/evm/log/orm_test.go: `t.Run("WasBroadcastConsumed_DNE", func(t *testing.T) { _, err := orm.WasBroadcastConsumed(testutils.Context(t), rawLog.BlockHash, rawLog.Index, listener.JobID()) require.NoError(t, err) })` $DIR/core/chains/evm/log/orm_test.go: `t.Run("WasBroadcastConsumed_false", func(t *testing.T) { was, err := orm.WasBroadcastConsumed(testutils.Context(t), rawLog.BlockHash, rawLog.Index, listener.JobID()) require.NoError(t, err) require.False(t, was) })` $DIR/core/chains/evm/log/orm_test.go: `err = orm.SetPendingMinBlock(ctx, &num10)` $DIR/core/chains/evm/log/orm_test.go: `num, err = orm.GetPendingMinBlock(ctx)` $DIR/core/chains/evm/log/orm_test.go: `err = orm.SetPendingMinBlock(ctx, nil)` $DIR/core/chains/evm/log/orm_test.go: `num, err = orm.GetPendingMinBlock(ctx)` $DIR/core/chains/evm/log/orm_test.go: `logBefore.BlockNumber = 34` $DIR/core/chains/evm/log/orm_test.go: `logAt.BlockNumber = 38` $DIR/core/chains/evm/log/orm_test.go: `logAfter.BlockNumber = 40` $DIR/core/chains/evm/log/orm_test.go: `consumed, err = orm.WasBroadcastConsumed(ctx, logAt.BlockHash, logAt.Index, job1.ID)` $DIR/core/chains/evm/log/orm_test.go: `consumed, err = orm.WasBroadcastConsumed(ctx, logAfter.BlockHash, logAfter.Index, job2.ID)` $DIR/core/chains/evm/log/orm_test.go: `t.Run(tt.name, func(t *testing.T) { db := pgtest.NewSqlxDB(t) ctx := testutils.Context(t) orm := log.NewORM(db, cltest.FixtureChainID) jobID := cltest.MustInsertV2JobSpec(t, db, common.BigToAddress(big.NewInt(rand.Int63()))).ID for _, b := range tt.broadcasts { if b.Consumed { err := orm.MarkBroadcastConsumed(ctx, b.BlockHash, b.BlockNumber.Uint64(), b.LogIndex, jobID) require.NoError(t, err) } else { err := orm.CreateBroadcast(ctx, b.BlockHash, b.BlockNumber.Uint64(), b.LogIndex, jobID) require.NoError(t, err) } } if tt.pendingBlockNum != nil { require.NoError(t, orm.SetPendingMinBlock(ctx, tt.pendingBlockNum)) } pendingBlockNum, err := orm.Reinitialize(ctx) require.NoError(t, err) assert.Equal(t, tt.expPendingBlockNum, pendingBlockNum) pendingBlockNum, err = orm.GetPendingMinBlock(ctx) if assert.NoError(t, err) { assert.Equal(t, tt.expPendingBlockNum, pendingBlockNum) } bs, err := orm.FindBroadcasts(ctx, 0, 20) if assert.NoError(t, err) { for _, b := range bs { assert.True(t, b.Consumed) } } })` $DIR/core/chains/evm/log/orm_test.go: `pendingBlockNum, err = orm.GetPendingMinBlock(ctx)` $DIR/core/chains/evm/log/orm_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/log/orm_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/log/orm_test.go: `.Eth()` $DIR/core/chains/evm/log/orm_test.go: `.NewORM(db, cltest.FixtureChainID)` $DIR/core/chains/evm/log/orm_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/log/orm_test.go: `.MustInsertV2JobSpec(t, db, addr)` $DIR/core/chains/evm/log/orm_test.go: `.RandomLog(t)` $DIR/core/chains/evm/log/orm_test.go: `.JobID()` $DIR/core/chains/evm/log/orm_test.go: `.FixtureChainID.String()` $DIR/core/chains/evm/log/orm_test.go: `.Exec(selectQuery, queryArgs...)` $DIR/core/chains/evm/log/orm_test.go: `.RowsAffected()` $DIR/core/chains/evm/log/orm_test.go: `.Run("WasBroadcastConsumed_DNE", func(t *testing.T) { _, err := orm.WasBroadcastConsumed(testutils.Context(t), rawLog.BlockHash, rawLog.Index, listener.JobID()) require.NoError(t, err) })` $DIR/core/chains/evm/log/orm_test.go: `.WasBroadcastConsumed(testutils.Context(t), rawLog.BlockHash, rawLog.Index, listener.JobID())` $DIR/core/chains/evm/log/orm_test.go: `.Context(t)` $DIR/core/chains/evm/log/orm_test.go: `.JobID()` $DIR/core/chains/evm/log/orm_test.go: `.Run("WasBroadcastConsumed_false", func(t *testing.T) { was, err := orm.WasBroadcastConsumed(testutils.Context(t), rawLog.BlockHash, rawLog.Index, listener.JobID()) require.NoError(t, err) require.False(t, was) })` $DIR/core/chains/evm/log/orm_test.go: `.WasBroadcastConsumed(testutils.Context(t), rawLog.BlockHash, rawLog.Index, listener.JobID())` $DIR/core/chains/evm/log/orm_test.go: `.Context(t)` $DIR/core/chains/evm/log/orm_test.go: `.JobID()` $DIR/core/chains/evm/log/orm_test.go: `.WasBroadcastConsumed(testutils.Context(t), rawLog.BlockHash, rawLog.Index, listener.JobID())` $DIR/core/chains/evm/log/orm_test.go: `.Context(t)` $DIR/core/chains/evm/log/orm_test.go: `.JobID()` $DIR/core/chains/evm/log/orm_test.go: `.Context(t)` $DIR/core/chains/evm/log/orm_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/log/orm_test.go: `.NewORM(db, cltest.FixtureChainID)` $DIR/core/chains/evm/log/orm_test.go: `.GetPendingMinBlock(ctx)` $DIR/core/chains/evm/log/orm_test.go: `.SetPendingMinBlock(ctx, &num10)` $DIR/core/chains/evm/log/orm_test.go: `.GetPendingMinBlock(ctx)` $DIR/core/chains/evm/log/orm_test.go: `.SetPendingMinBlock(ctx, nil)` $DIR/core/chains/evm/log/orm_test.go: `.GetPendingMinBlock(ctx)` $DIR/core/chains/evm/log/orm_test.go: `.Context(t)` $DIR/core/chains/evm/log/orm_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/log/orm_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/log/orm_test.go: `.Eth()` $DIR/core/chains/evm/log/orm_test.go: `.NewORM(db, cltest.FixtureChainID)` $DIR/core/chains/evm/log/orm_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/log/orm_test.go: `.MustInsertV2JobSpec(t, db, addr1)` $DIR/core/chains/evm/log/orm_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/log/orm_test.go: `.MustInsertV2JobSpec(t, db, addr2)` $DIR/core/chains/evm/log/orm_test.go: `.RandomLog(t)` $DIR/core/chains/evm/log/orm_test.go: `.RandomLog(t)` $DIR/core/chains/evm/log/orm_test.go: `.RandomLog(t)` $DIR/core/chains/evm/log/orm_test.go: `.WasBroadcastConsumed(ctx, logBefore.BlockHash, logBefore.Index, job1.ID)` $DIR/core/chains/evm/log/orm_test.go: `.WasBroadcastConsumed(ctx, logAt.BlockHash, logAt.Index, job1.ID)` $DIR/core/chains/evm/log/orm_test.go: `.WasBroadcastConsumed(ctx, logAfter.BlockHash, logAfter.Index, job2.ID)` $DIR/core/chains/evm/log/orm_test.go: `.BigToHash(big.NewInt(rand.Int63()))` $DIR/core/chains/evm/log/orm_test.go: `.NewInt(rand.Int63())` $DIR/core/chains/evm/log/orm_test.go: `.Int63()` $DIR/core/chains/evm/log/orm_test.go: `.NewInt(blockNum)` $DIR/core/chains/evm/log/orm_test.go: `.Uint32()` $DIR/core/chains/evm/log/orm_test.go: `.BigToHash(big.NewInt(rand.Int63()))` $DIR/core/chains/evm/log/orm_test.go: `.NewInt(rand.Int63())` $DIR/core/chains/evm/log/orm_test.go: `.Int63()` $DIR/core/chains/evm/log/orm_test.go: `.NewInt(blockNum)` $DIR/core/chains/evm/log/orm_test.go: `.Uint32()` $DIR/core/chains/evm/log/orm_test.go: `.IntFrom(10)` $DIR/core/chains/evm/log/orm_test.go: `.Ptr()` $DIR/core/chains/evm/log/orm_test.go: `.IntFrom(10)` $DIR/core/chains/evm/log/orm_test.go: `.Ptr()` $DIR/core/chains/evm/log/orm_test.go: `.IntFrom(9)` $DIR/core/chains/evm/log/orm_test.go: `.Ptr()` $DIR/core/chains/evm/log/orm_test.go: `.IntFrom(10)` $DIR/core/chains/evm/log/orm_test.go: `.Ptr()` $DIR/core/chains/evm/log/orm_test.go: `.IntFrom(9)` $DIR/core/chains/evm/log/orm_test.go: `.Ptr()` $DIR/core/chains/evm/log/orm_test.go: `.IntFrom(10)` $DIR/core/chains/evm/log/orm_test.go: `.Ptr()` $DIR/core/chains/evm/log/orm_test.go: `.IntFrom(10)` $DIR/core/chains/evm/log/orm_test.go: `.Ptr()` $DIR/core/chains/evm/log/orm_test.go: `.Run(tt.name, func(t *testing.T) { db := pgtest.NewSqlxDB(t) ctx := testutils.Context(t) orm := log.NewORM(db, cltest.FixtureChainID) jobID := cltest.MustInsertV2JobSpec(t, db, common.BigToAddress(big.NewInt(rand.Int63()))).ID for _, b := range tt.broadcasts { if b.Consumed { err := orm.MarkBroadcastConsumed(ctx, b.BlockHash, b.BlockNumber.Uint64(), b.LogIndex, jobID) require.NoError(t, err) } else { err := orm.CreateBroadcast(ctx, b.BlockHash, b.BlockNumber.Uint64(), b.LogIndex, jobID) require.NoError(t, err) } } if tt.pendingBlockNum != nil { require.NoError(t, orm.SetPendingMinBlock(ctx, tt.pendingBlockNum)) } pendingBlockNum, err := orm.Reinitialize(ctx) require.NoError(t, err) assert.Equal(t, tt.expPendingBlockNum, pendingBlockNum) pendingBlockNum, err = orm.GetPendingMinBlock(ctx) if assert.NoError(t, err) { assert.Equal(t, tt.expPendingBlockNum, pendingBlockNum) } bs, err := orm.FindBroadcasts(ctx, 0, 20) if assert.NoError(t, err) { for _, b := range bs { assert.True(t, b.Consumed) } } })` $DIR/core/chains/evm/log/orm_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/log/orm_test.go: `.Context(t)` $DIR/core/chains/evm/log/orm_test.go: `.NewORM(db, cltest.FixtureChainID)` $DIR/core/chains/evm/log/orm_test.go: `.MustInsertV2JobSpec(t, db, common.BigToAddress(big.NewInt(rand.Int63())))` $DIR/core/chains/evm/log/orm_test.go: `.BigToAddress(big.NewInt(rand.Int63()))` $DIR/core/chains/evm/log/orm_test.go: `.NewInt(rand.Int63())` $DIR/core/chains/evm/log/orm_test.go: `.Int63()` $DIR/core/chains/evm/log/orm_test.go: `.MarkBroadcastConsumed(ctx, b.BlockHash, b.BlockNumber.Uint64(), b.LogIndex, jobID)` $DIR/core/chains/evm/log/orm_test.go: `.BlockNumber.Uint64()` $DIR/core/chains/evm/log/orm_test.go: `.CreateBroadcast(ctx, b.BlockHash, b.BlockNumber.Uint64(), b.LogIndex, jobID)` $DIR/core/chains/evm/log/orm_test.go: `.BlockNumber.Uint64()` $DIR/core/chains/evm/log/orm_test.go: `.Reinitialize(ctx)` $DIR/core/chains/evm/log/orm_test.go: `.GetPendingMinBlock(ctx)` $DIR/core/chains/evm/log/orm_test.go: `.FindBroadcasts(ctx, 0, 20)` $DIR/core/chains/evm/log/pool_test.go: `l2.Index = 43` $DIR/core/chains/evm/log/pool_test.go: `l2 = l1` $DIR/core/chains/evm/log/pool_test.go: `l2.TxIndex = 13` $DIR/core/chains/evm/log/pool_test.go: `l3.BlockNumber = 3` $DIR/core/chains/evm/log/pool_test.go: `l3.BlockHash = common.BigToHash(big.NewInt(3))` $DIR/core/chains/evm/log/pool_test.go: `l4.BlockNumber = 0` $DIR/core/chains/evm/log/pool_test.go: `l4.BlockHash = common.BigToHash(big.NewInt(0))` $DIR/core/chains/evm/log/pool_test.go: `p.addLog(L1)` $DIR/core/chains/evm/log/pool_test.go: `p.addLog(L1)` $DIR/core/chains/evm/log/pool_test.go: `p.addLog(L21)` $DIR/core/chains/evm/log/pool_test.go: `p.addLog(L22)` $DIR/core/chains/evm/log/pool_test.go: `p.addLog(L3)` $DIR/core/chains/evm/log/pool_test.go: `p.addLog(L1)` $DIR/core/chains/evm/log/pool_test.go: `p.addLog(L21)` $DIR/core/chains/evm/log/pool_test.go: `p.addLog(L3)` $DIR/core/chains/evm/log/pool_test.go: `t.Run(test.name, func(t *testing.T) { logsOnBlocks, minBlockNumToSend := p.getLogsToSend(test.latestBlockNumber) assert.Equal(t, test.expectedMinBlockNumToSend, minBlockNumToSend) assert.ElementsMatch(t, test.expectedLogs, logsOnBlocks) })` $DIR/core/chains/evm/log/pool_test.go: `t.Run(test.name, func(t *testing.T) { var p iLogPool = newLogPool(logger.Test(t)) p.addLog(L1) p.addLog(L21) p.addLog(L3) oldestKeptBlock := p.deleteOlderLogs(test.keptDepth) assert.Equal(t, test.expectedOldestBlock, oldestKeptBlock) keptLogs, _ := p.getLogsToSend(4) assert.ElementsMatch(t, test.expectedKeptLogs, keptLogs) })` $DIR/core/chains/evm/log/pool_test.go: `p.addLog(L1)` $DIR/core/chains/evm/log/pool_test.go: `p.addLog(L21)` $DIR/core/chains/evm/log/pool_test.go: `p.addLog(L3)` $DIR/core/chains/evm/log/pool_test.go: `t.Run(test.name, func(t *testing.T) { var p iLogPool = newLogPool(logger.Test(t)) p.addLog(L21) p.addLog(L22) p.addLog(L23) p.addLog(L3) p.removeBlock(test.blockHash, test.blockNumber) assert.Equal(t, 0, p.testOnly_getNumLogsForBlock(test.blockHash)) p.deleteOlderLogs(int64(test.blockNumber)) // Pruning logs for easier testing next line logsOnBlock, _ := p.getLogsToSend(int64(test.blockNumber)) assert.ElementsMatch(t, test.expectedRemainingLogs, logsOnBlock) })` $DIR/core/chains/evm/log/pool_test.go: `p.addLog(L21)` $DIR/core/chains/evm/log/pool_test.go: `p.addLog(L22)` $DIR/core/chains/evm/log/pool_test.go: `p.addLog(L23)` $DIR/core/chains/evm/log/pool_test.go: `p.addLog(L3)` $DIR/core/chains/evm/log/pool_test.go: `p.removeBlock(test.blockHash, test.blockNumber)` $DIR/core/chains/evm/log/pool_test.go: `p.deleteOlderLogs(int64(test.blockNumber))` $DIR/core/chains/evm/log/pool_test.go: `.Test(t)` $DIR/core/chains/evm/log/pool_test.go: `.BigToHash(big.NewInt(1))` $DIR/core/chains/evm/log/pool_test.go: `.NewInt(1)` $DIR/core/chains/evm/log/pool_test.go: `.BigToHash(big.NewInt(3))` $DIR/core/chains/evm/log/pool_test.go: `.NewInt(3)` $DIR/core/chains/evm/log/pool_test.go: `.BigToHash(big.NewInt(0))` $DIR/core/chains/evm/log/pool_test.go: `.NewInt(0)` $DIR/core/chains/evm/log/pool_test.go: `.testOnly_getNumLogsForBlock(l4.BlockHash)` $DIR/core/chains/evm/log/pool_test.go: `.Test(t)` $DIR/core/chains/evm/log/pool_test.go: `.addLog(L1)` $DIR/core/chains/evm/log/pool_test.go: `.addLog(L1)` $DIR/core/chains/evm/log/pool_test.go: `.addLog(L21)` $DIR/core/chains/evm/log/pool_test.go: `.addLog(L22)` $DIR/core/chains/evm/log/pool_test.go: `.addLog(L3)` $DIR/core/chains/evm/log/pool_test.go: `.getAndDeleteAll()` $DIR/core/chains/evm/log/pool_test.go: `.testOnly_getNumLogsForBlock(L3.BlockHash)` $DIR/core/chains/evm/log/pool_test.go: `.Test(t)` $DIR/core/chains/evm/log/pool_test.go: `.getLogsToSend(1)` $DIR/core/chains/evm/log/pool_test.go: `.Test(t)` $DIR/core/chains/evm/log/pool_test.go: `.addLog(L1)` $DIR/core/chains/evm/log/pool_test.go: `.addLog(L21)` $DIR/core/chains/evm/log/pool_test.go: `.addLog(L3)` $DIR/core/chains/evm/log/pool_test.go: `.Run(test.name, func(t *testing.T) { logsOnBlocks, minBlockNumToSend := p.getLogsToSend(test.latestBlockNumber) assert.Equal(t, test.expectedMinBlockNumToSend, minBlockNumToSend) assert.ElementsMatch(t, test.expectedLogs, logsOnBlocks) })` $DIR/core/chains/evm/log/pool_test.go: `.getLogsToSend(test.latestBlockNumber)` $DIR/core/chains/evm/log/pool_test.go: `.Test(t)` $DIR/core/chains/evm/log/pool_test.go: `.deleteOlderLogs(1)` $DIR/core/chains/evm/log/pool_test.go: `.Run(test.name, func(t *testing.T) { var p iLogPool = newLogPool(logger.Test(t)) p.addLog(L1) p.addLog(L21) p.addLog(L3) oldestKeptBlock := p.deleteOlderLogs(test.keptDepth) assert.Equal(t, test.expectedOldestBlock, oldestKeptBlock) keptLogs, _ := p.getLogsToSend(4) assert.ElementsMatch(t, test.expectedKeptLogs, keptLogs) })` $DIR/core/chains/evm/log/pool_test.go: `.Test(t)` $DIR/core/chains/evm/log/pool_test.go: `.addLog(L1)` $DIR/core/chains/evm/log/pool_test.go: `.addLog(L21)` $DIR/core/chains/evm/log/pool_test.go: `.addLog(L3)` $DIR/core/chains/evm/log/pool_test.go: `.deleteOlderLogs(test.keptDepth)` $DIR/core/chains/evm/log/pool_test.go: `.getLogsToSend(4)` $DIR/core/chains/evm/log/pool_test.go: `.Test(t)` $DIR/core/chains/evm/log/pool_test.go: `.Run(test.name, func(t *testing.T) { var p iLogPool = newLogPool(logger.Test(t)) p.addLog(L21) p.addLog(L22) p.addLog(L23) p.addLog(L3) p.removeBlock(test.blockHash, test.blockNumber) assert.Equal(t, 0, p.testOnly_getNumLogsForBlock(test.blockHash)) p.deleteOlderLogs(int64(test.blockNumber)) // Pruning logs for easier testing next line logsOnBlock, _ := p.getLogsToSend(int64(test.blockNumber)) assert.ElementsMatch(t, test.expectedRemainingLogs, logsOnBlock) })` $DIR/core/chains/evm/log/pool_test.go: `.Test(t)` $DIR/core/chains/evm/log/pool_test.go: `.addLog(L21)` $DIR/core/chains/evm/log/pool_test.go: `.addLog(L22)` $DIR/core/chains/evm/log/pool_test.go: `.addLog(L23)` $DIR/core/chains/evm/log/pool_test.go: `.addLog(L3)` $DIR/core/chains/evm/log/pool_test.go: `.removeBlock(test.blockHash, test.blockNumber)` $DIR/core/chains/evm/log/pool_test.go: `.deleteOlderLogs(int64(test.blockNumber))` $DIR/core/chains/evm/log/pool_test.go: `.getLogsToSend(int64(test.blockNumber))` $DIR/core/chains/evm/log/registrations_test.go: `r.addSubscriber(sub)` $DIR/core/chains/evm/log/registrations_test.go: `r.addSubscriber(subB)` $DIR/core/chains/evm/log/registrations_test.go: `r.addSubscriber(sub2)` $DIR/core/chains/evm/log/registrations_test.go: `r.removeSubscriber(sub)` $DIR/core/chains/evm/log/registrations_test.go: `logsWithTopics[topic1] = topicValueFilters1` $DIR/core/chains/evm/log/registrations_test.go: `logsWithTopics[topic2] = topicValueFilters2` $DIR/core/chains/evm/log/registrations_test.go: `logsWithTopics[topic3] = topicValueFilters3` $DIR/core/chains/evm/log/registrations_test.go: `logsWithTopics3[topic4] = topicValueFilters4` $DIR/core/chains/evm/log/registrations_test.go: `opts3.LogsWithTopics = logsWithTopics3` $DIR/core/chains/evm/log/registrations_test.go: `opts4.MinIncomingConfirmations = 42` $DIR/core/chains/evm/log/registrations_test.go: `opts5.MinIncomingConfirmations = 21` $DIR/core/chains/evm/log/registrations_test.go: `t.Run("addSubscriber", func(t *testing.T) { needsResub := r.addSubscriber(sub) assert.True(t, needsResub) // same contract, same topics needsResub = r.addSubscriber(sub2) assert.False(t, needsResub) // same contract, different topics needsResub = r.addSubscriber(sub3) assert.True(t, needsResub) assert.Equal(t, 1, int(r.highestNumConfirmations)) // same contract, same topics, different MinIncomingConfirmations needsResub = r.addSubscriber(sub4) // resub required because confirmations went higher assert.True(t, needsResub) assert.Equal(t, 42, int(r.highestNumConfirmations)) // same contract, same topics, midrange MinIncomingConfirmations needsResub = r.addSubscriber(sub5) // resub NOT required because confirmations is lower than the highest assert.False(t, needsResub) assert.Equal(t, 42, int(r.highestNumConfirmations)) assert.Len(t, r.registeredSubs, 5) assert.Contains(t, r.registeredSubs, sub) assert.Contains(t, r.registeredSubs, sub2) assert.Contains(t, r.registeredSubs, sub3) assert.Contains(t, r.registeredSubs, sub4) assert.Contains(t, r.registeredSubs, sub5) assert.Len(t, r.handlersByConfs, 3) require.Contains(t, r.handlersByConfs, uint32(1)) require.Contains(t, r.handlersByConfs, uint32(21)) require.Contains(t, r.handlersByConfs, uint32(42)) // contractAddress => logTopic => Listener handlers1 := r.handlersByConfs[1].lookupSubs assert.Len(t, handlers1, 1) assert.Contains(t, handlers1, contractAddr) h1 := handlers1[contractAddr] // 4 topics on this contract addr assert.Len(t, h1, 4) assert.Contains(t, h1, topic1) assert.Contains(t, h1, topic2) assert.Contains(t, h1, topic3) assert.Contains(t, h1, topic4) // topics map to their subscribers assert.Len(t, h1[topic1], 2) // listeners 1 and 2 assert.Contains(t, h1[topic1], sub) assert.Contains(t, h1[topic1], sub2) assert.Len(t, h1[topic2], 2) // listeners 1 and 2 assert.Contains(t, h1[topic2], sub) assert.Contains(t, h1[topic2], sub2) assert.Len(t, h1[topic3], 2) // listeners 1 and 2 assert.Contains(t, h1[topic3], sub) assert.Contains(t, h1[topic3], sub2) assert.Len(t, h1[topic4], 1) // listener 3 assert.Contains(t, h1[topic4], sub3) handlers42 := r.handlersByConfs[42].lookupSubs assert.Len(t, handlers42, 1) assert.Contains(t, handlers1, contractAddr) h42 := handlers42[contractAddr] // 1 topic on this contract addr assert.Len(t, h42, 1) assert.Contains(t, h1, topic4) // topic maps to its subscriber assert.Len(t, h42[topic4], 1) // listener 4 assert.Contains(t, h42[topic4], sub4) handlers21 := r.handlersByConfs[21].lookupSubs assert.Len(t, handlers21, 1) assert.Contains(t, handlers1, contractAddr) h21 := handlers21[contractAddr] // 1 topic on this contract addr assert.Len(t, h21, 1) assert.Contains(t, h1, topic4) // topic maps to its subscriber assert.Len(t, h21[topic4], 1) // listener 5 assert.Contains(t, h21[topic4], sub5) })` $DIR/core/chains/evm/log/registrations_test.go: `needsResub = r.addSubscriber(sub2)` $DIR/core/chains/evm/log/registrations_test.go: `needsResub = r.addSubscriber(sub3)` $DIR/core/chains/evm/log/registrations_test.go: `needsResub = r.addSubscriber(sub4)` $DIR/core/chains/evm/log/registrations_test.go: `needsResub = r.addSubscriber(sub5)` $DIR/core/chains/evm/log/registrations_test.go: `needsResub = r.removeSubscriber(sub2)` $DIR/core/chains/evm/log/registrations_test.go: `needsResub = r.removeSubscriber(sub3)` $DIR/core/chains/evm/log/registrations_test.go: `needsResub = r.removeSubscriber(sub4)` $DIR/core/chains/evm/log/registrations_test.go: `needsResub = r.removeSubscriber(sub5)` $DIR/core/chains/evm/log/registrations_test.go: `.NewAddress()` $DIR/core/chains/evm/log/registrations_test.go: `.addSubscriber(sub)` $DIR/core/chains/evm/log/registrations_test.go: `.NewAddress()` $DIR/core/chains/evm/log/registrations_test.go: `.addSubscriber(subB)` $DIR/core/chains/evm/log/registrations_test.go: `.addSubscriber(sub2)` $DIR/core/chains/evm/log/registrations_test.go: `.removeSubscriber(sub)` $DIR/core/chains/evm/log/registrations_test.go: `.NewAddress()` $DIR/core/chains/evm/log/registrations_test.go: `.NewHash()` $DIR/core/chains/evm/log/registrations_test.go: `.NewHash()` $DIR/core/chains/evm/log/registrations_test.go: `.NewHash()` $DIR/core/chains/evm/log/registrations_test.go: `.NewHash()` $DIR/core/chains/evm/log/registrations_test.go: `.Run("addSubscriber", func(t *testing.T) { needsResub := r.addSubscriber(sub) assert.True(t, needsResub) // same contract, same topics needsResub = r.addSubscriber(sub2) assert.False(t, needsResub) // same contract, different topics needsResub = r.addSubscriber(sub3) assert.True(t, needsResub) assert.Equal(t, 1, int(r.highestNumConfirmations)) // same contract, same topics, different MinIncomingConfirmations needsResub = r.addSubscriber(sub4) // resub required because confirmations went higher assert.True(t, needsResub) assert.Equal(t, 42, int(r.highestNumConfirmations)) // same contract, same topics, midrange MinIncomingConfirmations needsResub = r.addSubscriber(sub5) // resub NOT required because confirmations is lower than the highest assert.False(t, needsResub) assert.Equal(t, 42, int(r.highestNumConfirmations)) assert.Len(t, r.registeredSubs, 5) assert.Contains(t, r.registeredSubs, sub) assert.Contains(t, r.registeredSubs, sub2) assert.Contains(t, r.registeredSubs, sub3) assert.Contains(t, r.registeredSubs, sub4) assert.Contains(t, r.registeredSubs, sub5) assert.Len(t, r.handlersByConfs, 3) require.Contains(t, r.handlersByConfs, uint32(1)) require.Contains(t, r.handlersByConfs, uint32(21)) require.Contains(t, r.handlersByConfs, uint32(42)) // contractAddress => logTopic => Listener handlers1 := r.handlersByConfs[1].lookupSubs assert.Len(t, handlers1, 1) assert.Contains(t, handlers1, contractAddr) h1 := handlers1[contractAddr] // 4 topics on this contract addr assert.Len(t, h1, 4) assert.Contains(t, h1, topic1) assert.Contains(t, h1, topic2) assert.Contains(t, h1, topic3) assert.Contains(t, h1, topic4) // topics map to their subscribers assert.Len(t, h1[topic1], 2) // listeners 1 and 2 assert.Contains(t, h1[topic1], sub) assert.Contains(t, h1[topic1], sub2) assert.Len(t, h1[topic2], 2) // listeners 1 and 2 assert.Contains(t, h1[topic2], sub) assert.Contains(t, h1[topic2], sub2) assert.Len(t, h1[topic3], 2) // listeners 1 and 2 assert.Contains(t, h1[topic3], sub) assert.Contains(t, h1[topic3], sub2) assert.Len(t, h1[topic4], 1) // listener 3 assert.Contains(t, h1[topic4], sub3) handlers42 := r.handlersByConfs[42].lookupSubs assert.Len(t, handlers42, 1) assert.Contains(t, handlers1, contractAddr) h42 := handlers42[contractAddr] // 1 topic on this contract addr assert.Len(t, h42, 1) assert.Contains(t, h1, topic4) // topic maps to its subscriber assert.Len(t, h42[topic4], 1) // listener 4 assert.Contains(t, h42[topic4], sub4) handlers21 := r.handlersByConfs[21].lookupSubs assert.Len(t, handlers21, 1) assert.Contains(t, handlers1, contractAddr) h21 := handlers21[contractAddr] // 1 topic on this contract addr assert.Len(t, h21, 1) assert.Contains(t, h1, topic4) // topic maps to its subscriber assert.Len(t, h21[topic4], 1) // listener 5 assert.Contains(t, h21[topic4], sub5) })` $DIR/core/chains/evm/log/registrations_test.go: `.addSubscriber(sub)` $DIR/core/chains/evm/log/registrations_test.go: `.addSubscriber(sub2)` $DIR/core/chains/evm/log/registrations_test.go: `.addSubscriber(sub3)` $DIR/core/chains/evm/log/registrations_test.go: `.addSubscriber(sub4)` $DIR/core/chains/evm/log/registrations_test.go: `.addSubscriber(sub5)` $DIR/core/chains/evm/log/registrations_test.go: `.removeSubscriber(sub)` $DIR/core/chains/evm/log/registrations_test.go: `.removeSubscriber(sub2)` $DIR/core/chains/evm/log/registrations_test.go: `.removeSubscriber(sub3)` $DIR/core/chains/evm/log/registrations_test.go: `.removeSubscriber(sub4)` $DIR/core/chains/evm/log/registrations_test.go: `.removeSubscriber(sub5)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `validateFiltersTable(t, lp, orm)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `err = lp.RegisterFilter(ctx, Filter{Name: "Emitter Log 1 + 2", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID, EmitterABI.Events["Log2"].ID}, Addresses: []common.Address{a2}})` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `validateFiltersTable(t, lp, orm)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `err = lp.RegisterFilter(ctx, Filter{Name: "Emitter Log 1 + 2 dupe", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID, EmitterABI.Events["Log2"].ID}, Addresses: []common.Address{a2}})` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `validateFiltersTable(t, lp, orm)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `err = lp.RegisterFilter(ctx, Filter{Name: "no address", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}})` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `err = lp.RegisterFilter(ctx, Filter{Name: "No event", Addresses: []common.Address{a1}})` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `validateFiltersTable(t, lp, orm)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `err = lp.UnregisterFilter(ctx, "Filter doesn't exist")` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `_, ok = lp.filters["Emitter Log 1 + 2"]` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `_, ok = lp.filters["Emitter Log 1 + 2 dupe"]` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `err = lp.UnregisterFilter(ctx, "Emitter Log 1 + 2")` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `_, ok = lp.filters["Emitter Log 1 + 2"]` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `validateFiltersTable(t, lp, orm)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `err = lp.UnregisterFilter(ctx, "Emitter Log 1 + 2 dupe")` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `err = lp.UnregisterFilter(ctx, "Emitter Log 1")` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `t.Run(c.name, func(t *testing.T) { logs := convertLogs(c.logs, c.blocks, lggr, big.NewInt(53)) require.Len(t, logs, c.expected) for i := 0; i < c.expected; i++ { if len(c.blocks) == 1 { assert.Equal(t, c.blocks[0].BlockTimestamp, logs[i].BlockTimestamp) } else { assert.Equal(t, logs[i].BlockTimestamp, c.blocks[i].BlockTimestamp) } } })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `ec.On("HeadByNumber", mock.Anything, mock.Anything).Return(&head, nil)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `ec.On("FilterLogs", mock.Anything, mock.Anything).Return([]types.Log{log1}, nil)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `ec.On("ConfiguredChainID").Return(chainID, nil)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `lp.BackupPollAndSaveLogs(ctx)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `lp.PollAndSaveLogs(ctx, latestBlock)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `lp.BackupPollAndSaveLogs(ctx)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `ec.On("HeadByNumber", mock.Anything, mock.Anything).Return(func(context.Context, *big.Int) (*evmtypes.Head, error) { headCopy := head return &headCopy, nil })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `ec.On("FilterLogs", mock.Anything, mock.Anything).Return([]types.Log{log1}, nil).Once()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `ec.On("ConfiguredChainID").Return(chainID, nil)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `lp.PollAndSaveLogs(ctx, 4)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `t.Run("abort before replayStart received", func(t *testing.T) { // Replay() should abort immediately if caller's context is cancelled before request signal is read cancelCtx, cancel := context.WithCancel(testutils.Context(t)) cancel() err := lp.Replay(cancelCtx, 3) assert.ErrorIs(t, err, ErrReplayRequestAborted) })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `cancel()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `t.Run("returns error code on replay complete", func(t *testing.T) { ctx := testutils.Context(t) ec.On("FilterLogs", mock.Anything, mock.Anything).Return([]types.Log{log1}, nil).Once() mockBatchCallContext(t, ec) anyErr := pkgerrors.New("any error") done := make(chan struct{}) go func() { defer close(done) recvStartReplay(ctx, 2) lp.replayComplete <- anyErr }() assert.ErrorIs(t, lp.Replay(ctx, 1), anyErr) <-done })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `ec.On("FilterLogs", mock.Anything, mock.Anything).Return([]types.Log{log1}, nil).Once()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `mockBatchCallContext(t, ec)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `recvStartReplay(ctx, 2)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `lp.replayComplete <- anyErr` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `<-done` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `t.Run("late abort returns ErrReplayInProgress", func(t *testing.T) { cancelCtx, cancel := context.WithTimeout(testutils.Context(t), time.Second) // Intentionally abort replay after 1s done := make(chan struct{}) go func() { defer close(done) recvStartReplay(cancelCtx, 4) cancel() }() assert.ErrorIs(t, lp.Replay(cancelCtx, 4), ErrReplayInProgress) <-done lp.replayComplete <- nil lp.wg.Wait() })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `recvStartReplay(cancelCtx, 4)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `cancel()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `<-done` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `lp.replayComplete <- nil` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `lp.wg.Wait()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `t.Run("client abort doesnt hang run loop", func(t *testing.T) { ctx := testutils.Context(t) lp.backupPollerNextBlock = 0 pass := make(chan struct{}) cancelled := make(chan struct{}) rctx, rcancel := context.WithCancel(testutils.Context(t)) var wg sync.WaitGroup defer func() { wg.Wait() }() ec.On("FilterLogs", mock.Anything, mock.Anything).Once().Return([]types.Log{log1}, nil).Run(func(args mock.Arguments) { head = evmtypes.Head{Number: 4} wg.Add(1) go func() { defer wg.Done() assert.ErrorIs(t, lp.Replay(rctx, 4), ErrReplayInProgress) close(cancelled) }() }) ec.On("FilterLogs", mock.Anything, mock.Anything).Once().Return([]types.Log{log1}, nil).Run(func(args mock.Arguments) { rcancel() wg.Add(1) go func() { defer wg.Done() select { case lp.replayStart <- 4: close(pass) case <-ctx.Done(): return } }() // We cannot return until we're sure that Replay() received the cancellation signal, // otherwise replayComplete<- might be sent first <-cancelled }) ec.On("FilterLogs", mock.Anything, mock.Anything).Return([]types.Log{log1}, nil).Maybe() // in case task gets delayed by >= 100ms head = evmtypes.Head{Number: 5} t.Cleanup(lp.reset) servicetest.Run(t, lp) select { case <-ctx.Done(): t.Errorf("timed out waiting for lp.run() to respond to second replay event") case <-pass: } })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `lp.backupPollerNextBlock = 0` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `wg.Wait()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `ec.On("FilterLogs", mock.Anything, mock.Anything).Once().Return([]types.Log{log1}, nil).Run(func(args mock.Arguments) { head = evmtypes.Head{Number: 4} wg.Add(1) go func() { defer wg.Done() assert.ErrorIs(t, lp.Replay(rctx, 4), ErrReplayInProgress) close(cancelled) }() })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `head = evmtypes.Head{Number: 4}` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `wg.Add(1)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `close(cancelled)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `ec.On("FilterLogs", mock.Anything, mock.Anything).Once().Return([]types.Log{log1}, nil).Run(func(args mock.Arguments) { rcancel() wg.Add(1) go func() { defer wg.Done() select { case lp.replayStart <- 4: close(pass) case <-ctx.Done(): return } }() // We cannot return until we're sure that Replay() received the cancellation signal, // otherwise replayComplete<- might be sent first <-cancelled })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `rcancel()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `wg.Add(1)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `close(pass)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `<-cancelled` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `ec.On("FilterLogs", mock.Anything, mock.Anything).Return([]types.Log{log1}, nil).Maybe()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `head = evmtypes.Head{Number: 5}` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `t.Cleanup(lp.reset)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `servicetest.Run(t, lp)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `ec.On("FilterLogs", mock.Anything, mock.Anything).Unset()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `t.Run("shutdown during replay", func(t *testing.T) { ctx := testutils.Context(t) lp.backupPollerNextBlock = 0 pass := make(chan struct{}) done := make(chan struct{}) defer func() { <-done }() ec.On("FilterLogs", mock.Anything, mock.Anything).Once().Return([]types.Log{log1}, nil).Run(func(args mock.Arguments) { go func() { defer close(done) head = evmtypes.Head{Number: 4} // Restore latest block to 4, so this matches the fromBlock requested select { case lp.replayStart <- 4: case <-ctx.Done(): } }() }) ec.On("FilterLogs", mock.Anything, mock.Anything).Once().Return([]types.Log{log1}, nil).Run(func(args mock.Arguments) { go func() { assert.NoError(t, lp.Close()) // prevent double close lp.reset() assert.NoError(t, lp.Start(ctx)) close(pass) }() }) ec.On("FilterLogs", mock.Anything, mock.Anything).Return([]types.Log{log1}, nil) t.Cleanup(lp.reset) head = evmtypes.Head{Number: 5} // Latest block must be > lastProcessed in order for SaveAndPollLogs() to call FilterLogs() servicetest.Run(t, lp) select { case <-ctx.Done(): t.Error("timed out waiting for lp.run() to respond to shutdown event during replay") case <-pass: } })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `lp.backupPollerNextBlock = 0` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `<-done` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `ec.On("FilterLogs", mock.Anything, mock.Anything).Once().Return([]types.Log{log1}, nil).Run(func(args mock.Arguments) { go func() { defer close(done) head = evmtypes.Head{Number: 4} // Restore latest block to 4, so this matches the fromBlock requested select { case lp.replayStart <- 4: case <-ctx.Done(): } }() })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `head = evmtypes.Head{Number: 4}` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `select { case lp.replayStart <- 4: case <-ctx.Done(): }` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `ec.On("FilterLogs", mock.Anything, mock.Anything).Once().Return([]types.Log{log1}, nil).Run(func(args mock.Arguments) { go func() { assert.NoError(t, lp.Close()) // prevent double close lp.reset() assert.NoError(t, lp.Start(ctx)) close(pass) }() })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `lp.reset()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `close(pass)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `ec.On("FilterLogs", mock.Anything, mock.Anything).Return([]types.Log{log1}, nil)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `t.Cleanup(lp.reset)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `head = evmtypes.Head{Number: 5}` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `servicetest.Run(t, lp)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `t.Run("ReplayAsync success", func(t *testing.T) { t.Cleanup(lp.reset) head = evmtypes.Head{Number: 5} ec.On("FilterLogs", mock.Anything, mock.Anything).Return([]types.Log{log1}, nil) mockBatchCallContext(t, ec) servicetest.Run(t, lp) lp.ReplayAsync(1) recvStartReplay(testutils.Context(t), 2) })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `t.Cleanup(lp.reset)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `head = evmtypes.Head{Number: 5}` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `ec.On("FilterLogs", mock.Anything, mock.Anything).Return([]types.Log{log1}, nil)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `mockBatchCallContext(t, ec)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `servicetest.Run(t, lp)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `lp.ReplayAsync(1)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `recvStartReplay(testutils.Context(t), 2)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `t.Run("ReplayAsync error", func(t *testing.T) { ctx := testutils.Context(t) t.Cleanup(lp.reset) servicetest.Run(t, lp) head = evmtypes.Head{Number: 4} anyErr := pkgerrors.New("async error") observedLogs.TakeAll() lp.ReplayAsync(4) recvStartReplay(testutils.Context(t), 4) select { case lp.replayComplete <- anyErr: time.Sleep(2 * time.Second) case <-ctx.Done(): t.Error("timed out waiting to send replaceComplete") } require.Equal(t, 1, observedLogs.Len()) assert.Equal(t, observedLogs.All()[0].Message, anyErr.Error()) })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `t.Cleanup(lp.reset)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `servicetest.Run(t, lp)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `head = evmtypes.Head{Number: 4}` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `observedLogs.TakeAll()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `lp.ReplayAsync(4)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `recvStartReplay(testutils.Context(t), 4)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `time.Sleep(2 * time.Second)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `t.Run("run regular replay when there are not blocks in db", func(t *testing.T) { ctx := testutils.Context(t) err := lp.orm.DeleteLogsAndBlocksAfter(ctx, 0) require.NoError(t, err) lp.ReplayAsync(1) recvStartReplay(testutils.Context(t), 1) })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `lp.ReplayAsync(1)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `recvStartReplay(testutils.Context(t), 1)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `err = lp.orm.InsertBlock(ctx, head.Hash, head.Number, head.Timestamp, head.Number)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `ec.On("FilterLogs", mock.Anything, mock.Anything).Return([]types.Log{log1}, nil)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `mockBatchCallContext(t, ec)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `err = lp.Replay(ctx, 1)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `t.Run("pick latest block from chain and use finality from config with finality disabled", func(t *testing.T) { head := evmtypes.Head{Number: 4} lpOpts.UseFinalityTag = false lpOpts.FinalityDepth = int64(3) ec := evmclimocks.NewClient(t) ec.On("HeadByNumber", mock.Anything, mock.Anything).Return(&head, nil) lp := NewLogPoller(orm, ec, lggr, lpOpts) latestBlock, lastFinalizedBlockNumber, err := lp.latestBlocks(ctx) require.NoError(t, err) require.Equal(t, latestBlock.Number, head.Number) require.Equal(t, lpOpts.FinalityDepth, latestBlock.Number-lastFinalizedBlockNumber) })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `lpOpts.UseFinalityTag = false` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `lpOpts.FinalityDepth = int64(3)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `ec.On("HeadByNumber", mock.Anything, mock.Anything).Return(&head, nil)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `t.Run("client returns data properly", func(t *testing.T) { expectedLatestBlockNumber := int64(20) expectedLastFinalizedBlockNumber := int64(12) ec := evmclimocks.NewClient(t) ec.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && reflect.DeepEqual(b[0].Args, []interface{}{"latest", false}) && reflect.DeepEqual(b[1].Args, []interface{}{"finalized", false}) })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // Latest block details *(elems[0].Result.(*evmtypes.Head)) = evmtypes.Head{Number: expectedLatestBlockNumber, Hash: utils.RandomBytes32()} // Finalized block details *(elems[1].Result.(*evmtypes.Head)) = evmtypes.Head{Number: expectedLastFinalizedBlockNumber, Hash: utils.RandomBytes32()} }) lpOpts.UseFinalityTag = true lp := NewLogPoller(orm, ec, lggr, lpOpts) latestBlock, lastFinalizedBlockNumber, err := lp.latestBlocks(ctx) require.NoError(t, err) require.Equal(t, expectedLatestBlockNumber, latestBlock.Number) require.Equal(t, expectedLastFinalizedBlockNumber, lastFinalizedBlockNumber) })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `ec.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && reflect.DeepEqual(b[0].Args, []interface{}{"latest", false}) && reflect.DeepEqual(b[1].Args, []interface{}{"finalized", false}) })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // Latest block details *(elems[0].Result.(*evmtypes.Head)) = evmtypes.Head{Number: expectedLatestBlockNumber, Hash: utils.RandomBytes32()} // Finalized block details *(elems[1].Result.(*evmtypes.Head)) = evmtypes.Head{Number: expectedLastFinalizedBlockNumber, Hash: utils.RandomBytes32()} })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `*(elems[0].Result.(*evmtypes.Head)) = evmtypes.Head{Number: expectedLatestBlockNumber, Hash: utils.RandomBytes32()}` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `*(elems[1].Result.(*evmtypes.Head)) = evmtypes.Head{Number: expectedLastFinalizedBlockNumber, Hash: utils.RandomBytes32()}` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `lpOpts.UseFinalityTag = true` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `t.Run("client returns error for at least one of the calls", func(t *testing.T) { ec := evmclimocks.NewClient(t) ec.On("BatchCallContext", mock.Anything, mock.Anything).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // Latest block details *(elems[0].Result.(*evmtypes.Head)) = evmtypes.Head{Number: 10} // Finalized block details elems[1].Error = fmt.Errorf("some error") }) lpOpts.UseFinalityTag = true lp := NewLogPoller(orm, ec, lggr, lpOpts) _, _, err := lp.latestBlocks(ctx) require.Error(t, err) })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `ec.On("BatchCallContext", mock.Anything, mock.Anything).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // Latest block details *(elems[0].Result.(*evmtypes.Head)) = evmtypes.Head{Number: 10} // Finalized block details elems[1].Error = fmt.Errorf("some error") })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `*(elems[0].Result.(*evmtypes.Head)) = evmtypes.Head{Number: 10}` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `elems[1].Error = fmt.Errorf("some error")` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `lpOpts.UseFinalityTag = true` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `t.Run("BatchCall returns an error", func(t *testing.T) { ec := evmclimocks.NewClient(t) ec.On("BatchCallContext", mock.Anything, mock.Anything).Return(fmt.Errorf("some error")) lpOpts.UseFinalityTag = true lp := NewLogPoller(orm, ec, lggr, lpOpts) _, _, err := lp.latestBlocks(ctx) require.Error(t, err) })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `ec.On("BatchCallContext", mock.Anything, mock.Anything).Return(fmt.Errorf("some error"))` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `lpOpts.UseFinalityTag = true` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `mockBatchCallContext(t, ec)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `blockValidationReq = finalizedBlock` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `t.Run(fmt.Sprintf("%s where useFinalityTag=%t", tc.name, lp.useFinalityTag), func(t *testing.T) { blocks, err := lp.fetchBlocks(ctx, tc.blocksRequested, blockValidationReq) if tc.expectedErr != nil { require.Equal(t, err.Error(), tc.expectedErr.Error()) return // PASS } require.NoError(t, err) for i, blockRequested := range tc.blocksRequested { switch blockRequested { case string(latestBlock): assert.Equal(t, int64(8), blocks[i].Number) case string(finalizedBlock): assert.Equal(t, int64(5), blocks[i].Number) default: blockNum, err2 := hexutil.DecodeUint64(blockRequested) require.NoError(t, err2) assert.Equal(t, int64(blockNum), blocks[i].Number) } } })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.HexToAddress("0x2ab9a2dc53736b361b72d900cdf9f78f9406fbbb")` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.HexToAddress("0x2ab9a2dc53736b361b72d900cdf9f78f9406fbbc")` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.TestObserved(t, zapcore.WarnLevel)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.NewRandomEVMChainID()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Filter(nil, nil, nil)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.RegisterFilter(ctx, Filter{Name: "Emitter Log 1", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, Addresses: []common.Address{a1}})` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.RegisterFilter(ctx, Filter{Name: "Emitter Log 1 + 2", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID, EmitterABI.Events["Log2"].ID}, Addresses: []common.Address{a2}})` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.RegisterFilter(ctx, Filter{Name: "Emitter Log 1 + 2 dupe", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID, EmitterABI.Events["Log2"].ID}, Addresses: []common.Address{a2}})` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.RegisterFilter(ctx, Filter{Name: "no address", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}})` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.RegisterFilter(ctx, Filter{Name: "No event", Addresses: []common.Address{a1}})` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.UnregisterFilter(ctx, "Filter doesn't exist")` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.UnregisterFilter(ctx, "Emitter Log 1 + 2")` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.UnregisterFilter(ctx, "Emitter Log 1 + 2 dupe")` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.UnregisterFilter(ctx, "Emitter Log 1")` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.orm.LoadFilters(ctx)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Filter(nil, nil, nil)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Test(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Now()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Now()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Run(c.name, func(t *testing.T) { logs := convertLogs(c.logs, c.blocks, lggr, big.NewInt(53)) require.Len(t, logs, c.expected) for i := 0; i < c.expected; i++ { if len(c.blocks) == 1 { assert.Equal(t, c.blocks[0].BlockTimestamp, logs[i].BlockTimestamp) } else { assert.Equal(t, logs[i].BlockTimestamp, c.blocks[i].BlockTimestamp) } } })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.NewInt(53)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.HexToAddress("0x2ab9a2dc53736b361b72d900cdf9f78f9406fbbc")` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.TestObserved(t, zapcore.WarnLevel)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.HexToHash("0x1234")` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Bytes()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.NewClient(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.On("HeadByNumber", mock.Anything, mock.Anything)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Return(&head, nil)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.On("FilterLogs", mock.Anything, mock.Anything)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Return([]types.Log{log1}, nil)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.On("ConfiguredChainID")` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Return(chainID, nil)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.BackupPollAndSaveLogs(ctx)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.PollAndSaveLogs(ctx, latestBlock)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.orm.SelectLatestBlock(ctx)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.BackupPollAndSaveLogs(ctx)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.HexToAddress("0x2ab9a2dc53736b361b72d900cdf9f78f9406fbbc")` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.TestObserved(t, zapcore.ErrorLevel)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.HexToHash("0x1234")` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Bytes()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.NewClient(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.On("HeadByNumber", mock.Anything, mock.Anything)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Return(func(context.Context, *big.Int) (*evmtypes.Head, error) { headCopy := head return &headCopy, nil })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.On("FilterLogs", mock.Anything, mock.Anything)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Return([]types.Log{log1}, nil)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Once()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.On("ConfiguredChainID")` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Return(chainID, nil)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.PollAndSaveLogs(ctx, 4)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.LatestBlock(ctx)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Run("abort before replayStart received", func(t *testing.T) { // Replay() should abort immediately if caller's context is cancelled before request signal is read cancelCtx, cancel := context.WithCancel(testutils.Context(t)) cancel() err := lp.Replay(cancelCtx, 3) assert.ErrorIs(t, err, ErrReplayRequestAborted) })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Replay(cancelCtx, 3)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Done()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Run("returns error code on replay complete", func(t *testing.T) { ctx := testutils.Context(t) ec.On("FilterLogs", mock.Anything, mock.Anything).Return([]types.Log{log1}, nil).Once() mockBatchCallContext(t, ec) anyErr := pkgerrors.New("any error") done := make(chan struct{}) go func() { defer close(done) recvStartReplay(ctx, 2) lp.replayComplete <- anyErr }() assert.ErrorIs(t, lp.Replay(ctx, 1), anyErr) <-done })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.On("FilterLogs", mock.Anything, mock.Anything)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Return([]types.Log{log1}, nil)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Once()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.New("any error")` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Run("late abort returns ErrReplayInProgress", func(t *testing.T) { cancelCtx, cancel := context.WithTimeout(testutils.Context(t), time.Second) // Intentionally abort replay after 1s done := make(chan struct{}) go func() { defer close(done) recvStartReplay(cancelCtx, 4) cancel() }() assert.ErrorIs(t, lp.Replay(cancelCtx, 4), ErrReplayInProgress) <-done lp.replayComplete <- nil lp.wg.Wait() })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.WithTimeout(testutils.Context(t), time.Second)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.wg.Wait()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Run("client abort doesnt hang run loop", func(t *testing.T) { ctx := testutils.Context(t) lp.backupPollerNextBlock = 0 pass := make(chan struct{}) cancelled := make(chan struct{}) rctx, rcancel := context.WithCancel(testutils.Context(t)) var wg sync.WaitGroup defer func() { wg.Wait() }() ec.On("FilterLogs", mock.Anything, mock.Anything).Once().Return([]types.Log{log1}, nil).Run(func(args mock.Arguments) { head = evmtypes.Head{Number: 4} wg.Add(1) go func() { defer wg.Done() assert.ErrorIs(t, lp.Replay(rctx, 4), ErrReplayInProgress) close(cancelled) }() }) ec.On("FilterLogs", mock.Anything, mock.Anything).Once().Return([]types.Log{log1}, nil).Run(func(args mock.Arguments) { rcancel() wg.Add(1) go func() { defer wg.Done() select { case lp.replayStart <- 4: close(pass) case <-ctx.Done(): return } }() // We cannot return until we're sure that Replay() received the cancellation signal, // otherwise replayComplete<- might be sent first <-cancelled }) ec.On("FilterLogs", mock.Anything, mock.Anything).Return([]types.Log{log1}, nil).Maybe() // in case task gets delayed by >= 100ms head = evmtypes.Head{Number: 5} t.Cleanup(lp.reset) servicetest.Run(t, lp) select { case <-ctx.Done(): t.Errorf("timed out waiting for lp.run() to respond to second replay event") case <-pass: } })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Wait()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.On("FilterLogs", mock.Anything, mock.Anything)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Once()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Return([]types.Log{log1}, nil)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Run(func(args mock.Arguments) { head = evmtypes.Head{Number: 4} wg.Add(1) go func() { defer wg.Done() assert.ErrorIs(t, lp.Replay(rctx, 4), ErrReplayInProgress) close(cancelled) }() })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Add(1)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Done()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.On("FilterLogs", mock.Anything, mock.Anything)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Once()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Return([]types.Log{log1}, nil)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Run(func(args mock.Arguments) { rcancel() wg.Add(1) go func() { defer wg.Done() select { case lp.replayStart <- 4: close(pass) case <-ctx.Done(): return } }() // We cannot return until we're sure that Replay() received the cancellation signal, // otherwise replayComplete<- might be sent first <-cancelled })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Add(1)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Done()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Done()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.On("FilterLogs", mock.Anything, mock.Anything)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Return([]types.Log{log1}, nil)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Maybe()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Cleanup(lp.reset)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Run(t, lp)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Done()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.On("FilterLogs", mock.Anything, mock.Anything)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Unset()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Run("shutdown during replay", func(t *testing.T) { ctx := testutils.Context(t) lp.backupPollerNextBlock = 0 pass := make(chan struct{}) done := make(chan struct{}) defer func() { <-done }() ec.On("FilterLogs", mock.Anything, mock.Anything).Once().Return([]types.Log{log1}, nil).Run(func(args mock.Arguments) { go func() { defer close(done) head = evmtypes.Head{Number: 4} // Restore latest block to 4, so this matches the fromBlock requested select { case lp.replayStart <- 4: case <-ctx.Done(): } }() }) ec.On("FilterLogs", mock.Anything, mock.Anything).Once().Return([]types.Log{log1}, nil).Run(func(args mock.Arguments) { go func() { assert.NoError(t, lp.Close()) // prevent double close lp.reset() assert.NoError(t, lp.Start(ctx)) close(pass) }() }) ec.On("FilterLogs", mock.Anything, mock.Anything).Return([]types.Log{log1}, nil) t.Cleanup(lp.reset) head = evmtypes.Head{Number: 5} // Latest block must be > lastProcessed in order for SaveAndPollLogs() to call FilterLogs() servicetest.Run(t, lp) select { case <-ctx.Done(): t.Error("timed out waiting for lp.run() to respond to shutdown event during replay") case <-pass: } })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.On("FilterLogs", mock.Anything, mock.Anything)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Once()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Return([]types.Log{log1}, nil)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Run(func(args mock.Arguments) { go func() { defer close(done) head = evmtypes.Head{Number: 4} // Restore latest block to 4, so this matches the fromBlock requested select { case lp.replayStart <- 4: case <-ctx.Done(): } }() })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Done()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.On("FilterLogs", mock.Anything, mock.Anything)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Once()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Return([]types.Log{log1}, nil)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Run(func(args mock.Arguments) { go func() { assert.NoError(t, lp.Close()) // prevent double close lp.reset() assert.NoError(t, lp.Start(ctx)) close(pass) }() })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.reset()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.On("FilterLogs", mock.Anything, mock.Anything)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Return([]types.Log{log1}, nil)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Cleanup(lp.reset)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Run(t, lp)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Done()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Run("ReplayAsync success", func(t *testing.T) { t.Cleanup(lp.reset) head = evmtypes.Head{Number: 5} ec.On("FilterLogs", mock.Anything, mock.Anything).Return([]types.Log{log1}, nil) mockBatchCallContext(t, ec) servicetest.Run(t, lp) lp.ReplayAsync(1) recvStartReplay(testutils.Context(t), 2) })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Cleanup(lp.reset)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.On("FilterLogs", mock.Anything, mock.Anything)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Return([]types.Log{log1}, nil)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Run(t, lp)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.ReplayAsync(1)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Run("ReplayAsync error", func(t *testing.T) { ctx := testutils.Context(t) t.Cleanup(lp.reset) servicetest.Run(t, lp) head = evmtypes.Head{Number: 4} anyErr := pkgerrors.New("async error") observedLogs.TakeAll() lp.ReplayAsync(4) recvStartReplay(testutils.Context(t), 4) select { case lp.replayComplete <- anyErr: time.Sleep(2 * time.Second) case <-ctx.Done(): t.Error("timed out waiting to send replaceComplete") } require.Equal(t, 1, observedLogs.Len()) assert.Equal(t, observedLogs.All()[0].Message, anyErr.Error()) })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Cleanup(lp.reset)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Run(t, lp)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.New("async error")` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.TakeAll()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.ReplayAsync(4)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Sleep(2 * time.Second)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Done()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Run("run regular replay when there are not blocks in db", func(t *testing.T) { ctx := testutils.Context(t) err := lp.orm.DeleteLogsAndBlocksAfter(ctx, 0) require.NoError(t, err) lp.ReplayAsync(1) recvStartReplay(testutils.Context(t), 1) })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.orm.DeleteLogsAndBlocksAfter(ctx, 0)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.ReplayAsync(1)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.orm.DeleteLogsAndBlocksAfter(ctx, 0)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.orm.InsertBlock(ctx, head.Hash, head.Number, head.Timestamp, head.Number)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.On("FilterLogs", mock.Anything, mock.Anything)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Return([]types.Log{log1}, nil)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Replay(ctx, 1)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Test(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Run("pick latest block from chain and use finality from config with finality disabled", func(t *testing.T) { head := evmtypes.Head{Number: 4} lpOpts.UseFinalityTag = false lpOpts.FinalityDepth = int64(3) ec := evmclimocks.NewClient(t) ec.On("HeadByNumber", mock.Anything, mock.Anything).Return(&head, nil) lp := NewLogPoller(orm, ec, lggr, lpOpts) latestBlock, lastFinalizedBlockNumber, err := lp.latestBlocks(ctx) require.NoError(t, err) require.Equal(t, latestBlock.Number, head.Number) require.Equal(t, lpOpts.FinalityDepth, latestBlock.Number-lastFinalizedBlockNumber) })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.NewClient(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.On("HeadByNumber", mock.Anything, mock.Anything)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Return(&head, nil)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.latestBlocks(ctx)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Run("client returns data properly", func(t *testing.T) { expectedLatestBlockNumber := int64(20) expectedLastFinalizedBlockNumber := int64(12) ec := evmclimocks.NewClient(t) ec.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && reflect.DeepEqual(b[0].Args, []interface{}{"latest", false}) && reflect.DeepEqual(b[1].Args, []interface{}{"finalized", false}) })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // Latest block details *(elems[0].Result.(*evmtypes.Head)) = evmtypes.Head{Number: expectedLatestBlockNumber, Hash: utils.RandomBytes32()} // Finalized block details *(elems[1].Result.(*evmtypes.Head)) = evmtypes.Head{Number: expectedLastFinalizedBlockNumber, Hash: utils.RandomBytes32()} }) lpOpts.UseFinalityTag = true lp := NewLogPoller(orm, ec, lggr, lpOpts) latestBlock, lastFinalizedBlockNumber, err := lp.latestBlocks(ctx) require.NoError(t, err) require.Equal(t, expectedLatestBlockNumber, latestBlock.Number) require.Equal(t, expectedLastFinalizedBlockNumber, lastFinalizedBlockNumber) })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.NewClient(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && reflect.DeepEqual(b[0].Args, []interface{}{"latest", false}) && reflect.DeepEqual(b[1].Args, []interface{}{"finalized", false}) }))` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && reflect.DeepEqual(b[0].Args, []interface{}{"latest", false}) && reflect.DeepEqual(b[1].Args, []interface{}{"finalized", false}) })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.DeepEqual(b[0].Args, []interface{}{"latest", false})` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.DeepEqual(b[1].Args, []interface{}{"finalized", false})` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Return(nil)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // Latest block details *(elems[0].Result.(*evmtypes.Head)) = evmtypes.Head{Number: expectedLatestBlockNumber, Hash: utils.RandomBytes32()} // Finalized block details *(elems[1].Result.(*evmtypes.Head)) = evmtypes.Head{Number: expectedLastFinalizedBlockNumber, Hash: utils.RandomBytes32()} })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Get(1)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.RandomBytes32()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.RandomBytes32()` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.latestBlocks(ctx)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Run("client returns error for at least one of the calls", func(t *testing.T) { ec := evmclimocks.NewClient(t) ec.On("BatchCallContext", mock.Anything, mock.Anything).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // Latest block details *(elems[0].Result.(*evmtypes.Head)) = evmtypes.Head{Number: 10} // Finalized block details elems[1].Error = fmt.Errorf("some error") }) lpOpts.UseFinalityTag = true lp := NewLogPoller(orm, ec, lggr, lpOpts) _, _, err := lp.latestBlocks(ctx) require.Error(t, err) })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.NewClient(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.On("BatchCallContext", mock.Anything, mock.Anything)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Return(nil)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // Latest block details *(elems[0].Result.(*evmtypes.Head)) = evmtypes.Head{Number: 10} // Finalized block details elems[1].Error = fmt.Errorf("some error") })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Get(1)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.latestBlocks(ctx)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Run("BatchCall returns an error", func(t *testing.T) { ec := evmclimocks.NewClient(t) ec.On("BatchCallContext", mock.Anything, mock.Anything).Return(fmt.Errorf("some error")) lpOpts.UseFinalityTag = true lp := NewLogPoller(orm, ec, lggr, lpOpts) _, _, err := lp.latestBlocks(ctx) require.Error(t, err) })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.NewClient(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.On("BatchCallContext", mock.Anything, mock.Anything)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Return(fmt.Errorf("some error"))` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.latestBlocks(ctx)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Test(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.NewClient(t)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.New("Received unfinalized block 8 while expecting finalized block (latestFinalizedBlockNumber = 5)")` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.New("Received unfinalized block 9 while expecting finalized block (latestFinalizedBlockNumber = 5)")` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Run(fmt.Sprintf("%s where useFinalityTag=%t", tc.name, lp.useFinalityTag), func(t *testing.T) { blocks, err := lp.fetchBlocks(ctx, tc.blocksRequested, blockValidationReq) if tc.expectedErr != nil { require.Equal(t, err.Error(), tc.expectedErr.Error()) return // PASS } require.NoError(t, err) for i, blockRequested := range tc.blocksRequested { switch blockRequested { case string(latestBlock): assert.Equal(t, int64(8), blocks[i].Number) case string(finalizedBlock): assert.Equal(t, int64(5), blocks[i].Number) default: blockNum, err2 := hexutil.DecodeUint64(blockRequested) require.NoError(t, err2) assert.Equal(t, int64(blockNum), blocks[i].Number) } } })` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.Sprintf("%s where useFinalityTag=%t", tc.name, lp.useFinalityTag)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.fetchBlocks(ctx, tc.blocksRequested, blockValidationReq)` $DIR/core/chains/evm/logpoller/log_poller_internal_test.go: `.DecodeUint64(blockRequested)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `func() { defer logRuntime(t, time.Now()) _, err1 := o.SelectLogs(ctx, 750000, 800000, address1, event1) require.NoError(t, err1) }()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `func() { defer logRuntime(t, time.Now()) _, err1 := o.SelectLatestLogEventSigsAddrsWithConfs(ctx, 0, []common.Address{address1}, []common.Hash{event1}, 0) require.NoError(t, err1) }()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `func() { defer logRuntime(t, time.Now()) lgs, err1 := o.SelectLogsDataWordRange(ctx, address1, event1, 0, logpoller.EvmWord(50000), logpoller.EvmWord(50020), 0) require.NoError(t, err1) // 10 since every other log is for address1 require.Equal(t, 10, len(lgs)) }()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `func() { defer logRuntime(t, time.Now()) lgs, err1 := o.SelectIndexedLogs(ctx, address2, event1, 1, []common.Hash{logpoller.EvmWord(50000), logpoller.EvmWord(50020)}, 0) require.NoError(t, err1) require.Equal(t, 2, len(lgs)) }()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `_, err1 = th.Emitter1.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `testutils.AssertEventually(t, func() bool { l, err2 := th.LogPoller.Logs(ctx, 3, 3, EmitterABI.Events["Log1"].ID, th.EmitterAddress1) require.NoError(t, err2) return len(l) == 1 })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `err = th.LogPoller.RegisterFilter(ctx, logpoller.Filter{ Name: "Emitter - log2", EventSigs: []common.Hash{EmitterABI.Events["Log2"].ID}, Addresses: []common.Address{th.EmitterAddress1}, })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `logs, err = th.LogPoller.Logs(ctx, 2, 7, EmitterABI.Events["Log2"].ID, th.EmitterAddress1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `logs, err = th.LogPoller.Logs(ctx, 2, 7, EmitterABI.Events["Log2"].ID, th.EmitterAddress1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `cancel()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `t.Run(tt.name, func(t *testing.T) { th := SetupTH(t, logpoller.Opts{ UseFinalityTag: tt.finalityTag, FinalityDepth: tt.finalityDepth, BackfillBatchSize: 3, RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, BackupPollerBlockDelay: 100, }, ) // later, we will need at least 32 blocks filled with logs for cache invalidation for i := int64(0); i < 32; i++ { // to invalidate geth's internal read-cache, a matching log must be found in the bloom Filter // for each of the 32 blocks tx, err := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(i + 7)}) require.NoError(t, err) require.NotNil(t, tx) th.Client.Commit() } ctx := testutils.Context(t) filter1 := logpoller.Filter{ Name: "filter1", EventSigs: []common.Hash{ EmitterABI.Events["Log1"].ID, EmitterABI.Events["Log2"].ID}, Addresses: []common.Address{th.EmitterAddress1}, } err := th.LogPoller.RegisterFilter(ctx, filter1) require.NoError(t, err) filters, err := th.ORM.LoadFilters(ctx) require.NoError(t, err) require.Equal(t, 1, len(filters)) require.Equal(t, filter1, filters["filter1"]) err = th.LogPoller.RegisterFilter(ctx, logpoller.Filter{ Name: "filter2", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, Addresses: []common.Address{th.EmitterAddress2}, }) require.NoError(t, err) defer func() { assert.NoError(t, th.LogPoller.UnregisterFilter(ctx, "filter1")) }() defer func() { assert.NoError(t, th.LogPoller.UnregisterFilter(ctx, "filter2")) }() // generate some tx's with logs tx1, err := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)}) require.NoError(t, err) require.NotNil(t, tx1) tx2, err := th.Emitter1.EmitLog2(th.Owner, []*big.Int{big.NewInt(2)}) require.NoError(t, err) require.NotNil(t, tx2) tx3, err := th.Emitter2.EmitLog1(th.Owner, []*big.Int{big.NewInt(3)}) require.NoError(t, err) require.NotNil(t, tx3) th.Client.Commit() // commit block 34 with 3 tx's included h := th.Client.Blockchain().CurrentHeader() // get latest header require.Equal(t, uint64(34), h.Number.Uint64()) // save these 3 receipts for later receipts := rawdb.ReadReceipts(th.EthDB, h.Hash(), h.Number.Uint64(), uint64(time.Now().Unix()), params.AllEthashProtocolChanges) require.NotZero(t, receipts.Len()) // Simulate a situation where the rpc server has a block, but no logs available for it yet // this can't happen with geth itself, but can with other clients. rawdb.WriteReceipts(th.EthDB, h.Hash(), h.Number.Uint64(), types.Receipts{}) // wipes out all logs for block 34 body := rawdb.ReadBody(th.EthDB, h.Hash(), h.Number.Uint64()) require.Equal(t, 3, len(body.Transactions)) txs := body.Transactions // save transactions for later body.Transactions = types.Transactions{} // number of tx's must match # of logs for GetLogs() to succeed rawdb.WriteBody(th.EthDB, h.Hash(), h.Number.Uint64(), body) currentBlockNumber := th.PollAndSaveLogs(ctx, 1) assert.Equal(t, int64(35), currentBlockNumber) // simulate logs becoming available rawdb.WriteReceipts(th.EthDB, h.Hash(), h.Number.Uint64(), receipts) require.True(t, rawdb.HasReceipts(th.EthDB, h.Hash(), h.Number.Uint64())) body.Transactions = txs rawdb.WriteBody(th.EthDB, h.Hash(), h.Number.Uint64(), body) // flush out cached block 34 by reading logs from first 32 blocks query := ethereum.FilterQuery{ FromBlock: big.NewInt(int64(2)), ToBlock: big.NewInt(int64(33)), Addresses: []common.Address{th.EmitterAddress1}, Topics: [][]common.Hash{{EmitterABI.Events["Log1"].ID}}, } fLogs, err := th.Client.FilterLogs(ctx, query) require.NoError(t, err) require.Equal(t, 32, len(fLogs)) // logs shouldn't show up yet logs, err := th.LogPoller.Logs(ctx, 34, 34, EmitterABI.Events["Log1"].ID, th.EmitterAddress1) require.NoError(t, err) assert.Equal(t, 0, len(logs)) th.Client.Commit() th.Client.Commit() markBlockAsFinalized(t, th, 34) // Run ordinary poller + backup poller at least once currentBlock, _ := th.LogPoller.LatestBlock(ctx) th.LogPoller.PollAndSaveLogs(ctx, currentBlock.BlockNumber+1) th.LogPoller.BackupPollAndSaveLogs(ctx) currentBlock, _ = th.LogPoller.LatestBlock(ctx) require.Equal(t, int64(37), currentBlock.BlockNumber+1) // logs still shouldn't show up, because we don't want to backfill the last finalized log // to help with reorg detection logs, err = th.LogPoller.Logs(ctx, 34, 34, EmitterABI.Events["Log1"].ID, th.EmitterAddress1) require.NoError(t, err) assert.Equal(t, 0, len(logs)) th.Client.Commit() markBlockAsFinalized(t, th, 35) // Run ordinary poller + backup poller at least once more th.LogPoller.PollAndSaveLogs(ctx, currentBlockNumber+1) th.LogPoller.BackupPollAndSaveLogs(ctx) currentBlock, _ = th.LogPoller.LatestBlock(ctx) require.Equal(t, int64(38), currentBlock.BlockNumber+1) // all 3 logs in block 34 should show up now, thanks to backup logger logs, err = th.LogPoller.Logs(ctx, 30, 37, EmitterABI.Events["Log1"].ID, th.EmitterAddress1) require.NoError(t, err) assert.Equal(t, 5, len(logs)) logs, err = th.LogPoller.Logs(ctx, 34, 34, EmitterABI.Events["Log2"].ID, th.EmitterAddress1) require.NoError(t, err) assert.Equal(t, 1, len(logs)) logs, err = th.LogPoller.Logs(ctx, 32, 36, EmitterABI.Events["Log1"].ID, th.EmitterAddress2) require.NoError(t, err) assert.Equal(t, 1, len(logs)) })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `err = th.LogPoller.RegisterFilter(ctx, logpoller.Filter{ Name: "filter2", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, Addresses: []common.Address{th.EmitterAddress2}, })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `rawdb.WriteReceipts(th.EthDB, h.Hash(), h.Number.Uint64(), types.Receipts{})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `body.Transactions = types.Transactions{}` $DIR/core/chains/evm/logpoller/log_poller_test.go: `rawdb.WriteBody(th.EthDB, h.Hash(), h.Number.Uint64(), body)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `rawdb.WriteReceipts(th.EthDB, h.Hash(), h.Number.Uint64(), receipts)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `body.Transactions = txs` $DIR/core/chains/evm/logpoller/log_poller_test.go: `rawdb.WriteBody(th.EthDB, h.Hash(), h.Number.Uint64(), body)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `markBlockAsFinalized(t, th, 34)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.LogPoller.PollAndSaveLogs(ctx, currentBlock.BlockNumber+1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.LogPoller.BackupPollAndSaveLogs(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `currentBlock, _ = th.LogPoller.LatestBlock(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `logs, err = th.LogPoller.Logs(ctx, 34, 34, EmitterABI.Events["Log1"].ID, th.EmitterAddress1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `markBlockAsFinalized(t, th, 35)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.LogPoller.PollAndSaveLogs(ctx, currentBlockNumber+1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.LogPoller.BackupPollAndSaveLogs(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `currentBlock, _ = th.LogPoller.LatestBlock(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `logs, err = th.LogPoller.Logs(ctx, 30, 37, EmitterABI.Events["Log1"].ID, th.EmitterAddress1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `logs, err = th.LogPoller.Logs(ctx, 34, 34, EmitterABI.Events["Log2"].ID, th.EmitterAddress1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `logs, err = th.LogPoller.Logs(ctx, 32, 36, EmitterABI.Events["Log1"].ID, th.EmitterAddress2)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `markBlockAsFinalized(t, th, currentBlock-10)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `err = th.LogPoller.RegisterFilter(ctx, logpoller.Filter{ Name: "Test Emitter", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, Addresses: []common.Address{th.EmitterAddress1}, })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.LogPoller.BackupPollAndSaveLogs(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `markBlockAsFinalized(t, th, currentBlock)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.LogPoller.BackupPollAndSaveLogs(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `logs, err = th.LogPoller.Logs( ctx, 0, currentBlock+1, EmitterABI.Events["Log1"].ID, th.EmitterAddress1, )` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `markBlockAsFinalized(t, th, header.Number.Int64())` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.PollAndSaveLogs(ctx, 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `err = th.LogPoller.RegisterFilter(ctx, logpoller.Filter{ Name: "Test Emitter", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, Addresses: []common.Address{th.EmitterAddress1}, })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.LogPoller.BackupPollAndSaveLogs(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `markBlockAsFinalized(t, th, firstBatchBlock-1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `markBlockAsFinalized(t, th, secondBatchBlock-1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.LogPoller.BackupPollAndSaveLogs(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `blk, err = th.Client.BlockByHash(ctx, hash)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `_, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `hash = th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `blk, err = th.Client.BlockByHash(ctx, hash)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `_, err = th.Emitter2.EmitLog2(th.Owner, []*big.Int{big.NewInt(2)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `hash = th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `blk, err = th.Client.BlockByHash(ctx, hash)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.PollAndSaveLogs(ctx, lb.BlockNumber+1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `testParams.MinSuccessfulTests = 100` $DIR/core/chains/evm/logpoller/log_poller_test.go: `owner.GasPrice = big.NewInt(10e9)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `p.Property("synchronized with geth", prop.ForAll(func(mineOrReorg []uint64) bool { // After the set of reorgs, we should have the same canonical blocks that geth does. t.Log("Starting test", mineOrReorg) chainID := testutils.NewRandomEVMChainID() // Set up a test chain with a log emitting contract deployed. orm := logpoller.NewORM(chainID, db, lggr) // Note this property test is run concurrently and the sim is not threadsafe. ec := backends.NewSimulatedBackend(map[common.Address]core.GenesisAccount{ owner.From: { Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), }, }, 10e6) _, _, emitter1, err := log_emitter.DeployLogEmitter(owner, ec) require.NoError(t, err) lpOpts := logpoller.Opts{ PollPeriod: 15 * time.Second, FinalityDepth: int64(finalityDepth), BackfillBatchSize: 3, RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } lp := logpoller.NewLogPoller(orm, client.NewSimulatedBackendClient(t, ec, chainID), lggr, lpOpts) for i := 0; i < finalityDepth; i++ { // Have enough blocks that we could reorg the full finalityDepth-1. ec.Commit() } currentBlockNumber := int64(1) lp.PollAndSaveLogs(testutils.Context(t), currentBlockNumber) currentBlock, err := lp.LatestBlock(testutils.Context(t)) require.NoError(t, err) matchesGeth := func() bool { // Check every block is identical latest, err1 := ec.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err1) for i := 1; i < int(latest.NumberU64()); i++ { ourBlock, err1 := lp.BlockByNumber(testutils.Context(t), int64(i)) require.NoError(t, err1) gethBlock, err1 := ec.BlockByNumber(testutils.Context(t), big.NewInt(int64(i))) require.NoError(t, err1) if ourBlock.BlockHash != gethBlock.Hash() { t.Logf("Initial poll our block differs at height %d got %x want %x\n", i, ourBlock.BlockHash, gethBlock.Hash()) return false } } return true } if !matchesGeth() { return false } // Randomly pick to mine or reorg for i := 0; i < numChainInserts; i++ { if rand.Bool() { // Mine blocks for j := 0; j < int(mineOrReorg[i]); j++ { ec.Commit() latest, err1 := ec.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err1) t.Log("mined block", latest.Hash()) } } else { // Reorg blocks latest, err1 := ec.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err1) reorgedBlock := big.NewInt(0).Sub(latest.Number(), big.NewInt(int64(mineOrReorg[i]))) reorg, err1 := ec.BlockByNumber(testutils.Context(t), reorgedBlock) require.NoError(t, err1) require.NoError(t, ec.Fork(testutils.Context(t), reorg.Hash())) t.Logf("Reorging from (%v, %x) back to (%v, %x)\n", latest.NumberU64(), latest.Hash(), reorgedBlock.Uint64(), reorg.Hash()) // Actually need to change the block here to trigger the reorg. _, err1 = emitter1.EmitLog1(owner, []*big.Int{big.NewInt(1)}) require.NoError(t, err1) for j := 0; j < int(mineOrReorg[i]+1); j++ { // Need +1 to make it actually longer height so we detect it. ec.Commit() } latest, err1 = ec.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err1) t.Logf("New latest (%v, %x), latest parent %x)\n", latest.NumberU64(), latest.Hash(), latest.ParentHash()) } lp.PollAndSaveLogs(testutils.Context(t), currentBlock.BlockNumber) currentBlock, err = lp.LatestBlock(testutils.Context(t)) require.NoError(t, err) } return matchesGeth() }, gen.SliceOfN(numChainInserts, gen.UInt64Range(1, uint64(finalityDepth-1)))))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `ec.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `lp.PollAndSaveLogs(testutils.Context(t), currentBlockNumber)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `ec.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `_, err1 = emitter1.EmitLog1(owner, []*big.Int{big.NewInt(1)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `ec.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `latest, err1 = ec.BlockByNumber(testutils.Context(t), nil)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `lp.PollAndSaveLogs(testutils.Context(t), currentBlock.BlockNumber)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `currentBlock, err = lp.LatestBlock(testutils.Context(t))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `t.Run(tt.name, func(t *testing.T) { lpOpts := logpoller.Opts{ UseFinalityTag: tt.finalityTag, FinalityDepth: tt.finalityDepth, BackfillBatchSize: 3, RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } th := SetupTH(t, lpOpts) // Set up a log poller listening for log emitter logs. err := th.LogPoller.RegisterFilter(testutils.Context(t), logpoller.Filter{ Name: "Test Emitter 1 & 2", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID, EmitterABI.Events["Log2"].ID}, Addresses: []common.Address{th.EmitterAddress1, th.EmitterAddress2}, }) require.NoError(t, err) b, err := th.Client.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err) require.Equal(t, uint64(1), b.NumberU64()) require.Equal(t, uint64(10), b.Time()) // Test scenario: single block in chain, no logs. // Chain genesis <- 1 // DB: empty newStart := th.PollAndSaveLogs(testutils.Context(t), 1) assert.Equal(t, int64(2), newStart) // We expect to have saved block 1. lpb, err := th.ORM.SelectBlockByNumber(testutils.Context(t), 1) require.NoError(t, err) assert.Equal(t, lpb.BlockHash, b.Hash()) assert.Equal(t, lpb.BlockNumber, int64(b.NumberU64())) assert.Equal(t, int64(1), int64(b.NumberU64())) assert.Equal(t, uint64(10), b.Time()) // No logs. lgs, err := th.ORM.SelectLogsByBlockRange(testutils.Context(t), 1, 1) require.NoError(t, err) assert.Equal(t, 0, len(lgs)) th.assertHaveCanonical(t, 1, 1) // Polling again should be a noop, since we are at the latest. newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(2), newStart) latest, err := th.ORM.SelectLatestBlock(testutils.Context(t)) require.NoError(t, err) assert.Equal(t, int64(1), latest.BlockNumber) th.assertHaveCanonical(t, 1, 1) // Test scenario: one log 2 block chain. // Chain gen <- 1 <- 2 (L1) // DB: 1 _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)}) require.NoError(t, err) th.Client.Commit() // Polling should get us the L1 log. newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(3), newStart) latest, err = th.ORM.SelectLatestBlock(testutils.Context(t)) require.NoError(t, err) assert.Equal(t, int64(2), latest.BlockNumber) lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 1, 3) require.NoError(t, err) require.Equal(t, 1, len(lgs)) assert.Equal(t, th.EmitterAddress1, lgs[0].Address) assert.Equal(t, latest.BlockHash, lgs[0].BlockHash) assert.Equal(t, latest.BlockTimestamp, lgs[0].BlockTimestamp) assert.Equal(t, hexutil.Encode(lgs[0].Topics[0]), EmitterABI.Events["Log1"].ID.String()) assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000001`), lgs[0].Data) // Test scenario: single block reorg with log. // Chain gen <- 1 <- 2 (L1_1) // \ 2'(L1_2) <- 3 // DB: 1, 2 // - Detect a reorg, // - Update the block 2's hash // - Save L1' // - L1_1 deleted reorgedOutBlock, err := th.Client.BlockByNumber(testutils.Context(t), big.NewInt(2)) require.NoError(t, err) lca, err := th.Client.BlockByNumber(testutils.Context(t), big.NewInt(1)) require.NoError(t, err) require.NoError(t, th.Client.Fork(testutils.Context(t), lca.Hash())) _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(2)}) require.NoError(t, err) // Create 2' th.Client.Commit() // Create 3 (we need a new block for us to do any polling and detect the reorg). th.Client.Commit() newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(4), newStart) latest, err = th.ORM.SelectLatestBlock(testutils.Context(t)) require.NoError(t, err) assert.Equal(t, int64(3), latest.BlockNumber) lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 1, 3) require.NoError(t, err) require.Equal(t, 1, len(lgs)) assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000002`), lgs[0].Data) th.assertHaveCanonical(t, 1, 3) // Test scenario: reorg back to previous tip. // Chain gen <- 1 <- 2 (L1_1) <- 3' (L1_3) <- 4 // \ 2'(L1_2) <- 3 require.NoError(t, th.Client.Fork(testutils.Context(t), reorgedOutBlock.Hash())) _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(3)}) require.NoError(t, err) // Create 3' th.Client.Commit() // Create 4 th.Client.Commit() // Mark block 1 as finalized markBlockAsFinalized(t, th, 1) newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(5), newStart) latest, err = th.ORM.SelectLatestBlock(testutils.Context(t)) require.NoError(t, err) assert.Equal(t, int64(4), latest.BlockNumber) lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 1, 3) require.NoError(t, err) // We expect ONLY L1_1 and L1_3 since L1_2 is reorg'd out. assert.Equal(t, 2, len(lgs)) assert.Equal(t, int64(2), lgs[0].BlockNumber) assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000001`), lgs[0].Data) assert.Equal(t, int64(3), lgs[1].BlockNumber) assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000003`), lgs[1].Data) th.assertHaveCanonical(t, 1, 1) th.assertHaveCanonical(t, 3, 4) th.assertDontHave(t, 2, 2) // 2 gets backfilled // Test scenario: multiple logs per block for many blocks (also after reorg). // Chain gen <- 1 <- 2 (L1_1) <- 3' L1_3 <- 4 <- 5 (L1_4, L2_5) <- 6 (L1_6) // \ 2'(L1_2) <- 3 // DB: 1, 2', 3' // - Should save 4, 5, 6 blocks // - Should obtain logs L1_3, L2_5, L1_6 _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(4)}) require.NoError(t, err) _, err = th.Emitter2.EmitLog1(th.Owner, []*big.Int{big.NewInt(5)}) require.NoError(t, err) // Create 4 th.Client.Commit() _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(6)}) require.NoError(t, err) // Create 5 th.Client.Commit() // Mark block 2 as finalized markBlockAsFinalized(t, th, 3) newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(7), newStart) lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 4, 6) require.NoError(t, err) require.Equal(t, 3, len(lgs)) assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000004`), lgs[0].Data) assert.Equal(t, th.EmitterAddress1, lgs[0].Address) assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000005`), lgs[1].Data) assert.Equal(t, th.EmitterAddress2, lgs[1].Address) assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000006`), lgs[2].Data) assert.Equal(t, th.EmitterAddress1, lgs[2].Address) th.assertHaveCanonical(t, 1, 1) th.assertDontHave(t, 2, 2) // 2 gets backfilled th.assertHaveCanonical(t, 3, 6) // Test scenario: node down for exactly finality + 2 blocks // Note we only backfill up to finalized - 1 blocks, because we need to save the // Chain gen <- 1 <- 2 (L1_1) <- 3' L1_3 <- 4 <- 5 (L1_4, L2_5) <- 6 (L1_6) <- 7 (L1_7) <- 8 (L1_8) <- 9 (L1_9) <- 10 (L1_10) // \ 2'(L1_2) <- 3 // DB: 1, 2, 3, 4, 5, 6 // - We expect block 7 to backfilled (treated as finalized) // - Then block 8-10 to be handled block by block (treated as unfinalized). for i := 7; i < 11; i++ { _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err) th.Client.Commit() } // Mark block 7 as finalized markBlockAsFinalized(t, th, 7) newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(11), newStart) lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 7, 9) require.NoError(t, err) require.Equal(t, 3, len(lgs)) assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000007`), lgs[0].Data) assert.Equal(t, int64(7), lgs[0].BlockNumber) assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000008`), lgs[1].Data) assert.Equal(t, int64(8), lgs[1].BlockNumber) assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000009`), lgs[2].Data) assert.Equal(t, int64(9), lgs[2].BlockNumber) th.assertDontHave(t, 7, 7) // Do not expect to save backfilled blocks. th.assertHaveCanonical(t, 8, 10) // Test scenario large backfill (multiple batches) // Chain gen <- 1 <- 2 (L1_1) <- 3' L1_3 <- 4 <- 5 (L1_4, L2_5) <- 6 (L1_6) <- 7 (L1_7) <- 8 (L1_8) <- 9 (L1_9) <- 10..16 // \ 2'(L1_2) <- 3 // DB: 1, 2, 3, 4, 5, 6, (backfilled 7), 8, 9, 10 // - 11, 12, 13 backfilled in batch 1 // - 14 backfilled in batch 2 // - 15, 16, 17 to be treated as unfinalized for i := 11; i < 18; i++ { _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err) th.Client.Commit() } // Mark block 14 as finalized markBlockAsFinalized(t, th, 14) newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(18), newStart) lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 11, 17) require.NoError(t, err) assert.Equal(t, 7, len(lgs)) th.assertHaveCanonical(t, 14, 16) // Should have last finalized block plus unfinalized blocks th.assertDontHave(t, 11, 13) // Should not have older finalized blocks // Verify that a custom block timestamp will get written to db correctly also b, err = th.Client.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err) require.Equal(t, uint64(17), b.NumberU64()) require.Equal(t, uint64(170), b.Time()) require.NoError(t, th.Client.AdjustTime(1*time.Hour)) th.Client.Commit() b, err = th.Client.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err) require.Equal(t, uint64(180+time.Hour.Seconds()), b.Time()) })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.assertHaveCanonical(t, 1, 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `newStart = th.PollAndSaveLogs(testutils.Context(t), newStart)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.assertHaveCanonical(t, 1, 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `_, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `newStart = th.PollAndSaveLogs(testutils.Context(t), newStart)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `latest, err = th.ORM.SelectLatestBlock(testutils.Context(t))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 1, 3)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `_, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(2)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `newStart = th.PollAndSaveLogs(testutils.Context(t), newStart)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `latest, err = th.ORM.SelectLatestBlock(testutils.Context(t))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 1, 3)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.assertHaveCanonical(t, 1, 3)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `_, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(3)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `markBlockAsFinalized(t, th, 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `newStart = th.PollAndSaveLogs(testutils.Context(t), newStart)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `latest, err = th.ORM.SelectLatestBlock(testutils.Context(t))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 1, 3)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.assertHaveCanonical(t, 1, 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.assertHaveCanonical(t, 3, 4)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.assertDontHave(t, 2, 2)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `_, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(4)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `_, err = th.Emitter2.EmitLog1(th.Owner, []*big.Int{big.NewInt(5)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `_, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(6)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `markBlockAsFinalized(t, th, 3)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `newStart = th.PollAndSaveLogs(testutils.Context(t), newStart)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 4, 6)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.assertHaveCanonical(t, 1, 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.assertDontHave(t, 2, 2)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.assertHaveCanonical(t, 3, 6)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `_, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `markBlockAsFinalized(t, th, 7)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `newStart = th.PollAndSaveLogs(testutils.Context(t), newStart)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 7, 9)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.assertDontHave(t, 7, 7)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.assertHaveCanonical(t, 8, 10)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `_, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `markBlockAsFinalized(t, th, 14)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `newStart = th.PollAndSaveLogs(testutils.Context(t), newStart)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 11, 17)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.assertHaveCanonical(t, 14, 16)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.assertDontHave(t, 11, 13)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `b, err = th.Client.BlockByNumber(testutils.Context(t), nil)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `b, err = th.Client.BlockByNumber(testutils.Context(t), nil)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `t.Run(tt.name, func(t *testing.T) { th := SetupTH(t, logpoller.Opts{ UseFinalityTag: tt.finalityTag, FinalityDepth: tt.finalityDepth, BackfillBatchSize: 3, RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, BackupPollerBlockDelay: 100, }) // Set up a log poller listening for log emitter logs. err := th.LogPoller.RegisterFilter(testutils.Context(t), logpoller.Filter{ Name: "Test Emitter", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, Addresses: []common.Address{th.EmitterAddress1}, }) require.NoError(t, err) // Test scenario // Chain gen <- 1 <- 2 <- 3 (finalized) <- 4 (L1_1) _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)}) require.NoError(t, err) th.Client.Commit() th.Client.Commit() th.Client.Commit() markBlockAsFinalized(t, th, 3) // Polling should get us the L1 log. firstPoll := th.PollAndSaveLogs(testutils.Context(t), 1) assert.Equal(t, int64(5), firstPoll) assert.NoError(t, th.LogPoller.Healthy()) // Fork deeper than finality depth // Chain gen <- 1 <- 2 <- 3 (finalized) <- 4 (L1_1) // \ 2' <- 3' <- 4' <- 5' <- 6' (finalized) <- 7' <- 8' <- 9' <- 10' (L1_2) lca, err := th.Client.BlockByNumber(testutils.Context(t), big.NewInt(1)) require.NoError(t, err) require.NoError(t, th.Client.Fork(testutils.Context(t), lca.Hash())) // Create 2' _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(2)}) require.NoError(t, err) th.Client.Commit() // Create 3-10 for i := 3; i < 10; i++ { _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err) th.Client.Commit() } markBlockAsFinalized(t, th, 6) secondPoll := th.PollAndSaveLogs(testutils.Context(t), firstPoll) assert.Equal(t, firstPoll, secondPoll) assert.Equal(t, logpoller.ErrFinalityViolated, th.LogPoller.Healthy()) // Manually remove latest block from the log poller to bring it back to life // LogPoller should be healthy again after first poll // Chain gen <- 1 // \ 2' <- 3' <- 4' <- 5' <- 6' (finalized) <- 7' <- 8' <- 9' <- 10' (L1_2) require.NoError(t, th.ORM.DeleteLogsAndBlocksAfter(testutils.Context(t), 2)) // Poll from latest recoveryPoll := th.PollAndSaveLogs(testutils.Context(t), 1) assert.Equal(t, int64(10), recoveryPoll) assert.NoError(t, th.LogPoller.Healthy()) })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `_, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `markBlockAsFinalized(t, th, 3)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `_, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(2)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `_, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `markBlockAsFinalized(t, th, 6)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `t.Run(tt.name, func(t *testing.T) { lpOpts := logpoller.Opts{ UseFinalityTag: tt.finalityTag, FinalityDepth: tt.finalityDepth, BackfillBatchSize: 3, RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } th := SetupTH(t, lpOpts) // Set up a log poller listening for log emitter logs. err := th.LogPoller.RegisterFilter(testutils.Context(t), logpoller.Filter{ Name: "Test Emitter", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, Addresses: []common.Address{th.EmitterAddress1}, }) require.NoError(t, err) // Test scenario: one log 2 block chain. // Chain gen <- 1 <- 2 (L1_1) // DB: 1 _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)}) require.NoError(t, err) th.Client.Commit() markBlockAsFinalized(t, th, 1) // Polling should get us the L1 log. newStart := th.PollAndSaveLogs(testutils.Context(t), 1) assert.NoError(t, th.LogPoller.Healthy()) assert.Equal(t, int64(3), newStart) // Check that L1_1 has a proper data payload lgs, err := th.ORM.SelectLogsByBlockRange(testutils.Context(t), 2, 2) require.NoError(t, err) require.NotZero(t, len(lgs)) assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000001`), lgs[0].Data) // Single block reorg and log poller not working for a while, mine blocks and progress with finalization // Chain gen <- 1 <- 2 (L1_1) // \ 2'(L1_2) <- 3 <- 4 <- 5 <- 6 (finalized on chain) <- 7 <- 8 <- 9 <- 10 lca, err := th.Client.BlockByNumber(testutils.Context(t), big.NewInt(1)) require.NoError(t, err) require.NoError(t, th.Client.Fork(testutils.Context(t), lca.Hash())) // Create 2' _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(2)}) require.NoError(t, err) th.Client.Commit() // Create 3-10 for i := 3; i < 10; i++ { _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err) th.Client.Commit() } markBlockAsFinalized(t, th, 6) newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(10), newStart) assert.NoError(t, th.LogPoller.Healthy()) // Expect L1_2 to be properly updated lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 2, 2) require.NoError(t, err) require.NotZero(t, len(lgs)) assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000002`), lgs[0].Data) th.assertHaveCanonical(t, 1, 1) th.assertDontHave(t, 2, 3) // These blocks are backfilled th.assertHaveCanonical(t, 5, 10) })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `_, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `markBlockAsFinalized(t, th, 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `_, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(2)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `_, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `markBlockAsFinalized(t, th, 6)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `newStart = th.PollAndSaveLogs(testutils.Context(t), newStart)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 2, 2)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.assertHaveCanonical(t, 1, 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.assertDontHave(t, 2, 3)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.assertHaveCanonical(t, 5, 10)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `err = th.LogPoller.RegisterFilter(testutils.Context(t), filter2)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `err = th.LogPoller.RegisterFilter(testutils.Context(t), filter3)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `filter, ok = filters["second Filter"]` $DIR/core/chains/evm/logpoller/log_poller_test.go: `filter, ok = filters["third Filter"]` $DIR/core/chains/evm/logpoller/log_poller_test.go: `t.Run("HasFilter", func(t *testing.T) { assert.True(t, th.LogPoller.HasFilter("first Filter")) assert.True(t, th.LogPoller.HasFilter("second Filter")) assert.True(t, th.LogPoller.HasFilter("third Filter")) assert.False(t, th.LogPoller.HasFilter("fourth Filter")) })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `_, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(2)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `err = th.LogPoller.RegisterFilter(testutils.Context(t), logpoller.Filter{ Name: "GetBlocks Test", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID, EmitterABI.Events["Log2"].ID}, Addresses: []common.Address{th.EmitterAddress1, th.EmitterAddress2}, })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `blockNums = []uint64{1}` $DIR/core/chains/evm/logpoller/log_poller_test.go: `blocks, err = th.LogPoller.GetBlocksRange(testutils.Context(t), blockNums)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `blockNums = []uint64{2}` $DIR/core/chains/evm/logpoller/log_poller_test.go: `_, err = th.LogPoller.GetBlocksRange(testutils.Context(t), blockNums)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `_, err = th.ORM.SelectBlockByNumber(testutils.Context(t), 2)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `_, err = th.ORM.SelectBlockByNumber(testutils.Context(t), 3)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.LogPoller.PollAndSaveLogs(testutils.Context(t), 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `blockNums = []uint64{1, 2}` $DIR/core/chains/evm/logpoller/log_poller_test.go: `blocks, err = th.LogPoller.GetBlocksRange(testutils.Context(t), blockNums)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `blockNums = []uint64{2, 1}` $DIR/core/chains/evm/logpoller/log_poller_test.go: `cancel()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `_, err = th.LogPoller.GetBlocksRange(ctx, blockNums)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `ctx, cancel = context.WithCancel(testutils.Context(t))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `cancel()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `_, err = th.LogPoller.GetBlocksRange(ctx, blockNums)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `requested = int64(15)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `fromBlock, err = th.LogPoller.GetReplayFromBlock(testutils.Context(t), requested)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `requested = int64(7)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `fromBlock, err = th.LogPoller.GetReplayFromBlock(testutils.Context(t), requested)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `_, err = emitter.EmitLog1(owner, []*big.Int{big.NewInt(9)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `_, err = emitter.EmitLog1(owner, []*big.Int{big.NewInt(7)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `ec.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `ec.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `ec.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `err = lp.Replay(ctx, 5)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `err = lp.Replay(ctx, 2)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `time.Sleep(100 * time.Millisecond)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `testutils.AssertEventually(t, func() bool { return observedLogs.Len() >= 1 })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `err = lp.Close()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `logMsgs[(obs.Entry.Message)] = 1` $DIR/core/chains/evm/logpoller/log_poller_test.go: `logMsgs[(obs.Entry.Message)]++` $DIR/core/chains/evm/logpoller/log_poller_test.go: `lp.PollAndSaveLogs(ctx, 5)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `obs.TakeAll()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `call1.Unset()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `call2.Unset()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `call1.On("HeadByNumber", mock.Anything, mock.Anything).Return(func(ctx context.Context, blockNumber *big.Int) (*evmtypes.Head, error) { if blockNumber == nil { return &evmtypes.Head{Number: 500}, nil // Simulate currentBlock = 300 } return &evmtypes.Head{Number: blockNumber.Int64()}, nil })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `call2.On("FilterLogs", mock.Anything, mock.Anything).Return(func(ctx context.Context, fq ethereum.FilterQuery) (logs []types.Log, err error) { if fq.BlockHash != nil { return []types.Log{}, nil // succeed when single block requested } return []types.Log{}, &clientErr // return "too many results" error if block range spans 4 or more blocks })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `lp.PollAndSaveLogs(ctx, 298)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `block, err2 = o.SelectLatestBlock(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Blockchain().SetFinalized(h)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `t.Run(tt.name, func(t *testing.T) { lpOpts := logpoller.Opts{ UseFinalityTag: tt.useFinalityTag, FinalityDepth: tt.finalityDepth, BackfillBatchSize: 3, RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } th := SetupTH(t, lpOpts) // Should return error before the first poll and save _, err := th.LogPoller.LatestBlock(ctx) require.Error(t, err) // Mark first block as finalized h := th.Client.Blockchain().CurrentHeader() th.Client.Blockchain().SetFinalized(h) // Create a couple of blocks for i := 0; i < numberOfBlocks-1; i++ { th.Client.Commit() } th.PollAndSaveLogs(ctx, 1) latestBlock, err := th.LogPoller.LatestBlock(ctx) require.NoError(t, err) require.Equal(t, int64(numberOfBlocks), latestBlock.BlockNumber) require.Equal(t, tt.expectedFinalizedBlock, latestBlock.FinalizedBlockNumber) })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Blockchain().SetFinalized(h)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.PollAndSaveLogs(ctx, 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `t.Run(tt.name, func(t *testing.T) { lpOpts := logpoller.Opts{ UseFinalityTag: tt.finalityTag, FinalityDepth: tt.finalityDepth, BackfillBatchSize: 3, RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, BackupPollerBlockDelay: 100, } th := SetupTH(t, lpOpts) header, err := th.Client.HeaderByNumber(ctx, nil) require.NoError(t, err) genesisBlockTime := time.UnixMilli(int64(header.Time)) // Emit some logs in blocks for i := 0; i < emittedLogs; i++ { _, err2 := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err2) th.Client.Commit() } // First PollAndSave, no filters are registered currentBlock := th.PollAndSaveLogs(ctx, 1) err = th.LogPoller.RegisterFilter(ctx, logpoller.Filter{ Name: "Test Emitter", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, Addresses: []common.Address{th.EmitterAddress1}, }) require.NoError(t, err) // Emit blocks to cover finality depth, because backup always backfill up to the one block before last finalized for i := 0; i < int(tt.finalityDepth)+1; i++ { bh := th.Client.Commit() markBlockAsFinalizedByHash(t, th, bh) } // LogPoller should backfill entire history th.LogPoller.BackupPollAndSaveLogs(ctx) require.NoError(t, err) // Make sure that all logs are backfilled logs, err := th.LogPoller.Logs( ctx, 0, currentBlock, EmitterABI.Events["Log1"].ID, th.EmitterAddress1, ) require.NoError(t, err) require.Len(t, logs, emittedLogs) // We should get all the logs by the block_timestamp logs, err = th.LogPoller.LogsCreatedAfter( ctx, EmitterABI.Events["Log1"].ID, th.EmitterAddress1, genesisBlockTime, 0, ) require.NoError(t, err) require.Len(t, logs, emittedLogs) })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `err = th.LogPoller.RegisterFilter(ctx, logpoller.Filter{ Name: "Test Emitter", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, Addresses: []common.Address{th.EmitterAddress1}, })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `markBlockAsFinalizedByHash(t, th, bh)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `th.LogPoller.BackupPollAndSaveLogs(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `logs, err = th.LogPoller.LogsCreatedAfter( ctx, EmitterABI.Events["Log1"].ID, th.EmitterAddress1, genesisBlockTime, 0, )` $DIR/core/chains/evm/logpoller/log_poller_test.go: `t.Run(tt.name, func(t *testing.T) { lpOpts := logpoller.Opts{ UseFinalityTag: true, BackfillBatchSize: 3, RpcBatchSize: 2, KeepFinalizedBlocksDepth: tt.keepFinalizedBlocksDepth, } th := SetupTH(t, lpOpts) for i := 1; i <= tt.blockToCreate; i++ { err := th.ORM.InsertBlock(ctx, utils.RandomBytes32(), int64(i+10), time.Now(), int64(i)) require.NoError(t, err) } if tt.wantErr { _, err := th.LogPoller.PruneOldBlocks(ctx) require.Error(t, err) return } allDeleted, err := th.LogPoller.PruneOldBlocks(ctx) require.NoError(t, err) assert.True(t, allDeleted) blocks, err := th.ORM.GetBlocksRange(ctx, 0, math.MaxInt64) require.NoError(t, err) assert.Len(t, blocks, tt.blocksLeft) })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `t.Run("Fails, if failed to select oldest block", func(t *testing.T) { _, err := lp.FindLCA(ctx) require.ErrorContains(t, err, "failed to select the latest block") })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `t.Run("Fails, if caller's context canceled", func(t *testing.T) { lCtx, cancel := context.WithCancel(ctx) ec.On("HeadByHash", mock.Anything, latestBlockHash).Return(nil, nil).Run(func(_ mock.Arguments) { cancel() }).Once() _, err := lp.FindLCA(lCtx) require.ErrorContains(t, err, "aborted, FindLCA request cancelled") })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `ec.On("HeadByHash", mock.Anything, latestBlockHash).Return(nil, nil).Run(func(_ mock.Arguments) { cancel() }).Once()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `cancel()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `t.Run("Fails, if RPC returns an error", func(t *testing.T) { expectedError := fmt.Errorf("failed to call RPC") ec.On("HeadByHash", mock.Anything, latestBlockHash).Return(nil, expectedError).Once() _, err := lp.FindLCA(ctx) require.ErrorContains(t, err, expectedError.Error()) })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `ec.On("HeadByHash", mock.Anything, latestBlockHash).Return(nil, expectedError).Once()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `t.Run("Fails, if block numbers do not match", func(t *testing.T) { ec.On("HeadByHash", mock.Anything, latestBlockHash).Return(&evmtypes.Head{ Number: 123, }, nil).Once() _, err := lp.FindLCA(ctx) require.ErrorContains(t, err, "expected block numbers to match") })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `ec.On("HeadByHash", mock.Anything, latestBlockHash).Return(&evmtypes.Head{ Number: 123, }, nil).Once()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `t.Run("Fails, if none of the blocks in db matches on chain", func(t *testing.T) { ec.On("HeadByHash", mock.Anything, mock.Anything).Return(nil, nil).Times(3) _, err := lp.FindLCA(ctx) require.ErrorContains(t, err, "failed to find LCA, this means that whole database LogPoller state was reorged out of chain or RPC/Core node is misconfigured") })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `ec.On("HeadByHash", mock.Anything, mock.Anything).Return(nil, nil).Times(3)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `t.Run(tc.Name, func(t *testing.T) { // reset the database require.NoError(t, orm.DeleteLogsAndBlocksAfter(ctx, 0)) for _, b := range tc.Blocks { blockHashI++ hash := common.BigToHash(big.NewInt(blockHashI)) require.NoError(t, orm.InsertBlock(ctx, hash, int64(b.BN), time.Now(), 0)) // Hashes are unique for all test cases var onChainBlock *evmtypes.Head if b.Exists { onChainBlock = &evmtypes.Head{Number: int64(b.BN)} } ec.On("HeadByHash", mock.Anything, hash).Return(onChainBlock, nil).Maybe() } result, err := lp.FindLCA(ctx) if tc.ExpectedError != nil { require.ErrorContains(t, err, tc.ExpectedError.Error()) } else { require.NotNil(t, result) require.Equal(t, result.BlockNumber, int64(tc.ExpectedBlockNumber), "expected block numbers to match") } })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `blockHashI++` $DIR/core/chains/evm/logpoller/log_poller_test.go: `onChainBlock = &evmtypes.Head{Number: int64(b.BN)}` $DIR/core/chains/evm/logpoller/log_poller_test.go: `ec.On("HeadByHash", mock.Anything, hash).Return(onChainBlock, nil).Maybe()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.FullTestDBV2(t, nil)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(137)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewORM(big.NewInt(137), db, logger.Test(t))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(137)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Test(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Now()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.SelectLogs(ctx, 750000, 800000, address1, event1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Now()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.SelectLatestLogEventSigsAddrsWithConfs(ctx, 0, []common.Address{address1}, []common.Hash{event1}, 0)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Now()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.SelectLogsDataWordRange(ctx, address1, event1, 0, logpoller.EvmWord(50000), logpoller.EvmWord(50020), 0)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.EvmWord(50000)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.EvmWord(50020)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Now()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.SelectIndexedLogs(ctx, address2, event1, 1, []common.Hash{logpoller.EvmWord(50000), logpoller.EvmWord(50020)}, 0)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.EvmWord(50000)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.EvmWord(50020)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Now()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.SelectIndexedLogsTopicRange(ctx, address1, event1, 1, logpoller.EvmWord(50000), logpoller.EvmWord(50020), 0)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.EvmWord(50000)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.EvmWord(50020)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(int64(i))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(int64(i))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.Logs(ctx, 4, 7, EmitterABI.Events["Log1"].ID, th.EmitterAddress1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.AssertEventually(t, func() bool { l, err2 := th.LogPoller.Logs(ctx, 3, 3, EmitterABI.Events["Log1"].ID, th.EmitterAddress1) require.NoError(t, err2) return len(l) == 1 })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.Logs(ctx, 3, 3, EmitterABI.Events["Log1"].ID, th.EmitterAddress1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.RegisterFilter(ctx, logpoller.Filter{ Name: "Emitter - log2", EventSigs: []common.Hash{EmitterABI.Events["Log2"].ID}, Addresses: []common.Address{th.EmitterAddress1}, })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.Logs(ctx, 2, 7, EmitterABI.Events["Log2"].ID, th.EmitterAddress1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.Logs(ctx, 2, 7, EmitterABI.Events["Log2"].ID, th.EmitterAddress1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.Replay(ctx, 4)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Run(tt.name, func(t *testing.T) { th := SetupTH(t, logpoller.Opts{ UseFinalityTag: tt.finalityTag, FinalityDepth: tt.finalityDepth, BackfillBatchSize: 3, RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, BackupPollerBlockDelay: 100, }, ) // later, we will need at least 32 blocks filled with logs for cache invalidation for i := int64(0); i < 32; i++ { // to invalidate geth's internal read-cache, a matching log must be found in the bloom Filter // for each of the 32 blocks tx, err := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(i + 7)}) require.NoError(t, err) require.NotNil(t, tx) th.Client.Commit() } ctx := testutils.Context(t) filter1 := logpoller.Filter{ Name: "filter1", EventSigs: []common.Hash{ EmitterABI.Events["Log1"].ID, EmitterABI.Events["Log2"].ID}, Addresses: []common.Address{th.EmitterAddress1}, } err := th.LogPoller.RegisterFilter(ctx, filter1) require.NoError(t, err) filters, err := th.ORM.LoadFilters(ctx) require.NoError(t, err) require.Equal(t, 1, len(filters)) require.Equal(t, filter1, filters["filter1"]) err = th.LogPoller.RegisterFilter(ctx, logpoller.Filter{ Name: "filter2", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, Addresses: []common.Address{th.EmitterAddress2}, }) require.NoError(t, err) defer func() { assert.NoError(t, th.LogPoller.UnregisterFilter(ctx, "filter1")) }() defer func() { assert.NoError(t, th.LogPoller.UnregisterFilter(ctx, "filter2")) }() // generate some tx's with logs tx1, err := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)}) require.NoError(t, err) require.NotNil(t, tx1) tx2, err := th.Emitter1.EmitLog2(th.Owner, []*big.Int{big.NewInt(2)}) require.NoError(t, err) require.NotNil(t, tx2) tx3, err := th.Emitter2.EmitLog1(th.Owner, []*big.Int{big.NewInt(3)}) require.NoError(t, err) require.NotNil(t, tx3) th.Client.Commit() // commit block 34 with 3 tx's included h := th.Client.Blockchain().CurrentHeader() // get latest header require.Equal(t, uint64(34), h.Number.Uint64()) // save these 3 receipts for later receipts := rawdb.ReadReceipts(th.EthDB, h.Hash(), h.Number.Uint64(), uint64(time.Now().Unix()), params.AllEthashProtocolChanges) require.NotZero(t, receipts.Len()) // Simulate a situation where the rpc server has a block, but no logs available for it yet // this can't happen with geth itself, but can with other clients. rawdb.WriteReceipts(th.EthDB, h.Hash(), h.Number.Uint64(), types.Receipts{}) // wipes out all logs for block 34 body := rawdb.ReadBody(th.EthDB, h.Hash(), h.Number.Uint64()) require.Equal(t, 3, len(body.Transactions)) txs := body.Transactions // save transactions for later body.Transactions = types.Transactions{} // number of tx's must match # of logs for GetLogs() to succeed rawdb.WriteBody(th.EthDB, h.Hash(), h.Number.Uint64(), body) currentBlockNumber := th.PollAndSaveLogs(ctx, 1) assert.Equal(t, int64(35), currentBlockNumber) // simulate logs becoming available rawdb.WriteReceipts(th.EthDB, h.Hash(), h.Number.Uint64(), receipts) require.True(t, rawdb.HasReceipts(th.EthDB, h.Hash(), h.Number.Uint64())) body.Transactions = txs rawdb.WriteBody(th.EthDB, h.Hash(), h.Number.Uint64(), body) // flush out cached block 34 by reading logs from first 32 blocks query := ethereum.FilterQuery{ FromBlock: big.NewInt(int64(2)), ToBlock: big.NewInt(int64(33)), Addresses: []common.Address{th.EmitterAddress1}, Topics: [][]common.Hash{{EmitterABI.Events["Log1"].ID}}, } fLogs, err := th.Client.FilterLogs(ctx, query) require.NoError(t, err) require.Equal(t, 32, len(fLogs)) // logs shouldn't show up yet logs, err := th.LogPoller.Logs(ctx, 34, 34, EmitterABI.Events["Log1"].ID, th.EmitterAddress1) require.NoError(t, err) assert.Equal(t, 0, len(logs)) th.Client.Commit() th.Client.Commit() markBlockAsFinalized(t, th, 34) // Run ordinary poller + backup poller at least once currentBlock, _ := th.LogPoller.LatestBlock(ctx) th.LogPoller.PollAndSaveLogs(ctx, currentBlock.BlockNumber+1) th.LogPoller.BackupPollAndSaveLogs(ctx) currentBlock, _ = th.LogPoller.LatestBlock(ctx) require.Equal(t, int64(37), currentBlock.BlockNumber+1) // logs still shouldn't show up, because we don't want to backfill the last finalized log // to help with reorg detection logs, err = th.LogPoller.Logs(ctx, 34, 34, EmitterABI.Events["Log1"].ID, th.EmitterAddress1) require.NoError(t, err) assert.Equal(t, 0, len(logs)) th.Client.Commit() markBlockAsFinalized(t, th, 35) // Run ordinary poller + backup poller at least once more th.LogPoller.PollAndSaveLogs(ctx, currentBlockNumber+1) th.LogPoller.BackupPollAndSaveLogs(ctx) currentBlock, _ = th.LogPoller.LatestBlock(ctx) require.Equal(t, int64(38), currentBlock.BlockNumber+1) // all 3 logs in block 34 should show up now, thanks to backup logger logs, err = th.LogPoller.Logs(ctx, 30, 37, EmitterABI.Events["Log1"].ID, th.EmitterAddress1) require.NoError(t, err) assert.Equal(t, 5, len(logs)) logs, err = th.LogPoller.Logs(ctx, 34, 34, EmitterABI.Events["Log2"].ID, th.EmitterAddress1) require.NoError(t, err) assert.Equal(t, 1, len(logs)) logs, err = th.LogPoller.Logs(ctx, 32, 36, EmitterABI.Events["Log1"].ID, th.EmitterAddress2) require.NoError(t, err) assert.Equal(t, 1, len(logs)) })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(i + 7)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(i + 7)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.RegisterFilter(ctx, filter1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.ORM.LoadFilters(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.RegisterFilter(ctx, logpoller.Filter{ Name: "filter2", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, Addresses: []common.Address{th.EmitterAddress2}, })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog2(th.Owner, []*big.Int{big.NewInt(2)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(2)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter2.EmitLog1(th.Owner, []*big.Int{big.NewInt(3)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(3)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Blockchain()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.CurrentHeader()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.ReadReceipts(th.EthDB, h.Hash(), h.Number.Uint64(), uint64(time.Now().Unix()), params.AllEthashProtocolChanges)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Hash()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Number.Uint64()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Now()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Unix()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.WriteReceipts(th.EthDB, h.Hash(), h.Number.Uint64(), types.Receipts{})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Hash()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Number.Uint64()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.ReadBody(th.EthDB, h.Hash(), h.Number.Uint64())` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Hash()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Number.Uint64()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.WriteBody(th.EthDB, h.Hash(), h.Number.Uint64(), body)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Hash()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Number.Uint64()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.PollAndSaveLogs(ctx, 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.WriteReceipts(th.EthDB, h.Hash(), h.Number.Uint64(), receipts)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Hash()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Number.Uint64()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.WriteBody(th.EthDB, h.Hash(), h.Number.Uint64(), body)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Hash()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Number.Uint64()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(int64(2))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(int64(33))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.FilterLogs(ctx, query)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.Logs(ctx, 34, 34, EmitterABI.Events["Log1"].ID, th.EmitterAddress1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.LatestBlock(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.PollAndSaveLogs(ctx, currentBlock.BlockNumber+1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.BackupPollAndSaveLogs(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.LatestBlock(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.Logs(ctx, 34, 34, EmitterABI.Events["Log1"].ID, th.EmitterAddress1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.PollAndSaveLogs(ctx, currentBlockNumber+1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.BackupPollAndSaveLogs(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.LatestBlock(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.Logs(ctx, 30, 37, EmitterABI.Events["Log1"].ID, th.EmitterAddress1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.Logs(ctx, 34, 34, EmitterABI.Events["Log2"].ID, th.EmitterAddress1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.Logs(ctx, 32, 36, EmitterABI.Events["Log1"].ID, th.EmitterAddress2)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.HeaderByNumber(ctx, nil)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(int64(i))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.PollAndSaveLogs(ctx, 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.RegisterFilter(ctx, logpoller.Filter{ Name: "Test Emitter", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, Addresses: []common.Address{th.EmitterAddress1}, })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.BackupPollAndSaveLogs(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.Logs( ctx, 0, currentBlock, EmitterABI.Events["Log1"].ID, th.EmitterAddress1, )` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.BackupPollAndSaveLogs(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.Logs( ctx, 0, currentBlock+1, EmitterABI.Events["Log1"].ID, th.EmitterAddress1, )` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(int64(i))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.HeaderByNumber(ctx, nil)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Number.Int64()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.PollAndSaveLogs(ctx, 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.LatestBlock(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.RegisterFilter(ctx, logpoller.Filter{ Name: "Test Emitter", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, Addresses: []common.Address{th.EmitterAddress1}, })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.BackupPollAndSaveLogs(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.Logs( ctx, 0, header.Number.Int64()+1, EmitterABI.Events["Log1"].ID, th.EmitterAddress1, )` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Number.Int64()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(int64(i))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.PollAndSaveLogs(ctx, 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(100 + i))})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(int64(100 + i))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.PollAndSaveLogs(ctx, firstBatchBlock)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.RegisterFilter(ctx, logpoller.Filter{ Name: "Test Emitter", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, Addresses: []common.Address{th.EmitterAddress1}, })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.BackupPollAndSaveLogs(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.Logs( ctx, 0, secondBatchBlock, EmitterABI.Events["Log1"].ID, th.EmitterAddress1, )` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.MustDecode(`0x000000000000000000000000000000000000000000000000000000000000000a`)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.RegisterFilter(ctx, logpoller.Filter{Name: "convertLogs", EventSigs: events, Addresses: addresses})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.BlockByNumber(ctx, nil)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Time()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.BlockByHash(ctx, hash)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.BlockByHash(ctx, hash)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter2.EmitLog2(th.Owner, []*big.Int{big.NewInt(2)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(2)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.BlockByHash(ctx, hash)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(2)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(5)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.FilterLogs(ctx, query)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.LatestBlock(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.PollAndSaveLogs(ctx, lb.BlockNumber+1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.Logs(ctx, 0, 20, EmitterABI.Events["Log1"].ID, th.EmitterAddress1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.Logs(ctx, 0, 20, EmitterABI.Events["Log2"].ID, th.EmitterAddress2)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.BlockByHash(ctx, lg1[0].BlockHash)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.BlockByHash(ctx, lg2[0].BlockHash)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Time()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.BlockTimestamp.UTC()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Unix()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.DefaultTestParameters()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewProperties(testParams)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Test(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.MustNewSimTransactor(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(10e9)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Property("synchronized with geth", prop.ForAll(func(mineOrReorg []uint64) bool { // After the set of reorgs, we should have the same canonical blocks that geth does. t.Log("Starting test", mineOrReorg) chainID := testutils.NewRandomEVMChainID() // Set up a test chain with a log emitting contract deployed. orm := logpoller.NewORM(chainID, db, lggr) // Note this property test is run concurrently and the sim is not threadsafe. ec := backends.NewSimulatedBackend(map[common.Address]core.GenesisAccount{ owner.From: { Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), }, }, 10e6) _, _, emitter1, err := log_emitter.DeployLogEmitter(owner, ec) require.NoError(t, err) lpOpts := logpoller.Opts{ PollPeriod: 15 * time.Second, FinalityDepth: int64(finalityDepth), BackfillBatchSize: 3, RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } lp := logpoller.NewLogPoller(orm, client.NewSimulatedBackendClient(t, ec, chainID), lggr, lpOpts) for i := 0; i < finalityDepth; i++ { // Have enough blocks that we could reorg the full finalityDepth-1. ec.Commit() } currentBlockNumber := int64(1) lp.PollAndSaveLogs(testutils.Context(t), currentBlockNumber) currentBlock, err := lp.LatestBlock(testutils.Context(t)) require.NoError(t, err) matchesGeth := func() bool { // Check every block is identical latest, err1 := ec.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err1) for i := 1; i < int(latest.NumberU64()); i++ { ourBlock, err1 := lp.BlockByNumber(testutils.Context(t), int64(i)) require.NoError(t, err1) gethBlock, err1 := ec.BlockByNumber(testutils.Context(t), big.NewInt(int64(i))) require.NoError(t, err1) if ourBlock.BlockHash != gethBlock.Hash() { t.Logf("Initial poll our block differs at height %d got %x want %x\n", i, ourBlock.BlockHash, gethBlock.Hash()) return false } } return true } if !matchesGeth() { return false } // Randomly pick to mine or reorg for i := 0; i < numChainInserts; i++ { if rand.Bool() { // Mine blocks for j := 0; j < int(mineOrReorg[i]); j++ { ec.Commit() latest, err1 := ec.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err1) t.Log("mined block", latest.Hash()) } } else { // Reorg blocks latest, err1 := ec.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err1) reorgedBlock := big.NewInt(0).Sub(latest.Number(), big.NewInt(int64(mineOrReorg[i]))) reorg, err1 := ec.BlockByNumber(testutils.Context(t), reorgedBlock) require.NoError(t, err1) require.NoError(t, ec.Fork(testutils.Context(t), reorg.Hash())) t.Logf("Reorging from (%v, %x) back to (%v, %x)\n", latest.NumberU64(), latest.Hash(), reorgedBlock.Uint64(), reorg.Hash()) // Actually need to change the block here to trigger the reorg. _, err1 = emitter1.EmitLog1(owner, []*big.Int{big.NewInt(1)}) require.NoError(t, err1) for j := 0; j < int(mineOrReorg[i]+1); j++ { // Need +1 to make it actually longer height so we detect it. ec.Commit() } latest, err1 = ec.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err1) t.Logf("New latest (%v, %x), latest parent %x)\n", latest.NumberU64(), latest.Hash(), latest.ParentHash()) } lp.PollAndSaveLogs(testutils.Context(t), currentBlock.BlockNumber) currentBlock, err = lp.LatestBlock(testutils.Context(t)) require.NoError(t, err) } return matchesGeth() }, gen.SliceOfN(numChainInserts, gen.UInt64Range(1, uint64(finalityDepth-1)))))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.ForAll(func(mineOrReorg []uint64) bool { // After the set of reorgs, we should have the same canonical blocks that geth does. t.Log("Starting test", mineOrReorg) chainID := testutils.NewRandomEVMChainID() // Set up a test chain with a log emitting contract deployed. orm := logpoller.NewORM(chainID, db, lggr) // Note this property test is run concurrently and the sim is not threadsafe. ec := backends.NewSimulatedBackend(map[common.Address]core.GenesisAccount{ owner.From: { Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), }, }, 10e6) _, _, emitter1, err := log_emitter.DeployLogEmitter(owner, ec) require.NoError(t, err) lpOpts := logpoller.Opts{ PollPeriod: 15 * time.Second, FinalityDepth: int64(finalityDepth), BackfillBatchSize: 3, RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } lp := logpoller.NewLogPoller(orm, client.NewSimulatedBackendClient(t, ec, chainID), lggr, lpOpts) for i := 0; i < finalityDepth; i++ { // Have enough blocks that we could reorg the full finalityDepth-1. ec.Commit() } currentBlockNumber := int64(1) lp.PollAndSaveLogs(testutils.Context(t), currentBlockNumber) currentBlock, err := lp.LatestBlock(testutils.Context(t)) require.NoError(t, err) matchesGeth := func() bool { // Check every block is identical latest, err1 := ec.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err1) for i := 1; i < int(latest.NumberU64()); i++ { ourBlock, err1 := lp.BlockByNumber(testutils.Context(t), int64(i)) require.NoError(t, err1) gethBlock, err1 := ec.BlockByNumber(testutils.Context(t), big.NewInt(int64(i))) require.NoError(t, err1) if ourBlock.BlockHash != gethBlock.Hash() { t.Logf("Initial poll our block differs at height %d got %x want %x\n", i, ourBlock.BlockHash, gethBlock.Hash()) return false } } return true } if !matchesGeth() { return false } // Randomly pick to mine or reorg for i := 0; i < numChainInserts; i++ { if rand.Bool() { // Mine blocks for j := 0; j < int(mineOrReorg[i]); j++ { ec.Commit() latest, err1 := ec.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err1) t.Log("mined block", latest.Hash()) } } else { // Reorg blocks latest, err1 := ec.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err1) reorgedBlock := big.NewInt(0).Sub(latest.Number(), big.NewInt(int64(mineOrReorg[i]))) reorg, err1 := ec.BlockByNumber(testutils.Context(t), reorgedBlock) require.NoError(t, err1) require.NoError(t, ec.Fork(testutils.Context(t), reorg.Hash())) t.Logf("Reorging from (%v, %x) back to (%v, %x)\n", latest.NumberU64(), latest.Hash(), reorgedBlock.Uint64(), reorg.Hash()) // Actually need to change the block here to trigger the reorg. _, err1 = emitter1.EmitLog1(owner, []*big.Int{big.NewInt(1)}) require.NoError(t, err1) for j := 0; j < int(mineOrReorg[i]+1); j++ { // Need +1 to make it actually longer height so we detect it. ec.Commit() } latest, err1 = ec.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err1) t.Logf("New latest (%v, %x), latest parent %x)\n", latest.NumberU64(), latest.Hash(), latest.ParentHash()) } lp.PollAndSaveLogs(testutils.Context(t), currentBlock.BlockNumber) currentBlock, err = lp.LatestBlock(testutils.Context(t)) require.NoError(t, err) } return matchesGeth() }, gen.SliceOfN(numChainInserts, gen.UInt64Range(1, uint64(finalityDepth-1))))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewRandomEVMChainID()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewORM(chainID, db, lggr)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewSimulatedBackend(map[common.Address]core.GenesisAccount{ owner.From: { Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), }, }, 10e6)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(0)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Mul(big.NewInt(10), big.NewInt(1e18))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(10)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(1e18)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.DeployLogEmitter(owner, ec)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewLogPoller(orm, client.NewSimulatedBackendClient(t, ec, chainID), lggr, lpOpts)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewSimulatedBackendClient(t, ec, chainID)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.PollAndSaveLogs(testutils.Context(t), currentBlockNumber)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LatestBlock(testutils.Context(t))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.BlockByNumber(testutils.Context(t), nil)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NumberU64()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.BlockByNumber(testutils.Context(t), int64(i))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.BlockByNumber(testutils.Context(t), big.NewInt(int64(i)))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(int64(i))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Hash()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Bool()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.BlockByNumber(testutils.Context(t), nil)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.BlockByNumber(testutils.Context(t), nil)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(0)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Sub(latest.Number(), big.NewInt(int64(mineOrReorg[i])))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Number()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(int64(mineOrReorg[i]))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.BlockByNumber(testutils.Context(t), reorgedBlock)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.EmitLog1(owner, []*big.Int{big.NewInt(1)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.BlockByNumber(testutils.Context(t), nil)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.PollAndSaveLogs(testutils.Context(t), currentBlock.BlockNumber)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LatestBlock(testutils.Context(t))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.SliceOfN(numChainInserts, gen.UInt64Range(1, uint64(finalityDepth-1)))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.UInt64Range(1, uint64(finalityDepth-1))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Run(tt.name, func(t *testing.T) { lpOpts := logpoller.Opts{ UseFinalityTag: tt.finalityTag, FinalityDepth: tt.finalityDepth, BackfillBatchSize: 3, RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } th := SetupTH(t, lpOpts) // Set up a log poller listening for log emitter logs. err := th.LogPoller.RegisterFilter(testutils.Context(t), logpoller.Filter{ Name: "Test Emitter 1 & 2", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID, EmitterABI.Events["Log2"].ID}, Addresses: []common.Address{th.EmitterAddress1, th.EmitterAddress2}, }) require.NoError(t, err) b, err := th.Client.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err) require.Equal(t, uint64(1), b.NumberU64()) require.Equal(t, uint64(10), b.Time()) // Test scenario: single block in chain, no logs. // Chain genesis <- 1 // DB: empty newStart := th.PollAndSaveLogs(testutils.Context(t), 1) assert.Equal(t, int64(2), newStart) // We expect to have saved block 1. lpb, err := th.ORM.SelectBlockByNumber(testutils.Context(t), 1) require.NoError(t, err) assert.Equal(t, lpb.BlockHash, b.Hash()) assert.Equal(t, lpb.BlockNumber, int64(b.NumberU64())) assert.Equal(t, int64(1), int64(b.NumberU64())) assert.Equal(t, uint64(10), b.Time()) // No logs. lgs, err := th.ORM.SelectLogsByBlockRange(testutils.Context(t), 1, 1) require.NoError(t, err) assert.Equal(t, 0, len(lgs)) th.assertHaveCanonical(t, 1, 1) // Polling again should be a noop, since we are at the latest. newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(2), newStart) latest, err := th.ORM.SelectLatestBlock(testutils.Context(t)) require.NoError(t, err) assert.Equal(t, int64(1), latest.BlockNumber) th.assertHaveCanonical(t, 1, 1) // Test scenario: one log 2 block chain. // Chain gen <- 1 <- 2 (L1) // DB: 1 _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)}) require.NoError(t, err) th.Client.Commit() // Polling should get us the L1 log. newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(3), newStart) latest, err = th.ORM.SelectLatestBlock(testutils.Context(t)) require.NoError(t, err) assert.Equal(t, int64(2), latest.BlockNumber) lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 1, 3) require.NoError(t, err) require.Equal(t, 1, len(lgs)) assert.Equal(t, th.EmitterAddress1, lgs[0].Address) assert.Equal(t, latest.BlockHash, lgs[0].BlockHash) assert.Equal(t, latest.BlockTimestamp, lgs[0].BlockTimestamp) assert.Equal(t, hexutil.Encode(lgs[0].Topics[0]), EmitterABI.Events["Log1"].ID.String()) assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000001`), lgs[0].Data) // Test scenario: single block reorg with log. // Chain gen <- 1 <- 2 (L1_1) // \ 2'(L1_2) <- 3 // DB: 1, 2 // - Detect a reorg, // - Update the block 2's hash // - Save L1' // - L1_1 deleted reorgedOutBlock, err := th.Client.BlockByNumber(testutils.Context(t), big.NewInt(2)) require.NoError(t, err) lca, err := th.Client.BlockByNumber(testutils.Context(t), big.NewInt(1)) require.NoError(t, err) require.NoError(t, th.Client.Fork(testutils.Context(t), lca.Hash())) _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(2)}) require.NoError(t, err) // Create 2' th.Client.Commit() // Create 3 (we need a new block for us to do any polling and detect the reorg). th.Client.Commit() newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(4), newStart) latest, err = th.ORM.SelectLatestBlock(testutils.Context(t)) require.NoError(t, err) assert.Equal(t, int64(3), latest.BlockNumber) lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 1, 3) require.NoError(t, err) require.Equal(t, 1, len(lgs)) assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000002`), lgs[0].Data) th.assertHaveCanonical(t, 1, 3) // Test scenario: reorg back to previous tip. // Chain gen <- 1 <- 2 (L1_1) <- 3' (L1_3) <- 4 // \ 2'(L1_2) <- 3 require.NoError(t, th.Client.Fork(testutils.Context(t), reorgedOutBlock.Hash())) _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(3)}) require.NoError(t, err) // Create 3' th.Client.Commit() // Create 4 th.Client.Commit() // Mark block 1 as finalized markBlockAsFinalized(t, th, 1) newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(5), newStart) latest, err = th.ORM.SelectLatestBlock(testutils.Context(t)) require.NoError(t, err) assert.Equal(t, int64(4), latest.BlockNumber) lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 1, 3) require.NoError(t, err) // We expect ONLY L1_1 and L1_3 since L1_2 is reorg'd out. assert.Equal(t, 2, len(lgs)) assert.Equal(t, int64(2), lgs[0].BlockNumber) assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000001`), lgs[0].Data) assert.Equal(t, int64(3), lgs[1].BlockNumber) assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000003`), lgs[1].Data) th.assertHaveCanonical(t, 1, 1) th.assertHaveCanonical(t, 3, 4) th.assertDontHave(t, 2, 2) // 2 gets backfilled // Test scenario: multiple logs per block for many blocks (also after reorg). // Chain gen <- 1 <- 2 (L1_1) <- 3' L1_3 <- 4 <- 5 (L1_4, L2_5) <- 6 (L1_6) // \ 2'(L1_2) <- 3 // DB: 1, 2', 3' // - Should save 4, 5, 6 blocks // - Should obtain logs L1_3, L2_5, L1_6 _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(4)}) require.NoError(t, err) _, err = th.Emitter2.EmitLog1(th.Owner, []*big.Int{big.NewInt(5)}) require.NoError(t, err) // Create 4 th.Client.Commit() _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(6)}) require.NoError(t, err) // Create 5 th.Client.Commit() // Mark block 2 as finalized markBlockAsFinalized(t, th, 3) newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(7), newStart) lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 4, 6) require.NoError(t, err) require.Equal(t, 3, len(lgs)) assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000004`), lgs[0].Data) assert.Equal(t, th.EmitterAddress1, lgs[0].Address) assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000005`), lgs[1].Data) assert.Equal(t, th.EmitterAddress2, lgs[1].Address) assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000006`), lgs[2].Data) assert.Equal(t, th.EmitterAddress1, lgs[2].Address) th.assertHaveCanonical(t, 1, 1) th.assertDontHave(t, 2, 2) // 2 gets backfilled th.assertHaveCanonical(t, 3, 6) // Test scenario: node down for exactly finality + 2 blocks // Note we only backfill up to finalized - 1 blocks, because we need to save the // Chain gen <- 1 <- 2 (L1_1) <- 3' L1_3 <- 4 <- 5 (L1_4, L2_5) <- 6 (L1_6) <- 7 (L1_7) <- 8 (L1_8) <- 9 (L1_9) <- 10 (L1_10) // \ 2'(L1_2) <- 3 // DB: 1, 2, 3, 4, 5, 6 // - We expect block 7 to backfilled (treated as finalized) // - Then block 8-10 to be handled block by block (treated as unfinalized). for i := 7; i < 11; i++ { _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err) th.Client.Commit() } // Mark block 7 as finalized markBlockAsFinalized(t, th, 7) newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(11), newStart) lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 7, 9) require.NoError(t, err) require.Equal(t, 3, len(lgs)) assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000007`), lgs[0].Data) assert.Equal(t, int64(7), lgs[0].BlockNumber) assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000008`), lgs[1].Data) assert.Equal(t, int64(8), lgs[1].BlockNumber) assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000009`), lgs[2].Data) assert.Equal(t, int64(9), lgs[2].BlockNumber) th.assertDontHave(t, 7, 7) // Do not expect to save backfilled blocks. th.assertHaveCanonical(t, 8, 10) // Test scenario large backfill (multiple batches) // Chain gen <- 1 <- 2 (L1_1) <- 3' L1_3 <- 4 <- 5 (L1_4, L2_5) <- 6 (L1_6) <- 7 (L1_7) <- 8 (L1_8) <- 9 (L1_9) <- 10..16 // \ 2'(L1_2) <- 3 // DB: 1, 2, 3, 4, 5, 6, (backfilled 7), 8, 9, 10 // - 11, 12, 13 backfilled in batch 1 // - 14 backfilled in batch 2 // - 15, 16, 17 to be treated as unfinalized for i := 11; i < 18; i++ { _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err) th.Client.Commit() } // Mark block 14 as finalized markBlockAsFinalized(t, th, 14) newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(18), newStart) lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 11, 17) require.NoError(t, err) assert.Equal(t, 7, len(lgs)) th.assertHaveCanonical(t, 14, 16) // Should have last finalized block plus unfinalized blocks th.assertDontHave(t, 11, 13) // Should not have older finalized blocks // Verify that a custom block timestamp will get written to db correctly also b, err = th.Client.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err) require.Equal(t, uint64(17), b.NumberU64()) require.Equal(t, uint64(170), b.Time()) require.NoError(t, th.Client.AdjustTime(1*time.Hour)) th.Client.Commit() b, err = th.Client.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err) require.Equal(t, uint64(180+time.Hour.Seconds()), b.Time()) })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.RegisterFilter(testutils.Context(t), logpoller.Filter{ Name: "Test Emitter 1 & 2", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID, EmitterABI.Events["Log2"].ID}, Addresses: []common.Address{th.EmitterAddress1, th.EmitterAddress2}, })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.BlockByNumber(testutils.Context(t), nil)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.PollAndSaveLogs(testutils.Context(t), 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.ORM.SelectBlockByNumber(testutils.Context(t), 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.ORM.SelectLogsByBlockRange(testutils.Context(t), 1, 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.assertHaveCanonical(t, 1, 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.PollAndSaveLogs(testutils.Context(t), newStart)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.ORM.SelectLatestBlock(testutils.Context(t))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.assertHaveCanonical(t, 1, 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.PollAndSaveLogs(testutils.Context(t), newStart)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.ORM.SelectLatestBlock(testutils.Context(t))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.ORM.SelectLogsByBlockRange(testutils.Context(t), 1, 3)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.BlockByNumber(testutils.Context(t), big.NewInt(2))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(2)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.BlockByNumber(testutils.Context(t), big.NewInt(1))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(2)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(2)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.PollAndSaveLogs(testutils.Context(t), newStart)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.ORM.SelectLatestBlock(testutils.Context(t))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.ORM.SelectLogsByBlockRange(testutils.Context(t), 1, 3)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.assertHaveCanonical(t, 1, 3)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(3)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(3)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.PollAndSaveLogs(testutils.Context(t), newStart)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.ORM.SelectLatestBlock(testutils.Context(t))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.ORM.SelectLogsByBlockRange(testutils.Context(t), 1, 3)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.assertHaveCanonical(t, 1, 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.assertHaveCanonical(t, 3, 4)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.assertDontHave(t, 2, 2)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(4)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(4)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter2.EmitLog1(th.Owner, []*big.Int{big.NewInt(5)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(5)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(6)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(6)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.PollAndSaveLogs(testutils.Context(t), newStart)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.ORM.SelectLogsByBlockRange(testutils.Context(t), 4, 6)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.assertHaveCanonical(t, 1, 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.assertDontHave(t, 2, 2)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.assertHaveCanonical(t, 3, 6)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(int64(i))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.PollAndSaveLogs(testutils.Context(t), newStart)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.ORM.SelectLogsByBlockRange(testutils.Context(t), 7, 9)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.assertDontHave(t, 7, 7)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.assertHaveCanonical(t, 8, 10)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(int64(i))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.PollAndSaveLogs(testutils.Context(t), newStart)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.ORM.SelectLogsByBlockRange(testutils.Context(t), 11, 17)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.assertHaveCanonical(t, 14, 16)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.assertDontHave(t, 11, 13)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.BlockByNumber(testutils.Context(t), nil)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.BlockByNumber(testutils.Context(t), nil)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Run(tt.name, func(t *testing.T) { th := SetupTH(t, logpoller.Opts{ UseFinalityTag: tt.finalityTag, FinalityDepth: tt.finalityDepth, BackfillBatchSize: 3, RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, BackupPollerBlockDelay: 100, }) // Set up a log poller listening for log emitter logs. err := th.LogPoller.RegisterFilter(testutils.Context(t), logpoller.Filter{ Name: "Test Emitter", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, Addresses: []common.Address{th.EmitterAddress1}, }) require.NoError(t, err) // Test scenario // Chain gen <- 1 <- 2 <- 3 (finalized) <- 4 (L1_1) _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)}) require.NoError(t, err) th.Client.Commit() th.Client.Commit() th.Client.Commit() markBlockAsFinalized(t, th, 3) // Polling should get us the L1 log. firstPoll := th.PollAndSaveLogs(testutils.Context(t), 1) assert.Equal(t, int64(5), firstPoll) assert.NoError(t, th.LogPoller.Healthy()) // Fork deeper than finality depth // Chain gen <- 1 <- 2 <- 3 (finalized) <- 4 (L1_1) // \ 2' <- 3' <- 4' <- 5' <- 6' (finalized) <- 7' <- 8' <- 9' <- 10' (L1_2) lca, err := th.Client.BlockByNumber(testutils.Context(t), big.NewInt(1)) require.NoError(t, err) require.NoError(t, th.Client.Fork(testutils.Context(t), lca.Hash())) // Create 2' _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(2)}) require.NoError(t, err) th.Client.Commit() // Create 3-10 for i := 3; i < 10; i++ { _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err) th.Client.Commit() } markBlockAsFinalized(t, th, 6) secondPoll := th.PollAndSaveLogs(testutils.Context(t), firstPoll) assert.Equal(t, firstPoll, secondPoll) assert.Equal(t, logpoller.ErrFinalityViolated, th.LogPoller.Healthy()) // Manually remove latest block from the log poller to bring it back to life // LogPoller should be healthy again after first poll // Chain gen <- 1 // \ 2' <- 3' <- 4' <- 5' <- 6' (finalized) <- 7' <- 8' <- 9' <- 10' (L1_2) require.NoError(t, th.ORM.DeleteLogsAndBlocksAfter(testutils.Context(t), 2)) // Poll from latest recoveryPoll := th.PollAndSaveLogs(testutils.Context(t), 1) assert.Equal(t, int64(10), recoveryPoll) assert.NoError(t, th.LogPoller.Healthy()) })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.RegisterFilter(testutils.Context(t), logpoller.Filter{ Name: "Test Emitter", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, Addresses: []common.Address{th.EmitterAddress1}, })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.PollAndSaveLogs(testutils.Context(t), 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.BlockByNumber(testutils.Context(t), big.NewInt(1))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(2)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(2)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(int64(i))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.PollAndSaveLogs(testutils.Context(t), firstPoll)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.PollAndSaveLogs(testutils.Context(t), 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Run(tt.name, func(t *testing.T) { lpOpts := logpoller.Opts{ UseFinalityTag: tt.finalityTag, FinalityDepth: tt.finalityDepth, BackfillBatchSize: 3, RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } th := SetupTH(t, lpOpts) // Set up a log poller listening for log emitter logs. err := th.LogPoller.RegisterFilter(testutils.Context(t), logpoller.Filter{ Name: "Test Emitter", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, Addresses: []common.Address{th.EmitterAddress1}, }) require.NoError(t, err) // Test scenario: one log 2 block chain. // Chain gen <- 1 <- 2 (L1_1) // DB: 1 _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)}) require.NoError(t, err) th.Client.Commit() markBlockAsFinalized(t, th, 1) // Polling should get us the L1 log. newStart := th.PollAndSaveLogs(testutils.Context(t), 1) assert.NoError(t, th.LogPoller.Healthy()) assert.Equal(t, int64(3), newStart) // Check that L1_1 has a proper data payload lgs, err := th.ORM.SelectLogsByBlockRange(testutils.Context(t), 2, 2) require.NoError(t, err) require.NotZero(t, len(lgs)) assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000001`), lgs[0].Data) // Single block reorg and log poller not working for a while, mine blocks and progress with finalization // Chain gen <- 1 <- 2 (L1_1) // \ 2'(L1_2) <- 3 <- 4 <- 5 <- 6 (finalized on chain) <- 7 <- 8 <- 9 <- 10 lca, err := th.Client.BlockByNumber(testutils.Context(t), big.NewInt(1)) require.NoError(t, err) require.NoError(t, th.Client.Fork(testutils.Context(t), lca.Hash())) // Create 2' _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(2)}) require.NoError(t, err) th.Client.Commit() // Create 3-10 for i := 3; i < 10; i++ { _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err) th.Client.Commit() } markBlockAsFinalized(t, th, 6) newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(10), newStart) assert.NoError(t, th.LogPoller.Healthy()) // Expect L1_2 to be properly updated lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 2, 2) require.NoError(t, err) require.NotZero(t, len(lgs)) assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000002`), lgs[0].Data) th.assertHaveCanonical(t, 1, 1) th.assertDontHave(t, 2, 3) // These blocks are backfilled th.assertHaveCanonical(t, 5, 10) })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.RegisterFilter(testutils.Context(t), logpoller.Filter{ Name: "Test Emitter", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, Addresses: []common.Address{th.EmitterAddress1}, })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.PollAndSaveLogs(testutils.Context(t), 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.ORM.SelectLogsByBlockRange(testutils.Context(t), 2, 2)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.BlockByNumber(testutils.Context(t), big.NewInt(1))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(2)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(2)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(int64(i))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.PollAndSaveLogs(testutils.Context(t), newStart)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.ORM.SelectLogsByBlockRange(testutils.Context(t), 2, 2)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.assertHaveCanonical(t, 1, 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.assertDontHave(t, 2, 3)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.assertHaveCanonical(t, 5, 10)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.RegisterFilter(testutils.Context(t), filter1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.RegisterFilter(testutils.Context(t), filter2)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.RegisterFilter(testutils.Context(t), filter3)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.ORM.LoadFilters(testutils.Context(t))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Run("HasFilter", func(t *testing.T) { assert.True(t, th.LogPoller.HasFilter("first Filter")) assert.True(t, th.LogPoller.HasFilter("second Filter")) assert.True(t, th.LogPoller.HasFilter("third Filter")) assert.False(t, th.LogPoller.HasFilter("fourth Filter")) })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.GetFilters()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(2)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(2)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.RegisterFilter(testutils.Context(t), logpoller.Filter{ Name: "GetBlocks Test", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID, EmitterABI.Events["Log2"].ID}, Addresses: []common.Address{th.EmitterAddress1, th.EmitterAddress2}, })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.GetBlocksRange(testutils.Context(t), blockNums)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.GetBlocksRange(testutils.Context(t), blockNums)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.GetBlocksRange(testutils.Context(t), blockNums)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.ORM.SelectBlockByNumber(testutils.Context(t), 2)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.GetBlocksRange(testutils.Context(t), blockNums)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.ORM.SelectBlockByNumber(testutils.Context(t), 3)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.GetBlocksRange(testutils.Context(t), blockNums2)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.PollAndSaveLogs(testutils.Context(t), 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.ORM.SelectBlockByNumber(testutils.Context(t), 3)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.GetBlocksRange(testutils.Context(t), blockNums)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.GetBlocksRange(testutils.Context(t), blockNums)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.GetBlocksRange(testutils.Context(t), blockNums)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.GetBlocksRange(ctx, blockNums)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.GetBlocksRange(ctx, blockNums)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.GetReplayFromBlock(testutils.Context(t), requested)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.PollAndSaveLogs(testutils.Context(t), 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.GetReplayFromBlock(testutils.Context(t), requested)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.LatestBlock(testutils.Context(t))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.GetReplayFromBlock(testutils.Context(t), requested)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.TestObserved(t, zapcore.WarnLevel)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewRandomEVMChainID()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewRandomEVMChainID()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewORM(chainID1, db, lggr)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.MustNewSimTransactor(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewMemoryDatabase()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewSimulatedBackendWithDatabase(ethDB, map[common.Address]core.GenesisAccount{ owner.From: { Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), }, }, 10e6)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(0)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Mul(big.NewInt(10), big.NewInt(1e18))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(10)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(1e18)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.DeployLogEmitter(owner, ec)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.EmitLog1(owner, []*big.Int{big.NewInt(9)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(9)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.EmitLog1(owner, []*big.Int{big.NewInt(7)})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(7)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewLogPoller(o, client.NewSimulatedBackendClient(t, ec, chainID2), lggr, lpOpts)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewSimulatedBackendClient(t, ec, chainID2)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Replay(ctx, 5)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Replay(ctx, 2)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Sleep(100 * time.Millisecond)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.AssertEventually(t, func() bool { return observedLogs.Len() >= 1 })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Len()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.All()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.TestObserved(t, zapcore.DebugLevel)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewRandomEVMChainID()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewORM(chainID, db, lggr)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewLogPoller(o, ec, lggr, lpOpts)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.On("HeadByNumber", mock.Anything, mock.Anything)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Return(func(ctx context.Context, blockNumber *big.Int) (*evmtypes.Head, error) { if blockNumber == nil { return &evmtypes.Head{Number: 300}, nil // Simulate currentBlock = 300 } return &evmtypes.Head{Number: blockNumber.Int64()}, nil })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Int64()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.On("FilterLogs", mock.Anything, mock.Anything)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Return(func(ctx context.Context, fq ethereum.FilterQuery) (logs []types.Log, err error) { if fq.BlockHash != nil { return []types.Log{}, nil // succeed when single block requested } from := fq.FromBlock.Uint64() to := fq.ToBlock.Uint64() if to-from >= 4 { return []types.Log{}, &clientErr // return "too many results" error if block range spans 4 or more blocks } return logs, err })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.FromBlock.Uint64()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.ToBlock.Uint64()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewAddress()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.RegisterFilter(ctx, logpoller.Filter{ Name: "Integration test", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, Addresses: []common.Address{addr}, })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.PollAndSaveLogs(ctx, 5)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.SelectLatestBlock(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.FilterLevelExact(zapcore.WarnLevel)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.FilterMessageSnippet("halving block range batch size")` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.FilterFieldKey("newBatchSize")` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.All()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.TakeAll()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Unset()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Unset()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.On("HeadByNumber", mock.Anything, mock.Anything)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Return(func(ctx context.Context, blockNumber *big.Int) (*evmtypes.Head, error) { if blockNumber == nil { return &evmtypes.Head{Number: 500}, nil // Simulate currentBlock = 300 } return &evmtypes.Head{Number: blockNumber.Int64()}, nil })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Int64()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.On("FilterLogs", mock.Anything, mock.Anything)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Return(func(ctx context.Context, fq ethereum.FilterQuery) (logs []types.Log, err error) { if fq.BlockHash != nil { return []types.Log{}, nil // succeed when single block requested } return []types.Log{}, &clientErr // return "too many results" error if block range spans 4 or more blocks })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.PollAndSaveLogs(ctx, 298)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.SelectLatestBlock(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.FilterMessageSnippet("halving block range")` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.FilterLevelExact(zapcore.WarnLevel)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.All()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.FilterMessageSnippet("failed to retrieve logs")` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.FilterLevelExact(zapcore.DPanicLevel)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.All()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.RegisterFilter(ctx, logpoller.Filter{ Name: "GetBlocks Test", EventSigs: []common.Hash{eventSig}, Addresses: []common.Address{th.EmitterAddress1}}, )` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(int64(i))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Blockchain()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.CurrentHeader()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Blockchain()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.SetFinalized(h)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(int64(i))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.PollAndSaveLogs(ctx, 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.LogsDataWordGreaterThan( ctx, eventSig, th.EmitterAddress1, 0, common.Hash{}, evmtypes.Finalized, )` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.LogsDataWordGreaterThan( ctx, eventSig, th.EmitterAddress1, 0, common.Hash{}, evmtypes.Confirmations(numberOfConfirmations), )` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Confirmations(numberOfConfirmations)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Run(tt.name, func(t *testing.T) { lpOpts := logpoller.Opts{ UseFinalityTag: tt.useFinalityTag, FinalityDepth: tt.finalityDepth, BackfillBatchSize: 3, RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } th := SetupTH(t, lpOpts) // Should return error before the first poll and save _, err := th.LogPoller.LatestBlock(ctx) require.Error(t, err) // Mark first block as finalized h := th.Client.Blockchain().CurrentHeader() th.Client.Blockchain().SetFinalized(h) // Create a couple of blocks for i := 0; i < numberOfBlocks-1; i++ { th.Client.Commit() } th.PollAndSaveLogs(ctx, 1) latestBlock, err := th.LogPoller.LatestBlock(ctx) require.NoError(t, err) require.Equal(t, int64(numberOfBlocks), latestBlock.BlockNumber) require.Equal(t, tt.expectedFinalizedBlock, latestBlock.FinalizedBlockNumber) })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.LatestBlock(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Blockchain()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.CurrentHeader()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Blockchain()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.SetFinalized(h)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.PollAndSaveLogs(ctx, 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.LatestBlock(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Run(tt.name, func(t *testing.T) { lpOpts := logpoller.Opts{ UseFinalityTag: tt.finalityTag, FinalityDepth: tt.finalityDepth, BackfillBatchSize: 3, RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, BackupPollerBlockDelay: 100, } th := SetupTH(t, lpOpts) header, err := th.Client.HeaderByNumber(ctx, nil) require.NoError(t, err) genesisBlockTime := time.UnixMilli(int64(header.Time)) // Emit some logs in blocks for i := 0; i < emittedLogs; i++ { _, err2 := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err2) th.Client.Commit() } // First PollAndSave, no filters are registered currentBlock := th.PollAndSaveLogs(ctx, 1) err = th.LogPoller.RegisterFilter(ctx, logpoller.Filter{ Name: "Test Emitter", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, Addresses: []common.Address{th.EmitterAddress1}, }) require.NoError(t, err) // Emit blocks to cover finality depth, because backup always backfill up to the one block before last finalized for i := 0; i < int(tt.finalityDepth)+1; i++ { bh := th.Client.Commit() markBlockAsFinalizedByHash(t, th, bh) } // LogPoller should backfill entire history th.LogPoller.BackupPollAndSaveLogs(ctx) require.NoError(t, err) // Make sure that all logs are backfilled logs, err := th.LogPoller.Logs( ctx, 0, currentBlock, EmitterABI.Events["Log1"].ID, th.EmitterAddress1, ) require.NoError(t, err) require.Len(t, logs, emittedLogs) // We should get all the logs by the block_timestamp logs, err = th.LogPoller.LogsCreatedAfter( ctx, EmitterABI.Events["Log1"].ID, th.EmitterAddress1, genesisBlockTime, 0, ) require.NoError(t, err) require.Len(t, logs, emittedLogs) })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.HeaderByNumber(ctx, nil)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.UnixMilli(int64(header.Time))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(int64(i))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.PollAndSaveLogs(ctx, 1)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.RegisterFilter(ctx, logpoller.Filter{ Name: "Test Emitter", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, Addresses: []common.Address{th.EmitterAddress1}, })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Client.Commit()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.BackupPollAndSaveLogs(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.Logs( ctx, 0, currentBlock, EmitterABI.Events["Log1"].ID, th.EmitterAddress1, )` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.LogsCreatedAfter( ctx, EmitterABI.Events["Log1"].ID, th.EmitterAddress1, genesisBlockTime, 0, )` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Run(tt.name, func(t *testing.T) { lpOpts := logpoller.Opts{ UseFinalityTag: true, BackfillBatchSize: 3, RpcBatchSize: 2, KeepFinalizedBlocksDepth: tt.keepFinalizedBlocksDepth, } th := SetupTH(t, lpOpts) for i := 1; i <= tt.blockToCreate; i++ { err := th.ORM.InsertBlock(ctx, utils.RandomBytes32(), int64(i+10), time.Now(), int64(i)) require.NoError(t, err) } if tt.wantErr { _, err := th.LogPoller.PruneOldBlocks(ctx) require.Error(t, err) return } allDeleted, err := th.LogPoller.PruneOldBlocks(ctx) require.NoError(t, err) assert.True(t, allDeleted) blocks, err := th.ORM.GetBlocksRange(ctx, 0, math.MaxInt64) require.NoError(t, err) assert.Len(t, blocks, tt.blocksLeft) })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.ORM.InsertBlock(ctx, utils.RandomBytes32(), int64(i+10), time.Now(), int64(i))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.RandomBytes32()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Now()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.PruneOldBlocks(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.LogPoller.PruneOldBlocks(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.ORM.GetBlocksRange(ctx, 0, math.MaxInt64)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Test(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewRandomEVMChainID()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewORM(chainID, db, lggr)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewLogPoller(orm, ec, lggr, lpOpts)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Run("Fails, if failed to select oldest block", func(t *testing.T) { _, err := lp.FindLCA(ctx) require.ErrorContains(t, err, "failed to select the latest block") })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.FindLCA(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.HexToHash("0x124")` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Run("Fails, if caller's context canceled", func(t *testing.T) { lCtx, cancel := context.WithCancel(ctx) ec.On("HeadByHash", mock.Anything, latestBlockHash).Return(nil, nil).Run(func(_ mock.Arguments) { cancel() }).Once() _, err := lp.FindLCA(lCtx) require.ErrorContains(t, err, "aborted, FindLCA request cancelled") })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.WithCancel(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.On("HeadByHash", mock.Anything, latestBlockHash)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Return(nil, nil)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Run(func(_ mock.Arguments) { cancel() })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Once()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.FindLCA(lCtx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Run("Fails, if RPC returns an error", func(t *testing.T) { expectedError := fmt.Errorf("failed to call RPC") ec.On("HeadByHash", mock.Anything, latestBlockHash).Return(nil, expectedError).Once() _, err := lp.FindLCA(ctx) require.ErrorContains(t, err, expectedError.Error()) })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.On("HeadByHash", mock.Anything, latestBlockHash)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Return(nil, expectedError)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Once()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.FindLCA(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Run("Fails, if block numbers do not match", func(t *testing.T) { ec.On("HeadByHash", mock.Anything, latestBlockHash).Return(&evmtypes.Head{ Number: 123, }, nil).Once() _, err := lp.FindLCA(ctx) require.ErrorContains(t, err, "expected block numbers to match") })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.On("HeadByHash", mock.Anything, latestBlockHash)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Return(&evmtypes.Head{ Number: 123, }, nil)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Once()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.FindLCA(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Run("Fails, if none of the blocks in db matches on chain", func(t *testing.T) { ec.On("HeadByHash", mock.Anything, mock.Anything).Return(nil, nil).Times(3) _, err := lp.FindLCA(ctx) require.ErrorContains(t, err, "failed to find LCA, this means that whole database LogPoller state was reorged out of chain or RPC/Core node is misconfigured") })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.On("HeadByHash", mock.Anything, mock.Anything)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Return(nil, nil)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Times(3)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.FindLCA(ctx)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Run(tc.Name, func(t *testing.T) { // reset the database require.NoError(t, orm.DeleteLogsAndBlocksAfter(ctx, 0)) for _, b := range tc.Blocks { blockHashI++ hash := common.BigToHash(big.NewInt(blockHashI)) require.NoError(t, orm.InsertBlock(ctx, hash, int64(b.BN), time.Now(), 0)) // Hashes are unique for all test cases var onChainBlock *evmtypes.Head if b.Exists { onChainBlock = &evmtypes.Head{Number: int64(b.BN)} } ec.On("HeadByHash", mock.Anything, hash).Return(onChainBlock, nil).Maybe() } result, err := lp.FindLCA(ctx) if tc.ExpectedError != nil { require.ErrorContains(t, err, tc.ExpectedError.Error()) } else { require.NotNil(t, result) require.Equal(t, result.BlockNumber, int64(tc.ExpectedBlockNumber), "expected block numbers to match") } })` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.BigToHash(big.NewInt(blockHashI))` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.NewInt(blockHashI)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.On("HeadByHash", mock.Anything, hash)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Return(onChainBlock, nil)` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.Maybe()` $DIR/core/chains/evm/logpoller/log_poller_test.go: `.FindLCA(ctx)` $DIR/core/chains/evm/logpoller/observability_test.go: `t.Cleanup(func() { resetMetrics(*orm) })` $DIR/core/chains/evm/logpoller/observability_test.go: `resetMetrics(*orm)` $DIR/core/chains/evm/logpoller/observability_test.go: `_, _ = orm.SelectIndexedLogs(ctx, common.Address{}, common.Hash{}, 1, []common.Hash{}, 1)` $DIR/core/chains/evm/logpoller/observability_test.go: `_, _ = orm.SelectIndexedLogsByBlockRange(ctx, 0, 1, common.Address{}, common.Hash{}, 1, []common.Hash{})` $DIR/core/chains/evm/logpoller/observability_test.go: `_, _ = orm.SelectIndexedLogsTopicGreaterThan(ctx, common.Address{}, common.Hash{}, 1, common.Hash{}, 1)` $DIR/core/chains/evm/logpoller/observability_test.go: `_, _ = orm.SelectIndexedLogsTopicRange(ctx, common.Address{}, common.Hash{}, 1, common.Hash{}, common.Hash{}, 1)` $DIR/core/chains/evm/logpoller/observability_test.go: `_, _ = orm.SelectIndexedLogsWithSigsExcluding(ctx, common.Hash{}, common.Hash{}, 1, common.Address{}, 0, 1, 1)` $DIR/core/chains/evm/logpoller/observability_test.go: `_, _ = orm.SelectLogsDataWordRange(ctx, common.Address{}, common.Hash{}, 0, common.Hash{}, common.Hash{}, 1)` $DIR/core/chains/evm/logpoller/observability_test.go: `_, _ = orm.SelectLogsDataWordGreaterThan(ctx, common.Address{}, common.Hash{}, 0, common.Hash{}, 1)` $DIR/core/chains/evm/logpoller/observability_test.go: `_, _ = orm.SelectLogsCreatedAfter(ctx, common.Address{}, common.Hash{}, time.Now(), 0)` $DIR/core/chains/evm/logpoller/observability_test.go: `_, _ = orm.SelectLatestLogByEventSigWithConfs(ctx, common.Hash{}, common.Address{}, 0)` $DIR/core/chains/evm/logpoller/observability_test.go: `_, _ = orm.SelectLatestLogEventSigsAddrsWithConfs(ctx, 0, []common.Address{{}}, []common.Hash{{}}, 1)` $DIR/core/chains/evm/logpoller/observability_test.go: `_, _ = orm.SelectIndexedLogsCreatedAfter(ctx, common.Address{}, common.Hash{}, 1, []common.Hash{}, time.Now(), 0)` $DIR/core/chains/evm/logpoller/observability_test.go: `_ = orm.InsertLogs(ctx, []Log{})` $DIR/core/chains/evm/logpoller/observability_test.go: `_ = orm.InsertLogsWithBlock(ctx, []Log{}, NewLogPollerBlock(common.Hash{}, 1, time.Now(), 0))` $DIR/core/chains/evm/logpoller/observability_test.go: `t.Cleanup(func() { resetMetrics(*orm) })` $DIR/core/chains/evm/logpoller/observability_test.go: `resetMetrics(*orm)` $DIR/core/chains/evm/logpoller/observability_test.go: `t.Cleanup(func() { resetMetrics(*orm) })` $DIR/core/chains/evm/logpoller/observability_test.go: `resetMetrics(*orm)` $DIR/core/chains/evm/logpoller/observability_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/observability_test.go: `.Cleanup(func() { resetMetrics(*orm) })` $DIR/core/chains/evm/logpoller/observability_test.go: `.SelectIndexedLogs(ctx, common.Address{}, common.Hash{}, 1, []common.Hash{}, 1)` $DIR/core/chains/evm/logpoller/observability_test.go: `.SelectIndexedLogsByBlockRange(ctx, 0, 1, common.Address{}, common.Hash{}, 1, []common.Hash{})` $DIR/core/chains/evm/logpoller/observability_test.go: `.SelectIndexedLogsTopicGreaterThan(ctx, common.Address{}, common.Hash{}, 1, common.Hash{}, 1)` $DIR/core/chains/evm/logpoller/observability_test.go: `.SelectIndexedLogsTopicRange(ctx, common.Address{}, common.Hash{}, 1, common.Hash{}, common.Hash{}, 1)` $DIR/core/chains/evm/logpoller/observability_test.go: `.SelectIndexedLogsWithSigsExcluding(ctx, common.Hash{}, common.Hash{}, 1, common.Address{}, 0, 1, 1)` $DIR/core/chains/evm/logpoller/observability_test.go: `.SelectLogsDataWordRange(ctx, common.Address{}, common.Hash{}, 0, common.Hash{}, common.Hash{}, 1)` $DIR/core/chains/evm/logpoller/observability_test.go: `.SelectLogsDataWordGreaterThan(ctx, common.Address{}, common.Hash{}, 0, common.Hash{}, 1)` $DIR/core/chains/evm/logpoller/observability_test.go: `.SelectLogsCreatedAfter(ctx, common.Address{}, common.Hash{}, time.Now(), 0)` $DIR/core/chains/evm/logpoller/observability_test.go: `.Now()` $DIR/core/chains/evm/logpoller/observability_test.go: `.SelectLatestLogByEventSigWithConfs(ctx, common.Hash{}, common.Address{}, 0)` $DIR/core/chains/evm/logpoller/observability_test.go: `.SelectLatestLogEventSigsAddrsWithConfs(ctx, 0, []common.Address{{}}, []common.Hash{{}}, 1)` $DIR/core/chains/evm/logpoller/observability_test.go: `.SelectIndexedLogsCreatedAfter(ctx, common.Address{}, common.Hash{}, 1, []common.Hash{}, time.Now(), 0)` $DIR/core/chains/evm/logpoller/observability_test.go: `.Now()` $DIR/core/chains/evm/logpoller/observability_test.go: `.InsertLogs(ctx, []Log{})` $DIR/core/chains/evm/logpoller/observability_test.go: `.InsertLogsWithBlock(ctx, []Log{}, NewLogPollerBlock(common.Hash{}, 1, time.Now(), 0))` $DIR/core/chains/evm/logpoller/observability_test.go: `.Now()` $DIR/core/chains/evm/logpoller/observability_test.go: `.CollectAndCount(orm.datasetSize)` $DIR/core/chains/evm/logpoller/observability_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/observability_test.go: `.Cleanup(func() { resetMetrics(*orm) })` $DIR/core/chains/evm/logpoller/observability_test.go: `.SelectLatestLogByEventSigWithConfs(ctx, common.Hash{}, common.Address{}, 0)` $DIR/core/chains/evm/logpoller/observability_test.go: `.Cleanup(func() { resetMetrics(*orm) })` $DIR/core/chains/evm/logpoller/observability_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/observability_test.go: `.ToFloat64(orm.blocksInserted.WithLabelValues("420"))` $DIR/core/chains/evm/logpoller/observability_test.go: `.blocksInserted.WithLabelValues("420")` $DIR/core/chains/evm/logpoller/orm_test.go: `logs = append(logs, GenLog(th.ChainID, int64(i+1), 1, "0x3", EmitterABI.Events["Log1"].ID.Bytes(), th.EmitterAddress1))` $DIR/core/chains/evm/logpoller/orm_test.go: `blockNumbers = append(blockNumbers, b.number)` $DIR/core/chains/evm/logpoller/orm_test.go: `recentBlocks = append(recentBlocks, block{number: int64(i), hash: common.HexToHash(fmt.Sprintf("0x%d", i))})` $DIR/core/chains/evm/logpoller/orm_test.go: `blockNumbers = append(blockNumbers, b.number)` $DIR/core/chains/evm/logpoller/orm_test.go: `latest, err = o2.SelectLatestBlock(ctx)` $DIR/core/chains/evm/logpoller/orm_test.go: `_, err = o1.SelectBlockByHash(ctx, common.HexToHash("0x1234"))` $DIR/core/chains/evm/logpoller/orm_test.go: `_, err = o2.SelectBlockByHash(ctx, common.HexToHash("0x1234"))` $DIR/core/chains/evm/logpoller/orm_test.go: `_, err = o2.SelectBlockByHash(ctx, common.HexToHash("0x1235"))` $DIR/core/chains/evm/logpoller/orm_test.go: `logs, err = o1.SelectLogsByBlockRange(ctx, 10, 10)` $DIR/core/chains/evm/logpoller/orm_test.go: `logs, err = o1.SelectLogs(ctx, 1, 1, common.HexToAddress("0x1234"), topic)` $DIR/core/chains/evm/logpoller/orm_test.go: `logs, err = o1.SelectLogs(ctx, 10, 10, common.HexToAddress("0x1234"), topic)` $DIR/core/chains/evm/logpoller/orm_test.go: `_, err = o1.SelectLatestLogByEventSigWithConfs(ctx, topic, common.HexToAddress("0x1234"), 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `_, err = o1.SelectLatestLogByEventSigWithConfs(ctx, topic, common.HexToAddress("0x1234"), 1)` $DIR/core/chains/evm/logpoller/orm_test.go: `_, err = o1.SelectLatestLogByEventSigWithConfs(ctx, topic, common.HexToAddress("0x1234"), 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `_, err = o1.SelectLatestLogByEventSigWithConfs(ctx, topic, common.HexToAddress("0x1234"), 1)` $DIR/core/chains/evm/logpoller/orm_test.go: `_, err = o1.SelectLatestLogByEventSigWithConfs(ctx, topic, common.HexToAddress("0x1234"), 2)` $DIR/core/chains/evm/logpoller/orm_test.go: `_, err = o1.SelectLatestLogByEventSigWithConfs(ctx, topic, common.HexToAddress("0x1234"), 3)` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.SelectLatestLogEventSigsAddrsWithConfs(ctx, 0 /* startBlock */, []common.Address{common.HexToAddress("0x1234"), common.HexToAddress("0x1235")}, []common.Hash{topic}, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.SelectLatestLogEventSigsAddrsWithConfs(ctx, 0 /* startBlock */, []common.Address{common.HexToAddress("0x1234")}, []common.Hash{topic, topic2}, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.SelectLatestLogEventSigsAddrsWithConfs(ctx, 0 /* startBlock */, []common.Address{common.HexToAddress("0x1234"), common.HexToAddress("0x1235")}, []common.Hash{topic, topic2}, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.SelectLatestLogEventSigsAddrsWithConfs(ctx, 0 /* startBlock */, []common.Address{common.HexToAddress("0x1234"), common.HexToAddress("0x1235")}, []common.Hash{topic, topic2}, 1)` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.SelectLatestLogEventSigsAddrsWithConfs(ctx, 0 /* startBlock */, []common.Address{common.HexToAddress("0x1234"), common.HexToAddress("0x1235")}, []common.Hash{topic, topic2}, 2)` $DIR/core/chains/evm/logpoller/orm_test.go: `latest, err = o1.SelectLatestBlock(ctx)` $DIR/core/chains/evm/logpoller/orm_test.go: `logs, err = o1.SelectLogsByBlockRange(ctx, 1, latest.BlockNumber)` $DIR/core/chains/evm/logpoller/orm_test.go: `time.Sleep(2 * time.Millisecond)` $DIR/core/chains/evm/logpoller/orm_test.go: `logs, err = o1.SelectLogsByBlockRange(ctx, 1, latest.BlockNumber)` $DIR/core/chains/evm/logpoller/orm_test.go: `err = o1.DeleteLogsAndBlocksAfter(ctx, 1)` $DIR/core/chains/evm/logpoller/orm_test.go: `logs, err = o1.SelectLogsByBlockRange(ctx, 1, latest.BlockNumber)` $DIR/core/chains/evm/logpoller/orm_test.go: `t.Run("Save filter: "+filter.Name, func(t *testing.T) { var count int err := orm.InsertFilter(ctx, filter) require.NoError(t, err) err = dbx.Get(&count, `SELECT COUNT(*) FROM evm.log_poller_filters WHERE evm_chain_id = $1 AND name = $2`, ubig.New(chainID), filter.Name) require.NoError(t, err) expectedCount := len(filter.Addresses) * len(filter.EventSigs) if len(filter.Topic2) > 0 { expectedCount *= len(filter.Topic2) } if len(filter.Topic3) > 0 { expectedCount *= len(filter.Topic3) } if len(filter.Topic4) > 0 { expectedCount *= len(filter.Topic4) } assert.Equal(t, count, expectedCount) })` $DIR/core/chains/evm/logpoller/orm_test.go: `err = dbx.Get(&count, `SELECT COUNT(*) FROM evm.log_poller_filters WHERE evm_chain_id = $1 AND name = $2`, ubig.New(chainID), filter.Name)` $DIR/core/chains/evm/logpoller/orm_test.go: `expectedCount *= len(filter.Topic2)` $DIR/core/chains/evm/logpoller/orm_test.go: `expectedCount *= len(filter.Topic3)` $DIR/core/chains/evm/logpoller/orm_test.go: `expectedCount *= len(filter.Topic4)` $DIR/core/chains/evm/logpoller/orm_test.go: `insertLogsTopicValueRange(t, th.ChainID, o1, addr, 1, eventSig, 1, 3)` $DIR/core/chains/evm/logpoller/orm_test.go: `insertLogsTopicValueRange(t, th.ChainID, o1, addr, 2, eventSig, 4, 4)` $DIR/core/chains/evm/logpoller/orm_test.go: `topicFilters.Expressions[idx] = logpoller.NewEventByTopicFilter(topicIdx, []primitives.ValueComparator{ {Value: logpoller.EvmWord(value).Hex(), Operator: primitives.Eq}, })` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.FilteredLogs(ctx, standardFilter(1, []uint64{1}), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.SelectIndexedLogs(ctx, addr, eventSig, 1, []common.Hash{logpoller.EvmWord(1), logpoller.EvmWord(2)}, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.FilteredLogs(ctx, standardFilter(1, []uint64{1, 2}), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.SelectIndexedLogsByBlockRange(ctx, 1, 1, addr, eventSig, 1, []common.Hash{logpoller.EvmWord(1)})` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.FilteredLogs(ctx, blockRangeFilter(1, 1, 1, []uint64{1}), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.SelectIndexedLogsByBlockRange(ctx, 1, 2, addr, eventSig, 1, []common.Hash{logpoller.EvmWord(2)})` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.FilteredLogs(ctx, blockRangeFilter(1, 2, 1, []uint64{2}), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.SelectIndexedLogsByBlockRange(ctx, 1, 2, addr, eventSig, 1, []common.Hash{logpoller.EvmWord(1)})` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.FilteredLogs(ctx, blockRangeFilter(1, 2, 1, []uint64{1}), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `_, err = o1.SelectIndexedLogsByBlockRange(ctx, 1, 2, addr, eventSig, 0, []common.Hash{logpoller.EvmWord(1)})` $DIR/core/chains/evm/logpoller/orm_test.go: `_, err = o1.FilteredLogs(ctx, blockRangeFilter(1, 2, 0, []uint64{1}), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `_, err = o1.SelectIndexedLogsByBlockRange(ctx, 1, 2, addr, eventSig, 4, []common.Hash{logpoller.EvmWord(1)})` $DIR/core/chains/evm/logpoller/orm_test.go: `_, err = o1.FilteredLogs(ctx, blockRangeFilter(1, 2, 4, []uint64{1}), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.SelectIndexedLogsTopicGreaterThan(ctx, addr, eventSig, 1, logpoller.EvmWord(2), 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.FilteredLogs(ctx, filter, limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.SelectIndexedLogsTopicRange(ctx, addr, eventSig, 1, logpoller.EvmWord(3), logpoller.EvmWord(3), 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.FilteredLogs(ctx, rangeFilter(1, 3, 3), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.SelectIndexedLogsTopicRange(ctx, addr, eventSig, 1, logpoller.EvmWord(1), logpoller.EvmWord(3), 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.FilteredLogs(ctx, rangeFilter(1, 1, 3), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.SelectIndexedLogsTopicRange(ctx, addr, eventSig, 1, logpoller.EvmWord(4), logpoller.EvmWord(4), 1)` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.SelectIndexedLogsTopicRange(ctx, addr, eventSig, 1, logpoller.EvmWord(4), logpoller.EvmWord(4), 1)` $DIR/core/chains/evm/logpoller/orm_test.go: `retrievedLogs, err = o1.FilteredLogs(ctx, filter, limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.FilteredLogs(ctx, wordFilter(0, 2, 2), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.SelectLogsDataWordRange(ctx, addr, eventSig, 0, logpoller.EvmWord(1), logpoller.EvmWord(2), 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.FilteredLogs(ctx, wordFilter(0, 1, 2), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.SelectLogsDataWordRange(ctx, addr, eventSig, 0, logpoller.EvmWord(1), logpoller.EvmWord(1), 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.FilteredLogs(ctx, wordFilter(0, 1, 1), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.SelectLogsDataWordRange(ctx, addr, eventSig, 1, logpoller.EvmWord(3), logpoller.EvmWord(3), 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.FilteredLogs(ctx, wordFilter(1, 3, 3), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.SelectLogsDataWordRange(ctx, addr, eventSig, 1, logpoller.EvmWord(3), logpoller.EvmWord(3), 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.FilteredLogs(ctx, wordFilter(1, 3, 3), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.SelectLogsDataWordGreaterThan(ctx, addr, eventSig, 0, logpoller.EvmWord(1), 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = o1.FilteredLogs(ctx, filter, limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `exp[idx] = logpoller.NewEventSigFilter(val)` $DIR/core/chains/evm/logpoller/orm_test.go: `filters = append(filters, query.Expression{ BoolExpression: query.BoolExpression{ Expressions: exp, BoolOperator: query.OR, }, })` $DIR/core/chains/evm/logpoller/orm_test.go: `filters = append(filters, query.Expression{ BoolExpression: query.BoolExpression{ Expressions: []query.Expression{ query.Block(uint64(startBlock), primitives.Gte), query.Block(uint64(endBlock), primitives.Lte), }, BoolOperator: query.AND, }, })` $DIR/core/chains/evm/logpoller/orm_test.go: `assertion(t, logs, err, startBlock, endBlock)` $DIR/core/chains/evm/logpoller/orm_test.go: `logs, err = th.ORM.FilteredLogs(ctx, filter([]common.Hash{topic, topic2}, startBlock, endBlock), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `_, err = o1.SelectBlockByNumber(ctx, 1)` $DIR/core/chains/evm/logpoller/orm_test.go: `deleted, err = o1.DeleteBlocksBefore(ctx, 3, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `_, err = o1.SelectBlockByNumber(ctx, 2)` $DIR/core/chains/evm/logpoller/orm_test.go: `_, err = o1.SelectBlockByNumber(ctx, 3)` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = th.ORM.SelectLogs(ctx, 1, 3, address1, event1)` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = th.ORM.FilteredLogs(ctx, logFilter(1, 3, address1), query.LimitAndSort{ SortBy: []query.SortBy{query.NewSortBySequence(query.Asc)}, }, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = th.ORM.SelectLogs(ctx, 2, 2, address2, event1)` $DIR/core/chains/evm/logpoller/orm_test.go: `lgs, err = th.ORM.FilteredLogs(ctx, logFilter(2, 2, address2), query.LimitAndSort{ SortBy: []query.SortBy{query.NewSortBySequence(query.Asc)}, }, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `logs, err = orm.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 1, addressB, 0, 3, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `logs, err = orm.SelectIndexedLogsWithSigsExcluding(ctx, requestSigA, responseSigA, 1, addressA, 0, 3, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `logs, err = orm.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 1, addressB, 0, 3, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `logs, err = orm.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 3, addressC, 0, 4, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `logs, err = orm.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 3, addressC, 0, 4, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `logs, err = orm.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 3, addressC, 0, 4, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `logs, err = orm.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 3, addressC, 0, 4, 3)` $DIR/core/chains/evm/logpoller/orm_test.go: `logs, err = orm.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 3, addressC, 0, 10, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `logs, err = orm.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 3, addressC, 0, 10, 3)` $DIR/core/chains/evm/logpoller/orm_test.go: `logs, err = orm.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 3, addressC, 0, 10, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `logs, err = orm.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 1, addressB, 0, 3, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `logs, err = orm.SelectIndexedLogsWithSigsExcluding(ctx, requestSigA, responseSigA, 1, addressA, 0, 1, 10)` $DIR/core/chains/evm/logpoller/orm_test.go: `logs, err = orm.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 1, addressB, 2, 13, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `t.Run(tt.name, func(t *testing.T) { blockNumber, err := th.ORM.SelectLatestBlockByEventSigsAddrsWithConfs(ctx, tt.fromBlock, tt.events, tt.addrs, tt.confs) require.NoError(t, err) assert.Equal(t, tt.expectedBlockNumber, blockNumber) })` $DIR/core/chains/evm/logpoller/orm_test.go: `exp[idx] = logpoller.NewEventByTopicFilter(uint64(topicIdx), []primitives.ValueComparator{ {Value: val.String(), Operator: primitives.Eq}, })` $DIR/core/chains/evm/logpoller/orm_test.go: `filters = append(filters, query.Expression{ BoolExpression: query.BoolExpression{ Expressions: exp, BoolOperator: query.OR, }, })` $DIR/core/chains/evm/logpoller/orm_test.go: `filters = append(filters, []query.Expression{ query.Timestamp(uint64(timestamp.Unix()), primitives.Gt), logpoller.NewConfirmationsFilter(confs), }...)` $DIR/core/chains/evm/logpoller/orm_test.go: `t.Run(tt.name, func(t *testing.T) { logs, err := th.ORM.SelectLogsCreatedAfter(ctx, address, event, tt.after, tt.confs) assertion(t, logs, err, tt.expectedLogs) logs, err = th.ORM.FilteredLogs(ctx, filter(tt.after, tt.confs, 0, nil), limiter, "") assertion(t, logs, err, tt.expectedLogs) })` $DIR/core/chains/evm/logpoller/orm_test.go: `assertion(t, logs, err, tt.expectedLogs)` $DIR/core/chains/evm/logpoller/orm_test.go: `logs, err = th.ORM.FilteredLogs(ctx, filter(tt.after, tt.confs, 0, nil), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `assertion(t, logs, err, tt.expectedLogs)` $DIR/core/chains/evm/logpoller/orm_test.go: `t.Run(tt.name, func(t *testing.T) { logs, err := th.ORM.SelectIndexedLogsCreatedAfter(ctx, address, event, 1, []common.Hash{event}, tt.after, tt.confs) assertion(t, logs, err, tt.expectedLogs) logs, err = th.ORM.FilteredLogs(ctx, filter(tt.after, tt.confs, 1, []common.Hash{event}), limiter, "") assertion(t, logs, err, tt.expectedLogs) })` $DIR/core/chains/evm/logpoller/orm_test.go: `assertion(t, logs, err, tt.expectedLogs)` $DIR/core/chains/evm/logpoller/orm_test.go: `logs, err = th.ORM.FilteredLogs(ctx, filter(tt.after, tt.confs, 1, []common.Hash{event}), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `assertion(t, logs, err, tt.expectedLogs)` $DIR/core/chains/evm/logpoller/orm_test.go: `logs, err = th.ORM.SelectIndexedLogs(ctx, address, event, 1, []common.Hash{event}, evmtypes.Unconfirmed)` $DIR/core/chains/evm/logpoller/orm_test.go: `logs, err = th.ORM.SelectIndexedLogs(ctx, address, event, 1, []common.Hash{event}, evmtypes.Confirmations(4))` $DIR/core/chains/evm/logpoller/orm_test.go: `t.Run(tt.name, func(t *testing.T) { // clean all logs and blocks between test cases defer func() { _ = o.DeleteLogsAndBlocksAfter(ctx, 0) }() insertError := o.InsertLogsWithBlock(ctx, tt.logs, tt.block) logs, logsErr := o.SelectLogs(ctx, 0, math.MaxInt, address, event) block, blockErr := o.SelectLatestBlock(ctx) if tt.shouldRollback { assert.Error(t, insertError) assert.NoError(t, logsErr) assert.Len(t, logs, 0) assert.Error(t, blockErr) } else { assert.NoError(t, insertError) assert.NoError(t, logsErr) assert.Len(t, logs, len(tt.logs)) assert.NoError(t, blockErr) assert.Equal(t, block.BlockNumber, tt.block.BlockNumber) } })` $DIR/core/chains/evm/logpoller/orm_test.go: `_ = o.DeleteLogsAndBlocksAfter(ctx, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `logs[i] = GenLog(chainID, int64(i+1), int64(i+1), utils.RandomAddress().String(), event[:], address)` $DIR/core/chains/evm/logpoller/orm_test.go: `t.Run(tt.name, func(t *testing.T) { // clean all logs and blocks between test cases defer func() { _, _ = db.Exec("truncate evm.logs") }() insertErr := o.InsertLogs(ctx, tt.logs) logsFromDb, err := o.SelectLogs(ctx, 0, math.MaxInt, address, event) assert.NoError(t, err) if tt.shouldRollback { assert.Error(t, insertErr) assert.Len(t, logsFromDb, 0) } else { assert.NoError(t, insertErr) assert.Len(t, logsFromDb, len(tt.logs)) } })` $DIR/core/chains/evm/logpoller/orm_test.go: `_, _ = db.Exec("truncate evm.logs")` $DIR/core/chains/evm/logpoller/orm_test.go: `firstLogData = append(firstLogData, logpoller.EvmWord(1).Bytes()...)` $DIR/core/chains/evm/logpoller/orm_test.go: `firstLogData = append(firstLogData, logpoller.EvmWord(10).Bytes()...)` $DIR/core/chains/evm/logpoller/orm_test.go: `secondLogData = append(secondLogData, logpoller.EvmWord(5).Bytes()...)` $DIR/core/chains/evm/logpoller/orm_test.go: `secondLogData = append(secondLogData, logpoller.EvmWord(20).Bytes()...)` $DIR/core/chains/evm/logpoller/orm_test.go: `t.Run(tt.name, func(t *testing.T) { logs, err := th.ORM.SelectLogsDataWordBetween(ctx, address, eventSig, 0, 1, logpoller.EvmWord(tt.wordValue), evmtypes.Unconfirmed) assertion(t, logs, err, tt.expectedLogs) logs, err = th.ORM.FilteredLogs(ctx, wordFilter(tt.wordValue), limiter, "") assertion(t, logs, err, tt.expectedLogs) })` $DIR/core/chains/evm/logpoller/orm_test.go: `assertion(t, logs, err, tt.expectedLogs)` $DIR/core/chains/evm/logpoller/orm_test.go: `logs, err = th.ORM.FilteredLogs(ctx, wordFilter(tt.wordValue), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `assertion(t, logs, err, tt.expectedLogs)` $DIR/core/chains/evm/logpoller/orm_test.go: `t.Run("Selects oldest within given chain", func(t *testing.T) { // insert blocks require.NoError(t, o2.InsertBlock(ctx, common.HexToHash("0x1231"), 11, time.Now(), 0)) require.NoError(t, o2.InsertBlock(ctx, common.HexToHash("0x1232"), 12, time.Now(), 0)) // insert newer block from different chain require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1233"), 13, time.Now(), 0)) require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1231"), 14, time.Now(), 0)) block, err := o1.SelectOldestBlock(ctx, 0) require.NoError(t, err) require.NotNil(t, block) require.Equal(t, block.BlockNumber, int64(13)) require.Equal(t, block.BlockHash, common.HexToHash("0x1233")) })` $DIR/core/chains/evm/logpoller/orm_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/orm_test.go: `.ID.Bytes()` $DIR/core/chains/evm/logpoller/orm_test.go: `.ORM.SelectLogsByBlockRange(ctx, 1, 1)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x111")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x112")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x113")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x114")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x115")` $DIR/core/chains/evm/logpoller/orm_test.go: `.GetBlocksRange(ctx, blockNumbers[0], blockNumbers[len(blockNumbers)-1])` $DIR/core/chains/evm/logpoller/orm_test.go: `.GetBlocksRange(ctx, blockNumbers[0], 15)` $DIR/core/chains/evm/logpoller/orm_test.go: `.GetBlocksRange(ctx, 15, 15)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash(fmt.Sprintf("0x%d", i))` $DIR/core/chains/evm/logpoller/orm_test.go: `.Sprintf("0x%d", i)` $DIR/core/chains/evm/logpoller/orm_test.go: `.GetBlocksRange(ctx, blockNumbers[0], blockNumbers[len(blockNumbers)-1])` $DIR/core/chains/evm/logpoller/orm_test.go: `.GetBlocksRange(ctx, blockNumbers[0], 257)` $DIR/core/chains/evm/logpoller/orm_test.go: `.GetBlocksRange(ctx, 257, 257)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectBlockByHash(ctx, common.HexToHash("0x1234"))` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1234")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectBlockByHash(ctx, common.HexToHash("0x1234"))` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1234")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLatestBlock(ctx)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLatestBlock(ctx)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectBlockByHash(ctx, common.HexToHash("0x1234"))` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1234")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectBlockByHash(ctx, common.HexToHash("0x1234"))` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1234")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectBlockByHash(ctx, common.HexToHash("0x1235"))` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1235")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1599")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1600")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLogsByBlockRange(ctx, 1, 17)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLogsByBlockRange(ctx, 10, 10)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLogs(ctx, 1, 1, common.HexToAddress("0x1234"), topic)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1234")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLogs(ctx, 10, 10, common.HexToAddress("0x1234"), topic)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1234")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLatestLogByEventSigWithConfs(ctx, topic, common.HexToAddress("0x1234"), 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1234")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLatestLogByEventSigWithConfs(ctx, topic, common.HexToAddress("0x1234"), 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1234")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLatestLogByEventSigWithConfs(ctx, topic, common.HexToAddress("0x1234"), 1)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1234")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLatestLogByEventSigWithConfs(ctx, topic, common.HexToAddress("0x1234"), 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1234")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLatestLogByEventSigWithConfs(ctx, topic, common.HexToAddress("0x1234"), 1)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1234")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLatestLogByEventSigWithConfs(ctx, topic, common.HexToAddress("0x1234"), 2)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1234")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLatestLogByEventSigWithConfs(ctx, topic, common.HexToAddress("0x1234"), 3)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1234")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLatestLogEventSigsAddrsWithConfs(ctx, 0 /* startBlock */, []common.Address{common.HexToAddress("0x1234")}, []common.Hash{topic}, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1234")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLatestLogEventSigsAddrsWithConfs(ctx, 0 /* startBlock */, []common.Address{common.HexToAddress("0x1234"), common.HexToAddress("0x1235")}, []common.Hash{topic}, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1234")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1235")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLatestLogEventSigsAddrsWithConfs(ctx, 0 /* startBlock */, []common.Address{common.HexToAddress("0x1234")}, []common.Hash{topic, topic2}, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1234")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLatestLogEventSigsAddrsWithConfs(ctx, 0 /* startBlock */, []common.Address{common.HexToAddress("0x1234"), common.HexToAddress("0x1235")}, []common.Hash{topic, topic2}, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1234")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1235")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLatestLogEventSigsAddrsWithConfs(ctx, 0 /* startBlock */, []common.Address{common.HexToAddress("0x1234"), common.HexToAddress("0x1235")}, []common.Hash{topic, topic2}, 1)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1234")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1235")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLatestLogEventSigsAddrsWithConfs(ctx, 0 /* startBlock */, []common.Address{common.HexToAddress("0x1234"), common.HexToAddress("0x1235")}, []common.Hash{topic, topic2}, 2)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1234")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1235")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1234")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1236")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1236")` $DIR/core/chains/evm/logpoller/orm_test.go: `.LoadFilters(ctx)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLatestBlock(ctx)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLogsByBlockRange(ctx, 1, latest.BlockNumber)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Sleep(2 * time.Millisecond)` $DIR/core/chains/evm/logpoller/orm_test.go: `.DeleteExpiredLogs(ctx, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLogsByBlockRange(ctx, 1, latest.BlockNumber)` $DIR/core/chains/evm/logpoller/orm_test.go: `.DeleteLogsAndBlocksAfter(ctx, 1)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLogsByBlockRange(ctx, 1, latest.BlockNumber)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Test(t)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewRandomEVMChainID()` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewORM(chainID, dbx, lggr)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1234")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1111")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x2222")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x3333")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x4444")` $DIR/core/chains/evm/logpoller/orm_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Run("Save filter: "+filter.Name, func(t *testing.T) { var count int err := orm.InsertFilter(ctx, filter) require.NoError(t, err) err = dbx.Get(&count, `SELECT COUNT(*) FROM evm.log_poller_filters WHERE evm_chain_id = $1 AND name = $2`, ubig.New(chainID), filter.Name) require.NoError(t, err) expectedCount := len(filter.Addresses) * len(filter.EventSigs) if len(filter.Topic2) > 0 { expectedCount *= len(filter.Topic2) } if len(filter.Topic3) > 0 { expectedCount *= len(filter.Topic3) } if len(filter.Topic4) > 0 { expectedCount *= len(filter.Topic4) } assert.Equal(t, count, expectedCount) })` $DIR/core/chains/evm/logpoller/orm_test.go: `.InsertFilter(ctx, filter)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Get(&count, `SELECT COUNT(*) FROM evm.log_poller_filters WHERE evm_chain_id = $1 AND name = $2`, ubig.New(chainID), filter.Name)` $DIR/core/chains/evm/logpoller/orm_test.go: `.New(chainID)` $DIR/core/chains/evm/logpoller/orm_test.go: `.LoadFilters(ctx)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1599")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1234")` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewEventByTopicFilter(topicIdx, []primitives.ValueComparator{ {Value: logpoller.EvmWord(value).Hex(), Operator: primitives.Eq}, })` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(value)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Hex()` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewLimitAndSort(query.Limit{}, query.NewSortBySequence(query.Asc))` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewSortBySequence(query.Asc)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewAddressFilter(addr)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewEventSigFilter(eventSig)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Confidence(primitives.Unconfirmed)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectIndexedLogs(ctx, addr, eventSig, 1, []common.Hash{logpoller.EvmWord(1)}, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(1)` $DIR/core/chains/evm/logpoller/orm_test.go: `.FilteredLogs(ctx, standardFilter(1, []uint64{1}), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectIndexedLogs(ctx, addr, eventSig, 1, []common.Hash{logpoller.EvmWord(1), logpoller.EvmWord(2)}, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(1)` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(2)` $DIR/core/chains/evm/logpoller/orm_test.go: `.FilteredLogs(ctx, standardFilter(1, []uint64{1, 2}), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewAddressFilter(addr)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewEventSigFilter(eventSig)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Block(start, primitives.Gte)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Block(end, primitives.Lte)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectIndexedLogsByBlockRange(ctx, 1, 1, addr, eventSig, 1, []common.Hash{logpoller.EvmWord(1)})` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(1)` $DIR/core/chains/evm/logpoller/orm_test.go: `.FilteredLogs(ctx, blockRangeFilter(1, 1, 1, []uint64{1}), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectIndexedLogsByBlockRange(ctx, 1, 2, addr, eventSig, 1, []common.Hash{logpoller.EvmWord(2)})` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(2)` $DIR/core/chains/evm/logpoller/orm_test.go: `.FilteredLogs(ctx, blockRangeFilter(1, 2, 1, []uint64{2}), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectIndexedLogsByBlockRange(ctx, 1, 2, addr, eventSig, 1, []common.Hash{logpoller.EvmWord(1)})` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(1)` $DIR/core/chains/evm/logpoller/orm_test.go: `.FilteredLogs(ctx, blockRangeFilter(1, 2, 1, []uint64{1}), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectIndexedLogsByBlockRange(ctx, 1, 2, addr, eventSig, 0, []common.Hash{logpoller.EvmWord(1)})` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(1)` $DIR/core/chains/evm/logpoller/orm_test.go: `.FilteredLogs(ctx, blockRangeFilter(1, 2, 0, []uint64{1}), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectIndexedLogsByBlockRange(ctx, 1, 2, addr, eventSig, 4, []common.Hash{logpoller.EvmWord(1)})` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(1)` $DIR/core/chains/evm/logpoller/orm_test.go: `.FilteredLogs(ctx, blockRangeFilter(1, 2, 4, []uint64{1}), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectIndexedLogsTopicGreaterThan(ctx, addr, eventSig, 1, logpoller.EvmWord(2), 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(2)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewAddressFilter(addr)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewEventSigFilter(eventSig)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewEventByTopicFilter(1, []primitives.ValueComparator{ {Value: logpoller.EvmWord(2).Hex(), Operator: primitives.Gte}, })` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(2)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Hex()` $DIR/core/chains/evm/logpoller/orm_test.go: `.Confidence(primitives.Unconfirmed)` $DIR/core/chains/evm/logpoller/orm_test.go: `.FilteredLogs(ctx, filter, limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewAddressFilter(addr)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewEventSigFilter(eventSig)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewEventByTopicFilter(topicIdx, []primitives.ValueComparator{ {Value: logpoller.EvmWord(min).Hex(), Operator: primitives.Gte}, })` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(min)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Hex()` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewEventByTopicFilter(topicIdx, []primitives.ValueComparator{ {Value: logpoller.EvmWord(max).Hex(), Operator: primitives.Lte}, })` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(max)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Hex()` $DIR/core/chains/evm/logpoller/orm_test.go: `.Confidence(primitives.Unconfirmed)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectIndexedLogsTopicRange(ctx, addr, eventSig, 1, logpoller.EvmWord(3), logpoller.EvmWord(3), 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(3)` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(3)` $DIR/core/chains/evm/logpoller/orm_test.go: `.FilteredLogs(ctx, rangeFilter(1, 3, 3), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectIndexedLogsTopicRange(ctx, addr, eventSig, 1, logpoller.EvmWord(1), logpoller.EvmWord(3), 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(1)` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(3)` $DIR/core/chains/evm/logpoller/orm_test.go: `.FilteredLogs(ctx, rangeFilter(1, 1, 3), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectIndexedLogsTopicRange(ctx, addr, eventSig, 1, logpoller.EvmWord(4), logpoller.EvmWord(4), 1)` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(4)` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(4)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectIndexedLogsTopicRange(ctx, addr, eventSig, 1, logpoller.EvmWord(4), logpoller.EvmWord(4), 1)` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(4)` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(4)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1599")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1888")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1234")` $DIR/core/chains/evm/logpoller/orm_test.go: `.New(th.ChainID)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1")` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(1)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Bytes()` $DIR/core/chains/evm/logpoller/orm_test.go: `.New(th.ChainID)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1")` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(2)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Bytes()` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(3)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Bytes()` $DIR/core/chains/evm/logpoller/orm_test.go: `.New(th.ChainID)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1889")` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(2)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Bytes()` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(3)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Bytes()` $DIR/core/chains/evm/logpoller/orm_test.go: `.New(th.ChainID)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1600")` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(2)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Bytes()` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(3)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Bytes()` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectIndexedLogsByTxHash(ctx, addr, eventSig, txHash)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewLimitAndSort(query.Limit{}, query.NewSortBySequence(query.Asc))` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewSortBySequence(query.Asc)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewAddressFilter(addr)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewEventSigFilter(eventSig)` $DIR/core/chains/evm/logpoller/orm_test.go: `.TxHash(txHash.Hex())` $DIR/core/chains/evm/logpoller/orm_test.go: `.Hex()` $DIR/core/chains/evm/logpoller/orm_test.go: `.FilteredLogs(ctx, filter, limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1599")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1234")` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewAddressFilter(addr)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewEventSigFilter(eventSig)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewEventByWordFilter(eventSig, wordIdx, []primitives.ValueComparator{ {Value: logpoller.EvmWord(word1).Hex(), Operator: primitives.Gte}, })` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(word1)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Hex()` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewEventByWordFilter(eventSig, wordIdx, []primitives.ValueComparator{ {Value: logpoller.EvmWord(word2).Hex(), Operator: primitives.Lte}, })` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(word2)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Hex()` $DIR/core/chains/evm/logpoller/orm_test.go: `.Confidence(primitives.Unconfirmed)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewLimitAndSort(query.Limit{}, query.NewSortBySequence(query.Asc))` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewSortBySequence(query.Asc)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLogsDataWordRange(ctx, addr, eventSig, 0, logpoller.EvmWord(2), logpoller.EvmWord(2), 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(2)` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(2)` $DIR/core/chains/evm/logpoller/orm_test.go: `.FilteredLogs(ctx, wordFilter(0, 2, 2), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLogsDataWordRange(ctx, addr, eventSig, 0, logpoller.EvmWord(1), logpoller.EvmWord(2), 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(1)` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(2)` $DIR/core/chains/evm/logpoller/orm_test.go: `.FilteredLogs(ctx, wordFilter(0, 1, 2), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLogsDataWordRange(ctx, addr, eventSig, 0, logpoller.EvmWord(1), logpoller.EvmWord(1), 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(1)` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(1)` $DIR/core/chains/evm/logpoller/orm_test.go: `.FilteredLogs(ctx, wordFilter(0, 1, 1), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLogsDataWordRange(ctx, addr, eventSig, 1, logpoller.EvmWord(3), logpoller.EvmWord(3), 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(3)` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(3)` $DIR/core/chains/evm/logpoller/orm_test.go: `.FilteredLogs(ctx, wordFilter(1, 3, 3), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLogsDataWordRange(ctx, addr, eventSig, 1, logpoller.EvmWord(3), logpoller.EvmWord(3), 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(3)` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(3)` $DIR/core/chains/evm/logpoller/orm_test.go: `.FilteredLogs(ctx, wordFilter(1, 3, 3), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLogsDataWordGreaterThan(ctx, addr, eventSig, 0, logpoller.EvmWord(1), 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(1)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewAddressFilter(addr)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewEventSigFilter(eventSig)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewEventByWordFilter(eventSig, 0, []primitives.ValueComparator{ {Value: logpoller.EvmWord(1).Hex(), Operator: primitives.Gte}, })` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(1)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Hex()` $DIR/core/chains/evm/logpoller/orm_test.go: `.Confidence(primitives.Unconfirmed)` $DIR/core/chains/evm/logpoller/orm_test.go: `.FilteredLogs(ctx, filter, limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1599")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1600")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x12345")` $DIR/core/chains/evm/logpoller/orm_test.go: `.New(th.ChainID)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1234")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1888")` $DIR/core/chains/evm/logpoller/orm_test.go: `.New(th.ChainID)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1235")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1888")` $DIR/core/chains/evm/logpoller/orm_test.go: `.New(th.ChainID)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1236")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1235")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1888")` $DIR/core/chains/evm/logpoller/orm_test.go: `.New(th.ChainID)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1237")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x1235")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1888")` $DIR/core/chains/evm/logpoller/orm_test.go: `.New(th.ChainID)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1238")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1888")` $DIR/core/chains/evm/logpoller/orm_test.go: `.New(th.ChainID)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1239")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x1888")` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewAddressFilter(sourceAddr)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewEventSigFilter(val)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Block(uint64(startBlock), primitives.Gte)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Block(uint64(endBlock), primitives.Lte)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewSortBySequence(query.Asc)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLogsWithSigs(ctx, startBlock, endBlock, sourceAddr, []common.Hash{ topic, topic2, })` $DIR/core/chains/evm/logpoller/orm_test.go: `.ORM.FilteredLogs(ctx, filter([]common.Hash{topic, topic2}, startBlock, endBlock), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/orm_test.go: `.DeleteBlocksBefore(ctx, 1, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectBlockByNumber(ctx, 1)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectBlockByNumber(ctx, 2)` $DIR/core/chains/evm/logpoller/orm_test.go: `.DeleteBlocksBefore(ctx, 3, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectBlockByNumber(ctx, 2)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectBlockByNumber(ctx, 3)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x2ab9a2Dc53736b361b72d900CdF9F78F9406fbbb")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x6E225058950f237371261C985Db6bDe26df2200E")` $DIR/core/chains/evm/logpoller/orm_test.go: `.ORM.SelectLogsByBlockRange(ctx, 1, 3)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewAddressFilter(address)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewEventSigFilter(event1)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Block(start, primitives.Gte)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Block(end, primitives.Lte)` $DIR/core/chains/evm/logpoller/orm_test.go: `.ORM.SelectLogs(ctx, 1, 3, address1, event1)` $DIR/core/chains/evm/logpoller/orm_test.go: `.ORM.FilteredLogs(ctx, logFilter(1, 3, address1), query.LimitAndSort{ SortBy: []query.SortBy{query.NewSortBySequence(query.Asc)}, }, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewSortBySequence(query.Asc)` $DIR/core/chains/evm/logpoller/orm_test.go: `.ORM.SelectLogs(ctx, 2, 2, address2, event1)` $DIR/core/chains/evm/logpoller/orm_test.go: `.ORM.FilteredLogs(ctx, logFilter(2, 2, address2), query.LimitAndSort{ SortBy: []query.SortBy{query.NewSortBySequence(query.Asc)}, }, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewSortBySequence(query.Asc)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Bytes()` $DIR/core/chains/evm/logpoller/orm_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x11111")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x22222")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToAddress("0x33333")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x01")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x02")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x03")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x04")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x000a")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x000b")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x000c")` $DIR/core/chains/evm/logpoller/orm_test.go: `.HexToHash("0x000d")` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectIndexedLogsWithSigsExcluding(ctx, requestSigA, responseSigA, 1, addressA, 0, 3, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 1, addressB, 0, 3, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectIndexedLogsWithSigsExcluding(ctx, requestSigA, responseSigA, 1, addressA, 0, 3, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 1, addressB, 0, 3, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 3, addressC, 0, 4, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 3, addressC, 0, 4, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 3, addressC, 0, 4, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 3, addressC, 0, 4, 3)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 3, addressC, 0, 10, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 3, addressC, 0, 10, 3)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 3, addressC, 0, 10, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 1, addressB, 0, 3, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectIndexedLogsWithSigsExcluding(ctx, requestSigA, responseSigA, 1, addressA, 0, 1, 10)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 1, addressB, 2, 13, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/orm_test.go: `.RandomAddress()` $DIR/core/chains/evm/logpoller/orm_test.go: `.RandomAddress()` $DIR/core/chains/evm/logpoller/orm_test.go: `.Run(tt.name, func(t *testing.T) { blockNumber, err := th.ORM.SelectLatestBlockByEventSigsAddrsWithConfs(ctx, tt.fromBlock, tt.events, tt.addrs, tt.confs) require.NoError(t, err) assert.Equal(t, tt.expectedBlockNumber, blockNumber) })` $DIR/core/chains/evm/logpoller/orm_test.go: `.ORM.SelectLatestBlockByEventSigsAddrsWithConfs(ctx, tt.fromBlock, tt.events, tt.addrs, tt.confs)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/orm_test.go: `.RandomAddress()` $DIR/core/chains/evm/logpoller/orm_test.go: `.Date(2010, 1, 1, 12, 12, 12, 0, time.UTC)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Date(2020, 1, 1, 12, 12, 12, 0, time.UTC)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Date(2030, 1, 1, 12, 12, 12, 0, time.UTC)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewAddressFilter(address)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewEventSigFilter(event)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewEventByTopicFilter(uint64(topicIdx), []primitives.ValueComparator{ {Value: val.String(), Operator: primitives.Eq}, })` $DIR/core/chains/evm/logpoller/orm_test.go: `.String()` $DIR/core/chains/evm/logpoller/orm_test.go: `.Timestamp(uint64(timestamp.Unix()), primitives.Gt)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Unix()` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewConfirmationsFilter(confs)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewSortBySequence(query.Asc)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Run(tt.name, func(t *testing.T) { logs, err := th.ORM.SelectLogsCreatedAfter(ctx, address, event, tt.after, tt.confs) assertion(t, logs, err, tt.expectedLogs) logs, err = th.ORM.FilteredLogs(ctx, filter(tt.after, tt.confs, 0, nil), limiter, "") assertion(t, logs, err, tt.expectedLogs) })` $DIR/core/chains/evm/logpoller/orm_test.go: `.ORM.SelectLogsCreatedAfter(ctx, address, event, tt.after, tt.confs)` $DIR/core/chains/evm/logpoller/orm_test.go: `.ORM.FilteredLogs(ctx, filter(tt.after, tt.confs, 0, nil), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `.Run(tt.name, func(t *testing.T) { logs, err := th.ORM.SelectIndexedLogsCreatedAfter(ctx, address, event, 1, []common.Hash{event}, tt.after, tt.confs) assertion(t, logs, err, tt.expectedLogs) logs, err = th.ORM.FilteredLogs(ctx, filter(tt.after, tt.confs, 1, []common.Hash{event}), limiter, "") assertion(t, logs, err, tt.expectedLogs) })` $DIR/core/chains/evm/logpoller/orm_test.go: `.ORM.SelectIndexedLogsCreatedAfter(ctx, address, event, 1, []common.Hash{event}, tt.after, tt.confs)` $DIR/core/chains/evm/logpoller/orm_test.go: `.ORM.FilteredLogs(ctx, filter(tt.after, tt.confs, 1, []common.Hash{event}), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/orm_test.go: `.RandomAddress()` $DIR/core/chains/evm/logpoller/orm_test.go: `.ORM.SelectIndexedLogs(ctx, address, event, 1, []common.Hash{event}, evmtypes.Unconfirmed)` $DIR/core/chains/evm/logpoller/orm_test.go: `.ORM.SelectIndexedLogs(ctx, address, event, 1, []common.Hash{event}, evmtypes.Unconfirmed)` $DIR/core/chains/evm/logpoller/orm_test.go: `.ORM.SelectIndexedLogs(ctx, address, event, 1, []common.Hash{event}, evmtypes.Confirmations(4))` $DIR/core/chains/evm/logpoller/orm_test.go: `.Confirmations(4)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewRandomEVMChainID()` $DIR/core/chains/evm/logpoller/orm_test.go: `.RandomBytes32()` $DIR/core/chains/evm/logpoller/orm_test.go: `.RandomAddress()` $DIR/core/chains/evm/logpoller/orm_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/orm_test.go: `.FullTestDBV2(t, nil)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewORM(chainID, db, logger.Test(t))` $DIR/core/chains/evm/logpoller/orm_test.go: `.Test(t)` $DIR/core/chains/evm/logpoller/orm_test.go: `.RandomAddress()` $DIR/core/chains/evm/logpoller/orm_test.go: `.String()` $DIR/core/chains/evm/logpoller/orm_test.go: `.RandomAddress()` $DIR/core/chains/evm/logpoller/orm_test.go: `.String()` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewLogPollerBlock(utils.RandomBytes32(), 20, time.Now(), 10)` $DIR/core/chains/evm/logpoller/orm_test.go: `.RandomBytes32()` $DIR/core/chains/evm/logpoller/orm_test.go: `.Now()` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewLogPollerBlock(utils.RandomBytes32(), -10, time.Now(), -10)` $DIR/core/chains/evm/logpoller/orm_test.go: `.RandomBytes32()` $DIR/core/chains/evm/logpoller/orm_test.go: `.Now()` $DIR/core/chains/evm/logpoller/orm_test.go: `.Run(tt.name, func(t *testing.T) { // clean all logs and blocks between test cases defer func() { _ = o.DeleteLogsAndBlocksAfter(ctx, 0) }() insertError := o.InsertLogsWithBlock(ctx, tt.logs, tt.block) logs, logsErr := o.SelectLogs(ctx, 0, math.MaxInt, address, event) block, blockErr := o.SelectLatestBlock(ctx) if tt.shouldRollback { assert.Error(t, insertError) assert.NoError(t, logsErr) assert.Len(t, logs, 0) assert.Error(t, blockErr) } else { assert.NoError(t, insertError) assert.NoError(t, logsErr) assert.Len(t, logs, len(tt.logs)) assert.NoError(t, blockErr) assert.Equal(t, block.BlockNumber, tt.block.BlockNumber) } })` $DIR/core/chains/evm/logpoller/orm_test.go: `.DeleteLogsAndBlocksAfter(ctx, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.InsertLogsWithBlock(ctx, tt.logs, tt.block)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLogs(ctx, 0, math.MaxInt, address, event)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLatestBlock(ctx)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewRandomEVMChainID()` $DIR/core/chains/evm/logpoller/orm_test.go: `.RandomBytes32()` $DIR/core/chains/evm/logpoller/orm_test.go: `.RandomAddress()` $DIR/core/chains/evm/logpoller/orm_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/orm_test.go: `.FullTestDBV2(t, nil)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewORM(chainID, db, logger.Test(t))` $DIR/core/chains/evm/logpoller/orm_test.go: `.Test(t)` $DIR/core/chains/evm/logpoller/orm_test.go: `.RandomAddress()` $DIR/core/chains/evm/logpoller/orm_test.go: `.String()` $DIR/core/chains/evm/logpoller/orm_test.go: `.RandomAddress()` $DIR/core/chains/evm/logpoller/orm_test.go: `.String()` $DIR/core/chains/evm/logpoller/orm_test.go: `.Run(tt.name, func(t *testing.T) { // clean all logs and blocks between test cases defer func() { _, _ = db.Exec("truncate evm.logs") }() insertErr := o.InsertLogs(ctx, tt.logs) logsFromDb, err := o.SelectLogs(ctx, 0, math.MaxInt, address, event) assert.NoError(t, err) if tt.shouldRollback { assert.Error(t, insertErr) assert.Len(t, logsFromDb, 0) } else { assert.NoError(t, insertErr) assert.Len(t, logsFromDb, len(tt.logs)) } })` $DIR/core/chains/evm/logpoller/orm_test.go: `.Exec("truncate evm.logs")` $DIR/core/chains/evm/logpoller/orm_test.go: `.InsertLogs(ctx, tt.logs)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectLogs(ctx, 0, math.MaxInt, address, event)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/orm_test.go: `.RandomAddress()` $DIR/core/chains/evm/logpoller/orm_test.go: `.RandomBytes32()` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(1)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Bytes()` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(10)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Bytes()` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(5)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Bytes()` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(20)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Bytes()` $DIR/core/chains/evm/logpoller/orm_test.go: `.ORM.InsertLogsWithBlock(ctx, []logpoller.Log{ GenLogWithData(th.ChainID, address, eventSig, 1, 1, firstLogData), GenLogWithData(th.ChainID, address, eventSig, 2, 2, secondLogData), }, logpoller.NewLogPollerBlock(utils.RandomBytes32(), 10, time.Now(), 1), )` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewLogPollerBlock(utils.RandomBytes32(), 10, time.Now(), 1)` $DIR/core/chains/evm/logpoller/orm_test.go: `.RandomBytes32()` $DIR/core/chains/evm/logpoller/orm_test.go: `.Now()` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewSortByBlock(query.Asc)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewSortBySequence(query.Asc)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewAddressFilter(address)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewEventSigFilter(eventSig)` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewEventByWordFilter(eventSig, 0, []primitives.ValueComparator{ {Value: logpoller.EvmWord(word).Hex(), Operator: primitives.Lte}, })` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(word)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Hex()` $DIR/core/chains/evm/logpoller/orm_test.go: `.NewEventByWordFilter(eventSig, 1, []primitives.ValueComparator{ {Value: logpoller.EvmWord(word).Hex(), Operator: primitives.Gte}, })` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(word)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Hex()` $DIR/core/chains/evm/logpoller/orm_test.go: `.Confidence(primitives.Unconfirmed)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Run(tt.name, func(t *testing.T) { logs, err := th.ORM.SelectLogsDataWordBetween(ctx, address, eventSig, 0, 1, logpoller.EvmWord(tt.wordValue), evmtypes.Unconfirmed) assertion(t, logs, err, tt.expectedLogs) logs, err = th.ORM.FilteredLogs(ctx, wordFilter(tt.wordValue), limiter, "") assertion(t, logs, err, tt.expectedLogs) })` $DIR/core/chains/evm/logpoller/orm_test.go: `.ORM.SelectLogsDataWordBetween(ctx, address, eventSig, 0, 1, logpoller.EvmWord(tt.wordValue), evmtypes.Unconfirmed)` $DIR/core/chains/evm/logpoller/orm_test.go: `.EvmWord(tt.wordValue)` $DIR/core/chains/evm/logpoller/orm_test.go: `.ORM.FilteredLogs(ctx, wordFilter(tt.wordValue), limiter, "")` $DIR/core/chains/evm/logpoller/orm_test.go: `.Context(t)` $DIR/core/chains/evm/logpoller/orm_test.go: `.Run("Selects oldest within given chain", func(t *testing.T) { // insert blocks require.NoError(t, o2.InsertBlock(ctx, common.HexToHash("0x1231"), 11, time.Now(), 0)) require.NoError(t, o2.InsertBlock(ctx, common.HexToHash("0x1232"), 12, time.Now(), 0)) // insert newer block from different chain require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1233"), 13, time.Now(), 0)) require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1231"), 14, time.Now(), 0)) block, err := o1.SelectOldestBlock(ctx, 0) require.NoError(t, err) require.NotNil(t, block) require.Equal(t, block.BlockNumber, int64(13)) require.Equal(t, block.BlockHash, common.HexToHash("0x1233")) })` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectOldestBlock(ctx, 0)` $DIR/core/chains/evm/logpoller/orm_test.go: `.SelectOldestBlock(ctx, 12)` $DIR/core/chains/evm/logpoller/parser_test.go: `t.Run("query with no filters no order and no limit", func(t *testing.T) { t.Parallel() parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{} limiter := query.LimitAndSort{} result, args, err := parser.buildQuery(chainID, expressions, limiter) require.NoError(t, err) assert.Equal(t, "SELECT evm.logs.* FROM evm.logs WHERE evm_chain_id = :evm_chain_id", result) assertArgs(t, args, 1) })` $DIR/core/chains/evm/logpoller/parser_test.go: `assertArgs(t, args, 1)` $DIR/core/chains/evm/logpoller/parser_test.go: `t.Run("query with cursor and no order by", func(t *testing.T) { t.Parallel() parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{ NewAddressFilter(common.HexToAddress("0x42")), NewEventSigFilter(common.HexToHash("0x21")), } limiter := query.NewLimitAndSort(query.CursorLimit("10-0x42-5", query.CursorFollowing, 20)) result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "AND (address = :address_0 AND event_sig = :event_sig_0) " + "AND block_number >= :cursor_block AND tx_hash >= :cursor_txhash AND log_index > :cursor_log_index " + "ORDER BY block_number ASC, tx_hash ASC, log_index ASC " + "LIMIT 20" require.NoError(t, err) assert.Equal(t, expected, result) assertArgs(t, args, 6) })` $DIR/core/chains/evm/logpoller/parser_test.go: `assertArgs(t, args, 6)` $DIR/core/chains/evm/logpoller/parser_test.go: `t.Run("query with limit and no order by", func(t *testing.T) { t.Parallel() parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{ NewAddressFilter(common.HexToAddress("0x42")), NewEventSigFilter(common.HexToHash("0x21")), } limiter := query.NewLimitAndSort(query.CountLimit(20)) result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "AND (address = :address_0 AND event_sig = :event_sig_0) " + "LIMIT 20" require.NoError(t, err) assert.Equal(t, expected, result) assertArgs(t, args, 3) })` $DIR/core/chains/evm/logpoller/parser_test.go: `assertArgs(t, args, 3)` $DIR/core/chains/evm/logpoller/parser_test.go: `t.Run("query with order by sequence no cursor no limit", func(t *testing.T) { t.Parallel() parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{} limiter := query.NewLimitAndSort(query.Limit{}, query.NewSortBySequence(query.Desc)) result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "ORDER BY block_number DESC, tx_hash DESC, log_index DESC" require.NoError(t, err) assert.Equal(t, expected, result) assertArgs(t, args, 1) })` $DIR/core/chains/evm/logpoller/parser_test.go: `assertArgs(t, args, 1)` $DIR/core/chains/evm/logpoller/parser_test.go: `t.Run("query with multiple order by no limit", func(t *testing.T) { t.Parallel() parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{} limiter := query.NewLimitAndSort(query.Limit{}, query.NewSortByBlock(query.Asc), query.NewSortByTimestamp(query.Desc)) result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "ORDER BY block_number ASC, block_timestamp DESC" require.NoError(t, err) assert.Equal(t, expected, result) assertArgs(t, args, 1) })` $DIR/core/chains/evm/logpoller/parser_test.go: `assertArgs(t, args, 1)` $DIR/core/chains/evm/logpoller/parser_test.go: `t.Run("basic query with default primitives no order by and cursor", func(t *testing.T) { t.Parallel() parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{ query.Timestamp(10, primitives.Eq), query.TxHash(common.HexToHash("0x84").String()), query.Block(99, primitives.Neq), query.Confidence(primitives.Finalized), query.Confidence(primitives.Unconfirmed), } limiter := query.NewLimitAndSort(query.CursorLimit("10-0x42-20", query.CursorPrevious, 20)) result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "AND (block_timestamp = :block_timestamp_0 " + "AND tx_hash = :tx_hash_0 " + "AND block_number != :block_number_0 " + "AND block_number <= " + "(SELECT finalized_block_number FROM evm.log_poller_blocks WHERE evm_chain_id = :evm_chain_id ORDER BY block_number DESC LIMIT 1) " + "AND block_number <= (SELECT greatest(block_number - :confs_0, 0) FROM evm.log_poller_blocks WHERE evm_chain_id = :evm_chain_id ORDER BY block_number DESC LIMIT 1)) " + "AND block_number <= :cursor_block AND tx_hash <= :cursor_txhash AND log_index < :cursor_log_index " + "ORDER BY block_number DESC, tx_hash DESC, log_index DESC LIMIT 20" require.NoError(t, err) assert.Equal(t, expected, result) assertArgs(t, args, 8) })` $DIR/core/chains/evm/logpoller/parser_test.go: `assertArgs(t, args, 8)` $DIR/core/chains/evm/logpoller/parser_test.go: `t.Run("query for finality", func(t *testing.T) { t.Parallel() t.Run("finalized", func(t *testing.T) { parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{query.Confidence(primitives.Finalized)} limiter := query.LimitAndSort{} result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "AND block_number <= (SELECT finalized_block_number FROM evm.log_poller_blocks WHERE evm_chain_id = :evm_chain_id ORDER BY block_number DESC LIMIT 1)" require.NoError(t, err) assert.Equal(t, expected, result) assertArgs(t, args, 1) }) t.Run("unconfirmed", func(t *testing.T) { parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{query.Confidence(primitives.Unconfirmed)} limiter := query.LimitAndSort{} result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "AND block_number <= (SELECT greatest(block_number - :confs_0, 0) FROM evm.log_poller_blocks WHERE evm_chain_id = :evm_chain_id ORDER BY block_number DESC LIMIT 1)" require.NoError(t, err) assert.Equal(t, expected, result) assertArgs(t, args, 2) }) t.Run("exact confirmations", func(t *testing.T) { parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{NewConfirmationsFilter(25)} limiter := query.LimitAndSort{} result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "AND block_number <= (SELECT greatest(block_number - :confs_0, 0) FROM evm.log_poller_blocks WHERE evm_chain_id = :evm_chain_id ORDER BY block_number DESC LIMIT 1)" require.NoError(t, err) assert.Equal(t, expected, result) confirmations, ok := args.args["confs_0"] require.True(t, ok) require.Equal(t, uint64(25), confirmations) assertArgs(t, args, 2) }) })` $DIR/core/chains/evm/logpoller/parser_test.go: `t.Run("finalized", func(t *testing.T) { parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{query.Confidence(primitives.Finalized)} limiter := query.LimitAndSort{} result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "AND block_number <= (SELECT finalized_block_number FROM evm.log_poller_blocks WHERE evm_chain_id = :evm_chain_id ORDER BY block_number DESC LIMIT 1)" require.NoError(t, err) assert.Equal(t, expected, result) assertArgs(t, args, 1) })` $DIR/core/chains/evm/logpoller/parser_test.go: `assertArgs(t, args, 1)` $DIR/core/chains/evm/logpoller/parser_test.go: `t.Run("unconfirmed", func(t *testing.T) { parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{query.Confidence(primitives.Unconfirmed)} limiter := query.LimitAndSort{} result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "AND block_number <= (SELECT greatest(block_number - :confs_0, 0) FROM evm.log_poller_blocks WHERE evm_chain_id = :evm_chain_id ORDER BY block_number DESC LIMIT 1)" require.NoError(t, err) assert.Equal(t, expected, result) assertArgs(t, args, 2) })` $DIR/core/chains/evm/logpoller/parser_test.go: `assertArgs(t, args, 2)` $DIR/core/chains/evm/logpoller/parser_test.go: `t.Run("exact confirmations", func(t *testing.T) { parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{NewConfirmationsFilter(25)} limiter := query.LimitAndSort{} result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "AND block_number <= (SELECT greatest(block_number - :confs_0, 0) FROM evm.log_poller_blocks WHERE evm_chain_id = :evm_chain_id ORDER BY block_number DESC LIMIT 1)" require.NoError(t, err) assert.Equal(t, expected, result) confirmations, ok := args.args["confs_0"] require.True(t, ok) require.Equal(t, uint64(25), confirmations) assertArgs(t, args, 2) })` $DIR/core/chains/evm/logpoller/parser_test.go: `assertArgs(t, args, 2)` $DIR/core/chains/evm/logpoller/parser_test.go: `t.Run("query for event by word", func(t *testing.T) { t.Parallel() wordFilter := NewEventByWordFilter(common.HexToHash("0x42"), 8, []primitives.ValueComparator{ {Value: "", Operator: primitives.Gt}, }) parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{wordFilter} limiter := query.LimitAndSort{} result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "AND substring(data from 32*:word_index_0+1 for 32) > :word_value_0" require.NoError(t, err) assert.Equal(t, expected, result) assertArgs(t, args, 3) })` $DIR/core/chains/evm/logpoller/parser_test.go: `assertArgs(t, args, 3)` $DIR/core/chains/evm/logpoller/parser_test.go: `t.Run("query for event topic", func(t *testing.T) { t.Parallel() topicFilter := NewEventByTopicFilter(2, []primitives.ValueComparator{ {Value: "a", Operator: primitives.Gt}, {Value: "b", Operator: primitives.Lt}, }) parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{topicFilter} limiter := query.LimitAndSort{} result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "AND topics[:topic_index_0] > :topic_value_0 AND topics[:topic_index_0] < :topic_value_1" require.NoError(t, err) assert.Equal(t, expected, result) assertArgs(t, args, 4) })` $DIR/core/chains/evm/logpoller/parser_test.go: `assertArgs(t, args, 4)` $DIR/core/chains/evm/logpoller/parser_test.go: `t.Run("nested query", func(t *testing.T) { t.Parallel() parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{ {BoolExpression: query.BoolExpression{ Expressions: []query.Expression{ query.Timestamp(10, primitives.Gte), {BoolExpression: query.BoolExpression{ Expressions: []query.Expression{ query.TxHash(common.HexToHash("0x84").Hex()), query.Confidence(primitives.Unconfirmed), }, BoolOperator: query.OR, }}, }, BoolOperator: query.AND, }}, } limiter := query.LimitAndSort{} result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "AND (block_timestamp >= :block_timestamp_0 " + "AND (tx_hash = :tx_hash_0 " + "OR block_number <= (SELECT greatest(block_number - :confs_0, 0) FROM evm.log_poller_blocks WHERE evm_chain_id = :evm_chain_id ORDER BY block_number DESC LIMIT 1)))" require.NoError(t, err) assert.Equal(t, expected, result) assertArgs(t, args, 4) })` $DIR/core/chains/evm/logpoller/parser_test.go: `assertArgs(t, args, 4)` $DIR/core/chains/evm/logpoller/parser_test.go: `assertArgs(t, args, 7)` $DIR/core/chains/evm/logpoller/parser_test.go: `.Run("query with no filters no order and no limit", func(t *testing.T) { t.Parallel() parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{} limiter := query.LimitAndSort{} result, args, err := parser.buildQuery(chainID, expressions, limiter) require.NoError(t, err) assert.Equal(t, "SELECT evm.logs.* FROM evm.logs WHERE evm_chain_id = :evm_chain_id", result) assertArgs(t, args, 1) })` $DIR/core/chains/evm/logpoller/parser_test.go: `.NewInt(1)` $DIR/core/chains/evm/logpoller/parser_test.go: `.buildQuery(chainID, expressions, limiter)` $DIR/core/chains/evm/logpoller/parser_test.go: `.Run("query with cursor and no order by", func(t *testing.T) { t.Parallel() parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{ NewAddressFilter(common.HexToAddress("0x42")), NewEventSigFilter(common.HexToHash("0x21")), } limiter := query.NewLimitAndSort(query.CursorLimit("10-0x42-5", query.CursorFollowing, 20)) result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "AND (address = :address_0 AND event_sig = :event_sig_0) " + "AND block_number >= :cursor_block AND tx_hash >= :cursor_txhash AND log_index > :cursor_log_index " + "ORDER BY block_number ASC, tx_hash ASC, log_index ASC " + "LIMIT 20" require.NoError(t, err) assert.Equal(t, expected, result) assertArgs(t, args, 6) })` $DIR/core/chains/evm/logpoller/parser_test.go: `.NewInt(1)` $DIR/core/chains/evm/logpoller/parser_test.go: `.HexToAddress("0x42")` $DIR/core/chains/evm/logpoller/parser_test.go: `.HexToHash("0x21")` $DIR/core/chains/evm/logpoller/parser_test.go: `.NewLimitAndSort(query.CursorLimit("10-0x42-5", query.CursorFollowing, 20))` $DIR/core/chains/evm/logpoller/parser_test.go: `.CursorLimit("10-0x42-5", query.CursorFollowing, 20)` $DIR/core/chains/evm/logpoller/parser_test.go: `.buildQuery(chainID, expressions, limiter)` $DIR/core/chains/evm/logpoller/parser_test.go: `.Run("query with limit and no order by", func(t *testing.T) { t.Parallel() parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{ NewAddressFilter(common.HexToAddress("0x42")), NewEventSigFilter(common.HexToHash("0x21")), } limiter := query.NewLimitAndSort(query.CountLimit(20)) result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "AND (address = :address_0 AND event_sig = :event_sig_0) " + "LIMIT 20" require.NoError(t, err) assert.Equal(t, expected, result) assertArgs(t, args, 3) })` $DIR/core/chains/evm/logpoller/parser_test.go: `.NewInt(1)` $DIR/core/chains/evm/logpoller/parser_test.go: `.HexToAddress("0x42")` $DIR/core/chains/evm/logpoller/parser_test.go: `.HexToHash("0x21")` $DIR/core/chains/evm/logpoller/parser_test.go: `.NewLimitAndSort(query.CountLimit(20))` $DIR/core/chains/evm/logpoller/parser_test.go: `.CountLimit(20)` $DIR/core/chains/evm/logpoller/parser_test.go: `.buildQuery(chainID, expressions, limiter)` $DIR/core/chains/evm/logpoller/parser_test.go: `.Run("query with order by sequence no cursor no limit", func(t *testing.T) { t.Parallel() parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{} limiter := query.NewLimitAndSort(query.Limit{}, query.NewSortBySequence(query.Desc)) result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "ORDER BY block_number DESC, tx_hash DESC, log_index DESC" require.NoError(t, err) assert.Equal(t, expected, result) assertArgs(t, args, 1) })` $DIR/core/chains/evm/logpoller/parser_test.go: `.NewInt(1)` $DIR/core/chains/evm/logpoller/parser_test.go: `.NewLimitAndSort(query.Limit{}, query.NewSortBySequence(query.Desc))` $DIR/core/chains/evm/logpoller/parser_test.go: `.NewSortBySequence(query.Desc)` $DIR/core/chains/evm/logpoller/parser_test.go: `.buildQuery(chainID, expressions, limiter)` $DIR/core/chains/evm/logpoller/parser_test.go: `.Run("query with multiple order by no limit", func(t *testing.T) { t.Parallel() parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{} limiter := query.NewLimitAndSort(query.Limit{}, query.NewSortByBlock(query.Asc), query.NewSortByTimestamp(query.Desc)) result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "ORDER BY block_number ASC, block_timestamp DESC" require.NoError(t, err) assert.Equal(t, expected, result) assertArgs(t, args, 1) })` $DIR/core/chains/evm/logpoller/parser_test.go: `.NewInt(1)` $DIR/core/chains/evm/logpoller/parser_test.go: `.NewLimitAndSort(query.Limit{}, query.NewSortByBlock(query.Asc), query.NewSortByTimestamp(query.Desc))` $DIR/core/chains/evm/logpoller/parser_test.go: `.NewSortByBlock(query.Asc)` $DIR/core/chains/evm/logpoller/parser_test.go: `.NewSortByTimestamp(query.Desc)` $DIR/core/chains/evm/logpoller/parser_test.go: `.buildQuery(chainID, expressions, limiter)` $DIR/core/chains/evm/logpoller/parser_test.go: `.Run("basic query with default primitives no order by and cursor", func(t *testing.T) { t.Parallel() parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{ query.Timestamp(10, primitives.Eq), query.TxHash(common.HexToHash("0x84").String()), query.Block(99, primitives.Neq), query.Confidence(primitives.Finalized), query.Confidence(primitives.Unconfirmed), } limiter := query.NewLimitAndSort(query.CursorLimit("10-0x42-20", query.CursorPrevious, 20)) result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "AND (block_timestamp = :block_timestamp_0 " + "AND tx_hash = :tx_hash_0 " + "AND block_number != :block_number_0 " + "AND block_number <= " + "(SELECT finalized_block_number FROM evm.log_poller_blocks WHERE evm_chain_id = :evm_chain_id ORDER BY block_number DESC LIMIT 1) " + "AND block_number <= (SELECT greatest(block_number - :confs_0, 0) FROM evm.log_poller_blocks WHERE evm_chain_id = :evm_chain_id ORDER BY block_number DESC LIMIT 1)) " + "AND block_number <= :cursor_block AND tx_hash <= :cursor_txhash AND log_index < :cursor_log_index " + "ORDER BY block_number DESC, tx_hash DESC, log_index DESC LIMIT 20" require.NoError(t, err) assert.Equal(t, expected, result) assertArgs(t, args, 8) })` $DIR/core/chains/evm/logpoller/parser_test.go: `.NewInt(1)` $DIR/core/chains/evm/logpoller/parser_test.go: `.Timestamp(10, primitives.Eq)` $DIR/core/chains/evm/logpoller/parser_test.go: `.TxHash(common.HexToHash("0x84").String())` $DIR/core/chains/evm/logpoller/parser_test.go: `.HexToHash("0x84")` $DIR/core/chains/evm/logpoller/parser_test.go: `.String()` $DIR/core/chains/evm/logpoller/parser_test.go: `.Block(99, primitives.Neq)` $DIR/core/chains/evm/logpoller/parser_test.go: `.Confidence(primitives.Finalized)` $DIR/core/chains/evm/logpoller/parser_test.go: `.Confidence(primitives.Unconfirmed)` $DIR/core/chains/evm/logpoller/parser_test.go: `.NewLimitAndSort(query.CursorLimit("10-0x42-20", query.CursorPrevious, 20))` $DIR/core/chains/evm/logpoller/parser_test.go: `.CursorLimit("10-0x42-20", query.CursorPrevious, 20)` $DIR/core/chains/evm/logpoller/parser_test.go: `.buildQuery(chainID, expressions, limiter)` $DIR/core/chains/evm/logpoller/parser_test.go: `.Run("query for finality", func(t *testing.T) { t.Parallel() t.Run("finalized", func(t *testing.T) { parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{query.Confidence(primitives.Finalized)} limiter := query.LimitAndSort{} result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "AND block_number <= (SELECT finalized_block_number FROM evm.log_poller_blocks WHERE evm_chain_id = :evm_chain_id ORDER BY block_number DESC LIMIT 1)" require.NoError(t, err) assert.Equal(t, expected, result) assertArgs(t, args, 1) }) t.Run("unconfirmed", func(t *testing.T) { parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{query.Confidence(primitives.Unconfirmed)} limiter := query.LimitAndSort{} result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "AND block_number <= (SELECT greatest(block_number - :confs_0, 0) FROM evm.log_poller_blocks WHERE evm_chain_id = :evm_chain_id ORDER BY block_number DESC LIMIT 1)" require.NoError(t, err) assert.Equal(t, expected, result) assertArgs(t, args, 2) }) t.Run("exact confirmations", func(t *testing.T) { parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{NewConfirmationsFilter(25)} limiter := query.LimitAndSort{} result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "AND block_number <= (SELECT greatest(block_number - :confs_0, 0) FROM evm.log_poller_blocks WHERE evm_chain_id = :evm_chain_id ORDER BY block_number DESC LIMIT 1)" require.NoError(t, err) assert.Equal(t, expected, result) confirmations, ok := args.args["confs_0"] require.True(t, ok) require.Equal(t, uint64(25), confirmations) assertArgs(t, args, 2) }) })` $DIR/core/chains/evm/logpoller/parser_test.go: `.Run("finalized", func(t *testing.T) { parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{query.Confidence(primitives.Finalized)} limiter := query.LimitAndSort{} result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "AND block_number <= (SELECT finalized_block_number FROM evm.log_poller_blocks WHERE evm_chain_id = :evm_chain_id ORDER BY block_number DESC LIMIT 1)" require.NoError(t, err) assert.Equal(t, expected, result) assertArgs(t, args, 1) })` $DIR/core/chains/evm/logpoller/parser_test.go: `.NewInt(1)` $DIR/core/chains/evm/logpoller/parser_test.go: `.Confidence(primitives.Finalized)` $DIR/core/chains/evm/logpoller/parser_test.go: `.buildQuery(chainID, expressions, limiter)` $DIR/core/chains/evm/logpoller/parser_test.go: `.Run("unconfirmed", func(t *testing.T) { parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{query.Confidence(primitives.Unconfirmed)} limiter := query.LimitAndSort{} result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "AND block_number <= (SELECT greatest(block_number - :confs_0, 0) FROM evm.log_poller_blocks WHERE evm_chain_id = :evm_chain_id ORDER BY block_number DESC LIMIT 1)" require.NoError(t, err) assert.Equal(t, expected, result) assertArgs(t, args, 2) })` $DIR/core/chains/evm/logpoller/parser_test.go: `.NewInt(1)` $DIR/core/chains/evm/logpoller/parser_test.go: `.Confidence(primitives.Unconfirmed)` $DIR/core/chains/evm/logpoller/parser_test.go: `.buildQuery(chainID, expressions, limiter)` $DIR/core/chains/evm/logpoller/parser_test.go: `.Run("exact confirmations", func(t *testing.T) { parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{NewConfirmationsFilter(25)} limiter := query.LimitAndSort{} result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "AND block_number <= (SELECT greatest(block_number - :confs_0, 0) FROM evm.log_poller_blocks WHERE evm_chain_id = :evm_chain_id ORDER BY block_number DESC LIMIT 1)" require.NoError(t, err) assert.Equal(t, expected, result) confirmations, ok := args.args["confs_0"] require.True(t, ok) require.Equal(t, uint64(25), confirmations) assertArgs(t, args, 2) })` $DIR/core/chains/evm/logpoller/parser_test.go: `.NewInt(1)` $DIR/core/chains/evm/logpoller/parser_test.go: `.buildQuery(chainID, expressions, limiter)` $DIR/core/chains/evm/logpoller/parser_test.go: `.Run("query for event by word", func(t *testing.T) { t.Parallel() wordFilter := NewEventByWordFilter(common.HexToHash("0x42"), 8, []primitives.ValueComparator{ {Value: "", Operator: primitives.Gt}, }) parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{wordFilter} limiter := query.LimitAndSort{} result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "AND substring(data from 32*:word_index_0+1 for 32) > :word_value_0" require.NoError(t, err) assert.Equal(t, expected, result) assertArgs(t, args, 3) })` $DIR/core/chains/evm/logpoller/parser_test.go: `.HexToHash("0x42")` $DIR/core/chains/evm/logpoller/parser_test.go: `.NewInt(1)` $DIR/core/chains/evm/logpoller/parser_test.go: `.buildQuery(chainID, expressions, limiter)` $DIR/core/chains/evm/logpoller/parser_test.go: `.Run("query for event topic", func(t *testing.T) { t.Parallel() topicFilter := NewEventByTopicFilter(2, []primitives.ValueComparator{ {Value: "a", Operator: primitives.Gt}, {Value: "b", Operator: primitives.Lt}, }) parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{topicFilter} limiter := query.LimitAndSort{} result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "AND topics[:topic_index_0] > :topic_value_0 AND topics[:topic_index_0] < :topic_value_1" require.NoError(t, err) assert.Equal(t, expected, result) assertArgs(t, args, 4) })` $DIR/core/chains/evm/logpoller/parser_test.go: `.NewInt(1)` $DIR/core/chains/evm/logpoller/parser_test.go: `.buildQuery(chainID, expressions, limiter)` $DIR/core/chains/evm/logpoller/parser_test.go: `.Run("nested query", func(t *testing.T) { t.Parallel() parser := &pgDSLParser{} chainID := big.NewInt(1) expressions := []query.Expression{ {BoolExpression: query.BoolExpression{ Expressions: []query.Expression{ query.Timestamp(10, primitives.Gte), {BoolExpression: query.BoolExpression{ Expressions: []query.Expression{ query.TxHash(common.HexToHash("0x84").Hex()), query.Confidence(primitives.Unconfirmed), }, BoolOperator: query.OR, }}, }, BoolOperator: query.AND, }}, } limiter := query.LimitAndSort{} result, args, err := parser.buildQuery(chainID, expressions, limiter) expected := "SELECT evm.logs.* " + "FROM evm.logs " + "WHERE evm_chain_id = :evm_chain_id " + "AND (block_timestamp >= :block_timestamp_0 " + "AND (tx_hash = :tx_hash_0 " + "OR block_number <= (SELECT greatest(block_number - :confs_0, 0) FROM evm.log_poller_blocks WHERE evm_chain_id = :evm_chain_id ORDER BY block_number DESC LIMIT 1)))" require.NoError(t, err) assert.Equal(t, expected, result) assertArgs(t, args, 4) })` $DIR/core/chains/evm/logpoller/parser_test.go: `.NewInt(1)` $DIR/core/chains/evm/logpoller/parser_test.go: `.Timestamp(10, primitives.Gte)` $DIR/core/chains/evm/logpoller/parser_test.go: `.TxHash(common.HexToHash("0x84").Hex())` $DIR/core/chains/evm/logpoller/parser_test.go: `.HexToHash("0x84")` $DIR/core/chains/evm/logpoller/parser_test.go: `.Hex()` $DIR/core/chains/evm/logpoller/parser_test.go: `.Confidence(primitives.Unconfirmed)` $DIR/core/chains/evm/logpoller/parser_test.go: `.buildQuery(chainID, expressions, limiter)` $DIR/core/chains/evm/logpoller/parser_test.go: `.HexToHash("0x42")` $DIR/core/chains/evm/logpoller/parser_test.go: `.NewInt(1)` $DIR/core/chains/evm/logpoller/parser_test.go: `.Timestamp(10, primitives.Eq)` $DIR/core/chains/evm/logpoller/parser_test.go: `.TxHash(common.HexToHash("0x84").Hex())` $DIR/core/chains/evm/logpoller/parser_test.go: `.HexToHash("0x84")` $DIR/core/chains/evm/logpoller/parser_test.go: `.Hex()` $DIR/core/chains/evm/logpoller/parser_test.go: `.Confidence(primitives.Unconfirmed)` $DIR/core/chains/evm/logpoller/parser_test.go: `.buildQuery(chainID, expressions, limiter)` $DIR/core/chains/evm/logpoller/query_test.go: `t.Run(tt.name, func(t *testing.T) { args, err := tt.queryArgs.toArgs() if tt.wantErr { require.Error(t, err) } else { require.NoError(t, err) require.Equal(t, tt.want, args) } })` $DIR/core/chains/evm/logpoller/query_test.go: `.NewInt(20)` $DIR/core/chains/evm/logpoller/query_test.go: `.withAddress(utils.ZeroAddress)` $DIR/core/chains/evm/logpoller/query_test.go: `.NewI(20)` $DIR/core/chains/evm/logpoller/query_test.go: `.NewInt(20)` $DIR/core/chains/evm/logpoller/query_test.go: `.withTopicIndex(0)` $DIR/core/chains/evm/logpoller/query_test.go: `.withField("arg", "value")` $DIR/core/chains/evm/logpoller/query_test.go: `.withField("hash", common.Hash{})` $DIR/core/chains/evm/logpoller/query_test.go: `.withEventSigArray([]common.Hash{{}, {}})` $DIR/core/chains/evm/logpoller/query_test.go: `.withTopicIndex(2)` $DIR/core/chains/evm/logpoller/query_test.go: `.Run(tt.name, func(t *testing.T) { args, err := tt.queryArgs.toArgs() if tt.wantErr { require.Error(t, err) } else { require.NoError(t, err) require.Equal(t, tt.want, args) } })` $DIR/core/chains/evm/logpoller/query_test.go: `.queryArgs.toArgs()` $DIR/core/chains/evm/monitor/balance_test.go: `t.Run("updates balance from nil for multiple keys", func(t *testing.T) { ethKeyStore := ksmocks.NewEth(t) k0Addr := testutils.NewAddress() k1Addr := testutils.NewAddress() ethKeyStore.On("EnabledAddressesForChain", mock.Anything, mock.Anything). Return([]common.Address{k0Addr, k1Addr}, nil) ethClient := newEthClientMock(t) bm := monitor.NewBalanceMonitor(ethClient, ethKeyStore, logger.Test(t)) k0bal := big.NewInt(42) k1bal := big.NewInt(43) assert.Nil(t, bm.GetEthBalance(k0Addr)) assert.Nil(t, bm.GetEthBalance(k1Addr)) ethClient.On("BalanceAt", mock.Anything, k0Addr, nilBigInt).Once().Return(k0bal, nil) ethClient.On("BalanceAt", mock.Anything, k1Addr, nilBigInt).Once().Return(k1bal, nil) servicetest.RunHealthy(t, bm) gomega.NewWithT(t).Eventually(func() *big.Int { return bm.GetEthBalance(k0Addr).ToInt() }).Should(gomega.Equal(k0bal)) gomega.NewWithT(t).Eventually(func() *big.Int { return bm.GetEthBalance(k1Addr).ToInt() }).Should(gomega.Equal(k1bal)) })` $DIR/core/chains/evm/monitor/balance_test.go: `ethKeyStore.On("EnabledAddressesForChain", mock.Anything, mock.Anything). Return([]common.Address{k0Addr, k1Addr}, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `ethClient.On("BalanceAt", mock.Anything, k0Addr, nilBigInt).Once().Return(k0bal, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `ethClient.On("BalanceAt", mock.Anything, k1Addr, nilBigInt).Once().Return(k1bal, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `servicetest.RunHealthy(t, bm)` $DIR/core/chains/evm/monitor/balance_test.go: `gomega.NewWithT(t).Eventually(func() *big.Int { return bm.GetEthBalance(k0Addr).ToInt() }).Should(gomega.Equal(k0bal))` $DIR/core/chains/evm/monitor/balance_test.go: `gomega.NewWithT(t).Eventually(func() *big.Int { return bm.GetEthBalance(k1Addr).ToInt() }).Should(gomega.Equal(k1bal))` $DIR/core/chains/evm/monitor/balance_test.go: `t.Run("handles nil head", func(t *testing.T) { ethKeyStore := ksmocks.NewEth(t) k0Addr := testutils.NewAddress() ethKeyStore.On("EnabledAddressesForChain", mock.Anything, mock.Anything). Return([]common.Address{k0Addr}, nil) ethClient := newEthClientMock(t) bm := monitor.NewBalanceMonitor(ethClient, ethKeyStore, logger.Test(t)) k0bal := big.NewInt(42) ethClient.On("BalanceAt", mock.Anything, k0Addr, nilBigInt).Once().Return(k0bal, nil) servicetest.RunHealthy(t, bm) gomega.NewWithT(t).Eventually(func() *big.Int { return bm.GetEthBalance(k0Addr).ToInt() }).Should(gomega.Equal(k0bal)) })` $DIR/core/chains/evm/monitor/balance_test.go: `ethKeyStore.On("EnabledAddressesForChain", mock.Anything, mock.Anything). Return([]common.Address{k0Addr}, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `ethClient.On("BalanceAt", mock.Anything, k0Addr, nilBigInt).Once().Return(k0bal, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `servicetest.RunHealthy(t, bm)` $DIR/core/chains/evm/monitor/balance_test.go: `gomega.NewWithT(t).Eventually(func() *big.Int { return bm.GetEthBalance(k0Addr).ToInt() }).Should(gomega.Equal(k0bal))` $DIR/core/chains/evm/monitor/balance_test.go: `t.Run("cancelled context", func(t *testing.T) { ethKeyStore := ksmocks.NewEth(t) k0Addr := testutils.NewAddress() ethKeyStore.On("EnabledAddressesForChain", mock.Anything, mock.Anything). Return([]common.Address{k0Addr}, nil) ethClient := newEthClientMock(t) bm := monitor.NewBalanceMonitor(ethClient, ethKeyStore, logger.Test(t)) ctxCancelledAwaiter := testutils.NewAwaiter() ethClient.On("BalanceAt", mock.Anything, k0Addr, nilBigInt).Once().Run(func(args mock.Arguments) { ctx := args.Get(0).(context.Context) select { case <-time.After(tests.WaitTimeout(t)): case <-ctx.Done(): ctxCancelledAwaiter.ItHappened() } }).Return(nil, nil) ctx, cancel := context.WithCancel(tests.Context(t)) go func() { <-time.After(time.Second) cancel() }() assert.NoError(t, bm.Start(ctx)) ctxCancelledAwaiter.AwaitOrFail(t) })` $DIR/core/chains/evm/monitor/balance_test.go: `ethKeyStore.On("EnabledAddressesForChain", mock.Anything, mock.Anything). Return([]common.Address{k0Addr}, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `ethClient.On("BalanceAt", mock.Anything, k0Addr, nilBigInt).Once().Run(func(args mock.Arguments) { ctx := args.Get(0).(context.Context) select { case <-time.After(tests.WaitTimeout(t)): case <-ctx.Done(): ctxCancelledAwaiter.ItHappened() } }).Return(nil, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `ctxCancelledAwaiter.ItHappened()` $DIR/core/chains/evm/monitor/balance_test.go: `<-time.After(time.Second)` $DIR/core/chains/evm/monitor/balance_test.go: `cancel()` $DIR/core/chains/evm/monitor/balance_test.go: `ctxCancelledAwaiter.AwaitOrFail(t)` $DIR/core/chains/evm/monitor/balance_test.go: `ethKeyStore.On("EnabledAddressesForChain", mock.Anything, mock.Anything). Return([]common.Address{k0Addr}, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `ethClient.On("BalanceAt", mock.Anything, k0Addr, nilBigInt). Once(). Return(nil, pkgerrors.New("a little easter egg for the 4chan link marines error"))` $DIR/core/chains/evm/monitor/balance_test.go: `servicetest.RunHealthy(t, bm)` $DIR/core/chains/evm/monitor/balance_test.go: `gomega.NewWithT(t).Consistently(func() *big.Int { return bm.GetEthBalance(k0Addr).ToInt() }).Should(gomega.BeNil())` $DIR/core/chains/evm/monitor/balance_test.go: `ethKeyStore.On("EnabledAddressesForChain", mock.Anything, mock.Anything). Return([]common.Address{k0Addr, k1Addr}, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `k1bal.SetString("19223372036854776000", 10)` $DIR/core/chains/evm/monitor/balance_test.go: `ethClient.On("BalanceAt", mock.Anything, k0Addr, nilBigInt).Once().Return(k0bal, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `ethClient.On("BalanceAt", mock.Anything, k1Addr, nilBigInt).Once().Return(k1bal, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `servicetest.RunHealthy(t, bm)` $DIR/core/chains/evm/monitor/balance_test.go: `ethClient.On("BalanceAt", mock.Anything, k0Addr, nilBigInt).Once().Return(k0bal, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `ethClient.On("BalanceAt", mock.Anything, k1Addr, nilBigInt).Once().Return(k1bal, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `bm.OnNewLongestChain(tests.Context(t), head)` $DIR/core/chains/evm/monitor/balance_test.go: `<-bm.WorkDone()` $DIR/core/chains/evm/monitor/balance_test.go: `head = testutils.Head(1)` $DIR/core/chains/evm/monitor/balance_test.go: `ethClient.On("BalanceAt", mock.Anything, k0Addr, nilBigInt).Once().Return(k0bal2, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `ethClient.On("BalanceAt", mock.Anything, k1Addr, nilBigInt).Once().Return(k1bal2, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `bm.OnNewLongestChain(tests.Context(t), head)` $DIR/core/chains/evm/monitor/balance_test.go: `<-bm.WorkDone()` $DIR/core/chains/evm/monitor/balance_test.go: `ethKeyStore.On("EnabledAddressesForChain", mock.Anything, mock.Anything). Return([]common.Address{testutils.NewAddress()}, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `ethClient.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything). Once(). Return(big.NewInt(1), nil)` $DIR/core/chains/evm/monitor/balance_test.go: `servicetest.RunHealthy(t, bm)` $DIR/core/chains/evm/monitor/balance_test.go: `ethClient.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything). WaitUntil(mockUnblocker). Once(). Return(big.NewInt(42), nil)` $DIR/core/chains/evm/monitor/balance_test.go: `ethClient.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything). Run(func(mock.Arguments) { callCount.Add(1) }). Maybe(). Return(big.NewInt(42), nil)` $DIR/core/chains/evm/monitor/balance_test.go: `callCount.Add(1)` $DIR/core/chains/evm/monitor/balance_test.go: `bm.OnNewLongestChain(tests.Context(t), head)` $DIR/core/chains/evm/monitor/balance_test.go: `callbackOrTimeout(t, "FewerRPCCallsWhenBehind unblock BalanceAt", func() { mockUnblocker <- time.Time{} })` $DIR/core/chains/evm/monitor/balance_test.go: `mockUnblocker <- time.Time{}` $DIR/core/chains/evm/monitor/balance_test.go: `t.Run(test.name, func(t *testing.T) { eth := assets.NewEth(0) eth.SetString(test.input, 10) float, err := monitor.ApproximateFloat64(eth) require.NoError(t, err) require.Equal(t, test.want, float) })` $DIR/core/chains/evm/monitor/balance_test.go: `eth.SetString(test.input, 10)` $DIR/core/chains/evm/monitor/balance_test.go: `.Run("updates balance from nil for multiple keys", func(t *testing.T) { ethKeyStore := ksmocks.NewEth(t) k0Addr := testutils.NewAddress() k1Addr := testutils.NewAddress() ethKeyStore.On("EnabledAddressesForChain", mock.Anything, mock.Anything). Return([]common.Address{k0Addr, k1Addr}, nil) ethClient := newEthClientMock(t) bm := monitor.NewBalanceMonitor(ethClient, ethKeyStore, logger.Test(t)) k0bal := big.NewInt(42) k1bal := big.NewInt(43) assert.Nil(t, bm.GetEthBalance(k0Addr)) assert.Nil(t, bm.GetEthBalance(k1Addr)) ethClient.On("BalanceAt", mock.Anything, k0Addr, nilBigInt).Once().Return(k0bal, nil) ethClient.On("BalanceAt", mock.Anything, k1Addr, nilBigInt).Once().Return(k1bal, nil) servicetest.RunHealthy(t, bm) gomega.NewWithT(t).Eventually(func() *big.Int { return bm.GetEthBalance(k0Addr).ToInt() }).Should(gomega.Equal(k0bal)) gomega.NewWithT(t).Eventually(func() *big.Int { return bm.GetEthBalance(k1Addr).ToInt() }).Should(gomega.Equal(k1bal)) })` $DIR/core/chains/evm/monitor/balance_test.go: `.NewEth(t)` $DIR/core/chains/evm/monitor/balance_test.go: `.NewAddress()` $DIR/core/chains/evm/monitor/balance_test.go: `.NewAddress()` $DIR/core/chains/evm/monitor/balance_test.go: `.On("EnabledAddressesForChain", mock.Anything, mock.Anything)` $DIR/core/chains/evm/monitor/balance_test.go: `. Return([]common.Address{k0Addr, k1Addr}, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `.NewBalanceMonitor(ethClient, ethKeyStore, logger.Test(t))` $DIR/core/chains/evm/monitor/balance_test.go: `.Test(t)` $DIR/core/chains/evm/monitor/balance_test.go: `.NewInt(42)` $DIR/core/chains/evm/monitor/balance_test.go: `.NewInt(43)` $DIR/core/chains/evm/monitor/balance_test.go: `.On("BalanceAt", mock.Anything, k0Addr, nilBigInt)` $DIR/core/chains/evm/monitor/balance_test.go: `.Once()` $DIR/core/chains/evm/monitor/balance_test.go: `.Return(k0bal, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `.On("BalanceAt", mock.Anything, k1Addr, nilBigInt)` $DIR/core/chains/evm/monitor/balance_test.go: `.Once()` $DIR/core/chains/evm/monitor/balance_test.go: `.Return(k1bal, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `.RunHealthy(t, bm)` $DIR/core/chains/evm/monitor/balance_test.go: `.NewWithT(t)` $DIR/core/chains/evm/monitor/balance_test.go: `.Eventually(func() *big.Int { return bm.GetEthBalance(k0Addr).ToInt() })` $DIR/core/chains/evm/monitor/balance_test.go: `.GetEthBalance(k0Addr)` $DIR/core/chains/evm/monitor/balance_test.go: `.ToInt()` $DIR/core/chains/evm/monitor/balance_test.go: `.Should(gomega.Equal(k0bal))` $DIR/core/chains/evm/monitor/balance_test.go: `.Equal(k0bal)` $DIR/core/chains/evm/monitor/balance_test.go: `.NewWithT(t)` $DIR/core/chains/evm/monitor/balance_test.go: `.Eventually(func() *big.Int { return bm.GetEthBalance(k1Addr).ToInt() })` $DIR/core/chains/evm/monitor/balance_test.go: `.GetEthBalance(k1Addr)` $DIR/core/chains/evm/monitor/balance_test.go: `.ToInt()` $DIR/core/chains/evm/monitor/balance_test.go: `.Should(gomega.Equal(k1bal))` $DIR/core/chains/evm/monitor/balance_test.go: `.Equal(k1bal)` $DIR/core/chains/evm/monitor/balance_test.go: `.Run("handles nil head", func(t *testing.T) { ethKeyStore := ksmocks.NewEth(t) k0Addr := testutils.NewAddress() ethKeyStore.On("EnabledAddressesForChain", mock.Anything, mock.Anything). Return([]common.Address{k0Addr}, nil) ethClient := newEthClientMock(t) bm := monitor.NewBalanceMonitor(ethClient, ethKeyStore, logger.Test(t)) k0bal := big.NewInt(42) ethClient.On("BalanceAt", mock.Anything, k0Addr, nilBigInt).Once().Return(k0bal, nil) servicetest.RunHealthy(t, bm) gomega.NewWithT(t).Eventually(func() *big.Int { return bm.GetEthBalance(k0Addr).ToInt() }).Should(gomega.Equal(k0bal)) })` $DIR/core/chains/evm/monitor/balance_test.go: `.NewEth(t)` $DIR/core/chains/evm/monitor/balance_test.go: `.NewAddress()` $DIR/core/chains/evm/monitor/balance_test.go: `.On("EnabledAddressesForChain", mock.Anything, mock.Anything)` $DIR/core/chains/evm/monitor/balance_test.go: `. Return([]common.Address{k0Addr}, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `.NewBalanceMonitor(ethClient, ethKeyStore, logger.Test(t))` $DIR/core/chains/evm/monitor/balance_test.go: `.Test(t)` $DIR/core/chains/evm/monitor/balance_test.go: `.NewInt(42)` $DIR/core/chains/evm/monitor/balance_test.go: `.On("BalanceAt", mock.Anything, k0Addr, nilBigInt)` $DIR/core/chains/evm/monitor/balance_test.go: `.Once()` $DIR/core/chains/evm/monitor/balance_test.go: `.Return(k0bal, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `.RunHealthy(t, bm)` $DIR/core/chains/evm/monitor/balance_test.go: `.NewWithT(t)` $DIR/core/chains/evm/monitor/balance_test.go: `.Eventually(func() *big.Int { return bm.GetEthBalance(k0Addr).ToInt() })` $DIR/core/chains/evm/monitor/balance_test.go: `.GetEthBalance(k0Addr)` $DIR/core/chains/evm/monitor/balance_test.go: `.ToInt()` $DIR/core/chains/evm/monitor/balance_test.go: `.Should(gomega.Equal(k0bal))` $DIR/core/chains/evm/monitor/balance_test.go: `.Equal(k0bal)` $DIR/core/chains/evm/monitor/balance_test.go: `.Run("cancelled context", func(t *testing.T) { ethKeyStore := ksmocks.NewEth(t) k0Addr := testutils.NewAddress() ethKeyStore.On("EnabledAddressesForChain", mock.Anything, mock.Anything). Return([]common.Address{k0Addr}, nil) ethClient := newEthClientMock(t) bm := monitor.NewBalanceMonitor(ethClient, ethKeyStore, logger.Test(t)) ctxCancelledAwaiter := testutils.NewAwaiter() ethClient.On("BalanceAt", mock.Anything, k0Addr, nilBigInt).Once().Run(func(args mock.Arguments) { ctx := args.Get(0).(context.Context) select { case <-time.After(tests.WaitTimeout(t)): case <-ctx.Done(): ctxCancelledAwaiter.ItHappened() } }).Return(nil, nil) ctx, cancel := context.WithCancel(tests.Context(t)) go func() { <-time.After(time.Second) cancel() }() assert.NoError(t, bm.Start(ctx)) ctxCancelledAwaiter.AwaitOrFail(t) })` $DIR/core/chains/evm/monitor/balance_test.go: `.NewEth(t)` $DIR/core/chains/evm/monitor/balance_test.go: `.NewAddress()` $DIR/core/chains/evm/monitor/balance_test.go: `.On("EnabledAddressesForChain", mock.Anything, mock.Anything)` $DIR/core/chains/evm/monitor/balance_test.go: `. Return([]common.Address{k0Addr}, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `.NewBalanceMonitor(ethClient, ethKeyStore, logger.Test(t))` $DIR/core/chains/evm/monitor/balance_test.go: `.Test(t)` $DIR/core/chains/evm/monitor/balance_test.go: `.NewAwaiter()` $DIR/core/chains/evm/monitor/balance_test.go: `.On("BalanceAt", mock.Anything, k0Addr, nilBigInt)` $DIR/core/chains/evm/monitor/balance_test.go: `.Once()` $DIR/core/chains/evm/monitor/balance_test.go: `.Run(func(args mock.Arguments) { ctx := args.Get(0).(context.Context) select { case <-time.After(tests.WaitTimeout(t)): case <-ctx.Done(): ctxCancelledAwaiter.ItHappened() } })` $DIR/core/chains/evm/monitor/balance_test.go: `.Get(0)` $DIR/core/chains/evm/monitor/balance_test.go: `.After(tests.WaitTimeout(t))` $DIR/core/chains/evm/monitor/balance_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/monitor/balance_test.go: `.Done()` $DIR/core/chains/evm/monitor/balance_test.go: `.ItHappened()` $DIR/core/chains/evm/monitor/balance_test.go: `.Return(nil, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `.WithCancel(tests.Context(t))` $DIR/core/chains/evm/monitor/balance_test.go: `.Context(t)` $DIR/core/chains/evm/monitor/balance_test.go: `.After(time.Second)` $DIR/core/chains/evm/monitor/balance_test.go: `.AwaitOrFail(t)` $DIR/core/chains/evm/monitor/balance_test.go: `.NewEth(t)` $DIR/core/chains/evm/monitor/balance_test.go: `.NewAddress()` $DIR/core/chains/evm/monitor/balance_test.go: `.On("EnabledAddressesForChain", mock.Anything, mock.Anything)` $DIR/core/chains/evm/monitor/balance_test.go: `. Return([]common.Address{k0Addr}, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `.NewBalanceMonitor(ethClient, ethKeyStore, logger.Test(t))` $DIR/core/chains/evm/monitor/balance_test.go: `.Test(t)` $DIR/core/chains/evm/monitor/balance_test.go: `.On("BalanceAt", mock.Anything, k0Addr, nilBigInt)` $DIR/core/chains/evm/monitor/balance_test.go: `. Once()` $DIR/core/chains/evm/monitor/balance_test.go: `. Return(nil, pkgerrors.New("a little easter egg for the 4chan link marines error"))` $DIR/core/chains/evm/monitor/balance_test.go: `.New("a little easter egg for the 4chan link marines error")` $DIR/core/chains/evm/monitor/balance_test.go: `.RunHealthy(t, bm)` $DIR/core/chains/evm/monitor/balance_test.go: `.NewWithT(t)` $DIR/core/chains/evm/monitor/balance_test.go: `.Consistently(func() *big.Int { return bm.GetEthBalance(k0Addr).ToInt() })` $DIR/core/chains/evm/monitor/balance_test.go: `.GetEthBalance(k0Addr)` $DIR/core/chains/evm/monitor/balance_test.go: `.ToInt()` $DIR/core/chains/evm/monitor/balance_test.go: `.Should(gomega.BeNil())` $DIR/core/chains/evm/monitor/balance_test.go: `.BeNil()` $DIR/core/chains/evm/monitor/balance_test.go: `.NewEth(t)` $DIR/core/chains/evm/monitor/balance_test.go: `.NewAddress()` $DIR/core/chains/evm/monitor/balance_test.go: `.NewAddress()` $DIR/core/chains/evm/monitor/balance_test.go: `.On("EnabledAddressesForChain", mock.Anything, mock.Anything)` $DIR/core/chains/evm/monitor/balance_test.go: `. Return([]common.Address{k0Addr, k1Addr}, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `.NewBalanceMonitor(ethClient, ethKeyStore, logger.Test(t))` $DIR/core/chains/evm/monitor/balance_test.go: `.Test(t)` $DIR/core/chains/evm/monitor/balance_test.go: `.NewInt(42)` $DIR/core/chains/evm/monitor/balance_test.go: `.NewInt(0)` $DIR/core/chains/evm/monitor/balance_test.go: `.SetString("19223372036854776000", 10)` $DIR/core/chains/evm/monitor/balance_test.go: `.Head(0)` $DIR/core/chains/evm/monitor/balance_test.go: `.On("BalanceAt", mock.Anything, k0Addr, nilBigInt)` $DIR/core/chains/evm/monitor/balance_test.go: `.Once()` $DIR/core/chains/evm/monitor/balance_test.go: `.Return(k0bal, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `.On("BalanceAt", mock.Anything, k1Addr, nilBigInt)` $DIR/core/chains/evm/monitor/balance_test.go: `.Once()` $DIR/core/chains/evm/monitor/balance_test.go: `.Return(k1bal, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `.RunHealthy(t, bm)` $DIR/core/chains/evm/monitor/balance_test.go: `.On("BalanceAt", mock.Anything, k0Addr, nilBigInt)` $DIR/core/chains/evm/monitor/balance_test.go: `.Once()` $DIR/core/chains/evm/monitor/balance_test.go: `.Return(k0bal, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `.On("BalanceAt", mock.Anything, k1Addr, nilBigInt)` $DIR/core/chains/evm/monitor/balance_test.go: `.Once()` $DIR/core/chains/evm/monitor/balance_test.go: `.Return(k1bal, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `.OnNewLongestChain(tests.Context(t), head)` $DIR/core/chains/evm/monitor/balance_test.go: `.Context(t)` $DIR/core/chains/evm/monitor/balance_test.go: `.WorkDone()` $DIR/core/chains/evm/monitor/balance_test.go: `.NewInt(142)` $DIR/core/chains/evm/monitor/balance_test.go: `.NewInt(142)` $DIR/core/chains/evm/monitor/balance_test.go: `.Head(1)` $DIR/core/chains/evm/monitor/balance_test.go: `.On("BalanceAt", mock.Anything, k0Addr, nilBigInt)` $DIR/core/chains/evm/monitor/balance_test.go: `.Once()` $DIR/core/chains/evm/monitor/balance_test.go: `.Return(k0bal2, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `.On("BalanceAt", mock.Anything, k1Addr, nilBigInt)` $DIR/core/chains/evm/monitor/balance_test.go: `.Once()` $DIR/core/chains/evm/monitor/balance_test.go: `.Return(k1bal2, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `.OnNewLongestChain(tests.Context(t), head)` $DIR/core/chains/evm/monitor/balance_test.go: `.Context(t)` $DIR/core/chains/evm/monitor/balance_test.go: `.WorkDone()` $DIR/core/chains/evm/monitor/balance_test.go: `.NewEth(t)` $DIR/core/chains/evm/monitor/balance_test.go: `.On("EnabledAddressesForChain", mock.Anything, mock.Anything)` $DIR/core/chains/evm/monitor/balance_test.go: `. Return([]common.Address{testutils.NewAddress()}, nil)` $DIR/core/chains/evm/monitor/balance_test.go: `.NewAddress()` $DIR/core/chains/evm/monitor/balance_test.go: `.NewBalanceMonitor(ethClient, ethKeyStore, logger.Test(t))` $DIR/core/chains/evm/monitor/balance_test.go: `.Test(t)` $DIR/core/chains/evm/monitor/balance_test.go: `.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/monitor/balance_test.go: `. Once()` $DIR/core/chains/evm/monitor/balance_test.go: `. Return(big.NewInt(1), nil)` $DIR/core/chains/evm/monitor/balance_test.go: `.NewInt(1)` $DIR/core/chains/evm/monitor/balance_test.go: `.RunHealthy(t, bm)` $DIR/core/chains/evm/monitor/balance_test.go: `.Head(0)` $DIR/core/chains/evm/monitor/balance_test.go: `.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/monitor/balance_test.go: `. WaitUntil(mockUnblocker)` $DIR/core/chains/evm/monitor/balance_test.go: `. Once()` $DIR/core/chains/evm/monitor/balance_test.go: `. Return(big.NewInt(42), nil)` $DIR/core/chains/evm/monitor/balance_test.go: `.NewInt(42)` $DIR/core/chains/evm/monitor/balance_test.go: `.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/monitor/balance_test.go: `. Run(func(mock.Arguments) { callCount.Add(1) })` $DIR/core/chains/evm/monitor/balance_test.go: `.Add(1)` $DIR/core/chains/evm/monitor/balance_test.go: `. Maybe()` $DIR/core/chains/evm/monitor/balance_test.go: `. Return(big.NewInt(42), nil)` $DIR/core/chains/evm/monitor/balance_test.go: `.NewInt(42)` $DIR/core/chains/evm/monitor/balance_test.go: `.OnNewLongestChain(tests.Context(t), head)` $DIR/core/chains/evm/monitor/balance_test.go: `.Context(t)` $DIR/core/chains/evm/monitor/balance_test.go: `.Load()` $DIR/core/chains/evm/monitor/balance_test.go: `.Run(test.name, func(t *testing.T) { eth := assets.NewEth(0) eth.SetString(test.input, 10) float, err := monitor.ApproximateFloat64(eth) require.NoError(t, err) require.Equal(t, test.want, float) })` $DIR/core/chains/evm/monitor/balance_test.go: `.NewEth(0)` $DIR/core/chains/evm/monitor/balance_test.go: `.SetString(test.input, 10)` $DIR/core/chains/evm/monitor/balance_test.go: `.ApproximateFloat64(eth)` $DIR/core/chains/evm/testutils/config_test.go: `c.FinalityDepth = &finalityDepth` $DIR/core/chains/evm/testutils/config_test.go: `.EVM()` $DIR/core/chains/evm/testutils/config_test.go: `.GasEstimator()` $DIR/core/chains/evm/testutils/config_test.go: `.EIP1559DynamicFees()` $DIR/core/chains/evm/txmgr/attempts_test.go: `t.Run("returns correct hash for non-okex chains", func(t *testing.T) { chainID := big.NewInt(1) kst := ksmocks.NewEth(t) kst.On("SignTx", mock.Anything, to, tx, chainID).Return(tx, nil).Once() cks := txmgr.NewEvmTxAttemptBuilder(*chainID, newFeeConfig(), kst, nil) hash, rawBytes, err := cks.SignTx(tests.Context(t), addr, tx) require.NoError(t, err) require.NotNil(t, rawBytes) require.Equal(t, "0xdd68f554373fdea7ec6713a6e437e7646465d553a6aa0b43233093366cc87ef0", hash.String()) })` $DIR/core/chains/evm/txmgr/attempts_test.go: `kst.On("SignTx", mock.Anything, to, tx, chainID).Return(tx, nil).Once()` $DIR/core/chains/evm/txmgr/attempts_test.go: `t.Run("returns correct hash for okex chains", func(t *testing.T) { chainID := big.NewInt(1) kst := ksmocks.NewEth(t) kst.On("SignTx", mock.Anything, to, tx, chainID).Return(tx, nil).Once() cks := txmgr.NewEvmTxAttemptBuilder(*chainID, newFeeConfig(), kst, nil) hash, rawBytes, err := cks.SignTx(tests.Context(t), addr, tx) require.NoError(t, err) require.NotNil(t, rawBytes) require.Equal(t, "0xdd68f554373fdea7ec6713a6e437e7646465d553a6aa0b43233093366cc87ef0", hash.String()) })` $DIR/core/chains/evm/txmgr/attempts_test.go: `kst.On("SignTx", mock.Anything, to, tx, chainID).Return(tx, nil).Once()` $DIR/core/chains/evm/txmgr/attempts_test.go: `t.Run("can properly encoded and decode raw transaction for LegacyTx", func(t *testing.T) { chainID := big.NewInt(1) kst := ksmocks.NewEth(t) kst.On("SignTx", mock.Anything, to, tx, chainID).Return(tx, nil).Once() cks := txmgr.NewEvmTxAttemptBuilder(*chainID, newFeeConfig(), kst, nil) _, rawBytes, err := cks.SignTx(tests.Context(t), addr, tx) require.NoError(t, err) require.NotNil(t, rawBytes) require.Equal(t, "0xe42a82015681f294b921f7763960b296b9cbad586ff066a18d749724818e83010203808080", hexutil.Encode(rawBytes)) var decodedTx *gethtypes.Transaction decodedTx, err = txmgr.GetGethSignedTx(rawBytes) require.NoError(t, err) require.Equal(t, tx.Hash(), decodedTx.Hash()) })` $DIR/core/chains/evm/txmgr/attempts_test.go: `kst.On("SignTx", mock.Anything, to, tx, chainID).Return(tx, nil).Once()` $DIR/core/chains/evm/txmgr/attempts_test.go: `decodedTx, err = txmgr.GetGethSignedTx(rawBytes)` $DIR/core/chains/evm/txmgr/attempts_test.go: `kst.On("SignTx", mock.Anything, to, typedTx, chainID).Return(typedTx, nil).Once()` $DIR/core/chains/evm/txmgr/attempts_test.go: `decodedTx, err = txmgr.GetGethSignedTx(rawBytes)` $DIR/core/chains/evm/txmgr/attempts_test.go: `kst.On("SignTx", mock.Anything, addr, mock.Anything, big.NewInt(1)).Return(tx, nil)` $DIR/core/chains/evm/txmgr/attempts_test.go: `t.Run("creates attempt with fields", func(t *testing.T) { feeCfg := newFeeConfig() feeCfg.priceMax = assets.GWei(200) cks := txmgr.NewEvmTxAttemptBuilder(*big.NewInt(1), feeCfg, kst, nil) dynamicFee := gas.DynamicFee{TipCap: assets.GWei(100), FeeCap: assets.GWei(200)} a, _, err := cks.NewCustomTxAttempt(tests.Context(t), txmgr.Tx{Sequence: &n, FromAddress: addr}, gas.EvmFee{ DynamicTipCap: dynamicFee.TipCap, DynamicFeeCap: dynamicFee.FeeCap, }, 100, 0x2, lggr) require.NoError(t, err) assert.Equal(t, 100, int(a.ChainSpecificFeeLimit)) assert.Nil(t, a.TxFee.Legacy) assert.NotNil(t, a.TxFee.DynamicTipCap) assert.Equal(t, assets.GWei(100).String(), a.TxFee.DynamicTipCap.String()) assert.NotNil(t, a.TxFee.DynamicFeeCap) assert.Equal(t, assets.GWei(200).String(), a.TxFee.DynamicFeeCap.String()) })` $DIR/core/chains/evm/txmgr/attempts_test.go: `feeCfg.priceMax = assets.GWei(200)` $DIR/core/chains/evm/txmgr/attempts_test.go: `c.GasEstimator.PriceMax = assets.GWei(4)` $DIR/core/chains/evm/txmgr/attempts_test.go: `c.GasEstimator.PriceMin = assets.GWei(6)` $DIR/core/chains/evm/txmgr/attempts_test.go: `c.GasEstimator.TipCapMin = assets.GWei(6)` $DIR/core/chains/evm/txmgr/attempts_test.go: `t.Run(test.name, func(t *testing.T) { cfg := testutils.NewTestChainScopedConfig(t, test.setCfg) cks := txmgr.NewEvmTxAttemptBuilder(*big.NewInt(1), cfg.EVM().GasEstimator(), kst, nil) dynamicFee := gas.DynamicFee{TipCap: test.tipcap, FeeCap: test.feecap} _, _, err := cks.NewCustomTxAttempt(tests.Context(t), txmgr.Tx{Sequence: &n, FromAddress: addr}, gas.EvmFee{ DynamicTipCap: dynamicFee.TipCap, DynamicFeeCap: dynamicFee.FeeCap, }, 100, 0x2, lggr) if test.expectError == "" { require.NoError(t, err) } else { require.ErrorContains(t, err, test.expectError) } })` $DIR/core/chains/evm/txmgr/attempts_test.go: `kst.On("SignTx", mock.Anything, addr, mock.Anything, big.NewInt(1)).Return(tx, nil)` $DIR/core/chains/evm/txmgr/attempts_test.go: `gc.priceMin = assets.NewWeiI(10)` $DIR/core/chains/evm/txmgr/attempts_test.go: `gc.priceMax = assets.NewWeiI(50)` $DIR/core/chains/evm/txmgr/attempts_test.go: `t.Run("creates attempt with fields", func(t *testing.T) { var n evmtypes.Nonce a, _, err := cks.NewCustomTxAttempt(tests.Context(t), txmgr.Tx{Sequence: &n, FromAddress: addr}, gas.EvmFee{Legacy: assets.NewWeiI(25)}, 100, 0x0, lggr) require.NoError(t, err) assert.Equal(t, 100, int(a.ChainSpecificFeeLimit)) assert.NotNil(t, a.TxFee.Legacy) assert.Equal(t, "25 wei", a.TxFee.Legacy.String()) assert.Nil(t, a.TxFee.DynamicTipCap) assert.Nil(t, a.TxFee.DynamicFeeCap) })` $DIR/core/chains/evm/txmgr/attempts_test.go: `kst.On("SignTx", mock.Anything, addr, mock.Anything, big.NewInt(1)).Return(tx, nil)` $DIR/core/chains/evm/txmgr/attempts_test.go: `gc.priceMin = assets.GWei(10)` $DIR/core/chains/evm/txmgr/attempts_test.go: `gc.priceMax = assets.GWei(50)` $DIR/core/chains/evm/txmgr/attempts_test.go: `gc.limitDefault = uint64(10)` $DIR/core/chains/evm/txmgr/attempts_test.go: `est.On("BumpFee", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(bumpedFee, uint64(10_000), nil)` $DIR/core/chains/evm/txmgr/attempts_test.go: `t.Run("creates legacy purge attempt with fields if previous attempt is legacy", func(t *testing.T) { n := evmtypes.Nonce(0) etx := txmgr.Tx{Sequence: &n, FromAddress: addr, EncodedPayload: []byte{1, 2, 3}} prevAttempt, _, err := cks.NewCustomTxAttempt(ctx, etx, gas.EvmFee{Legacy: bumpedLegacy.Sub(assets.GWei(1))}, 100, 0x0, lggr) require.NoError(t, err) etx.TxAttempts = append(etx.TxAttempts, prevAttempt) a, err := cks.NewPurgeTxAttempt(ctx, etx, lggr) require.NoError(t, err) // The fee limit is overridden with LimitDefault since purge attempts are just empty attempts require.Equal(t, gc.limitDefault, a.ChainSpecificFeeLimit) require.NotNil(t, a.TxFee.Legacy) require.Equal(t, bumpedLegacy.String(), a.TxFee.Legacy.String()) require.Nil(t, a.TxFee.DynamicTipCap) require.Nil(t, a.TxFee.DynamicFeeCap) require.Equal(t, true, a.IsPurgeAttempt) require.Equal(t, []byte{}, a.Tx.EncodedPayload) require.Equal(t, *big.NewInt(0), a.Tx.Value) })` $DIR/core/chains/evm/txmgr/attempts_test.go: `etx.TxAttempts = append(etx.TxAttempts, prevAttempt)` $DIR/core/chains/evm/txmgr/attempts_test.go: `t.Run("creates dynamic purge attempt with fields if previous attempt is dynamic", func(t *testing.T) { n := evmtypes.Nonce(0) etx := txmgr.Tx{Sequence: &n, FromAddress: addr, EncodedPayload: []byte{1, 2, 3}} prevAttempt, _, err := cks.NewCustomTxAttempt(ctx, etx, gas.EvmFee{DynamicTipCap: bumpedDynamicTip.Sub(assets.GWei(1)), DynamicFeeCap: bumpedDynamicFee.Sub(assets.GWei(1))}, 100, 0x2, lggr) require.NoError(t, err) etx.TxAttempts = append(etx.TxAttempts, prevAttempt) a, err := cks.NewPurgeTxAttempt(ctx, etx, lggr) require.NoError(t, err) // The fee limit is overridden with LimitDefault since purge attempts are just empty attempts require.Equal(t, gc.limitDefault, a.ChainSpecificFeeLimit) require.Nil(t, a.TxFee.Legacy) require.NotNil(t, a.TxFee.DynamicTipCap) require.NotNil(t, a.TxFee.DynamicFeeCap) require.Equal(t, bumpedDynamicTip.String(), a.TxFee.DynamicTipCap.String()) require.Equal(t, bumpedDynamicFee.String(), a.TxFee.DynamicFeeCap.String()) require.Equal(t, true, a.IsPurgeAttempt) require.Equal(t, []byte{}, a.Tx.EncodedPayload) require.Equal(t, *big.NewInt(0), a.Tx.Value) })` $DIR/core/chains/evm/txmgr/attempts_test.go: `etx.TxAttempts = append(etx.TxAttempts, prevAttempt)` $DIR/core/chains/evm/txmgr/attempts_test.go: `etx.TxAttempts = append(etx.TxAttempts, prevAttempt)` $DIR/core/chains/evm/txmgr/attempts_test.go: `etx.TxAttempts = append(etx.TxAttempts, purgeAttempt)` $DIR/core/chains/evm/txmgr/attempts_test.go: `t.Run("dynamic fee with legacy tx type", func(t *testing.T) { _, retryable, err := cks.NewCustomTxAttempt(tests.Context(t), txmgr.Tx{}, gas.EvmFee{ DynamicTipCap: dynamicFee.TipCap, DynamicFeeCap: dynamicFee.FeeCap, }, 100, 0x0, lggr) require.Error(t, err) assert.False(t, retryable) })` $DIR/core/chains/evm/txmgr/attempts_test.go: `t.Run("legacy fee with dynamic tx type", func(t *testing.T) { _, retryable, err := cks.NewCustomTxAttempt(tests.Context(t), txmgr.Tx{}, gas.EvmFee{Legacy: legacyFee}, 100, 0x2, lggr) require.Error(t, err) assert.False(t, retryable) })` $DIR/core/chains/evm/txmgr/attempts_test.go: `est.On("GetFee", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(gas.EvmFee{}, uint64(0), pkgerrors.New("fail"))` $DIR/core/chains/evm/txmgr/attempts_test.go: `est.On("BumpFee", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(gas.EvmFee{}, uint64(0), pkgerrors.New("fail"))` $DIR/core/chains/evm/txmgr/attempts_test.go: `t.Run("NewAttempt", func(t *testing.T) { _, _, _, retryable, err := cks.NewTxAttempt(ctx, txmgr.Tx{}, lggr) require.Error(t, err) assert.Contains(t, err.Error(), "failed to get fee") assert.True(t, retryable) })` $DIR/core/chains/evm/txmgr/attempts_test.go: `t.Run("NewAttemptWithType", func(t *testing.T) { _, _, _, retryable, err := cks.NewTxAttemptWithType(ctx, txmgr.Tx{}, lggr, 0x0) require.Error(t, err) assert.Contains(t, err.Error(), "failed to get fee") assert.True(t, retryable) })` $DIR/core/chains/evm/txmgr/attempts_test.go: `.HexToAddress("0xb921F7763960b296B9cbAD586ff066A18D749724")` $DIR/core/chains/evm/txmgr/attempts_test.go: `.HexToAddress("0xb921F7763960b296B9cbAD586ff066A18D749724")` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewTx(&gethtypes.LegacyTx{ Nonce: 42, To: &to, Value: big.NewInt(142), Gas: 242, GasPrice: big.NewInt(342), Data: []byte{1, 2, 3}, })` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewInt(142)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewInt(342)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Run("returns correct hash for non-okex chains", func(t *testing.T) { chainID := big.NewInt(1) kst := ksmocks.NewEth(t) kst.On("SignTx", mock.Anything, to, tx, chainID).Return(tx, nil).Once() cks := txmgr.NewEvmTxAttemptBuilder(*chainID, newFeeConfig(), kst, nil) hash, rawBytes, err := cks.SignTx(tests.Context(t), addr, tx) require.NoError(t, err) require.NotNil(t, rawBytes) require.Equal(t, "0xdd68f554373fdea7ec6713a6e437e7646465d553a6aa0b43233093366cc87ef0", hash.String()) })` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewInt(1)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewEth(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.On("SignTx", mock.Anything, to, tx, chainID)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Return(tx, nil)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Once()` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewEvmTxAttemptBuilder(*chainID, newFeeConfig(), kst, nil)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.SignTx(tests.Context(t), addr, tx)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Run("returns correct hash for okex chains", func(t *testing.T) { chainID := big.NewInt(1) kst := ksmocks.NewEth(t) kst.On("SignTx", mock.Anything, to, tx, chainID).Return(tx, nil).Once() cks := txmgr.NewEvmTxAttemptBuilder(*chainID, newFeeConfig(), kst, nil) hash, rawBytes, err := cks.SignTx(tests.Context(t), addr, tx) require.NoError(t, err) require.NotNil(t, rawBytes) require.Equal(t, "0xdd68f554373fdea7ec6713a6e437e7646465d553a6aa0b43233093366cc87ef0", hash.String()) })` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewInt(1)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewEth(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.On("SignTx", mock.Anything, to, tx, chainID)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Return(tx, nil)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Once()` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewEvmTxAttemptBuilder(*chainID, newFeeConfig(), kst, nil)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.SignTx(tests.Context(t), addr, tx)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Run("can properly encoded and decode raw transaction for LegacyTx", func(t *testing.T) { chainID := big.NewInt(1) kst := ksmocks.NewEth(t) kst.On("SignTx", mock.Anything, to, tx, chainID).Return(tx, nil).Once() cks := txmgr.NewEvmTxAttemptBuilder(*chainID, newFeeConfig(), kst, nil) _, rawBytes, err := cks.SignTx(tests.Context(t), addr, tx) require.NoError(t, err) require.NotNil(t, rawBytes) require.Equal(t, "0xe42a82015681f294b921f7763960b296b9cbad586ff066a18d749724818e83010203808080", hexutil.Encode(rawBytes)) var decodedTx *gethtypes.Transaction decodedTx, err = txmgr.GetGethSignedTx(rawBytes) require.NoError(t, err) require.Equal(t, tx.Hash(), decodedTx.Hash()) })` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewInt(1)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewEth(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.On("SignTx", mock.Anything, to, tx, chainID)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Return(tx, nil)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Once()` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewEvmTxAttemptBuilder(*chainID, newFeeConfig(), kst, nil)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.SignTx(tests.Context(t), addr, tx)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GetGethSignedTx(rawBytes)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewInt(1)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewEth(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewTx(&gethtypes.DynamicFeeTx{ Nonce: 42, To: &to, Value: big.NewInt(142), Gas: 242, Data: []byte{1, 2, 3}, })` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewInt(142)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.On("SignTx", mock.Anything, to, typedTx, chainID)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Return(typedTx, nil)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Once()` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewEvmTxAttemptBuilder(*chainID, newFeeConfig(), kst, nil)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.SignTx(tests.Context(t), addr, typedTx)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GetGethSignedTx(rawBytes)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewTx(&types.DynamicFeeTx{})` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewEth(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.On("SignTx", mock.Anything, addr, mock.Anything, big.NewInt(1))` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewInt(1)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Return(tx, nil)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Run("creates attempt with fields", func(t *testing.T) { feeCfg := newFeeConfig() feeCfg.priceMax = assets.GWei(200) cks := txmgr.NewEvmTxAttemptBuilder(*big.NewInt(1), feeCfg, kst, nil) dynamicFee := gas.DynamicFee{TipCap: assets.GWei(100), FeeCap: assets.GWei(200)} a, _, err := cks.NewCustomTxAttempt(tests.Context(t), txmgr.Tx{Sequence: &n, FromAddress: addr}, gas.EvmFee{ DynamicTipCap: dynamicFee.TipCap, DynamicFeeCap: dynamicFee.FeeCap, }, 100, 0x2, lggr) require.NoError(t, err) assert.Equal(t, 100, int(a.ChainSpecificFeeLimit)) assert.Nil(t, a.TxFee.Legacy) assert.NotNil(t, a.TxFee.DynamicTipCap) assert.Equal(t, assets.GWei(100).String(), a.TxFee.DynamicTipCap.String()) assert.NotNil(t, a.TxFee.DynamicFeeCap) assert.Equal(t, assets.GWei(200).String(), a.TxFee.DynamicFeeCap.String()) })` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(200)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewEvmTxAttemptBuilder(*big.NewInt(1), feeCfg, kst, nil)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewInt(1)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(100)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(200)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewCustomTxAttempt(tests.Context(t), txmgr.Tx{Sequence: &n, FromAddress: addr}, gas.EvmFee{ DynamicTipCap: dynamicFee.TipCap, DynamicFeeCap: dynamicFee.FeeCap, }, 100, 0x2, lggr)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(5)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(5)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(4)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(5)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(6)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(5)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(5)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(5)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(4)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(5)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(5)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(6)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(5)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(5)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(6)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Run(test.name, func(t *testing.T) { cfg := testutils.NewTestChainScopedConfig(t, test.setCfg) cks := txmgr.NewEvmTxAttemptBuilder(*big.NewInt(1), cfg.EVM().GasEstimator(), kst, nil) dynamicFee := gas.DynamicFee{TipCap: test.tipcap, FeeCap: test.feecap} _, _, err := cks.NewCustomTxAttempt(tests.Context(t), txmgr.Tx{Sequence: &n, FromAddress: addr}, gas.EvmFee{ DynamicTipCap: dynamicFee.TipCap, DynamicFeeCap: dynamicFee.FeeCap, }, 100, 0x2, lggr) if test.expectError == "" { require.NoError(t, err) } else { require.ErrorContains(t, err, test.expectError) } })` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewTestChainScopedConfig(t, test.setCfg)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewEvmTxAttemptBuilder(*big.NewInt(1), cfg.EVM().GasEstimator(), kst, nil)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewInt(1)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewCustomTxAttempt(tests.Context(t), txmgr.Tx{Sequence: &n, FromAddress: addr}, gas.EvmFee{ DynamicTipCap: dynamicFee.TipCap, DynamicFeeCap: dynamicFee.FeeCap, }, 100, 0x2, lggr)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewEth(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewTx(&types.LegacyTx{})` $DIR/core/chains/evm/txmgr/attempts_test.go: `.On("SignTx", mock.Anything, addr, mock.Anything, big.NewInt(1))` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewInt(1)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Return(tx, nil)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewWeiI(50)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewEvmTxAttemptBuilder(*big.NewInt(1), gc, kst, nil)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewInt(1)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Run("creates attempt with fields", func(t *testing.T) { var n evmtypes.Nonce a, _, err := cks.NewCustomTxAttempt(tests.Context(t), txmgr.Tx{Sequence: &n, FromAddress: addr}, gas.EvmFee{Legacy: assets.NewWeiI(25)}, 100, 0x0, lggr) require.NoError(t, err) assert.Equal(t, 100, int(a.ChainSpecificFeeLimit)) assert.NotNil(t, a.TxFee.Legacy) assert.Equal(t, "25 wei", a.TxFee.Legacy.String()) assert.Nil(t, a.TxFee.DynamicTipCap) assert.Nil(t, a.TxFee.DynamicFeeCap) })` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewCustomTxAttempt(tests.Context(t), txmgr.Tx{Sequence: &n, FromAddress: addr}, gas.EvmFee{Legacy: assets.NewWeiI(25)}, 100, 0x0, lggr)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewWeiI(25)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewCustomTxAttempt(tests.Context(t), txmgr.Tx{FromAddress: addr}, gas.EvmFee{Legacy: assets.NewWeiI(100)}, 100, 0x0, lggr)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewEth(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewTx(&types.LegacyTx{})` $DIR/core/chains/evm/txmgr/attempts_test.go: `.On("SignTx", mock.Anything, addr, mock.Anything, big.NewInt(1))` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewInt(1)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Return(tx, nil)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(10)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(50)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewEvmFeeEstimator(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(30)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(15)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(10)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.On("BumpFee", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Return(bumpedFee, uint64(10_000), nil)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewEvmTxAttemptBuilder(*big.NewInt(1), gc, kst, est)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewInt(1)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Run("creates legacy purge attempt with fields if previous attempt is legacy", func(t *testing.T) { n := evmtypes.Nonce(0) etx := txmgr.Tx{Sequence: &n, FromAddress: addr, EncodedPayload: []byte{1, 2, 3}} prevAttempt, _, err := cks.NewCustomTxAttempt(ctx, etx, gas.EvmFee{Legacy: bumpedLegacy.Sub(assets.GWei(1))}, 100, 0x0, lggr) require.NoError(t, err) etx.TxAttempts = append(etx.TxAttempts, prevAttempt) a, err := cks.NewPurgeTxAttempt(ctx, etx, lggr) require.NoError(t, err) // The fee limit is overridden with LimitDefault since purge attempts are just empty attempts require.Equal(t, gc.limitDefault, a.ChainSpecificFeeLimit) require.NotNil(t, a.TxFee.Legacy) require.Equal(t, bumpedLegacy.String(), a.TxFee.Legacy.String()) require.Nil(t, a.TxFee.DynamicTipCap) require.Nil(t, a.TxFee.DynamicFeeCap) require.Equal(t, true, a.IsPurgeAttempt) require.Equal(t, []byte{}, a.Tx.EncodedPayload) require.Equal(t, *big.NewInt(0), a.Tx.Value) })` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Nonce(0)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewCustomTxAttempt(ctx, etx, gas.EvmFee{Legacy: bumpedLegacy.Sub(assets.GWei(1))}, 100, 0x0, lggr)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Sub(assets.GWei(1))` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(1)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewPurgeTxAttempt(ctx, etx, lggr)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Run("creates dynamic purge attempt with fields if previous attempt is dynamic", func(t *testing.T) { n := evmtypes.Nonce(0) etx := txmgr.Tx{Sequence: &n, FromAddress: addr, EncodedPayload: []byte{1, 2, 3}} prevAttempt, _, err := cks.NewCustomTxAttempt(ctx, etx, gas.EvmFee{DynamicTipCap: bumpedDynamicTip.Sub(assets.GWei(1)), DynamicFeeCap: bumpedDynamicFee.Sub(assets.GWei(1))}, 100, 0x2, lggr) require.NoError(t, err) etx.TxAttempts = append(etx.TxAttempts, prevAttempt) a, err := cks.NewPurgeTxAttempt(ctx, etx, lggr) require.NoError(t, err) // The fee limit is overridden with LimitDefault since purge attempts are just empty attempts require.Equal(t, gc.limitDefault, a.ChainSpecificFeeLimit) require.Nil(t, a.TxFee.Legacy) require.NotNil(t, a.TxFee.DynamicTipCap) require.NotNil(t, a.TxFee.DynamicFeeCap) require.Equal(t, bumpedDynamicTip.String(), a.TxFee.DynamicTipCap.String()) require.Equal(t, bumpedDynamicFee.String(), a.TxFee.DynamicFeeCap.String()) require.Equal(t, true, a.IsPurgeAttempt) require.Equal(t, []byte{}, a.Tx.EncodedPayload) require.Equal(t, *big.NewInt(0), a.Tx.Value) })` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Nonce(0)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewCustomTxAttempt(ctx, etx, gas.EvmFee{DynamicTipCap: bumpedDynamicTip.Sub(assets.GWei(1)), DynamicFeeCap: bumpedDynamicFee.Sub(assets.GWei(1))}, 100, 0x2, lggr)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Sub(assets.GWei(1))` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(1)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Sub(assets.GWei(1))` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(1)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewPurgeTxAttempt(ctx, etx, lggr)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Nonce(0)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewCustomTxAttempt(ctx, etx, gas.EvmFee{Legacy: bumpedLegacy.Sub(assets.GWei(1))}, 100, 0x0, lggr)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Sub(assets.GWei(1))` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(1)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewPurgeTxAttempt(ctx, etx, lggr)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewBumpTxAttempt(ctx, etx, purgeAttempt, etx.TxAttempts, lggr)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewEth(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewEvmTxAttemptBuilder(*big.NewInt(1), newFeeConfig(), kst, nil)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewInt(1)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(100)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.GWei(200)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Run("dynamic fee with legacy tx type", func(t *testing.T) { _, retryable, err := cks.NewCustomTxAttempt(tests.Context(t), txmgr.Tx{}, gas.EvmFee{ DynamicTipCap: dynamicFee.TipCap, DynamicFeeCap: dynamicFee.FeeCap, }, 100, 0x0, lggr) require.Error(t, err) assert.False(t, retryable) })` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewCustomTxAttempt(tests.Context(t), txmgr.Tx{}, gas.EvmFee{ DynamicTipCap: dynamicFee.TipCap, DynamicFeeCap: dynamicFee.FeeCap, }, 100, 0x0, lggr)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Run("legacy fee with dynamic tx type", func(t *testing.T) { _, retryable, err := cks.NewCustomTxAttempt(tests.Context(t), txmgr.Tx{}, gas.EvmFee{Legacy: legacyFee}, 100, 0x2, lggr) require.Error(t, err) assert.False(t, retryable) })` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewCustomTxAttempt(tests.Context(t), txmgr.Tx{}, gas.EvmFee{Legacy: legacyFee}, 100, 0x2, lggr)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewCustomTxAttempt(tests.Context(t), txmgr.Tx{}, gas.EvmFee{}, 100, 0xA, lggr)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewEvmFeeEstimator(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.On("GetFee", mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Return(gas.EvmFee{}, uint64(0), pkgerrors.New("fail"))` $DIR/core/chains/evm/txmgr/attempts_test.go: `.New("fail")` $DIR/core/chains/evm/txmgr/attempts_test.go: `.On("BumpFee", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Return(gas.EvmFee{}, uint64(0), pkgerrors.New("fail"))` $DIR/core/chains/evm/txmgr/attempts_test.go: `.New("fail")` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewEth(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewEvmTxAttemptBuilder(*big.NewInt(1), &feeConfig{eip1559DynamicFees: true}, kst, est)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewInt(1)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Run("NewAttempt", func(t *testing.T) { _, _, _, retryable, err := cks.NewTxAttempt(ctx, txmgr.Tx{}, lggr) require.Error(t, err) assert.Contains(t, err.Error(), "failed to get fee") assert.True(t, retryable) })` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewTxAttempt(ctx, txmgr.Tx{}, lggr)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.Run("NewAttemptWithType", func(t *testing.T) { _, _, _, retryable, err := cks.NewTxAttemptWithType(ctx, txmgr.Tx{}, lggr, 0x0) require.Error(t, err) assert.Contains(t, err.Error(), "failed to get fee") assert.True(t, retryable) })` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewTxAttemptWithType(ctx, txmgr.Tx{}, lggr, 0x0)` $DIR/core/chains/evm/txmgr/attempts_test.go: `.NewBumpTxAttempt(ctx, txmgr.Tx{}, txmgr.TxAttempt{}, nil, lggr)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `cltest.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("PendingNonceAt", mock.Anything, mock.Anything).Return(uint64(0), nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `err = eb.Start(ctx)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `err = eb.Close()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `err = eb.Start(ctx)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `err = eb.Close()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `cltest.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("PendingNonceAt", mock.Anything, mock.Anything).Return(uint64(0), errors.New("Getting on-chain nonce failed"))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("PendingNonceAt", mock.Anything, otherAddress).Return(uint64(0), nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("no eth_txes at all", func(t *testing.T) { retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("eth_txes exist for a different from address", func(t *testing.T) { mustCreateUnstartedTx(t, txStore, otherAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID) retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `mustCreateUnstartedTx(t, txStore, otherAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("existing eth_txes with broadcast_at or error", func(t *testing.T) { nonce := evmtypes.Nonce(342) errStr := "some error" etxUnconfirmed := txmgr.Tx{ Sequence: &nonce, FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: encodedPayload, Value: value, FeeLimit: gasLimit, BroadcastAt: &timeNow, InitialBroadcastAt: &timeNow, Error: null.String{}, State: txmgrcommon.TxUnconfirmed, } etxWithError := txmgr.Tx{ Sequence: nil, FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: encodedPayload, Value: value, FeeLimit: gasLimit, Error: null.StringFrom(errStr), State: txmgrcommon.TxFatalError, } require.NoError(t, txStore.InsertTx(ctx, &etxUnconfirmed)) require.NoError(t, txStore.InsertTx(ctx, &etxWithError)) retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("sends 3 EthTxs in order with higher value last, and lower values starting from the earliest", func(t *testing.T) { // Higher value expensiveEthTx := txmgr.Tx{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: []byte{42, 42, 0}, Value: big.Int(assets.NewEthValue(242)), FeeLimit: gasLimit, CreatedAt: time.Unix(0, 0), State: txmgrcommon.TxUnstarted, } ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(2) && tx.Value().Cmp(big.NewInt(242)) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once() // Earlier tr := int32(99) b, err := json.Marshal(txmgr.TxMeta{JobID: &tr}) require.NoError(t, err) meta := sqlutil.JSON(b) earlierEthTx := txmgr.Tx{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: []byte{42, 42, 0}, Value: value, FeeLimit: gasLimit, CreatedAt: time.Unix(0, 1), State: txmgrcommon.TxUnstarted, Meta: &meta, } ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { if tx.Nonce() != uint64(0) { return false } require.Equal(t, evmcfg.EVM().ChainID(), tx.ChainId()) require.Equal(t, gasLimit, tx.Gas()) require.Equal(t, evmcfg.EVM().GasEstimator().PriceDefault().ToInt(), tx.GasPrice()) require.Equal(t, toAddress, *tx.To()) require.Equal(t, value.String(), tx.Value().String()) require.Equal(t, earlierEthTx.EncodedPayload, tx.Data()) return true }), fromAddress).Return(commonclient.Successful, nil).Once() // Later laterEthTx := txmgr.Tx{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: []byte{42, 42, 1}, Value: value, FeeLimit: gasLimit, CreatedAt: time.Unix(1, 0), State: txmgrcommon.TxUnstarted, } ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { if tx.Nonce() != uint64(1) { return false } require.Equal(t, evmcfg.EVM().ChainID(), tx.ChainId()) require.Equal(t, gasLimit, tx.Gas()) require.Equal(t, evmcfg.EVM().GasEstimator().PriceDefault().ToInt(), tx.GasPrice()) require.Equal(t, toAddress, *tx.To()) require.Equal(t, value.String(), tx.Value().String()) require.Equal(t, laterEthTx.EncodedPayload, tx.Data()) return true }), fromAddress).Return(commonclient.Successful, nil).Once() // Insertion order deliberately reversed to test ordering require.NoError(t, txStore.InsertTx(ctx, &expensiveEthTx)) require.NoError(t, txStore.InsertTx(ctx, &laterEthTx)) require.NoError(t, txStore.InsertTx(ctx, &earlierEthTx)) // Do the thing retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) // Check earlierEthTx and it's attempt // This was the earlier one sent so it has the lower nonce earlierTransaction, err := txStore.FindTxWithAttempts(ctx, earlierEthTx.ID) require.NoError(t, err) assert.False(t, earlierTransaction.Error.Valid) require.NotNil(t, earlierTransaction.FromAddress) assert.Equal(t, fromAddress, earlierTransaction.FromAddress) require.NotNil(t, earlierTransaction.Sequence) assert.Equal(t, evmtypes.Nonce(0), *earlierTransaction.Sequence) assert.NotNil(t, earlierTransaction.BroadcastAt) assert.NotNil(t, earlierTransaction.InitialBroadcastAt) assert.Len(t, earlierTransaction.TxAttempts, 1) var m txmgr.TxMeta err = json.Unmarshal(*earlierEthTx.Meta, &m) require.NoError(t, err) assert.NotNil(t, m.JobID) assert.Equal(t, tr, *m.JobID) attempt := earlierTransaction.TxAttempts[0] assert.Equal(t, earlierTransaction.ID, attempt.TxID) assert.NotNil(t, attempt.TxFee.Legacy) assert.Nil(t, attempt.TxFee.DynamicTipCap) assert.Nil(t, attempt.TxFee.DynamicFeeCap) assert.Equal(t, evmcfg.EVM().GasEstimator().PriceDefault(), attempt.TxFee.Legacy) _, err = txmgr.GetGethSignedTx(attempt.SignedRawTx) require.NoError(t, err) assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt.State) require.Len(t, attempt.Receipts, 0) // Check laterEthTx and it's attempt // This was the later one sent so it has the higher nonce laterTransaction, err := txStore.FindTxWithAttempts(ctx, laterEthTx.ID) require.NoError(t, err) assert.False(t, earlierTransaction.Error.Valid) require.NotNil(t, laterTransaction.FromAddress) assert.Equal(t, fromAddress, laterTransaction.FromAddress) require.NotNil(t, laterTransaction.Sequence) assert.Equal(t, evmtypes.Nonce(1), *laterTransaction.Sequence) assert.NotNil(t, laterTransaction.BroadcastAt) assert.NotNil(t, earlierTransaction.InitialBroadcastAt) assert.Len(t, laterTransaction.TxAttempts, 1) attempt = laterTransaction.TxAttempts[0] assert.Equal(t, laterTransaction.ID, attempt.TxID) assert.Equal(t, evmcfg.EVM().GasEstimator().PriceDefault(), attempt.TxFee.Legacy) _, err = txmgr.GetGethSignedTx(attempt.SignedRawTx) require.NoError(t, err) assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt.State) require.Len(t, attempt.Receipts, 0) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(2) && tx.Value().Cmp(big.NewInt(242)) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { if tx.Nonce() != uint64(0) { return false } require.Equal(t, evmcfg.EVM().ChainID(), tx.ChainId()) require.Equal(t, gasLimit, tx.Gas()) require.Equal(t, evmcfg.EVM().GasEstimator().PriceDefault().ToInt(), tx.GasPrice()) require.Equal(t, toAddress, *tx.To()) require.Equal(t, value.String(), tx.Value().String()) require.Equal(t, earlierEthTx.EncodedPayload, tx.Data()) return true }), fromAddress).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { if tx.Nonce() != uint64(1) { return false } require.Equal(t, evmcfg.EVM().ChainID(), tx.ChainId()) require.Equal(t, gasLimit, tx.Gas()) require.Equal(t, evmcfg.EVM().GasEstimator().PriceDefault().ToInt(), tx.GasPrice()) require.Equal(t, toAddress, *tx.To()) require.Equal(t, value.String(), tx.Value().String()) require.Equal(t, laterEthTx.EncodedPayload, tx.Data()) return true }), fromAddress).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `err = json.Unmarshal(*earlierEthTx.Meta, &m)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `_, err = txmgr.GetGethSignedTx(attempt.SignedRawTx)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `attempt = laterTransaction.TxAttempts[0]` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `_, err = txmgr.GetGethSignedTx(attempt.SignedRawTx)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(true)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `c.EVM[0].GasEstimator.TipCapDefault = assets.NewWeiI(rnd)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `c.EVM[0].GasEstimator.FeeCapDefault = assets.NewWeiI(rnd + 1)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `c.EVM[0].GasEstimator.PriceMax = assets.NewWeiI(rnd + 2)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `evmcfg = evmtest.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("PendingNonceAt", mock.Anything, otherAddress).Return(uint64(1), nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `nonceTracker = txmgr.NewNonceTracker(lggr, txStore, txmgr.NewEvmTxmClient(ethClient, nil))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `eb = NewTestEthBroadcaster(t, txStore, ethClient, ethKeyStore, cfg, evmcfg, checkerFactory, false, nonceTracker)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("sends transactions with type 0x2 in EIP-1559 mode", func(t *testing.T) { ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(343) && tx.Value().Cmp(big.NewInt(242)) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once() etx := mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, []byte{42, 42, 0}, gasLimit, big.Int(assets.NewEthValue(242)), testutils.FixtureChainID) // Do the thing { retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) } // Check eipTxWithAl and it's attempt // This was the earlier one sent so it has the lower nonce etx, err := txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.False(t, etx.Error.Valid) require.NotNil(t, etx.FromAddress) assert.Equal(t, fromAddress, etx.FromAddress) require.NotNil(t, etx.Sequence) assert.Equal(t, evmtypes.Nonce(343), *etx.Sequence) assert.NotNil(t, etx.BroadcastAt) assert.NotNil(t, etx.InitialBroadcastAt) assert.Len(t, etx.TxAttempts, 1) attempt := etx.TxAttempts[0] assert.Equal(t, etx.ID, attempt.TxID) assert.Nil(t, attempt.TxFee.Legacy) assert.Equal(t, rnd, attempt.TxFee.DynamicTipCap.ToInt().Int64()) assert.Equal(t, rnd+1, attempt.TxFee.DynamicFeeCap.ToInt().Int64()) _, err = txmgr.GetGethSignedTx(attempt.SignedRawTx) require.NoError(t, err) assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt.State) require.Len(t, attempt.Receipts, 0) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(343) && tx.Value().Cmp(big.NewInt(242)) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `_, err = txmgr.GetGethSignedTx(attempt.SignedRawTx)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("when simulation succeeds, sends tx as normal", func(t *testing.T) { txRequest := txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: []byte{42, 0, 0}, Value: big.Int(assets.NewEthValue(442)), FeeLimit: gasLimit, Strategy: txmgrcommon.NewSendEveryStrategy(), Checker: txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeSimulate, }, } ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(344) && tx.Value().Cmp(big.NewInt(442)) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once() ethClient.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { if fmt.Sprintf("%s", callarg["value"]) == "0x1ba" { // 442 assert.Equal(t, txRequest.FromAddress, callarg["from"]) assert.Equal(t, &txRequest.ToAddress, callarg["to"]) assert.Equal(t, hexutil.Uint64(txRequest.FeeLimit), callarg["gas"]) assert.Nil(t, callarg["gasPrice"]) assert.Nil(t, callarg["maxFeePerGas"]) assert.Nil(t, callarg["maxPriorityFeePerGas"]) assert.Equal(t, (*hexutil.Big)(&txRequest.Value), callarg["value"]) assert.Equal(t, hexutil.Bytes(txRequest.EncodedPayload), callarg["data"]) return true } return false }), "latest").Return(nil).Once() ethTx := mustCreateUnstartedTxFromEvmTxRequest(t, txStore, txRequest, testutils.FixtureChainID) { retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) } // Check ethtx was sent ethTx, err := txStore.FindTxWithAttempts(ctx, ethTx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, ethTx.State) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(344) && tx.Value().Cmp(big.NewInt(442)) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { if fmt.Sprintf("%s", callarg["value"]) == "0x1ba" { // 442 assert.Equal(t, txRequest.FromAddress, callarg["from"]) assert.Equal(t, &txRequest.ToAddress, callarg["to"]) assert.Equal(t, hexutil.Uint64(txRequest.FeeLimit), callarg["gas"]) assert.Nil(t, callarg["gasPrice"]) assert.Nil(t, callarg["maxFeePerGas"]) assert.Nil(t, callarg["maxPriorityFeePerGas"]) assert.Equal(t, (*hexutil.Big)(&txRequest.Value), callarg["value"]) assert.Equal(t, hexutil.Bytes(txRequest.EncodedPayload), callarg["data"]) return true } return false }), "latest").Return(nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("with unknown error, sends tx as normal", func(t *testing.T) { ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(345) && tx.Value().Cmp(big.NewInt(542)) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once() ethClient.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x21e" // 542 }), "latest").Return(errors.New("this is not a revert, something unexpected went wrong")).Once() ethTx := mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, testutils.FixtureChainID, txRequestWithChecker(checker), txRequestWithValue(big.Int(assets.NewEthValue(542)))) { retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) } ethTx, err := txStore.FindTxWithAttempts(ctx, ethTx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, ethTx.State) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(345) && tx.Value().Cmp(big.NewInt(542)) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x21e" // 542 }), "latest").Return(errors.New("this is not a revert, something unexpected went wrong")).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("on revert, marks tx as fatally errored and does not send", func(t *testing.T) { jerr := client.JsonError{ Code: 42, Message: "oh no, it reverted", Data: []byte{42, 166, 34}, } ethClient.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x282" // 642 }), "latest").Return(&jerr).Once() ethTx := mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, testutils.FixtureChainID, txRequestWithChecker(checker), txRequestWithValue(big.Int(assets.NewEthValue(642)))) { retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) } ethTx, err := txStore.FindTxWithAttempts(ctx, ethTx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxFatalError, ethTx.State) assert.True(t, ethTx.Error.Valid) assert.Equal(t, "transaction reverted during simulation: json-rpc error { Code = 42, Message = 'oh no, it reverted', Data = 'KqYi' }", ethTx.Error.String) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x282" // 642 }), "latest").Return(&jerr).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("when transmit checking times out, sends tx as normal", func(t *testing.T) { // Checker will return a canceled error checkerFactory.err = context.Canceled ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == 0 && tx.Value().Cmp(big.NewInt(442)) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once() ethTx := mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, testutils.FixtureChainID, txRequestWithValue(big.Int(assets.NewEthValue(442))), txRequestWithChecker(checker)) { retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) } // Check ethtx was sent ethTx, err := txStore.FindTxWithAttempts(ctx, ethTx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, ethTx.State) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `checkerFactory.err = context.Canceled` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == 0 && tx.Value().Cmp(big.NewInt(442)) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("when transmit checking succeeds, sends tx as normal", func(t *testing.T) { // Checker will return no error checkerFactory.err = nil ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == 1 && tx.Value().Cmp(big.NewInt(442)) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once() ethTx := mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, testutils.FixtureChainID, txRequestWithValue(big.Int(assets.NewEthValue(442))), txRequestWithChecker(checker)) { retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) } // Check ethtx was sent ethTx, err := txStore.FindTxWithAttempts(ctx, ethTx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, ethTx.State) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `checkerFactory.err = nil` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == 1 && tx.Value().Cmp(big.NewInt(442)) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `checkerFactory.err = errors.New("fatal checker error")` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `estimator.On("GetFee", mock.Anything, mock.Anything, mock.Anything, ccfg.EVM().GasEstimator().PriceMaxKey(fromAddress)).Return(gas.EvmFee{Legacy: assets.GWei(32)}, uint64(500), nil).Run(func(_ mock.Arguments) { close(chStartEstimate) <-chBlock }).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `close(chStartEstimate)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `<-chBlock` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `eb.XXXTestDisableUnstartedTxAutoProcessing()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `servicetest.Run(t, eb)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `close(chBlock)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `c.EVM[0].GasEstimator.LimitMultiplier = &lm` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { assert.Equal(t, int(1600), int(tx.Gas())) return true }), fromAddress).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `mustCreateUnstartedTxFromEvmTxRequest(t, txStore, txRequest, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("cannot be more than one transaction per address in an unfinished state", func(t *testing.T) { db := pgtest.NewSqlxDB(t) txStore := cltest.NewTestTxStore(t, db) ethKeyStore := cltest.NewKeyStore(t, db).Eth() _, fromAddress := cltest.RandomKey{Nonce: nextNonce.Int64()}.MustInsertWithState(t, ethKeyStore) firstInProgress := txmgr.Tx{ FromAddress: fromAddress, Sequence: &firstNonce, ToAddress: toAddress, EncodedPayload: encodedPayload, Value: value, FeeLimit: gasLimit, Error: null.String{}, State: txmgrcommon.TxInProgress, } secondInProgress := txmgr.Tx{ FromAddress: fromAddress, Sequence: &secondNonce, ToAddress: toAddress, EncodedPayload: encodedPayload, Value: value, FeeLimit: gasLimit, Error: null.String{}, State: txmgrcommon.TxInProgress, } require.NoError(t, txStore.InsertTx(ctx, &firstInProgress)) err := txStore.InsertTx(ctx, &secondInProgress) require.Error(t, err) assert.Contains(t, err.Error(), "ERROR: duplicate key value violates unique constraint \"idx_only_one_in_progress_tx_per_account_id_per_evm_chain_id\" (SQLSTATE 23505)") })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("previous run assigned nonce but never broadcast", func(t *testing.T) { db := pgtest.NewSqlxDB(t) txStore := cltest.NewTestTxStore(t, db) ethKeyStore := cltest.NewKeyStore(t, db).Eth() _, fromAddress := cltest.RandomKey{Nonce: nextNonce.Int64()}.MustInsertWithState(t, ethKeyStore) ethClient := testutils.NewEthClientMockWithDefaultChain(t) ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), nil).Once() nonceTracker := txmgr.NewNonceTracker(logger.Test(t), txStore, txmgr.NewEvmTxmClient(ethClient, nil)) eb := NewTestEthBroadcaster(t, txStore, ethClient, ethKeyStore, cfg, evmcfg, &testCheckerFactory{}, false, nonceTracker) // Crashed right after we commit the database transaction that saved // the nonce to the eth_tx so evm.key_states.next_nonce has not been // incremented yet inProgressEthTx := mustInsertInProgressEthTxWithAttempt(t, txStore, firstNonce, fromAddress) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(firstNonce) }), fromAddress).Return(commonclient.Successful, nil).Once() // Do the thing { retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) } // Check it was saved correctly with its attempt etx, err := txStore.FindTxWithAttempts(ctx, inProgressEthTx.ID) require.NoError(t, err) assert.NotNil(t, etx.BroadcastAt) assert.NotNil(t, etx.InitialBroadcastAt) assert.False(t, etx.Error.Valid) assert.Len(t, etx.TxAttempts, 1) assert.Equal(t, txmgrtypes.TxAttemptBroadcast, etx.TxAttempts[0].State) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(firstNonce) }), fromAddress).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("previous run assigned nonce and broadcast but it fatally errored before we could save", func(t *testing.T) { db := pgtest.NewSqlxDB(t) txStore := cltest.NewTestTxStore(t, db) ethKeyStore := cltest.NewKeyStore(t, db).Eth() _, fromAddress := cltest.RandomKey{Nonce: nextNonce.Int64()}.MustInsertWithState(t, ethKeyStore) ethClient := testutils.NewEthClientMockWithDefaultChain(t) ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), nil).Once() nonceTracker := txmgr.NewNonceTracker(logger.Test(t), txStore, txmgr.NewEvmTxmClient(ethClient, nil)) eb := NewTestEthBroadcaster(t, txStore, ethClient, ethKeyStore, cfg, evmcfg, &testCheckerFactory{}, false, nonceTracker) // Crashed right after we commit the database transaction that saved the nonce to the eth_tx inProgressEthTx := mustInsertInProgressEthTxWithAttempt(t, txStore, firstNonce, fromAddress) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(firstNonce) }), fromAddress).Return(commonclient.Fatal, errors.New("exceeds block gas limit")).Once() // Do the thing { retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) } // Check it was saved correctly with its attempt etx, err := txStore.FindTxWithAttempts(ctx, inProgressEthTx.ID) require.NoError(t, err) assert.Nil(t, etx.BroadcastAt) assert.Nil(t, etx.InitialBroadcastAt) assert.True(t, etx.Error.Valid) assert.Equal(t, "exceeds block gas limit", etx.Error.String) assert.Len(t, etx.TxAttempts, 0) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(firstNonce) }), fromAddress).Return(commonclient.Fatal, errors.New("exceeds block gas limit")).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("previous run assigned nonce and broadcast and is now in mempool", func(t *testing.T) { db := pgtest.NewSqlxDB(t) txStore := cltest.NewTestTxStore(t, db) ethKeyStore := cltest.NewKeyStore(t, db).Eth() _, fromAddress := cltest.RandomKey{Nonce: nextNonce.Int64()}.MustInsertWithState(t, ethKeyStore) ethClient := testutils.NewEthClientMockWithDefaultChain(t) ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), nil).Once() nonceTracker := txmgr.NewNonceTracker(logger.Test(t), txStore, txmgr.NewEvmTxmClient(ethClient, nil)) eb := NewTestEthBroadcaster(t, txStore, ethClient, ethKeyStore, cfg, evmcfg, &testCheckerFactory{}, false, nonceTracker) // Crashed right after we commit the database transaction that saved the nonce to the eth_tx inProgressEthTx := mustInsertInProgressEthTxWithAttempt(t, txStore, firstNonce, fromAddress) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(firstNonce) }), fromAddress).Return(commonclient.Successful, errors.New("known transaction: a1313bd99a81fb4d8ad1d2e90b67c6b3fa77545c990d6251444b83b70b6f8980")).Once() // Do the thing { retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) } // Check it was saved correctly with its attempt etx, err := txStore.FindTxWithAttempts(ctx, inProgressEthTx.ID) require.NoError(t, err) assert.NotNil(t, etx.BroadcastAt) assert.NotNil(t, etx.InitialBroadcastAt) assert.False(t, etx.Error.Valid) assert.Len(t, etx.TxAttempts, 1) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(firstNonce) }), fromAddress).Return(commonclient.Successful, errors.New("known transaction: a1313bd99a81fb4d8ad1d2e90b67c6b3fa77545c990d6251444b83b70b6f8980")).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("previous run assigned nonce and broadcast and now the transaction has been confirmed", func(t *testing.T) { db := pgtest.NewSqlxDB(t) txStore := cltest.NewTestTxStore(t, db) ethKeyStore := cltest.NewKeyStore(t, db).Eth() _, fromAddress := cltest.RandomKey{Nonce: nextNonce.Int64()}.MustInsertWithState(t, ethKeyStore) ethClient := testutils.NewEthClientMockWithDefaultChain(t) ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), nil).Once() nonceTracker := txmgr.NewNonceTracker(logger.Test(t), txStore, txmgr.NewEvmTxmClient(ethClient, nil)) eb := NewTestEthBroadcaster(t, txStore, ethClient, ethKeyStore, cfg, evmcfg, &testCheckerFactory{}, false, nonceTracker) // Crashed right after we commit the database transaction that saved the nonce to the eth_tx inProgressEthTx := mustInsertInProgressEthTxWithAttempt(t, txStore, firstNonce, fromAddress) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(firstNonce) }), fromAddress).Return(commonclient.TransactionAlreadyKnown, errors.New("nonce too low")).Once() // Do the thing { retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) } // Check it was saved correctly with its attempt etx, err := txStore.FindTxWithAttempts(ctx, inProgressEthTx.ID) require.NoError(t, err) require.NotNil(t, etx.BroadcastAt) assert.Equal(t, *etx.BroadcastAt, etx.CreatedAt) assert.NotNil(t, etx.InitialBroadcastAt) assert.False(t, etx.Error.Valid) assert.Len(t, etx.TxAttempts, 1) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(firstNonce) }), fromAddress).Return(commonclient.TransactionAlreadyKnown, errors.New("nonce too low")).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("previous run assigned nonce and then failed to reach node for some reason and node is still down", func(t *testing.T) { failedToReachNodeError := context.DeadlineExceeded db := pgtest.NewSqlxDB(t) txStore := cltest.NewTestTxStore(t, db) ethKeyStore := cltest.NewKeyStore(t, db).Eth() _, fromAddress := cltest.RandomKey{Nonce: nextNonce.Int64()}.MustInsertWithState(t, ethKeyStore) ethClient := testutils.NewEthClientMockWithDefaultChain(t) ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), nil).Once() nonceTracker := txmgr.NewNonceTracker(logger.Test(t), txStore, txmgr.NewEvmTxmClient(ethClient, nil)) eb := NewTestEthBroadcaster(t, txStore, ethClient, ethKeyStore, cfg, evmcfg, &testCheckerFactory{}, false, nonceTracker) // Crashed right after we commit the database transaction that saved the nonce to the eth_tx inProgressEthTx := mustInsertInProgressEthTxWithAttempt(t, txStore, firstNonce, fromAddress) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(firstNonce) }), fromAddress).Return(commonclient.Retryable, failedToReachNodeError).Once() // Do the thing retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) require.Error(t, err) assert.Contains(t, err.Error(), failedToReachNodeError.Error()) assert.True(t, retryable) // Check it was left in the unfinished state etx, err := txStore.FindTxWithAttempts(ctx, inProgressEthTx.ID) require.NoError(t, err) assert.Nil(t, etx.BroadcastAt) assert.Nil(t, etx.InitialBroadcastAt) assert.Equal(t, nextNonce, *etx.Sequence) assert.False(t, etx.Error.Valid) assert.Len(t, etx.TxAttempts, 1) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(firstNonce) }), fromAddress).Return(commonclient.Retryable, failedToReachNodeError).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `c.EVM[0].GasEstimator.PriceDefault = assets.NewWeiI(500000000000)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { // Ensure that the gas price is the same as the original attempt s, e := txmgr.GetGethSignedTx(attempt.SignedRawTx) require.NoError(t, e) return tx.Nonce() == uint64(firstNonce) && tx.GasPrice().Int64() == s.GasPrice().Int64() }), fromAddress).Return(commonclient.Successful, errors.New("known transaction: a1313bd99a81fb4d8ad1d2e90b67c6b3fa77545c990d6251444b83b70b6f8980")).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `attempt = etx.TxAttempts[0]` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("if external wallet sent a transaction from the account and now the nonce is one higher than it should be and we got replacement underpriced then we assume a previous transaction of ours was the one that succeeded, and hand off to EthConfirmer", func(t *testing.T) { mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID) // First send, replacement underpriced ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(0) }), fromAddress).Return(commonclient.Successful, errors.New("replacement transaction underpriced")).Once() // Do the thing retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) // Check that the transaction was saved correctly with its attempt // We assume success and hand off to eth confirmer to eventually mark it as failed var latestID int64 var etx1 txmgr.Tx require.NoError(t, db.Get(&latestID, "SELECT max(id) FROM evm.txes")) etx1, err = txStore.FindTxWithAttempts(ctx, latestID) require.NoError(t, err) require.NotNil(t, etx1.BroadcastAt) assert.NotEqual(t, etx1.CreatedAt, *etx1.BroadcastAt) assert.NotNil(t, etx1.InitialBroadcastAt) require.NotNil(t, etx1.Sequence) assert.Equal(t, evmtypes.Nonce(0), *etx1.Sequence) assert.False(t, etx1.Error.Valid) assert.Len(t, etx1.TxAttempts, 1) // Check that the local nonce was incremented by one finalNextNonce := getLocalNextNonce(t, nonceTracker, fromAddress) require.NoError(t, err) require.NotNil(t, finalNextNonce) require.Equal(t, int64(1), int64(finalNextNonce)) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(0) }), fromAddress).Return(commonclient.Successful, errors.New("replacement transaction underpriced")).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `etx1, err = txStore.FindTxWithAttempts(ctx, latestID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("geth Client returns an error in the fatal errors category", func(t *testing.T) { fatalErrorExample := "exceeds block gas limit" localNextNonce := getLocalNextNonce(t, nonceTracker, fromAddress) t.Run("without callback", func(t *testing.T) { etx := mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Fatal, errors.New(fatalErrorExample)).Once() retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) // Check it was saved correctly with its attempt etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Nil(t, etx.BroadcastAt) assert.Nil(t, etx.InitialBroadcastAt) require.Nil(t, etx.Sequence) assert.True(t, etx.Error.Valid) assert.Contains(t, etx.Error.String, "exceeds block gas limit") assert.Len(t, etx.TxAttempts, 0) // Check that the key had its nonce reset var nonce evmtypes.Nonce nonce, err = nonceTracker.GetNextSequence(ctx, fromAddress) require.NoError(t, err) // Saved NextNonce must be the same as before because this transaction // was not accepted by the eth node and never can be require.Equal(t, int64(localNextNonce), int64(nonce)) }) t.Run("with callback", func(t *testing.T) { run := cltest.MustInsertPipelineRun(t, db) tr := cltest.MustInsertUnfinishedPipelineTaskRun(t, db, run.ID) etx := txmgr.Tx{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: encodedPayload, Value: value, FeeLimit: gasLimit, State: txmgrcommon.TxUnstarted, PipelineTaskRunID: uuid.NullUUID{UUID: tr.ID, Valid: true}, SignalCallback: true, } t.Run("with erroring callback bails out", func(t *testing.T) { require.NoError(t, txStore.InsertTx(tests.Context(t), &etx)) fn := func(ctx context.Context, id uuid.UUID, result interface{}, err error) error { return errors.New("something exploded in the callback") } eb.SetResumeCallback(fn) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Fatal, errors.New(fatalErrorExample)).Once() retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) require.Error(t, err) require.Contains(t, err.Error(), "something exploded in the callback") assert.True(t, retryable) }) t.Run("calls resume with error", func(t *testing.T) { fn := func(ctx context.Context, id uuid.UUID, result interface{}, err error) error { require.Equal(t, id, tr.ID) require.Nil(t, result) require.Error(t, err) require.Contains(t, err.Error(), "fatal error while sending transaction: exceeds block gas limit") return nil } eb.SetResumeCallback(fn) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Fatal, errors.New(fatalErrorExample)).Once() { retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) } // same as the parent test, but callback is set by ctor t.Run("callback set by ctor", func(t *testing.T) { estimator := gas.NewEvmFeeEstimator(lggr, func(lggr logger.Logger) gas.EvmEstimator { return gas.NewFixedPriceEstimator(evmcfg.EVM().GasEstimator(), nil, evmcfg.EVM().GasEstimator().BlockHistory(), lggr, nil) }, evmcfg.EVM().GasEstimator().EIP1559DynamicFees(), evmcfg.EVM().GasEstimator()) txBuilder := txmgr.NewEvmTxAttemptBuilder(*ethClient.ConfiguredChainID(), evmcfg.EVM().GasEstimator(), ethKeyStore, estimator) localNextNonce = getLocalNextNonce(t, nonceTracker, fromAddress) eb2 := txmgr.NewEvmBroadcaster(txStore, txmClient, txmgr.NewEvmTxmConfig(evmcfg.EVM()), txmgr.NewEvmTxmFeeConfig(evmcfg.EVM().GasEstimator()), evmcfg.EVM().Transactions(), cfg.Database().Listener(), ethKeyStore, txBuilder, lggr, &testCheckerFactory{}, false) retryable, err := eb2.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) }) }) }) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("without callback", func(t *testing.T) { etx := mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Fatal, errors.New(fatalErrorExample)).Once() retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) // Check it was saved correctly with its attempt etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Nil(t, etx.BroadcastAt) assert.Nil(t, etx.InitialBroadcastAt) require.Nil(t, etx.Sequence) assert.True(t, etx.Error.Valid) assert.Contains(t, etx.Error.String, "exceeds block gas limit") assert.Len(t, etx.TxAttempts, 0) // Check that the key had its nonce reset var nonce evmtypes.Nonce nonce, err = nonceTracker.GetNextSequence(ctx, fromAddress) require.NoError(t, err) // Saved NextNonce must be the same as before because this transaction // was not accepted by the eth node and never can be require.Equal(t, int64(localNextNonce), int64(nonce)) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Fatal, errors.New(fatalErrorExample)).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `nonce, err = nonceTracker.GetNextSequence(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("with callback", func(t *testing.T) { run := cltest.MustInsertPipelineRun(t, db) tr := cltest.MustInsertUnfinishedPipelineTaskRun(t, db, run.ID) etx := txmgr.Tx{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: encodedPayload, Value: value, FeeLimit: gasLimit, State: txmgrcommon.TxUnstarted, PipelineTaskRunID: uuid.NullUUID{UUID: tr.ID, Valid: true}, SignalCallback: true, } t.Run("with erroring callback bails out", func(t *testing.T) { require.NoError(t, txStore.InsertTx(tests.Context(t), &etx)) fn := func(ctx context.Context, id uuid.UUID, result interface{}, err error) error { return errors.New("something exploded in the callback") } eb.SetResumeCallback(fn) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Fatal, errors.New(fatalErrorExample)).Once() retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) require.Error(t, err) require.Contains(t, err.Error(), "something exploded in the callback") assert.True(t, retryable) }) t.Run("calls resume with error", func(t *testing.T) { fn := func(ctx context.Context, id uuid.UUID, result interface{}, err error) error { require.Equal(t, id, tr.ID) require.Nil(t, result) require.Error(t, err) require.Contains(t, err.Error(), "fatal error while sending transaction: exceeds block gas limit") return nil } eb.SetResumeCallback(fn) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Fatal, errors.New(fatalErrorExample)).Once() { retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) } // same as the parent test, but callback is set by ctor t.Run("callback set by ctor", func(t *testing.T) { estimator := gas.NewEvmFeeEstimator(lggr, func(lggr logger.Logger) gas.EvmEstimator { return gas.NewFixedPriceEstimator(evmcfg.EVM().GasEstimator(), nil, evmcfg.EVM().GasEstimator().BlockHistory(), lggr, nil) }, evmcfg.EVM().GasEstimator().EIP1559DynamicFees(), evmcfg.EVM().GasEstimator()) txBuilder := txmgr.NewEvmTxAttemptBuilder(*ethClient.ConfiguredChainID(), evmcfg.EVM().GasEstimator(), ethKeyStore, estimator) localNextNonce = getLocalNextNonce(t, nonceTracker, fromAddress) eb2 := txmgr.NewEvmBroadcaster(txStore, txmClient, txmgr.NewEvmTxmConfig(evmcfg.EVM()), txmgr.NewEvmTxmFeeConfig(evmcfg.EVM().GasEstimator()), evmcfg.EVM().Transactions(), cfg.Database().Listener(), ethKeyStore, txBuilder, lggr, &testCheckerFactory{}, false) retryable, err := eb2.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) }) }) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("with erroring callback bails out", func(t *testing.T) { require.NoError(t, txStore.InsertTx(tests.Context(t), &etx)) fn := func(ctx context.Context, id uuid.UUID, result interface{}, err error) error { return errors.New("something exploded in the callback") } eb.SetResumeCallback(fn) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Fatal, errors.New(fatalErrorExample)).Once() retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) require.Error(t, err) require.Contains(t, err.Error(), "something exploded in the callback") assert.True(t, retryable) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `eb.SetResumeCallback(fn)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Fatal, errors.New(fatalErrorExample)).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("calls resume with error", func(t *testing.T) { fn := func(ctx context.Context, id uuid.UUID, result interface{}, err error) error { require.Equal(t, id, tr.ID) require.Nil(t, result) require.Error(t, err) require.Contains(t, err.Error(), "fatal error while sending transaction: exceeds block gas limit") return nil } eb.SetResumeCallback(fn) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Fatal, errors.New(fatalErrorExample)).Once() { retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) } // same as the parent test, but callback is set by ctor t.Run("callback set by ctor", func(t *testing.T) { estimator := gas.NewEvmFeeEstimator(lggr, func(lggr logger.Logger) gas.EvmEstimator { return gas.NewFixedPriceEstimator(evmcfg.EVM().GasEstimator(), nil, evmcfg.EVM().GasEstimator().BlockHistory(), lggr, nil) }, evmcfg.EVM().GasEstimator().EIP1559DynamicFees(), evmcfg.EVM().GasEstimator()) txBuilder := txmgr.NewEvmTxAttemptBuilder(*ethClient.ConfiguredChainID(), evmcfg.EVM().GasEstimator(), ethKeyStore, estimator) localNextNonce = getLocalNextNonce(t, nonceTracker, fromAddress) eb2 := txmgr.NewEvmBroadcaster(txStore, txmClient, txmgr.NewEvmTxmConfig(evmcfg.EVM()), txmgr.NewEvmTxmFeeConfig(evmcfg.EVM().GasEstimator()), evmcfg.EVM().Transactions(), cfg.Database().Listener(), ethKeyStore, txBuilder, lggr, &testCheckerFactory{}, false) retryable, err := eb2.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) }) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `eb.SetResumeCallback(fn)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Fatal, errors.New(fatalErrorExample)).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("callback set by ctor", func(t *testing.T) { estimator := gas.NewEvmFeeEstimator(lggr, func(lggr logger.Logger) gas.EvmEstimator { return gas.NewFixedPriceEstimator(evmcfg.EVM().GasEstimator(), nil, evmcfg.EVM().GasEstimator().BlockHistory(), lggr, nil) }, evmcfg.EVM().GasEstimator().EIP1559DynamicFees(), evmcfg.EVM().GasEstimator()) txBuilder := txmgr.NewEvmTxAttemptBuilder(*ethClient.ConfiguredChainID(), evmcfg.EVM().GasEstimator(), ethKeyStore, estimator) localNextNonce = getLocalNextNonce(t, nonceTracker, fromAddress) eb2 := txmgr.NewEvmBroadcaster(txStore, txmClient, txmgr.NewEvmTxmConfig(evmcfg.EVM()), txmgr.NewEvmTxmFeeConfig(evmcfg.EVM().GasEstimator()), evmcfg.EVM().Transactions(), cfg.Database().Listener(), ethKeyStore, txBuilder, lggr, &testCheckerFactory{}, false) retryable, err := eb2.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `localNextNonce = getLocalNextNonce(t, nonceTracker, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `eb.SetResumeCallback(nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("geth Client fails with error indicating that the transaction was too expensive", func(t *testing.T) { TxFeeExceedsCapError := "tx fee (1.10 ether) exceeds the configured cap (1.00 ether)" localNextNonce := getLocalNextNonce(t, nonceTracker, fromAddress) ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(localNextNonce, nil).Once() etx := mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.ExceedsMaxFee, errors.New(TxFeeExceedsCapError)).Twice() // In the first case, the tx was NOT accepted into the mempool. In the case // of multiple RPC nodes, it is possible that it can be accepted by // another node even if the primary one returns "exceeds the configured // cap" retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) require.Error(t, err) assert.Contains(t, err.Error(), "tx fee (1.10 ether) exceeds the configured cap (1.00 ether)") assert.Contains(t, err.Error(), "error while sending transaction") assert.True(t, retryable) // Check it was saved with its attempt etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Nil(t, etx.BroadcastAt) assert.Nil(t, etx.InitialBroadcastAt) // Note that InitialBroadcastAt really means "InitialDefinitelySuccessfulBroadcastAt" assert.Equal(t, evmtypes.Nonce(localNextNonce), *etx.Sequence) assert.False(t, etx.Error.Valid) assert.Len(t, etx.TxAttempts, 1) attempt := etx.TxAttempts[0] assert.Equal(t, txmgrtypes.TxAttemptInProgress, attempt.State) // Check that the key had its nonce reset var nonce evmtypes.Nonce nonce, err = nonceTracker.GetNextSequence(ctx, fromAddress) require.NoError(t, err) // Saved NextNonce must be the same as before because this transaction // was not accepted by the eth node and never can be require.Equal(t, int64(localNextNonce), int64(nonce)) // On the second try, the tx has been accepted into the mempool ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(localNextNonce+1, nil).Once() retryable, err = eb.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) // Check it was saved with its attempt etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.NotNil(t, etx.BroadcastAt) assert.NotNil(t, etx.InitialBroadcastAt) // Note that InitialBroadcastAt really means "InitialDefinitelySuccessfulBroadcastAt" assert.Equal(t, evmtypes.Nonce(localNextNonce), *etx.Sequence) assert.False(t, etx.Error.Valid) assert.Len(t, etx.TxAttempts, 1) attempt = etx.TxAttempts[0] assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt.State) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(localNextNonce, nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.ExceedsMaxFee, errors.New(TxFeeExceedsCapError)).Twice()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `nonce, err = nonceTracker.GetNextSequence(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(localNextNonce+1, nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `retryable, err = eb.ProcessUnstartedTxs(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `attempt = etx.TxAttempts[0]` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("eth Client call fails with an unexpected random error, and transaction was not accepted into mempool", func(t *testing.T) { retryableErrorExample := "some unknown error" localNextNonce := getLocalNextNonce(t, nonceTracker, fromAddress) etx := mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Unknown, errors.New(retryableErrorExample)).Once() // Nonce is the same as localNextNonce, implying that this sent transaction has not been accepted ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(localNextNonce, nil).Once() // Do the thing retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) require.Error(t, err) require.Contains(t, err.Error(), retryableErrorExample) assert.True(t, retryable) // Check it was saved correctly with its attempt etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Nil(t, etx.BroadcastAt) assert.Nil(t, etx.InitialBroadcastAt) require.NotNil(t, etx.Sequence) assert.False(t, etx.Error.Valid) assert.Equal(t, txmgrcommon.TxInProgress, etx.State) assert.Len(t, etx.TxAttempts, 1) attempt := etx.TxAttempts[0] assert.Equal(t, txmgrtypes.TxAttemptInProgress, attempt.State) // Now on the second run, it is successful ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Successful, nil).Once() retryable, err = eb.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) // Check it was saved correctly with its attempt etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.NotNil(t, etx.BroadcastAt) assert.NotNil(t, etx.InitialBroadcastAt) require.NotNil(t, etx.Sequence) assert.False(t, etx.Error.Valid) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx.State) assert.Len(t, etx.TxAttempts, 1) attempt = etx.TxAttempts[0] assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt.State) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Unknown, errors.New(retryableErrorExample)).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(localNextNonce, nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `retryable, err = eb.ProcessUnstartedTxs(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `attempt = etx.TxAttempts[0]` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("eth client call fails with an unexpected random error, and the nonce check also subsequently fails", func(t *testing.T) { retryableErrorExample := "some unknown error" localNextNonce := getLocalNextNonce(t, nonceTracker, fromAddress) etx := mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Unknown, errors.New(retryableErrorExample)).Once() ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), errors.New("pending nonce fetch failed")).Once() // Do the thing retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) require.Error(t, err) require.Contains(t, err.Error(), retryableErrorExample) require.Contains(t, err.Error(), "pending nonce fetch failed") assert.True(t, retryable) // Check it was saved correctly with its attempt etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Nil(t, etx.BroadcastAt) assert.Nil(t, etx.InitialBroadcastAt) require.NotNil(t, etx.Sequence) assert.False(t, etx.Error.Valid) assert.Equal(t, txmgrcommon.TxInProgress, etx.State) assert.Len(t, etx.TxAttempts, 1) attempt := etx.TxAttempts[0] assert.Equal(t, txmgrtypes.TxAttemptInProgress, attempt.State) // Now on the second run, it is successful ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Successful, nil).Once() retryable, err = eb.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) // Check it was saved correctly with its attempt etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.NotNil(t, etx.BroadcastAt) assert.NotNil(t, etx.InitialBroadcastAt) require.NotNil(t, etx.Sequence) assert.False(t, etx.Error.Valid) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx.State) assert.Len(t, etx.TxAttempts, 1) attempt = etx.TxAttempts[0] assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt.State) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Unknown, errors.New(retryableErrorExample)).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), errors.New("pending nonce fetch failed")).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `retryable, err = eb.ProcessUnstartedTxs(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `attempt = etx.TxAttempts[0]` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("eth Client call fails with an unexpected random error, and transaction was accepted into mempool", func(t *testing.T) { retryableErrorExample := "some strange RPC returns an unexpected thing" localNextNonce := getLocalNextNonce(t, nonceTracker, fromAddress) etx := mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Unknown, errors.New(retryableErrorExample)).Once() // Nonce is one higher than localNextNonce, implying that despite the error, this sent transaction has been accepted into the mempool ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(localNextNonce+1, nil).Once() // Do the thing retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) require.NoError(t, err) assert.False(t, retryable) // Check it was saved correctly with its attempt, in a broadcast state etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.NotNil(t, etx.BroadcastAt) assert.NotNil(t, etx.InitialBroadcastAt) require.NotNil(t, etx.Sequence) assert.False(t, etx.Error.Valid) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx.State) assert.Len(t, etx.TxAttempts, 1) attempt := etx.TxAttempts[0] assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt.State) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Unknown, errors.New(retryableErrorExample)).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(localNextNonce+1, nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("eth node returns underpriced transaction", func(t *testing.T) { // This happens if a transaction's gas price is below the minimum // configured for the transaction pool. // This is a configuration error by the node operator, since it means they set the base gas level too low. underpricedError := "transaction underpriced" localNextNonce := getLocalNextNonce(t, nonceTracker, fromAddress) etx := mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID) // First was underpriced ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasPrice().Cmp(evmcfg.EVM().GasEstimator().PriceDefault().ToInt()) == 0 }), fromAddress).Return(commonclient.Underpriced, errors.New(underpricedError)).Once() // Second with gas bump was still underpriced ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasPrice().Cmp(big.NewInt(25000000000)) == 0 }), fromAddress).Return(commonclient.Underpriced, errors.New(underpricedError)).Once() // Third succeeded ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasPrice().Cmp(big.NewInt(30000000000)) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once() // Do the thing retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) require.NoError(t, err) assert.False(t, retryable) // Check it was saved correctly with its attempt etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.NotNil(t, etx.BroadcastAt) assert.NotNil(t, etx.InitialBroadcastAt) require.NotNil(t, etx.Sequence) assert.False(t, etx.Error.Valid) assert.Len(t, etx.TxAttempts, 1) attempt := etx.TxAttempts[0] assert.Equal(t, "30 gwei", attempt.TxFee.Legacy.String()) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasPrice().Cmp(evmcfg.EVM().GasEstimator().PriceDefault().ToInt()) == 0 }), fromAddress).Return(commonclient.Underpriced, errors.New(underpricedError)).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasPrice().Cmp(big.NewInt(25000000000)) == 0 }), fromAddress).Return(commonclient.Underpriced, errors.New(underpricedError)).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasPrice().Cmp(big.NewInt(30000000000)) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("failed to reach node for some reason", func(t *testing.T) { failedToReachNodeError := context.DeadlineExceeded localNextNonce := getLocalNextNonce(t, nonceTracker, fromAddress) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Retryable, failedToReachNodeError).Once() // Do the thing retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) require.Error(t, err) assert.Contains(t, err.Error(), "context deadline exceeded") assert.True(t, retryable) // Check it was left in the unfinished state etx, err := txStore.FindTxWithAttempts(ctx, etxUnfinished.ID) require.NoError(t, err) assert.Nil(t, etx.BroadcastAt) assert.Nil(t, etx.InitialBroadcastAt) assert.NotNil(t, etx.Sequence) assert.False(t, etx.Error.Valid) assert.Equal(t, txmgrcommon.TxInProgress, etx.State) assert.Len(t, etx.TxAttempts, 1) assert.Equal(t, txmgrtypes.TxAttemptInProgress, etx.TxAttempts[0].State) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Retryable, failedToReachNodeError).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("eth node returns temporarily underpriced transaction", func(t *testing.T) { // This happens if parity is rejecting transactions that are not priced high enough to even get into the mempool at all // It should pretend it was accepted into the mempool and hand off to ethConfirmer to bump gas as normal temporarilyUnderpricedError := "There are too many transactions in the queue. Your transaction was dropped due to limit. Try increasing the fee." localNextNonce := getLocalNextNonce(t, nonceTracker, fromAddress) // Re-use the previously unfinished transaction, no need to insert new ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Successful, errors.New(temporarilyUnderpricedError)).Once() // Do the thing retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) // Check it was saved correctly with its attempt etx, err := txStore.FindTxWithAttempts(ctx, etxUnfinished.ID) require.NoError(t, err) assert.NotNil(t, etx.BroadcastAt) assert.NotNil(t, etx.InitialBroadcastAt) require.NotNil(t, etx.Sequence) assert.False(t, etx.Error.Valid) assert.Len(t, etx.TxAttempts, 1) attempt := etx.TxAttempts[0] assert.Equal(t, "20 gwei", attempt.TxFee.Legacy.String()) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Successful, errors.New(temporarilyUnderpricedError)).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("eth node returns underpriced transaction and bumping gas doesn't increase it", func(t *testing.T) { // This happens if a transaction's gas price is below the minimum // configured for the transaction pool. // This is a configuration error by the node operator, since it means they set the base gas level too low. underpricedError := "transaction underpriced" localNextNonce := getLocalNextNonce(t, nonceTracker, fromAddress) // In this scenario the node operator REALLY fucked up and set the bump // to zero (even though that should not be possible due to config // validation) evmcfg2 := evmtest.NewChainScopedConfig(t, configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.BumpMin = assets.NewWeiI(0) c.EVM[0].GasEstimator.BumpPercent = ptr[uint16](0) })) eb2 := NewTestEthBroadcaster(t, txStore, ethClient, ethKeyStore, cfg, evmcfg2, &testCheckerFactory{}, false, nonceTracker) mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID) // First was underpriced ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasPrice().Cmp(evmcfg2.EVM().GasEstimator().PriceDefault().ToInt()) == 0 }), fromAddress).Return(commonclient.Underpriced, errors.New(underpricedError)).Once() // Do the thing retryable, err := eb2.ProcessUnstartedTxs(ctx, fromAddress) require.Error(t, err) require.Contains(t, err.Error(), "bumped fee price of 20 gwei is equal to original fee price of 20 gwei. ACTION REQUIRED: This is a configuration error, you must increase either FeeEstimator.BumpPercent or FeeEstimator.BumpMin") assert.True(t, retryable) // TEARDOWN: Clear out the unsent tx before the next test pgtest.MustExec(t, db, `DELETE FROM evm.txes WHERE nonce = $1`, localNextNonce) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `c.EVM[0].GasEstimator.BumpMin = assets.NewWeiI(0)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `c.EVM[0].GasEstimator.BumpPercent = ptr[uint16](0)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasPrice().Cmp(evmcfg2.EVM().GasEstimator().PriceDefault().ToInt()) == 0 }), fromAddress).Return(commonclient.Underpriced, errors.New(underpricedError)).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `pgtest.MustExec(t, db, `DELETE FROM evm.txes WHERE nonce = $1`, localNextNonce)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("eth tx is left in progress if eth node returns insufficient eth", func(t *testing.T) { insufficientEthError := "insufficient funds for transfer" localNextNonce := getLocalNextNonce(t, nonceTracker, fromAddress) etx := mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.InsufficientFunds, errors.New(insufficientEthError)).Once() retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) require.Error(t, err) assert.Contains(t, err.Error(), "insufficient funds for transfer") assert.True(t, retryable) // Check it was saved correctly with its attempt etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Nil(t, etx.BroadcastAt) assert.Nil(t, etx.InitialBroadcastAt) require.NotNil(t, etx.Sequence) assert.False(t, etx.Error.Valid) assert.Equal(t, txmgrcommon.TxInProgress, etx.State) require.Len(t, etx.TxAttempts, 1) attempt := etx.TxAttempts[0] assert.Equal(t, txmgrtypes.TxAttemptInProgress, attempt.State) assert.Nil(t, attempt.BroadcastBeforeBlockNum) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.InsufficientFunds, errors.New(insufficientEthError)).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `pgtest.MustExec(t, db, `DELETE FROM evm.txes`)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("eth tx is left in progress if nonce is too high", func(t *testing.T) { localNextNonce := getLocalNextNonce(t, nonceTracker, fromAddress) nonceGapError := "NonceGap, Future nonce. Expected nonce: " + strconv.FormatUint(localNextNonce, 10) etx := mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Retryable, errors.New(nonceGapError)).Once() retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) require.Error(t, err) assert.Contains(t, err.Error(), nonceGapError) assert.True(t, retryable) etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Nil(t, etx.BroadcastAt) assert.Nil(t, etx.InitialBroadcastAt) require.NotNil(t, etx.Sequence) assert.False(t, etx.Error.Valid) assert.Equal(t, txmgrcommon.TxInProgress, etx.State) require.Len(t, etx.TxAttempts, 1) attempt := etx.TxAttempts[0] assert.Equal(t, txmgrtypes.TxAttemptInProgress, attempt.State) assert.Nil(t, attempt.BroadcastBeforeBlockNum) pgtest.MustExec(t, db, `DELETE FROM evm.txes`) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Retryable, errors.New(nonceGapError)).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `pgtest.MustExec(t, db, `DELETE FROM evm.txes`)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `t.Run("eth node returns underpriced transaction and bumping gas doesn't increase it in EIP-1559 mode", func(t *testing.T) { // This happens if a transaction's gas price is below the minimum // configured for the transaction pool. // This is a configuration error by the node operator, since it means they set the base gas level too low. // In this scenario the node operator REALLY fucked up and set the bump // to zero (even though that should not be possible due to config // validation) evmcfg2 := evmtest.NewChainScopedConfig(t, configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(true) c.EVM[0].GasEstimator.BumpMin = assets.NewWeiI(0) c.EVM[0].GasEstimator.BumpPercent = ptr[uint16](0) })) localNextNonce := getLocalNextNonce(t, nonceTracker, fromAddress) ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(localNextNonce, nil).Once() eb2 := NewTestEthBroadcaster(t, txStore, ethClient, ethKeyStore, cfg, evmcfg2, &testCheckerFactory{}, false, nonceTracker) mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID) underpricedError := "transaction underpriced" localNextNonce = getLocalNextNonce(t, nonceTracker, fromAddress) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasTipCap().Cmp(big.NewInt(1)) == 0 }), fromAddress).Return(commonclient.Underpriced, errors.New(underpricedError)).Once() // Check gas tip cap verification retryable, err := eb2.ProcessUnstartedTxs(ctx, fromAddress) require.Error(t, err) require.Contains(t, err.Error(), "bumped gas tip cap of 1 wei is less than or equal to original gas tip cap of 1 wei") assert.True(t, retryable) pgtest.MustExec(t, db, `DELETE FROM evm.txes`) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(true)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `c.EVM[0].GasEstimator.BumpMin = assets.NewWeiI(0)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `c.EVM[0].GasEstimator.BumpPercent = ptr[uint16](0)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(localNextNonce, nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `localNextNonce = getLocalNextNonce(t, nonceTracker, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasTipCap().Cmp(big.NewInt(1)) == 0 }), fromAddress).Return(commonclient.Underpriced, errors.New(underpricedError)).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `pgtest.MustExec(t, db, `DELETE FROM evm.txes`)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(true)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `c.EVM[0].GasEstimator.TipCapDefault = assets.NewWeiI(0)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(localNextNonce, nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(true)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `c.EVM[0].GasEstimator.TipCapDefault = gasTipCapDefault` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `localNextNonce = getLocalNextNonce(t, nonceTracker, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(localNextNonce, nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `eb2 = NewTestEthBroadcaster(t, txStore, ethClient, ethKeyStore, cfg, evmcfg2, &testCheckerFactory{}, false, nonceTracker)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasTipCap().Cmp(gasTipCapDefault.ToInt()) == 0 }), fromAddress).Return(commonclient.Underpriced, errors.New(underpricedError)).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasTipCap().Cmp(big.NewInt(0).Add(gasTipCapDefault.ToInt(), evmcfg2.EVM().GasEstimator().BumpMin().ToInt())) == 0 }), fromAddress).Return(commonclient.Underpriced, errors.New(underpricedError)).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasTipCap().Cmp(big.NewInt(0).Add(gasTipCapDefault.ToInt(), big.NewInt(0).Mul(evmcfg2.EVM().GasEstimator().BumpMin().ToInt(), big.NewInt(2)))) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `retryable, err = eb2.ProcessUnstartedTxs(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `pgtest.MustExec(t, db, `DELETE FROM evm.txes WHERE nonce = $1`, localNextNonce)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `kst.On("EnabledAddressesForChain", mock.Anything, testutils.FixtureChainID).Return(addresses, nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `kst.On("SignTx", mock.Anything, fromAddress, mock.AnythingOfType("*types.Transaction"), mock.MatchedBy(func(chainID *big.Int) bool { return chainID.Cmp(evmcfg.EVM().ChainID()) == 0 })).Return(&tx, errors.New("could not sign transaction"))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `nonce, err = nonceTracker.GetNextSequence(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `eb.Trigger(testutils.NewAddress())` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `eb.Trigger(testutils.NewAddress())` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `c.EVM[0].NonceAutoSync = ptr(true)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `kst.On("EnabledAddressesForChain", mock.Anything, testutils.FixtureChainID).Return(addresses, nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `tests.AssertLogEventually(t, observed, "Skipping sequence auto-sync")` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == inProgressTxNonce }), fromAddress).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `mustInsertInProgressEthTxWithAttempt(t, txStore, evmtypes.Nonce(inProgressTxNonce), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `nonce = getLocalNextNonce(t, nonceTracker, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FullTestDBV2(t, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmFeeEstimator(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxAttemptBuilder(*ethClient.ConfiguredChainID(), evmcfg.EVM().GasEstimator(), ethKeyStore, estimator)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmClient(ethClient, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("PendingNonceAt", mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(uint64(0), nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmBroadcaster( txStore, txmClient, txmgr.NewEvmTxmConfig(evmcfg.EVM()), txmgr.NewEvmTxmFeeConfig(evmcfg.EVM().GasEstimator()), evmcfg.EVM().Transactions(), cfg.Database().Listener(), ethKeyStore, txBuilder, logger.Test(t), &testCheckerFactory{}, false, )` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmConfig(evmcfg.EVM())` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmFeeConfig(evmcfg.EVM().GasEstimator())` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Transactions()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Database()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Listener()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Start(ctx)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Start(ctx)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.XXXTestCloseInternal()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewTestGeneralConfig(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmFeeEstimator(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxAttemptBuilder(*ethClient.ConfiguredChainID(), evmcfg.EVM().GasEstimator(), ethKeyStore, estimator)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("PendingNonceAt", mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(uint64(0), errors.New("Getting on-chain nonce failed"))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.New("Getting on-chain nonce failed")` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmClient(ethClient, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmBroadcaster( txStore, txmClient, txmgr.NewEvmTxmConfig(evmcfg.EVM()), txmgr.NewEvmTxmFeeConfig(evmcfg.EVM().GasEstimator()), evmcfg.EVM().Transactions(), cfg.Database().Listener(), ethKeyStore, txBuilder, logger.Test(t), &testCheckerFactory{}, false, )` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmConfig(evmcfg.EVM())` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmFeeConfig(evmcfg.EVM().GasEstimator())` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Transactions()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Database()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Listener()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Start(tests.Context(t))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewTestGeneralConfig(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("PendingNonceAt", mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(uint64(0), nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("PendingNonceAt", mock.Anything, otherAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(uint64(0), nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewNonceTracker(lggr, txStore, txmgr.NewEvmTxmClient(ethClient, nil))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmClient(ethClient, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.HexToAddress("0x6C03DDA95a2AEd917EeCc6eddD4b9D16E6380411")` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Now()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Int(assets.NewEthValue(142))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthValue(142)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("no eth_txes at all", func(t *testing.T) { retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(tests.Context(t), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("eth_txes exist for a different from address", func(t *testing.T) { mustCreateUnstartedTx(t, txStore, otherAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID) retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(tests.Context(t), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("existing eth_txes with broadcast_at or error", func(t *testing.T) { nonce := evmtypes.Nonce(342) errStr := "some error" etxUnconfirmed := txmgr.Tx{ Sequence: &nonce, FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: encodedPayload, Value: value, FeeLimit: gasLimit, BroadcastAt: &timeNow, InitialBroadcastAt: &timeNow, Error: null.String{}, State: txmgrcommon.TxUnconfirmed, } etxWithError := txmgr.Tx{ Sequence: nil, FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: encodedPayload, Value: value, FeeLimit: gasLimit, Error: null.StringFrom(errStr), State: txmgrcommon.TxFatalError, } require.NoError(t, txStore.InsertTx(ctx, &etxUnconfirmed)) require.NoError(t, txStore.InsertTx(ctx, &etxWithError)) retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce(342)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.StringFrom(errStr)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(tests.Context(t), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("sends 3 EthTxs in order with higher value last, and lower values starting from the earliest", func(t *testing.T) { // Higher value expensiveEthTx := txmgr.Tx{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: []byte{42, 42, 0}, Value: big.Int(assets.NewEthValue(242)), FeeLimit: gasLimit, CreatedAt: time.Unix(0, 0), State: txmgrcommon.TxUnstarted, } ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(2) && tx.Value().Cmp(big.NewInt(242)) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once() // Earlier tr := int32(99) b, err := json.Marshal(txmgr.TxMeta{JobID: &tr}) require.NoError(t, err) meta := sqlutil.JSON(b) earlierEthTx := txmgr.Tx{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: []byte{42, 42, 0}, Value: value, FeeLimit: gasLimit, CreatedAt: time.Unix(0, 1), State: txmgrcommon.TxUnstarted, Meta: &meta, } ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { if tx.Nonce() != uint64(0) { return false } require.Equal(t, evmcfg.EVM().ChainID(), tx.ChainId()) require.Equal(t, gasLimit, tx.Gas()) require.Equal(t, evmcfg.EVM().GasEstimator().PriceDefault().ToInt(), tx.GasPrice()) require.Equal(t, toAddress, *tx.To()) require.Equal(t, value.String(), tx.Value().String()) require.Equal(t, earlierEthTx.EncodedPayload, tx.Data()) return true }), fromAddress).Return(commonclient.Successful, nil).Once() // Later laterEthTx := txmgr.Tx{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: []byte{42, 42, 1}, Value: value, FeeLimit: gasLimit, CreatedAt: time.Unix(1, 0), State: txmgrcommon.TxUnstarted, } ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { if tx.Nonce() != uint64(1) { return false } require.Equal(t, evmcfg.EVM().ChainID(), tx.ChainId()) require.Equal(t, gasLimit, tx.Gas()) require.Equal(t, evmcfg.EVM().GasEstimator().PriceDefault().ToInt(), tx.GasPrice()) require.Equal(t, toAddress, *tx.To()) require.Equal(t, value.String(), tx.Value().String()) require.Equal(t, laterEthTx.EncodedPayload, tx.Data()) return true }), fromAddress).Return(commonclient.Successful, nil).Once() // Insertion order deliberately reversed to test ordering require.NoError(t, txStore.InsertTx(ctx, &expensiveEthTx)) require.NoError(t, txStore.InsertTx(ctx, &laterEthTx)) require.NoError(t, txStore.InsertTx(ctx, &earlierEthTx)) // Do the thing retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) // Check earlierEthTx and it's attempt // This was the earlier one sent so it has the lower nonce earlierTransaction, err := txStore.FindTxWithAttempts(ctx, earlierEthTx.ID) require.NoError(t, err) assert.False(t, earlierTransaction.Error.Valid) require.NotNil(t, earlierTransaction.FromAddress) assert.Equal(t, fromAddress, earlierTransaction.FromAddress) require.NotNil(t, earlierTransaction.Sequence) assert.Equal(t, evmtypes.Nonce(0), *earlierTransaction.Sequence) assert.NotNil(t, earlierTransaction.BroadcastAt) assert.NotNil(t, earlierTransaction.InitialBroadcastAt) assert.Len(t, earlierTransaction.TxAttempts, 1) var m txmgr.TxMeta err = json.Unmarshal(*earlierEthTx.Meta, &m) require.NoError(t, err) assert.NotNil(t, m.JobID) assert.Equal(t, tr, *m.JobID) attempt := earlierTransaction.TxAttempts[0] assert.Equal(t, earlierTransaction.ID, attempt.TxID) assert.NotNil(t, attempt.TxFee.Legacy) assert.Nil(t, attempt.TxFee.DynamicTipCap) assert.Nil(t, attempt.TxFee.DynamicFeeCap) assert.Equal(t, evmcfg.EVM().GasEstimator().PriceDefault(), attempt.TxFee.Legacy) _, err = txmgr.GetGethSignedTx(attempt.SignedRawTx) require.NoError(t, err) assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt.State) require.Len(t, attempt.Receipts, 0) // Check laterEthTx and it's attempt // This was the later one sent so it has the higher nonce laterTransaction, err := txStore.FindTxWithAttempts(ctx, laterEthTx.ID) require.NoError(t, err) assert.False(t, earlierTransaction.Error.Valid) require.NotNil(t, laterTransaction.FromAddress) assert.Equal(t, fromAddress, laterTransaction.FromAddress) require.NotNil(t, laterTransaction.Sequence) assert.Equal(t, evmtypes.Nonce(1), *laterTransaction.Sequence) assert.NotNil(t, laterTransaction.BroadcastAt) assert.NotNil(t, earlierTransaction.InitialBroadcastAt) assert.Len(t, laterTransaction.TxAttempts, 1) attempt = laterTransaction.TxAttempts[0] assert.Equal(t, laterTransaction.ID, attempt.TxID) assert.Equal(t, evmcfg.EVM().GasEstimator().PriceDefault(), attempt.TxFee.Legacy) _, err = txmgr.GetGethSignedTx(attempt.SignedRawTx) require.NoError(t, err) assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt.State) require.Len(t, attempt.Receipts, 0) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Int(assets.NewEthValue(242))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthValue(242)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Unix(0, 0)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(2) && tx.Value().Cmp(big.NewInt(242)) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(2) && tx.Value().Cmp(big.NewInt(242)) == 0 })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Value()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Cmp(big.NewInt(242))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewInt(242)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Marshal(txmgr.TxMeta{JobID: &tr})` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.JSON(b)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Unix(0, 1)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { if tx.Nonce() != uint64(0) { return false } require.Equal(t, evmcfg.EVM().ChainID(), tx.ChainId()) require.Equal(t, gasLimit, tx.Gas()) require.Equal(t, evmcfg.EVM().GasEstimator().PriceDefault().ToInt(), tx.GasPrice()) require.Equal(t, toAddress, *tx.To()) require.Equal(t, value.String(), tx.Value().String()) require.Equal(t, earlierEthTx.EncodedPayload, tx.Data()) return true }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { if tx.Nonce() != uint64(0) { return false } require.Equal(t, evmcfg.EVM().ChainID(), tx.ChainId()) require.Equal(t, gasLimit, tx.Gas()) require.Equal(t, evmcfg.EVM().GasEstimator().PriceDefault().ToInt(), tx.GasPrice()) require.Equal(t, toAddress, *tx.To()) require.Equal(t, value.String(), tx.Value().String()) require.Equal(t, earlierEthTx.EncodedPayload, tx.Data()) return true })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Unix(1, 0)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { if tx.Nonce() != uint64(1) { return false } require.Equal(t, evmcfg.EVM().ChainID(), tx.ChainId()) require.Equal(t, gasLimit, tx.Gas()) require.Equal(t, evmcfg.EVM().GasEstimator().PriceDefault().ToInt(), tx.GasPrice()) require.Equal(t, toAddress, *tx.To()) require.Equal(t, value.String(), tx.Value().String()) require.Equal(t, laterEthTx.EncodedPayload, tx.Data()) return true }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { if tx.Nonce() != uint64(1) { return false } require.Equal(t, evmcfg.EVM().ChainID(), tx.ChainId()) require.Equal(t, gasLimit, tx.Gas()) require.Equal(t, evmcfg.EVM().GasEstimator().PriceDefault().ToInt(), tx.GasPrice()) require.Equal(t, toAddress, *tx.To()) require.Equal(t, value.String(), tx.Value().String()) require.Equal(t, laterEthTx.EncodedPayload, tx.Data()) return true })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(tests.Context(t), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, earlierEthTx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Unmarshal(*earlierEthTx.Meta, &m)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GetGethSignedTx(attempt.SignedRawTx)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, laterEthTx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GetGethSignedTx(attempt.SignedRawTx)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Intn(5000)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(true) c.EVM[0].GasEstimator.TipCapDefault = assets.NewWeiI(rnd) c.EVM[0].GasEstimator.FeeCapDefault = assets.NewWeiI(rnd + 1) c.EVM[0].GasEstimator.PriceMax = assets.NewWeiI(rnd + 2) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewWeiI(rnd)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewWeiI(rnd + 1)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewWeiI(rnd + 2)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("PendingNonceAt", mock.Anything, otherAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(uint64(1), nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewNonceTracker(lggr, txStore, txmgr.NewEvmTxmClient(ethClient, nil))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmClient(ethClient, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("sends transactions with type 0x2 in EIP-1559 mode", func(t *testing.T) { ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(343) && tx.Value().Cmp(big.NewInt(242)) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once() etx := mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, []byte{42, 42, 0}, gasLimit, big.Int(assets.NewEthValue(242)), testutils.FixtureChainID) // Do the thing { retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) } // Check eipTxWithAl and it's attempt // This was the earlier one sent so it has the lower nonce etx, err := txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.False(t, etx.Error.Valid) require.NotNil(t, etx.FromAddress) assert.Equal(t, fromAddress, etx.FromAddress) require.NotNil(t, etx.Sequence) assert.Equal(t, evmtypes.Nonce(343), *etx.Sequence) assert.NotNil(t, etx.BroadcastAt) assert.NotNil(t, etx.InitialBroadcastAt) assert.Len(t, etx.TxAttempts, 1) attempt := etx.TxAttempts[0] assert.Equal(t, etx.ID, attempt.TxID) assert.Nil(t, attempt.TxFee.Legacy) assert.Equal(t, rnd, attempt.TxFee.DynamicTipCap.ToInt().Int64()) assert.Equal(t, rnd+1, attempt.TxFee.DynamicFeeCap.ToInt().Int64()) _, err = txmgr.GetGethSignedTx(attempt.SignedRawTx) require.NoError(t, err) assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt.State) require.Len(t, attempt.Receipts, 0) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(343) && tx.Value().Cmp(big.NewInt(242)) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(343) && tx.Value().Cmp(big.NewInt(242)) == 0 })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Value()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Cmp(big.NewInt(242))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewInt(242)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Int(assets.NewEthValue(242))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthValue(242)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(tests.Context(t), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GetGethSignedTx(attempt.SignedRawTx)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("when simulation succeeds, sends tx as normal", func(t *testing.T) { txRequest := txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: []byte{42, 0, 0}, Value: big.Int(assets.NewEthValue(442)), FeeLimit: gasLimit, Strategy: txmgrcommon.NewSendEveryStrategy(), Checker: txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeSimulate, }, } ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(344) && tx.Value().Cmp(big.NewInt(442)) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once() ethClient.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { if fmt.Sprintf("%s", callarg["value"]) == "0x1ba" { // 442 assert.Equal(t, txRequest.FromAddress, callarg["from"]) assert.Equal(t, &txRequest.ToAddress, callarg["to"]) assert.Equal(t, hexutil.Uint64(txRequest.FeeLimit), callarg["gas"]) assert.Nil(t, callarg["gasPrice"]) assert.Nil(t, callarg["maxFeePerGas"]) assert.Nil(t, callarg["maxPriorityFeePerGas"]) assert.Equal(t, (*hexutil.Big)(&txRequest.Value), callarg["value"]) assert.Equal(t, hexutil.Bytes(txRequest.EncodedPayload), callarg["data"]) return true } return false }), "latest").Return(nil).Once() ethTx := mustCreateUnstartedTxFromEvmTxRequest(t, txStore, txRequest, testutils.FixtureChainID) { retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) } // Check ethtx was sent ethTx, err := txStore.FindTxWithAttempts(ctx, ethTx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, ethTx.State) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Int(assets.NewEthValue(442))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthValue(442)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewSendEveryStrategy()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(344) && tx.Value().Cmp(big.NewInt(442)) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(344) && tx.Value().Cmp(big.NewInt(442)) == 0 })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Value()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Cmp(big.NewInt(442))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewInt(442)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { if fmt.Sprintf("%s", callarg["value"]) == "0x1ba" { // 442 assert.Equal(t, txRequest.FromAddress, callarg["from"]) assert.Equal(t, &txRequest.ToAddress, callarg["to"]) assert.Equal(t, hexutil.Uint64(txRequest.FeeLimit), callarg["gas"]) assert.Nil(t, callarg["gasPrice"]) assert.Nil(t, callarg["maxFeePerGas"]) assert.Nil(t, callarg["maxPriorityFeePerGas"]) assert.Equal(t, (*hexutil.Big)(&txRequest.Value), callarg["value"]) assert.Equal(t, hexutil.Bytes(txRequest.EncodedPayload), callarg["data"]) return true } return false }), "latest")` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.AnythingOfType("*hexutil.Bytes")` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(callarg map[string]interface{}) bool { if fmt.Sprintf("%s", callarg["value"]) == "0x1ba" { // 442 assert.Equal(t, txRequest.FromAddress, callarg["from"]) assert.Equal(t, &txRequest.ToAddress, callarg["to"]) assert.Equal(t, hexutil.Uint64(txRequest.FeeLimit), callarg["gas"]) assert.Nil(t, callarg["gasPrice"]) assert.Nil(t, callarg["maxFeePerGas"]) assert.Nil(t, callarg["maxPriorityFeePerGas"]) assert.Equal(t, (*hexutil.Big)(&txRequest.Value), callarg["value"]) assert.Equal(t, hexutil.Bytes(txRequest.EncodedPayload), callarg["data"]) return true } return false })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Sprintf("%s", callarg["value"])` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(tests.Context(t), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, ethTx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("with unknown error, sends tx as normal", func(t *testing.T) { ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(345) && tx.Value().Cmp(big.NewInt(542)) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once() ethClient.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x21e" // 542 }), "latest").Return(errors.New("this is not a revert, something unexpected went wrong")).Once() ethTx := mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, testutils.FixtureChainID, txRequestWithChecker(checker), txRequestWithValue(big.Int(assets.NewEthValue(542)))) { retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) } ethTx, err := txStore.FindTxWithAttempts(ctx, ethTx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, ethTx.State) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(345) && tx.Value().Cmp(big.NewInt(542)) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(345) && tx.Value().Cmp(big.NewInt(542)) == 0 })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Value()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Cmp(big.NewInt(542))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewInt(542)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x21e" // 542 }), "latest")` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.AnythingOfType("*hexutil.Bytes")` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x21e" // 542 })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Sprintf("%s", callarg["value"])` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(errors.New("this is not a revert, something unexpected went wrong"))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.New("this is not a revert, something unexpected went wrong")` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Int(assets.NewEthValue(542))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthValue(542)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(tests.Context(t), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, ethTx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("on revert, marks tx as fatally errored and does not send", func(t *testing.T) { jerr := client.JsonError{ Code: 42, Message: "oh no, it reverted", Data: []byte{42, 166, 34}, } ethClient.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x282" // 642 }), "latest").Return(&jerr).Once() ethTx := mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, testutils.FixtureChainID, txRequestWithChecker(checker), txRequestWithValue(big.Int(assets.NewEthValue(642)))) { retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) } ethTx, err := txStore.FindTxWithAttempts(ctx, ethTx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxFatalError, ethTx.State) assert.True(t, ethTx.Error.Valid) assert.Equal(t, "transaction reverted during simulation: json-rpc error { Code = 42, Message = 'oh no, it reverted', Data = 'KqYi' }", ethTx.Error.String) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x282" // 642 }), "latest")` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.AnythingOfType("*hexutil.Bytes")` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x282" // 642 })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Sprintf("%s", callarg["value"])` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(&jerr)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Int(assets.NewEthValue(642))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthValue(642)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(tests.Context(t), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, ethTx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewTestGeneralConfig(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("PendingNonceAt", mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(uint64(0), nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewNonceTracker(logger.Test(t), txStore, txmgr.NewEvmTxmClient(ethClient, nil))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmClient(ethClient, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("when transmit checking times out, sends tx as normal", func(t *testing.T) { // Checker will return a canceled error checkerFactory.err = context.Canceled ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == 0 && tx.Value().Cmp(big.NewInt(442)) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once() ethTx := mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, testutils.FixtureChainID, txRequestWithValue(big.Int(assets.NewEthValue(442))), txRequestWithChecker(checker)) { retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) } // Check ethtx was sent ethTx, err := txStore.FindTxWithAttempts(ctx, ethTx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, ethTx.State) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == 0 && tx.Value().Cmp(big.NewInt(442)) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == 0 && tx.Value().Cmp(big.NewInt(442)) == 0 })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Value()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Cmp(big.NewInt(442))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewInt(442)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Int(assets.NewEthValue(442))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthValue(442)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(tests.Context(t), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, ethTx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("when transmit checking succeeds, sends tx as normal", func(t *testing.T) { // Checker will return no error checkerFactory.err = nil ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == 1 && tx.Value().Cmp(big.NewInt(442)) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once() ethTx := mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, testutils.FixtureChainID, txRequestWithValue(big.Int(assets.NewEthValue(442))), txRequestWithChecker(checker)) { retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) } // Check ethtx was sent ethTx, err := txStore.FindTxWithAttempts(ctx, ethTx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, ethTx.State) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == 1 && tx.Value().Cmp(big.NewInt(442)) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == 1 && tx.Value().Cmp(big.NewInt(442)) == 0 })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Value()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Cmp(big.NewInt(442))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewInt(442)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Int(assets.NewEthValue(442))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthValue(442)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(tests.Context(t), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, ethTx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.New("fatal checker error")` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(tests.Context(t), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, ethTx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FullTestDBV2(t, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmConfig(ccfg.EVM())` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmFeeEstimator(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxAttemptBuilder(*ethClient.ConfiguredChainID(), ccfg.EVM().GasEstimator(), ethKeyStore, estimator)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("GetFee", mock.Anything, mock.Anything, mock.Anything, ccfg.EVM().GasEstimator().PriceMaxKey(fromAddress))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.PriceMaxKey(fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(gas.EvmFee{Legacy: assets.GWei(32)}, uint64(500), nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GWei(32)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run(func(_ mock.Arguments) { close(chStartEstimate) <-chBlock })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("PendingNonceAt", mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(uint64(0), nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmClient(ethClient, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmBroadcaster( txStore, txmClient, evmcfg, txmgr.NewEvmTxmFeeConfig(ccfg.EVM().GasEstimator()), ccfg.EVM().Transactions(), cfg.Database().Listener(), ethKeyStore, txBuilder, logger.Test(t), &testCheckerFactory{}, false, )` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmFeeConfig(ccfg.EVM().GasEstimator())` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Transactions()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Database()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Listener()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.XXXTestDisableUnstartedTxAutoProcessing()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run(t, eb)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.After(5 * time.Second)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(tests.Context(t), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { // Configured gas price changed lm := decimal.RequireFromString("1.3") c.EVM[0].GasEstimator.LimitMultiplier = &lm })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.RequireFromString("1.3")` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("PendingNonceAt", mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(uint64(0), nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewNonceTracker(logger.Test(t), txStore, txmgr.NewEvmTxmClient(ethClient, nil))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmClient(ethClient, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { assert.Equal(t, int(1600), int(tx.Gas())) return true }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { assert.Equal(t, int(1600), int(tx.Gas())) return true })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.HexToAddress("0x6C03DDA95a2AEd917EeCc6eddD4b9D16E6380411")` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Int(assets.NewEthValue(242))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthValue(242)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewSendEveryStrategy()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(tests.Context(t), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.HexToAddress("0x6C03DDA95a2AEd917EeCc6eddD4b9D16E6380411")` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Int(assets.NewEthValue(142))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthValue(142)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce(916714082576372851)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewGeneralConfig(t, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("cannot be more than one transaction per address in an unfinished state", func(t *testing.T) { db := pgtest.NewSqlxDB(t) txStore := cltest.NewTestTxStore(t, db) ethKeyStore := cltest.NewKeyStore(t, db).Eth() _, fromAddress := cltest.RandomKey{Nonce: nextNonce.Int64()}.MustInsertWithState(t, ethKeyStore) firstInProgress := txmgr.Tx{ FromAddress: fromAddress, Sequence: &firstNonce, ToAddress: toAddress, EncodedPayload: encodedPayload, Value: value, FeeLimit: gasLimit, Error: null.String{}, State: txmgrcommon.TxInProgress, } secondInProgress := txmgr.Tx{ FromAddress: fromAddress, Sequence: &secondNonce, ToAddress: toAddress, EncodedPayload: encodedPayload, Value: value, FeeLimit: gasLimit, Error: null.String{}, State: txmgrcommon.TxInProgress, } require.NoError(t, txStore.InsertTx(ctx, &firstInProgress)) err := txStore.InsertTx(ctx, &secondInProgress) require.Error(t, err) assert.Contains(t, err.Error(), "ERROR: duplicate key value violates unique constraint \"idx_only_one_in_progress_tx_per_account_id_per_evm_chain_id\" (SQLSTATE 23505)") })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Int64()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MustInsertWithState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.InsertTx(ctx, &secondInProgress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("previous run assigned nonce but never broadcast", func(t *testing.T) { db := pgtest.NewSqlxDB(t) txStore := cltest.NewTestTxStore(t, db) ethKeyStore := cltest.NewKeyStore(t, db).Eth() _, fromAddress := cltest.RandomKey{Nonce: nextNonce.Int64()}.MustInsertWithState(t, ethKeyStore) ethClient := testutils.NewEthClientMockWithDefaultChain(t) ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), nil).Once() nonceTracker := txmgr.NewNonceTracker(logger.Test(t), txStore, txmgr.NewEvmTxmClient(ethClient, nil)) eb := NewTestEthBroadcaster(t, txStore, ethClient, ethKeyStore, cfg, evmcfg, &testCheckerFactory{}, false, nonceTracker) // Crashed right after we commit the database transaction that saved // the nonce to the eth_tx so evm.key_states.next_nonce has not been // incremented yet inProgressEthTx := mustInsertInProgressEthTxWithAttempt(t, txStore, firstNonce, fromAddress) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(firstNonce) }), fromAddress).Return(commonclient.Successful, nil).Once() // Do the thing { retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) } // Check it was saved correctly with its attempt etx, err := txStore.FindTxWithAttempts(ctx, inProgressEthTx.ID) require.NoError(t, err) assert.NotNil(t, etx.BroadcastAt) assert.NotNil(t, etx.InitialBroadcastAt) assert.False(t, etx.Error.Valid) assert.Len(t, etx.TxAttempts, 1) assert.Equal(t, txmgrtypes.TxAttemptBroadcast, etx.TxAttempts[0].State) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Int64()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MustInsertWithState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("PendingNonceAt", mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(uint64(0), nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewNonceTracker(logger.Test(t), txStore, txmgr.NewEvmTxmClient(ethClient, nil))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmClient(ethClient, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(firstNonce) }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(firstNonce) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(tests.Context(t), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, inProgressEthTx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("previous run assigned nonce and broadcast but it fatally errored before we could save", func(t *testing.T) { db := pgtest.NewSqlxDB(t) txStore := cltest.NewTestTxStore(t, db) ethKeyStore := cltest.NewKeyStore(t, db).Eth() _, fromAddress := cltest.RandomKey{Nonce: nextNonce.Int64()}.MustInsertWithState(t, ethKeyStore) ethClient := testutils.NewEthClientMockWithDefaultChain(t) ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), nil).Once() nonceTracker := txmgr.NewNonceTracker(logger.Test(t), txStore, txmgr.NewEvmTxmClient(ethClient, nil)) eb := NewTestEthBroadcaster(t, txStore, ethClient, ethKeyStore, cfg, evmcfg, &testCheckerFactory{}, false, nonceTracker) // Crashed right after we commit the database transaction that saved the nonce to the eth_tx inProgressEthTx := mustInsertInProgressEthTxWithAttempt(t, txStore, firstNonce, fromAddress) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(firstNonce) }), fromAddress).Return(commonclient.Fatal, errors.New("exceeds block gas limit")).Once() // Do the thing { retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) } // Check it was saved correctly with its attempt etx, err := txStore.FindTxWithAttempts(ctx, inProgressEthTx.ID) require.NoError(t, err) assert.Nil(t, etx.BroadcastAt) assert.Nil(t, etx.InitialBroadcastAt) assert.True(t, etx.Error.Valid) assert.Equal(t, "exceeds block gas limit", etx.Error.String) assert.Len(t, etx.TxAttempts, 0) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Int64()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MustInsertWithState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("PendingNonceAt", mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(uint64(0), nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewNonceTracker(logger.Test(t), txStore, txmgr.NewEvmTxmClient(ethClient, nil))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmClient(ethClient, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(firstNonce) }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(firstNonce) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Fatal, errors.New("exceeds block gas limit"))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.New("exceeds block gas limit")` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(tests.Context(t), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, inProgressEthTx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("previous run assigned nonce and broadcast and is now in mempool", func(t *testing.T) { db := pgtest.NewSqlxDB(t) txStore := cltest.NewTestTxStore(t, db) ethKeyStore := cltest.NewKeyStore(t, db).Eth() _, fromAddress := cltest.RandomKey{Nonce: nextNonce.Int64()}.MustInsertWithState(t, ethKeyStore) ethClient := testutils.NewEthClientMockWithDefaultChain(t) ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), nil).Once() nonceTracker := txmgr.NewNonceTracker(logger.Test(t), txStore, txmgr.NewEvmTxmClient(ethClient, nil)) eb := NewTestEthBroadcaster(t, txStore, ethClient, ethKeyStore, cfg, evmcfg, &testCheckerFactory{}, false, nonceTracker) // Crashed right after we commit the database transaction that saved the nonce to the eth_tx inProgressEthTx := mustInsertInProgressEthTxWithAttempt(t, txStore, firstNonce, fromAddress) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(firstNonce) }), fromAddress).Return(commonclient.Successful, errors.New("known transaction: a1313bd99a81fb4d8ad1d2e90b67c6b3fa77545c990d6251444b83b70b6f8980")).Once() // Do the thing { retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) } // Check it was saved correctly with its attempt etx, err := txStore.FindTxWithAttempts(ctx, inProgressEthTx.ID) require.NoError(t, err) assert.NotNil(t, etx.BroadcastAt) assert.NotNil(t, etx.InitialBroadcastAt) assert.False(t, etx.Error.Valid) assert.Len(t, etx.TxAttempts, 1) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Int64()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MustInsertWithState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("PendingNonceAt", mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(uint64(0), nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewNonceTracker(logger.Test(t), txStore, txmgr.NewEvmTxmClient(ethClient, nil))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmClient(ethClient, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(firstNonce) }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(firstNonce) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Successful, errors.New("known transaction: a1313bd99a81fb4d8ad1d2e90b67c6b3fa77545c990d6251444b83b70b6f8980"))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.New("known transaction: a1313bd99a81fb4d8ad1d2e90b67c6b3fa77545c990d6251444b83b70b6f8980")` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(tests.Context(t), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, inProgressEthTx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("previous run assigned nonce and broadcast and now the transaction has been confirmed", func(t *testing.T) { db := pgtest.NewSqlxDB(t) txStore := cltest.NewTestTxStore(t, db) ethKeyStore := cltest.NewKeyStore(t, db).Eth() _, fromAddress := cltest.RandomKey{Nonce: nextNonce.Int64()}.MustInsertWithState(t, ethKeyStore) ethClient := testutils.NewEthClientMockWithDefaultChain(t) ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), nil).Once() nonceTracker := txmgr.NewNonceTracker(logger.Test(t), txStore, txmgr.NewEvmTxmClient(ethClient, nil)) eb := NewTestEthBroadcaster(t, txStore, ethClient, ethKeyStore, cfg, evmcfg, &testCheckerFactory{}, false, nonceTracker) // Crashed right after we commit the database transaction that saved the nonce to the eth_tx inProgressEthTx := mustInsertInProgressEthTxWithAttempt(t, txStore, firstNonce, fromAddress) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(firstNonce) }), fromAddress).Return(commonclient.TransactionAlreadyKnown, errors.New("nonce too low")).Once() // Do the thing { retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) assert.NoError(t, err) assert.False(t, retryable) } // Check it was saved correctly with its attempt etx, err := txStore.FindTxWithAttempts(ctx, inProgressEthTx.ID) require.NoError(t, err) require.NotNil(t, etx.BroadcastAt) assert.Equal(t, *etx.BroadcastAt, etx.CreatedAt) assert.NotNil(t, etx.InitialBroadcastAt) assert.False(t, etx.Error.Valid) assert.Len(t, etx.TxAttempts, 1) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Int64()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MustInsertWithState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("PendingNonceAt", mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(uint64(0), nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewNonceTracker(logger.Test(t), txStore, txmgr.NewEvmTxmClient(ethClient, nil))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmClient(ethClient, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(firstNonce) }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(firstNonce) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.TransactionAlreadyKnown, errors.New("nonce too low"))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.New("nonce too low")` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(tests.Context(t), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, inProgressEthTx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("previous run assigned nonce and then failed to reach node for some reason and node is still down", func(t *testing.T) { failedToReachNodeError := context.DeadlineExceeded db := pgtest.NewSqlxDB(t) txStore := cltest.NewTestTxStore(t, db) ethKeyStore := cltest.NewKeyStore(t, db).Eth() _, fromAddress := cltest.RandomKey{Nonce: nextNonce.Int64()}.MustInsertWithState(t, ethKeyStore) ethClient := testutils.NewEthClientMockWithDefaultChain(t) ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), nil).Once() nonceTracker := txmgr.NewNonceTracker(logger.Test(t), txStore, txmgr.NewEvmTxmClient(ethClient, nil)) eb := NewTestEthBroadcaster(t, txStore, ethClient, ethKeyStore, cfg, evmcfg, &testCheckerFactory{}, false, nonceTracker) // Crashed right after we commit the database transaction that saved the nonce to the eth_tx inProgressEthTx := mustInsertInProgressEthTxWithAttempt(t, txStore, firstNonce, fromAddress) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(firstNonce) }), fromAddress).Return(commonclient.Retryable, failedToReachNodeError).Once() // Do the thing retryable, err := eb.ProcessUnstartedTxs(tests.Context(t), fromAddress) require.Error(t, err) assert.Contains(t, err.Error(), failedToReachNodeError.Error()) assert.True(t, retryable) // Check it was left in the unfinished state etx, err := txStore.FindTxWithAttempts(ctx, inProgressEthTx.ID) require.NoError(t, err) assert.Nil(t, etx.BroadcastAt) assert.Nil(t, etx.InitialBroadcastAt) assert.Equal(t, nextNonce, *etx.Sequence) assert.False(t, etx.Error.Valid) assert.Len(t, etx.TxAttempts, 1) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Int64()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MustInsertWithState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("PendingNonceAt", mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(uint64(0), nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewNonceTracker(logger.Test(t), txStore, txmgr.NewEvmTxmClient(ethClient, nil))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmClient(ethClient, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(firstNonce) }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(firstNonce) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Retryable, failedToReachNodeError)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(tests.Context(t), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, inProgressEthTx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Int64()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MustInsertWithState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { // Configured gas price changed c.EVM[0].GasEstimator.PriceDefault = assets.NewWeiI(500000000000) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewWeiI(500000000000)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("PendingNonceAt", mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(uint64(0), nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewNonceTracker(logger.Test(t), txStore, txmgr.NewEvmTxmClient(ethClient, nil))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmClient(ethClient, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { // Ensure that the gas price is the same as the original attempt s, e := txmgr.GetGethSignedTx(attempt.SignedRawTx) require.NoError(t, e) return tx.Nonce() == uint64(firstNonce) && tx.GasPrice().Int64() == s.GasPrice().Int64() }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { // Ensure that the gas price is the same as the original attempt s, e := txmgr.GetGethSignedTx(attempt.SignedRawTx) require.NoError(t, e) return tx.Nonce() == uint64(firstNonce) && tx.GasPrice().Int64() == s.GasPrice().Int64() })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GetGethSignedTx(attempt.SignedRawTx)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Int64()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Int64()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Successful, errors.New("known transaction: a1313bd99a81fb4d8ad1d2e90b67c6b3fa77545c990d6251444b83b70b6f8980"))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.New("known transaction: a1313bd99a81fb4d8ad1d2e90b67c6b3fa77545c990d6251444b83b70b6f8980")` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(tests.Context(t), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, inProgressEthTx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GetGethSignedTx(attempt.SignedRawTx)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.HexToAddress("0x6C03DDA95a2AEd917EeCc6eddD4b9D16E6380411")` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Int(assets.NewEthValue(142))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthValue(142)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewTestGeneralConfig(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("PendingNonceAt", mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(uint64(0), nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmClient(ethClient, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewNonceTracker(lggr, txStore, txmClient)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("if external wallet sent a transaction from the account and now the nonce is one higher than it should be and we got replacement underpriced then we assume a previous transaction of ours was the one that succeeded, and hand off to EthConfirmer", func(t *testing.T) { mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID) // First send, replacement underpriced ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(0) }), fromAddress).Return(commonclient.Successful, errors.New("replacement transaction underpriced")).Once() // Do the thing retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) // Check that the transaction was saved correctly with its attempt // We assume success and hand off to eth confirmer to eventually mark it as failed var latestID int64 var etx1 txmgr.Tx require.NoError(t, db.Get(&latestID, "SELECT max(id) FROM evm.txes")) etx1, err = txStore.FindTxWithAttempts(ctx, latestID) require.NoError(t, err) require.NotNil(t, etx1.BroadcastAt) assert.NotEqual(t, etx1.CreatedAt, *etx1.BroadcastAt) assert.NotNil(t, etx1.InitialBroadcastAt) require.NotNil(t, etx1.Sequence) assert.Equal(t, evmtypes.Nonce(0), *etx1.Sequence) assert.False(t, etx1.Error.Valid) assert.Len(t, etx1.TxAttempts, 1) // Check that the local nonce was incremented by one finalNextNonce := getLocalNextNonce(t, nonceTracker, fromAddress) require.NoError(t, err) require.NotNil(t, finalNextNonce) require.Equal(t, int64(1), int64(finalNextNonce)) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(0) }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == uint64(0) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Successful, errors.New("replacement transaction underpriced"))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.New("replacement transaction underpriced")` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, latestID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("geth Client returns an error in the fatal errors category", func(t *testing.T) { fatalErrorExample := "exceeds block gas limit" localNextNonce := getLocalNextNonce(t, nonceTracker, fromAddress) t.Run("without callback", func(t *testing.T) { etx := mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Fatal, errors.New(fatalErrorExample)).Once() retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) // Check it was saved correctly with its attempt etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Nil(t, etx.BroadcastAt) assert.Nil(t, etx.InitialBroadcastAt) require.Nil(t, etx.Sequence) assert.True(t, etx.Error.Valid) assert.Contains(t, etx.Error.String, "exceeds block gas limit") assert.Len(t, etx.TxAttempts, 0) // Check that the key had its nonce reset var nonce evmtypes.Nonce nonce, err = nonceTracker.GetNextSequence(ctx, fromAddress) require.NoError(t, err) // Saved NextNonce must be the same as before because this transaction // was not accepted by the eth node and never can be require.Equal(t, int64(localNextNonce), int64(nonce)) }) t.Run("with callback", func(t *testing.T) { run := cltest.MustInsertPipelineRun(t, db) tr := cltest.MustInsertUnfinishedPipelineTaskRun(t, db, run.ID) etx := txmgr.Tx{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: encodedPayload, Value: value, FeeLimit: gasLimit, State: txmgrcommon.TxUnstarted, PipelineTaskRunID: uuid.NullUUID{UUID: tr.ID, Valid: true}, SignalCallback: true, } t.Run("with erroring callback bails out", func(t *testing.T) { require.NoError(t, txStore.InsertTx(tests.Context(t), &etx)) fn := func(ctx context.Context, id uuid.UUID, result interface{}, err error) error { return errors.New("something exploded in the callback") } eb.SetResumeCallback(fn) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Fatal, errors.New(fatalErrorExample)).Once() retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) require.Error(t, err) require.Contains(t, err.Error(), "something exploded in the callback") assert.True(t, retryable) }) t.Run("calls resume with error", func(t *testing.T) { fn := func(ctx context.Context, id uuid.UUID, result interface{}, err error) error { require.Equal(t, id, tr.ID) require.Nil(t, result) require.Error(t, err) require.Contains(t, err.Error(), "fatal error while sending transaction: exceeds block gas limit") return nil } eb.SetResumeCallback(fn) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Fatal, errors.New(fatalErrorExample)).Once() { retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) } // same as the parent test, but callback is set by ctor t.Run("callback set by ctor", func(t *testing.T) { estimator := gas.NewEvmFeeEstimator(lggr, func(lggr logger.Logger) gas.EvmEstimator { return gas.NewFixedPriceEstimator(evmcfg.EVM().GasEstimator(), nil, evmcfg.EVM().GasEstimator().BlockHistory(), lggr, nil) }, evmcfg.EVM().GasEstimator().EIP1559DynamicFees(), evmcfg.EVM().GasEstimator()) txBuilder := txmgr.NewEvmTxAttemptBuilder(*ethClient.ConfiguredChainID(), evmcfg.EVM().GasEstimator(), ethKeyStore, estimator) localNextNonce = getLocalNextNonce(t, nonceTracker, fromAddress) eb2 := txmgr.NewEvmBroadcaster(txStore, txmClient, txmgr.NewEvmTxmConfig(evmcfg.EVM()), txmgr.NewEvmTxmFeeConfig(evmcfg.EVM().GasEstimator()), evmcfg.EVM().Transactions(), cfg.Database().Listener(), ethKeyStore, txBuilder, lggr, &testCheckerFactory{}, false) retryable, err := eb2.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) }) }) }) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("without callback", func(t *testing.T) { etx := mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Fatal, errors.New(fatalErrorExample)).Once() retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) // Check it was saved correctly with its attempt etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Nil(t, etx.BroadcastAt) assert.Nil(t, etx.InitialBroadcastAt) require.Nil(t, etx.Sequence) assert.True(t, etx.Error.Valid) assert.Contains(t, etx.Error.String, "exceeds block gas limit") assert.Len(t, etx.TxAttempts, 0) // Check that the key had its nonce reset var nonce evmtypes.Nonce nonce, err = nonceTracker.GetNextSequence(ctx, fromAddress) require.NoError(t, err) // Saved NextNonce must be the same as before because this transaction // was not accepted by the eth node and never can be require.Equal(t, int64(localNextNonce), int64(nonce)) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Fatal, errors.New(fatalErrorExample))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.New(fatalErrorExample)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GetNextSequence(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("with callback", func(t *testing.T) { run := cltest.MustInsertPipelineRun(t, db) tr := cltest.MustInsertUnfinishedPipelineTaskRun(t, db, run.ID) etx := txmgr.Tx{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: encodedPayload, Value: value, FeeLimit: gasLimit, State: txmgrcommon.TxUnstarted, PipelineTaskRunID: uuid.NullUUID{UUID: tr.ID, Valid: true}, SignalCallback: true, } t.Run("with erroring callback bails out", func(t *testing.T) { require.NoError(t, txStore.InsertTx(tests.Context(t), &etx)) fn := func(ctx context.Context, id uuid.UUID, result interface{}, err error) error { return errors.New("something exploded in the callback") } eb.SetResumeCallback(fn) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Fatal, errors.New(fatalErrorExample)).Once() retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) require.Error(t, err) require.Contains(t, err.Error(), "something exploded in the callback") assert.True(t, retryable) }) t.Run("calls resume with error", func(t *testing.T) { fn := func(ctx context.Context, id uuid.UUID, result interface{}, err error) error { require.Equal(t, id, tr.ID) require.Nil(t, result) require.Error(t, err) require.Contains(t, err.Error(), "fatal error while sending transaction: exceeds block gas limit") return nil } eb.SetResumeCallback(fn) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Fatal, errors.New(fatalErrorExample)).Once() { retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) } // same as the parent test, but callback is set by ctor t.Run("callback set by ctor", func(t *testing.T) { estimator := gas.NewEvmFeeEstimator(lggr, func(lggr logger.Logger) gas.EvmEstimator { return gas.NewFixedPriceEstimator(evmcfg.EVM().GasEstimator(), nil, evmcfg.EVM().GasEstimator().BlockHistory(), lggr, nil) }, evmcfg.EVM().GasEstimator().EIP1559DynamicFees(), evmcfg.EVM().GasEstimator()) txBuilder := txmgr.NewEvmTxAttemptBuilder(*ethClient.ConfiguredChainID(), evmcfg.EVM().GasEstimator(), ethKeyStore, estimator) localNextNonce = getLocalNextNonce(t, nonceTracker, fromAddress) eb2 := txmgr.NewEvmBroadcaster(txStore, txmClient, txmgr.NewEvmTxmConfig(evmcfg.EVM()), txmgr.NewEvmTxmFeeConfig(evmcfg.EVM().GasEstimator()), evmcfg.EVM().Transactions(), cfg.Database().Listener(), ethKeyStore, txBuilder, lggr, &testCheckerFactory{}, false) retryable, err := eb2.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) }) }) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MustInsertPipelineRun(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MustInsertUnfinishedPipelineTaskRun(t, db, run.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("with erroring callback bails out", func(t *testing.T) { require.NoError(t, txStore.InsertTx(tests.Context(t), &etx)) fn := func(ctx context.Context, id uuid.UUID, result interface{}, err error) error { return errors.New("something exploded in the callback") } eb.SetResumeCallback(fn) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Fatal, errors.New(fatalErrorExample)).Once() retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) require.Error(t, err) require.Contains(t, err.Error(), "something exploded in the callback") assert.True(t, retryable) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.New("something exploded in the callback")` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.SetResumeCallback(fn)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Fatal, errors.New(fatalErrorExample))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.New(fatalErrorExample)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("calls resume with error", func(t *testing.T) { fn := func(ctx context.Context, id uuid.UUID, result interface{}, err error) error { require.Equal(t, id, tr.ID) require.Nil(t, result) require.Error(t, err) require.Contains(t, err.Error(), "fatal error while sending transaction: exceeds block gas limit") return nil } eb.SetResumeCallback(fn) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Fatal, errors.New(fatalErrorExample)).Once() { retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) } // same as the parent test, but callback is set by ctor t.Run("callback set by ctor", func(t *testing.T) { estimator := gas.NewEvmFeeEstimator(lggr, func(lggr logger.Logger) gas.EvmEstimator { return gas.NewFixedPriceEstimator(evmcfg.EVM().GasEstimator(), nil, evmcfg.EVM().GasEstimator().BlockHistory(), lggr, nil) }, evmcfg.EVM().GasEstimator().EIP1559DynamicFees(), evmcfg.EVM().GasEstimator()) txBuilder := txmgr.NewEvmTxAttemptBuilder(*ethClient.ConfiguredChainID(), evmcfg.EVM().GasEstimator(), ethKeyStore, estimator) localNextNonce = getLocalNextNonce(t, nonceTracker, fromAddress) eb2 := txmgr.NewEvmBroadcaster(txStore, txmClient, txmgr.NewEvmTxmConfig(evmcfg.EVM()), txmgr.NewEvmTxmFeeConfig(evmcfg.EVM().GasEstimator()), evmcfg.EVM().Transactions(), cfg.Database().Listener(), ethKeyStore, txBuilder, lggr, &testCheckerFactory{}, false) retryable, err := eb2.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) }) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.SetResumeCallback(fn)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Fatal, errors.New(fatalErrorExample))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.New(fatalErrorExample)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("callback set by ctor", func(t *testing.T) { estimator := gas.NewEvmFeeEstimator(lggr, func(lggr logger.Logger) gas.EvmEstimator { return gas.NewFixedPriceEstimator(evmcfg.EVM().GasEstimator(), nil, evmcfg.EVM().GasEstimator().BlockHistory(), lggr, nil) }, evmcfg.EVM().GasEstimator().EIP1559DynamicFees(), evmcfg.EVM().GasEstimator()) txBuilder := txmgr.NewEvmTxAttemptBuilder(*ethClient.ConfiguredChainID(), evmcfg.EVM().GasEstimator(), ethKeyStore, estimator) localNextNonce = getLocalNextNonce(t, nonceTracker, fromAddress) eb2 := txmgr.NewEvmBroadcaster(txStore, txmClient, txmgr.NewEvmTxmConfig(evmcfg.EVM()), txmgr.NewEvmTxmFeeConfig(evmcfg.EVM().GasEstimator()), evmcfg.EVM().Transactions(), cfg.Database().Listener(), ethKeyStore, txBuilder, lggr, &testCheckerFactory{}, false) retryable, err := eb2.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmFeeEstimator(lggr, func(lggr logger.Logger) gas.EvmEstimator { return gas.NewFixedPriceEstimator(evmcfg.EVM().GasEstimator(), nil, evmcfg.EVM().GasEstimator().BlockHistory(), lggr, nil) }, evmcfg.EVM().GasEstimator().EIP1559DynamicFees(), evmcfg.EVM().GasEstimator())` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewFixedPriceEstimator(evmcfg.EVM().GasEstimator(), nil, evmcfg.EVM().GasEstimator().BlockHistory(), lggr, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.BlockHistory()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EIP1559DynamicFees()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxAttemptBuilder(*ethClient.ConfiguredChainID(), evmcfg.EVM().GasEstimator(), ethKeyStore, estimator)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmBroadcaster(txStore, txmClient, txmgr.NewEvmTxmConfig(evmcfg.EVM()), txmgr.NewEvmTxmFeeConfig(evmcfg.EVM().GasEstimator()), evmcfg.EVM().Transactions(), cfg.Database().Listener(), ethKeyStore, txBuilder, lggr, &testCheckerFactory{}, false)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmConfig(evmcfg.EVM())` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmFeeConfig(evmcfg.EVM().GasEstimator())` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Transactions()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Database()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Listener()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.SetResumeCallback(nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("geth Client fails with error indicating that the transaction was too expensive", func(t *testing.T) { TxFeeExceedsCapError := "tx fee (1.10 ether) exceeds the configured cap (1.00 ether)" localNextNonce := getLocalNextNonce(t, nonceTracker, fromAddress) ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(localNextNonce, nil).Once() etx := mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.ExceedsMaxFee, errors.New(TxFeeExceedsCapError)).Twice() // In the first case, the tx was NOT accepted into the mempool. In the case // of multiple RPC nodes, it is possible that it can be accepted by // another node even if the primary one returns "exceeds the configured // cap" retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) require.Error(t, err) assert.Contains(t, err.Error(), "tx fee (1.10 ether) exceeds the configured cap (1.00 ether)") assert.Contains(t, err.Error(), "error while sending transaction") assert.True(t, retryable) // Check it was saved with its attempt etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Nil(t, etx.BroadcastAt) assert.Nil(t, etx.InitialBroadcastAt) // Note that InitialBroadcastAt really means "InitialDefinitelySuccessfulBroadcastAt" assert.Equal(t, evmtypes.Nonce(localNextNonce), *etx.Sequence) assert.False(t, etx.Error.Valid) assert.Len(t, etx.TxAttempts, 1) attempt := etx.TxAttempts[0] assert.Equal(t, txmgrtypes.TxAttemptInProgress, attempt.State) // Check that the key had its nonce reset var nonce evmtypes.Nonce nonce, err = nonceTracker.GetNextSequence(ctx, fromAddress) require.NoError(t, err) // Saved NextNonce must be the same as before because this transaction // was not accepted by the eth node and never can be require.Equal(t, int64(localNextNonce), int64(nonce)) // On the second try, the tx has been accepted into the mempool ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(localNextNonce+1, nil).Once() retryable, err = eb.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) // Check it was saved with its attempt etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.NotNil(t, etx.BroadcastAt) assert.NotNil(t, etx.InitialBroadcastAt) // Note that InitialBroadcastAt really means "InitialDefinitelySuccessfulBroadcastAt" assert.Equal(t, evmtypes.Nonce(localNextNonce), *etx.Sequence) assert.False(t, etx.Error.Valid) assert.Len(t, etx.TxAttempts, 1) attempt = etx.TxAttempts[0] assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt.State) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("PendingNonceAt", mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(localNextNonce, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.ExceedsMaxFee, errors.New(TxFeeExceedsCapError))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.New(TxFeeExceedsCapError)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Twice()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GetNextSequence(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("PendingNonceAt", mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(localNextNonce+1, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("eth Client call fails with an unexpected random error, and transaction was not accepted into mempool", func(t *testing.T) { retryableErrorExample := "some unknown error" localNextNonce := getLocalNextNonce(t, nonceTracker, fromAddress) etx := mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Unknown, errors.New(retryableErrorExample)).Once() // Nonce is the same as localNextNonce, implying that this sent transaction has not been accepted ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(localNextNonce, nil).Once() // Do the thing retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) require.Error(t, err) require.Contains(t, err.Error(), retryableErrorExample) assert.True(t, retryable) // Check it was saved correctly with its attempt etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Nil(t, etx.BroadcastAt) assert.Nil(t, etx.InitialBroadcastAt) require.NotNil(t, etx.Sequence) assert.False(t, etx.Error.Valid) assert.Equal(t, txmgrcommon.TxInProgress, etx.State) assert.Len(t, etx.TxAttempts, 1) attempt := etx.TxAttempts[0] assert.Equal(t, txmgrtypes.TxAttemptInProgress, attempt.State) // Now on the second run, it is successful ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Successful, nil).Once() retryable, err = eb.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) // Check it was saved correctly with its attempt etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.NotNil(t, etx.BroadcastAt) assert.NotNil(t, etx.InitialBroadcastAt) require.NotNil(t, etx.Sequence) assert.False(t, etx.Error.Valid) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx.State) assert.Len(t, etx.TxAttempts, 1) attempt = etx.TxAttempts[0] assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt.State) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Unknown, errors.New(retryableErrorExample))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.New(retryableErrorExample)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("PendingNonceAt", mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(localNextNonce, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("eth client call fails with an unexpected random error, and the nonce check also subsequently fails", func(t *testing.T) { retryableErrorExample := "some unknown error" localNextNonce := getLocalNextNonce(t, nonceTracker, fromAddress) etx := mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Unknown, errors.New(retryableErrorExample)).Once() ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), errors.New("pending nonce fetch failed")).Once() // Do the thing retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) require.Error(t, err) require.Contains(t, err.Error(), retryableErrorExample) require.Contains(t, err.Error(), "pending nonce fetch failed") assert.True(t, retryable) // Check it was saved correctly with its attempt etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Nil(t, etx.BroadcastAt) assert.Nil(t, etx.InitialBroadcastAt) require.NotNil(t, etx.Sequence) assert.False(t, etx.Error.Valid) assert.Equal(t, txmgrcommon.TxInProgress, etx.State) assert.Len(t, etx.TxAttempts, 1) attempt := etx.TxAttempts[0] assert.Equal(t, txmgrtypes.TxAttemptInProgress, attempt.State) // Now on the second run, it is successful ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Successful, nil).Once() retryable, err = eb.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) // Check it was saved correctly with its attempt etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.NotNil(t, etx.BroadcastAt) assert.NotNil(t, etx.InitialBroadcastAt) require.NotNil(t, etx.Sequence) assert.False(t, etx.Error.Valid) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx.State) assert.Len(t, etx.TxAttempts, 1) attempt = etx.TxAttempts[0] assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt.State) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Unknown, errors.New(retryableErrorExample))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.New(retryableErrorExample)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("PendingNonceAt", mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(uint64(0), errors.New("pending nonce fetch failed"))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.New("pending nonce fetch failed")` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("eth Client call fails with an unexpected random error, and transaction was accepted into mempool", func(t *testing.T) { retryableErrorExample := "some strange RPC returns an unexpected thing" localNextNonce := getLocalNextNonce(t, nonceTracker, fromAddress) etx := mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Unknown, errors.New(retryableErrorExample)).Once() // Nonce is one higher than localNextNonce, implying that despite the error, this sent transaction has been accepted into the mempool ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(localNextNonce+1, nil).Once() // Do the thing retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) require.NoError(t, err) assert.False(t, retryable) // Check it was saved correctly with its attempt, in a broadcast state etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.NotNil(t, etx.BroadcastAt) assert.NotNil(t, etx.InitialBroadcastAt) require.NotNil(t, etx.Sequence) assert.False(t, etx.Error.Valid) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx.State) assert.Len(t, etx.TxAttempts, 1) attempt := etx.TxAttempts[0] assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt.State) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Unknown, errors.New(retryableErrorExample))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.New(retryableErrorExample)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("PendingNonceAt", mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(localNextNonce+1, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("eth node returns underpriced transaction", func(t *testing.T) { // This happens if a transaction's gas price is below the minimum // configured for the transaction pool. // This is a configuration error by the node operator, since it means they set the base gas level too low. underpricedError := "transaction underpriced" localNextNonce := getLocalNextNonce(t, nonceTracker, fromAddress) etx := mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID) // First was underpriced ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasPrice().Cmp(evmcfg.EVM().GasEstimator().PriceDefault().ToInt()) == 0 }), fromAddress).Return(commonclient.Underpriced, errors.New(underpricedError)).Once() // Second with gas bump was still underpriced ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasPrice().Cmp(big.NewInt(25000000000)) == 0 }), fromAddress).Return(commonclient.Underpriced, errors.New(underpricedError)).Once() // Third succeeded ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasPrice().Cmp(big.NewInt(30000000000)) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once() // Do the thing retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) require.NoError(t, err) assert.False(t, retryable) // Check it was saved correctly with its attempt etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.NotNil(t, etx.BroadcastAt) assert.NotNil(t, etx.InitialBroadcastAt) require.NotNil(t, etx.Sequence) assert.False(t, etx.Error.Valid) assert.Len(t, etx.TxAttempts, 1) attempt := etx.TxAttempts[0] assert.Equal(t, "30 gwei", attempt.TxFee.Legacy.String()) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasPrice().Cmp(evmcfg.EVM().GasEstimator().PriceDefault().ToInt()) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasPrice().Cmp(evmcfg.EVM().GasEstimator().PriceDefault().ToInt()) == 0 })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Cmp(evmcfg.EVM().GasEstimator().PriceDefault().ToInt())` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.PriceDefault()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ToInt()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Underpriced, errors.New(underpricedError))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.New(underpricedError)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasPrice().Cmp(big.NewInt(25000000000)) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasPrice().Cmp(big.NewInt(25000000000)) == 0 })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Cmp(big.NewInt(25000000000))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewInt(25000000000)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Underpriced, errors.New(underpricedError))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.New(underpricedError)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasPrice().Cmp(big.NewInt(30000000000)) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasPrice().Cmp(big.NewInt(30000000000)) == 0 })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Cmp(big.NewInt(30000000000))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewInt(30000000000)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("failed to reach node for some reason", func(t *testing.T) { failedToReachNodeError := context.DeadlineExceeded localNextNonce := getLocalNextNonce(t, nonceTracker, fromAddress) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Retryable, failedToReachNodeError).Once() // Do the thing retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) require.Error(t, err) assert.Contains(t, err.Error(), "context deadline exceeded") assert.True(t, retryable) // Check it was left in the unfinished state etx, err := txStore.FindTxWithAttempts(ctx, etxUnfinished.ID) require.NoError(t, err) assert.Nil(t, etx.BroadcastAt) assert.Nil(t, etx.InitialBroadcastAt) assert.NotNil(t, etx.Sequence) assert.False(t, etx.Error.Valid) assert.Equal(t, txmgrcommon.TxInProgress, etx.State) assert.Len(t, etx.TxAttempts, 1) assert.Equal(t, txmgrtypes.TxAttemptInProgress, etx.TxAttempts[0].State) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Retryable, failedToReachNodeError)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, etxUnfinished.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("eth node returns temporarily underpriced transaction", func(t *testing.T) { // This happens if parity is rejecting transactions that are not priced high enough to even get into the mempool at all // It should pretend it was accepted into the mempool and hand off to ethConfirmer to bump gas as normal temporarilyUnderpricedError := "There are too many transactions in the queue. Your transaction was dropped due to limit. Try increasing the fee." localNextNonce := getLocalNextNonce(t, nonceTracker, fromAddress) // Re-use the previously unfinished transaction, no need to insert new ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Successful, errors.New(temporarilyUnderpricedError)).Once() // Do the thing retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) assert.NoError(t, err) assert.False(t, retryable) // Check it was saved correctly with its attempt etx, err := txStore.FindTxWithAttempts(ctx, etxUnfinished.ID) require.NoError(t, err) assert.NotNil(t, etx.BroadcastAt) assert.NotNil(t, etx.InitialBroadcastAt) require.NotNil(t, etx.Sequence) assert.False(t, etx.Error.Valid) assert.Len(t, etx.TxAttempts, 1) attempt := etx.TxAttempts[0] assert.Equal(t, "20 gwei", attempt.TxFee.Legacy.String()) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Successful, errors.New(temporarilyUnderpricedError))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.New(temporarilyUnderpricedError)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, etxUnfinished.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("eth node returns underpriced transaction and bumping gas doesn't increase it", func(t *testing.T) { // This happens if a transaction's gas price is below the minimum // configured for the transaction pool. // This is a configuration error by the node operator, since it means they set the base gas level too low. underpricedError := "transaction underpriced" localNextNonce := getLocalNextNonce(t, nonceTracker, fromAddress) // In this scenario the node operator REALLY fucked up and set the bump // to zero (even though that should not be possible due to config // validation) evmcfg2 := evmtest.NewChainScopedConfig(t, configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.BumpMin = assets.NewWeiI(0) c.EVM[0].GasEstimator.BumpPercent = ptr[uint16](0) })) eb2 := NewTestEthBroadcaster(t, txStore, ethClient, ethKeyStore, cfg, evmcfg2, &testCheckerFactory{}, false, nonceTracker) mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID) // First was underpriced ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasPrice().Cmp(evmcfg2.EVM().GasEstimator().PriceDefault().ToInt()) == 0 }), fromAddress).Return(commonclient.Underpriced, errors.New(underpricedError)).Once() // Do the thing retryable, err := eb2.ProcessUnstartedTxs(ctx, fromAddress) require.Error(t, err) require.Contains(t, err.Error(), "bumped fee price of 20 gwei is equal to original fee price of 20 gwei. ACTION REQUIRED: This is a configuration error, you must increase either FeeEstimator.BumpPercent or FeeEstimator.BumpMin") assert.True(t, retryable) // TEARDOWN: Clear out the unsent tx before the next test pgtest.MustExec(t, db, `DELETE FROM evm.txes WHERE nonce = $1`, localNextNonce) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewChainScopedConfig(t, configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.BumpMin = assets.NewWeiI(0) c.EVM[0].GasEstimator.BumpPercent = ptr[uint16](0) }))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.BumpMin = assets.NewWeiI(0) c.EVM[0].GasEstimator.BumpPercent = ptr[uint16](0) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewWeiI(0)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasPrice().Cmp(evmcfg2.EVM().GasEstimator().PriceDefault().ToInt()) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasPrice().Cmp(evmcfg2.EVM().GasEstimator().PriceDefault().ToInt()) == 0 })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Cmp(evmcfg2.EVM().GasEstimator().PriceDefault().ToInt())` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.PriceDefault()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ToInt()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Underpriced, errors.New(underpricedError))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.New(underpricedError)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MustExec(t, db, `DELETE FROM evm.txes WHERE nonce = $1`, localNextNonce)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("eth tx is left in progress if eth node returns insufficient eth", func(t *testing.T) { insufficientEthError := "insufficient funds for transfer" localNextNonce := getLocalNextNonce(t, nonceTracker, fromAddress) etx := mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.InsufficientFunds, errors.New(insufficientEthError)).Once() retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) require.Error(t, err) assert.Contains(t, err.Error(), "insufficient funds for transfer") assert.True(t, retryable) // Check it was saved correctly with its attempt etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Nil(t, etx.BroadcastAt) assert.Nil(t, etx.InitialBroadcastAt) require.NotNil(t, etx.Sequence) assert.False(t, etx.Error.Valid) assert.Equal(t, txmgrcommon.TxInProgress, etx.State) require.Len(t, etx.TxAttempts, 1) attempt := etx.TxAttempts[0] assert.Equal(t, txmgrtypes.TxAttemptInProgress, attempt.State) assert.Nil(t, attempt.BroadcastBeforeBlockNum) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.InsufficientFunds, errors.New(insufficientEthError))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.New(insufficientEthError)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MustExec(t, db, `DELETE FROM evm.txes`)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("eth tx is left in progress if nonce is too high", func(t *testing.T) { localNextNonce := getLocalNextNonce(t, nonceTracker, fromAddress) nonceGapError := "NonceGap, Future nonce. Expected nonce: " + strconv.FormatUint(localNextNonce, 10) etx := mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress).Return(commonclient.Retryable, errors.New(nonceGapError)).Once() retryable, err := eb.ProcessUnstartedTxs(ctx, fromAddress) require.Error(t, err) assert.Contains(t, err.Error(), nonceGapError) assert.True(t, retryable) etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Nil(t, etx.BroadcastAt) assert.Nil(t, etx.InitialBroadcastAt) require.NotNil(t, etx.Sequence) assert.False(t, etx.Error.Valid) assert.Equal(t, txmgrcommon.TxInProgress, etx.State) require.Len(t, etx.TxAttempts, 1) attempt := etx.TxAttempts[0] assert.Equal(t, txmgrtypes.TxAttemptInProgress, attempt.State) assert.Nil(t, attempt.BroadcastBeforeBlockNum) pgtest.MustExec(t, db, `DELETE FROM evm.txes`) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FormatUint(localNextNonce, 10)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Retryable, errors.New(nonceGapError))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.New(nonceGapError)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MustExec(t, db, `DELETE FROM evm.txes`)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Run("eth node returns underpriced transaction and bumping gas doesn't increase it in EIP-1559 mode", func(t *testing.T) { // This happens if a transaction's gas price is below the minimum // configured for the transaction pool. // This is a configuration error by the node operator, since it means they set the base gas level too low. // In this scenario the node operator REALLY fucked up and set the bump // to zero (even though that should not be possible due to config // validation) evmcfg2 := evmtest.NewChainScopedConfig(t, configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(true) c.EVM[0].GasEstimator.BumpMin = assets.NewWeiI(0) c.EVM[0].GasEstimator.BumpPercent = ptr[uint16](0) })) localNextNonce := getLocalNextNonce(t, nonceTracker, fromAddress) ethClient.On("PendingNonceAt", mock.Anything, fromAddress).Return(localNextNonce, nil).Once() eb2 := NewTestEthBroadcaster(t, txStore, ethClient, ethKeyStore, cfg, evmcfg2, &testCheckerFactory{}, false, nonceTracker) mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, gasLimit, value, testutils.FixtureChainID) underpricedError := "transaction underpriced" localNextNonce = getLocalNextNonce(t, nonceTracker, fromAddress) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasTipCap().Cmp(big.NewInt(1)) == 0 }), fromAddress).Return(commonclient.Underpriced, errors.New(underpricedError)).Once() // Check gas tip cap verification retryable, err := eb2.ProcessUnstartedTxs(ctx, fromAddress) require.Error(t, err) require.Contains(t, err.Error(), "bumped gas tip cap of 1 wei is less than or equal to original gas tip cap of 1 wei") assert.True(t, retryable) pgtest.MustExec(t, db, `DELETE FROM evm.txes`) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewChainScopedConfig(t, configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(true) c.EVM[0].GasEstimator.BumpMin = assets.NewWeiI(0) c.EVM[0].GasEstimator.BumpPercent = ptr[uint16](0) }))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(true) c.EVM[0].GasEstimator.BumpMin = assets.NewWeiI(0) c.EVM[0].GasEstimator.BumpPercent = ptr[uint16](0) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewWeiI(0)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("PendingNonceAt", mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(localNextNonce, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasTipCap().Cmp(big.NewInt(1)) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasTipCap().Cmp(big.NewInt(1)) == 0 })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasTipCap()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Cmp(big.NewInt(1))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewInt(1)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Underpriced, errors.New(underpricedError))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.New(underpricedError)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MustExec(t, db, `DELETE FROM evm.txes`)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewChainScopedConfig(t, configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(true) c.EVM[0].GasEstimator.TipCapDefault = assets.NewWeiI(0) }))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(true) c.EVM[0].GasEstimator.TipCapDefault = assets.NewWeiI(0) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewWeiI(0)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("PendingNonceAt", mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(localNextNonce, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewWeiI(42)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewChainScopedConfig(t, configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(true) c.EVM[0].GasEstimator.TipCapDefault = gasTipCapDefault }))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(true) c.EVM[0].GasEstimator.TipCapDefault = gasTipCapDefault })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("PendingNonceAt", mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(localNextNonce, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasTipCap().Cmp(gasTipCapDefault.ToInt()) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasTipCap().Cmp(gasTipCapDefault.ToInt()) == 0 })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasTipCap()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Cmp(gasTipCapDefault.ToInt())` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ToInt()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Underpriced, errors.New(underpricedError))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.New(underpricedError)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasTipCap().Cmp(big.NewInt(0).Add(gasTipCapDefault.ToInt(), evmcfg2.EVM().GasEstimator().BumpMin().ToInt())) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasTipCap().Cmp(big.NewInt(0).Add(gasTipCapDefault.ToInt(), evmcfg2.EVM().GasEstimator().BumpMin().ToInt())) == 0 })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasTipCap()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Cmp(big.NewInt(0).Add(gasTipCapDefault.ToInt(), evmcfg2.EVM().GasEstimator().BumpMin().ToInt()))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewInt(0)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Add(gasTipCapDefault.ToInt(), evmcfg2.EVM().GasEstimator().BumpMin().ToInt())` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ToInt()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.BumpMin()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ToInt()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Underpriced, errors.New(underpricedError))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.New(underpricedError)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasTipCap().Cmp(big.NewInt(0).Add(gasTipCapDefault.ToInt(), big.NewInt(0).Mul(evmcfg2.EVM().GasEstimator().BumpMin().ToInt(), big.NewInt(2)))) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == localNextNonce && tx.GasTipCap().Cmp(big.NewInt(0).Add(gasTipCapDefault.ToInt(), big.NewInt(0).Mul(evmcfg2.EVM().GasEstimator().BumpMin().ToInt(), big.NewInt(2)))) == 0 })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasTipCap()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Cmp(big.NewInt(0).Add(gasTipCapDefault.ToInt(), big.NewInt(0).Mul(evmcfg2.EVM().GasEstimator().BumpMin().ToInt(), big.NewInt(2))))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewInt(0)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Add(gasTipCapDefault.ToInt(), big.NewInt(0).Mul(evmcfg2.EVM().GasEstimator().BumpMin().ToInt(), big.NewInt(2)))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ToInt()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewInt(0)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Mul(evmcfg2.EVM().GasEstimator().BumpMin().ToInt(), big.NewInt(2))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.BumpMin()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ToInt()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewInt(2)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MustExec(t, db, `DELETE FROM evm.txes WHERE nonce = $1`, localNextNonce)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.HexToAddress("0x6C03DDA95a2AEd917EeCc6eddD4b9D16E6380411")` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Int(assets.NewEthValue(142))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthValue(142)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewGeneralConfig(t, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MustInsertRandomKeyReturningState(t, realKeystore.Eth())` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEth(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("EnabledAddressesForChain", mock.Anything, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(addresses, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("PendingNonceAt", mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(uint64(0), nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewNonceTracker(lggr, txStore, txmgr.NewEvmTxmClient(ethClient, nil))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmClient(ethClient, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GetNextSequence(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewTx(&gethTypes.LegacyTx{})` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SignTx", mock.Anything, fromAddress, mock.AnythingOfType("*types.Transaction"), mock.MatchedBy(func(chainID *big.Int) bool { return chainID.Cmp(evmcfg.EVM().ChainID()) == 0 }))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.AnythingOfType("*types.Transaction")` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(chainID *big.Int) bool { return chainID.Cmp(evmcfg.EVM().ChainID()) == 0 })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Cmp(evmcfg.EVM().ChainID())` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ChainID()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(&tx, errors.New("could not sign transaction"))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.New("could not sign transaction")` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GetNextSequence(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewGeneralConfig(t, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewNonceTracker(lggr, txStore, txmgr.NewEvmTxmClient(ethClient, nil))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmClient(ethClient, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Trigger(testutils.NewAddress())` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewAddress()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Trigger(testutils.NewAddress())` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewAddress()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewAddress()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.TestObserved(t, zapcore.DebugLevel)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].NonceAutoSync = ptr(true) })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmConfig(evmcfg.EVM())` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MustInsertWithState(t, kst)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmFeeEstimator(lggr, func(lggr logger.Logger) gas.EvmEstimator { return gas.NewFixedPriceEstimator(evmcfg.EVM().GasEstimator(), nil, evmcfg.EVM().GasEstimator().BlockHistory(), lggr, nil) }, evmcfg.EVM().GasEstimator().EIP1559DynamicFees(), evmcfg.EVM().GasEstimator())` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewFixedPriceEstimator(evmcfg.EVM().GasEstimator(), nil, evmcfg.EVM().GasEstimator().BlockHistory(), lggr, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.BlockHistory()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EIP1559DynamicFees()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxAttemptBuilder(*ethClient.ConfiguredChainID(), ge, kst, estimator)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEth(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("EnabledAddressesForChain", mock.Anything, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(addresses, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("PendingNonceAt", mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(uint64(0), nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmClient(ethClient, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmBroadcaster(txStore, txmClient, evmTxmCfg, txmgr.NewEvmTxmFeeConfig(ge), evmcfg.EVM().Transactions(), cfg.Database().Listener(), kst, txBuilder, lggr, checkerFactory, false)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmFeeConfig(ge)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Transactions()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Database()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Listener()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Start(ctx)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.AssertLogEventually(t, observed, "Skipping sequence auto-sync")` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewTestGeneralConfig(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == inProgressTxNonce }), fromAddress)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == inProgressTxNonce })` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Once()` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.Nonce(inProgressTxNonce)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewNonceTracker(lggr, txStore, txmgr.NewEvmTxmClient(ethClient, nil))` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.NewEvmTxmClient(ethClient, nil)` $DIR/core/chains/evm/txmgr/broadcaster_test.go: `.ProcessUnstartedTxs(ctx, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `cltest.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `cltest.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `err = ec.Start(ctx)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `err = ec.Start(ctx)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `err = ec.ProcessHead(ctx, &head)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `err = ec.Close()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `err = ec.Start(ctx)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `err = ec.Close()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("only finds eth_txes in unconfirmed state with at least one broadcast attempt", func(t *testing.T) { mustInsertFatalErrorEthTx(t, txStore, fromAddress) mustInsertInProgressEthTx(t, txStore, nonce, fromAddress) nonce++ cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, nonce, 1, fromAddress) nonce++ mustInsertUnconfirmedEthTxWithInsufficientEthAttempt(t, txStore, nonce, fromAddress) nonce++ mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, config.EVM().ChainID()) // Do the thing require.NoError(t, ec.CheckForReceipts(ctx, blockNum)) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `mustInsertFatalErrorEthTx(t, txStore, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `mustInsertInProgressEthTx(t, txStore, nonce, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `nonce++` $DIR/core/chains/evm/txmgr/confirmer_test.go: `cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, nonce, 1, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `nonce++` $DIR/core/chains/evm/txmgr/confirmer_test.go: `mustInsertUnconfirmedEthTxWithInsufficientEthAttempt(t, txStore, nonce, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `nonce++` $DIR/core/chains/evm/txmgr/confirmer_test.go: `mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, config.EVM().ChainID())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `nonce++` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("fetches receipt for one unconfirmed eth_tx", func(t *testing.T) { ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil) // Transaction not confirmed yet, receipt is nil ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], hashAttempt1_1, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &evmtypes.Receipt{} }).Once() // Do the thing require.NoError(t, ec.CheckForReceipts(ctx, blockNum)) var err error etx1, err = txStore.FindTxWithAttempts(ctx, etx1.ID) assert.NoError(t, err) require.Len(t, etx1.TxAttempts, 1) attempt1_1 = etx1.TxAttempts[0] require.NoError(t, err) require.Len(t, attempt1_1.Receipts, 0) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], hashAttempt1_1, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &evmtypes.Receipt{} }).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[0].Result = &evmtypes.Receipt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx1, err = txStore.FindTxWithAttempts(ctx, etx1.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt1_1 = etx1.TxAttempts[0]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("saves nothing if returned receipt does not match the attempt", func(t *testing.T) { txmReceipt := evmtypes.Receipt{ TxHash: testutils.NewHash(), BlockHash: testutils.NewHash(), BlockNumber: big.NewInt(42), TransactionIndex: uint(1), } ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil) // First transaction confirmed ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], hashAttempt1_1, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt }).Once() // No error because it is merely logged require.NoError(t, ec.CheckForReceipts(ctx, blockNum)) etx, err := txStore.FindTxWithAttempts(ctx, etx1.ID) require.NoError(t, err) require.Len(t, etx.TxAttempts, 1) require.Len(t, etx.TxAttempts[0].Receipts, 0) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], hashAttempt1_1, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt }).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `*(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("saves nothing if query returns error", func(t *testing.T) { txmReceipt := evmtypes.Receipt{ TxHash: attempt1_1.Hash, BlockHash: testutils.NewHash(), BlockNumber: big.NewInt(42), TransactionIndex: uint(1), } ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil) // First transaction confirmed ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], hashAttempt1_1, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt elems[0].Error = errors.New("foo") }).Once() // No error because it is merely logged require.NoError(t, ec.CheckForReceipts(ctx, blockNum)) etx, err := txStore.FindTxWithAttempts(ctx, etx1.ID) require.NoError(t, err) require.Len(t, etx.TxAttempts, 1) require.Len(t, etx.TxAttempts[0].Receipts, 0) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], hashAttempt1_1, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt elems[0].Error = errors.New("foo") }).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `*(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[0].Error = errors.New("foo")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `nonce++` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("saves eth_receipt and marks eth_tx as confirmed when geth client returns valid receipt", func(t *testing.T) { txmReceipt := evmtypes.Receipt{ TxHash: attempt1_1.Hash, BlockHash: testutils.NewHash(), BlockNumber: big.NewInt(42), TransactionIndex: uint(1), Status: uint64(1), } ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil) ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && cltest.BatchElemMatchesParams(b[0], attempt1_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt2_1.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // First transaction confirmed *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt // Second transaction still unconfirmed elems[1].Result = &evmtypes.Receipt{} }).Once() // Do the thing require.NoError(t, ec.CheckForReceipts(ctx, blockNum)) // Check that the receipt was saved etx, err := txStore.FindTxWithAttempts(ctx, etx1.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxConfirmed, etx.State) assert.Len(t, etx.TxAttempts, 1) attempt1_1 = etx.TxAttempts[0] require.Len(t, attempt1_1.Receipts, 1) ethReceipt := attempt1_1.Receipts[0] assert.Equal(t, txmReceipt.TxHash, ethReceipt.GetTxHash()) assert.Equal(t, txmReceipt.BlockHash, ethReceipt.GetBlockHash()) assert.Equal(t, txmReceipt.BlockNumber.Int64(), ethReceipt.GetBlockNumber().Int64()) assert.Equal(t, txmReceipt.TransactionIndex, ethReceipt.GetTransactionIndex()) receiptJSON, err := json.Marshal(txmReceipt) require.NoError(t, err) j, err := json.Marshal(ethReceipt) require.NoError(t, err) assert.JSONEq(t, string(receiptJSON), string(j)) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && cltest.BatchElemMatchesParams(b[0], attempt1_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt2_1.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // First transaction confirmed *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt // Second transaction still unconfirmed elems[1].Result = &evmtypes.Receipt{} }).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `*(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[1].Result = &evmtypes.Receipt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt1_1 = etx.TxAttempts[0]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("fetches and saves receipts for several attempts in gas price order", func(t *testing.T) { attempt2_2 := newBroadcastLegacyEthTxAttempt(t, etx2.ID) attempt2_2.TxFee = gas.EvmFee{Legacy: assets.NewWeiI(10)} attempt2_3 := newBroadcastLegacyEthTxAttempt(t, etx2.ID) attempt2_3.TxFee = gas.EvmFee{Legacy: assets.NewWeiI(20)} // Insert order deliberately reversed to test sorting by gas price require.NoError(t, txStore.InsertTxAttempt(ctx, &attempt2_3)) require.NoError(t, txStore.InsertTxAttempt(ctx, &attempt2_2)) txmReceipt := evmtypes.Receipt{ TxHash: attempt2_2.Hash, BlockHash: testutils.NewHash(), BlockNumber: big.NewInt(42), TransactionIndex: uint(1), Status: uint64(1), } ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil) ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 3 && cltest.BatchElemMatchesParams(b[2], attempt2_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt2_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[0], attempt2_3.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // Most expensive attempt still unconfirmed elems[2].Result = &evmtypes.Receipt{} // Second most expensive attempt is confirmed *(elems[1].Result.(*evmtypes.Receipt)) = txmReceipt // Cheapest attempt still unconfirmed elems[0].Result = &evmtypes.Receipt{} }).Once() // Do the thing require.NoError(t, ec.CheckForReceipts(ctx, blockNum)) // Check that the state was updated etx, err := txStore.FindTxWithAttempts(ctx, etx2.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxConfirmed, etx.State) require.Len(t, etx.TxAttempts, 3) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt2_2.TxFee = gas.EvmFee{Legacy: assets.NewWeiI(10)}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt2_3.TxFee = gas.EvmFee{Legacy: assets.NewWeiI(20)}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 3 && cltest.BatchElemMatchesParams(b[2], attempt2_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt2_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[0], attempt2_3.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // Most expensive attempt still unconfirmed elems[2].Result = &evmtypes.Receipt{} // Second most expensive attempt is confirmed *(elems[1].Result.(*evmtypes.Receipt)) = txmReceipt // Cheapest attempt still unconfirmed elems[0].Result = &evmtypes.Receipt{} }).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[2].Result = &evmtypes.Receipt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `*(elems[1].Result.(*evmtypes.Receipt)) = txmReceipt` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[0].Result = &evmtypes.Receipt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `nonce++` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("ignores receipt missing BlockHash that comes from querying parity too early", func(t *testing.T) { ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil) receipt := evmtypes.Receipt{ TxHash: attempt3_1.Hash, Status: uint64(1), } ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempt3_1.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) *(elems[0].Result.(*evmtypes.Receipt)) = receipt }).Once() // Do the thing require.NoError(t, ec.CheckForReceipts(ctx, blockNum)) // No receipt, but no error either etx, err := txStore.FindTxWithAttempts(ctx, etx3.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx.State) assert.Len(t, etx.TxAttempts, 1) attempt3_1 = etx.TxAttempts[0] require.Len(t, attempt3_1.Receipts, 0) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempt3_1.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) *(elems[0].Result.(*evmtypes.Receipt)) = receipt }).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `*(elems[0].Result.(*evmtypes.Receipt)) = receipt` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt3_1 = etx.TxAttempts[0]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("does not panic if receipt has BlockHash but is missing some other fields somehow", func(t *testing.T) { // NOTE: This should never happen, but we shouldn't panic regardless receipt := evmtypes.Receipt{ TxHash: attempt3_1.Hash, BlockHash: testutils.NewHash(), Status: uint64(1), } ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempt3_1.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) *(elems[0].Result.(*evmtypes.Receipt)) = receipt }).Once() // Do the thing require.NoError(t, ec.CheckForReceipts(ctx, blockNum)) // No receipt, but no error either etx, err := txStore.FindTxWithAttempts(ctx, etx3.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx.State) assert.Len(t, etx.TxAttempts, 1) attempt3_1 = etx.TxAttempts[0] require.Len(t, attempt3_1.Receipts, 0) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempt3_1.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) *(elems[0].Result.(*evmtypes.Receipt)) = receipt }).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `*(elems[0].Result.(*evmtypes.Receipt)) = receipt` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt3_1 = etx.TxAttempts[0]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("handles case where eth_receipt already exists somehow", func(t *testing.T) { ethReceipt := mustInsertEthReceipt(t, txStore, 42, testutils.NewHash(), attempt3_1.Hash) txmReceipt := evmtypes.Receipt{ TxHash: attempt3_1.Hash, BlockHash: ethReceipt.BlockHash, BlockNumber: big.NewInt(ethReceipt.BlockNumber), TransactionIndex: ethReceipt.TransactionIndex, Status: uint64(1), } ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil) ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempt3_1.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt }).Once() // Do the thing require.NoError(t, ec.CheckForReceipts(ctx, blockNum)) // Check that the receipt was unchanged etx, err := txStore.FindTxWithAttempts(ctx, etx3.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxConfirmed, etx.State) assert.Len(t, etx.TxAttempts, 1) attempt3_1 = etx.TxAttempts[0] require.Len(t, attempt3_1.Receipts, 1) ethReceipt3_1 := attempt3_1.Receipts[0] assert.Equal(t, txmReceipt.TxHash, ethReceipt3_1.GetTxHash()) assert.Equal(t, txmReceipt.BlockHash, ethReceipt3_1.GetBlockHash()) assert.Equal(t, txmReceipt.BlockNumber.Int64(), ethReceipt3_1.GetBlockNumber().Int64()) assert.Equal(t, txmReceipt.TransactionIndex, ethReceipt3_1.GetTransactionIndex()) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempt3_1.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt }).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `*(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt3_1 = etx.TxAttempts[0]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `nonce++` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("on receipt fetch marks in_progress eth_tx_attempt as broadcast", func(t *testing.T) { attempt4_2 := newInProgressLegacyEthTxAttempt(t, etx4.ID) attempt4_2.TxFee = gas.EvmFee{Legacy: assets.NewWeiI(10)} require.NoError(t, txStore.InsertTxAttempt(ctx, &attempt4_2)) txmReceipt := evmtypes.Receipt{ TxHash: attempt4_2.Hash, BlockHash: testutils.NewHash(), BlockNumber: big.NewInt(42), TransactionIndex: uint(1), Status: uint64(1), } ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil) // Second attempt is confirmed ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && cltest.BatchElemMatchesParams(b[0], attempt4_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt4_1.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // First attempt still unconfirmed elems[1].Result = &evmtypes.Receipt{} // Second attempt is confirmed *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt }).Once() // Do the thing require.NoError(t, ec.CheckForReceipts(ctx, blockNum)) // Check that the state was updated var err error etx4, err = txStore.FindTxWithAttempts(ctx, etx4.ID) require.NoError(t, err) attempt4_1 = etx4.TxAttempts[1] attempt4_2 = etx4.TxAttempts[0] // And the attempts require.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt4_1.State) require.Nil(t, attempt4_1.BroadcastBeforeBlockNum) require.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt4_2.State) require.Equal(t, int64(42), *attempt4_2.BroadcastBeforeBlockNum) // Check receipts require.Len(t, attempt4_1.Receipts, 0) require.Len(t, attempt4_2.Receipts, 1) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt4_2.TxFee = gas.EvmFee{Legacy: assets.NewWeiI(10)}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && cltest.BatchElemMatchesParams(b[0], attempt4_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt4_1.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // First attempt still unconfirmed elems[1].Result = &evmtypes.Receipt{} // Second attempt is confirmed *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt }).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[1].Result = &evmtypes.Receipt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `*(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx4, err = txStore.FindTxWithAttempts(ctx, etx4.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt4_1 = etx4.TxAttempts[1]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt4_2 = etx4.TxAttempts[0]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `nonce++` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempt5_1.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // First attempt still unconfirmed *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt }).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `*(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(nil, &client.JsonError{ Code: 1, Message: "reverted", Data: utils.ConcatBytes(sig[:4], data), }).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx5, err = txStore.FindTxWithAttempts(ctx, etx5.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt5_1 = etx5.TxAttempts[0]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `c.EVM[0].RPCDefaultBatchSize = ptr[uint32](2)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempts = append(attempts, attempt)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && cltest.BatchElemMatchesParams(b[0], attempts[4].Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempts[3].Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &evmtypes.Receipt{} elems[1].Result = &evmtypes.Receipt{} }).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[0].Result = &evmtypes.Receipt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[1].Result = &evmtypes.Receipt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && cltest.BatchElemMatchesParams(b[0], attempts[2].Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempts[1].Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &evmtypes.Receipt{} elems[1].Result = &evmtypes.Receipt{} }).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[0].Result = &evmtypes.Receipt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[1].Result = &evmtypes.Receipt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempts[0].Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &evmtypes.Receipt{} }).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[0].Result = &evmtypes.Receipt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `c.EVM[0].RPCDefaultBatchSize = ptr[uint32](1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `c.EVM[0].Transactions.ForwardersEnabled = ptr(true)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt.Tx.Meta = nil` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempt.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt // confirmed }).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `*(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt` $DIR/core/chains/evm/txmgr/confirmer_test.go: `dbtx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `c.EVM[0].RPCDefaultBatchSize = ptr[uint32](6)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempts = append(attempts, attempt)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(0), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 4 })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) captured = append(captured, elems...) elems[0].Result = &evmtypes.Receipt{} elems[1].Result = &evmtypes.Receipt{} elems[2].Result = &evmtypes.Receipt{} elems[3].Result = &evmtypes.Receipt{} }).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `captured = append(captured, elems...)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[0].Result = &evmtypes.Receipt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[1].Result = &evmtypes.Receipt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[2].Result = &evmtypes.Receipt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[3].Result = &evmtypes.Receipt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `cltest.BatchElemMustMatchParams(t, captured[0], attempts[0].Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `cltest.BatchElemMustMatchParams(t, captured[1], attempts[1].Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `cltest.BatchElemMustMatchParams(t, captured[2], attempts[2].Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(0), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(20), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `pgtest.MustExec(t, db, `UPDATE evm.txes SET state='confirmed' WHERE id = $1`, etx_other_chain.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempt2_9.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt2_9 }).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `*(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt2_9` $DIR/core/chains/evm/txmgr/confirmer_test.go: `mustTxBeInState(t, txStore, etx1_0, txmgrcommon.TxUnconfirmed)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `mustTxBeInState(t, txStore, etx1_1, txmgrcommon.TxUnconfirmed)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `mustTxBeInState(t, txStore, etx2_9, txmgrcommon.TxConfirmed)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempt1_1.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt1_1 }).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `*(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt1_1` $DIR/core/chains/evm/txmgr/confirmer_test.go: `mustTxBeInState(t, txStore, etx1_0, txmgrcommon.TxConfirmedMissingReceipt)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `mustTxBeInState(t, txStore, etx1_1, txmgrcommon.TxConfirmed)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `c.EVM[0].FinalityDepth = ptr[uint32](50)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt0_2.BroadcastBeforeBlockNum = &b` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt1_2.BroadcastBeforeBlockNum = &b` $DIR/core/chains/evm/txmgr/confirmer_test.go: `pgtest.MustExec(t, db, `UPDATE evm.tx_attempts SET broadcast_before_block_num = 41 WHERE broadcast_before_block_num IS NULL`)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("marks buried eth_txes as 'confirmed_missing_receipt'", func(t *testing.T) { txmReceipt0 := evmtypes.Receipt{ TxHash: attempt0_2.Hash, BlockHash: testutils.NewHash(), BlockNumber: big.NewInt(42), TransactionIndex: uint(1), Status: uint64(1), } txmReceipt3 := evmtypes.Receipt{ TxHash: attempt3_1.Hash, BlockHash: testutils.NewHash(), BlockNumber: big.NewInt(42), TransactionIndex: uint(1), Status: uint64(1), } ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(4), nil) ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 6 && cltest.BatchElemMatchesParams(b[0], attempt0_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt0_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[2], attempt1_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[3], attempt1_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[4], attempt2_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[5], attempt3_1.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // First transaction confirmed *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt0 elems[1].Result = &evmtypes.Receipt{} // Second transaction stil unconfirmed elems[2].Result = &evmtypes.Receipt{} elems[3].Result = &evmtypes.Receipt{} // Third transaction still unconfirmed elems[4].Result = &evmtypes.Receipt{} // Fourth transaction is confirmed *(elems[5].Result.(*evmtypes.Receipt)) = txmReceipt3 }).Once() // PERFORM // Block num of 43 is one higher than the receipt (as would generally be expected) require.NoError(t, ec.CheckForReceipts(ctx, 43)) // Expected state is that the "top" eth_tx is now confirmed, with the // two below it "confirmed_missing_receipt" and the "bottom" eth_tx also confirmed var err error etx3, err = txStore.FindTxWithAttempts(ctx, etx3.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxConfirmed, etx3.State) ethReceipt := etx3.TxAttempts[0].Receipts[0] require.Equal(t, txmReceipt3.BlockHash, ethReceipt.GetBlockHash()) etx2, err = txStore.FindTxWithAttempts(ctx, etx2.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxConfirmedMissingReceipt, etx2.State) etx1, err = txStore.FindTxWithAttempts(ctx, etx1.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxConfirmedMissingReceipt, etx1.State) etx0, err = txStore.FindTxWithAttempts(ctx, etx0.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxConfirmed, etx0.State) require.Len(t, etx0.TxAttempts, 2) require.Len(t, etx0.TxAttempts[0].Receipts, 1) ethReceipt = etx0.TxAttempts[0].Receipts[0] require.Equal(t, txmReceipt0.BlockHash, ethReceipt.GetBlockHash()) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(4), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 6 && cltest.BatchElemMatchesParams(b[0], attempt0_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt0_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[2], attempt1_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[3], attempt1_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[4], attempt2_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[5], attempt3_1.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // First transaction confirmed *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt0 elems[1].Result = &evmtypes.Receipt{} // Second transaction stil unconfirmed elems[2].Result = &evmtypes.Receipt{} elems[3].Result = &evmtypes.Receipt{} // Third transaction still unconfirmed elems[4].Result = &evmtypes.Receipt{} // Fourth transaction is confirmed *(elems[5].Result.(*evmtypes.Receipt)) = txmReceipt3 }).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `*(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt0` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[1].Result = &evmtypes.Receipt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[2].Result = &evmtypes.Receipt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[3].Result = &evmtypes.Receipt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[4].Result = &evmtypes.Receipt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `*(elems[5].Result.(*evmtypes.Receipt)) = txmReceipt3` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx3, err = txStore.FindTxWithAttempts(ctx, etx3.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx2, err = txStore.FindTxWithAttempts(ctx, etx2.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx1, err = txStore.FindTxWithAttempts(ctx, etx1.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx0, err = txStore.FindTxWithAttempts(ctx, etx0.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethReceipt = etx0.TxAttempts[0].Receipts[0]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("marks eth_txes with state 'confirmed_missing_receipt' as 'confirmed' if a receipt finally shows up", func(t *testing.T) { txmReceipt := evmtypes.Receipt{ TxHash: attempt2_1.Hash, BlockHash: testutils.NewHash(), BlockNumber: big.NewInt(43), TransactionIndex: uint(1), Status: uint64(1), } ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil) ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 3 && cltest.BatchElemMatchesParams(b[0], attempt1_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt1_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[2], attempt2_1.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // First transaction still unconfirmed elems[0].Result = &evmtypes.Receipt{} elems[1].Result = &evmtypes.Receipt{} // Second transaction confirmed *(elems[2].Result.(*evmtypes.Receipt)) = txmReceipt }).Once() // PERFORM // Block num of 44 is one higher than the receipt (as would generally be expected) require.NoError(t, ec.CheckForReceipts(ctx, 44)) // Expected state is that the "top" two eth_txes are now confirmed, with the // one below it still "confirmed_missing_receipt" and the bottom one remains confirmed var err error etx3, err = txStore.FindTxWithAttempts(ctx, etx3.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxConfirmed, etx3.State) etx2, err = txStore.FindTxWithAttempts(ctx, etx2.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxConfirmed, etx2.State) ethReceipt := etx2.TxAttempts[0].Receipts[0] require.Equal(t, txmReceipt.BlockHash, ethReceipt.GetBlockHash()) etx1, err = txStore.FindTxWithAttempts(ctx, etx1.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxConfirmedMissingReceipt, etx1.State) etx0, err = txStore.FindTxWithAttempts(ctx, etx0.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxConfirmed, etx0.State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 3 && cltest.BatchElemMatchesParams(b[0], attempt1_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt1_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[2], attempt2_1.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // First transaction still unconfirmed elems[0].Result = &evmtypes.Receipt{} elems[1].Result = &evmtypes.Receipt{} // Second transaction confirmed *(elems[2].Result.(*evmtypes.Receipt)) = txmReceipt }).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[0].Result = &evmtypes.Receipt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[1].Result = &evmtypes.Receipt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `*(elems[2].Result.(*evmtypes.Receipt)) = txmReceipt` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx3, err = txStore.FindTxWithAttempts(ctx, etx3.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx2, err = txStore.FindTxWithAttempts(ctx, etx2.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx1, err = txStore.FindTxWithAttempts(ctx, etx1.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx0, err = txStore.FindTxWithAttempts(ctx, etx0.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("continues to leave eth_txes with state 'confirmed_missing_receipt' unchanged if at least one attempt is above EVM.FinalityDepth", func(t *testing.T) { ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil) ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && cltest.BatchElemMatchesParams(b[0], attempt1_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt1_1.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // Both attempts still unconfirmed elems[0].Result = &evmtypes.Receipt{} elems[1].Result = &evmtypes.Receipt{} }).Once() // PERFORM // Block num of 80 puts the first attempt (21) below threshold but second attempt (41) still above require.NoError(t, ec.CheckForReceipts(ctx, 80)) // Expected state is that the "top" two eth_txes are now confirmed, with the // one below it still "confirmed_missing_receipt" and the bottom one remains confirmed var err error etx3, err = txStore.FindTxWithAttempts(ctx, etx3.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxConfirmed, etx3.State) etx2, err = txStore.FindTxWithAttempts(ctx, etx2.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxConfirmed, etx2.State) etx1, err = txStore.FindTxWithAttempts(ctx, etx1.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxConfirmedMissingReceipt, etx1.State) etx0, err = txStore.FindTxWithAttempts(ctx, etx0.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxConfirmed, etx0.State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && cltest.BatchElemMatchesParams(b[0], attempt1_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt1_1.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // Both attempts still unconfirmed elems[0].Result = &evmtypes.Receipt{} elems[1].Result = &evmtypes.Receipt{} }).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[0].Result = &evmtypes.Receipt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[1].Result = &evmtypes.Receipt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx3, err = txStore.FindTxWithAttempts(ctx, etx3.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx2, err = txStore.FindTxWithAttempts(ctx, etx2.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx1, err = txStore.FindTxWithAttempts(ctx, etx1.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx0, err = txStore.FindTxWithAttempts(ctx, etx0.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && cltest.BatchElemMatchesParams(b[0], attempt1_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt1_1.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // Both attempts still unconfirmed elems[0].Result = &evmtypes.Receipt{} elems[1].Result = &evmtypes.Receipt{} }).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[0].Result = &evmtypes.Receipt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[1].Result = &evmtypes.Receipt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx3, err = txStore.FindTxWithAttempts(ctx, etx3.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx2, err = txStore.FindTxWithAttempts(ctx, etx2.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx1, err = txStore.FindTxWithAttempts(ctx, etx1.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx0, err = txStore.FindTxWithAttempts(ctx, etx0.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `c.EVM[0].FinalityDepth = ptr[uint32](50)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("IsL2").Return(false).Maybe()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("BatchCallContextAll", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 4 && cltest.BatchElemMatchesParams(b[0], hexutil.Encode(attempt0_2.SignedRawTx), "eth_sendRawTransaction") && cltest.BatchElemMatchesParams(b[1], hexutil.Encode(attempt1_2.SignedRawTx), "eth_sendRawTransaction") && cltest.BatchElemMatchesParams(b[2], hexutil.Encode(attempt2_1.SignedRawTx), "eth_sendRawTransaction") && cltest.BatchElemMatchesParams(b[3], hexutil.Encode(attempt3_1.SignedRawTx), "eth_sendRawTransaction") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // First transaction confirmed elems[0].Error = errors.New("nonce too low") elems[1].Error = errors.New("transaction underpriced") elems[2].Error = nil elems[3].Error = errors.New("transaction already finalized") }).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[0].Error = errors.New("nonce too low")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[1].Error = errors.New("transaction underpriced")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[2].Error = nil` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[3].Error = errors.New("transaction already finalized")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx0, err = txStore.FindTxWithAttempts(ctx, etx0.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx1, err = txStore.FindTxWithAttempts(ctx, etx1.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx2, err = txStore.FindTxWithAttempts(ctx, etx2.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx3, err = txStore.FindTxWithAttempts(ctx, etx3.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `c.EVM[0].FinalityDepth = ptr[uint32](50)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("IsL2").Return(false).Maybe()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("BatchCallContextAll", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 3 && cltest.BatchElemMatchesParams(b[0], hexutil.Encode(attempt0_2.SignedRawTx), "eth_sendRawTransaction") && cltest.BatchElemMatchesParams(b[1], hexutil.Encode(attempt1_2.SignedRawTx), "eth_sendRawTransaction") && cltest.BatchElemMatchesParams(b[2], hexutil.Encode(attempt2_1.SignedRawTx), "eth_sendRawTransaction") })).Return(errors.New("Timed out")).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx0, err = txStore.FindTxWithAttempts(ctx, etx0.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx1, err = txStore.FindTxWithAttempts(ctx, etx1.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx2, err = txStore.FindTxWithAttempts(ctx, etx2.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `c.EVM[0].FinalityDepth = ptr[uint32](50)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `c.EVM[0].RPCDefaultBatchSize = ptr[uint32](1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("IsL2").Return(false).Maybe()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("BatchCallContextAll", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], hexutil.Encode(attempt0_2.SignedRawTx), "eth_sendRawTransaction") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // First transaction confirmed elems[0].Error = errors.New("nonce too low") }).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `elems[0].Error = errors.New("nonce too low")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("BatchCallContextAll", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], hexutil.Encode(attempt1_2.SignedRawTx), "eth_sendRawTransaction") })).Return(errors.New("Timed out")).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx0, err = txStore.FindTxWithAttempts(ctx, etx0.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx1, err = txStore.FindTxWithAttempts(ctx, etx1.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx2, err = txStore.FindTxWithAttempts(ctx, etx2.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `mustInsertConfirmedEthTx(t, txStore, nonce, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `nonce++` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("returns nothing when there are no transactions", func(t *testing.T) { etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID) require.NoError(t, err) assert.Len(t, etxs, 0) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `mustInsertInProgressEthTx(t, txStore, nonce, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `nonce++` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("returns nothing when the transaction is in_progress", func(t *testing.T) { etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID) require.NoError(t, err) assert.Len(t, etxs, 0) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, nonce, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `nonce++` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("ignores unconfirmed transactions with nil BroadcastBeforeBlockNum", func(t *testing.T) { etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID) require.NoError(t, err) assert.Len(t, etxs, 0) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `nonce++` $DIR/core/chains/evm/txmgr/confirmer_test.go: `dbAttempt.FromTxAttempt(&attempt1_1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt1_2.BroadcastBeforeBlockNum = &onTheMoney` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt1_2.TxFee = gas.EvmFee{Legacy: assets.NewWeiI(30000)}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("returns nothing when the transaction is unconfirmed with an attempt that is recent", func(t *testing.T) { etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID) require.NoError(t, err) assert.Len(t, etxs, 0) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `nonce++` $DIR/core/chains/evm/txmgr/confirmer_test.go: `dbAttempt = txmgr.DbEthTxAttempt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `dbAttempt.FromTxAttempt(&attempt2_1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("returns nothing when the transaction has attempts that are too new", func(t *testing.T) { etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID) require.NoError(t, err) assert.Len(t, etxs, 0) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etxWithoutAttempts.Sequence = &n` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etxWithoutAttempts.BroadcastAt = &now` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etxWithoutAttempts.InitialBroadcastAt = &now` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etxWithoutAttempts.State = txmgrcommon.TxUnconfirmed` $DIR/core/chains/evm/txmgr/confirmer_test.go: `nonce++` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("does nothing if the transaction is from a different address than the one given", func(t *testing.T) { etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmOtherAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID) require.NoError(t, err) assert.Len(t, etxs, 0) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("returns the transaction if it is unconfirmed and has no attempts (note that this is an invariant violation, but we handle it anyway)", func(t *testing.T) { etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID) require.NoError(t, err) require.Len(t, etxs, 1) assert.Equal(t, etxWithoutAttempts.ID, etxs[0].ID) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("returns nothing for different chain id", func(t *testing.T) { etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, big.NewInt(42)) require.NoError(t, err) require.Len(t, etxs, 0) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `nonce++` $DIR/core/chains/evm/txmgr/confirmer_test.go: `dbAttempt = txmgr.DbEthTxAttempt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `dbAttempt.FromTxAttempt(&attempt3_1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `dbAttempt = txmgr.DbEthTxAttempt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `dbAttempt.FromTxAttempt(&attemptOther1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("returns the transaction if it is unconfirmed with an attempt that is older than gasBumpThreshold blocks", func(t *testing.T) { etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID) require.NoError(t, err) require.Len(t, etxs, 2) assert.Equal(t, etxWithoutAttempts.ID, etxs[0].ID) assert.Equal(t, etx3.ID, etxs[1].ID) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("returns nothing if threshold is zero", func(t *testing.T) { etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, 0, 10, 0, &cltest.FixtureChainID) require.NoError(t, err) require.Len(t, etxs, 0) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("does not return more transactions for gas bumping than gasBumpThreshold", func(t *testing.T) { // Unconfirmed txes in DB are: // (unnamed) (nonce 2) // etx1 (nonce 3) // etx2 (nonce 4) // etxWithoutAttempts (nonce 5) // etx3 (nonce 6) - ready for bump // etx4 (nonce 7) - ready for bump etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 4, 0, &cltest.FixtureChainID) require.NoError(t, err) require.Len(t, etxs, 1) // returns etxWithoutAttempts only - eligible for gas bumping because it technically doesn't have any attempts within gasBumpThreshold blocks assert.Equal(t, etxWithoutAttempts.ID, etxs[0].ID) etxs, err = ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 5, 0, &cltest.FixtureChainID) require.NoError(t, err) require.Len(t, etxs, 2) // includes etxWithoutAttempts, etx3 and etx4 assert.Equal(t, etxWithoutAttempts.ID, etxs[0].ID) assert.Equal(t, etx3.ID, etxs[1].ID) // Zero limit disables it etxs, err = ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 0, 0, &cltest.FixtureChainID) require.NoError(t, err) require.Len(t, etxs, 2) // includes etxWithoutAttempts, etx3 and etx4 })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etxs, err = ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 5, 0, &cltest.FixtureChainID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etxs, err = ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 0, 0, &cltest.FixtureChainID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `nonce++` $DIR/core/chains/evm/txmgr/confirmer_test.go: `dbAttempt = txmgr.DbEthTxAttempt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `dbAttempt.FromTxAttempt(&attempt4_1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("ignores pending transactions for another key", func(t *testing.T) { // Re-use etx3 nonce for another key, it should not affect the results for this key etxOther := cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, (*etx3.Sequence).Int64(), otherAddress) aOther := etxOther.TxAttempts[0] dbAttempt = txmgr.DbEthTxAttempt{} dbAttempt.FromTxAttempt(&aOther) require.NoError(t, db.Get(&dbAttempt, `UPDATE evm.tx_attempts SET broadcast_before_block_num=$1 WHERE id=$2 RETURNING *`, oldEnough, aOther.ID)) etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 6, 0, &cltest.FixtureChainID) require.NoError(t, err) require.Len(t, etxs, 3) // includes etxWithoutAttempts, etx3 and etx4 assert.Equal(t, etxWithoutAttempts.ID, etxs[0].ID) assert.Equal(t, etx3.ID, etxs[1].ID) assert.Equal(t, etx4.ID, etxs[2].ID) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `dbAttempt = txmgr.DbEthTxAttempt{}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `dbAttempt.FromTxAttempt(&aOther)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt3_2.BroadcastBeforeBlockNum = &oldEnough` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt3_2.TxFee = gas.EvmFee{Legacy: assets.NewWeiI(30000)}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("returns the transaction if it is unconfirmed with two attempts that are older than gasBumpThreshold blocks", func(t *testing.T) { etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID) require.NoError(t, err) require.Len(t, etxs, 3) assert.Equal(t, etxWithoutAttempts.ID, etxs[0].ID) assert.Equal(t, etx3.ID, etxs[1].ID) assert.Equal(t, etx4.ID, etxs[2].ID) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt3_3.BroadcastBeforeBlockNum = &tooNew` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt3_3.TxFee = gas.EvmFee{Legacy: assets.NewWeiI(40000)}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("does not return the transaction if it has some older but one newer attempt", func(t *testing.T) { etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID) require.NoError(t, err) require.Len(t, etxs, 2) assert.Equal(t, etxWithoutAttempts.ID, etxs[0].ID) assert.Equal(t, *etxWithoutAttempts.Sequence, *(etxs[0].Sequence)) require.Equal(t, evmtypes.Nonce(5), *etxWithoutAttempts.Sequence) assert.Equal(t, etx4.ID, etxs[1].ID) assert.Equal(t, *etx4.Sequence, *(etxs[1].Sequence)) require.Equal(t, evmtypes.Nonce(7), *etx4.Sequence) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt0_1.State = txmgrtypes.TxAttemptInsufficientFunds` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt4_2.State = txmgrtypes.TxAttemptInsufficientFunds` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt4_2.TxFee = gas.EvmFee{Legacy: assets.NewWeiI(40000)}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `nonce++` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt6_2.BroadcastBeforeBlockNum = &tooNew` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt6_2.TxFee = gas.EvmFee{Legacy: assets.NewWeiI(30001)}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("returns unique attempts requiring resubmission due to insufficient eth, ordered by nonce asc", func(t *testing.T) { etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID) require.NoError(t, err) require.Len(t, etxs, 4) assert.Equal(t, etxWithoutAttempts.ID, etxs[0].ID) assert.Equal(t, *etxWithoutAttempts.Sequence, *(etxs[0].Sequence)) assert.Equal(t, etx4.ID, etxs[1].ID) assert.Equal(t, *etx4.Sequence, *(etxs[1].Sequence)) assert.Equal(t, etx5.ID, etxs[2].ID) assert.Equal(t, *etx5.Sequence, *(etxs[2].Sequence)) assert.Equal(t, etx6.ID, etxs[3].ID) assert.Equal(t, *etx6.Sequence, *(etxs[3].Sequence)) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("should retry previous attempt if connectivity check failed for legacy transactions", func(t *testing.T) { cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(false) c.EVM[0].GasEstimator.BlockHistory.BlockHistorySize = ptr[uint16](2) c.EVM[0].GasEstimator.BlockHistory.CheckInclusionBlocks = ptr[uint16](4) }) ccfg := evmtest.NewChainScopedConfig(t, cfg) ctx := tests.Context(t) txStore := cltest.NewTestTxStore(t, db) ethKeyStore := cltest.NewKeyStore(t, db).Eth() _, fromAddress := cltest.MustInsertRandomKeyReturningState(t, ethKeyStore) kst := ksmocks.NewEth(t) estimator := gasmocks.NewEvmEstimator(t) newEst := func(logger.Logger) gas.EvmEstimator { return estimator } estimator.On("BumpLegacyGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, uint64(0), pkgerrors.Wrapf(commonfee.ErrConnectivity, "transaction...")) ge := ccfg.EVM().GasEstimator() feeEstimator := gas.NewEvmFeeEstimator(lggr, newEst, ge.EIP1559DynamicFees(), ge) txBuilder := txmgr.NewEvmTxAttemptBuilder(*ethClient.ConfiguredChainID(), ge, kst, feeEstimator) addresses := []gethCommon.Address{fromAddress} kst.On("EnabledAddressesForChain", mock.Anything, &cltest.FixtureChainID).Return(addresses, nil).Maybe() stuckTxDetector := txmgr.NewStuckTxDetector(lggr, testutils.FixtureChainID, "", assets.NewWei(assets.NewEth(100).ToInt()), ccfg.EVM().Transactions().AutoPurge(), feeEstimator, txStore, ethClient) // Create confirmer with necessary state ec := txmgr.NewEvmConfirmer(txStore, txmgr.NewEvmTxmClient(ethClient, nil), ccfg.EVM(), txmgr.NewEvmTxmFeeConfig(ccfg.EVM().GasEstimator()), ccfg.EVM().Transactions(), cfg.Database(), kst, txBuilder, lggr, stuckTxDetector) servicetest.Run(t, ec) currentHead := int64(30) oldEnough := int64(15) nonce := int64(0) originalBroadcastAt := time.Unix(1616509100, 0) etx := cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, nonce, fromAddress, originalBroadcastAt) attempt1 := etx.TxAttempts[0] var dbAttempt txmgr.DbEthTxAttempt dbAttempt.FromTxAttempt(&attempt1) require.NoError(t, db.Get(&dbAttempt, `UPDATE evm.tx_attempts SET broadcast_before_block_num=$1 WHERE id=$2 RETURNING *`, oldEnough, attempt1.ID)) // Send transaction and assume success. ethClient.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress).Return(commonclient.Successful, nil).Once() err := ec.RebroadcastWhereNecessary(tests.Context(t), currentHead) require.NoError(t, err) etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) require.Len(t, etx.TxAttempts, 1) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(false)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `c.EVM[0].GasEstimator.BlockHistory.BlockHistorySize = ptr[uint16](2)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `c.EVM[0].GasEstimator.BlockHistory.CheckInclusionBlocks = ptr[uint16](4)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `estimator.On("BumpLegacyGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, uint64(0), pkgerrors.Wrapf(commonfee.ErrConnectivity, "transaction..."))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `kst.On("EnabledAddressesForChain", mock.Anything, &cltest.FixtureChainID).Return(addresses, nil).Maybe()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `servicetest.Run(t, ec)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `dbAttempt.FromTxAttempt(&attempt1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(true)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `c.EVM[0].GasEstimator.BlockHistory.BlockHistorySize = ptr[uint16](2)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `c.EVM[0].GasEstimator.BlockHistory.CheckInclusionBlocks = ptr[uint16](4)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `estimator.On("BumpDynamicFee", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(gas.DynamicFee{}, pkgerrors.Wrapf(commonfee.ErrConnectivity, "transaction..."))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `kst.On("EnabledAddressesForChain", mock.Anything, &cltest.FixtureChainID).Return(addresses, nil).Maybe()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `servicetest.Run(t, ec)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `dbAttempt.FromTxAttempt(&attempt1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `c.EVM[0].GasEstimator.PriceMax = assets.GWei(500)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `_, _ = cltest.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `kst.On("EnabledAddressesForChain", mock.Anything, &cltest.FixtureChainID).Return(addresses, nil).Maybe()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if tx.Nonce() != uint64(*etx.Sequence) { return false } ethTx = *tx return true }), mock.MatchedBy(func(chainID *big.Int) bool { return chainID.Cmp(evmcfg.EVM().ChainID()) == 0 })).Return(ðTx, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethTx = *tx` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx.Sequence) && tx.GasPrice().Int64() == int64(20000000000) }), fromAddress).Return(commonclient.ExceedsMaxFee, errors.New("tx fee (1.10 ether) exceeds the configured cap (1.00 ether)")).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `c.EVM[0].GasEstimator.PriceMax = assets.GWei(500)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `_, _ = cltest.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `kst.On("EnabledAddressesForChain", mock.Anything, &cltest.FixtureChainID).Return(addresses, nil).Maybe()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("does nothing if no transactions require bumping", func(t *testing.T) { require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `nonce++` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("re-sends previous transaction on keystore error", func(t *testing.T) { // simulate bumped transaction that is somehow impossible to sign kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx.Sequence) }), mock.Anything).Return(nil, errors.New("signing error")).Once() // Do the thing err := ec.RebroadcastWhereNecessary(tests.Context(t), currentHead) require.Error(t, err) require.Contains(t, err.Error(), "signing error") etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxUnconfirmed, etx.State) require.Len(t, etx.TxAttempts, 1) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx.Sequence) }), mock.Anything).Return(nil, errors.New("signing error")).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("does nothing and continues on fatal error", func(t *testing.T) { ethTx := *types.NewTx(&types.LegacyTx{}) kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if tx.Nonce() != uint64(*etx.Sequence) { return false } ethTx = *tx return true }), mock.MatchedBy(func(chainID *big.Int) bool { return chainID.Cmp(evmcfg.EVM().ChainID()) == 0 })).Return(ðTx, nil).Once() ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx.Sequence) }), fromAddress).Return(commonclient.Fatal, errors.New("exceeds block gas limit")).Once() // Do the thing require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) var err error etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) require.Len(t, etx.TxAttempts, 1) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if tx.Nonce() != uint64(*etx.Sequence) { return false } ethTx = *tx return true }), mock.MatchedBy(func(chainID *big.Int) bool { return chainID.Cmp(evmcfg.EVM().ChainID()) == 0 })).Return(ðTx, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethTx = *tx` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx.Sequence) }), fromAddress).Return(commonclient.Fatal, errors.New("exceeds block gas limit")).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient = testutils.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ec.XXXTestSetClient(txmgr.NewEvmTxmClient(ethClient, nil))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("creates new attempt with higher gas price if transaction has an attempt older than threshold", func(t *testing.T) { expectedBumpedGasPrice := big.NewInt(20000000000) require.Greater(t, expectedBumpedGasPrice.Int64(), attempt1_1.TxFee.Legacy.ToInt().Int64()) ethTx := *types.NewTx(&types.LegacyTx{}) kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.MatchedBy(func(chainID *big.Int) bool { return chainID.Cmp(evmcfg.EVM().ChainID()) == 0 })).Return(ðTx, nil).Once() ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once() // Do the thing require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) var err error etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) require.Len(t, etx.TxAttempts, 2) require.Equal(t, attempt1_1.ID, etx.TxAttempts[1].ID) // Got the new attempt attempt1_2 = etx.TxAttempts[0] assert.Equal(t, expectedBumpedGasPrice.Int64(), attempt1_2.TxFee.Legacy.ToInt().Int64()) assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt1_2.State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.MatchedBy(func(chainID *big.Int) bool { return chainID.Cmp(evmcfg.EVM().ChainID()) == 0 })).Return(ðTx, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethTx = *tx` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt1_2 = etx.TxAttempts[0]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("does nothing if there is an attempt without BroadcastBeforeBlockNum set", func(t *testing.T) { // Do the thing require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) var err error etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) require.Len(t, etx.TxAttempts, 2) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("creates new attempt with higher gas price if transaction is already in mempool (e.g. due to previous crash before we could save the new attempt)", func(t *testing.T) { expectedBumpedGasPrice := big.NewInt(25000000000) require.Greater(t, expectedBumpedGasPrice.Int64(), attempt1_2.TxFee.Legacy.ToInt().Int64()) ethTx := *types.NewTx(&types.LegacyTx{}) kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx.Sequence || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.Anything).Return(ðTx, nil).Once() ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Successful, fmt.Errorf("known transaction: %s", ethTx.Hash().Hex())).Once() // Do the thing require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) var err error etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) require.Len(t, etx.TxAttempts, 3) require.Equal(t, attempt1_1.ID, etx.TxAttempts[2].ID) require.Equal(t, attempt1_2.ID, etx.TxAttempts[1].ID) // Got the new attempt attempt1_3 = etx.TxAttempts[0] assert.Equal(t, expectedBumpedGasPrice.Int64(), attempt1_3.TxFee.Legacy.ToInt().Int64()) assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt1_3.State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx.Sequence || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.Anything).Return(ðTx, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethTx = *tx` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Successful, fmt.Errorf("known transaction: %s", ethTx.Hash().Hex())).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt1_3 = etx.TxAttempts[0]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("saves new attempt even for transaction that has already been confirmed (nonce already used)", func(t *testing.T) { expectedBumpedGasPrice := big.NewInt(30000000000) require.Greater(t, expectedBumpedGasPrice.Int64(), attempt1_2.TxFee.Legacy.ToInt().Int64()) ethTx := *types.NewTx(&types.LegacyTx{}) receipt := evmtypes.Receipt{BlockNumber: big.NewInt(40)} kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx.Sequence || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx receipt.TxHash = tx.Hash() return true }), mock.Anything).Return(ðTx, nil).Once() ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.TransactionAlreadyKnown, errors.New("nonce too low")).Once() // Do the thing require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) var err error etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxConfirmedMissingReceipt, etx.State) // Got the new attempt attempt1_4 = etx.TxAttempts[0] assert.Equal(t, expectedBumpedGasPrice.Int64(), attempt1_4.TxFee.Legacy.ToInt().Int64()) require.Len(t, etx.TxAttempts, 4) require.Equal(t, attempt1_1.ID, etx.TxAttempts[3].ID) require.Equal(t, attempt1_2.ID, etx.TxAttempts[2].ID) require.Equal(t, attempt1_3.ID, etx.TxAttempts[1].ID) require.Equal(t, attempt1_4.ID, etx.TxAttempts[0].ID) require.Equal(t, txmgrtypes.TxAttemptBroadcast, etx.TxAttempts[0].State) require.Equal(t, txmgrtypes.TxAttemptBroadcast, etx.TxAttempts[1].State) require.Equal(t, txmgrtypes.TxAttemptBroadcast, etx.TxAttempts[2].State) require.Equal(t, txmgrtypes.TxAttemptBroadcast, etx.TxAttempts[3].State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx.Sequence || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx receipt.TxHash = tx.Hash() return true }), mock.Anything).Return(ðTx, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethTx = *tx` $DIR/core/chains/evm/txmgr/confirmer_test.go: `receipt.TxHash = tx.Hash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.TransactionAlreadyKnown, errors.New("nonce too low")).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt1_4 = etx.TxAttempts[0]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `pgtest.MustExec(t, db, `UPDATE evm.txes SET state = 'confirmed'`)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `nonce++` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("saves in-progress attempt on temporary error and returns error", func(t *testing.T) { expectedBumpedGasPrice := big.NewInt(20000000000) require.Greater(t, expectedBumpedGasPrice.Int64(), attempt2_1.TxFee.Legacy.ToInt().Int64()) ethTx := *types.NewTx(&types.LegacyTx{}) n := *etx2.Sequence kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != n || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.Anything).Return(ðTx, nil).Once() ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == n && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Unknown, errors.New("some network error")).Once() // Do the thing err := ec.RebroadcastWhereNecessary(tests.Context(t), currentHead) require.Error(t, err) require.Contains(t, err.Error(), "some network error") etx2, err = txStore.FindTxWithAttempts(ctx, etx2.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx2.State) // Old attempt is untouched require.Len(t, etx2.TxAttempts, 2) require.Equal(t, attempt2_1.ID, etx2.TxAttempts[1].ID) attempt2_1 = etx2.TxAttempts[1] assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt2_1.State) assert.Equal(t, oldEnough, *attempt2_1.BroadcastBeforeBlockNum) // New in_progress attempt saved attempt2_2 = etx2.TxAttempts[0] assert.Equal(t, txmgrtypes.TxAttemptInProgress, attempt2_2.State) assert.Nil(t, attempt2_2.BroadcastBeforeBlockNum) // Do it again and move the attempt into "broadcast" n = *etx2.Sequence ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == n && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once() require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) // Attempt marked "broadcast" etx2, err = txStore.FindTxWithAttempts(ctx, etx2.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx2.State) // New in_progress attempt saved require.Len(t, etx2.TxAttempts, 2) require.Equal(t, attempt2_2.ID, etx2.TxAttempts[0].ID) attempt2_2 = etx2.TxAttempts[0] require.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt2_2.State) assert.Nil(t, attempt2_2.BroadcastBeforeBlockNum) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != n || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.Anything).Return(ðTx, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethTx = *tx` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == n && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Unknown, errors.New("some network error")).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx2, err = txStore.FindTxWithAttempts(ctx, etx2.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt2_1 = etx2.TxAttempts[1]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt2_2 = etx2.TxAttempts[0]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `n = *etx2.Sequence` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == n && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx2, err = txStore.FindTxWithAttempts(ctx, etx2.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt2_2 = etx2.TxAttempts[0]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("assumes that 'nonce too low' error means confirmed_missing_receipt", func(t *testing.T) { expectedBumpedGasPrice := big.NewInt(25000000000) require.Greater(t, expectedBumpedGasPrice.Int64(), attempt2_1.TxFee.Legacy.ToInt().Int64()) ethTx := *types.NewTx(&types.LegacyTx{}) n := *etx2.Sequence kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != n || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.Anything).Return(ðTx, nil).Once() ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == n && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.TransactionAlreadyKnown, errors.New("nonce too low")).Once() // Creates new attempt as normal if currentHead is not high enough require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) var err error etx2, err = txStore.FindTxWithAttempts(ctx, etx2.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxConfirmedMissingReceipt, etx2.State) // One new attempt saved require.Len(t, etx2.TxAttempts, 3) assert.Equal(t, txmgrtypes.TxAttemptBroadcast, etx2.TxAttempts[0].State) assert.Equal(t, txmgrtypes.TxAttemptBroadcast, etx2.TxAttempts[1].State) assert.Equal(t, txmgrtypes.TxAttemptBroadcast, etx2.TxAttempts[2].State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != n || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.Anything).Return(ðTx, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethTx = *tx` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == n && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.TransactionAlreadyKnown, errors.New("nonce too low")).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx2, err = txStore.FindTxWithAttempts(ctx, etx2.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `nonce++` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("saves attempt anyway if replacement transaction is underpriced because the bumped gas price is insufficiently higher than the previous one", func(t *testing.T) { expectedBumpedGasPrice := big.NewInt(42000000000) require.Greater(t, expectedBumpedGasPrice.Int64(), attempt3_1.TxFee.Legacy.ToInt().Int64()) ethTx := *types.NewTx(&types.LegacyTx{}) kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx3.Sequence || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.Anything).Return(ðTx, nil).Once() ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx3.Sequence && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Successful, errors.New("replacement transaction underpriced")).Once() // Do the thing require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) var err error etx3, err = txStore.FindTxWithAttempts(ctx, etx3.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx3.State) require.Len(t, etx3.TxAttempts, 2) require.Equal(t, attempt3_1.ID, etx3.TxAttempts[1].ID) attempt3_2 = etx3.TxAttempts[0] assert.Equal(t, expectedBumpedGasPrice.Int64(), attempt3_2.TxFee.Legacy.ToInt().Int64()) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx3.Sequence || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.Anything).Return(ðTx, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethTx = *tx` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx3.Sequence && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Successful, errors.New("replacement transaction underpriced")).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx3, err = txStore.FindTxWithAttempts(ctx, etx3.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt3_2 = etx3.TxAttempts[0]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("handles case where transaction is already known somehow", func(t *testing.T) { expectedBumpedGasPrice := big.NewInt(50400000000) require.Greater(t, expectedBumpedGasPrice.Int64(), attempt3_1.TxFee.Legacy.ToInt().Int64()) ethTx := *types.NewTx(&types.LegacyTx{}) kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx3.Sequence || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.Anything).Return(ðTx, nil).Once() ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx3.Sequence && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Successful, fmt.Errorf("known transaction: %s", ethTx.Hash().Hex())).Once() // Do the thing require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) var err error etx3, err = txStore.FindTxWithAttempts(ctx, etx3.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx3.State) require.Len(t, etx3.TxAttempts, 3) attempt3_3 = etx3.TxAttempts[0] assert.Equal(t, expectedBumpedGasPrice.Int64(), attempt3_3.TxFee.Legacy.ToInt().Int64()) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx3.Sequence || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.Anything).Return(ðTx, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethTx = *tx` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx3.Sequence && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Successful, fmt.Errorf("known transaction: %s", ethTx.Hash().Hex())).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx3, err = txStore.FindTxWithAttempts(ctx, etx3.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt3_3 = etx3.TxAttempts[0]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("pretends it was accepted and continues the cycle if rejected for being temporarily underpriced", func(t *testing.T) { // This happens if parity is rejecting transactions that are not priced high enough to even get into the mempool at all // It should pretend it was accepted into the mempool and hand off to the next cycle to continue bumping gas as normal temporarilyUnderpricedError := "There are too many transactions in the queue. Your transaction was dropped due to limit. Try increasing the fee." expectedBumpedGasPrice := big.NewInt(60480000000) require.Greater(t, expectedBumpedGasPrice.Int64(), attempt3_2.TxFee.Legacy.ToInt().Int64()) ethTx := *types.NewTx(&types.LegacyTx{}) kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx3.Sequence || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.Anything).Return(ðTx, nil).Once() ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx3.Sequence && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Successful, errors.New(temporarilyUnderpricedError)).Once() // Do the thing require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) var err error etx3, err = txStore.FindTxWithAttempts(ctx, etx3.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx3.State) require.Len(t, etx3.TxAttempts, 4) attempt3_4 = etx3.TxAttempts[0] assert.Equal(t, expectedBumpedGasPrice.Int64(), attempt3_4.TxFee.Legacy.ToInt().Int64()) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx3.Sequence || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.Anything).Return(ðTx, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethTx = *tx` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx3.Sequence && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Successful, errors.New(temporarilyUnderpricedError)).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx3, err = txStore.FindTxWithAttempts(ctx, etx3.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt3_4 = etx3.TxAttempts[0]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("resubmits at the old price and does not create a new attempt if one of the bumped transactions would exceed EVM.GasEstimator.PriceMax", func(t *testing.T) { // Set price such that the next bump will exceed EVM.GasEstimator.PriceMax // Existing gas price is: 60480000000 gasPrice := attempt3_4.TxFee.Legacy.ToInt() gcfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.PriceMax = assets.NewWeiI(60500000000) }) newCfg := evmtest.NewChainScopedConfig(t, gcfg) ec2 := newEthConfirmer(t, txStore, ethClient, gcfg, newCfg, ethKeyStore, nil) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx3.Sequence && gasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Successful, errors.New("already known")).Once() // we already submitted at this price, now it's time to bump and submit again but since we simply resubmitted rather than increasing gas price, geth already knows about this tx // Do the thing require.NoError(t, ec2.RebroadcastWhereNecessary(tests.Context(t), currentHead)) var err error etx3, err = txStore.FindTxWithAttempts(ctx, etx3.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx3.State) // No new tx attempts require.Len(t, etx3.TxAttempts, 4) attempt3_4 = etx3.TxAttempts[0] assert.Equal(t, gasPrice.Int64(), attempt3_4.TxFee.Legacy.ToInt().Int64()) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `c.EVM[0].GasEstimator.PriceMax = assets.NewWeiI(60500000000)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx3.Sequence && gasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Successful, errors.New("already known")).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx3, err = txStore.FindTxWithAttempts(ctx, etx3.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt3_4 = etx3.TxAttempts[0]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("resubmits at the old price and does not create a new attempt if the current price is exactly EVM.GasEstimator.PriceMax", func(t *testing.T) { // Set price such that the current price is already at EVM.GasEstimator.PriceMax // Existing gas price is: 60480000000 gasPrice := attempt3_4.TxFee.Legacy.ToInt() gcfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.PriceMax = assets.NewWeiI(60480000000) }) newCfg := evmtest.NewChainScopedConfig(t, gcfg) ec2 := newEthConfirmer(t, txStore, ethClient, gcfg, newCfg, ethKeyStore, nil) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx3.Sequence && gasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Successful, errors.New("already known")).Once() // we already submitted at this price, now it's time to bump and submit again but since we simply resubmitted rather than increasing gas price, geth already knows about this tx // Do the thing require.NoError(t, ec2.RebroadcastWhereNecessary(tests.Context(t), currentHead)) var err error etx3, err = txStore.FindTxWithAttempts(ctx, etx3.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx3.State) // No new tx attempts require.Len(t, etx3.TxAttempts, 4) attempt3_4 = etx3.TxAttempts[0] assert.Equal(t, gasPrice.Int64(), attempt3_4.TxFee.Legacy.ToInt().Int64()) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `c.EVM[0].GasEstimator.PriceMax = assets.NewWeiI(60480000000)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx3.Sequence && gasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Successful, errors.New("already known")).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx3, err = txStore.FindTxWithAttempts(ctx, etx3.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt3_4 = etx3.TxAttempts[0]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("EIP-1559: bumps using EIP-1559 rules when existing attempts are of type 0x2", func(t *testing.T) { ethTx := *types.NewTx(&types.DynamicFeeTx{}) kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx4.Sequence { return false } ethTx = *tx return true }), mock.Anything).Return(ðTx, nil).Once() // This is the new, EIP-1559 attempt gasTipCap := assets.GWei(42) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx4.Sequence && gasTipCap.ToInt().Cmp(tx.GasTipCap()) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once() require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) var err error etx4, err = txStore.FindTxWithAttempts(ctx, etx4.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx4.State) // A new, bumped attempt require.Len(t, etx4.TxAttempts, 2) attempt4_2 = etx4.TxAttempts[0] assert.Nil(t, attempt4_2.TxFee.Legacy) assert.Equal(t, assets.GWei(42).String(), attempt4_2.TxFee.DynamicTipCap.String()) assert.Equal(t, assets.GWei(120).String(), attempt4_2.TxFee.DynamicFeeCap.String()) assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt1_2.State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx4.Sequence { return false } ethTx = *tx return true }), mock.Anything).Return(ðTx, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethTx = *tx` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx4.Sequence && gasTipCap.ToInt().Cmp(tx.GasTipCap()) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx4, err = txStore.FindTxWithAttempts(ctx, etx4.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt4_2 = etx4.TxAttempts[0]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("EIP-1559: resubmits at the old price and does not create a new attempt if one of the bumped EIP-1559 transactions would have its tip cap exceed EVM.GasEstimator.PriceMax", func(t *testing.T) { gcfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.PriceMax = assets.GWei(1000) }) newCfg := evmtest.NewChainScopedConfig(t, gcfg) ec2 := newEthConfirmer(t, txStore, ethClient, gcfg, newCfg, ethKeyStore, nil) // Third attempt failed to bump, resubmits old one instead ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx4.Sequence && attempt4_2.Hash.String() == tx.Hash().String() }), fromAddress).Return(commonclient.Successful, nil).Once() require.NoError(t, ec2.RebroadcastWhereNecessary(tests.Context(t), currentHead)) var err error etx4, err = txStore.FindTxWithAttempts(ctx, etx4.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx4.State) // No new tx attempts require.Len(t, etx4.TxAttempts, 2) assert.Equal(t, assets.GWei(999).Int64(), etx4.TxAttempts[0].TxFee.DynamicTipCap.ToInt().Int64()) assert.Equal(t, assets.GWei(1000).Int64(), etx4.TxAttempts[0].TxFee.DynamicFeeCap.ToInt().Int64()) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `c.EVM[0].GasEstimator.PriceMax = assets.GWei(1000)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx4.Sequence && attempt4_2.Hash.String() == tx.Hash().String() }), fromAddress).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx4, err = txStore.FindTxWithAttempts(ctx, etx4.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx4.Sequence || expectedBumpedTipCap.ToInt().Cmp(tx.GasTipCap()) != 0 { return false } ethTx = *tx return true }), mock.Anything).Return(ðTx, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethTx = *tx` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx4.Sequence && expectedBumpedTipCap.ToInt().Cmp(tx.GasTipCap()) == 0 }), fromAddress).Return(commonclient.Successful, errors.New("replacement transaction underpriced")).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx4, err = txStore.FindTxWithAttempts(ctx, etx4.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `c.EVM[0].GasEstimator.PriceMax = assets.GWei(500)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `_, _ = cltest.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `kst.On("EnabledAddressesForChain", mock.Anything, &cltest.FixtureChainID).Return(addresses, nil).Maybe()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("terminally underpriced transaction with in_progress attempt is retried with more gas", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) ec := newEthConfirmer(t, txStore, ethClient, cfg, evmcfg, kst, nil) originalBroadcastAt := time.Unix(1616509100, 0) etx := mustInsertUnconfirmedEthTxWithAttemptState(t, txStore, nonce, fromAddress, txmgrtypes.TxAttemptInProgress, originalBroadcastAt) require.Equal(t, originalBroadcastAt, *etx.BroadcastAt) nonce++ attempt := etx.TxAttempts[0] signedTx, err := txmgr.GetGethSignedTx(attempt.SignedRawTx) require.NoError(t, err) // Fail the first time with terminally underpriced. ethClient.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress).Return( commonclient.Underpriced, errors.New("Transaction gas price is too low. It does not satisfy your node's minimal gas price")).Once() // Succeed the second time after bumping gas. ethClient.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress).Return( commonclient.Successful, nil).Once() kst.On("SignTx", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return( signedTx, nil, ).Once() require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `nonce++` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress).Return( commonclient.Underpriced, errors.New("Transaction gas price is too low. It does not satisfy your node's minimal gas price")).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress).Return( commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `kst.On("SignTx", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return( signedTx, nil, ).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("multiple gas bumps with existing broadcast attempts are retried with more gas until success in legacy mode", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) ec := newEthConfirmer(t, txStore, ethClient, cfg, evmcfg, kst, nil) etx := cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, nonce, fromAddress) nonce++ legacyAttempt := etx.TxAttempts[0] var dbAttempt txmgr.DbEthTxAttempt dbAttempt.FromTxAttempt(&legacyAttempt) require.NoError(t, db.Get(&dbAttempt, `UPDATE evm.tx_attempts SET broadcast_before_block_num=$1 WHERE id=$2 RETURNING *`, oldEnough, legacyAttempt.ID)) // Fail a few times with terminally underpriced ethClient.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress).Return( commonclient.Underpriced, errors.New("Transaction gas price is too low. It does not satisfy your node's minimal gas price")).Times(3) // Succeed the second time after bumping gas. ethClient.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress).Return( commonclient.Successful, nil).Once() signedLegacyTx := new(types.Transaction) kst.On("SignTx", mock.Anything, mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Type() == 0x0 && tx.Nonce() == uint64(*etx.Sequence) }), mock.Anything).Return( signedLegacyTx, nil, ).Run(func(args mock.Arguments) { unsignedLegacyTx := args.Get(2).(*types.Transaction) // Use the real keystore to do the actual signing thisSignedLegacyTx, err := ethKeyStore.SignTx(tests.Context(t), fromAddress, unsignedLegacyTx, testutils.FixtureChainID) require.NoError(t, err) *signedLegacyTx = *thisSignedLegacyTx }).Times(4) // 3 failures 1 success require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `nonce++` $DIR/core/chains/evm/txmgr/confirmer_test.go: `dbAttempt.FromTxAttempt(&legacyAttempt)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress).Return( commonclient.Underpriced, errors.New("Transaction gas price is too low. It does not satisfy your node's minimal gas price")).Times(3)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress).Return( commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `kst.On("SignTx", mock.Anything, mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Type() == 0x0 && tx.Nonce() == uint64(*etx.Sequence) }), mock.Anything).Return( signedLegacyTx, nil, ).Run(func(args mock.Arguments) { unsignedLegacyTx := args.Get(2).(*types.Transaction) // Use the real keystore to do the actual signing thisSignedLegacyTx, err := ethKeyStore.SignTx(tests.Context(t), fromAddress, unsignedLegacyTx, testutils.FixtureChainID) require.NoError(t, err) *signedLegacyTx = *thisSignedLegacyTx }).Times(4)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `*signedLegacyTx = *thisSignedLegacyTx` $DIR/core/chains/evm/txmgr/confirmer_test.go: `nonce++` $DIR/core/chains/evm/txmgr/confirmer_test.go: `dbAttempt.FromTxAttempt(&dxFeeAttempt)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress).Return( commonclient.Underpriced, errors.New("transaction underpriced")).Times(3)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress).Return( commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `kst.On("SignTx", mock.Anything, mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Type() == 0x2 && tx.Nonce() == uint64(*etx.Sequence) }), mock.Anything).Return( signedDxFeeTx, nil, ).Run(func(args mock.Arguments) { unsignedDxFeeTx := args.Get(2).(*types.Transaction) // Use the real keystore to do the actual signing thisSignedDxFeeTx, err := ethKeyStore.SignTx(tests.Context(t), fromAddress, unsignedDxFeeTx, testutils.FixtureChainID) require.NoError(t, err) *signedDxFeeTx = *thisSignedDxFeeTx }).Times(4)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `*signedDxFeeTx = *thisSignedDxFeeTx` $DIR/core/chains/evm/txmgr/confirmer_test.go: `nonce++` $DIR/core/chains/evm/txmgr/confirmer_test.go: `dbAttempt.FromTxAttempt(&attempt1_1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("saves attempt with state 'insufficient_eth' if eth node returns this error", func(t *testing.T) { ec := newEthConfirmer(t, txStore, ethClient, gconfig, config, ethKeyStore, nil) expectedBumpedGasPrice := big.NewInt(20000000000) require.Greater(t, expectedBumpedGasPrice.Int64(), attempt1_1.TxFee.Legacy.ToInt().Int64()) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.InsufficientFunds, insufficientEthError).Once() // Do the thing require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) require.Len(t, etx.TxAttempts, 2) require.Equal(t, attempt1_1.ID, etx.TxAttempts[1].ID) // Got the new attempt attempt1_2 = etx.TxAttempts[0] assert.Equal(t, expectedBumpedGasPrice.Int64(), attempt1_2.TxFee.Legacy.ToInt().Int64()) assert.Equal(t, txmgrtypes.TxAttemptInsufficientFunds, attempt1_2.State) assert.Nil(t, attempt1_2.BroadcastBeforeBlockNum) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.InsufficientFunds, insufficientEthError).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt1_2 = etx.TxAttempts[0]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("does not bump gas when previous error was 'out of eth', instead resubmits existing transaction", func(t *testing.T) { ec := newEthConfirmer(t, txStore, ethClient, gconfig, config, ethKeyStore, nil) expectedBumpedGasPrice := big.NewInt(20000000000) require.Greater(t, expectedBumpedGasPrice.Int64(), attempt1_1.TxFee.Legacy.ToInt().Int64()) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.InsufficientFunds, insufficientEthError).Once() // Do the thing require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) // New attempt was NOT created require.Len(t, etx.TxAttempts, 2) // The attempt is still "out of eth" attempt1_2 = etx.TxAttempts[0] assert.Equal(t, expectedBumpedGasPrice.Int64(), attempt1_2.TxFee.Legacy.ToInt().Int64()) assert.Equal(t, txmgrtypes.TxAttemptInsufficientFunds, attempt1_2.State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.InsufficientFunds, insufficientEthError).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt1_2 = etx.TxAttempts[0]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("saves the attempt as broadcast after node wallet has been topped up with sufficient balance", func(t *testing.T) { ec := newEthConfirmer(t, txStore, ethClient, gconfig, config, ethKeyStore, nil) expectedBumpedGasPrice := big.NewInt(20000000000) require.Greater(t, expectedBumpedGasPrice.Int64(), attempt1_1.TxFee.Legacy.ToInt().Int64()) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once() // Do the thing require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) // New attempt was NOT created require.Len(t, etx.TxAttempts, 2) // Attempt is now 'broadcast' attempt1_2 = etx.TxAttempts[0] assert.Equal(t, expectedBumpedGasPrice.Int64(), attempt1_2.TxFee.Legacy.ToInt().Int64()) assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt1_2.State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt1_2 = etx.TxAttempts[0]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `c.EVM[0].GasEstimator.BumpTxDepth = ptr(uint32(depth))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `mustInsertUnconfirmedEthTxWithInsufficientEthAttempt(t, txStore, nonce, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(n) }), fromAddress).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `nonce++` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("does nothing if there aren't any transactions", func(t *testing.T) { require.NoError(t, ec.EnsureConfirmedTransactionsInLongestChain(tests.Context(t), &head)) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("does nothing to unconfirmed transactions", func(t *testing.T) { etx := cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 0, fromAddress) // Do the thing require.NoError(t, ec.EnsureConfirmedTransactionsInLongestChain(tests.Context(t), &head)) etx, err := txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx.State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("does nothing to confirmed transactions with receipts within head height of the chain and included in the chain", func(t *testing.T) { etx := cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 2, 1, fromAddress) mustInsertEthReceipt(t, txStore, head.Number, head.Hash, etx.TxAttempts[0].Hash) // Do the thing require.NoError(t, ec.EnsureConfirmedTransactionsInLongestChain(tests.Context(t), &head)) etx, err := txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxConfirmed, etx.State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `mustInsertEthReceipt(t, txStore, head.Number, head.Hash, etx.TxAttempts[0].Hash)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("does nothing to confirmed transactions that only have receipts older than the start of the chain", func(t *testing.T) { etx := cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 3, 1, fromAddress) // Add receipt that is older than the lowest block of the chain mustInsertEthReceipt(t, txStore, head.Parent.Parent.Number-1, testutils.NewHash(), etx.TxAttempts[0].Hash) // Do the thing require.NoError(t, ec.EnsureConfirmedTransactionsInLongestChain(tests.Context(t), &head)) etx, err := txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxConfirmed, etx.State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `mustInsertEthReceipt(t, txStore, head.Parent.Parent.Number-1, testutils.NewHash(), etx.TxAttempts[0].Hash)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("unconfirms and rebroadcasts transactions that have receipts within head height of the chain but not included in the chain", func(t *testing.T) { etx := cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 4, 1, fromAddress) attempt := etx.TxAttempts[0] // Include one within head height but a different block hash mustInsertEthReceipt(t, txStore, head.Parent.Number, testutils.NewHash(), attempt.Hash) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { atx, err := txmgr.GetGethSignedTx(attempt.SignedRawTx) require.NoError(t, err) // Keeps gas price and nonce the same return atx.GasPrice().Cmp(tx.GasPrice()) == 0 && atx.Nonce() == tx.Nonce() }), fromAddress).Return(commonclient.Successful, nil).Once() // Do the thing require.NoError(t, ec.EnsureConfirmedTransactionsInLongestChain(tests.Context(t), &head)) etx, err := txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx.State) require.Len(t, etx.TxAttempts, 1) attempt = etx.TxAttempts[0] assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt.State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `mustInsertEthReceipt(t, txStore, head.Parent.Number, testutils.NewHash(), attempt.Hash)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { atx, err := txmgr.GetGethSignedTx(attempt.SignedRawTx) require.NoError(t, err) // Keeps gas price and nonce the same return atx.GasPrice().Cmp(tx.GasPrice()) == 0 && atx.Nonce() == tx.Nonce() }), fromAddress).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt = etx.TxAttempts[0]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("unconfirms and rebroadcasts transactions that have receipts within head height of chain but not included in the chain even if a receipt exists older than the start of the chain", func(t *testing.T) { etx := cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 5, 1, fromAddress) attempt := etx.TxAttempts[0] attemptHash := attempt.Hash // Add receipt that is older than the lowest block of the chain mustInsertEthReceipt(t, txStore, head.Parent.Parent.Number-1, testutils.NewHash(), attemptHash) // Include one within head height but a different block hash mustInsertEthReceipt(t, txStore, head.Parent.Number, testutils.NewHash(), attemptHash) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress).Return( commonclient.Successful, nil).Once() // Do the thing require.NoError(t, ec.EnsureConfirmedTransactionsInLongestChain(tests.Context(t), &head)) etx, err := txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx.State) require.Len(t, etx.TxAttempts, 1) attempt = etx.TxAttempts[0] assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt.State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `mustInsertEthReceipt(t, txStore, head.Parent.Parent.Number-1, testutils.NewHash(), attemptHash)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `mustInsertEthReceipt(t, txStore, head.Parent.Number, testutils.NewHash(), attemptHash)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress).Return( commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt = etx.TxAttempts[0]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("if more than one attempt has a receipt (should not be possible but isn't prevented by database constraints) unconfirms and rebroadcasts only the attempt with the highest gas price", func(t *testing.T) { etx := cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 6, 1, fromAddress) require.Len(t, etx.TxAttempts, 1) // Sanity check to assert the included attempt has the lowest gas price require.Less(t, etx.TxAttempts[0].TxFee.Legacy.ToInt().Int64(), int64(30000)) attempt2 := newBroadcastLegacyEthTxAttempt(t, etx.ID, 30000) attempt2.SignedRawTx = hexutil.MustDecode("0xf88c8301f3a98503b9aca000832ab98094f5fff180082d6017036b771ba883025c654bc93580a4daa6d556000000000000000000000000000000000000000000000000000000000000000026a0f25601065ee369b6470c0399a2334afcfbeb0b5c8f3d9a9042e448ed29b5bcbda05b676e00248b85faf4dd889f0e2dcf91eb867e23ac9eeb14a73f9e4c14972cdf") attempt3 := newBroadcastLegacyEthTxAttempt(t, etx.ID, 40000) attempt3.SignedRawTx = hexutil.MustDecode("0xf88c8301f3a88503b9aca0008316e36094151445852b0cfdf6a4cc81440f2af99176e8ad0880a4daa6d556000000000000000000000000000000000000000000000000000000000000000026a0dcb5a7ad52b96a866257134429f944c505820716567f070e64abb74899803855a04c13eff2a22c218e68da80111e1bb6dc665d3dea7104ab40ff8a0275a99f630d") require.NoError(t, txStore.InsertTxAttempt(ctx, &attempt2)) require.NoError(t, txStore.InsertTxAttempt(ctx, &attempt3)) // Receipt is within head height but a different block hash mustInsertEthReceipt(t, txStore, head.Parent.Number, testutils.NewHash(), attempt2.Hash) // Receipt is within head height but a different block hash mustInsertEthReceipt(t, txStore, head.Parent.Number, testutils.NewHash(), attempt3.Hash) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { s, err := txmgr.GetGethSignedTx(attempt3.SignedRawTx) require.NoError(t, err) return tx.Hash() == s.Hash() }), fromAddress).Return(commonclient.Successful, nil).Once() // Do the thing require.NoError(t, ec.EnsureConfirmedTransactionsInLongestChain(tests.Context(t), &head)) etx, err := txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx.State) require.Len(t, etx.TxAttempts, 3) attempt1 := etx.TxAttempts[0] assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt1.State) attempt2 = etx.TxAttempts[1] assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt2.State) attempt3 = etx.TxAttempts[2] assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt3.State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt2.SignedRawTx = hexutil.MustDecode("0xf88c8301f3a98503b9aca000832ab98094f5fff180082d6017036b771ba883025c654bc93580a4daa6d556000000000000000000000000000000000000000000000000000000000000000026a0f25601065ee369b6470c0399a2334afcfbeb0b5c8f3d9a9042e448ed29b5bcbda05b676e00248b85faf4dd889f0e2dcf91eb867e23ac9eeb14a73f9e4c14972cdf")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt3.SignedRawTx = hexutil.MustDecode("0xf88c8301f3a88503b9aca0008316e36094151445852b0cfdf6a4cc81440f2af99176e8ad0880a4daa6d556000000000000000000000000000000000000000000000000000000000000000026a0dcb5a7ad52b96a866257134429f944c505820716567f070e64abb74899803855a04c13eff2a22c218e68da80111e1bb6dc665d3dea7104ab40ff8a0275a99f630d")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `mustInsertEthReceipt(t, txStore, head.Parent.Number, testutils.NewHash(), attempt2.Hash)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `mustInsertEthReceipt(t, txStore, head.Parent.Number, testutils.NewHash(), attempt3.Hash)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { s, err := txmgr.GetGethSignedTx(attempt3.SignedRawTx) require.NoError(t, err) return tx.Hash() == s.Hash() }), fromAddress).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt2 = etx.TxAttempts[1]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt3 = etx.TxAttempts[2]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `mustInsertEthReceipt(t, txStore, head.Number+1, testutils.NewHash(), attempt.Hash)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `attempt = etx.TxAttempts[0]` $DIR/core/chains/evm/txmgr/confirmer_test.go: `mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, config.EVM().ChainID())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `mustInsertInProgressEthTx(t, txStore, 0, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("rebroadcasts one eth_tx if it falls within in nonce range", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) ec := newEthConfirmer(t, txStore, ethClient, gconfig, config, ethKeyStore, nil) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx1.Sequence) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == overrideGasLimit && reflect.DeepEqual(tx.Data(), etx1.EncodedPayload) && tx.To().String() == etx1.ToAddress.String() }), mock.Anything).Return(commonclient.Successful, nil).Once() require.NoError(t, ec.ForceRebroadcast(tests.Context(t), []evmtypes.Nonce{1}, gasPriceWei, fromAddress, overrideGasLimit)) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx1.Sequence) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == overrideGasLimit && reflect.DeepEqual(tx.Data(), etx1.EncodedPayload) && tx.To().String() == etx1.ToAddress.String() }), mock.Anything).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("uses default gas limit if overrideGasLimit is 0", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) ec := newEthConfirmer(t, txStore, ethClient, gconfig, config, ethKeyStore, nil) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx1.Sequence) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == etx1.FeeLimit && reflect.DeepEqual(tx.Data(), etx1.EncodedPayload) && tx.To().String() == etx1.ToAddress.String() }), mock.Anything).Return(commonclient.Successful, nil).Once() require.NoError(t, ec.ForceRebroadcast(tests.Context(t), []evmtypes.Nonce{(1)}, gasPriceWei, fromAddress, 0)) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx1.Sequence) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == etx1.FeeLimit && reflect.DeepEqual(tx.Data(), etx1.EncodedPayload) && tx.To().String() == etx1.ToAddress.String() }), mock.Anything).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("rebroadcasts several eth_txes in nonce range", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) ec := newEthConfirmer(t, txStore, ethClient, gconfig, config, ethKeyStore, nil) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx1.Sequence) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == overrideGasLimit }), mock.Anything).Return(commonclient.Successful, nil).Once() ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx2.Sequence) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == overrideGasLimit }), mock.Anything).Return(commonclient.Successful, nil).Once() require.NoError(t, ec.ForceRebroadcast(tests.Context(t), []evmtypes.Nonce{(1), (2)}, gasPriceWei, fromAddress, overrideGasLimit)) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx1.Sequence) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == overrideGasLimit }), mock.Anything).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx2.Sequence) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == overrideGasLimit }), mock.Anything).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("broadcasts zero transactions if eth_tx doesn't exist for that nonce", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) ec := newEthConfirmer(t, txStore, ethClient, gconfig, config, ethKeyStore, nil) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(1) }), mock.Anything).Return(commonclient.Successful, nil).Once() ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(2) }), mock.Anything).Return(commonclient.Successful, nil).Once() for i := 3; i <= 5; i++ { nonce := i ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(nonce) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == overrideGasLimit && *tx.To() == fromAddress && tx.Value().Cmp(big.NewInt(0)) == 0 && len(tx.Data()) == 0 }), mock.Anything).Return(commonclient.Successful, nil).Once() } nonces := []evmtypes.Nonce{(1), (2), (3), (4), (5)} require.NoError(t, ec.ForceRebroadcast(tests.Context(t), nonces, gasPriceWei, fromAddress, overrideGasLimit)) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(1) }), mock.Anything).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(2) }), mock.Anything).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(nonce) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == overrideGasLimit && *tx.To() == fromAddress && tx.Value().Cmp(big.NewInt(0)) == 0 && len(tx.Data()) == 0 }), mock.Anything).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(0) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == config.EVM().GasEstimator().LimitDefault() }), mock.Anything).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `pgtest.MustExec(t, db, `SET CONSTRAINTS fk_pipeline_runs_pruning_key DEFERRED`)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `pgtest.MustExec(t, db, `SET CONSTRAINTS pipeline_runs_pipeline_spec_id_fkey DEFERRED`)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("doesn't process task runs that are not suspended (possibly already previously resumed)", func(t *testing.T) { ec := newEthConfirmer(t, txStore, ethClient, config, evmcfg, ethKeyStore, func(context.Context, uuid.UUID, interface{}, error) error { t.Fatal("No value expected") return nil }) run := cltest.MustInsertPipelineRun(t, db) tr := cltest.MustInsertUnfinishedPipelineTaskRun(t, db, run.ID) etx := cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 1, 1, fromAddress) mustInsertEthReceipt(t, txStore, head.Number-minConfirmations, head.Hash, etx.TxAttempts[0].Hash) // Setting both signal_callback and callback_completed to TRUE to simulate a completed pipeline task // It would only be in a state past suspended if the resume callback was called and callback_completed was set to TRUE pgtest.MustExec(t, db, `UPDATE evm.txes SET pipeline_task_run_id = $1, min_confirmations = $2, signal_callback = TRUE, callback_completed = TRUE WHERE id = $3`, &tr.ID, minConfirmations, etx.ID) err := ec.ResumePendingTaskRuns(tests.Context(t), &head) require.NoError(t, err) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `mustInsertEthReceipt(t, txStore, head.Number-minConfirmations, head.Hash, etx.TxAttempts[0].Hash)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `pgtest.MustExec(t, db, `UPDATE evm.txes SET pipeline_task_run_id = $1, min_confirmations = $2, signal_callback = TRUE, callback_completed = TRUE WHERE id = $3`, &tr.ID, minConfirmations, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("doesn't process task runs where the receipt is younger than minConfirmations", func(t *testing.T) { ec := newEthConfirmer(t, txStore, ethClient, config, evmcfg, ethKeyStore, func(context.Context, uuid.UUID, interface{}, error) error { t.Fatal("No value expected") return nil }) run := cltest.MustInsertPipelineRun(t, db) tr := cltest.MustInsertUnfinishedPipelineTaskRun(t, db, run.ID) etx := cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 2, 1, fromAddress) mustInsertEthReceipt(t, txStore, head.Number, head.Hash, etx.TxAttempts[0].Hash) pgtest.MustExec(t, db, `UPDATE evm.txes SET pipeline_task_run_id = $1, min_confirmations = $2, signal_callback = TRUE WHERE id = $3`, &tr.ID, minConfirmations, etx.ID) err := ec.ResumePendingTaskRuns(tests.Context(t), &head) require.NoError(t, err) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `mustInsertEthReceipt(t, txStore, head.Number, head.Hash, etx.TxAttempts[0].Hash)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `pgtest.MustExec(t, db, `UPDATE evm.txes SET pipeline_task_run_id = $1, min_confirmations = $2, signal_callback = TRUE WHERE id = $3`, &tr.ID, minConfirmations, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("processes eth_txes with receipts older than minConfirmations", func(t *testing.T) { ch := make(chan interface{}) nonce := evmtypes.Nonce(3) var err error ec := newEthConfirmer(t, txStore, ethClient, config, evmcfg, ethKeyStore, func(ctx context.Context, id uuid.UUID, value interface{}, thisErr error) error { err = thisErr ch <- value return nil }) run := cltest.MustInsertPipelineRun(t, db) tr := cltest.MustInsertUnfinishedPipelineTaskRun(t, db, run.ID) pgtest.MustExec(t, db, `UPDATE pipeline_runs SET state = 'suspended' WHERE id = $1`, run.ID) etx := cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, int64(nonce), 1, fromAddress) pgtest.MustExec(t, db, `UPDATE evm.txes SET meta='{"FailOnRevert": true}'`) receipt := mustInsertEthReceipt(t, txStore, head.Number-minConfirmations, head.Hash, etx.TxAttempts[0].Hash) pgtest.MustExec(t, db, `UPDATE evm.txes SET pipeline_task_run_id = $1, min_confirmations = $2, signal_callback = TRUE WHERE id = $3`, &tr.ID, minConfirmations, etx.ID) done := make(chan struct{}) t.Cleanup(func() { <-done }) go func() { defer close(done) err2 := ec.ResumePendingTaskRuns(tests.Context(t), &head) if !assert.NoError(t, err2) { return } // Retrieve Tx to check if callback completed flag was set to true updateTx, err3 := txStore.FindTxWithSequence(tests.Context(t), fromAddress, nonce) if assert.NoError(t, err3) { assert.Equal(t, true, updateTx.CallbackCompleted) } }() select { case data := <-ch: assert.NoError(t, err) require.IsType(t, &evmtypes.Receipt{}, data) r := data.(*evmtypes.Receipt) require.Equal(t, receipt.TxHash, r.TxHash) case <-time.After(time.Second): t.Fatal("no value received") } })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `err = thisErr` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ch <- value` $DIR/core/chains/evm/txmgr/confirmer_test.go: `pgtest.MustExec(t, db, `UPDATE pipeline_runs SET state = 'suspended' WHERE id = $1`, run.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `pgtest.MustExec(t, db, `UPDATE evm.txes SET meta='{"FailOnRevert": true}'`)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `pgtest.MustExec(t, db, `UPDATE evm.txes SET pipeline_task_run_id = $1, min_confirmations = $2, signal_callback = TRUE WHERE id = $3`, &tr.ID, minConfirmations, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Cleanup(func() { <-done })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `<-done` $DIR/core/chains/evm/txmgr/confirmer_test.go: `pgtest.MustExec(t, db, `DELETE FROM pipeline_runs`)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Run("processes eth_txes with receipt older than minConfirmations that reverted", func(t *testing.T) { type data struct { value any error } ch := make(chan data) nonce := evmtypes.Nonce(4) ec := newEthConfirmer(t, txStore, ethClient, config, evmcfg, ethKeyStore, func(ctx context.Context, id uuid.UUID, value interface{}, err error) error { ch <- data{value, err} return nil }) run := cltest.MustInsertPipelineRun(t, db) tr := cltest.MustInsertUnfinishedPipelineTaskRun(t, db, run.ID) pgtest.MustExec(t, db, `UPDATE pipeline_runs SET state = 'suspended' WHERE id = $1`, run.ID) etx := cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, int64(nonce), 1, fromAddress) pgtest.MustExec(t, db, `UPDATE evm.txes SET meta='{"FailOnRevert": true}'`) // receipt is not passed through as a value since it reverted and caused an error mustInsertRevertedEthReceipt(t, txStore, head.Number-minConfirmations, head.Hash, etx.TxAttempts[0].Hash) pgtest.MustExec(t, db, `UPDATE evm.txes SET pipeline_task_run_id = $1, min_confirmations = $2, signal_callback = TRUE WHERE id = $3`, &tr.ID, minConfirmations, etx.ID) done := make(chan struct{}) t.Cleanup(func() { <-done }) go func() { defer close(done) err2 := ec.ResumePendingTaskRuns(tests.Context(t), &head) if !assert.NoError(t, err2) { return } // Retrieve Tx to check if callback completed flag was set to true updateTx, err3 := txStore.FindTxWithSequence(tests.Context(t), fromAddress, nonce) if assert.NoError(t, err3) { assert.Equal(t, true, updateTx.CallbackCompleted) } }() select { case data := <-ch: assert.Error(t, data.error) assert.EqualError(t, data.error, fmt.Sprintf("transaction %s reverted on-chain", etx.TxAttempts[0].Hash.String())) assert.Nil(t, data.value) case <-time.After(tests.WaitTimeout(t)): t.Fatal("no value received") } })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ch <- data{value, err}` $DIR/core/chains/evm/txmgr/confirmer_test.go: `pgtest.MustExec(t, db, `UPDATE pipeline_runs SET state = 'suspended' WHERE id = $1`, run.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `pgtest.MustExec(t, db, `UPDATE evm.txes SET meta='{"FailOnRevert": true}'`)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `mustInsertRevertedEthReceipt(t, txStore, head.Number-minConfirmations, head.Hash, etx.TxAttempts[0].Hash)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `pgtest.MustExec(t, db, `UPDATE evm.txes SET pipeline_task_run_id = $1, min_confirmations = $2, signal_callback = TRUE WHERE id = $3`, &tr.ID, minConfirmations, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `t.Cleanup(func() { <-done })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `<-done` $DIR/core/chains/evm/txmgr/confirmer_test.go: `mustInsertEthReceipt(t, txStore, head.Number-minConfirmations, head.Hash, etx.TxAttempts[0].Hash)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `pgtest.MustExec(t, db, `UPDATE evm.txes SET pipeline_task_run_id = $1, min_confirmations = $2, signal_callback = TRUE WHERE id = $3`, &tr.ID, minConfirmations, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress).Return(commonclient.Successful, nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `feeEstimator.On("GetFee", mock.Anything, []byte{}, uint64(0), mock.Anything).Return(fee, uint64(0), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `feeEstimator.On("BumpFee", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(bumpedFee, uint64(10_000), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `c.EVM[0].GasEstimator.LimitDefault = ptr(limitDefault)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `c.EVM[0].Transactions.AutoPurge.Enabled = ptr(true)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `c.EVM[0].Transactions.AutoPurge.Threshold = ptr(autoPurgeThreshold)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `c.EVM[0].Transactions.AutoPurge.MinAttempts = ptr(autoPurgeMinAttempts)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `servicetest.Run(t, ec)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(0), nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.Anything).Return(nil).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `head = evmtypes.Head{ Hash: testutils.NewHash(), Number: blockNum + 1, }` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(1), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 4 && cltest.BatchElemMatchesParams(b[0], latestAttempt.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // First transaction confirmed *(elems[0].Result.(*evmtypes.Receipt)) = evmtypes.Receipt{ TxHash: latestAttempt.Hash, BlockHash: testutils.NewHash(), BlockNumber: big.NewInt(blockNum + 1), TransactionIndex: uint(1), Status: uint64(1), } }).Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `*(elems[0].Result.(*evmtypes.Receipt)) = evmtypes.Receipt{ TxHash: latestAttempt.Hash, BlockHash: testutils.NewHash(), BlockNumber: big.NewInt(blockNum + 1), TransactionIndex: uint(1), Status: uint64(1), }` $DIR/core/chains/evm/txmgr/confirmer_test.go: `err = ec.ProcessHead(ctx, &head)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `dbTx, err = txStore.FindTxWithAttempts(ctx, tx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEvmEstimator(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEvmFeeEstimator(lggr, newEst, ge.EIP1559DynamicFees(), ge)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EIP1559DynamicFees()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEvmTxAttemptBuilder(*ethClient.ConfiguredChainID(), ge, ethKeyStore, feeEstimator)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewStuckTxDetector(lggr, testutils.FixtureChainID, "", assets.NewWei(assets.NewEth(100).ToInt()), config.EVM().Transactions().AutoPurge(), feeEstimator, txStore, ethClient)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewWei(assets.NewEth(100).ToInt())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEth(100)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ToInt()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Transactions()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.AutoPurge()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEvmConfirmer(txStore, txmgr.NewEvmTxmClient(ethClient, nil), txmgr.NewEvmTxmConfig(config.EVM()), txmgr.NewEvmTxmFeeConfig(ge), config.EVM().Transactions(), gconfig.Database(), ethKeyStore, txBuilder, lggr, stuckTxDetector)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEvmTxmClient(ethClient, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEvmTxmConfig(config.EVM())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEvmTxmFeeConfig(ge)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Transactions()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Database()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Start(ctx)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Start(ctx)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ProcessHead(ctx, &head)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Start(ctx)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.XXXTestCloseInternal()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("only finds eth_txes in unconfirmed state with at least one broadcast attempt", func(t *testing.T) { mustInsertFatalErrorEthTx(t, txStore, fromAddress) mustInsertInProgressEthTx(t, txStore, nonce, fromAddress) nonce++ cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, nonce, 1, fromAddress) nonce++ mustInsertUnconfirmedEthTxWithInsufficientEthAttempt(t, txStore, nonce, fromAddress) nonce++ mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, config.EVM().ChainID()) // Do the thing require.NoError(t, ec.CheckForReceipts(ctx, blockNum)) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, nonce, 1, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ChainID()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, nonce, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("fetches receipt for one unconfirmed eth_tx", func(t *testing.T) { ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil) // Transaction not confirmed yet, receipt is nil ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], hashAttempt1_1, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &evmtypes.Receipt{} }).Once() // Do the thing require.NoError(t, ec.CheckForReceipts(ctx, blockNum)) var err error etx1, err = txStore.FindTxWithAttempts(ctx, etx1.ID) assert.NoError(t, err) require.Len(t, etx1.TxAttempts, 1) attempt1_1 = etx1.TxAttempts[0] require.NoError(t, err) require.Len(t, attempt1_1.Receipts, 0) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(10)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], hashAttempt1_1, "eth_getTransactionReceipt") }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], hashAttempt1_1, "eth_getTransactionReceipt") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[0], hashAttempt1_1, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &evmtypes.Receipt{} })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx1.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("saves nothing if returned receipt does not match the attempt", func(t *testing.T) { txmReceipt := evmtypes.Receipt{ TxHash: testutils.NewHash(), BlockHash: testutils.NewHash(), BlockNumber: big.NewInt(42), TransactionIndex: uint(1), } ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil) // First transaction confirmed ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], hashAttempt1_1, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt }).Once() // No error because it is merely logged require.NoError(t, ec.CheckForReceipts(ctx, blockNum)) etx, err := txStore.FindTxWithAttempts(ctx, etx1.ID) require.NoError(t, err) require.Len(t, etx.TxAttempts, 1) require.Len(t, etx.TxAttempts[0].Receipts, 0) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewInt(42)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(10)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], hashAttempt1_1, "eth_getTransactionReceipt") }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], hashAttempt1_1, "eth_getTransactionReceipt") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[0], hashAttempt1_1, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx1.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("saves nothing if query returns error", func(t *testing.T) { txmReceipt := evmtypes.Receipt{ TxHash: attempt1_1.Hash, BlockHash: testutils.NewHash(), BlockNumber: big.NewInt(42), TransactionIndex: uint(1), } ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil) // First transaction confirmed ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], hashAttempt1_1, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt elems[0].Error = errors.New("foo") }).Once() // No error because it is merely logged require.NoError(t, ec.CheckForReceipts(ctx, blockNum)) etx, err := txStore.FindTxWithAttempts(ctx, etx1.ID) require.NoError(t, err) require.Len(t, etx.TxAttempts, 1) require.Len(t, etx.TxAttempts[0].Receipts, 0) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewInt(42)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(10)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], hashAttempt1_1, "eth_getTransactionReceipt") }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], hashAttempt1_1, "eth_getTransactionReceipt") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[0], hashAttempt1_1, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt elems[0].Error = errors.New("foo") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.New("foo")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx1.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, nonce, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("saves eth_receipt and marks eth_tx as confirmed when geth client returns valid receipt", func(t *testing.T) { txmReceipt := evmtypes.Receipt{ TxHash: attempt1_1.Hash, BlockHash: testutils.NewHash(), BlockNumber: big.NewInt(42), TransactionIndex: uint(1), Status: uint64(1), } ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil) ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && cltest.BatchElemMatchesParams(b[0], attempt1_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt2_1.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // First transaction confirmed *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt // Second transaction still unconfirmed elems[1].Result = &evmtypes.Receipt{} }).Once() // Do the thing require.NoError(t, ec.CheckForReceipts(ctx, blockNum)) // Check that the receipt was saved etx, err := txStore.FindTxWithAttempts(ctx, etx1.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxConfirmed, etx.State) assert.Len(t, etx.TxAttempts, 1) attempt1_1 = etx.TxAttempts[0] require.Len(t, attempt1_1.Receipts, 1) ethReceipt := attempt1_1.Receipts[0] assert.Equal(t, txmReceipt.TxHash, ethReceipt.GetTxHash()) assert.Equal(t, txmReceipt.BlockHash, ethReceipt.GetBlockHash()) assert.Equal(t, txmReceipt.BlockNumber.Int64(), ethReceipt.GetBlockNumber().Int64()) assert.Equal(t, txmReceipt.TransactionIndex, ethReceipt.GetTransactionIndex()) receiptJSON, err := json.Marshal(txmReceipt) require.NoError(t, err) j, err := json.Marshal(ethReceipt) require.NoError(t, err) assert.JSONEq(t, string(receiptJSON), string(j)) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewInt(42)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(10)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && cltest.BatchElemMatchesParams(b[0], attempt1_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt2_1.Hash, "eth_getTransactionReceipt") }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && cltest.BatchElemMatchesParams(b[0], attempt1_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt2_1.Hash, "eth_getTransactionReceipt") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[0], attempt1_1.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[1], attempt2_1.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // First transaction confirmed *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt // Second transaction still unconfirmed elems[1].Result = &evmtypes.Receipt{} })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx1.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Marshal(txmReceipt)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Marshal(ethReceipt)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("fetches and saves receipts for several attempts in gas price order", func(t *testing.T) { attempt2_2 := newBroadcastLegacyEthTxAttempt(t, etx2.ID) attempt2_2.TxFee = gas.EvmFee{Legacy: assets.NewWeiI(10)} attempt2_3 := newBroadcastLegacyEthTxAttempt(t, etx2.ID) attempt2_3.TxFee = gas.EvmFee{Legacy: assets.NewWeiI(20)} // Insert order deliberately reversed to test sorting by gas price require.NoError(t, txStore.InsertTxAttempt(ctx, &attempt2_3)) require.NoError(t, txStore.InsertTxAttempt(ctx, &attempt2_2)) txmReceipt := evmtypes.Receipt{ TxHash: attempt2_2.Hash, BlockHash: testutils.NewHash(), BlockNumber: big.NewInt(42), TransactionIndex: uint(1), Status: uint64(1), } ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil) ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 3 && cltest.BatchElemMatchesParams(b[2], attempt2_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt2_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[0], attempt2_3.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // Most expensive attempt still unconfirmed elems[2].Result = &evmtypes.Receipt{} // Second most expensive attempt is confirmed *(elems[1].Result.(*evmtypes.Receipt)) = txmReceipt // Cheapest attempt still unconfirmed elems[0].Result = &evmtypes.Receipt{} }).Once() // Do the thing require.NoError(t, ec.CheckForReceipts(ctx, blockNum)) // Check that the state was updated etx, err := txStore.FindTxWithAttempts(ctx, etx2.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxConfirmed, etx.State) require.Len(t, etx.TxAttempts, 3) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewWeiI(20)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewInt(42)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(10)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 3 && cltest.BatchElemMatchesParams(b[2], attempt2_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt2_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[0], attempt2_3.Hash, "eth_getTransactionReceipt") }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 3 && cltest.BatchElemMatchesParams(b[2], attempt2_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt2_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[0], attempt2_3.Hash, "eth_getTransactionReceipt") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[2], attempt2_1.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[1], attempt2_2.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[0], attempt2_3.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // Most expensive attempt still unconfirmed elems[2].Result = &evmtypes.Receipt{} // Second most expensive attempt is confirmed *(elems[1].Result.(*evmtypes.Receipt)) = txmReceipt // Cheapest attempt still unconfirmed elems[0].Result = &evmtypes.Receipt{} })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx2.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, nonce, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("ignores receipt missing BlockHash that comes from querying parity too early", func(t *testing.T) { ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil) receipt := evmtypes.Receipt{ TxHash: attempt3_1.Hash, Status: uint64(1), } ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempt3_1.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) *(elems[0].Result.(*evmtypes.Receipt)) = receipt }).Once() // Do the thing require.NoError(t, ec.CheckForReceipts(ctx, blockNum)) // No receipt, but no error either etx, err := txStore.FindTxWithAttempts(ctx, etx3.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx.State) assert.Len(t, etx.TxAttempts, 1) attempt3_1 = etx.TxAttempts[0] require.Len(t, attempt3_1.Receipts, 0) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(10)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempt3_1.Hash, "eth_getTransactionReceipt") }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempt3_1.Hash, "eth_getTransactionReceipt") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[0], attempt3_1.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) *(elems[0].Result.(*evmtypes.Receipt)) = receipt })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx3.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("does not panic if receipt has BlockHash but is missing some other fields somehow", func(t *testing.T) { // NOTE: This should never happen, but we shouldn't panic regardless receipt := evmtypes.Receipt{ TxHash: attempt3_1.Hash, BlockHash: testutils.NewHash(), Status: uint64(1), } ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempt3_1.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) *(elems[0].Result.(*evmtypes.Receipt)) = receipt }).Once() // Do the thing require.NoError(t, ec.CheckForReceipts(ctx, blockNum)) // No receipt, but no error either etx, err := txStore.FindTxWithAttempts(ctx, etx3.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx.State) assert.Len(t, etx.TxAttempts, 1) attempt3_1 = etx.TxAttempts[0] require.Len(t, attempt3_1.Receipts, 0) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempt3_1.Hash, "eth_getTransactionReceipt") }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempt3_1.Hash, "eth_getTransactionReceipt") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[0], attempt3_1.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) *(elems[0].Result.(*evmtypes.Receipt)) = receipt })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx3.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("handles case where eth_receipt already exists somehow", func(t *testing.T) { ethReceipt := mustInsertEthReceipt(t, txStore, 42, testutils.NewHash(), attempt3_1.Hash) txmReceipt := evmtypes.Receipt{ TxHash: attempt3_1.Hash, BlockHash: ethReceipt.BlockHash, BlockNumber: big.NewInt(ethReceipt.BlockNumber), TransactionIndex: ethReceipt.TransactionIndex, Status: uint64(1), } ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil) ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempt3_1.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt }).Once() // Do the thing require.NoError(t, ec.CheckForReceipts(ctx, blockNum)) // Check that the receipt was unchanged etx, err := txStore.FindTxWithAttempts(ctx, etx3.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxConfirmed, etx.State) assert.Len(t, etx.TxAttempts, 1) attempt3_1 = etx.TxAttempts[0] require.Len(t, attempt3_1.Receipts, 1) ethReceipt3_1 := attempt3_1.Receipts[0] assert.Equal(t, txmReceipt.TxHash, ethReceipt3_1.GetTxHash()) assert.Equal(t, txmReceipt.BlockHash, ethReceipt3_1.GetBlockHash()) assert.Equal(t, txmReceipt.BlockNumber.Int64(), ethReceipt3_1.GetBlockNumber().Int64()) assert.Equal(t, txmReceipt.TransactionIndex, ethReceipt3_1.GetTransactionIndex()) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewInt(ethReceipt.BlockNumber)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(10)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempt3_1.Hash, "eth_getTransactionReceipt") }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempt3_1.Hash, "eth_getTransactionReceipt") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[0], attempt3_1.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx3.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, nonce, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("on receipt fetch marks in_progress eth_tx_attempt as broadcast", func(t *testing.T) { attempt4_2 := newInProgressLegacyEthTxAttempt(t, etx4.ID) attempt4_2.TxFee = gas.EvmFee{Legacy: assets.NewWeiI(10)} require.NoError(t, txStore.InsertTxAttempt(ctx, &attempt4_2)) txmReceipt := evmtypes.Receipt{ TxHash: attempt4_2.Hash, BlockHash: testutils.NewHash(), BlockNumber: big.NewInt(42), TransactionIndex: uint(1), Status: uint64(1), } ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil) // Second attempt is confirmed ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && cltest.BatchElemMatchesParams(b[0], attempt4_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt4_1.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // First attempt still unconfirmed elems[1].Result = &evmtypes.Receipt{} // Second attempt is confirmed *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt }).Once() // Do the thing require.NoError(t, ec.CheckForReceipts(ctx, blockNum)) // Check that the state was updated var err error etx4, err = txStore.FindTxWithAttempts(ctx, etx4.ID) require.NoError(t, err) attempt4_1 = etx4.TxAttempts[1] attempt4_2 = etx4.TxAttempts[0] // And the attempts require.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt4_1.State) require.Nil(t, attempt4_1.BroadcastBeforeBlockNum) require.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt4_2.State) require.Equal(t, int64(42), *attempt4_2.BroadcastBeforeBlockNum) // Check receipts require.Len(t, attempt4_1.Receipts, 0) require.Len(t, attempt4_2.Receipts, 1) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewInt(42)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(10)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && cltest.BatchElemMatchesParams(b[0], attempt4_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt4_1.Hash, "eth_getTransactionReceipt") }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && cltest.BatchElemMatchesParams(b[0], attempt4_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt4_1.Hash, "eth_getTransactionReceipt") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[0], attempt4_2.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[1], attempt4_1.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // First attempt still unconfirmed elems[1].Result = &evmtypes.Receipt{} // Second attempt is confirmed *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx4.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, nonce, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewInt(42)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(10)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempt5_1.Hash, "eth_getTransactionReceipt") }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempt5_1.Hash, "eth_getTransactionReceipt") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[0], attempt5_1.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // First attempt still unconfirmed *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ABIEncode(`[{"type":"uint256"}]`, big.NewInt(10))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewInt(10)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Keccak256Fixed([]byte(`MyError(uint256)`))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("CallContract", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil, &client.JsonError{ Code: 1, Message: "reverted", Data: utils.ConcatBytes(sig[:4], data), })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ConcatBytes(sig[:4], data)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx5.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].RPCDefaultBatchSize = ptr[uint32](2) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTx(t, txStore, 0, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(10)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && cltest.BatchElemMatchesParams(b[0], attempts[4].Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempts[3].Hash, "eth_getTransactionReceipt") }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && cltest.BatchElemMatchesParams(b[0], attempts[4].Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempts[3].Hash, "eth_getTransactionReceipt") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[0], attempts[4].Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[1], attempts[3].Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &evmtypes.Receipt{} elems[1].Result = &evmtypes.Receipt{} })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && cltest.BatchElemMatchesParams(b[0], attempts[2].Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempts[1].Hash, "eth_getTransactionReceipt") }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && cltest.BatchElemMatchesParams(b[0], attempts[2].Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempts[1].Hash, "eth_getTransactionReceipt") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[0], attempts[2].Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[1], attempts[1].Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &evmtypes.Receipt{} elems[1].Result = &evmtypes.Receipt{} })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempts[0].Hash, "eth_getTransactionReceipt") }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempts[0].Hash, "eth_getTransactionReceipt") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[0], attempts[0].Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &evmtypes.Receipt{} })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.CheckForReceipts(ctx, 42)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].RPCDefaultBatchSize = ptr[uint32](1) c.EVM[0].Transactions.ForwardersEnabled = ptr(true) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTx(t, txStore, 0, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewInt(42)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(10)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempt.Hash, "eth_getTransactionReceipt") }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempt.Hash, "eth_getTransactionReceipt") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[0], attempt.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt // confirmed })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].RPCDefaultBatchSize = ptr[uint32](6) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTx(t, txStore, 1, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTx(t, txStore, 0, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(evmtypes.Nonce(0), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(0)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 4 }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 4 })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) captured = append(captured, elems...) elems[0].Result = &evmtypes.Receipt{} elems[1].Result = &evmtypes.Receipt{} elems[2].Result = &evmtypes.Receipt{} elems[3].Result = &evmtypes.Receipt{} })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMustMatchParams(t, captured[0], attempts[0].Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMustMatchParams(t, captured[1], attempts[1].Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMustMatchParams(t, captured[2], attempts[2].Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTx(t, txStore, 1, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(evmtypes.Nonce(0), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(0)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.CheckForReceipts(ctx, 42)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTestGeneralConfig(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(evmtypes.Nonce(20), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(20)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTx(t, txStore, 0, fromAddress1_1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTx(t, txStore, 1, fromAddress1_1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTx(t, txStore, 3, fromAddress1_2)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTx(t, txStore, 8, fromAddress2_1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustExec(t, db, `UPDATE evm.txes SET state='confirmed' WHERE id = $1`, etx_other_chain.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempt2_9.Hash, "eth_getTransactionReceipt") }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempt2_9.Hash, "eth_getTransactionReceipt") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[0], attempt2_9.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt2_9 })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempt1_1.Hash, "eth_getTransactionReceipt") }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempt1_1.Hash, "eth_getTransactionReceipt") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[0], attempt1_1.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt1_1 })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].FinalityDepth = ptr[uint32](50) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTx(t, txStore, 0, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTx(t, txStore, 1, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTx(t, txStore, 2, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTx(t, txStore, 3, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustExec(t, db, `UPDATE evm.tx_attempts SET broadcast_before_block_num = 41 WHERE broadcast_before_block_num IS NULL`)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("marks buried eth_txes as 'confirmed_missing_receipt'", func(t *testing.T) { txmReceipt0 := evmtypes.Receipt{ TxHash: attempt0_2.Hash, BlockHash: testutils.NewHash(), BlockNumber: big.NewInt(42), TransactionIndex: uint(1), Status: uint64(1), } txmReceipt3 := evmtypes.Receipt{ TxHash: attempt3_1.Hash, BlockHash: testutils.NewHash(), BlockNumber: big.NewInt(42), TransactionIndex: uint(1), Status: uint64(1), } ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(4), nil) ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 6 && cltest.BatchElemMatchesParams(b[0], attempt0_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt0_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[2], attempt1_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[3], attempt1_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[4], attempt2_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[5], attempt3_1.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // First transaction confirmed *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt0 elems[1].Result = &evmtypes.Receipt{} // Second transaction stil unconfirmed elems[2].Result = &evmtypes.Receipt{} elems[3].Result = &evmtypes.Receipt{} // Third transaction still unconfirmed elems[4].Result = &evmtypes.Receipt{} // Fourth transaction is confirmed *(elems[5].Result.(*evmtypes.Receipt)) = txmReceipt3 }).Once() // PERFORM // Block num of 43 is one higher than the receipt (as would generally be expected) require.NoError(t, ec.CheckForReceipts(ctx, 43)) // Expected state is that the "top" eth_tx is now confirmed, with the // two below it "confirmed_missing_receipt" and the "bottom" eth_tx also confirmed var err error etx3, err = txStore.FindTxWithAttempts(ctx, etx3.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxConfirmed, etx3.State) ethReceipt := etx3.TxAttempts[0].Receipts[0] require.Equal(t, txmReceipt3.BlockHash, ethReceipt.GetBlockHash()) etx2, err = txStore.FindTxWithAttempts(ctx, etx2.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxConfirmedMissingReceipt, etx2.State) etx1, err = txStore.FindTxWithAttempts(ctx, etx1.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxConfirmedMissingReceipt, etx1.State) etx0, err = txStore.FindTxWithAttempts(ctx, etx0.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxConfirmed, etx0.State) require.Len(t, etx0.TxAttempts, 2) require.Len(t, etx0.TxAttempts[0].Receipts, 1) ethReceipt = etx0.TxAttempts[0].Receipts[0] require.Equal(t, txmReceipt0.BlockHash, ethReceipt.GetBlockHash()) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewInt(42)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewInt(42)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(evmtypes.Nonce(4), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(4)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 6 && cltest.BatchElemMatchesParams(b[0], attempt0_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt0_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[2], attempt1_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[3], attempt1_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[4], attempt2_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[5], attempt3_1.Hash, "eth_getTransactionReceipt") }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 6 && cltest.BatchElemMatchesParams(b[0], attempt0_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt0_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[2], attempt1_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[3], attempt1_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[4], attempt2_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[5], attempt3_1.Hash, "eth_getTransactionReceipt") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[0], attempt0_2.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[1], attempt0_1.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[2], attempt1_2.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[3], attempt1_1.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[4], attempt2_1.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[5], attempt3_1.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // First transaction confirmed *(elems[0].Result.(*evmtypes.Receipt)) = txmReceipt0 elems[1].Result = &evmtypes.Receipt{} // Second transaction stil unconfirmed elems[2].Result = &evmtypes.Receipt{} elems[3].Result = &evmtypes.Receipt{} // Third transaction still unconfirmed elems[4].Result = &evmtypes.Receipt{} // Fourth transaction is confirmed *(elems[5].Result.(*evmtypes.Receipt)) = txmReceipt3 })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx3.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx2.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx1.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx0.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("marks eth_txes with state 'confirmed_missing_receipt' as 'confirmed' if a receipt finally shows up", func(t *testing.T) { txmReceipt := evmtypes.Receipt{ TxHash: attempt2_1.Hash, BlockHash: testutils.NewHash(), BlockNumber: big.NewInt(43), TransactionIndex: uint(1), Status: uint64(1), } ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil) ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 3 && cltest.BatchElemMatchesParams(b[0], attempt1_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt1_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[2], attempt2_1.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // First transaction still unconfirmed elems[0].Result = &evmtypes.Receipt{} elems[1].Result = &evmtypes.Receipt{} // Second transaction confirmed *(elems[2].Result.(*evmtypes.Receipt)) = txmReceipt }).Once() // PERFORM // Block num of 44 is one higher than the receipt (as would generally be expected) require.NoError(t, ec.CheckForReceipts(ctx, 44)) // Expected state is that the "top" two eth_txes are now confirmed, with the // one below it still "confirmed_missing_receipt" and the bottom one remains confirmed var err error etx3, err = txStore.FindTxWithAttempts(ctx, etx3.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxConfirmed, etx3.State) etx2, err = txStore.FindTxWithAttempts(ctx, etx2.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxConfirmed, etx2.State) ethReceipt := etx2.TxAttempts[0].Receipts[0] require.Equal(t, txmReceipt.BlockHash, ethReceipt.GetBlockHash()) etx1, err = txStore.FindTxWithAttempts(ctx, etx1.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxConfirmedMissingReceipt, etx1.State) etx0, err = txStore.FindTxWithAttempts(ctx, etx0.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxConfirmed, etx0.State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewInt(43)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(10)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 3 && cltest.BatchElemMatchesParams(b[0], attempt1_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt1_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[2], attempt2_1.Hash, "eth_getTransactionReceipt") }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 3 && cltest.BatchElemMatchesParams(b[0], attempt1_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt1_1.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[2], attempt2_1.Hash, "eth_getTransactionReceipt") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[0], attempt1_2.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[1], attempt1_1.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[2], attempt2_1.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // First transaction still unconfirmed elems[0].Result = &evmtypes.Receipt{} elems[1].Result = &evmtypes.Receipt{} // Second transaction confirmed *(elems[2].Result.(*evmtypes.Receipt)) = txmReceipt })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx3.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx2.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx1.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx0.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("continues to leave eth_txes with state 'confirmed_missing_receipt' unchanged if at least one attempt is above EVM.FinalityDepth", func(t *testing.T) { ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(10), nil) ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && cltest.BatchElemMatchesParams(b[0], attempt1_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt1_1.Hash, "eth_getTransactionReceipt") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // Both attempts still unconfirmed elems[0].Result = &evmtypes.Receipt{} elems[1].Result = &evmtypes.Receipt{} }).Once() // PERFORM // Block num of 80 puts the first attempt (21) below threshold but second attempt (41) still above require.NoError(t, ec.CheckForReceipts(ctx, 80)) // Expected state is that the "top" two eth_txes are now confirmed, with the // one below it still "confirmed_missing_receipt" and the bottom one remains confirmed var err error etx3, err = txStore.FindTxWithAttempts(ctx, etx3.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxConfirmed, etx3.State) etx2, err = txStore.FindTxWithAttempts(ctx, etx2.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxConfirmed, etx2.State) etx1, err = txStore.FindTxWithAttempts(ctx, etx1.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxConfirmedMissingReceipt, etx1.State) etx0, err = txStore.FindTxWithAttempts(ctx, etx0.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxConfirmed, etx0.State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(10)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && cltest.BatchElemMatchesParams(b[0], attempt1_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt1_1.Hash, "eth_getTransactionReceipt") }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && cltest.BatchElemMatchesParams(b[0], attempt1_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt1_1.Hash, "eth_getTransactionReceipt") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[0], attempt1_2.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[1], attempt1_1.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // Both attempts still unconfirmed elems[0].Result = &evmtypes.Receipt{} elems[1].Result = &evmtypes.Receipt{} })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx3.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx2.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx1.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx0.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(evmtypes.Nonce(10), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(10)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && cltest.BatchElemMatchesParams(b[0], attempt1_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt1_1.Hash, "eth_getTransactionReceipt") }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && cltest.BatchElemMatchesParams(b[0], attempt1_2.Hash, "eth_getTransactionReceipt") && cltest.BatchElemMatchesParams(b[1], attempt1_1.Hash, "eth_getTransactionReceipt") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[0], attempt1_2.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[1], attempt1_1.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // Both attempts still unconfirmed elems[0].Result = &evmtypes.Receipt{} elems[1].Result = &evmtypes.Receipt{} })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx3.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx2.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx1.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx0.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].FinalityDepth = ptr[uint32](50) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("IsL2")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(false)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Maybe()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Unix(1616509100, 0)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BatchCallContextAll", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 4 && cltest.BatchElemMatchesParams(b[0], hexutil.Encode(attempt0_2.SignedRawTx), "eth_sendRawTransaction") && cltest.BatchElemMatchesParams(b[1], hexutil.Encode(attempt1_2.SignedRawTx), "eth_sendRawTransaction") && cltest.BatchElemMatchesParams(b[2], hexutil.Encode(attempt2_1.SignedRawTx), "eth_sendRawTransaction") && cltest.BatchElemMatchesParams(b[3], hexutil.Encode(attempt3_1.SignedRawTx), "eth_sendRawTransaction") }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 4 && cltest.BatchElemMatchesParams(b[0], hexutil.Encode(attempt0_2.SignedRawTx), "eth_sendRawTransaction") && cltest.BatchElemMatchesParams(b[1], hexutil.Encode(attempt1_2.SignedRawTx), "eth_sendRawTransaction") && cltest.BatchElemMatchesParams(b[2], hexutil.Encode(attempt2_1.SignedRawTx), "eth_sendRawTransaction") && cltest.BatchElemMatchesParams(b[3], hexutil.Encode(attempt3_1.SignedRawTx), "eth_sendRawTransaction") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[0], hexutil.Encode(attempt0_2.SignedRawTx), "eth_sendRawTransaction")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Encode(attempt0_2.SignedRawTx)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[1], hexutil.Encode(attempt1_2.SignedRawTx), "eth_sendRawTransaction")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Encode(attempt1_2.SignedRawTx)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[2], hexutil.Encode(attempt2_1.SignedRawTx), "eth_sendRawTransaction")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Encode(attempt2_1.SignedRawTx)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[3], hexutil.Encode(attempt3_1.SignedRawTx), "eth_sendRawTransaction")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Encode(attempt3_1.SignedRawTx)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // First transaction confirmed elems[0].Error = errors.New("nonce too low") elems[1].Error = errors.New("transaction underpriced") elems[2].Error = nil elems[3].Error = errors.New("transaction already finalized") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.New("nonce too low")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.New("transaction underpriced")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.New("transaction already finalized")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx0.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx1.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx2.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx3.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BroadcastAt.Unix()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Unix()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].FinalityDepth = ptr[uint32](50) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("IsL2")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(false)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Maybe()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Unix(1616509100, 0)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BatchCallContextAll", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 3 && cltest.BatchElemMatchesParams(b[0], hexutil.Encode(attempt0_2.SignedRawTx), "eth_sendRawTransaction") && cltest.BatchElemMatchesParams(b[1], hexutil.Encode(attempt1_2.SignedRawTx), "eth_sendRawTransaction") && cltest.BatchElemMatchesParams(b[2], hexutil.Encode(attempt2_1.SignedRawTx), "eth_sendRawTransaction") }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 3 && cltest.BatchElemMatchesParams(b[0], hexutil.Encode(attempt0_2.SignedRawTx), "eth_sendRawTransaction") && cltest.BatchElemMatchesParams(b[1], hexutil.Encode(attempt1_2.SignedRawTx), "eth_sendRawTransaction") && cltest.BatchElemMatchesParams(b[2], hexutil.Encode(attempt2_1.SignedRawTx), "eth_sendRawTransaction") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[0], hexutil.Encode(attempt0_2.SignedRawTx), "eth_sendRawTransaction")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Encode(attempt0_2.SignedRawTx)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[1], hexutil.Encode(attempt1_2.SignedRawTx), "eth_sendRawTransaction")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Encode(attempt1_2.SignedRawTx)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[2], hexutil.Encode(attempt2_1.SignedRawTx), "eth_sendRawTransaction")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Encode(attempt2_1.SignedRawTx)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(errors.New("Timed out"))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.New("Timed out")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx0.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx1.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx2.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BroadcastAt.Unix()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Unix()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].FinalityDepth = ptr[uint32](50) c.EVM[0].RPCDefaultBatchSize = ptr[uint32](1) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("IsL2")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(false)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Maybe()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Unix(1616509100, 0)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BatchCallContextAll", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], hexutil.Encode(attempt0_2.SignedRawTx), "eth_sendRawTransaction") }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], hexutil.Encode(attempt0_2.SignedRawTx), "eth_sendRawTransaction") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[0], hexutil.Encode(attempt0_2.SignedRawTx), "eth_sendRawTransaction")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Encode(attempt0_2.SignedRawTx)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // First transaction confirmed elems[0].Error = errors.New("nonce too low") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.New("nonce too low")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BatchCallContextAll", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], hexutil.Encode(attempt1_2.SignedRawTx), "eth_sendRawTransaction") }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], hexutil.Encode(attempt1_2.SignedRawTx), "eth_sendRawTransaction") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[0], hexutil.Encode(attempt1_2.SignedRawTx), "eth_sendRawTransaction")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Encode(attempt1_2.SignedRawTx)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(errors.New("Timed out"))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.New("Timed out")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx0.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx1.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx2.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BroadcastAt.Unix()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Unix()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTestGeneralConfig(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("returns nothing when there are no transactions", func(t *testing.T) { etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID) require.NoError(t, err) assert.Len(t, etxs, 0) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("returns nothing when the transaction is in_progress", func(t *testing.T) { etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID) require.NoError(t, err) assert.Len(t, etxs, 0) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, nonce, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("ignores unconfirmed transactions with nil BroadcastBeforeBlockNum", func(t *testing.T) { etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID) require.NoError(t, err) assert.Len(t, etxs, 0) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, nonce, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FromTxAttempt(&attempt1_1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewWeiI(30000)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("returns nothing when the transaction is unconfirmed with an attempt that is recent", func(t *testing.T) { etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID) require.NoError(t, err) assert.Len(t, etxs, 0) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, nonce, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FromTxAttempt(&attempt2_1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("returns nothing when the transaction has attempts that are too new", func(t *testing.T) { etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID) require.NoError(t, err) assert.Len(t, etxs, 0) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthTx(fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(nonce)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Now()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("does nothing if the transaction is from a different address than the one given", func(t *testing.T) { etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmOtherAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID) require.NoError(t, err) assert.Len(t, etxs, 0) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmOtherAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("returns the transaction if it is unconfirmed and has no attempts (note that this is an invariant violation, but we handle it anyway)", func(t *testing.T) { etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID) require.NoError(t, err) require.Len(t, etxs, 1) assert.Equal(t, etxWithoutAttempts.ID, etxs[0].ID) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("returns nothing for different chain id", func(t *testing.T) { etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, big.NewInt(42)) require.NoError(t, err) require.Len(t, etxs, 0) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, big.NewInt(42))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewInt(42)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, nonce, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FromTxAttempt(&attempt3_1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 0, otherAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FromTxAttempt(&attemptOther1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("returns the transaction if it is unconfirmed with an attempt that is older than gasBumpThreshold blocks", func(t *testing.T) { etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID) require.NoError(t, err) require.Len(t, etxs, 2) assert.Equal(t, etxWithoutAttempts.ID, etxs[0].ID) assert.Equal(t, etx3.ID, etxs[1].ID) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("returns nothing if threshold is zero", func(t *testing.T) { etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, 0, 10, 0, &cltest.FixtureChainID) require.NoError(t, err) require.Len(t, etxs, 0) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, 0, 10, 0, &cltest.FixtureChainID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("does not return more transactions for gas bumping than gasBumpThreshold", func(t *testing.T) { // Unconfirmed txes in DB are: // (unnamed) (nonce 2) // etx1 (nonce 3) // etx2 (nonce 4) // etxWithoutAttempts (nonce 5) // etx3 (nonce 6) - ready for bump // etx4 (nonce 7) - ready for bump etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 4, 0, &cltest.FixtureChainID) require.NoError(t, err) require.Len(t, etxs, 1) // returns etxWithoutAttempts only - eligible for gas bumping because it technically doesn't have any attempts within gasBumpThreshold blocks assert.Equal(t, etxWithoutAttempts.ID, etxs[0].ID) etxs, err = ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 5, 0, &cltest.FixtureChainID) require.NoError(t, err) require.Len(t, etxs, 2) // includes etxWithoutAttempts, etx3 and etx4 assert.Equal(t, etxWithoutAttempts.ID, etxs[0].ID) assert.Equal(t, etx3.ID, etxs[1].ID) // Zero limit disables it etxs, err = ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 0, 0, &cltest.FixtureChainID) require.NoError(t, err) require.Len(t, etxs, 2) // includes etxWithoutAttempts, etx3 and etx4 })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 4, 0, &cltest.FixtureChainID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 5, 0, &cltest.FixtureChainID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 0, 0, &cltest.FixtureChainID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, nonce, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FromTxAttempt(&attempt4_1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("ignores pending transactions for another key", func(t *testing.T) { // Re-use etx3 nonce for another key, it should not affect the results for this key etxOther := cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, (*etx3.Sequence).Int64(), otherAddress) aOther := etxOther.TxAttempts[0] dbAttempt = txmgr.DbEthTxAttempt{} dbAttempt.FromTxAttempt(&aOther) require.NoError(t, db.Get(&dbAttempt, `UPDATE evm.tx_attempts SET broadcast_before_block_num=$1 WHERE id=$2 RETURNING *`, oldEnough, aOther.ID)) etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 6, 0, &cltest.FixtureChainID) require.NoError(t, err) require.Len(t, etxs, 3) // includes etxWithoutAttempts, etx3 and etx4 assert.Equal(t, etxWithoutAttempts.ID, etxs[0].ID) assert.Equal(t, etx3.ID, etxs[1].ID) assert.Equal(t, etx4.ID, etxs[2].ID) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, (*etx3.Sequence).Int64(), otherAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Int64()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FromTxAttempt(&aOther)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 6, 0, &cltest.FixtureChainID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewWeiI(30000)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("returns the transaction if it is unconfirmed with two attempts that are older than gasBumpThreshold blocks", func(t *testing.T) { etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID) require.NoError(t, err) require.Len(t, etxs, 3) assert.Equal(t, etxWithoutAttempts.ID, etxs[0].ID) assert.Equal(t, etx3.ID, etxs[1].ID) assert.Equal(t, etx4.ID, etxs[2].ID) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewWeiI(40000)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("does not return the transaction if it has some older but one newer attempt", func(t *testing.T) { etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID) require.NoError(t, err) require.Len(t, etxs, 2) assert.Equal(t, etxWithoutAttempts.ID, etxs[0].ID) assert.Equal(t, *etxWithoutAttempts.Sequence, *(etxs[0].Sequence)) require.Equal(t, evmtypes.Nonce(5), *etxWithoutAttempts.Sequence) assert.Equal(t, etx4.ID, etxs[1].ID) assert.Equal(t, *etx4.Sequence, *(etxs[1].Sequence)) require.Equal(t, evmtypes.Nonce(7), *etx4.Sequence) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewLegacyEthTxAttempt(t, etx4.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewWeiI(40000)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewWeiI(30001)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("returns unique attempts requiring resubmission due to insufficient eth, ordered by nonce asc", func(t *testing.T) { etxs, err := ec.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID) require.NoError(t, err) require.Len(t, etxs, 4) assert.Equal(t, etxWithoutAttempts.ID, etxs[0].ID) assert.Equal(t, *etxWithoutAttempts.Sequence, *(etxs[0].Sequence)) assert.Equal(t, etx4.ID, etxs[1].ID) assert.Equal(t, *etx4.Sequence, *(etxs[1].Sequence)) assert.Equal(t, etx5.ID, etxs[2].ID) assert.Equal(t, *etx5.Sequence, *(etxs[2].Sequence)) assert.Equal(t, etx6.ID, etxs[3].ID) assert.Equal(t, *etx6.Sequence, *(etxs[3].Sequence)) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 0, &cltest.FixtureChainID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxsRequiringRebroadcast(tests.Context(t), lggr, evmFromAddress, currentHead, gasBumpThreshold, 10, 2, &cltest.FixtureChainID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("should retry previous attempt if connectivity check failed for legacy transactions", func(t *testing.T) { cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(false) c.EVM[0].GasEstimator.BlockHistory.BlockHistorySize = ptr[uint16](2) c.EVM[0].GasEstimator.BlockHistory.CheckInclusionBlocks = ptr[uint16](4) }) ccfg := evmtest.NewChainScopedConfig(t, cfg) ctx := tests.Context(t) txStore := cltest.NewTestTxStore(t, db) ethKeyStore := cltest.NewKeyStore(t, db).Eth() _, fromAddress := cltest.MustInsertRandomKeyReturningState(t, ethKeyStore) kst := ksmocks.NewEth(t) estimator := gasmocks.NewEvmEstimator(t) newEst := func(logger.Logger) gas.EvmEstimator { return estimator } estimator.On("BumpLegacyGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, uint64(0), pkgerrors.Wrapf(commonfee.ErrConnectivity, "transaction...")) ge := ccfg.EVM().GasEstimator() feeEstimator := gas.NewEvmFeeEstimator(lggr, newEst, ge.EIP1559DynamicFees(), ge) txBuilder := txmgr.NewEvmTxAttemptBuilder(*ethClient.ConfiguredChainID(), ge, kst, feeEstimator) addresses := []gethCommon.Address{fromAddress} kst.On("EnabledAddressesForChain", mock.Anything, &cltest.FixtureChainID).Return(addresses, nil).Maybe() stuckTxDetector := txmgr.NewStuckTxDetector(lggr, testutils.FixtureChainID, "", assets.NewWei(assets.NewEth(100).ToInt()), ccfg.EVM().Transactions().AutoPurge(), feeEstimator, txStore, ethClient) // Create confirmer with necessary state ec := txmgr.NewEvmConfirmer(txStore, txmgr.NewEvmTxmClient(ethClient, nil), ccfg.EVM(), txmgr.NewEvmTxmFeeConfig(ccfg.EVM().GasEstimator()), ccfg.EVM().Transactions(), cfg.Database(), kst, txBuilder, lggr, stuckTxDetector) servicetest.Run(t, ec) currentHead := int64(30) oldEnough := int64(15) nonce := int64(0) originalBroadcastAt := time.Unix(1616509100, 0) etx := cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, nonce, fromAddress, originalBroadcastAt) attempt1 := etx.TxAttempts[0] var dbAttempt txmgr.DbEthTxAttempt dbAttempt.FromTxAttempt(&attempt1) require.NoError(t, db.Get(&dbAttempt, `UPDATE evm.tx_attempts SET broadcast_before_block_num=$1 WHERE id=$2 RETURNING *`, oldEnough, attempt1.ID)) // Send transaction and assume success. ethClient.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress).Return(commonclient.Successful, nil).Once() err := ec.RebroadcastWhereNecessary(tests.Context(t), currentHead) require.NoError(t, err) etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) require.Len(t, etx.TxAttempts, 1) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(false) c.EVM[0].GasEstimator.BlockHistory.BlockHistorySize = ptr[uint16](2) c.EVM[0].GasEstimator.BlockHistory.CheckInclusionBlocks = ptr[uint16](4) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEth(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEvmEstimator(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BumpLegacyGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil, uint64(0), pkgerrors.Wrapf(commonfee.ErrConnectivity, "transaction..."))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Wrapf(commonfee.ErrConnectivity, "transaction...")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEvmFeeEstimator(lggr, newEst, ge.EIP1559DynamicFees(), ge)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EIP1559DynamicFees()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEvmTxAttemptBuilder(*ethClient.ConfiguredChainID(), ge, kst, feeEstimator)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("EnabledAddressesForChain", mock.Anything, &cltest.FixtureChainID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(addresses, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Maybe()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewStuckTxDetector(lggr, testutils.FixtureChainID, "", assets.NewWei(assets.NewEth(100).ToInt()), ccfg.EVM().Transactions().AutoPurge(), feeEstimator, txStore, ethClient)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewWei(assets.NewEth(100).ToInt())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEth(100)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ToInt()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Transactions()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.AutoPurge()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEvmConfirmer(txStore, txmgr.NewEvmTxmClient(ethClient, nil), ccfg.EVM(), txmgr.NewEvmTxmFeeConfig(ccfg.EVM().GasEstimator()), ccfg.EVM().Transactions(), cfg.Database(), kst, txBuilder, lggr, stuckTxDetector)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEvmTxmClient(ethClient, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEvmTxmFeeConfig(ccfg.EVM().GasEstimator())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Transactions()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Database()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(t, ec)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Unix(1616509100, 0)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, nonce, fromAddress, originalBroadcastAt)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FromTxAttempt(&attempt1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.RebroadcastWhereNecessary(tests.Context(t), currentHead)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(true) c.EVM[0].GasEstimator.BlockHistory.BlockHistorySize = ptr[uint16](2) c.EVM[0].GasEstimator.BlockHistory.CheckInclusionBlocks = ptr[uint16](4) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEth(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEvmEstimator(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BumpDynamicFee", mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(gas.DynamicFee{}, pkgerrors.Wrapf(commonfee.ErrConnectivity, "transaction..."))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Wrapf(commonfee.ErrConnectivity, "transaction...")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEvmFeeEstimator(lggr, newEst, ge.EIP1559DynamicFees(), ge)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EIP1559DynamicFees()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEvmTxAttemptBuilder(*ethClient.ConfiguredChainID(), ge, kst, feeEstimator)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("EnabledAddressesForChain", mock.Anything, &cltest.FixtureChainID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(addresses, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Maybe()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewStuckTxDetector(lggr, testutils.FixtureChainID, "", assets.NewWei(assets.NewEth(100).ToInt()), ccfg.EVM().Transactions().AutoPurge(), feeEstimator, txStore, ethClient)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewWei(assets.NewEth(100).ToInt())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEth(100)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ToInt()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Transactions()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.AutoPurge()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEvmConfirmer(txStore, txmgr.NewEvmTxmClient(ethClient, nil), ccfg.EVM(), txmgr.NewEvmTxmFeeConfig(ccfg.EVM().GasEstimator()), ccfg.EVM().Transactions(), cfg.Database(), kst, txBuilder, lggr, stuckTxDetector)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEvmTxmClient(ethClient, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEvmTxmFeeConfig(ccfg.EVM().GasEstimator())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Transactions()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Database()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(t, ec)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Unix(1616509100, 0)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FromTxAttempt(&attempt1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.RebroadcastWhereNecessary(tests.Context(t), currentHead)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.PriceMax = assets.GWei(500) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GWei(500)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEth(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("EnabledAddressesForChain", mock.Anything, &cltest.FixtureChainID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(addresses, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Maybe()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Unix(1616509100, 0)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, nonce, fromAddress, originalBroadcastAt)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTx(&types.LegacyTx{})` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if tx.Nonce() != uint64(*etx.Sequence) { return false } ethTx = *tx return true }), mock.MatchedBy(func(chainID *big.Int) bool { return chainID.Cmp(evmcfg.EVM().ChainID()) == 0 }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { if tx.Nonce() != uint64(*etx.Sequence) { return false } ethTx = *tx return true })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(chainID *big.Int) bool { return chainID.Cmp(evmcfg.EVM().ChainID()) == 0 })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(evmcfg.EVM().ChainID())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ChainID()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(ðTx, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx.Sequence) && tx.GasPrice().Int64() == int64(20000000000) }), fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx.Sequence) && tx.GasPrice().Int64() == int64(20000000000) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Int64()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.ExceedsMaxFee, errors.New("tx fee (1.10 ether) exceeds the configured cap (1.00 ether)"))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.New("tx fee (1.10 ether) exceeds the configured cap (1.00 ether)")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.PriceMax = assets.GWei(500) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GWei(500)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEth(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("EnabledAddressesForChain", mock.Anything, &cltest.FixtureChainID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(addresses, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Maybe()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("does nothing if no transactions require bumping", func(t *testing.T) { require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Unix(1616509100, 0)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, nonce, fromAddress, originalBroadcastAt)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("re-sends previous transaction on keystore error", func(t *testing.T) { // simulate bumped transaction that is somehow impossible to sign kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx.Sequence) }), mock.Anything).Return(nil, errors.New("signing error")).Once() // Do the thing err := ec.RebroadcastWhereNecessary(tests.Context(t), currentHead) require.Error(t, err) require.Contains(t, err.Error(), "signing error") etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) require.Equal(t, txmgrcommon.TxUnconfirmed, etx.State) require.Len(t, etx.TxAttempts, 1) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx.Sequence) }), mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx.Sequence) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil, errors.New("signing error"))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.New("signing error")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.RebroadcastWhereNecessary(tests.Context(t), currentHead)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("does nothing and continues on fatal error", func(t *testing.T) { ethTx := *types.NewTx(&types.LegacyTx{}) kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if tx.Nonce() != uint64(*etx.Sequence) { return false } ethTx = *tx return true }), mock.MatchedBy(func(chainID *big.Int) bool { return chainID.Cmp(evmcfg.EVM().ChainID()) == 0 })).Return(ðTx, nil).Once() ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx.Sequence) }), fromAddress).Return(commonclient.Fatal, errors.New("exceeds block gas limit")).Once() // Do the thing require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) var err error etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) require.Len(t, etx.TxAttempts, 1) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTx(&types.LegacyTx{})` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if tx.Nonce() != uint64(*etx.Sequence) { return false } ethTx = *tx return true }), mock.MatchedBy(func(chainID *big.Int) bool { return chainID.Cmp(evmcfg.EVM().ChainID()) == 0 }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { if tx.Nonce() != uint64(*etx.Sequence) { return false } ethTx = *tx return true })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(chainID *big.Int) bool { return chainID.Cmp(evmcfg.EVM().ChainID()) == 0 })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(evmcfg.EVM().ChainID())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ChainID()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(ðTx, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx.Sequence) }), fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx.Sequence) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Fatal, errors.New("exceeds block gas limit"))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.New("exceeds block gas limit")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.XXXTestSetClient(txmgr.NewEvmTxmClient(ethClient, nil))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEvmTxmClient(ethClient, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("creates new attempt with higher gas price if transaction has an attempt older than threshold", func(t *testing.T) { expectedBumpedGasPrice := big.NewInt(20000000000) require.Greater(t, expectedBumpedGasPrice.Int64(), attempt1_1.TxFee.Legacy.ToInt().Int64()) ethTx := *types.NewTx(&types.LegacyTx{}) kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.MatchedBy(func(chainID *big.Int) bool { return chainID.Cmp(evmcfg.EVM().ChainID()) == 0 })).Return(ðTx, nil).Once() ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once() // Do the thing require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) var err error etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) require.Len(t, etx.TxAttempts, 2) require.Equal(t, attempt1_1.ID, etx.TxAttempts[1].ID) // Got the new attempt attempt1_2 = etx.TxAttempts[0] assert.Equal(t, expectedBumpedGasPrice.Int64(), attempt1_2.TxFee.Legacy.ToInt().Int64()) assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt1_2.State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewInt(20000000000)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTx(&types.LegacyTx{})` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.MatchedBy(func(chainID *big.Int) bool { return chainID.Cmp(evmcfg.EVM().ChainID()) == 0 }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { if expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(tx.GasPrice())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(chainID *big.Int) bool { return chainID.Cmp(evmcfg.EVM().ChainID()) == 0 })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(evmcfg.EVM().ChainID())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ChainID()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(ðTx, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(tx.GasPrice())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("does nothing if there is an attempt without BroadcastBeforeBlockNum set", func(t *testing.T) { // Do the thing require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) var err error etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) require.Len(t, etx.TxAttempts, 2) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("creates new attempt with higher gas price if transaction is already in mempool (e.g. due to previous crash before we could save the new attempt)", func(t *testing.T) { expectedBumpedGasPrice := big.NewInt(25000000000) require.Greater(t, expectedBumpedGasPrice.Int64(), attempt1_2.TxFee.Legacy.ToInt().Int64()) ethTx := *types.NewTx(&types.LegacyTx{}) kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx.Sequence || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.Anything).Return(ðTx, nil).Once() ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Successful, fmt.Errorf("known transaction: %s", ethTx.Hash().Hex())).Once() // Do the thing require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) var err error etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) require.Len(t, etx.TxAttempts, 3) require.Equal(t, attempt1_1.ID, etx.TxAttempts[2].ID) require.Equal(t, attempt1_2.ID, etx.TxAttempts[1].ID) // Got the new attempt attempt1_3 = etx.TxAttempts[0] assert.Equal(t, expectedBumpedGasPrice.Int64(), attempt1_3.TxFee.Legacy.ToInt().Int64()) assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt1_3.State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewInt(25000000000)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTx(&types.LegacyTx{})` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx.Sequence || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx.Sequence || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(tx.Nonce())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(tx.GasPrice())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(ðTx, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(tx.GasPrice())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Successful, fmt.Errorf("known transaction: %s", ethTx.Hash().Hex()))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("saves new attempt even for transaction that has already been confirmed (nonce already used)", func(t *testing.T) { expectedBumpedGasPrice := big.NewInt(30000000000) require.Greater(t, expectedBumpedGasPrice.Int64(), attempt1_2.TxFee.Legacy.ToInt().Int64()) ethTx := *types.NewTx(&types.LegacyTx{}) receipt := evmtypes.Receipt{BlockNumber: big.NewInt(40)} kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx.Sequence || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx receipt.TxHash = tx.Hash() return true }), mock.Anything).Return(ðTx, nil).Once() ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.TransactionAlreadyKnown, errors.New("nonce too low")).Once() // Do the thing require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) var err error etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxConfirmedMissingReceipt, etx.State) // Got the new attempt attempt1_4 = etx.TxAttempts[0] assert.Equal(t, expectedBumpedGasPrice.Int64(), attempt1_4.TxFee.Legacy.ToInt().Int64()) require.Len(t, etx.TxAttempts, 4) require.Equal(t, attempt1_1.ID, etx.TxAttempts[3].ID) require.Equal(t, attempt1_2.ID, etx.TxAttempts[2].ID) require.Equal(t, attempt1_3.ID, etx.TxAttempts[1].ID) require.Equal(t, attempt1_4.ID, etx.TxAttempts[0].ID) require.Equal(t, txmgrtypes.TxAttemptBroadcast, etx.TxAttempts[0].State) require.Equal(t, txmgrtypes.TxAttemptBroadcast, etx.TxAttempts[1].State) require.Equal(t, txmgrtypes.TxAttemptBroadcast, etx.TxAttempts[2].State) require.Equal(t, txmgrtypes.TxAttemptBroadcast, etx.TxAttempts[3].State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewInt(30000000000)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTx(&types.LegacyTx{})` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewInt(40)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx.Sequence || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx receipt.TxHash = tx.Hash() return true }), mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx.Sequence || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx receipt.TxHash = tx.Hash() return true })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(tx.Nonce())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(tx.GasPrice())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Hash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(ðTx, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(tx.GasPrice())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.TransactionAlreadyKnown, errors.New("nonce too low"))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.New("nonce too low")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustExec(t, db, `UPDATE evm.txes SET state = 'confirmed'`)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, nonce, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("saves in-progress attempt on temporary error and returns error", func(t *testing.T) { expectedBumpedGasPrice := big.NewInt(20000000000) require.Greater(t, expectedBumpedGasPrice.Int64(), attempt2_1.TxFee.Legacy.ToInt().Int64()) ethTx := *types.NewTx(&types.LegacyTx{}) n := *etx2.Sequence kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != n || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.Anything).Return(ðTx, nil).Once() ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == n && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Unknown, errors.New("some network error")).Once() // Do the thing err := ec.RebroadcastWhereNecessary(tests.Context(t), currentHead) require.Error(t, err) require.Contains(t, err.Error(), "some network error") etx2, err = txStore.FindTxWithAttempts(ctx, etx2.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx2.State) // Old attempt is untouched require.Len(t, etx2.TxAttempts, 2) require.Equal(t, attempt2_1.ID, etx2.TxAttempts[1].ID) attempt2_1 = etx2.TxAttempts[1] assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt2_1.State) assert.Equal(t, oldEnough, *attempt2_1.BroadcastBeforeBlockNum) // New in_progress attempt saved attempt2_2 = etx2.TxAttempts[0] assert.Equal(t, txmgrtypes.TxAttemptInProgress, attempt2_2.State) assert.Nil(t, attempt2_2.BroadcastBeforeBlockNum) // Do it again and move the attempt into "broadcast" n = *etx2.Sequence ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == n && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once() require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) // Attempt marked "broadcast" etx2, err = txStore.FindTxWithAttempts(ctx, etx2.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx2.State) // New in_progress attempt saved require.Len(t, etx2.TxAttempts, 2) require.Equal(t, attempt2_2.ID, etx2.TxAttempts[0].ID) attempt2_2 = etx2.TxAttempts[0] require.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt2_2.State) assert.Nil(t, attempt2_2.BroadcastBeforeBlockNum) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewInt(20000000000)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTx(&types.LegacyTx{})` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != n || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != n || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(tx.Nonce())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(tx.GasPrice())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(ðTx, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == n && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == n && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(tx.Nonce())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(tx.GasPrice())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Unknown, errors.New("some network error"))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.New("some network error")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.RebroadcastWhereNecessary(tests.Context(t), currentHead)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx2.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == n && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == n && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(tx.Nonce())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(tx.GasPrice())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx2.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("assumes that 'nonce too low' error means confirmed_missing_receipt", func(t *testing.T) { expectedBumpedGasPrice := big.NewInt(25000000000) require.Greater(t, expectedBumpedGasPrice.Int64(), attempt2_1.TxFee.Legacy.ToInt().Int64()) ethTx := *types.NewTx(&types.LegacyTx{}) n := *etx2.Sequence kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != n || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.Anything).Return(ðTx, nil).Once() ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == n && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.TransactionAlreadyKnown, errors.New("nonce too low")).Once() // Creates new attempt as normal if currentHead is not high enough require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) var err error etx2, err = txStore.FindTxWithAttempts(ctx, etx2.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxConfirmedMissingReceipt, etx2.State) // One new attempt saved require.Len(t, etx2.TxAttempts, 3) assert.Equal(t, txmgrtypes.TxAttemptBroadcast, etx2.TxAttempts[0].State) assert.Equal(t, txmgrtypes.TxAttemptBroadcast, etx2.TxAttempts[1].State) assert.Equal(t, txmgrtypes.TxAttemptBroadcast, etx2.TxAttempts[2].State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewInt(25000000000)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTx(&types.LegacyTx{})` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != n || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != n || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(tx.Nonce())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(tx.GasPrice())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(ðTx, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == n && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == n && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(tx.Nonce())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(tx.GasPrice())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.TransactionAlreadyKnown, errors.New("nonce too low"))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.New("nonce too low")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx2.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, nonce, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("saves attempt anyway if replacement transaction is underpriced because the bumped gas price is insufficiently higher than the previous one", func(t *testing.T) { expectedBumpedGasPrice := big.NewInt(42000000000) require.Greater(t, expectedBumpedGasPrice.Int64(), attempt3_1.TxFee.Legacy.ToInt().Int64()) ethTx := *types.NewTx(&types.LegacyTx{}) kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx3.Sequence || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.Anything).Return(ðTx, nil).Once() ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx3.Sequence && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Successful, errors.New("replacement transaction underpriced")).Once() // Do the thing require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) var err error etx3, err = txStore.FindTxWithAttempts(ctx, etx3.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx3.State) require.Len(t, etx3.TxAttempts, 2) require.Equal(t, attempt3_1.ID, etx3.TxAttempts[1].ID) attempt3_2 = etx3.TxAttempts[0] assert.Equal(t, expectedBumpedGasPrice.Int64(), attempt3_2.TxFee.Legacy.ToInt().Int64()) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewInt(42000000000)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTx(&types.LegacyTx{})` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx3.Sequence || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx3.Sequence || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(tx.Nonce())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(tx.GasPrice())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(ðTx, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx3.Sequence && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx3.Sequence && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(tx.Nonce())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(tx.GasPrice())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Successful, errors.New("replacement transaction underpriced"))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.New("replacement transaction underpriced")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx3.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("handles case where transaction is already known somehow", func(t *testing.T) { expectedBumpedGasPrice := big.NewInt(50400000000) require.Greater(t, expectedBumpedGasPrice.Int64(), attempt3_1.TxFee.Legacy.ToInt().Int64()) ethTx := *types.NewTx(&types.LegacyTx{}) kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx3.Sequence || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.Anything).Return(ðTx, nil).Once() ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx3.Sequence && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Successful, fmt.Errorf("known transaction: %s", ethTx.Hash().Hex())).Once() // Do the thing require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) var err error etx3, err = txStore.FindTxWithAttempts(ctx, etx3.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx3.State) require.Len(t, etx3.TxAttempts, 3) attempt3_3 = etx3.TxAttempts[0] assert.Equal(t, expectedBumpedGasPrice.Int64(), attempt3_3.TxFee.Legacy.ToInt().Int64()) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewInt(50400000000)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTx(&types.LegacyTx{})` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx3.Sequence || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx3.Sequence || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(tx.Nonce())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(tx.GasPrice())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(ðTx, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx3.Sequence && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx3.Sequence && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(tx.Nonce())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(tx.GasPrice())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Successful, fmt.Errorf("known transaction: %s", ethTx.Hash().Hex()))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx3.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("pretends it was accepted and continues the cycle if rejected for being temporarily underpriced", func(t *testing.T) { // This happens if parity is rejecting transactions that are not priced high enough to even get into the mempool at all // It should pretend it was accepted into the mempool and hand off to the next cycle to continue bumping gas as normal temporarilyUnderpricedError := "There are too many transactions in the queue. Your transaction was dropped due to limit. Try increasing the fee." expectedBumpedGasPrice := big.NewInt(60480000000) require.Greater(t, expectedBumpedGasPrice.Int64(), attempt3_2.TxFee.Legacy.ToInt().Int64()) ethTx := *types.NewTx(&types.LegacyTx{}) kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx3.Sequence || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.Anything).Return(ðTx, nil).Once() ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx3.Sequence && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Successful, errors.New(temporarilyUnderpricedError)).Once() // Do the thing require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) var err error etx3, err = txStore.FindTxWithAttempts(ctx, etx3.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx3.State) require.Len(t, etx3.TxAttempts, 4) attempt3_4 = etx3.TxAttempts[0] assert.Equal(t, expectedBumpedGasPrice.Int64(), attempt3_4.TxFee.Legacy.ToInt().Int64()) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewInt(60480000000)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTx(&types.LegacyTx{})` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx3.Sequence || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true }), mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx3.Sequence || expectedBumpedGasPrice.Cmp(tx.GasPrice()) != 0 { return false } ethTx = *tx return true })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(tx.Nonce())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(tx.GasPrice())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(ðTx, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx3.Sequence && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx3.Sequence && expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(tx.Nonce())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(tx.GasPrice())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Successful, errors.New(temporarilyUnderpricedError))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.New(temporarilyUnderpricedError)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx3.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("resubmits at the old price and does not create a new attempt if one of the bumped transactions would exceed EVM.GasEstimator.PriceMax", func(t *testing.T) { // Set price such that the next bump will exceed EVM.GasEstimator.PriceMax // Existing gas price is: 60480000000 gasPrice := attempt3_4.TxFee.Legacy.ToInt() gcfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.PriceMax = assets.NewWeiI(60500000000) }) newCfg := evmtest.NewChainScopedConfig(t, gcfg) ec2 := newEthConfirmer(t, txStore, ethClient, gcfg, newCfg, ethKeyStore, nil) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx3.Sequence && gasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Successful, errors.New("already known")).Once() // we already submitted at this price, now it's time to bump and submit again but since we simply resubmitted rather than increasing gas price, geth already knows about this tx // Do the thing require.NoError(t, ec2.RebroadcastWhereNecessary(tests.Context(t), currentHead)) var err error etx3, err = txStore.FindTxWithAttempts(ctx, etx3.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx3.State) // No new tx attempts require.Len(t, etx3.TxAttempts, 4) attempt3_4 = etx3.TxAttempts[0] assert.Equal(t, gasPrice.Int64(), attempt3_4.TxFee.Legacy.ToInt().Int64()) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.TxFee.Legacy.ToInt()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.PriceMax = assets.NewWeiI(60500000000) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewWeiI(60500000000)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewChainScopedConfig(t, gcfg)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx3.Sequence && gasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx3.Sequence && gasPrice.Cmp(tx.GasPrice()) == 0 })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(tx.Nonce())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(tx.GasPrice())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Successful, errors.New("already known"))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.New("already known")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx3.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("resubmits at the old price and does not create a new attempt if the current price is exactly EVM.GasEstimator.PriceMax", func(t *testing.T) { // Set price such that the current price is already at EVM.GasEstimator.PriceMax // Existing gas price is: 60480000000 gasPrice := attempt3_4.TxFee.Legacy.ToInt() gcfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.PriceMax = assets.NewWeiI(60480000000) }) newCfg := evmtest.NewChainScopedConfig(t, gcfg) ec2 := newEthConfirmer(t, txStore, ethClient, gcfg, newCfg, ethKeyStore, nil) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx3.Sequence && gasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Successful, errors.New("already known")).Once() // we already submitted at this price, now it's time to bump and submit again but since we simply resubmitted rather than increasing gas price, geth already knows about this tx // Do the thing require.NoError(t, ec2.RebroadcastWhereNecessary(tests.Context(t), currentHead)) var err error etx3, err = txStore.FindTxWithAttempts(ctx, etx3.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx3.State) // No new tx attempts require.Len(t, etx3.TxAttempts, 4) attempt3_4 = etx3.TxAttempts[0] assert.Equal(t, gasPrice.Int64(), attempt3_4.TxFee.Legacy.ToInt().Int64()) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.TxFee.Legacy.ToInt()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.PriceMax = assets.NewWeiI(60480000000) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewWeiI(60480000000)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewChainScopedConfig(t, gcfg)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx3.Sequence && gasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx3.Sequence && gasPrice.Cmp(tx.GasPrice()) == 0 })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(tx.Nonce())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(tx.GasPrice())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Successful, errors.New("already known"))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.New("already known")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx3.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("EIP-1559: bumps using EIP-1559 rules when existing attempts are of type 0x2", func(t *testing.T) { ethTx := *types.NewTx(&types.DynamicFeeTx{}) kst.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx4.Sequence { return false } ethTx = *tx return true }), mock.Anything).Return(ðTx, nil).Once() // This is the new, EIP-1559 attempt gasTipCap := assets.GWei(42) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx4.Sequence && gasTipCap.ToInt().Cmp(tx.GasTipCap()) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once() require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) var err error etx4, err = txStore.FindTxWithAttempts(ctx, etx4.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx4.State) // A new, bumped attempt require.Len(t, etx4.TxAttempts, 2) attempt4_2 = etx4.TxAttempts[0] assert.Nil(t, attempt4_2.TxFee.Legacy) assert.Equal(t, assets.GWei(42).String(), attempt4_2.TxFee.DynamicTipCap.String()) assert.Equal(t, assets.GWei(120).String(), attempt4_2.TxFee.DynamicFeeCap.String()) assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt1_2.State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTx(&types.DynamicFeeTx{})` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx4.Sequence { return false } ethTx = *tx return true }), mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx4.Sequence { return false } ethTx = *tx return true })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(tx.Nonce())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(ðTx, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GWei(42)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx4.Sequence && gasTipCap.ToInt().Cmp(tx.GasTipCap()) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx4.Sequence && gasTipCap.ToInt().Cmp(tx.GasTipCap()) == 0 })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(tx.Nonce())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ToInt()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(tx.GasTipCap())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasTipCap()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx4.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("EIP-1559: resubmits at the old price and does not create a new attempt if one of the bumped EIP-1559 transactions would have its tip cap exceed EVM.GasEstimator.PriceMax", func(t *testing.T) { gcfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.PriceMax = assets.GWei(1000) }) newCfg := evmtest.NewChainScopedConfig(t, gcfg) ec2 := newEthConfirmer(t, txStore, ethClient, gcfg, newCfg, ethKeyStore, nil) // Third attempt failed to bump, resubmits old one instead ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx4.Sequence && attempt4_2.Hash.String() == tx.Hash().String() }), fromAddress).Return(commonclient.Successful, nil).Once() require.NoError(t, ec2.RebroadcastWhereNecessary(tests.Context(t), currentHead)) var err error etx4, err = txStore.FindTxWithAttempts(ctx, etx4.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx4.State) // No new tx attempts require.Len(t, etx4.TxAttempts, 2) assert.Equal(t, assets.GWei(999).Int64(), etx4.TxAttempts[0].TxFee.DynamicTipCap.ToInt().Int64()) assert.Equal(t, assets.GWei(1000).Int64(), etx4.TxAttempts[0].TxFee.DynamicFeeCap.ToInt().Int64()) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.PriceMax = assets.GWei(1000) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GWei(1000)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewChainScopedConfig(t, gcfg)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx4.Sequence && attempt4_2.Hash.String() == tx.Hash().String() }), fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx4.Sequence && attempt4_2.Hash.String() == tx.Hash().String() })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(tx.Nonce())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Hash.String()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Hash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.String()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx4.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GWei(54)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTx(&types.LegacyTx{})` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SignTx", mock.Anything, fromAddress, mock.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx4.Sequence || expectedBumpedTipCap.ToInt().Cmp(tx.GasTipCap()) != 0 { return false } ethTx = *tx return true }), mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { if evmtypes.Nonce(tx.Nonce()) != *etx4.Sequence || expectedBumpedTipCap.ToInt().Cmp(tx.GasTipCap()) != 0 { return false } ethTx = *tx return true })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(tx.Nonce())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ToInt()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(tx.GasTipCap())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasTipCap()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(ðTx, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx4.Sequence && expectedBumpedTipCap.ToInt().Cmp(tx.GasTipCap()) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return evmtypes.Nonce(tx.Nonce()) == *etx4.Sequence && expectedBumpedTipCap.ToInt().Cmp(tx.GasTipCap()) == 0 })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(tx.Nonce())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ToInt()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(tx.GasTipCap())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasTipCap()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Successful, errors.New("replacement transaction underpriced"))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.New("replacement transaction underpriced")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx4.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.PriceMax = assets.GWei(500) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GWei(500)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEth(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("EnabledAddressesForChain", mock.Anything, &cltest.FixtureChainID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(addresses, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Maybe()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("terminally underpriced transaction with in_progress attempt is retried with more gas", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) ec := newEthConfirmer(t, txStore, ethClient, cfg, evmcfg, kst, nil) originalBroadcastAt := time.Unix(1616509100, 0) etx := mustInsertUnconfirmedEthTxWithAttemptState(t, txStore, nonce, fromAddress, txmgrtypes.TxAttemptInProgress, originalBroadcastAt) require.Equal(t, originalBroadcastAt, *etx.BroadcastAt) nonce++ attempt := etx.TxAttempts[0] signedTx, err := txmgr.GetGethSignedTx(attempt.SignedRawTx) require.NoError(t, err) // Fail the first time with terminally underpriced. ethClient.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress).Return( commonclient.Underpriced, errors.New("Transaction gas price is too low. It does not satisfy your node's minimal gas price")).Once() // Succeed the second time after bumping gas. ethClient.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress).Return( commonclient.Successful, nil).Once() kst.On("SignTx", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return( signedTx, nil, ).Once() require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Unix(1616509100, 0)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GetGethSignedTx(attempt.SignedRawTx)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return( commonclient.Underpriced, errors.New("Transaction gas price is too low. It does not satisfy your node's minimal gas price"))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.New("Transaction gas price is too low. It does not satisfy your node's minimal gas price")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return( commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SignTx", mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return( signedTx, nil, )` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("multiple gas bumps with existing broadcast attempts are retried with more gas until success in legacy mode", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) ec := newEthConfirmer(t, txStore, ethClient, cfg, evmcfg, kst, nil) etx := cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, nonce, fromAddress) nonce++ legacyAttempt := etx.TxAttempts[0] var dbAttempt txmgr.DbEthTxAttempt dbAttempt.FromTxAttempt(&legacyAttempt) require.NoError(t, db.Get(&dbAttempt, `UPDATE evm.tx_attempts SET broadcast_before_block_num=$1 WHERE id=$2 RETURNING *`, oldEnough, legacyAttempt.ID)) // Fail a few times with terminally underpriced ethClient.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress).Return( commonclient.Underpriced, errors.New("Transaction gas price is too low. It does not satisfy your node's minimal gas price")).Times(3) // Succeed the second time after bumping gas. ethClient.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress).Return( commonclient.Successful, nil).Once() signedLegacyTx := new(types.Transaction) kst.On("SignTx", mock.Anything, mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Type() == 0x0 && tx.Nonce() == uint64(*etx.Sequence) }), mock.Anything).Return( signedLegacyTx, nil, ).Run(func(args mock.Arguments) { unsignedLegacyTx := args.Get(2).(*types.Transaction) // Use the real keystore to do the actual signing thisSignedLegacyTx, err := ethKeyStore.SignTx(tests.Context(t), fromAddress, unsignedLegacyTx, testutils.FixtureChainID) require.NoError(t, err) *signedLegacyTx = *thisSignedLegacyTx }).Times(4) // 3 failures 1 success require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, nonce, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FromTxAttempt(&legacyAttempt)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return( commonclient.Underpriced, errors.New("Transaction gas price is too low. It does not satisfy your node's minimal gas price"))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.New("Transaction gas price is too low. It does not satisfy your node's minimal gas price")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Times(3)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return( commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SignTx", mock.Anything, mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Type() == 0x0 && tx.Nonce() == uint64(*etx.Sequence) }), mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return tx.Type() == 0x0 && tx.Nonce() == uint64(*etx.Sequence) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Type()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return( signedLegacyTx, nil, )` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(func(args mock.Arguments) { unsignedLegacyTx := args.Get(2).(*types.Transaction) // Use the real keystore to do the actual signing thisSignedLegacyTx, err := ethKeyStore.SignTx(tests.Context(t), fromAddress, unsignedLegacyTx, testutils.FixtureChainID) require.NoError(t, err) *signedLegacyTx = *thisSignedLegacyTx })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Get(2)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.SignTx(tests.Context(t), fromAddress, unsignedLegacyTx, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Times(4)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FromTxAttempt(&dxFeeAttempt)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return( commonclient.Underpriced, errors.New("transaction underpriced"))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.New("transaction underpriced")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Times(3)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return( commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SignTx", mock.Anything, mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Type() == 0x2 && tx.Nonce() == uint64(*etx.Sequence) }), mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return tx.Type() == 0x2 && tx.Nonce() == uint64(*etx.Sequence) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Type()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return( signedDxFeeTx, nil, )` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(func(args mock.Arguments) { unsignedDxFeeTx := args.Get(2).(*types.Transaction) // Use the real keystore to do the actual signing thisSignedDxFeeTx, err := ethKeyStore.SignTx(tests.Context(t), fromAddress, unsignedDxFeeTx, testutils.FixtureChainID) require.NoError(t, err) *signedDxFeeTx = *thisSignedDxFeeTx })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Get(2)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.SignTx(tests.Context(t), fromAddress, unsignedDxFeeTx, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Times(4)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EnabledKeysForChain(tests.Context(t), testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, nonce, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FromTxAttempt(&attempt1_1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.New("insufficient funds for gas * price + value")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("saves attempt with state 'insufficient_eth' if eth node returns this error", func(t *testing.T) { ec := newEthConfirmer(t, txStore, ethClient, gconfig, config, ethKeyStore, nil) expectedBumpedGasPrice := big.NewInt(20000000000) require.Greater(t, expectedBumpedGasPrice.Int64(), attempt1_1.TxFee.Legacy.ToInt().Int64()) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.InsufficientFunds, insufficientEthError).Once() // Do the thing require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) require.Len(t, etx.TxAttempts, 2) require.Equal(t, attempt1_1.ID, etx.TxAttempts[1].ID) // Got the new attempt attempt1_2 = etx.TxAttempts[0] assert.Equal(t, expectedBumpedGasPrice.Int64(), attempt1_2.TxFee.Legacy.ToInt().Int64()) assert.Equal(t, txmgrtypes.TxAttemptInsufficientFunds, attempt1_2.State) assert.Nil(t, attempt1_2.BroadcastBeforeBlockNum) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewInt(20000000000)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(tx.GasPrice())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.InsufficientFunds, insufficientEthError)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("does not bump gas when previous error was 'out of eth', instead resubmits existing transaction", func(t *testing.T) { ec := newEthConfirmer(t, txStore, ethClient, gconfig, config, ethKeyStore, nil) expectedBumpedGasPrice := big.NewInt(20000000000) require.Greater(t, expectedBumpedGasPrice.Int64(), attempt1_1.TxFee.Legacy.ToInt().Int64()) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.InsufficientFunds, insufficientEthError).Once() // Do the thing require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) // New attempt was NOT created require.Len(t, etx.TxAttempts, 2) // The attempt is still "out of eth" attempt1_2 = etx.TxAttempts[0] assert.Equal(t, expectedBumpedGasPrice.Int64(), attempt1_2.TxFee.Legacy.ToInt().Int64()) assert.Equal(t, txmgrtypes.TxAttemptInsufficientFunds, attempt1_2.State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewInt(20000000000)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(tx.GasPrice())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.InsufficientFunds, insufficientEthError)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("saves the attempt as broadcast after node wallet has been topped up with sufficient balance", func(t *testing.T) { ec := newEthConfirmer(t, txStore, ethClient, gconfig, config, ethKeyStore, nil) expectedBumpedGasPrice := big.NewInt(20000000000) require.Greater(t, expectedBumpedGasPrice.Int64(), attempt1_1.TxFee.Legacy.ToInt().Int64()) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress).Return(commonclient.Successful, nil).Once() // Do the thing require.NoError(t, ec.RebroadcastWhereNecessary(tests.Context(t), currentHead)) etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) // New attempt was NOT created require.Len(t, etx.TxAttempts, 2) // Attempt is now 'broadcast' attempt1_2 = etx.TxAttempts[0] assert.Equal(t, expectedBumpedGasPrice.Int64(), attempt1_2.TxFee.Legacy.ToInt().Int64()) assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt1_2.State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewInt(20000000000)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 }), fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return expectedBumpedGasPrice.Cmp(tx.GasPrice()) == 0 })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(tx.GasPrice())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.BumpTxDepth = ptr(uint32(depth)) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(n) }), fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(n) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("does nothing if there aren't any transactions", func(t *testing.T) { require.NoError(t, ec.EnsureConfirmedTransactionsInLongestChain(tests.Context(t), &head)) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("does nothing to unconfirmed transactions", func(t *testing.T) { etx := cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 0, fromAddress) // Do the thing require.NoError(t, ec.EnsureConfirmedTransactionsInLongestChain(tests.Context(t), &head)) etx, err := txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx.State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 0, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("does nothing to confirmed transactions with receipts within head height of the chain and included in the chain", func(t *testing.T) { etx := cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 2, 1, fromAddress) mustInsertEthReceipt(t, txStore, head.Number, head.Hash, etx.TxAttempts[0].Hash) // Do the thing require.NoError(t, ec.EnsureConfirmedTransactionsInLongestChain(tests.Context(t), &head)) etx, err := txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxConfirmed, etx.State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 2, 1, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("does nothing to confirmed transactions that only have receipts older than the start of the chain", func(t *testing.T) { etx := cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 3, 1, fromAddress) // Add receipt that is older than the lowest block of the chain mustInsertEthReceipt(t, txStore, head.Parent.Parent.Number-1, testutils.NewHash(), etx.TxAttempts[0].Hash) // Do the thing require.NoError(t, ec.EnsureConfirmedTransactionsInLongestChain(tests.Context(t), &head)) etx, err := txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxConfirmed, etx.State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 3, 1, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("unconfirms and rebroadcasts transactions that have receipts within head height of the chain but not included in the chain", func(t *testing.T) { etx := cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 4, 1, fromAddress) attempt := etx.TxAttempts[0] // Include one within head height but a different block hash mustInsertEthReceipt(t, txStore, head.Parent.Number, testutils.NewHash(), attempt.Hash) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { atx, err := txmgr.GetGethSignedTx(attempt.SignedRawTx) require.NoError(t, err) // Keeps gas price and nonce the same return atx.GasPrice().Cmp(tx.GasPrice()) == 0 && atx.Nonce() == tx.Nonce() }), fromAddress).Return(commonclient.Successful, nil).Once() // Do the thing require.NoError(t, ec.EnsureConfirmedTransactionsInLongestChain(tests.Context(t), &head)) etx, err := txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx.State) require.Len(t, etx.TxAttempts, 1) attempt = etx.TxAttempts[0] assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt.State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 4, 1, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { atx, err := txmgr.GetGethSignedTx(attempt.SignedRawTx) require.NoError(t, err) // Keeps gas price and nonce the same return atx.GasPrice().Cmp(tx.GasPrice()) == 0 && atx.Nonce() == tx.Nonce() }), fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { atx, err := txmgr.GetGethSignedTx(attempt.SignedRawTx) require.NoError(t, err) // Keeps gas price and nonce the same return atx.GasPrice().Cmp(tx.GasPrice()) == 0 && atx.Nonce() == tx.Nonce() })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GetGethSignedTx(attempt.SignedRawTx)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(tx.GasPrice())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("unconfirms and rebroadcasts transactions that have receipts within head height of chain but not included in the chain even if a receipt exists older than the start of the chain", func(t *testing.T) { etx := cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 5, 1, fromAddress) attempt := etx.TxAttempts[0] attemptHash := attempt.Hash // Add receipt that is older than the lowest block of the chain mustInsertEthReceipt(t, txStore, head.Parent.Parent.Number-1, testutils.NewHash(), attemptHash) // Include one within head height but a different block hash mustInsertEthReceipt(t, txStore, head.Parent.Number, testutils.NewHash(), attemptHash) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress).Return( commonclient.Successful, nil).Once() // Do the thing require.NoError(t, ec.EnsureConfirmedTransactionsInLongestChain(tests.Context(t), &head)) etx, err := txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx.State) require.Len(t, etx.TxAttempts, 1) attempt = etx.TxAttempts[0] assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt.State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 5, 1, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return( commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("if more than one attempt has a receipt (should not be possible but isn't prevented by database constraints) unconfirms and rebroadcasts only the attempt with the highest gas price", func(t *testing.T) { etx := cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 6, 1, fromAddress) require.Len(t, etx.TxAttempts, 1) // Sanity check to assert the included attempt has the lowest gas price require.Less(t, etx.TxAttempts[0].TxFee.Legacy.ToInt().Int64(), int64(30000)) attempt2 := newBroadcastLegacyEthTxAttempt(t, etx.ID, 30000) attempt2.SignedRawTx = hexutil.MustDecode("0xf88c8301f3a98503b9aca000832ab98094f5fff180082d6017036b771ba883025c654bc93580a4daa6d556000000000000000000000000000000000000000000000000000000000000000026a0f25601065ee369b6470c0399a2334afcfbeb0b5c8f3d9a9042e448ed29b5bcbda05b676e00248b85faf4dd889f0e2dcf91eb867e23ac9eeb14a73f9e4c14972cdf") attempt3 := newBroadcastLegacyEthTxAttempt(t, etx.ID, 40000) attempt3.SignedRawTx = hexutil.MustDecode("0xf88c8301f3a88503b9aca0008316e36094151445852b0cfdf6a4cc81440f2af99176e8ad0880a4daa6d556000000000000000000000000000000000000000000000000000000000000000026a0dcb5a7ad52b96a866257134429f944c505820716567f070e64abb74899803855a04c13eff2a22c218e68da80111e1bb6dc665d3dea7104ab40ff8a0275a99f630d") require.NoError(t, txStore.InsertTxAttempt(ctx, &attempt2)) require.NoError(t, txStore.InsertTxAttempt(ctx, &attempt3)) // Receipt is within head height but a different block hash mustInsertEthReceipt(t, txStore, head.Parent.Number, testutils.NewHash(), attempt2.Hash) // Receipt is within head height but a different block hash mustInsertEthReceipt(t, txStore, head.Parent.Number, testutils.NewHash(), attempt3.Hash) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { s, err := txmgr.GetGethSignedTx(attempt3.SignedRawTx) require.NoError(t, err) return tx.Hash() == s.Hash() }), fromAddress).Return(commonclient.Successful, nil).Once() // Do the thing require.NoError(t, ec.EnsureConfirmedTransactionsInLongestChain(tests.Context(t), &head)) etx, err := txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxUnconfirmed, etx.State) require.Len(t, etx.TxAttempts, 3) attempt1 := etx.TxAttempts[0] assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt1.State) attempt2 = etx.TxAttempts[1] assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt2.State) attempt3 = etx.TxAttempts[2] assert.Equal(t, txmgrtypes.TxAttemptBroadcast, attempt3.State) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 6, 1, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustDecode("0xf88c8301f3a98503b9aca000832ab98094f5fff180082d6017036b771ba883025c654bc93580a4daa6d556000000000000000000000000000000000000000000000000000000000000000026a0f25601065ee369b6470c0399a2334afcfbeb0b5c8f3d9a9042e448ed29b5bcbda05b676e00248b85faf4dd889f0e2dcf91eb867e23ac9eeb14a73f9e4c14972cdf")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustDecode("0xf88c8301f3a88503b9aca0008316e36094151445852b0cfdf6a4cc81440f2af99176e8ad0880a4daa6d556000000000000000000000000000000000000000000000000000000000000000026a0dcb5a7ad52b96a866257134429f944c505820716567f070e64abb74899803855a04c13eff2a22c218e68da80111e1bb6dc665d3dea7104ab40ff8a0275a99f630d")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { s, err := txmgr.GetGethSignedTx(attempt3.SignedRawTx) require.NoError(t, err) return tx.Hash() == s.Hash() }), fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { s, err := txmgr.GetGethSignedTx(attempt3.SignedRawTx) require.NoError(t, err) return tx.Hash() == s.Hash() })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GetGethSignedTx(attempt3.SignedRawTx)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Hash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Hash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 7, 1, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ChainID()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 1, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 2, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GWei(52)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("rebroadcasts one eth_tx if it falls within in nonce range", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) ec := newEthConfirmer(t, txStore, ethClient, gconfig, config, ethKeyStore, nil) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx1.Sequence) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == overrideGasLimit && reflect.DeepEqual(tx.Data(), etx1.EncodedPayload) && tx.To().String() == etx1.ToAddress.String() }), mock.Anything).Return(commonclient.Successful, nil).Once() require.NoError(t, ec.ForceRebroadcast(tests.Context(t), []evmtypes.Nonce{1}, gasPriceWei, fromAddress, overrideGasLimit)) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx1.Sequence) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == overrideGasLimit && reflect.DeepEqual(tx.Data(), etx1.EncodedPayload) && tx.To().String() == etx1.ToAddress.String() }), mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx1.Sequence) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == overrideGasLimit && reflect.DeepEqual(tx.Data(), etx1.EncodedPayload) && tx.To().String() == etx1.ToAddress.String() })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Int64()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Legacy.Int64()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Gas()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.DeepEqual(tx.Data(), etx1.EncodedPayload)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Data()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.To()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.String()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ToAddress.String()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("uses default gas limit if overrideGasLimit is 0", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) ec := newEthConfirmer(t, txStore, ethClient, gconfig, config, ethKeyStore, nil) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx1.Sequence) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == etx1.FeeLimit && reflect.DeepEqual(tx.Data(), etx1.EncodedPayload) && tx.To().String() == etx1.ToAddress.String() }), mock.Anything).Return(commonclient.Successful, nil).Once() require.NoError(t, ec.ForceRebroadcast(tests.Context(t), []evmtypes.Nonce{(1)}, gasPriceWei, fromAddress, 0)) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx1.Sequence) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == etx1.FeeLimit && reflect.DeepEqual(tx.Data(), etx1.EncodedPayload) && tx.To().String() == etx1.ToAddress.String() }), mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx1.Sequence) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == etx1.FeeLimit && reflect.DeepEqual(tx.Data(), etx1.EncodedPayload) && tx.To().String() == etx1.ToAddress.String() })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Int64()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Legacy.Int64()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Gas()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.DeepEqual(tx.Data(), etx1.EncodedPayload)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Data()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.To()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.String()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ToAddress.String()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("rebroadcasts several eth_txes in nonce range", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) ec := newEthConfirmer(t, txStore, ethClient, gconfig, config, ethKeyStore, nil) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx1.Sequence) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == overrideGasLimit }), mock.Anything).Return(commonclient.Successful, nil).Once() ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx2.Sequence) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == overrideGasLimit }), mock.Anything).Return(commonclient.Successful, nil).Once() require.NoError(t, ec.ForceRebroadcast(tests.Context(t), []evmtypes.Nonce{(1), (2)}, gasPriceWei, fromAddress, overrideGasLimit)) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx1.Sequence) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == overrideGasLimit }), mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx1.Sequence) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == overrideGasLimit })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Int64()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Legacy.Int64()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Gas()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx2.Sequence) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == overrideGasLimit }), mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(*etx2.Sequence) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == overrideGasLimit })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Int64()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Legacy.Int64()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Gas()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("broadcasts zero transactions if eth_tx doesn't exist for that nonce", func(t *testing.T) { ethClient := testutils.NewEthClientMockWithDefaultChain(t) ec := newEthConfirmer(t, txStore, ethClient, gconfig, config, ethKeyStore, nil) ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(1) }), mock.Anything).Return(commonclient.Successful, nil).Once() ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(2) }), mock.Anything).Return(commonclient.Successful, nil).Once() for i := 3; i <= 5; i++ { nonce := i ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(nonce) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == overrideGasLimit && *tx.To() == fromAddress && tx.Value().Cmp(big.NewInt(0)) == 0 && len(tx.Data()) == 0 }), mock.Anything).Return(commonclient.Successful, nil).Once() } nonces := []evmtypes.Nonce{(1), (2), (3), (4), (5)} require.NoError(t, ec.ForceRebroadcast(tests.Context(t), nonces, gasPriceWei, fromAddress, overrideGasLimit)) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(1) }), mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(1) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(2) }), mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(2) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(nonce) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == overrideGasLimit && *tx.To() == fromAddress && tx.Value().Cmp(big.NewInt(0)) == 0 && len(tx.Data()) == 0 }), mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(nonce) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == overrideGasLimit && *tx.To() == fromAddress && tx.Value().Cmp(big.NewInt(0)) == 0 && len(tx.Data()) == 0 })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Int64()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Legacy.Int64()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Gas()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.To()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Value()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cmp(big.NewInt(0))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewInt(0)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Data()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(0) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == config.EVM().GasEstimator().LimitDefault() }), mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(tx *types.Transaction) bool { return tx.Nonce() == uint64(0) && tx.GasPrice().Int64() == gasPriceWei.Legacy.Int64() && tx.Gas() == config.EVM().GasEstimator().LimitDefault() })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasPrice()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Int64()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Legacy.Int64()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Gas()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.LimitDefault()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTestGeneralConfig(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewChainScopedConfig(t, config)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustExec(t, db, `SET CONSTRAINTS fk_pipeline_runs_pruning_key DEFERRED`)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustExec(t, db, `SET CONSTRAINTS pipeline_runs_pipeline_spec_id_fkey DEFERRED`)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("doesn't process task runs that are not suspended (possibly already previously resumed)", func(t *testing.T) { ec := newEthConfirmer(t, txStore, ethClient, config, evmcfg, ethKeyStore, func(context.Context, uuid.UUID, interface{}, error) error { t.Fatal("No value expected") return nil }) run := cltest.MustInsertPipelineRun(t, db) tr := cltest.MustInsertUnfinishedPipelineTaskRun(t, db, run.ID) etx := cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 1, 1, fromAddress) mustInsertEthReceipt(t, txStore, head.Number-minConfirmations, head.Hash, etx.TxAttempts[0].Hash) // Setting both signal_callback and callback_completed to TRUE to simulate a completed pipeline task // It would only be in a state past suspended if the resume callback was called and callback_completed was set to TRUE pgtest.MustExec(t, db, `UPDATE evm.txes SET pipeline_task_run_id = $1, min_confirmations = $2, signal_callback = TRUE, callback_completed = TRUE WHERE id = $3`, &tr.ID, minConfirmations, etx.ID) err := ec.ResumePendingTaskRuns(tests.Context(t), &head) require.NoError(t, err) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertPipelineRun(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnfinishedPipelineTaskRun(t, db, run.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 1, 1, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustExec(t, db, `UPDATE evm.txes SET pipeline_task_run_id = $1, min_confirmations = $2, signal_callback = TRUE, callback_completed = TRUE WHERE id = $3`, &tr.ID, minConfirmations, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ResumePendingTaskRuns(tests.Context(t), &head)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("doesn't process task runs where the receipt is younger than minConfirmations", func(t *testing.T) { ec := newEthConfirmer(t, txStore, ethClient, config, evmcfg, ethKeyStore, func(context.Context, uuid.UUID, interface{}, error) error { t.Fatal("No value expected") return nil }) run := cltest.MustInsertPipelineRun(t, db) tr := cltest.MustInsertUnfinishedPipelineTaskRun(t, db, run.ID) etx := cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 2, 1, fromAddress) mustInsertEthReceipt(t, txStore, head.Number, head.Hash, etx.TxAttempts[0].Hash) pgtest.MustExec(t, db, `UPDATE evm.txes SET pipeline_task_run_id = $1, min_confirmations = $2, signal_callback = TRUE WHERE id = $3`, &tr.ID, minConfirmations, etx.ID) err := ec.ResumePendingTaskRuns(tests.Context(t), &head) require.NoError(t, err) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertPipelineRun(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnfinishedPipelineTaskRun(t, db, run.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 2, 1, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustExec(t, db, `UPDATE evm.txes SET pipeline_task_run_id = $1, min_confirmations = $2, signal_callback = TRUE WHERE id = $3`, &tr.ID, minConfirmations, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ResumePendingTaskRuns(tests.Context(t), &head)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("processes eth_txes with receipts older than minConfirmations", func(t *testing.T) { ch := make(chan interface{}) nonce := evmtypes.Nonce(3) var err error ec := newEthConfirmer(t, txStore, ethClient, config, evmcfg, ethKeyStore, func(ctx context.Context, id uuid.UUID, value interface{}, thisErr error) error { err = thisErr ch <- value return nil }) run := cltest.MustInsertPipelineRun(t, db) tr := cltest.MustInsertUnfinishedPipelineTaskRun(t, db, run.ID) pgtest.MustExec(t, db, `UPDATE pipeline_runs SET state = 'suspended' WHERE id = $1`, run.ID) etx := cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, int64(nonce), 1, fromAddress) pgtest.MustExec(t, db, `UPDATE evm.txes SET meta='{"FailOnRevert": true}'`) receipt := mustInsertEthReceipt(t, txStore, head.Number-minConfirmations, head.Hash, etx.TxAttempts[0].Hash) pgtest.MustExec(t, db, `UPDATE evm.txes SET pipeline_task_run_id = $1, min_confirmations = $2, signal_callback = TRUE WHERE id = $3`, &tr.ID, minConfirmations, etx.ID) done := make(chan struct{}) t.Cleanup(func() { <-done }) go func() { defer close(done) err2 := ec.ResumePendingTaskRuns(tests.Context(t), &head) if !assert.NoError(t, err2) { return } // Retrieve Tx to check if callback completed flag was set to true updateTx, err3 := txStore.FindTxWithSequence(tests.Context(t), fromAddress, nonce) if assert.NoError(t, err3) { assert.Equal(t, true, updateTx.CallbackCompleted) } }() select { case data := <-ch: assert.NoError(t, err) require.IsType(t, &evmtypes.Receipt{}, data) r := data.(*evmtypes.Receipt) require.Equal(t, receipt.TxHash, r.TxHash) case <-time.After(time.Second): t.Fatal("no value received") } })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(3)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertPipelineRun(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnfinishedPipelineTaskRun(t, db, run.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustExec(t, db, `UPDATE pipeline_runs SET state = 'suspended' WHERE id = $1`, run.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, int64(nonce), 1, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustExec(t, db, `UPDATE evm.txes SET meta='{"FailOnRevert": true}'`)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustExec(t, db, `UPDATE evm.txes SET pipeline_task_run_id = $1, min_confirmations = $2, signal_callback = TRUE WHERE id = $3`, &tr.ID, minConfirmations, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cleanup(func() { <-done })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ResumePendingTaskRuns(tests.Context(t), &head)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithSequence(tests.Context(t), fromAddress, nonce)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.After(time.Second)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustExec(t, db, `DELETE FROM pipeline_runs`)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run("processes eth_txes with receipt older than minConfirmations that reverted", func(t *testing.T) { type data struct { value any error } ch := make(chan data) nonce := evmtypes.Nonce(4) ec := newEthConfirmer(t, txStore, ethClient, config, evmcfg, ethKeyStore, func(ctx context.Context, id uuid.UUID, value interface{}, err error) error { ch <- data{value, err} return nil }) run := cltest.MustInsertPipelineRun(t, db) tr := cltest.MustInsertUnfinishedPipelineTaskRun(t, db, run.ID) pgtest.MustExec(t, db, `UPDATE pipeline_runs SET state = 'suspended' WHERE id = $1`, run.ID) etx := cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, int64(nonce), 1, fromAddress) pgtest.MustExec(t, db, `UPDATE evm.txes SET meta='{"FailOnRevert": true}'`) // receipt is not passed through as a value since it reverted and caused an error mustInsertRevertedEthReceipt(t, txStore, head.Number-minConfirmations, head.Hash, etx.TxAttempts[0].Hash) pgtest.MustExec(t, db, `UPDATE evm.txes SET pipeline_task_run_id = $1, min_confirmations = $2, signal_callback = TRUE WHERE id = $3`, &tr.ID, minConfirmations, etx.ID) done := make(chan struct{}) t.Cleanup(func() { <-done }) go func() { defer close(done) err2 := ec.ResumePendingTaskRuns(tests.Context(t), &head) if !assert.NoError(t, err2) { return } // Retrieve Tx to check if callback completed flag was set to true updateTx, err3 := txStore.FindTxWithSequence(tests.Context(t), fromAddress, nonce) if assert.NoError(t, err3) { assert.Equal(t, true, updateTx.CallbackCompleted) } }() select { case data := <-ch: assert.Error(t, data.error) assert.EqualError(t, data.error, fmt.Sprintf("transaction %s reverted on-chain", etx.TxAttempts[0].Hash.String())) assert.Nil(t, data.value) case <-time.After(tests.WaitTimeout(t)): t.Fatal("no value received") } })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(4)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertPipelineRun(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnfinishedPipelineTaskRun(t, db, run.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustExec(t, db, `UPDATE pipeline_runs SET state = 'suspended' WHERE id = $1`, run.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, int64(nonce), 1, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustExec(t, db, `UPDATE evm.txes SET meta='{"FailOnRevert": true}'`)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustExec(t, db, `UPDATE evm.txes SET pipeline_task_run_id = $1, min_confirmations = $2, signal_callback = TRUE WHERE id = $3`, &tr.ID, minConfirmations, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Cleanup(func() { <-done })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ResumePendingTaskRuns(tests.Context(t), &head)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithSequence(tests.Context(t), fromAddress, nonce)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.After(tests.WaitTimeout(t))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.WaitTimeout(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(5)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.New("error")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertPipelineRun(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertUnfinishedPipelineTaskRun(t, db, run.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, int64(nonce), 1, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustExec(t, db, `UPDATE evm.txes SET pipeline_task_run_id = $1, min_confirmations = $2, signal_callback = TRUE WHERE id = $3`, &tr.ID, minConfirmations, etx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ResumePendingTaskRuns(tests.Context(t), &head)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithSequence(tests.Context(t), fromAddress, nonce)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.Anything, fromAddress)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(commonclient.Successful, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEvmFeeEstimator(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GWei(30)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("GetFee", mock.Anything, []byte{}, uint64(0), mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(fee, uint64(0), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BumpFee", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(bumpedFee, uint64(10_000), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.LimitDefault = ptr(limitDefault) c.EVM[0].Transactions.AutoPurge.Enabled = ptr(true) c.EVM[0].Transactions.AutoPurge.Threshold = ptr(autoPurgeThreshold) c.EVM[0].Transactions.AutoPurge.MinAttempts = ptr(autoPurgeMinAttempts) })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEvmTxAttemptBuilder(*ethClient.ConfiguredChainID(), ge, ethKeyStore, feeEstimator)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewStuckTxDetector(lggr, testutils.FixtureChainID, "", assets.NewWei(assets.NewEth(100).ToInt()), evmcfg.EVM().Transactions().AutoPurge(), feeEstimator, txStore, ethClient)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewWei(assets.NewEth(100).ToInt())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEth(100)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ToInt()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Transactions()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.AutoPurge()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEvmConfirmer(txStore, txmgr.NewEvmTxmClient(ethClient, nil), txmgr.NewEvmTxmConfig(evmcfg.EVM()), txmgr.NewEvmTxmFeeConfig(ge), evmcfg.EVM().Transactions(), cfg.Database(), ethKeyStore, txBuilder, lggr, stuckTxDetector)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEvmTxmClient(ethClient, nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEvmTxmConfig(evmcfg.EVM())` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewEvmTxmFeeConfig(ge)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Transactions()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Database()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(t, ec)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Add(oneGwei)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(evmtypes.Nonce(0), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(0)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BatchCallContext", mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ProcessHead(ctx, &head)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, tx.ID)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(evmtypes.Nonce(1), nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Nonce(1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 4 && cltest.BatchElemMatchesParams(b[0], latestAttempt.Hash, "eth_getTransactionReceipt") }))` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 4 && cltest.BatchElemMatchesParams(b[0], latestAttempt.Hash, "eth_getTransactionReceipt") })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.BatchElemMatchesParams(b[0], latestAttempt.Hash, "eth_getTransactionReceipt")` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // First transaction confirmed *(elems[0].Result.(*evmtypes.Receipt)) = evmtypes.Receipt{ TxHash: latestAttempt.Hash, BlockHash: testutils.NewHash(), BlockNumber: big.NewInt(blockNum + 1), TransactionIndex: uint(1), Status: uint64(1), } })` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.NewInt(blockNum + 1)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.Once()` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.ProcessHead(ctx, &head)` $DIR/core/chains/evm/txmgr/confirmer_test.go: `.FindTxWithAttempts(ctx, tx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 0, 1, from)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt.State = txmgrtypes.TxAttemptBroadcast` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt.TxFee = gas.EvmFee{Legacy: assets.NewWeiI(3)}` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt.BroadcastBeforeBlockNum = &blockNum` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `mustCreateUnstartedGeneratedTx(t, txStore, from, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `txs, count, err = txStore.TransactionsWithAttempts(ctx, 0, 1)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 0, 1, from)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt.State = txmgrtypes.TxAttemptBroadcast` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt.TxFee = gas.EvmFee{Legacy: assets.NewWeiI(3)}` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt.BroadcastBeforeBlockNum = &blockNum` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `mustCreateUnstartedGeneratedTx(t, txStore, from, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("InsertTx", func(t *testing.T) { etx = cltest.NewEthTx(fromAddress) require.NoError(t, orm.InsertTx(ctx, &etx)) assert.Greater(t, int(etx.ID), 0) cltest.AssertCount(t, db, "evm.txes", 1) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx = cltest.NewEthTx(fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `cltest.AssertCount(t, db, "evm.txes", 1)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("InsertTxAttempt", func(t *testing.T) { attemptD = cltest.NewDynamicFeeEthTxAttempt(t, etx.ID) require.NoError(t, orm.InsertTxAttempt(ctx, &attemptD)) assert.Greater(t, int(attemptD.ID), 0) cltest.AssertCount(t, db, "evm.tx_attempts", 1) attemptL = cltest.NewLegacyEthTxAttempt(t, etx.ID) attemptL.State = txmgrtypes.TxAttemptBroadcast attemptL.TxFee = gas.EvmFee{Legacy: assets.NewWeiI(42)} require.NoError(t, orm.InsertTxAttempt(ctx, &attemptL)) assert.Greater(t, int(attemptL.ID), 0) cltest.AssertCount(t, db, "evm.tx_attempts", 2) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attemptD = cltest.NewDynamicFeeEthTxAttempt(t, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `cltest.AssertCount(t, db, "evm.tx_attempts", 1)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attemptL = cltest.NewLegacyEthTxAttempt(t, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attemptL.State = txmgrtypes.TxAttemptBroadcast` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attemptL.TxFee = gas.EvmFee{Legacy: assets.NewWeiI(42)}` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `cltest.AssertCount(t, db, "evm.tx_attempts", 2)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("InsertReceipt", func(t *testing.T) { r = newEthReceipt(42, utils.NewHash(), attemptD.Hash, 0x1) id, err := orm.InsertReceipt(ctx, &r.Receipt) r.ID = id require.NoError(t, err) assert.Greater(t, int(r.ID), 0) cltest.AssertCount(t, db, "evm.receipts", 1) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `r = newEthReceipt(42, utils.NewHash(), attemptD.Hash, 0x1)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `r.ID = id` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `cltest.AssertCount(t, db, "evm.receipts", 1)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("FindTxWithAttempts", func(t *testing.T) { var err error etx, err = orm.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) require.Len(t, etx.TxAttempts, 2) assert.Equal(t, etx.TxAttempts[0].ID, attemptD.ID) assert.Equal(t, etx.TxAttempts[1].ID, attemptL.ID) require.Len(t, etx.TxAttempts[0].Receipts, 1) require.Len(t, etx.TxAttempts[1].Receipts, 0) assert.Equal(t, r.BlockHash, etx.TxAttempts[0].Receipts[0].GetBlockHash()) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx, err = orm.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("FindTxByHash", func(t *testing.T) { foundEtx, err := orm.FindTxByHash(ctx, attemptD.Hash) require.NoError(t, err) assert.Equal(t, etx.ID, foundEtx.ID) assert.Equal(t, etx.ChainID, foundEtx.ChainID) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt.State = txmgrtypes.TxAttemptBroadcast` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt.TxFee = gas.EvmFee{Legacy: assets.NewWeiI(3)}` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt.BroadcastBeforeBlockNum = &blockNum` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `mustCreateUnstartedGeneratedTx(t, orm, from, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `cltest.MustInsertUnconfirmedEthTx(t, orm, 3, from)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, orm, 4, from)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `err = db.Get(&count, `SELECT count(*) FROM evm.txes`)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `err = db.Get(&count, `SELECT count(*) FROM evm.tx_attempts`)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("returns nothing if there are no transactions", func(t *testing.T) { olderThan := time.Now() attempts, err := txStore.FindTxAttemptsRequiringResend(tests.Context(t), olderThan, 10, testutils.FixtureChainID, fromAddress) require.NoError(t, err) assert.Len(t, attempts, 0) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt1_2.TxFee = gas.EvmFee{Legacy: assets.NewWeiI(10)}` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt3_2.TxFee = gas.EvmFee{Legacy: assets.NewWeiI(10)}` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt4_2.TxFee.DynamicTipCap = assets.NewWeiI(10)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt4_2.TxFee.DynamicFeeCap = assets.NewWeiI(20)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt4_2.State = txmgrtypes.TxAttemptBroadcast` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt4_4.TxFee.DynamicTipCap = assets.NewWeiI(30)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt4_4.TxFee.DynamicFeeCap = assets.NewWeiI(40)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt4_4.State = txmgrtypes.TxAttemptBroadcast` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt4_3.TxFee.DynamicTipCap = assets.NewWeiI(20)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt4_3.TxFee.DynamicFeeCap = assets.NewWeiI(30)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt4_3.State = txmgrtypes.TxAttemptBroadcast` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("returns nothing if there are transactions from a different key", func(t *testing.T) { olderThan := time.Now() attempts, err := txStore.FindTxAttemptsRequiringResend(tests.Context(t), olderThan, 10, testutils.FixtureChainID, utils.RandomAddress()) require.NoError(t, err) assert.Len(t, attempts, 0) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("returns the highest price attempt for each transaction that was last broadcast before or on the given time", func(t *testing.T) { olderThan := time.Unix(1616509200, 0) attempts, err := txStore.FindTxAttemptsRequiringResend(tests.Context(t), olderThan, 0, testutils.FixtureChainID, fromAddress) require.NoError(t, err) assert.Len(t, attempts, 2) assert.Equal(t, attempt1_2.ID, attempts[0].ID) assert.Equal(t, etxs[1].TxAttempts[0].ID, attempts[1].ID) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("returns the highest price attempt for EIP-1559 transactions", func(t *testing.T) { olderThan := time.Unix(1616509400, 0) attempts, err := txStore.FindTxAttemptsRequiringResend(tests.Context(t), olderThan, 0, testutils.FixtureChainID, fromAddress) require.NoError(t, err) assert.Len(t, attempts, 4) assert.Equal(t, attempt4_4.ID, attempts[3].ID) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("does not update when broadcast_at is NULL", func(t *testing.T) { t.Parallel() ctx := tests.Context(t) etx := mustCreateUnstartedGeneratedTx(t, orm, fromAddress, testutils.FixtureChainID) var nullTime *time.Time assert.Equal(t, nullTime, etx.BroadcastAt) currTime := time.Now() err := orm.UpdateBroadcastAts(tests.Context(t), currTime, []int64{etx.ID}) require.NoError(t, err) etx, err = orm.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Equal(t, nullTime, etx.BroadcastAt) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx, err = orm.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx.Sequence = new(evmtypes.Nonce)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx.State = txmgrcommon.TxUnconfirmed` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx.BroadcastAt = &time1` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx.InitialBroadcastAt = &time1` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `err = orm.UpdateBroadcastAts(ctx, time2, []int64{etx.ID})` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx, err = orm.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("saves block num to unconfirmed evm.tx_attempts without one", func(t *testing.T) { // Do the thing require.NoError(t, txStore.SetBroadcastBeforeBlockNum(tests.Context(t), headNum, chainID)) etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) require.Len(t, etx.TxAttempts, 1) attempt := etx.TxAttempts[0] assert.Equal(t, int64(9000), *attempt.BroadcastBeforeBlockNum) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("does not change evm.tx_attempts that already have BroadcastBeforeBlockNum set", func(t *testing.T) { n := int64(42) attempt := newBroadcastLegacyEthTxAttempt(t, etx.ID, 2) attempt.BroadcastBeforeBlockNum = &n require.NoError(t, txStore.InsertTxAttempt(ctx, &attempt)) // Do the thing require.NoError(t, txStore.SetBroadcastBeforeBlockNum(tests.Context(t), headNum, chainID)) etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) require.Len(t, etx.TxAttempts, 2) attempt = etx.TxAttempts[0] assert.Equal(t, int64(42), *attempt.BroadcastBeforeBlockNum) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt.BroadcastBeforeBlockNum = &n` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt = etx.TxAttempts[0]` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etxThisChain, err = txStore.FindTxWithAttempts(ctx, etxThisChain.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etxOtherChain, err = txStore.FindTxWithAttempts(ctx, etxOtherChain.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt = etxOtherChain.TxAttempts[0]` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx0, err = txStore.FindTxWithAttempts(ctx, etx0.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx0_attempt.BroadcastBeforeBlockNum = &etx0_blocknum` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx0, err = txStore.FindTxWithAttempts(ctx, etx0.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("loads eth transaction", func(t *testing.T) { // insert etx with attempt etx := cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, int64(7), fromAddress) // create unloaded attempt unloadedAttempt := txmgr.TxAttempt{TxID: etx.ID} // uninitialized EthTx assert.Equal(t, int64(0), unloadedAttempt.Tx.ID) attempts := []txmgr.TxAttempt{unloadedAttempt} err := txStore.PreloadTxes(tests.Context(t), attempts) require.NoError(t, err) assert.Equal(t, etx.ID, attempts[0].Tx.ID) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `pgtest.MustExec(t, db, `SET CONSTRAINTS fk_pipeline_runs_pruning_key DEFERRED`)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `pgtest.MustExec(t, db, `SET CONSTRAINTS pipeline_runs_pipeline_spec_id_fkey DEFERRED`)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `pgtest.MustExec(t, db, `UPDATE pipeline_runs SET state = 'suspended' WHERE id = $1`, run1.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `pgtest.MustExec(t, db, `UPDATE evm.txes SET meta='{"FailOnRevert": true}'`)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `mustInsertEthReceipt(t, txStore, head.Number-minConfirmations, head.Hash, attempt1.Hash)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `pgtest.MustExec(t, db, `UPDATE evm.txes SET pipeline_task_run_id = $1, min_confirmations = $2, signal_callback = TRUE WHERE id = $3`, &tr1.ID, minConfirmations, etx1.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `pgtest.MustExec(t, db, `UPDATE evm.txes SET meta='{"FailOnRevert": false}'`)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `mustInsertEthReceipt(t, txStore, head.Number-minConfirmations, head.Hash, attempt2.Hash)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `pgtest.MustExec(t, db, `UPDATE evm.txes SET pipeline_task_run_id = $1, min_confirmations = $2, signal_callback = TRUE, callback_completed = TRUE WHERE id = $3`, &tr2.ID, minConfirmations, etx2.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `pgtest.MustExec(t, db, `UPDATE pipeline_runs SET state = 'suspended' WHERE id = $1`, run3.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `pgtest.MustExec(t, db, `UPDATE evm.txes SET meta='{"FailOnRevert": false}'`)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `mustInsertEthReceipt(t, txStore, head.Number, head.Hash, attempt3.Hash)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `pgtest.MustExec(t, db, `UPDATE evm.txes SET pipeline_task_run_id = $1, min_confirmations = $2, signal_callback = TRUE WHERE id = $3`, &tr3.ID, minConfirmations, etx3.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `mustInsertEthReceipt(t, txStore, head.Number, head.Hash, attempt4.Hash)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `pgtest.MustExec(t, db, `UPDATE evm.txes SET min_confirmations = $1 WHERE id = $2`, minConfirmations, etx4.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `pgtest.MustExec(t, db, `UPDATE evm.txes SET min_confirmations = $1 WHERE id = $2`, minConfirmations, etx5.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("returns nil if no results", func(t *testing.T) { idempotencyKey := "777" etx, err := txStore.FindTxWithIdempotencyKey(tests.Context(t), idempotencyKey, big.NewInt(0)) require.NoError(t, err) assert.Nil(t, etx) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `cfg.EVM().ChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("returns nil if no results", func(t *testing.T) { etx, err := txStore.FindTxWithSequence(tests.Context(t), fromAddress, evmtypes.Nonce(777)) require.NoError(t, err) assert.Nil(t, etx) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `err = txStore.UpdateTxForRebroadcast(tests.Context(t), etx, attempt)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("confirmed tx not past finality_depth", func(t *testing.T) { confirmedAddr := cltest.MustGenerateRandomKey(t).Address tx := mustInsertConfirmedEthTxWithReceipt(t, txStore, confirmedAddr, 123, 1) finalized, err := txStore.IsTxFinalized(tests.Context(t), 2, tx.ID, ethClient.ConfiguredChainID()) require.NoError(t, err) require.False(t, finalized) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("no unconfirmed eth txes", func(t *testing.T) { broadcastAt, err := txStore.FindEarliestUnconfirmedBroadcastTime(tests.Context(t), ethClient.ConfiguredChainID()) require.NoError(t, err) require.False(t, broadcastAt.Valid) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("no earliest unconfirmed tx block", func(t *testing.T) { earliestBlock, err := txStore.FindEarliestUnconfirmedTxAttemptBlock(tests.Context(t), ethClient.ConfiguredChainID()) require.NoError(t, err) require.False(t, earliestBlock.Valid) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `_ = mustInsertConfirmedMissingReceiptEthTxWithLegacyAttempt(t, txStore, 123, blockNum, time.Now().Add(time.Minute), fromAddress2)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `err = txStore.SaveInsufficientFundsAttempt(tests.Context(t), defaultDuration, &etx.TxAttempts[0], now)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `err = txStore.SaveSentAttempt(tests.Context(t), defaultDuration, &etx.TxAttempts[0], now)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `err = txStore.SaveConfirmedMissingReceiptAttempt(tests.Context(t), defaultDuration, &etx.TxAttempts[0], now)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("saves new in_progress attempt if attempt is new", func(t *testing.T) { etx := cltest.MustInsertUnconfirmedEthTx(t, txStore, 1, fromAddress) attempt := cltest.NewLegacyEthTxAttempt(t, etx.ID) require.Equal(t, int64(0), attempt.ID) err := txStore.SaveInProgressAttempt(tests.Context(t), &attempt) require.NoError(t, err) attemptResult, err := txStore.FindTxAttempt(ctx, attempt.Hash) require.NoError(t, err) assert.Equal(t, txmgrtypes.TxAttemptInProgress, attemptResult.State) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt.BroadcastBeforeBlockNum = nil` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt.State = txmgrtypes.TxAttemptInProgress` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `mustInsertUnconfirmedEthTxWithAttemptState(t, txStore, 2, fromAddress, txmgrtypes.TxAttemptBroadcast)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `err = txStore.SetBroadcastBeforeBlockNum(tests.Context(t), currentBlockNum+1, ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt3_2.State = txmgrtypes.TxAttemptInsufficientFunds` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt3_2.TxFee.Legacy = assets.NewWeiI(100)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 3, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 4, 100, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `mustInsertUnconfirmedEthTxWithInsufficientEthAttempt(t, txStore, 0, otherAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("returns all eth_txes with at least one attempt that is in insufficient_eth state", func(t *testing.T) { etxs, err := txStore.FindTxsRequiringResubmissionDueToInsufficientFunds(tests.Context(t), fromAddress, testutils.FixtureChainID) require.NoError(t, err) assert.Len(t, etxs, 3) assert.Equal(t, *etx1.Sequence, *etxs[0].Sequence) assert.Equal(t, etx1.ID, etxs[0].ID) assert.Equal(t, *etx2.Sequence, *etxs[1].Sequence) assert.Equal(t, etx2.ID, etxs[1].ID) assert.Equal(t, *etx3.Sequence, *etxs[2].Sequence) assert.Equal(t, etx3.ID, etxs[2].ID) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("does not return eth_txes with different chain ID", func(t *testing.T) { etxs, err := txStore.FindTxsRequiringResubmissionDueToInsufficientFunds(tests.Context(t), fromAddress, big.NewInt(42)) require.NoError(t, err) assert.Len(t, etxs, 0) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `pgtest.MustExec(t, db, `UPDATE evm.txes SET state='confirmed' WHERE id = $1`, etx1.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `pgtest.MustExec(t, db, `UPDATE evm.txes SET state='fatal_error', nonce=NULL, error='foo', broadcast_at=NULL, initial_broadcast_at=NULL WHERE id = $1`, etx2.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("successfully mark errored transactions", func(t *testing.T) { etx := mustInsertConfirmedMissingReceiptEthTxWithLegacyAttempt(t, txStore, 1, 7, time.Now(), fromAddress) err := txStore.MarkOldTxesMissingReceiptAsErrored(tests.Context(t), 10, 2, ethClient.ConfiguredChainID()) require.NoError(t, err) etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxFatalError, etx.State) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("load eth tx attempt", func(t *testing.T) { etx := mustInsertConfirmedMissingReceiptEthTxWithLegacyAttempt(t, txStore, 1, 7, time.Now(), fromAddress) etx.TxAttempts = []txmgr.TxAttempt{} err := txStore.LoadTxesAttempts(ctx, []*txmgr.Tx{&etx}) require.NoError(t, err) assert.Len(t, etx.TxAttempts, 1) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx.TxAttempts = []txmgr.TxAttempt{}` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `dbAttempt.FromTxAttempt(&newAttempt)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `func() { tx, err := db.BeginTx(ctx, nil) require.NoError(t, err) const insertEthTxAttemptSQL = `INSERT INTO evm.tx_attempts (eth_tx_id, gas_price, signed_raw_tx, hash, broadcast_before_block_num, state, created_at, chain_specific_gas_limit, tx_type, gas_tip_cap, gas_fee_cap, is_purge_attempt) VALUES ( :eth_tx_id, :gas_price, :signed_raw_tx, :hash, :broadcast_before_block_num, :state, NOW(), :chain_specific_gas_limit, :tx_type, :gas_tip_cap, :gas_fee_cap, :is_purge_attempt ) RETURNING *` query, args, err := sqlutil.DataSource(db).BindNamed(insertEthTxAttemptSQL, dbAttempt) require.NoError(t, err) _, err = tx.ExecContext(ctx, query, args...) require.NoError(t, err) etx.TxAttempts = []txmgr.TxAttempt{} err = txStore.LoadTxesAttempts(ctx, []*txmgr.Tx{&etx}) require.NoError(t, err) assert.Len(t, etx.TxAttempts, 2) err = tx.Commit() require.NoError(t, err) }()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `_, err = tx.ExecContext(ctx, query, args...)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx.TxAttempts = []txmgr.TxAttempt{}` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `err = txStore.LoadTxesAttempts(ctx, []*txmgr.Tx{&etx})` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `err = tx.Commit()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx.TxAttempts = []txmgr.TxAttempt{}` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("cannot find unstarted tx", func(t *testing.T) { mustInsertInProgressEthTxWithAttempt(t, txStore, 13, fromAddress) resultEtx, err := txStore.FindNextUnstartedTransactionFromAddress(tests.Context(t), fromAddress, ethClient.ConfiguredChainID()) assert.ErrorIs(t, err, sql.ErrNoRows) assert.Nil(t, resultEtx) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `mustInsertInProgressEthTxWithAttempt(t, txStore, 13, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx.Error = etxPretendError` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx.BroadcastAt = &time1` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx.InitialBroadcastAt = &time1` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `i++` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("update successful", func(t *testing.T) { etx := mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, testutils.FixtureChainID) etx.Sequence = &nonce attempt := cltest.NewLegacyEthTxAttempt(t, etx.ID) err := txStore.UpdateTxUnstartedToInProgress(tests.Context(t), &etx, &attempt) require.NoError(t, err) etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxInProgress, etx.State) assert.Len(t, etx.TxAttempts, 1) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx.Sequence = &nonce` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx, err = txStore.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("update fails because tx is removed", func(t *testing.T) { etx := mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, testutils.FixtureChainID) etx.Sequence = &nonce attempt := cltest.NewLegacyEthTxAttempt(t, etx.ID) _, err := db.ExecContext(ctx, "DELETE FROM evm.txes WHERE id = $1", etx.ID) require.NoError(t, err) err = txStore.UpdateTxUnstartedToInProgress(tests.Context(t), &etx, &attempt) require.ErrorContains(t, err, "tx removed") })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx.Sequence = &nonce` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `err = txStore.UpdateTxUnstartedToInProgress(tests.Context(t), &etx, &attempt)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `db = pgtest.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `txStore = cltest.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `ethKeyStore = cltest.NewKeyStore(t, db).Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `_, fromAddress = cltest.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("update replaces abandoned tx with same hash", func(t *testing.T) { etx := mustInsertInProgressEthTxWithAttempt(t, txStore, nonce, fromAddress) require.Len(t, etx.TxAttempts, 1) zero := commonconfig.MustNewDuration(time.Duration(0)) evmCfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].Chain.Transactions.ReaperInterval = zero c.EVM[0].Chain.Transactions.ReaperThreshold = zero c.EVM[0].Chain.Transactions.ResendAfterThreshold = zero }) ccfg := evmtest.NewChainScopedConfig(t, evmCfg) evmTxmCfg := txmgr.NewEvmTxmConfig(ccfg.EVM()) ec := evmtest.NewEthClientMockWithDefaultChain(t) txMgr := txmgr.NewEvmTxm(ec.ConfiguredChainID(), evmTxmCfg, ccfg.EVM().Transactions(), nil, logger.Test(t), nil, nil, nil, txStore, nil, nil, nil, nil) err := txMgr.XXXTestAbandon(fromAddress) // mark transaction as abandoned require.NoError(t, err) etx2 := mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, testutils.FixtureChainID) etx2.Sequence = &nonce attempt2 := cltest.NewLegacyEthTxAttempt(t, etx2.ID) attempt2.Hash = etx.TxAttempts[0].Hash // Even though this will initially fail due to idx_eth_tx_attempts_hash constraint, because the conflicting tx has been abandoned // it should succeed after removing the abandoned attempt and retrying the insert err = txStore.UpdateTxUnstartedToInProgress(tests.Context(t), &etx2, &attempt2) require.NoError(t, err) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `c.EVM[0].Chain.Transactions.ReaperInterval = zero` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `c.EVM[0].Chain.Transactions.ReaperThreshold = zero` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `c.EVM[0].Chain.Transactions.ResendAfterThreshold = zero` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx2.Sequence = &nonce` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `attempt2.Hash = etx.TxAttempts[0].Hash` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `err = txStore.UpdateTxUnstartedToInProgress(tests.Context(t), &etx2, &attempt2)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `_, fromAddress = cltest.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `etx.State = txmgrcommon.TxUnstarted` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `txStore = cltest.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("gets 0 in progress eth transaction", func(t *testing.T) { etxResult, err := txStore.GetTxInProgress(tests.Context(t), fromAddress) require.NoError(t, err) require.Nil(t, etxResult) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("get 0 abandoned transactions", func(t *testing.T) { txes, err := txStore.GetAbandonedTransactionsByBatch(tests.Context(t), ethClient.ConfiguredChainID(), enabledAddrs, 0, 10) require.NoError(t, err) require.Empty(t, txes) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("do not return enabled addresses", func(t *testing.T) { _ = mustInsertInProgressEthTxWithAttempt(t, txStore, 123, enabled) _ = mustCreateUnstartedGeneratedTx(t, txStore, enabled, ethClient.ConfiguredChainID()) txes, err := txStore.GetAbandonedTransactionsByBatch(tests.Context(t), ethClient.ConfiguredChainID(), enabledAddrs, 0, 10) require.NoError(t, err) require.Empty(t, txes) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `_ = mustInsertInProgressEthTxWithAttempt(t, txStore, 123, enabled)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `_ = mustCreateUnstartedGeneratedTx(t, txStore, enabled, ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("get in progress, unstarted, and unconfirmed eth transactions", func(t *testing.T) { inProgressTx := mustInsertInProgressEthTxWithAttempt(t, txStore, 123, fromAddress) unstartedTx := mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, ethClient.ConfiguredChainID()) txes, err := txStore.GetAbandonedTransactionsByBatch(tests.Context(t), ethClient.ConfiguredChainID(), enabledAddrs, 0, 10) require.NoError(t, err) require.Len(t, txes, 2) for _, tx := range txes { require.True(t, tx.ID == inProgressTx.ID || tx.ID == unstartedTx.ID) } })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `_ = mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `allTxes = append(allTxes, batchTxes...)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("no transaction", func(t *testing.T) { tx, err := txStore.GetTxByID(tests.Context(t), int64(0)) require.NoError(t, err) require.Nil(t, tx) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("gets 0 fatal eth transactions", func(t *testing.T) { txes, err := txStore.GetFatalTransactions(tests.Context(t)) require.NoError(t, err) require.Empty(t, txes) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("no in progress eth transaction", func(t *testing.T) { exists, err := txStore.HasInProgressTransaction(tests.Context(t), fromAddress, ethClient.ConfiguredChainID()) require.NoError(t, err) require.False(t, exists) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `mustInsertInProgressEthTxWithAttempt(t, txStore, 123, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 0, otherAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 0, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 1, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 2, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 0, fromAddress1)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 1, fromAddress2)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 2, fromAddress3)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `mustCreateUnstartedGeneratedTx(t, txStore, otherAddress, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 2, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("with no eth_txes returns nil", func(t *testing.T) { err := txStore.CheckTxQueueCapacity(tests.Context(t), fromAddress, maxUnconfirmedTransactions, testutils.FixtureChainID) require.NoError(t, err) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `mustCreateUnstartedTx(t, txStore, otherAddress, toAddress, encodedPayload, feeLimit, value, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("with eth_txes from another address returns nil", func(t *testing.T) { err := txStore.CheckTxQueueCapacity(tests.Context(t), fromAddress, maxUnconfirmedTransactions, testutils.FixtureChainID) require.NoError(t, err) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `mustInsertFatalErrorEthTx(t, txStore, otherAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("ignores fatally_errored transactions", func(t *testing.T) { err := txStore.CheckTxQueueCapacity(tests.Context(t), fromAddress, maxUnconfirmedTransactions, testutils.FixtureChainID) require.NoError(t, err) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `mustInsertInProgressEthTxWithAttempt(t, txStore, evmtypes.Nonce(n), fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `n++` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, n, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `n++` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("unconfirmed and in_progress transactions do not count", func(t *testing.T) { err := txStore.CheckTxQueueCapacity(tests.Context(t), fromAddress, 1, testutils.FixtureChainID) require.NoError(t, err) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, n, 42, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `n++` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("with many confirmed eth_txes from the same address returns nil", func(t *testing.T) { err := txStore.CheckTxQueueCapacity(tests.Context(t), fromAddress, maxUnconfirmedTransactions, testutils.FixtureChainID) require.NoError(t, err) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, feeLimit, value, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("with fewer unstarted eth_txes than limit returns nil", func(t *testing.T) { err := txStore.CheckTxQueueCapacity(tests.Context(t), fromAddress, maxUnconfirmedTransactions, testutils.FixtureChainID) require.NoError(t, err) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, feeLimit, value, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("with equal or more unstarted eth_txes than limit returns error", func(t *testing.T) { err := txStore.CheckTxQueueCapacity(tests.Context(t), fromAddress, maxUnconfirmedTransactions, testutils.FixtureChainID) require.Error(t, err) require.Contains(t, err.Error(), fmt.Sprintf("cannot create transaction; too many unstarted transactions in the queue (2/%d). WARNING: Hitting EVM.Transactions.MaxQueued", maxUnconfirmedTransactions)) mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, feeLimit, value, testutils.FixtureChainID) err = txStore.CheckTxQueueCapacity(tests.Context(t), fromAddress, maxUnconfirmedTransactions, testutils.FixtureChainID) require.Error(t, err) require.Contains(t, err.Error(), fmt.Sprintf("cannot create transaction; too many unstarted transactions in the queue (3/%d). WARNING: Hitting EVM.Transactions.MaxQueued", maxUnconfirmedTransactions)) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, feeLimit, value, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `err = txStore.CheckTxQueueCapacity(tests.Context(t), fromAddress, maxUnconfirmedTransactions, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("with different chain ID ignores txes", func(t *testing.T) { err := txStore.CheckTxQueueCapacity(tests.Context(t), fromAddress, maxUnconfirmedTransactions, big.NewInt(42)) require.NoError(t, err) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("with queue under capacity inserts eth_tx", func(t *testing.T) { subject := uuid.New() strategy := newMockTxStrategy(t) strategy.On("Subject").Return(uuid.NullUUID{UUID: subject, Valid: true}) etx, err := txStore.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, Meta: nil, Strategy: strategy, }, ethClient.ConfiguredChainID()) assert.NoError(t, err) assert.Greater(t, etx.ID, int64(0)) assert.Equal(t, etx.State, txmgrcommon.TxUnstarted) assert.Equal(t, gasLimit, etx.FeeLimit) assert.Equal(t, fromAddress, etx.FromAddress) assert.Equal(t, toAddress, etx.ToAddress) assert.Equal(t, payload, etx.EncodedPayload) assert.Equal(t, big.Int(assets.NewEthValue(0)), etx.Value) assert.Equal(t, subject, etx.Subject.UUID) cltest.AssertCount(t, db, "evm.txes", 1) var dbEthTx txmgr.DbEthTx require.NoError(t, db.Get(&dbEthTx, `SELECT * FROM evm.txes ORDER BY id ASC LIMIT 1`)) assert.Equal(t, dbEthTx.State, txmgrcommon.TxUnstarted) assert.Equal(t, gasLimit, dbEthTx.GasLimit) assert.Equal(t, fromAddress, dbEthTx.FromAddress) assert.Equal(t, toAddress, dbEthTx.ToAddress) assert.Equal(t, payload, dbEthTx.EncodedPayload) assert.Equal(t, assets.NewEthValue(0), dbEthTx.Value) assert.Equal(t, subject, dbEthTx.Subject.UUID) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `strategy.On("Subject").Return(uuid.NullUUID{UUID: subject, Valid: true})` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `cltest.AssertCount(t, db, "evm.txes", 1)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("doesn't insert eth_tx if a matching tx already exists for that pipeline_task_run_id", func(t *testing.T) { id := uuid.New() txRequest := txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: testutils.NewAddress(), EncodedPayload: []byte{1, 2, 3}, FeeLimit: 21000, PipelineTaskRunID: &id, Strategy: txmgrcommon.NewSendEveryStrategy(), } tx1, err := txStore.CreateTransaction(tests.Context(t), txRequest, ethClient.ConfiguredChainID()) assert.NoError(t, err) tx2, err := txStore.CreateTransaction(tests.Context(t), txRequest, ethClient.ConfiguredChainID()) assert.NoError(t, err) assert.Equal(t, tx1.GetID(), tx2.GetID()) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `strategy.On("Subject").Return(uuid.NullUUID{UUID: subject, Valid: true})` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `cltest.AssertCount(t, db, "evm.txes", 3)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `evmtest.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `t.Run("does not prune if queue has not exceeded capacity-1", func(t *testing.T) { subject1 := uuid.New() strategy1 := txmgrcommon.NewDropOldestStrategy(subject1, uint32(5)) for i := 0; i < 5; i++ { mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, testutils.FixtureChainID, txRequestWithStrategy(strategy1)) } AssertCountPerSubject(t, txStore, int64(4), subject1) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, testutils.FixtureChainID, txRequestWithStrategy(strategy1))` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `AssertCountPerSubject(t, txStore, int64(4), subject1)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, testutils.FixtureChainID, txRequestWithStrategy(strategy2))` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `AssertCountPerSubject(t, txStore, int64(2), subject2)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 0, 1, from)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 1, 2, from)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewLegacyEthTxAttempt(t, tx2.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewWeiI(3)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Get(&count, `SELECT count(*) FROM evm.txes`)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.TransactionsWithAttempts(ctx, 0, 100)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.TransactionsWithAttempts(ctx, 0, 1)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Nonce(1)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 0, 1, from)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 1, 2, from)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewLegacyEthTxAttempt(t, tx2.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewWeiI(3)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Get(&count, `SELECT count(*) FROM evm.txes`)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Transactions(ctx, 0, 100)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKey(t, keyStore.Eth())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("InsertTx", func(t *testing.T) { etx = cltest.NewEthTx(fromAddress) require.NoError(t, orm.InsertTx(ctx, &etx)) assert.Greater(t, int(etx.ID), 0) cltest.AssertCount(t, db, "evm.txes", 1) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewEthTx(fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.AssertCount(t, db, "evm.txes", 1)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("InsertTxAttempt", func(t *testing.T) { attemptD = cltest.NewDynamicFeeEthTxAttempt(t, etx.ID) require.NoError(t, orm.InsertTxAttempt(ctx, &attemptD)) assert.Greater(t, int(attemptD.ID), 0) cltest.AssertCount(t, db, "evm.tx_attempts", 1) attemptL = cltest.NewLegacyEthTxAttempt(t, etx.ID) attemptL.State = txmgrtypes.TxAttemptBroadcast attemptL.TxFee = gas.EvmFee{Legacy: assets.NewWeiI(42)} require.NoError(t, orm.InsertTxAttempt(ctx, &attemptL)) assert.Greater(t, int(attemptL.ID), 0) cltest.AssertCount(t, db, "evm.tx_attempts", 2) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewDynamicFeeEthTxAttempt(t, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.AssertCount(t, db, "evm.tx_attempts", 1)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewLegacyEthTxAttempt(t, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewWeiI(42)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.AssertCount(t, db, "evm.tx_attempts", 2)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("InsertReceipt", func(t *testing.T) { r = newEthReceipt(42, utils.NewHash(), attemptD.Hash, 0x1) id, err := orm.InsertReceipt(ctx, &r.Receipt) r.ID = id require.NoError(t, err) assert.Greater(t, int(r.ID), 0) cltest.AssertCount(t, db, "evm.receipts", 1) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.InsertReceipt(ctx, &r.Receipt)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.AssertCount(t, db, "evm.receipts", 1)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("FindTxWithAttempts", func(t *testing.T) { var err error etx, err = orm.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) require.Len(t, etx.TxAttempts, 2) assert.Equal(t, etx.TxAttempts[0].ID, attemptD.ID) assert.Equal(t, etx.TxAttempts[1].ID, attemptL.ID) require.Len(t, etx.TxAttempts[0].Receipts, 1) require.Len(t, etx.TxAttempts[1].Receipts, 0) assert.Equal(t, r.BlockHash, etx.TxAttempts[0].Receipts[0].GetBlockHash()) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("FindTxByHash", func(t *testing.T) { foundEtx, err := orm.FindTxByHash(ctx, attemptD.Hash) require.NoError(t, err) assert.Equal(t, etx.ID, foundEtx.ID) assert.Equal(t, etx.ChainID, foundEtx.ChainID) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxByHash(ctx, attemptD.Hash)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxAttemptsByTxIDs(ctx, []int64{etx.ID})` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, orm, 0, 1, from)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, orm, 1, 2, from)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewLegacyEthTxAttempt(t, tx2.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewWeiI(3)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.InsertReceipt(ctx, &r.Receipt)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertUnconfirmedEthTx(t, orm, 3, from)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, orm, 4, from)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Get(&count, `SELECT count(*) FROM evm.txes`)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Get(&count, `SELECT count(*) FROM evm.tx_attempts`)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxAttemptConfirmedByTxIDs(ctx, []int64{tx1.ID, tx2.ID})` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("returns nothing if there are no transactions", func(t *testing.T) { olderThan := time.Now() attempts, err := txStore.FindTxAttemptsRequiringResend(tests.Context(t), olderThan, 10, testutils.FixtureChainID, fromAddress) require.NoError(t, err) assert.Len(t, attempts, 0) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Now()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxAttemptsRequiringResend(tests.Context(t), olderThan, 10, testutils.FixtureChainID, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 1, fromAddress, time.Unix(1616509200, 0))` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Unix(1616509200, 0)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Unix(1616509400, 0)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 0, fromAddress, time.Unix(1616509100, 0))` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Unix(1616509100, 0)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 2, fromAddress, time.Unix(1616509300, 0))` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Unix(1616509300, 0)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewDynamicFeeEthTxAttempt(t, etxs[3].ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewWeiI(10)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewWeiI(20)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewDynamicFeeEthTxAttempt(t, etxs[3].ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewWeiI(30)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewWeiI(40)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewDynamicFeeEthTxAttempt(t, etxs[3].ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewWeiI(20)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewWeiI(30)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("returns nothing if there are transactions from a different key", func(t *testing.T) { olderThan := time.Now() attempts, err := txStore.FindTxAttemptsRequiringResend(tests.Context(t), olderThan, 10, testutils.FixtureChainID, utils.RandomAddress()) require.NoError(t, err) assert.Len(t, attempts, 0) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Now()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxAttemptsRequiringResend(tests.Context(t), olderThan, 10, testutils.FixtureChainID, utils.RandomAddress())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.RandomAddress()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("returns the highest price attempt for each transaction that was last broadcast before or on the given time", func(t *testing.T) { olderThan := time.Unix(1616509200, 0) attempts, err := txStore.FindTxAttemptsRequiringResend(tests.Context(t), olderThan, 0, testutils.FixtureChainID, fromAddress) require.NoError(t, err) assert.Len(t, attempts, 2) assert.Equal(t, attempt1_2.ID, attempts[0].ID) assert.Equal(t, etxs[1].TxAttempts[0].ID, attempts[1].ID) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Unix(1616509200, 0)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxAttemptsRequiringResend(tests.Context(t), olderThan, 0, testutils.FixtureChainID, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("returns the highest price attempt for EIP-1559 transactions", func(t *testing.T) { olderThan := time.Unix(1616509400, 0) attempts, err := txStore.FindTxAttemptsRequiringResend(tests.Context(t), olderThan, 0, testutils.FixtureChainID, fromAddress) require.NoError(t, err) assert.Len(t, attempts, 4) assert.Equal(t, attempt4_4.ID, attempts[3].ID) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Unix(1616509400, 0)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxAttemptsRequiringResend(tests.Context(t), olderThan, 0, testutils.FixtureChainID, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Unix(1616509200, 0)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxAttemptsRequiringResend(tests.Context(t), olderThan, 1, testutils.FixtureChainID, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKey(t, keyStore.Eth())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("does not update when broadcast_at is NULL", func(t *testing.T) { t.Parallel() ctx := tests.Context(t) etx := mustCreateUnstartedGeneratedTx(t, orm, fromAddress, testutils.FixtureChainID) var nullTime *time.Time assert.Equal(t, nullTime, etx.BroadcastAt) currTime := time.Now() err := orm.UpdateBroadcastAts(tests.Context(t), currTime, []int64{etx.ID}) require.NoError(t, err) etx, err = orm.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Equal(t, nullTime, etx.BroadcastAt) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Now()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.UpdateBroadcastAts(tests.Context(t), currTime, []int64{etx.ID})` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Now()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewEthTx(fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.InsertTx(ctx, &etx)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Date(2077, 8, 14, 10, 0, 0, 0, time.UTC)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.UpdateBroadcastAts(ctx, time2, []int64{etx.ID})` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 0, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("saves block num to unconfirmed evm.tx_attempts without one", func(t *testing.T) { // Do the thing require.NoError(t, txStore.SetBroadcastBeforeBlockNum(tests.Context(t), headNum, chainID)) etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) require.Len(t, etx.TxAttempts, 1) attempt := etx.TxAttempts[0] assert.Equal(t, int64(9000), *attempt.BroadcastBeforeBlockNum) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("does not change evm.tx_attempts that already have BroadcastBeforeBlockNum set", func(t *testing.T) { n := int64(42) attempt := newBroadcastLegacyEthTxAttempt(t, etx.ID, 2) attempt.BroadcastBeforeBlockNum = &n require.NoError(t, txStore.InsertTxAttempt(ctx, &attempt)) // Do the thing require.NoError(t, txStore.SetBroadcastBeforeBlockNum(tests.Context(t), headNum, chainID)) etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) require.Len(t, etx.TxAttempts, 2) attempt = etx.TxAttempts[0] assert.Equal(t, int64(42), *attempt.BroadcastBeforeBlockNum) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 1, fromAddress, cfg.EVM().ChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 0, fromAddress, testutils.SimulatedChainID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxWithAttempts(ctx, etxThisChain.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxWithAttempts(ctx, etxOtherChain.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Unix(1616509100, 0)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxAttemptsConfirmedMissingReceipt(tests.Context(t), ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Unix(1616509100, 0)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxWithAttempts(ctx, etx0.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Unix(1616509100, 0)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxAttemptsRequiringReceiptFetch(tests.Context(t), ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Unix(1616509100, 0)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewInt(42)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.SaveFetchedReceipts(tests.Context(t), []*evmtypes.Receipt{&txmReceipt}, txmgrcommon.TxConfirmed, nil, ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxWithAttempts(ctx, etx0.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertUnconfirmedEthTx(t, txStore, 0, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MarkAllConfirmedMissingReceipt(tests.Context(t), ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxWithAttempts(ctx, etx0.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("loads eth transaction", func(t *testing.T) { // insert etx with attempt etx := cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, int64(7), fromAddress) // create unloaded attempt unloadedAttempt := txmgr.TxAttempt{TxID: etx.ID} // uninitialized EthTx assert.Equal(t, int64(0), unloadedAttempt.Tx.ID) attempts := []txmgr.TxAttempt{unloadedAttempt} err := txStore.PreloadTxes(tests.Context(t), attempts) require.NoError(t, err) assert.Equal(t, etx.ID, attempts[0].Tx.ID) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, int64(7), fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.PreloadTxes(tests.Context(t), attempts)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.PreloadTxes(tests.Context(t), emptyAttempts)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.GetInProgressTxAttempts(tests.Context(t), fromAddress, ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustExec(t, db, `SET CONSTRAINTS fk_pipeline_runs_pruning_key DEFERRED`)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustExec(t, db, `SET CONSTRAINTS pipeline_runs_pipeline_spec_id_fkey DEFERRED`)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertPipelineRun(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertUnfinishedPipelineTaskRun(t, db, run1.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustExec(t, db, `UPDATE pipeline_runs SET state = 'suspended' WHERE id = $1`, run1.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 3, 1, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustExec(t, db, `UPDATE evm.txes SET meta='{"FailOnRevert": true}'`)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustExec(t, db, `UPDATE evm.txes SET pipeline_task_run_id = $1, min_confirmations = $2, signal_callback = TRUE WHERE id = $3`, &tr1.ID, minConfirmations, etx1.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertPipelineRunWithStatus(t, db, 0, pipeline.RunStatusCompleted, 0)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertUnfinishedPipelineTaskRun(t, db, run2.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 4, 1, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustExec(t, db, `UPDATE evm.txes SET meta='{"FailOnRevert": false}'`)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustExec(t, db, `UPDATE evm.txes SET pipeline_task_run_id = $1, min_confirmations = $2, signal_callback = TRUE, callback_completed = TRUE WHERE id = $3`, &tr2.ID, minConfirmations, etx2.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertPipelineRun(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertUnfinishedPipelineTaskRun(t, db, run3.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustExec(t, db, `UPDATE pipeline_runs SET state = 'suspended' WHERE id = $1`, run3.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 5, 1, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustExec(t, db, `UPDATE evm.txes SET meta='{"FailOnRevert": false}'`)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustExec(t, db, `UPDATE evm.txes SET pipeline_task_run_id = $1, min_confirmations = $2, signal_callback = TRUE WHERE id = $3`, &tr3.ID, minConfirmations, etx3.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 6, 1, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustExec(t, db, `UPDATE evm.txes SET min_confirmations = $1 WHERE id = $2`, minConfirmations, etx4.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 7, 1, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustExec(t, db, `UPDATE evm.txes SET min_confirmations = $1 WHERE id = $2`, minConfirmations, etx5.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxesPendingCallback(tests.Context(t), head.Number, ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("returns nil if no results", func(t *testing.T) { idempotencyKey := "777" etx, err := txStore.FindTxWithIdempotencyKey(tests.Context(t), idempotencyKey, big.NewInt(0)) require.NoError(t, err) assert.Nil(t, etx) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxWithIdempotencyKey(tests.Context(t), idempotencyKey, big.NewInt(0))` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewInt(0)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewInt(0)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxWithIdempotencyKey(tests.Context(t), idempotencyKey, big.NewInt(0))` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewInt(0)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("returns nil if no results", func(t *testing.T) { etx, err := txStore.FindTxWithSequence(tests.Context(t), fromAddress, evmtypes.Nonce(777)) require.NoError(t, err) assert.Nil(t, etx) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxWithSequence(tests.Context(t), fromAddress, evmtypes.Nonce(777))` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Nonce(777)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 777, 1, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxWithSequence(tests.Context(t), fromAddress, evmtypes.Nonce(777))` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Nonce(777)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.UpdateTxForRebroadcast(tests.Context(t), etx, attempt)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("confirmed tx not past finality_depth", func(t *testing.T) { confirmedAddr := cltest.MustGenerateRandomKey(t).Address tx := mustInsertConfirmedEthTxWithReceipt(t, txStore, confirmedAddr, 123, 1) finalized, err := txStore.IsTxFinalized(tests.Context(t), 2, tx.ID, ethClient.ConfiguredChainID()) require.NoError(t, err) require.False(t, finalized) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustGenerateRandomKey(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.IsTxFinalized(tests.Context(t), 2, tx.ID, ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustGenerateRandomKey(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.IsTxFinalized(tests.Context(t), 10, tx.ID, ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTransactionsConfirmedInBlockRange(tests.Context(t), head.Number, 8, ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("no unconfirmed eth txes", func(t *testing.T) { broadcastAt, err := txStore.FindEarliestUnconfirmedBroadcastTime(tests.Context(t), ethClient.ConfiguredChainID()) require.NoError(t, err) require.False(t, broadcastAt.Valid) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindEarliestUnconfirmedBroadcastTime(tests.Context(t), ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertUnconfirmedEthTx(t, txStore, 123, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindEarliestUnconfirmedBroadcastTime(tests.Context(t), ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("no earliest unconfirmed tx block", func(t *testing.T) { earliestBlock, err := txStore.FindEarliestUnconfirmedTxAttemptBlock(tests.Context(t), ethClient.ConfiguredChainID()) require.NoError(t, err) require.False(t, earliestBlock.Valid) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindEarliestUnconfirmedTxAttemptBlock(tests.Context(t), ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Now()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Now()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Add(time.Minute)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.UpdateTxsUnconfirmed(tests.Context(t), []int64{tx.ID})` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindEarliestUnconfirmedTxAttemptBlock(tests.Context(t), ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ParseDuration("5s")` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Now()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.SaveInsufficientFundsAttempt(tests.Context(t), defaultDuration, &etx.TxAttempts[0], now)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxAttempt(ctx, etx.TxAttempts[0].Hash)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ParseDuration("5s")` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Now()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.SaveSentAttempt(tests.Context(t), defaultDuration, &etx.TxAttempts[0], now)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxAttempt(ctx, etx.TxAttempts[0].Hash)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ParseDuration("5s")` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Now()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.SaveConfirmedMissingReceiptAttempt(tests.Context(t), defaultDuration, &etx.TxAttempts[0], now)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.DeleteInProgressAttempt(tests.Context(t), etx.TxAttempts[0])` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxAttempt(ctx, attempt.Hash)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("saves new in_progress attempt if attempt is new", func(t *testing.T) { etx := cltest.MustInsertUnconfirmedEthTx(t, txStore, 1, fromAddress) attempt := cltest.NewLegacyEthTxAttempt(t, etx.ID) require.Equal(t, int64(0), attempt.ID) err := txStore.SaveInProgressAttempt(tests.Context(t), &attempt) require.NoError(t, err) attemptResult, err := txStore.FindTxAttempt(ctx, attempt.Hash) require.NoError(t, err) assert.Equal(t, txmgrtypes.TxAttemptInProgress, attemptResult.State) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertUnconfirmedEthTx(t, txStore, 1, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewLegacyEthTxAttempt(t, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.SaveInProgressAttempt(tests.Context(t), &attempt)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxAttempt(ctx, attempt.Hash)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.SaveInProgressAttempt(tests.Context(t), &attempt)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxAttempt(ctx, attempt.Hash)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.SetBroadcastBeforeBlockNum(tests.Context(t), currentBlockNum, ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.SetBroadcastBeforeBlockNum(tests.Context(t), currentBlockNum+1, ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxsRequiringGasBump(tests.Context(t), fromAddress, newBlock, gasBumpThreshold, int64(0), ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 2, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewLegacyEthTxAttempt(t, etx3.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewWeiI(100)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 3, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 4, 100, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("returns all eth_txes with at least one attempt that is in insufficient_eth state", func(t *testing.T) { etxs, err := txStore.FindTxsRequiringResubmissionDueToInsufficientFunds(tests.Context(t), fromAddress, testutils.FixtureChainID) require.NoError(t, err) assert.Len(t, etxs, 3) assert.Equal(t, *etx1.Sequence, *etxs[0].Sequence) assert.Equal(t, etx1.ID, etxs[0].ID) assert.Equal(t, *etx2.Sequence, *etxs[1].Sequence) assert.Equal(t, etx2.ID, etxs[1].ID) assert.Equal(t, *etx3.Sequence, *etxs[2].Sequence) assert.Equal(t, etx3.ID, etxs[2].ID) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxsRequiringResubmissionDueToInsufficientFunds(tests.Context(t), fromAddress, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("does not return eth_txes with different chain ID", func(t *testing.T) { etxs, err := txStore.FindTxsRequiringResubmissionDueToInsufficientFunds(tests.Context(t), fromAddress, big.NewInt(42)) require.NoError(t, err) assert.Len(t, etxs, 0) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxsRequiringResubmissionDueToInsufficientFunds(tests.Context(t), fromAddress, big.NewInt(42))` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewInt(42)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustExec(t, db, `UPDATE evm.txes SET state='confirmed' WHERE id = $1`, etx1.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustExec(t, db, `UPDATE evm.txes SET state='fatal_error', nonce=NULL, error='foo', broadcast_at=NULL, initial_broadcast_at=NULL WHERE id = $1`, etx2.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxsRequiringResubmissionDueToInsufficientFunds(tests.Context(t), fromAddress, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("successfully mark errored transactions", func(t *testing.T) { etx := mustInsertConfirmedMissingReceiptEthTxWithLegacyAttempt(t, txStore, 1, 7, time.Now(), fromAddress) err := txStore.MarkOldTxesMissingReceiptAsErrored(tests.Context(t), 10, 2, ethClient.ConfiguredChainID()) require.NoError(t, err) etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxFatalError, etx.State) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Now()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MarkOldTxesMissingReceiptAsErrored(tests.Context(t), 10, 2, ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Now()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MarkOldTxesMissingReceiptAsErrored(tests.Context(t), 10, 2, ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("load eth tx attempt", func(t *testing.T) { etx := mustInsertConfirmedMissingReceiptEthTxWithLegacyAttempt(t, txStore, 1, 7, time.Now(), fromAddress) etx.TxAttempts = []txmgr.TxAttempt{} err := txStore.LoadTxesAttempts(ctx, []*txmgr.Tx{&etx}) require.NoError(t, err) assert.Len(t, etx.TxAttempts, 1) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Now()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.LoadTxesAttempts(ctx, []*txmgr.Tx{&etx})` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Now()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewDynamicFeeEthTxAttempt(t, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FromTxAttempt(&newAttempt)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.BeginTx(ctx, nil)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.DataSource(db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.BindNamed(insertEthTxAttemptSQL, dbAttempt)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ExecContext(ctx, query, args...)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.LoadTxesAttempts(ctx, []*txmgr.Tx{&etx})` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Commit()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.LoadTxesAttempts(ctx, []*txmgr.Tx{&etx})` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewDynamicFeeEthTxAttempt(t, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.SaveReplacementInProgressAttempt(tests.Context(t), oldAttempt, &newAttempt)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("cannot find unstarted tx", func(t *testing.T) { mustInsertInProgressEthTxWithAttempt(t, txStore, 13, fromAddress) resultEtx, err := txStore.FindNextUnstartedTransactionFromAddress(tests.Context(t), fromAddress, ethClient.ConfiguredChainID()) assert.ErrorIs(t, err, sql.ErrNoRows) assert.Nil(t, resultEtx) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindNextUnstartedTransactionFromAddress(tests.Context(t), fromAddress, ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindNextUnstartedTransactionFromAddress(tests.Context(t), fromAddress, ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.StringFrom("no more toilet paper")` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.UpdateTxFatalError(tests.Context(t), &etx)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Now()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.UpdateTxAttemptInProgressToBroadcast(tests.Context(t), &etx, attempt, txmgrtypes.TxAttemptBroadcast)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxAttempt(ctx, attempt.Hash)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Nonce(123)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("update successful", func(t *testing.T) { etx := mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, testutils.FixtureChainID) etx.Sequence = &nonce attempt := cltest.NewLegacyEthTxAttempt(t, etx.ID) err := txStore.UpdateTxUnstartedToInProgress(tests.Context(t), &etx, &attempt) require.NoError(t, err) etx, err = txStore.FindTxWithAttempts(ctx, etx.ID) require.NoError(t, err) assert.Equal(t, txmgrcommon.TxInProgress, etx.State) assert.Len(t, etx.TxAttempts, 1) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewLegacyEthTxAttempt(t, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.UpdateTxUnstartedToInProgress(tests.Context(t), &etx, &attempt)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxWithAttempts(ctx, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("update fails because tx is removed", func(t *testing.T) { etx := mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, testutils.FixtureChainID) etx.Sequence = &nonce attempt := cltest.NewLegacyEthTxAttempt(t, etx.ID) _, err := db.ExecContext(ctx, "DELETE FROM evm.txes WHERE id = $1", etx.ID) require.NoError(t, err) err = txStore.UpdateTxUnstartedToInProgress(tests.Context(t), &etx, &attempt) require.ErrorContains(t, err, "tx removed") })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewLegacyEthTxAttempt(t, etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ExecContext(ctx, "DELETE FROM evm.txes WHERE id = $1", etx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.UpdateTxUnstartedToInProgress(tests.Context(t), &etx, &attempt)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("update replaces abandoned tx with same hash", func(t *testing.T) { etx := mustInsertInProgressEthTxWithAttempt(t, txStore, nonce, fromAddress) require.Len(t, etx.TxAttempts, 1) zero := commonconfig.MustNewDuration(time.Duration(0)) evmCfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].Chain.Transactions.ReaperInterval = zero c.EVM[0].Chain.Transactions.ReaperThreshold = zero c.EVM[0].Chain.Transactions.ResendAfterThreshold = zero }) ccfg := evmtest.NewChainScopedConfig(t, evmCfg) evmTxmCfg := txmgr.NewEvmTxmConfig(ccfg.EVM()) ec := evmtest.NewEthClientMockWithDefaultChain(t) txMgr := txmgr.NewEvmTxm(ec.ConfiguredChainID(), evmTxmCfg, ccfg.EVM().Transactions(), nil, logger.Test(t), nil, nil, nil, txStore, nil, nil, nil, nil) err := txMgr.XXXTestAbandon(fromAddress) // mark transaction as abandoned require.NoError(t, err) etx2 := mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, testutils.FixtureChainID) etx2.Sequence = &nonce attempt2 := cltest.NewLegacyEthTxAttempt(t, etx2.ID) attempt2.Hash = etx.TxAttempts[0].Hash // Even though this will initially fail due to idx_eth_tx_attempts_hash constraint, because the conflicting tx has been abandoned // it should succeed after removing the abandoned attempt and retrying the insert err = txStore.UpdateTxUnstartedToInProgress(tests.Context(t), &etx2, &attempt2) require.NoError(t, err) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustNewDuration(time.Duration(0))` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Duration(0)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].Chain.Transactions.ReaperInterval = zero c.EVM[0].Chain.Transactions.ReaperThreshold = zero c.EVM[0].Chain.Transactions.ResendAfterThreshold = zero })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewChainScopedConfig(t, evmCfg)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewEvmTxmConfig(ccfg.EVM())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewEvmTxm(ec.ConfiguredChainID(), evmTxmCfg, ccfg.EVM().Transactions(), nil, logger.Test(t), nil, nil, nil, txStore, nil, nil, nil, nil)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Transactions()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.XXXTestAbandon(fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewLegacyEthTxAttempt(t, etx2.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.UpdateTxUnstartedToInProgress(tests.Context(t), &etx2, &attempt2)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.UpdateTxUnstartedToInProgress(tests.Context(t), &etx, &etx.TxAttempts[0])` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("gets 0 in progress eth transaction", func(t *testing.T) { etxResult, err := txStore.GetTxInProgress(tests.Context(t), fromAddress) require.NoError(t, err) require.Nil(t, etxResult) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.GetTxInProgress(tests.Context(t), fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.GetTxInProgress(tests.Context(t), fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("get 0 abandoned transactions", func(t *testing.T) { txes, err := txStore.GetAbandonedTransactionsByBatch(tests.Context(t), ethClient.ConfiguredChainID(), enabledAddrs, 0, 10) require.NoError(t, err) require.Empty(t, txes) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.GetAbandonedTransactionsByBatch(tests.Context(t), ethClient.ConfiguredChainID(), enabledAddrs, 0, 10)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("do not return enabled addresses", func(t *testing.T) { _ = mustInsertInProgressEthTxWithAttempt(t, txStore, 123, enabled) _ = mustCreateUnstartedGeneratedTx(t, txStore, enabled, ethClient.ConfiguredChainID()) txes, err := txStore.GetAbandonedTransactionsByBatch(tests.Context(t), ethClient.ConfiguredChainID(), enabledAddrs, 0, 10) require.NoError(t, err) require.Empty(t, txes) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.GetAbandonedTransactionsByBatch(tests.Context(t), ethClient.ConfiguredChainID(), enabledAddrs, 0, 10)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("get in progress, unstarted, and unconfirmed eth transactions", func(t *testing.T) { inProgressTx := mustInsertInProgressEthTxWithAttempt(t, txStore, 123, fromAddress) unstartedTx := mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, ethClient.ConfiguredChainID()) txes, err := txStore.GetAbandonedTransactionsByBatch(tests.Context(t), ethClient.ConfiguredChainID(), enabledAddrs, 0, 10) require.NoError(t, err) require.Len(t, txes, 2) for _, tx := range txes { require.True(t, tx.ID == inProgressTx.ID || tx.ID == unstartedTx.ID) } })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.GetAbandonedTransactionsByBatch(tests.Context(t), ethClient.ConfiguredChainID(), enabledAddrs, 0, 10)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Batch(func(offset, limit uint) (count uint, err error) { batchTxes, err := txStore.GetAbandonedTransactionsByBatch(tests.Context(t), ethClient.ConfiguredChainID(), enabledAddrs, offset, limit) require.NoError(t, err) allTxes = append(allTxes, batchTxes...) return uint(len(batchTxes)), nil }, batchSize)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.GetAbandonedTransactionsByBatch(tests.Context(t), ethClient.ConfiguredChainID(), enabledAddrs, offset, limit)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("no transaction", func(t *testing.T) { tx, err := txStore.GetTxByID(tests.Context(t), int64(0)) require.NoError(t, err) require.Nil(t, tx) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.GetTxByID(tests.Context(t), int64(0))` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.GetTxByID(tests.Context(t), insertedTx.ID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("gets 0 fatal eth transactions", func(t *testing.T) { txes, err := txStore.GetFatalTransactions(tests.Context(t)) require.NoError(t, err) require.Empty(t, txes) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.GetFatalTransactions(tests.Context(t))` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.GetFatalTransactions(tests.Context(t))` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("no in progress eth transaction", func(t *testing.T) { exists, err := txStore.HasInProgressTransaction(tests.Context(t), fromAddress, ethClient.ConfiguredChainID()) require.NoError(t, err) require.False(t, exists) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.HasInProgressTransaction(tests.Context(t), fromAddress, ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.HasInProgressTransaction(tests.Context(t), fromAddress, ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 0, otherAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 0, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 1, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 2, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.CountUnconfirmedTransactions(tests.Context(t), fromAddress, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 0, fromAddress1)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 1, fromAddress2)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 2, fromAddress3)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.CountTransactionsByState(tests.Context(t), txmgrcommon.TxUnconfirmed, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 2, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.CountUnstartedTransactions(tests.Context(t), fromAddress, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewAddress()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Int(assets.NewEthValue(142))` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewEthValue(142)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("with no eth_txes returns nil", func(t *testing.T) { err := txStore.CheckTxQueueCapacity(tests.Context(t), fromAddress, maxUnconfirmedTransactions, testutils.FixtureChainID) require.NoError(t, err) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.CheckTxQueueCapacity(tests.Context(t), fromAddress, maxUnconfirmedTransactions, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("with eth_txes from another address returns nil", func(t *testing.T) { err := txStore.CheckTxQueueCapacity(tests.Context(t), fromAddress, maxUnconfirmedTransactions, testutils.FixtureChainID) require.NoError(t, err) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.CheckTxQueueCapacity(tests.Context(t), fromAddress, maxUnconfirmedTransactions, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("ignores fatally_errored transactions", func(t *testing.T) { err := txStore.CheckTxQueueCapacity(tests.Context(t), fromAddress, maxUnconfirmedTransactions, testutils.FixtureChainID) require.NoError(t, err) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.CheckTxQueueCapacity(tests.Context(t), fromAddress, maxUnconfirmedTransactions, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Nonce(n)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, n, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("unconfirmed and in_progress transactions do not count", func(t *testing.T) { err := txStore.CheckTxQueueCapacity(tests.Context(t), fromAddress, 1, testutils.FixtureChainID) require.NoError(t, err) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.CheckTxQueueCapacity(tests.Context(t), fromAddress, 1, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, n, 42, fromAddress)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("with many confirmed eth_txes from the same address returns nil", func(t *testing.T) { err := txStore.CheckTxQueueCapacity(tests.Context(t), fromAddress, maxUnconfirmedTransactions, testutils.FixtureChainID) require.NoError(t, err) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.CheckTxQueueCapacity(tests.Context(t), fromAddress, maxUnconfirmedTransactions, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("with fewer unstarted eth_txes than limit returns nil", func(t *testing.T) { err := txStore.CheckTxQueueCapacity(tests.Context(t), fromAddress, maxUnconfirmedTransactions, testutils.FixtureChainID) require.NoError(t, err) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.CheckTxQueueCapacity(tests.Context(t), fromAddress, maxUnconfirmedTransactions, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("with equal or more unstarted eth_txes than limit returns error", func(t *testing.T) { err := txStore.CheckTxQueueCapacity(tests.Context(t), fromAddress, maxUnconfirmedTransactions, testutils.FixtureChainID) require.Error(t, err) require.Contains(t, err.Error(), fmt.Sprintf("cannot create transaction; too many unstarted transactions in the queue (2/%d). WARNING: Hitting EVM.Transactions.MaxQueued", maxUnconfirmedTransactions)) mustCreateUnstartedTx(t, txStore, fromAddress, toAddress, encodedPayload, feeLimit, value, testutils.FixtureChainID) err = txStore.CheckTxQueueCapacity(tests.Context(t), fromAddress, maxUnconfirmedTransactions, testutils.FixtureChainID) require.Error(t, err) require.Contains(t, err.Error(), fmt.Sprintf("cannot create transaction; too many unstarted transactions in the queue (3/%d). WARNING: Hitting EVM.Transactions.MaxQueued", maxUnconfirmedTransactions)) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.CheckTxQueueCapacity(tests.Context(t), fromAddress, maxUnconfirmedTransactions, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.CheckTxQueueCapacity(tests.Context(t), fromAddress, maxUnconfirmedTransactions, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("with different chain ID ignores txes", func(t *testing.T) { err := txStore.CheckTxQueueCapacity(tests.Context(t), fromAddress, maxUnconfirmedTransactions, big.NewInt(42)) require.NoError(t, err) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.CheckTxQueueCapacity(tests.Context(t), fromAddress, maxUnconfirmedTransactions, big.NewInt(42))` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewInt(42)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.CheckTxQueueCapacity(tests.Context(t), fromAddress, 0, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKey(t, kst.Eth())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewAddress()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("with queue under capacity inserts eth_tx", func(t *testing.T) { subject := uuid.New() strategy := newMockTxStrategy(t) strategy.On("Subject").Return(uuid.NullUUID{UUID: subject, Valid: true}) etx, err := txStore.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, Meta: nil, Strategy: strategy, }, ethClient.ConfiguredChainID()) assert.NoError(t, err) assert.Greater(t, etx.ID, int64(0)) assert.Equal(t, etx.State, txmgrcommon.TxUnstarted) assert.Equal(t, gasLimit, etx.FeeLimit) assert.Equal(t, fromAddress, etx.FromAddress) assert.Equal(t, toAddress, etx.ToAddress) assert.Equal(t, payload, etx.EncodedPayload) assert.Equal(t, big.Int(assets.NewEthValue(0)), etx.Value) assert.Equal(t, subject, etx.Subject.UUID) cltest.AssertCount(t, db, "evm.txes", 1) var dbEthTx txmgr.DbEthTx require.NoError(t, db.Get(&dbEthTx, `SELECT * FROM evm.txes ORDER BY id ASC LIMIT 1`)) assert.Equal(t, dbEthTx.State, txmgrcommon.TxUnstarted) assert.Equal(t, gasLimit, dbEthTx.GasLimit) assert.Equal(t, fromAddress, dbEthTx.FromAddress) assert.Equal(t, toAddress, dbEthTx.ToAddress) assert.Equal(t, payload, dbEthTx.EncodedPayload) assert.Equal(t, assets.NewEthValue(0), dbEthTx.Value) assert.Equal(t, subject, dbEthTx.Subject.UUID) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.New()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.On("Subject")` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Return(uuid.NullUUID{UUID: subject, Valid: true})` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, Meta: nil, Strategy: strategy, }, ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.AssertCount(t, db, "evm.txes", 1)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("doesn't insert eth_tx if a matching tx already exists for that pipeline_task_run_id", func(t *testing.T) { id := uuid.New() txRequest := txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: testutils.NewAddress(), EncodedPayload: []byte{1, 2, 3}, FeeLimit: 21000, PipelineTaskRunID: &id, Strategy: txmgrcommon.NewSendEveryStrategy(), } tx1, err := txStore.CreateTransaction(tests.Context(t), txRequest, ethClient.ConfiguredChainID()) assert.NoError(t, err) tx2, err := txStore.CreateTransaction(tests.Context(t), txRequest, ethClient.ConfiguredChainID()) assert.NoError(t, err) assert.Equal(t, tx1.GetID(), tx2.GetID()) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.New()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewAddress()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSendEveryStrategy()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.CreateTransaction(tests.Context(t), txRequest, ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.CreateTransaction(tests.Context(t), txRequest, ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.New()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.On("Subject")` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Return(uuid.NullUUID{UUID: subject, Valid: true})` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, Meta: nil, Strategy: strategy, SignalCallback: true, }, ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.AssertCount(t, db, "evm.txes", 3)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTxStore(db, logger.Test(t))` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKeyReturningState(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Run("does not prune if queue has not exceeded capacity-1", func(t *testing.T) { subject1 := uuid.New() strategy1 := txmgrcommon.NewDropOldestStrategy(subject1, uint32(5)) for i := 0; i < 5; i++ { mustCreateUnstartedGeneratedTx(t, txStore, fromAddress, testutils.FixtureChainID, txRequestWithStrategy(strategy1)) } AssertCountPerSubject(t, txStore, int64(4), subject1) })` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.New()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewDropOldestStrategy(subject1, uint32(5))` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.New()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewDropOldestStrategy(subject2, uint32(3))` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 0, 1, from)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.NewHash()` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.InsertReceipt(ctx, &r.Receipt)` $DIR/core/chains/evm/txmgr/evm_tx_store_test.go: `.FindTxesWithAttemptsAndReceiptsByIdsAndState(ctx, []int64{tx.ID}, []txmgrtypes.TxState{txmgrcommon.TxConfirmed}, testutils.FixtureChainID)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `client.On("ConfiguredChainID").Return(chainID)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `t.Run("set next nonce using entries from tx table", func(t *testing.T) { randNonce1 := testutils.NewRandomPositiveInt64() randNonce2 := testutils.NewRandomPositiveInt64() txStore.On("FindLatestSequence", mock.Anything, addr1, chainID).Return(types.Nonce(randNonce1), nil).Once() txStore.On("FindLatestSequence", mock.Anything, addr2, chainID).Return(types.Nonce(randNonce2), nil).Once() nonceTracker.LoadNextSequences(ctx, enabledAddresses) seq, err := nonceTracker.GetNextSequence(ctx, addr1) require.NoError(t, err) require.Equal(t, types.Nonce(randNonce1+1), seq) seq, err = nonceTracker.GetNextSequence(ctx, addr2) require.NoError(t, err) require.Equal(t, types.Nonce(randNonce2+1), seq) })` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `txStore.On("FindLatestSequence", mock.Anything, addr1, chainID).Return(types.Nonce(randNonce1), nil).Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `txStore.On("FindLatestSequence", mock.Anything, addr2, chainID).Return(types.Nonce(randNonce2), nil).Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `nonceTracker.LoadNextSequences(ctx, enabledAddresses)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `seq, err = nonceTracker.GetNextSequence(ctx, addr2)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `txStore.On("FindLatestSequence", mock.Anything, addr1, chainID).Return(emptyNonce, errors.New("no rows")).Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `txStore.On("FindLatestSequence", mock.Anything, addr2, chainID).Return(emptyNonce, errors.New("no rows")).Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `client.On("PendingNonceAt", mock.Anything, addr1).Return(uint64(randNonce1), nil).Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `client.On("PendingNonceAt", mock.Anything, addr2).Return(uint64(randNonce2), nil).Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `nonceTracker.LoadNextSequences(ctx, enabledAddresses)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `seq, err = nonceTracker.GetNextSequence(ctx, addr2)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `client.On("ConfiguredChainID").Return(chainID)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `t.Run("throws error if RPC call fails", func(t *testing.T) { client.On("PendingNonceAt", mock.Anything, addr).Return(uint64(0), errors.New("RPC unavailable")).Once() err := nonceTracker.SyncOnChain(ctx, addr, types.Nonce(2)) require.Error(t, err) })` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `client.On("PendingNonceAt", mock.Anything, addr).Return(uint64(0), errors.New("RPC unavailable")).Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `t.Run("uses local nonce instead of on-chain nonce if on-chain nonce is lower", func(t *testing.T) { nonce := 2 newNonce := 5 client.On("PendingNonceAt", mock.Anything, addr).Return(uint64(nonce), nil).Once() enabledAddresses := []common.Address{} nonceTracker.LoadNextSequences(ctx, enabledAddresses) // syncOnChain will set the next sequence even if the address is not present in the map err := nonceTracker.SyncOnChain(ctx, addr, types.Nonce(newNonce)) require.NoError(t, err) seq, err := nonceTracker.GetNextSequence(ctx, addr) require.NoError(t, err) require.Equal(t, types.Nonce(newNonce), seq) })` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `client.On("PendingNonceAt", mock.Anything, addr).Return(uint64(nonce), nil).Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `nonceTracker.LoadNextSequences(ctx, enabledAddresses)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `client.On("PendingNonceAt", mock.Anything, addr).Return(uint64(nonce), nil).Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `nonceTracker.LoadNextSequences(ctx, enabledAddresses)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `client.On("ConfiguredChainID").Return(chainID)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `t.Run("syncs sequence successfully", func(t *testing.T) { txStoreNonce := 2 onChainNonce := 3 txStore.On("FindLatestSequence", mock.Anything, addr, chainID).Return(types.Nonce(txStoreNonce), nil).Once() nonceTracker.LoadNextSequences(ctx, enabledAddresses) var chStop services.StopChan client.On("PendingNonceAt", mock.Anything, addr).Return(uint64(onChainNonce), nil).Once() nonceTracker.SyncSequence(ctx, addr, chStop) seq, err := nonceTracker.GetNextSequence(ctx, addr) require.NoError(t, err) require.Equal(t, types.Nonce(onChainNonce), seq) })` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `txStore.On("FindLatestSequence", mock.Anything, addr, chainID).Return(types.Nonce(txStoreNonce), nil).Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `nonceTracker.LoadNextSequences(ctx, enabledAddresses)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `client.On("PendingNonceAt", mock.Anything, addr).Return(uint64(onChainNonce), nil).Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `nonceTracker.SyncSequence(ctx, addr, chStop)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `txStore.On("FindLatestSequence", mock.Anything, addr, chainID).Return(types.Nonce(txStoreNonce), nil).Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `nonceTracker.LoadNextSequences(ctx, enabledAddresses)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `client.On("PendingNonceAt", mock.Anything, addr).Return(uint64(0), errors.New("RPC unavailable")).Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `client.On("PendingNonceAt", mock.Anything, addr).Return(uint64(onChainNonce), nil).Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `nonceTracker.SyncSequence(ctx, addr, chStop)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `client.On("ConfiguredChainID").Return(chainID)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `t.Run("fails to get sequence if address doesn't exist in map", func(t *testing.T) { _, err := nonceTracker.GetNextSequence(ctx, addr) require.Error(t, err) })` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `t.Run("fails to get sequence if address doesn't exist in map and is disabled", func(t *testing.T) { _, err := nonceTracker.GetNextSequence(ctx, addr) require.Error(t, err) require.Contains(t, err.Error(), fmt.Sprintf("address disabled: %s", addr.Hex())) })` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `t.Run("fails to get sequence if address is enabled, doesn't exist in map, and getSequenceForAddr fails", func(t *testing.T) { enabledAddresses := []common.Address{addr} txStore.On("FindLatestSequence", mock.Anything, addr, chainID).Return(types.Nonce(0), errors.New("no rows")).Twice() client.On("PendingNonceAt", mock.Anything, addr).Return(uint64(0), errors.New("RPC unavailable")).Twice() nonceTracker.LoadNextSequences(ctx, enabledAddresses) _, err := nonceTracker.GetNextSequence(ctx, addr) require.Error(t, err) require.Contains(t, err.Error(), fmt.Sprintf("failed to find next sequence for address: %s", addr.Hex())) })` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `txStore.On("FindLatestSequence", mock.Anything, addr, chainID).Return(types.Nonce(0), errors.New("no rows")).Twice()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `client.On("PendingNonceAt", mock.Anything, addr).Return(uint64(0), errors.New("RPC unavailable")).Twice()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `nonceTracker.LoadNextSequences(ctx, enabledAddresses)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `txStore.On("FindLatestSequence", mock.Anything, addr, chainID).Return(types.Nonce(0), errors.New("no rows")).Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `client.On("PendingNonceAt", mock.Anything, addr).Return(uint64(0), errors.New("RPC unavailable")).Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `nonceTracker.LoadNextSequences(ctx, enabledAddresses)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `txStore.On("FindLatestSequence", mock.Anything, addr, chainID).Return(types.Nonce(txStoreNonce), nil).Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `client.On("ConfiguredChainID").Return(chainID)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `txStore.On("FindLatestSequence", mock.Anything, addr, chainID).Return(types.Nonce(randNonce), nil).Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `nonceTracker.LoadNextSequences(ctx, enabledAddresses)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `nonceTracker.GenerateNextSequence(addr, types.Nonce(randNonce+1))` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `seq, err = nonceTracker.GetNextSequence(ctx, addr)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `client.On("ConfiguredChainID").Return(chainID)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `client.On("PendingNonceAt", mock.Anything, addr).Return(uint64(0), errors.New("failed to retrieve nonce at startup")).Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `client.On("PendingNonceAt", mock.Anything, addr).Return(uint64(randNonce), nil).Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `nonceTracker.LoadNextSequences(ctx, enabledAddresses)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `nonce, err = nonceTracker.GetNextSequence(ctx, addr)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewInt(0)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewEvmTxStore(t)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewClient(t)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("ConfiguredChainID")` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(chainID)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewNonceTracker(logger.Test(t), txStore, txmgr.NewEvmTxmClient(client, nil))` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewEvmTxmClient(client, nil)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.HexToAddress("0xd5e099c71b797516c10ed0f0d895f429c2781142")` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.HexToAddress("0xd5e099c71b797516c10ed0f0d895f429c2781140")` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Run("set next nonce using entries from tx table", func(t *testing.T) { randNonce1 := testutils.NewRandomPositiveInt64() randNonce2 := testutils.NewRandomPositiveInt64() txStore.On("FindLatestSequence", mock.Anything, addr1, chainID).Return(types.Nonce(randNonce1), nil).Once() txStore.On("FindLatestSequence", mock.Anything, addr2, chainID).Return(types.Nonce(randNonce2), nil).Once() nonceTracker.LoadNextSequences(ctx, enabledAddresses) seq, err := nonceTracker.GetNextSequence(ctx, addr1) require.NoError(t, err) require.Equal(t, types.Nonce(randNonce1+1), seq) seq, err = nonceTracker.GetNextSequence(ctx, addr2) require.NoError(t, err) require.Equal(t, types.Nonce(randNonce2+1), seq) })` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewRandomPositiveInt64()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewRandomPositiveInt64()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("FindLatestSequence", mock.Anything, addr1, chainID)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(types.Nonce(randNonce1), nil)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Nonce(randNonce1)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("FindLatestSequence", mock.Anything, addr2, chainID)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(types.Nonce(randNonce2), nil)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Nonce(randNonce2)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.LoadNextSequences(ctx, enabledAddresses)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.GetNextSequence(ctx, addr1)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.GetNextSequence(ctx, addr2)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("FindLatestSequence", mock.Anything, addr1, chainID)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(emptyNonce, errors.New("no rows"))` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.New("no rows")` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("FindLatestSequence", mock.Anything, addr2, chainID)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(emptyNonce, errors.New("no rows"))` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.New("no rows")` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewRandomPositiveInt64()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewRandomPositiveInt64()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("PendingNonceAt", mock.Anything, addr1)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(uint64(randNonce1), nil)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("PendingNonceAt", mock.Anything, addr2)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(uint64(randNonce2), nil)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.LoadNextSequences(ctx, enabledAddresses)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.GetNextSequence(ctx, addr1)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.GetNextSequence(ctx, addr2)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewInt(0)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewEvmTxStore(t)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewClient(t)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("ConfiguredChainID")` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(chainID)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewNonceTracker(logger.Test(t), txStore, txmgr.NewEvmTxmClient(client, nil))` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewEvmTxmClient(client, nil)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.HexToAddress("0xd5e099c71b797516c10ed0f0d895f429c2781142")` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Run("throws error if RPC call fails", func(t *testing.T) { client.On("PendingNonceAt", mock.Anything, addr).Return(uint64(0), errors.New("RPC unavailable")).Once() err := nonceTracker.SyncOnChain(ctx, addr, types.Nonce(2)) require.Error(t, err) })` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("PendingNonceAt", mock.Anything, addr)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(uint64(0), errors.New("RPC unavailable"))` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.New("RPC unavailable")` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.SyncOnChain(ctx, addr, types.Nonce(2))` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Nonce(2)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Run("uses local nonce instead of on-chain nonce if on-chain nonce is lower", func(t *testing.T) { nonce := 2 newNonce := 5 client.On("PendingNonceAt", mock.Anything, addr).Return(uint64(nonce), nil).Once() enabledAddresses := []common.Address{} nonceTracker.LoadNextSequences(ctx, enabledAddresses) // syncOnChain will set the next sequence even if the address is not present in the map err := nonceTracker.SyncOnChain(ctx, addr, types.Nonce(newNonce)) require.NoError(t, err) seq, err := nonceTracker.GetNextSequence(ctx, addr) require.NoError(t, err) require.Equal(t, types.Nonce(newNonce), seq) })` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("PendingNonceAt", mock.Anything, addr)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(uint64(nonce), nil)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.LoadNextSequences(ctx, enabledAddresses)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.SyncOnChain(ctx, addr, types.Nonce(newNonce))` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Nonce(newNonce)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.GetNextSequence(ctx, addr)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("PendingNonceAt", mock.Anything, addr)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(uint64(nonce), nil)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.LoadNextSequences(ctx, enabledAddresses)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.SyncOnChain(ctx, addr, types.Nonce(onChainNonce))` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Nonce(onChainNonce)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.GetNextSequence(ctx, addr)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewInt(0)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewEvmTxStore(t)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewClient(t)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("ConfiguredChainID")` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(chainID)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewNonceTracker(logger.Test(t), txStore, txmgr.NewEvmTxmClient(client, nil))` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewEvmTxmClient(client, nil)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.HexToAddress("0xd5e099c71b797516c10ed0f0d895f429c2781142")` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Run("syncs sequence successfully", func(t *testing.T) { txStoreNonce := 2 onChainNonce := 3 txStore.On("FindLatestSequence", mock.Anything, addr, chainID).Return(types.Nonce(txStoreNonce), nil).Once() nonceTracker.LoadNextSequences(ctx, enabledAddresses) var chStop services.StopChan client.On("PendingNonceAt", mock.Anything, addr).Return(uint64(onChainNonce), nil).Once() nonceTracker.SyncSequence(ctx, addr, chStop) seq, err := nonceTracker.GetNextSequence(ctx, addr) require.NoError(t, err) require.Equal(t, types.Nonce(onChainNonce), seq) })` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("FindLatestSequence", mock.Anything, addr, chainID)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(types.Nonce(txStoreNonce), nil)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Nonce(txStoreNonce)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.LoadNextSequences(ctx, enabledAddresses)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("PendingNonceAt", mock.Anything, addr)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(uint64(onChainNonce), nil)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.SyncSequence(ctx, addr, chStop)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.GetNextSequence(ctx, addr)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("FindLatestSequence", mock.Anything, addr, chainID)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(types.Nonce(txStoreNonce), nil)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Nonce(txStoreNonce)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.LoadNextSequences(ctx, enabledAddresses)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("PendingNonceAt", mock.Anything, addr)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(uint64(0), errors.New("RPC unavailable"))` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.New("RPC unavailable")` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("PendingNonceAt", mock.Anything, addr)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(uint64(onChainNonce), nil)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.SyncSequence(ctx, addr, chStop)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.GetNextSequence(ctx, addr)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewInt(0)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewEvmTxStore(t)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewClient(t)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("ConfiguredChainID")` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(chainID)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewNonceTracker(logger.Test(t), txStore, txmgr.NewEvmTxmClient(client, nil))` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewEvmTxmClient(client, nil)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.HexToAddress("0xd5e099c71b797516c10ed0f0d895f429c2781142")` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Run("fails to get sequence if address doesn't exist in map", func(t *testing.T) { _, err := nonceTracker.GetNextSequence(ctx, addr) require.Error(t, err) })` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.GetNextSequence(ctx, addr)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Run("fails to get sequence if address doesn't exist in map and is disabled", func(t *testing.T) { _, err := nonceTracker.GetNextSequence(ctx, addr) require.Error(t, err) require.Contains(t, err.Error(), fmt.Sprintf("address disabled: %s", addr.Hex())) })` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.GetNextSequence(ctx, addr)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Run("fails to get sequence if address is enabled, doesn't exist in map, and getSequenceForAddr fails", func(t *testing.T) { enabledAddresses := []common.Address{addr} txStore.On("FindLatestSequence", mock.Anything, addr, chainID).Return(types.Nonce(0), errors.New("no rows")).Twice() client.On("PendingNonceAt", mock.Anything, addr).Return(uint64(0), errors.New("RPC unavailable")).Twice() nonceTracker.LoadNextSequences(ctx, enabledAddresses) _, err := nonceTracker.GetNextSequence(ctx, addr) require.Error(t, err) require.Contains(t, err.Error(), fmt.Sprintf("failed to find next sequence for address: %s", addr.Hex())) })` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("FindLatestSequence", mock.Anything, addr, chainID)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(types.Nonce(0), errors.New("no rows"))` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Nonce(0)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.New("no rows")` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Twice()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("PendingNonceAt", mock.Anything, addr)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(uint64(0), errors.New("RPC unavailable"))` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.New("RPC unavailable")` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Twice()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.LoadNextSequences(ctx, enabledAddresses)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.GetNextSequence(ctx, addr)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("FindLatestSequence", mock.Anything, addr, chainID)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(types.Nonce(0), errors.New("no rows"))` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Nonce(0)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.New("no rows")` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("PendingNonceAt", mock.Anything, addr)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(uint64(0), errors.New("RPC unavailable"))` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.New("RPC unavailable")` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.LoadNextSequences(ctx, enabledAddresses)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("FindLatestSequence", mock.Anything, addr, chainID)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(types.Nonce(txStoreNonce), nil)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Nonce(txStoreNonce)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.GetNextSequence(ctx, addr)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewInt(0)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewEvmTxStore(t)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewClient(t)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("ConfiguredChainID")` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(chainID)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewNonceTracker(logger.Test(t), txStore, txmgr.NewEvmTxmClient(client, nil))` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewEvmTxmClient(client, nil)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.HexToAddress("0xd5e099c71b797516c10ed0f0d895f429c2781142")` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewRandomPositiveInt64()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("FindLatestSequence", mock.Anything, addr, chainID)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(types.Nonce(randNonce), nil)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Nonce(randNonce)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.LoadNextSequences(ctx, enabledAddresses)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.GetNextSequence(ctx, addr)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.GenerateNextSequence(addr, types.Nonce(randNonce+1))` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Nonce(randNonce+1)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.GetNextSequence(ctx, addr)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Nonce(randNonce+2)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewInt(0)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewTxStore(db, logger.Test(t))` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewClient(t)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("ConfiguredChainID")` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(chainID)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewNonceTracker(logger.Test(t), txStore, txmgr.NewEvmTxmClient(client, nil))` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewEvmTxmClient(client, nil)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.HexToAddress("0xd5e099c71b797516c10ed0f0d895f429c2781142")` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.NewRandomPositiveInt64()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("PendingNonceAt", mock.Anything, addr)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(uint64(0), errors.New("failed to retrieve nonce at startup"))` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.New("failed to retrieve nonce at startup")` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.On("PendingNonceAt", mock.Anything, addr)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Return(uint64(randNonce), nil)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.Once()` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.LoadNextSequences(ctx, enabledAddresses)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.GetNextSequence(ctx, addr)` $DIR/core/chains/evm/txmgr/nonce_tracker_test.go: `.GetNextSequence(ctx, addr)` $DIR/core/chains/evm/txmgr/reaper_test.go: `t.Run("with nothing in the database, doesn't error", func(t *testing.T) { config := txmgrmocks.NewReaperConfig(t) config.On("FinalityDepth").Return(uint32(10)) tc := &reaperConfig{reaperThreshold: 1 * time.Hour} r := newReaper(t, txStore, config, tc) err := r.ReapTxes(42) assert.NoError(t, err) })` $DIR/core/chains/evm/txmgr/reaper_test.go: `config.On("FinalityDepth").Return(uint32(10))` $DIR/core/chains/evm/txmgr/reaper_test.go: `mustInsertConfirmedEthTxWithReceipt(t, txStore, from, nonce, 5)` $DIR/core/chains/evm/txmgr/reaper_test.go: `t.Run("skips if threshold=0", func(t *testing.T) { config := txmgrmocks.NewReaperConfig(t) tc := &reaperConfig{reaperThreshold: 0 * time.Second} r := newReaper(t, txStore, config, tc) err := r.ReapTxes(42) assert.NoError(t, err) cltest.AssertCount(t, db, "evm.txes", 1) })` $DIR/core/chains/evm/txmgr/reaper_test.go: `cltest.AssertCount(t, db, "evm.txes", 1)` $DIR/core/chains/evm/txmgr/reaper_test.go: `t.Run("doesn't touch ethtxes with different chain ID", func(t *testing.T) { config := txmgrmocks.NewReaperConfig(t) config.On("FinalityDepth").Return(uint32(10)) tc := &reaperConfig{reaperThreshold: 1 * time.Hour} r := newReaperWithChainID(t, txStore, config, tc, big.NewInt(42)) err := r.ReapTxes(42) assert.NoError(t, err) // Didn't delete because eth_tx has chain ID of 0 cltest.AssertCount(t, db, "evm.txes", 1) })` $DIR/core/chains/evm/txmgr/reaper_test.go: `config.On("FinalityDepth").Return(uint32(10))` $DIR/core/chains/evm/txmgr/reaper_test.go: `cltest.AssertCount(t, db, "evm.txes", 1)` $DIR/core/chains/evm/txmgr/reaper_test.go: `t.Run("deletes confirmed evm.txes that exceed the age threshold with at least EVM.FinalityDepth blocks above their receipt", func(t *testing.T) { config := txmgrmocks.NewReaperConfig(t) config.On("FinalityDepth").Return(uint32(10)) tc := &reaperConfig{reaperThreshold: 1 * time.Hour} r := newReaper(t, txStore, config, tc) err := r.ReapTxes(42) assert.NoError(t, err) // Didn't delete because eth_tx was not old enough cltest.AssertCount(t, db, "evm.txes", 1) pgtest.MustExec(t, db, `UPDATE evm.txes SET created_at=$1`, oneDayAgo) err = r.ReapTxes(12) assert.NoError(t, err) // Didn't delete because eth_tx although old enough, was still within EVM.FinalityDepth of the current head cltest.AssertCount(t, db, "evm.txes", 1) err = r.ReapTxes(42) assert.NoError(t, err) // Now it deleted because the eth_tx was past EVM.FinalityDepth cltest.AssertCount(t, db, "evm.txes", 0) })` $DIR/core/chains/evm/txmgr/reaper_test.go: `config.On("FinalityDepth").Return(uint32(10))` $DIR/core/chains/evm/txmgr/reaper_test.go: `cltest.AssertCount(t, db, "evm.txes", 1)` $DIR/core/chains/evm/txmgr/reaper_test.go: `pgtest.MustExec(t, db, `UPDATE evm.txes SET created_at=$1`, oneDayAgo)` $DIR/core/chains/evm/txmgr/reaper_test.go: `err = r.ReapTxes(12)` $DIR/core/chains/evm/txmgr/reaper_test.go: `cltest.AssertCount(t, db, "evm.txes", 1)` $DIR/core/chains/evm/txmgr/reaper_test.go: `err = r.ReapTxes(42)` $DIR/core/chains/evm/txmgr/reaper_test.go: `cltest.AssertCount(t, db, "evm.txes", 0)` $DIR/core/chains/evm/txmgr/reaper_test.go: `mustInsertFatalErrorEthTx(t, txStore, from)` $DIR/core/chains/evm/txmgr/reaper_test.go: `config.On("FinalityDepth").Return(uint32(10))` $DIR/core/chains/evm/txmgr/reaper_test.go: `cltest.AssertCount(t, db, "evm.txes", 1)` $DIR/core/chains/evm/txmgr/reaper_test.go: `err = r.ReapTxes(42)` $DIR/core/chains/evm/txmgr/reaper_test.go: `cltest.AssertCount(t, db, "evm.txes", 0)` $DIR/core/chains/evm/txmgr/reaper_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/reaper_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/reaper_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/reaper_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/reaper_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/reaper_test.go: `.Now()` $DIR/core/chains/evm/txmgr/reaper_test.go: `.Add(-24 * time.Hour)` $DIR/core/chains/evm/txmgr/reaper_test.go: `.Run("with nothing in the database, doesn't error", func(t *testing.T) { config := txmgrmocks.NewReaperConfig(t) config.On("FinalityDepth").Return(uint32(10)) tc := &reaperConfig{reaperThreshold: 1 * time.Hour} r := newReaper(t, txStore, config, tc) err := r.ReapTxes(42) assert.NoError(t, err) })` $DIR/core/chains/evm/txmgr/reaper_test.go: `.NewReaperConfig(t)` $DIR/core/chains/evm/txmgr/reaper_test.go: `.On("FinalityDepth")` $DIR/core/chains/evm/txmgr/reaper_test.go: `.Return(uint32(10))` $DIR/core/chains/evm/txmgr/reaper_test.go: `.ReapTxes(42)` $DIR/core/chains/evm/txmgr/reaper_test.go: `.Run("skips if threshold=0", func(t *testing.T) { config := txmgrmocks.NewReaperConfig(t) tc := &reaperConfig{reaperThreshold: 0 * time.Second} r := newReaper(t, txStore, config, tc) err := r.ReapTxes(42) assert.NoError(t, err) cltest.AssertCount(t, db, "evm.txes", 1) })` $DIR/core/chains/evm/txmgr/reaper_test.go: `.NewReaperConfig(t)` $DIR/core/chains/evm/txmgr/reaper_test.go: `.ReapTxes(42)` $DIR/core/chains/evm/txmgr/reaper_test.go: `.AssertCount(t, db, "evm.txes", 1)` $DIR/core/chains/evm/txmgr/reaper_test.go: `.Run("doesn't touch ethtxes with different chain ID", func(t *testing.T) { config := txmgrmocks.NewReaperConfig(t) config.On("FinalityDepth").Return(uint32(10)) tc := &reaperConfig{reaperThreshold: 1 * time.Hour} r := newReaperWithChainID(t, txStore, config, tc, big.NewInt(42)) err := r.ReapTxes(42) assert.NoError(t, err) // Didn't delete because eth_tx has chain ID of 0 cltest.AssertCount(t, db, "evm.txes", 1) })` $DIR/core/chains/evm/txmgr/reaper_test.go: `.NewReaperConfig(t)` $DIR/core/chains/evm/txmgr/reaper_test.go: `.On("FinalityDepth")` $DIR/core/chains/evm/txmgr/reaper_test.go: `.Return(uint32(10))` $DIR/core/chains/evm/txmgr/reaper_test.go: `.NewInt(42)` $DIR/core/chains/evm/txmgr/reaper_test.go: `.ReapTxes(42)` $DIR/core/chains/evm/txmgr/reaper_test.go: `.AssertCount(t, db, "evm.txes", 1)` $DIR/core/chains/evm/txmgr/reaper_test.go: `.Run("deletes confirmed evm.txes that exceed the age threshold with at least EVM.FinalityDepth blocks above their receipt", func(t *testing.T) { config := txmgrmocks.NewReaperConfig(t) config.On("FinalityDepth").Return(uint32(10)) tc := &reaperConfig{reaperThreshold: 1 * time.Hour} r := newReaper(t, txStore, config, tc) err := r.ReapTxes(42) assert.NoError(t, err) // Didn't delete because eth_tx was not old enough cltest.AssertCount(t, db, "evm.txes", 1) pgtest.MustExec(t, db, `UPDATE evm.txes SET created_at=$1`, oneDayAgo) err = r.ReapTxes(12) assert.NoError(t, err) // Didn't delete because eth_tx although old enough, was still within EVM.FinalityDepth of the current head cltest.AssertCount(t, db, "evm.txes", 1) err = r.ReapTxes(42) assert.NoError(t, err) // Now it deleted because the eth_tx was past EVM.FinalityDepth cltest.AssertCount(t, db, "evm.txes", 0) })` $DIR/core/chains/evm/txmgr/reaper_test.go: `.NewReaperConfig(t)` $DIR/core/chains/evm/txmgr/reaper_test.go: `.On("FinalityDepth")` $DIR/core/chains/evm/txmgr/reaper_test.go: `.Return(uint32(10))` $DIR/core/chains/evm/txmgr/reaper_test.go: `.ReapTxes(42)` $DIR/core/chains/evm/txmgr/reaper_test.go: `.AssertCount(t, db, "evm.txes", 1)` $DIR/core/chains/evm/txmgr/reaper_test.go: `.MustExec(t, db, `UPDATE evm.txes SET created_at=$1`, oneDayAgo)` $DIR/core/chains/evm/txmgr/reaper_test.go: `.ReapTxes(12)` $DIR/core/chains/evm/txmgr/reaper_test.go: `.AssertCount(t, db, "evm.txes", 1)` $DIR/core/chains/evm/txmgr/reaper_test.go: `.ReapTxes(42)` $DIR/core/chains/evm/txmgr/reaper_test.go: `.AssertCount(t, db, "evm.txes", 0)` $DIR/core/chains/evm/txmgr/reaper_test.go: `.NewReaperConfig(t)` $DIR/core/chains/evm/txmgr/reaper_test.go: `.On("FinalityDepth")` $DIR/core/chains/evm/txmgr/reaper_test.go: `.Return(uint32(10))` $DIR/core/chains/evm/txmgr/reaper_test.go: `.ReapTxes(42)` $DIR/core/chains/evm/txmgr/reaper_test.go: `.AssertCount(t, db, "evm.txes", 1)` $DIR/core/chains/evm/txmgr/reaper_test.go: `.ReapTxes(42)` $DIR/core/chains/evm/txmgr/reaper_test.go: `.AssertCount(t, db, "evm.txes", 0)` $DIR/core/chains/evm/txmgr/resender_test.go: `ethClient.On("IsL2").Return(false).Maybe()` $DIR/core/chains/evm/txmgr/resender_test.go: `addr1TxesRawHex = append(addr1TxesRawHex, hexutil.Encode(etx.TxAttempts[0].SignedRawTx))` $DIR/core/chains/evm/txmgr/resender_test.go: `addr2TxesRawHex = append(addr2TxesRawHex, hexutil.Encode(etx.TxAttempts[0].SignedRawTx))` $DIR/core/chains/evm/txmgr/resender_test.go: `addr3TxesRawHex = append(addr3TxesRawHex, hexutil.Encode(etx.TxAttempts[0].SignedRawTx))` $DIR/core/chains/evm/txmgr/resender_test.go: `ethClient.On("BatchCallContextAll", mock.Anything, mock.MatchedBy(func(elems []rpc.BatchElem) bool { for _, elem := range elems { resentHex[elem.Args[0].(string)] = struct{}{} } assert.Len(t, elems, len(addr1TxesRawHex)+len(addr2TxesRawHex)+int(txConfig.MaxInFlight())) // All addr1TxesRawHex should be included for _, addr := range addr1TxesRawHex { assert.Contains(t, resentHex, addr) } // All addr2TxesRawHex should be included for _, addr := range addr2TxesRawHex { assert.Contains(t, resentHex, addr) } // Up to limit EvmMaxInFlightTransactions addr3TxesRawHex should be included for i, addr := range addr3TxesRawHex { if i >= int(txConfig.MaxInFlight()) { // Above limit EvmMaxInFlightTransactions addr3TxesRawHex should NOT be included assert.NotContains(t, resentHex, addr) } else { assert.Contains(t, resentHex, addr) } } return true })).Run(func(args mock.Arguments) {}).Return(nil)` $DIR/core/chains/evm/txmgr/resender_test.go: `resentHex[elem.Args[0].(string)] = struct{}{}` $DIR/core/chains/evm/txmgr/resender_test.go: `ethClient.On("IsL2").Return(false).Maybe()` $DIR/core/chains/evm/txmgr/resender_test.go: `c.Chain = toml.Defaults(ubig.New(big.NewInt(0)), &toml.Chain{ Transactions: toml.Transactions{ResendAfterThreshold: delay}, })` $DIR/core/chains/evm/txmgr/resender_test.go: `_ = cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, int64(1), fromAddress, originalBroadcastAt)` $DIR/core/chains/evm/txmgr/resender_test.go: `ethClient.On("BatchCallContextAll", mock.Anything, mock.Anything).Return(nil)` $DIR/core/chains/evm/txmgr/resender_test.go: `tests.AssertLogCountEventually(t, o, "TxAttempt has been unconfirmed for more than max duration", 1)` $DIR/core/chains/evm/txmgr/resender_test.go: `c.Transactions.ResendAfterThreshold = commonconfig.MustNewDuration(42 * time.Hour)` $DIR/core/chains/evm/txmgr/resender_test.go: `c.RPCDefaultBatchSize = ptr[uint32](1)` $DIR/core/chains/evm/txmgr/resender_test.go: `ethClient.On("IsL2").Return(false).Maybe()` $DIR/core/chains/evm/txmgr/resender_test.go: `cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 2, fromAddress, time.Now().Add(1*time.Hour))` $DIR/core/chains/evm/txmgr/resender_test.go: `ethClient.On("BatchCallContextAll", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && b[0].Method == "eth_sendRawTransaction" && b[0].Args[0] == hexutil.Encode(etx.TxAttempts[0].SignedRawTx) })).Return(nil)` $DIR/core/chains/evm/txmgr/resender_test.go: `ethClient.On("BatchCallContextAll", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && b[0].Method == "eth_sendRawTransaction" && b[0].Args[0] == hexutil.Encode(etx2.TxAttempts[0].SignedRawTx) })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // It should update BroadcastAt even if there is an error here elems[0].Error = pkgerrors.New("kaboom") })` $DIR/core/chains/evm/txmgr/resender_test.go: `elems[0].Error = pkgerrors.New("kaboom")` $DIR/core/chains/evm/txmgr/resender_test.go: `func() { er.Start(ctx) defer er.Stop() cltest.EventuallyExpectationsMet(t, ethClient, 5*time.Second, time.Second) }()` $DIR/core/chains/evm/txmgr/resender_test.go: `er.Start(ctx)` $DIR/core/chains/evm/txmgr/resender_test.go: `cltest.EventuallyExpectationsMet(t, ethClient, 5*time.Second, time.Second)` $DIR/core/chains/evm/txmgr/resender_test.go: `err = db.Get(&dbEtx2, `SELECT * FROM evm.txes WHERE id = $1`, etx2.ID)` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/resender_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/resender_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/resender_test.go: `.On("IsL2")` $DIR/core/chains/evm/txmgr/resender_test.go: `.Return(false)` $DIR/core/chains/evm/txmgr/resender_test.go: `.Maybe()` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewTestChainScopedConfig(t, nil)` $DIR/core/chains/evm/txmgr/resender_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/resender_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/resender_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/resender_test.go: `.Unix(1616509100, 0)` $DIR/core/chains/evm/txmgr/resender_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/resender_test.go: `.Transactions()` $DIR/core/chains/evm/txmgr/resender_test.go: `.MaxInFlight()` $DIR/core/chains/evm/txmgr/resender_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, int64(i), fromAddress, originalBroadcastAt)` $DIR/core/chains/evm/txmgr/resender_test.go: `.Encode(etx.TxAttempts[0].SignedRawTx)` $DIR/core/chains/evm/txmgr/resender_test.go: `.MaxInFlight()` $DIR/core/chains/evm/txmgr/resender_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, int64(i), fromAddress2, originalBroadcastAt)` $DIR/core/chains/evm/txmgr/resender_test.go: `.Encode(etx.TxAttempts[0].SignedRawTx)` $DIR/core/chains/evm/txmgr/resender_test.go: `.MaxInFlight()` $DIR/core/chains/evm/txmgr/resender_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, int64(i), fromAddress3, originalBroadcastAt)` $DIR/core/chains/evm/txmgr/resender_test.go: `.Encode(etx.TxAttempts[0].SignedRawTx)` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewEvmResender(lggr, txStore, txmgr.NewEvmTxmClient(ethClient, nil), txmgr.NewEvmTracker(txStore, ethKeyStore, big.NewInt(0), lggr), ethKeyStore, 100*time.Millisecond, ccfg.EVM(), ccfg.EVM().Transactions())` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewEvmTxmClient(ethClient, nil)` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewEvmTracker(txStore, ethKeyStore, big.NewInt(0), lggr)` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewInt(0)` $DIR/core/chains/evm/txmgr/resender_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/resender_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/resender_test.go: `.Transactions()` $DIR/core/chains/evm/txmgr/resender_test.go: `.On("BatchCallContextAll", mock.Anything, mock.MatchedBy(func(elems []rpc.BatchElem) bool { for _, elem := range elems { resentHex[elem.Args[0].(string)] = struct{}{} } assert.Len(t, elems, len(addr1TxesRawHex)+len(addr2TxesRawHex)+int(txConfig.MaxInFlight())) // All addr1TxesRawHex should be included for _, addr := range addr1TxesRawHex { assert.Contains(t, resentHex, addr) } // All addr2TxesRawHex should be included for _, addr := range addr2TxesRawHex { assert.Contains(t, resentHex, addr) } // Up to limit EvmMaxInFlightTransactions addr3TxesRawHex should be included for i, addr := range addr3TxesRawHex { if i >= int(txConfig.MaxInFlight()) { // Above limit EvmMaxInFlightTransactions addr3TxesRawHex should NOT be included assert.NotContains(t, resentHex, addr) } else { assert.Contains(t, resentHex, addr) } } return true }))` $DIR/core/chains/evm/txmgr/resender_test.go: `.MatchedBy(func(elems []rpc.BatchElem) bool { for _, elem := range elems { resentHex[elem.Args[0].(string)] = struct{}{} } assert.Len(t, elems, len(addr1TxesRawHex)+len(addr2TxesRawHex)+int(txConfig.MaxInFlight())) // All addr1TxesRawHex should be included for _, addr := range addr1TxesRawHex { assert.Contains(t, resentHex, addr) } // All addr2TxesRawHex should be included for _, addr := range addr2TxesRawHex { assert.Contains(t, resentHex, addr) } // Up to limit EvmMaxInFlightTransactions addr3TxesRawHex should be included for i, addr := range addr3TxesRawHex { if i >= int(txConfig.MaxInFlight()) { // Above limit EvmMaxInFlightTransactions addr3TxesRawHex should NOT be included assert.NotContains(t, resentHex, addr) } else { assert.Contains(t, resentHex, addr) } } return true })` $DIR/core/chains/evm/txmgr/resender_test.go: `.MaxInFlight()` $DIR/core/chains/evm/txmgr/resender_test.go: `.Run(func(args mock.Arguments) {})` $DIR/core/chains/evm/txmgr/resender_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/resender_test.go: `.XXXTestResendUnconfirmed()` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/resender_test.go: `.TestObserved(t, zapcore.DebugLevel)` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/resender_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/resender_test.go: `.On("IsL2")` $DIR/core/chains/evm/txmgr/resender_test.go: `.Return(false)` $DIR/core/chains/evm/txmgr/resender_test.go: `.Maybe()` $DIR/core/chains/evm/txmgr/resender_test.go: `.MustNewDuration(1 * time.Nanosecond)` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { c.Chain = toml.Defaults(ubig.New(big.NewInt(0)), &toml.Chain{ Transactions: toml.Transactions{ResendAfterThreshold: delay}, }) })` $DIR/core/chains/evm/txmgr/resender_test.go: `.Defaults(ubig.New(big.NewInt(0)), &toml.Chain{ Transactions: toml.Transactions{ResendAfterThreshold: delay}, })` $DIR/core/chains/evm/txmgr/resender_test.go: `.New(big.NewInt(0))` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewInt(0)` $DIR/core/chains/evm/txmgr/resender_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/resender_test.go: `.Unix(1616509100, 0)` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewEvmResender(lggr, txStore, txmgr.NewEvmTxmClient(ethClient, nil), txmgr.NewEvmTracker(txStore, ethKeyStore, big.NewInt(0), lggr), ethKeyStore, 100*time.Millisecond, ccfg.EVM(), ccfg.EVM().Transactions())` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewEvmTxmClient(ethClient, nil)` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewEvmTracker(txStore, ethKeyStore, big.NewInt(0), lggr)` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewInt(0)` $DIR/core/chains/evm/txmgr/resender_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/resender_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/resender_test.go: `.Transactions()` $DIR/core/chains/evm/txmgr/resender_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, int64(1), fromAddress, originalBroadcastAt)` $DIR/core/chains/evm/txmgr/resender_test.go: `.On("BatchCallContextAll", mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/resender_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/resender_test.go: `.XXXTestResendUnconfirmed()` $DIR/core/chains/evm/txmgr/resender_test.go: `.XXXTestResendUnconfirmed()` $DIR/core/chains/evm/txmgr/resender_test.go: `.AssertLogCountEventually(t, o, "TxAttempt has been unconfirmed for more than max duration", 1)` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { // This can be anything as long as it isn't zero c.Transactions.ResendAfterThreshold = commonconfig.MustNewDuration(42 * time.Hour) // Set batch size low to test batching c.RPCDefaultBatchSize = ptr[uint32](1) })` $DIR/core/chains/evm/txmgr/resender_test.go: `.MustNewDuration(42 * time.Hour)` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/resender_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/resender_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/resender_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/resender_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/resender_test.go: `.On("IsL2")` $DIR/core/chains/evm/txmgr/resender_test.go: `.Return(false)` $DIR/core/chains/evm/txmgr/resender_test.go: `.Maybe()` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewEvmResender(lggr, txStore, txmgr.NewEvmTxmClient(ethClient, nil), txmgr.NewEvmTracker(txStore, ethKeyStore, big.NewInt(0), lggr), ethKeyStore, 100*time.Millisecond, ccfg.EVM(), ccfg.EVM().Transactions())` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewEvmTxmClient(ethClient, nil)` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewEvmTracker(txStore, ethKeyStore, big.NewInt(0), lggr)` $DIR/core/chains/evm/txmgr/resender_test.go: `.NewInt(0)` $DIR/core/chains/evm/txmgr/resender_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/resender_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/resender_test.go: `.Transactions()` $DIR/core/chains/evm/txmgr/resender_test.go: `.Unix(1616509100, 0)` $DIR/core/chains/evm/txmgr/resender_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 0, fromAddress, originalBroadcastAt)` $DIR/core/chains/evm/txmgr/resender_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 1, fromAddress, originalBroadcastAt)` $DIR/core/chains/evm/txmgr/resender_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 2, fromAddress, time.Now().Add(1*time.Hour))` $DIR/core/chains/evm/txmgr/resender_test.go: `.Now()` $DIR/core/chains/evm/txmgr/resender_test.go: `.Add(1*time.Hour)` $DIR/core/chains/evm/txmgr/resender_test.go: `.On("BatchCallContextAll", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && b[0].Method == "eth_sendRawTransaction" && b[0].Args[0] == hexutil.Encode(etx.TxAttempts[0].SignedRawTx) }))` $DIR/core/chains/evm/txmgr/resender_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && b[0].Method == "eth_sendRawTransaction" && b[0].Args[0] == hexutil.Encode(etx.TxAttempts[0].SignedRawTx) })` $DIR/core/chains/evm/txmgr/resender_test.go: `.Encode(etx.TxAttempts[0].SignedRawTx)` $DIR/core/chains/evm/txmgr/resender_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/resender_test.go: `.On("BatchCallContextAll", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && b[0].Method == "eth_sendRawTransaction" && b[0].Args[0] == hexutil.Encode(etx2.TxAttempts[0].SignedRawTx) }))` $DIR/core/chains/evm/txmgr/resender_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && b[0].Method == "eth_sendRawTransaction" && b[0].Args[0] == hexutil.Encode(etx2.TxAttempts[0].SignedRawTx) })` $DIR/core/chains/evm/txmgr/resender_test.go: `.Encode(etx2.TxAttempts[0].SignedRawTx)` $DIR/core/chains/evm/txmgr/resender_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/resender_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) // It should update BroadcastAt even if there is an error here elems[0].Error = pkgerrors.New("kaboom") })` $DIR/core/chains/evm/txmgr/resender_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/resender_test.go: `.New("kaboom")` $DIR/core/chains/evm/txmgr/resender_test.go: `.Start(ctx)` $DIR/core/chains/evm/txmgr/resender_test.go: `.Stop()` $DIR/core/chains/evm/txmgr/resender_test.go: `.EventuallyExpectationsMet(t, ethClient, 5*time.Second, time.Second)` $DIR/core/chains/evm/txmgr/resender_test.go: `.Get(&dbEtx, `SELECT * FROM evm.txes WHERE id = $1`, etx.ID)` $DIR/core/chains/evm/txmgr/resender_test.go: `.Get(&dbEtx2, `SELECT * FROM evm.txes WHERE id = $1`, etx2.ID)` $DIR/core/chains/evm/txmgr/strategies_test.go: `mockTxStore.On("PruneUnstartedTxQueue", mock.Anything, queueSize-1, subject, mock.Anything, mock.Anything).Once().Return([]int64{1, 2}, nil)` $DIR/core/chains/evm/txmgr/strategies_test.go: `.PruneQueue(tests.Context(t), nil)` $DIR/core/chains/evm/txmgr/strategies_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/strategies_test.go: `.New()` $DIR/core/chains/evm/txmgr/strategies_test.go: `.NewDropOldestStrategy(subject, 1)` $DIR/core/chains/evm/txmgr/strategies_test.go: `.Subject()` $DIR/core/chains/evm/txmgr/strategies_test.go: `.New()` $DIR/core/chains/evm/txmgr/strategies_test.go: `.NewEvmTxStore(t)` $DIR/core/chains/evm/txmgr/strategies_test.go: `.NewDropOldestStrategy(subject, queueSize)` $DIR/core/chains/evm/txmgr/strategies_test.go: `.On("PruneUnstartedTxQueue", mock.Anything, queueSize-1, subject, mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/strategies_test.go: `.Once()` $DIR/core/chains/evm/txmgr/strategies_test.go: `.Return([]int64{1, 2}, nil)` $DIR/core/chains/evm/txmgr/strategies_test.go: `.PruneQueue(tests.Context(t), mockTxStore)` $DIR/core/chains/evm/txmgr/strategies_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `feeEstimator.On("GetFee", mock.Anything, []byte{}, uint64(0), mock.Anything).Return(fee, uint64(0), nil)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `mustInsertFatalErrorTxWithError(t, txStore, 0, fromAddress, blockNum)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `mustInsertUnconfirmedTxWithBroadcastAttempts(t, txStore, 1, fromAddress, autoPurgeMinAttempts, blockNum-int64(autoPurgeThreshold), marketGasPrice.Add(oneGwei))` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `t.Run("returns empty list if no unconfimed transactions found", func(t *testing.T) { _, fromAddress := cltest.MustInsertRandomKey(t, ethKeyStore) stuckTxs, err := stuckTxDetector.FindUnconfirmedTxWithLowestNonce(ctx, []common.Address{fromAddress}) require.NoError(t, err) require.Len(t, stuckTxs, 0) })` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `t.Run("returns 1 unconfirmed transaction for each unique from address", func(t *testing.T) { _, fromAddress1 := cltest.MustInsertRandomKey(t, ethKeyStore) _, fromAddress2 := cltest.MustInsertRandomKey(t, ethKeyStore) // Insert 2 txs for from address, should only return the lowest nonce txs cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 0, fromAddress1) cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 1, fromAddress1) // Insert 1 tx for other from address, should return a tx cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 0, fromAddress2) stuckTxs, err := stuckTxDetector.FindUnconfirmedTxWithLowestNonce(ctx, []common.Address{fromAddress1, fromAddress2}) require.NoError(t, err) require.Len(t, stuckTxs, 2) var foundFromAddresses []common.Address for _, stuckTx := range stuckTxs { // Make sure lowest nonce tx is returned for both from addresses require.Equal(t, types.Nonce(0), *stuckTx.Sequence) // Make sure attempts are loaded into the tx require.Len(t, stuckTx.TxAttempts, 1) foundFromAddresses = append(foundFromAddresses, stuckTx.FromAddress) } require.Contains(t, foundFromAddresses, fromAddress1) require.Contains(t, foundFromAddresses, fromAddress2) })` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 0, fromAddress1)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 1, fromAddress1)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 0, fromAddress2)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `foundFromAddresses = append(foundFromAddresses, stuckTx.FromAddress)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `mustInsertUnconfirmedEthTxWithBroadcastPurgeAttempt(t, txStore, 0, fromAddress)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `feeEstimator.On("GetFee", mock.Anything, []byte{}, uint64(0), mock.Anything).Return(fee, uint64(0), nil)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `t.Run("not stuck, Threshold amount of blocks have not passed since broadcast", func(t *testing.T) { _, fromAddress := cltest.MustInsertRandomKey(t, ethKeyStore) enabledAddresses := []common.Address{fromAddress} // Create attempts broadcasted at the current broadcast number to test the block num threshold check // Create autoPurgeMinAttempts number of attempts to ensure the broadcast attempt count check is not being triggered // Create attempts so that the latest has a higher gas price than the market to ensure the gas price check is not being triggered mustInsertUnconfirmedTxWithBroadcastAttempts(t, txStore, 0, fromAddress, autoPurgeMinAttempts, blockNum, marketGasPrice.Add(oneGwei)) // Run detection logic on the same block number as the latest broadcast attempt to stay within the autoPurgeThreshold txs, err := stuckTxDetector.DetectStuckTransactions(ctx, enabledAddresses, blockNum) require.NoError(t, err) require.Len(t, txs, 0) })` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `mustInsertUnconfirmedTxWithBroadcastAttempts(t, txStore, 0, fromAddress, autoPurgeMinAttempts, blockNum, marketGasPrice.Add(oneGwei))` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `t.Run("not stuck, Threshold amount of blocks have not passed since last purge", func(t *testing.T) { _, fromAddress := cltest.MustInsertRandomKey(t, ethKeyStore) enabledAddresses := []common.Address{fromAddress} // Create attempts broadcasted autoPurgeThreshold block ago to ensure broadcast block num check is not being triggered // Create autoPurgeMinAttempts number of attempts to ensure the broadcast attempt count check is not being triggered // Create attempts so that the latest has a higher gas price than the market to ensure the gas price check is not being triggered mustInsertUnconfirmedTxWithBroadcastAttempts(t, txStore, 0, fromAddress, autoPurgeMinAttempts, blockNum-int64(autoPurgeThreshold), marketGasPrice.Add(oneGwei)) // Set the last purge block num as the current block num to test rate limiting condition stuckTxDetector.SetPurgeBlockNum(fromAddress, blockNum) // Run detection logic on autoPurgeThreshold blocks past the latest broadcast attempt txs, err := stuckTxDetector.DetectStuckTransactions(ctx, enabledAddresses, blockNum) require.NoError(t, err) require.Len(t, txs, 0) })` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `mustInsertUnconfirmedTxWithBroadcastAttempts(t, txStore, 0, fromAddress, autoPurgeMinAttempts, blockNum-int64(autoPurgeThreshold), marketGasPrice.Add(oneGwei))` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `stuckTxDetector.SetPurgeBlockNum(fromAddress, blockNum)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `t.Run("not stuck, MinAttempts amount of attempts have not been broadcasted", func(t *testing.T) { _, fromAddress := cltest.MustInsertRandomKey(t, ethKeyStore) enabledAddresses := []common.Address{fromAddress} // Create attempts broadcasted autoPurgeThreshold block ago to ensure broadcast block num check is not being triggered // Create fewer attempts than autoPurgeMinAttempts to test min attempt check // Create attempts so that the latest has a higher gas price than the market to ensure the gas price check is not being triggered mustInsertUnconfirmedTxWithBroadcastAttempts(t, txStore, 0, fromAddress, autoPurgeMinAttempts-1, blockNum-int64(autoPurgeThreshold), marketGasPrice.Add(oneGwei)) // Run detection logic on autoPurgeThreshold blocks past the latest broadcast attempt txs, err := stuckTxDetector.DetectStuckTransactions(ctx, enabledAddresses, blockNum) require.NoError(t, err) require.Len(t, txs, 0) })` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `mustInsertUnconfirmedTxWithBroadcastAttempts(t, txStore, 0, fromAddress, autoPurgeMinAttempts-1, blockNum-int64(autoPurgeThreshold), marketGasPrice.Add(oneGwei))` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `t.Run("not stuck, transaction gas price is lower than market gas price", func(t *testing.T) { _, fromAddress := cltest.MustInsertRandomKey(t, ethKeyStore) enabledAddresses := []common.Address{fromAddress} // Create attempts broadcasted autoPurgeThreshold block ago to ensure broadcast block num check is not being triggered // Create autoPurgeMinAttempts number of attempts to ensure the broadcast attempt count check is not being triggered // Create attempts so that the latest has a lower gas price than the market to test the gas price check mustInsertUnconfirmedTxWithBroadcastAttempts(t, txStore, 0, fromAddress, autoPurgeMinAttempts, blockNum-int64(autoPurgeThreshold), marketGasPrice.Sub(oneGwei)) // Run detection logic on autoPurgeThreshold blocks past the latest broadcast attempt txs, err := stuckTxDetector.DetectStuckTransactions(ctx, enabledAddresses, blockNum) require.NoError(t, err) require.Len(t, txs, 0) })` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `mustInsertUnconfirmedTxWithBroadcastAttempts(t, txStore, 0, fromAddress, autoPurgeMinAttempts, blockNum-int64(autoPurgeThreshold), marketGasPrice.Sub(oneGwei))` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `mustInsertUnconfirmedTxWithBroadcastAttempts(t, txStore, 0, fromAddress, autoPurgeMinAttempts, blockNum-int64(autoPurgeThreshold)+int64(autoPurgeMinAttempts-1), marketGasPrice.Add(oneGwei))` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `t.Run("returns empty list if no stuck transactions identified", func(t *testing.T) { _, fromAddress := cltest.MustInsertRandomKey(t, ethKeyStore) tx := mustInsertUnconfirmedTxWithBroadcastAttempts(t, txStore, 0, fromAddress, 1, blockNum, tenGwei) attempts := tx.TxAttempts[0] // Request still returns transaction by hash, transaction not discarded by network and not considered stuck ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempts.Hash, "eth_getTransactionByHash") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) resp, err := json.Marshal(types.Transaction{}) require.NoError(t, err) elems[0].Error = json.Unmarshal(resp, elems[0].Result) }).Once() txs, err := stuckTxDetector.DetectStuckTransactions(ctx, []common.Address{fromAddress}, blockNum) require.NoError(t, err) require.Len(t, txs, 0) })` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempts.Hash, "eth_getTransactionByHash") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) resp, err := json.Marshal(types.Transaction{}) require.NoError(t, err) elems[0].Error = json.Unmarshal(resp, elems[0].Result) }).Once()` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `elems[0].Error = json.Unmarshal(resp, elems[0].Result)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `mustInsertUnconfirmedTxWithBroadcastAttempts(t, txStore, 0, fromAddress1, 1, blockNum, tenGwei)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `mustInsertUnconfirmedTxWithBroadcastAttempts(t, txStore, 0, fromAddress2, 1, blockNum, tenGwei)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = nil // Return nil to signal discarded tx resp, err := json.Marshal(types.Transaction{}) require.NoError(t, err) elems[1].Error = json.Unmarshal(resp, elems[1].Result) // Return non-nil result to signal a valid tx }).Once()` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `elems[0].Result = nil` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `elems[1].Error = json.Unmarshal(resp, elems[1].Result)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewEvmFeeEstimator(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewStuckTxDetector(lggr, testutils.FixtureChainID, "", assets.NewWei(assets.NewEth(100).ToInt()), autoPurgeCfg, feeEstimator, txStore, ethClient)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewWei(assets.NewEth(100).ToInt())` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewEth(100)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.ToInt()` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.DetectStuckTransactions(tests.Context(t), []common.Address{fromAddress}, 100)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewEvmFeeEstimator(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.GWei(15)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.On("GetFee", mock.Anything, []byte{}, uint64(0), mock.Anything)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Return(fee, uint64(0), nil)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewStuckTxDetector(lggr, testutils.FixtureChainID, "", assets.NewWei(assets.NewEth(100).ToInt()), autoPurgeCfg, feeEstimator, txStore, ethClient)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewWei(assets.NewEth(100).ToInt())` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewEth(100)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.ToInt()` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.LoadPurgeBlockNumMap(ctx, []common.Address{fromAddress})` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Add(oneGwei)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.DetectStuckTransactions(ctx, enabledAddresses, blockNum)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewEvmFeeEstimator(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewStuckTxDetector(lggr, testutils.FixtureChainID, "", assets.NewWei(assets.NewEth(100).ToInt()), config.EVM().Transactions().AutoPurge(), feeEstimator, txStore, ethClient)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewWei(assets.NewEth(100).ToInt())` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewEth(100)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.ToInt()` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Transactions()` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.AutoPurge()` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Run("returns empty list if no unconfimed transactions found", func(t *testing.T) { _, fromAddress := cltest.MustInsertRandomKey(t, ethKeyStore) stuckTxs, err := stuckTxDetector.FindUnconfirmedTxWithLowestNonce(ctx, []common.Address{fromAddress}) require.NoError(t, err) require.Len(t, stuckTxs, 0) })` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.FindUnconfirmedTxWithLowestNonce(ctx, []common.Address{fromAddress})` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Run("returns 1 unconfirmed transaction for each unique from address", func(t *testing.T) { _, fromAddress1 := cltest.MustInsertRandomKey(t, ethKeyStore) _, fromAddress2 := cltest.MustInsertRandomKey(t, ethKeyStore) // Insert 2 txs for from address, should only return the lowest nonce txs cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 0, fromAddress1) cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 1, fromAddress1) // Insert 1 tx for other from address, should return a tx cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 0, fromAddress2) stuckTxs, err := stuckTxDetector.FindUnconfirmedTxWithLowestNonce(ctx, []common.Address{fromAddress1, fromAddress2}) require.NoError(t, err) require.Len(t, stuckTxs, 2) var foundFromAddresses []common.Address for _, stuckTx := range stuckTxs { // Make sure lowest nonce tx is returned for both from addresses require.Equal(t, types.Nonce(0), *stuckTx.Sequence) // Make sure attempts are loaded into the tx require.Len(t, stuckTx.TxAttempts, 1) foundFromAddresses = append(foundFromAddresses, stuckTx.FromAddress) } require.Contains(t, foundFromAddresses, fromAddress1) require.Contains(t, foundFromAddresses, fromAddress2) })` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 0, fromAddress1)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 1, fromAddress1)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 0, fromAddress2)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.FindUnconfirmedTxWithLowestNonce(ctx, []common.Address{fromAddress1, fromAddress2})` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.FindUnconfirmedTxWithLowestNonce(ctx, []common.Address{fromAddress})` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewEvmFeeEstimator(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.On("GetFee", mock.Anything, []byte{}, uint64(0), mock.Anything)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Return(fee, uint64(0), nil)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewStuckTxDetector(lggr, testutils.FixtureChainID, "", assets.NewWei(assets.NewEth(100).ToInt()), autoPurgeCfg, feeEstimator, txStore, ethClient)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewWei(assets.NewEth(100).ToInt())` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewEth(100)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.ToInt()` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Run("not stuck, Threshold amount of blocks have not passed since broadcast", func(t *testing.T) { _, fromAddress := cltest.MustInsertRandomKey(t, ethKeyStore) enabledAddresses := []common.Address{fromAddress} // Create attempts broadcasted at the current broadcast number to test the block num threshold check // Create autoPurgeMinAttempts number of attempts to ensure the broadcast attempt count check is not being triggered // Create attempts so that the latest has a higher gas price than the market to ensure the gas price check is not being triggered mustInsertUnconfirmedTxWithBroadcastAttempts(t, txStore, 0, fromAddress, autoPurgeMinAttempts, blockNum, marketGasPrice.Add(oneGwei)) // Run detection logic on the same block number as the latest broadcast attempt to stay within the autoPurgeThreshold txs, err := stuckTxDetector.DetectStuckTransactions(ctx, enabledAddresses, blockNum) require.NoError(t, err) require.Len(t, txs, 0) })` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Add(oneGwei)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.DetectStuckTransactions(ctx, enabledAddresses, blockNum)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Run("not stuck, Threshold amount of blocks have not passed since last purge", func(t *testing.T) { _, fromAddress := cltest.MustInsertRandomKey(t, ethKeyStore) enabledAddresses := []common.Address{fromAddress} // Create attempts broadcasted autoPurgeThreshold block ago to ensure broadcast block num check is not being triggered // Create autoPurgeMinAttempts number of attempts to ensure the broadcast attempt count check is not being triggered // Create attempts so that the latest has a higher gas price than the market to ensure the gas price check is not being triggered mustInsertUnconfirmedTxWithBroadcastAttempts(t, txStore, 0, fromAddress, autoPurgeMinAttempts, blockNum-int64(autoPurgeThreshold), marketGasPrice.Add(oneGwei)) // Set the last purge block num as the current block num to test rate limiting condition stuckTxDetector.SetPurgeBlockNum(fromAddress, blockNum) // Run detection logic on autoPurgeThreshold blocks past the latest broadcast attempt txs, err := stuckTxDetector.DetectStuckTransactions(ctx, enabledAddresses, blockNum) require.NoError(t, err) require.Len(t, txs, 0) })` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Add(oneGwei)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.SetPurgeBlockNum(fromAddress, blockNum)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.DetectStuckTransactions(ctx, enabledAddresses, blockNum)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Run("not stuck, MinAttempts amount of attempts have not been broadcasted", func(t *testing.T) { _, fromAddress := cltest.MustInsertRandomKey(t, ethKeyStore) enabledAddresses := []common.Address{fromAddress} // Create attempts broadcasted autoPurgeThreshold block ago to ensure broadcast block num check is not being triggered // Create fewer attempts than autoPurgeMinAttempts to test min attempt check // Create attempts so that the latest has a higher gas price than the market to ensure the gas price check is not being triggered mustInsertUnconfirmedTxWithBroadcastAttempts(t, txStore, 0, fromAddress, autoPurgeMinAttempts-1, blockNum-int64(autoPurgeThreshold), marketGasPrice.Add(oneGwei)) // Run detection logic on autoPurgeThreshold blocks past the latest broadcast attempt txs, err := stuckTxDetector.DetectStuckTransactions(ctx, enabledAddresses, blockNum) require.NoError(t, err) require.Len(t, txs, 0) })` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Add(oneGwei)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.DetectStuckTransactions(ctx, enabledAddresses, blockNum)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Run("not stuck, transaction gas price is lower than market gas price", func(t *testing.T) { _, fromAddress := cltest.MustInsertRandomKey(t, ethKeyStore) enabledAddresses := []common.Address{fromAddress} // Create attempts broadcasted autoPurgeThreshold block ago to ensure broadcast block num check is not being triggered // Create autoPurgeMinAttempts number of attempts to ensure the broadcast attempt count check is not being triggered // Create attempts so that the latest has a lower gas price than the market to test the gas price check mustInsertUnconfirmedTxWithBroadcastAttempts(t, txStore, 0, fromAddress, autoPurgeMinAttempts, blockNum-int64(autoPurgeThreshold), marketGasPrice.Sub(oneGwei)) // Run detection logic on autoPurgeThreshold blocks past the latest broadcast attempt txs, err := stuckTxDetector.DetectStuckTransactions(ctx, enabledAddresses, blockNum) require.NoError(t, err) require.Len(t, txs, 0) })` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Sub(oneGwei)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.DetectStuckTransactions(ctx, enabledAddresses, blockNum)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Add(oneGwei)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.DetectStuckTransactions(ctx, enabledAddresses, blockNum)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewEvmFeeEstimator(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewStuckTxDetector(lggr, testutils.FixtureChainID, chaintype.ChainZkEvm, assets.NewWei(assets.NewEth(100).ToInt()), autoPurgeCfg, feeEstimator, txStore, ethClient)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewWei(assets.NewEth(100).ToInt())` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewEth(100)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.ToInt()` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Run("returns empty list if no stuck transactions identified", func(t *testing.T) { _, fromAddress := cltest.MustInsertRandomKey(t, ethKeyStore) tx := mustInsertUnconfirmedTxWithBroadcastAttempts(t, txStore, 0, fromAddress, 1, blockNum, tenGwei) attempts := tx.TxAttempts[0] // Request still returns transaction by hash, transaction not discarded by network and not considered stuck ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempts.Hash, "eth_getTransactionByHash") })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) resp, err := json.Marshal(types.Transaction{}) require.NoError(t, err) elems[0].Error = json.Unmarshal(resp, elems[0].Result) }).Once() txs, err := stuckTxDetector.DetectStuckTransactions(ctx, []common.Address{fromAddress}, blockNum) require.NoError(t, err) require.Len(t, txs, 0) })` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempts.Hash, "eth_getTransactionByHash") }))` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && cltest.BatchElemMatchesParams(b[0], attempts.Hash, "eth_getTransactionByHash") })` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.BatchElemMatchesParams(b[0], attempts.Hash, "eth_getTransactionByHash")` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) resp, err := json.Marshal(types.Transaction{}) require.NoError(t, err) elems[0].Error = json.Unmarshal(resp, elems[0].Result) })` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Marshal(types.Transaction{})` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Unmarshal(resp, elems[0].Result)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Once()` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.DetectStuckTransactions(ctx, []common.Address{fromAddress}, blockNum)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 }))` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 })` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = nil // Return nil to signal discarded tx resp, err := json.Marshal(types.Transaction{}) require.NoError(t, err) elems[1].Error = json.Unmarshal(resp, elems[1].Result) // Return non-nil result to signal a valid tx })` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Marshal(types.Transaction{})` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Unmarshal(resp, elems[1].Result)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Once()` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.DetectStuckTransactions(ctx, []common.Address{fromAddress1, fromAddress2}, blockNum)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewEvmFeeEstimator(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { _, err := res.Write([]byte(fmt.Sprintf(`{"errcode": 0,"errmsg": "","data": {"%s": 1, "%s": 0}}`, attempts1.Hash, attempts2.Hash))) require.NoError(t, err) }))` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { _, err := res.Write([]byte(fmt.Sprintf(`{"errcode": 0,"errmsg": "","data": {"%s": 1, "%s": 0}}`, attempts1.Hash, attempts2.Hash))) require.NoError(t, err) })` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Write([]byte(fmt.Sprintf(`{"errcode": 0,"errmsg": "","data": {"%s": 1, "%s": 0}}`, attempts1.Hash, attempts2.Hash)))` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Sprintf(`{"errcode": 0,"errmsg": "","data": {"%s": 1, "%s": 0}}`, attempts1.Hash, attempts2.Hash)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.Parse(testServer.URL)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewStuckTxDetector(lggr, testutils.FixtureChainID, chaintype.ChainScroll, assets.NewWei(assets.NewEth(100).ToInt()), autoPurgeCfg, feeEstimator, txStore, ethClient)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewWei(assets.NewEth(100).ToInt())` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.NewEth(100)` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.ToInt()` $DIR/core/chains/evm/txmgr/stuck_tx_detector_test.go: `.DetectStuckTransactions(ctx, []common.Address{fromAddress1, fromAddress2}, blockNum)` $DIR/core/chains/evm/txmgr/tracker_test.go: `_ = mustInsertInProgressEthTxWithAttempt(t, txStore, 123, inProgressAddr)` $DIR/core/chains/evm/txmgr/tracker_test.go: `_ = cltest.MustInsertUnconfirmedEthTx(t, txStore, 123, unconfirmedAddr)` $DIR/core/chains/evm/txmgr/tracker_test.go: `_ = mustInsertConfirmedEthTxWithReceipt(t, txStore, confirmedAddr, 123, 1)` $DIR/core/chains/evm/txmgr/tracker_test.go: `_ = mustCreateUnstartedTx(t, txStore, unstartedAddr, cltest.MustGenerateRandomKey(t).Address, []byte{}, 0, big.Int{}, ethClient.ConfiguredChainID())` $DIR/core/chains/evm/txmgr/tracker_test.go: `err = tracker.Close()` $DIR/core/chains/evm/txmgr/tracker_test.go: `time.Sleep(waitTime)` $DIR/core/chains/evm/txmgr/tracker_test.go: `tracker.XXXTestSetTTL(time.Nanosecond)` $DIR/core/chains/evm/txmgr/tracker_test.go: `err = tracker.Close()` $DIR/core/chains/evm/txmgr/tracker_test.go: `time.Sleep(100 * waitTime)` $DIR/core/chains/evm/txmgr/tracker_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/tracker_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/tracker_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/tracker_test.go: `.MustGenerateRandomKey(t)` $DIR/core/chains/evm/txmgr/tracker_test.go: `.MustGenerateRandomKey(t)` $DIR/core/chains/evm/txmgr/tracker_test.go: `.MustGenerateRandomKey(t)` $DIR/core/chains/evm/txmgr/tracker_test.go: `.MustGenerateRandomKey(t)` $DIR/core/chains/evm/txmgr/tracker_test.go: `.MustInsertUnconfirmedEthTx(t, txStore, 123, unconfirmedAddr)` $DIR/core/chains/evm/txmgr/tracker_test.go: `.MustGenerateRandomKey(t)` $DIR/core/chains/evm/txmgr/tracker_test.go: `.ConfiguredChainID()` $DIR/core/chains/evm/txmgr/tracker_test.go: `.Start(ctx)` $DIR/core/chains/evm/txmgr/tracker_test.go: `.Sleep(waitTime)` $DIR/core/chains/evm/txmgr/tracker_test.go: `.GetAbandonedAddresses()` $DIR/core/chains/evm/txmgr/tracker_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/tracker_test.go: `.MustGenerateRandomKey(t)` $DIR/core/chains/evm/txmgr/tracker_test.go: `.MustGenerateRandomKey(t)` $DIR/core/chains/evm/txmgr/tracker_test.go: `.MustInsertUnconfirmedEthTx(t, txStore, 123, addr2)` $DIR/core/chains/evm/txmgr/tracker_test.go: `.XXXTestSetTTL(time.Nanosecond)` $DIR/core/chains/evm/txmgr/tracker_test.go: `.Start(ctx)` $DIR/core/chains/evm/txmgr/tracker_test.go: `.Sleep(100 * waitTime)` $DIR/core/chains/evm/txmgr/tracker_test.go: `.GetFatalTransactions(ctx)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `t.Run("no checker", func(t *testing.T) { c, err := factory.BuildChecker(txmgr.TransmitCheckerSpec{}) require.NoError(t, err) require.Equal(t, txmgr.NoChecker, c) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `t.Run("vrf v1 checker", func(t *testing.T) { c, err := factory.BuildChecker(txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeVRFV1, VRFCoordinatorAddress: testutils.NewAddressPtr(), }) require.NoError(t, err) require.IsType(t, &txmgr.VRFV1Checker{}, c) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `t.Run("vrf v2 checker", func(t *testing.T) { c, err := factory.BuildChecker(txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeVRFV2, VRFCoordinatorAddress: testutils.NewAddressPtr(), VRFRequestBlockNumber: big.NewInt(1), }) require.NoError(t, err) require.IsType(t, &txmgr.VRFV2Checker{}, c) // request block number not provided should error out. c, err = factory.BuildChecker(txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeVRFV2, VRFCoordinatorAddress: testutils.NewAddressPtr(), }) require.Error(t, err) require.Nil(t, c) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `c, err = factory.BuildChecker(txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeVRFV2, VRFCoordinatorAddress: testutils.NewAddressPtr(), })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `t.Run("vrf v2 plus checker", func(t *testing.T) { c, err := factory.BuildChecker(txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeVRFV2Plus, VRFCoordinatorAddress: testutils.NewAddressPtr(), VRFRequestBlockNumber: big.NewInt(1), }) require.NoError(t, err) require.IsType(t, &txmgr.VRFV2Checker{}, c) // request block number not provided should error out. c, err = factory.BuildChecker(txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeVRFV2Plus, VRFCoordinatorAddress: testutils.NewAddressPtr(), }) require.Error(t, err) require.Nil(t, c) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `c, err = factory.BuildChecker(txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeVRFV2Plus, VRFCoordinatorAddress: testutils.NewAddressPtr(), })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `t.Run("simulate checker", func(t *testing.T) { c, err := factory.BuildChecker(txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeSimulate, }) require.NoError(t, err) require.Equal(t, &txmgr.SimulateChecker{Client: client}, c) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `t.Run("no checker", func(t *testing.T) { checker := txmgr.NoChecker require.NoError(t, checker.Check(ctx, log, txmgr.Tx{}, txmgr.TxAttempt{})) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `t.Run("simulate", func(t *testing.T) { checker := txmgr.SimulateChecker{Client: client} tx := txmgr.Tx{ FromAddress: common.HexToAddress("0xfe0629509E6CB8dfa7a99214ae58Ceb465d5b5A9"), ToAddress: common.HexToAddress("0xff0Aac13eab788cb9a2D662D3FB661Aa5f58FA21"), EncodedPayload: []byte{42, 0, 0}, Value: big.Int(assets.NewEthValue(642)), FeeLimit: 1e9, CreatedAt: time.Unix(0, 0), State: txmgrcommon.TxUnstarted, } attempt := txmgr.TxAttempt{ Tx: tx, Hash: common.Hash{}, CreatedAt: tx.CreatedAt, State: txmgrtypes.TxAttemptInProgress, } t.Run("success", func(t *testing.T) { client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x282" // 642 }), "latest").Return(nil).Once() require.NoError(t, checker.Check(ctx, log, tx, attempt)) }) t.Run("revert", func(t *testing.T) { jerr := evmclient.JsonError{ Code: 42, Message: "oh no, it reverted", Data: []byte{42, 166, 34}, } client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x282" // 642 }), "latest").Return(&jerr).Once() err := checker.Check(ctx, log, tx, attempt) expErrMsg := "transaction reverted during simulation: json-rpc error { Code = 42, Message = 'oh no, it reverted', Data = 'KqYi' }" require.EqualError(t, err, expErrMsg) }) t.Run("non revert error", func(t *testing.T) { client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x282" // 642 }), "latest").Return(pkgerrors.New("error")).Once() // Non-revert errors are logged but should not prevent transmission, and do not need // to be passed to the caller require.NoError(t, checker.Check(ctx, log, tx, attempt)) }) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `t.Run("success", func(t *testing.T) { client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x282" // 642 }), "latest").Return(nil).Once() require.NoError(t, checker.Check(ctx, log, tx, attempt)) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x282" // 642 }), "latest").Return(nil).Once()` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `t.Run("revert", func(t *testing.T) { jerr := evmclient.JsonError{ Code: 42, Message: "oh no, it reverted", Data: []byte{42, 166, 34}, } client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x282" // 642 }), "latest").Return(&jerr).Once() err := checker.Check(ctx, log, tx, attempt) expErrMsg := "transaction reverted during simulation: json-rpc error { Code = 42, Message = 'oh no, it reverted', Data = 'KqYi' }" require.EqualError(t, err, expErrMsg) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x282" // 642 }), "latest").Return(&jerr).Once()` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `t.Run("non revert error", func(t *testing.T) { client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x282" // 642 }), "latest").Return(pkgerrors.New("error")).Once() // Non-revert errors are logged but should not prevent transmission, and do not need // to be passed to the caller require.NoError(t, checker.Check(ctx, log, tx, attempt)) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x282" // 642 }), "latest").Return(pkgerrors.New("error")).Once()` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `t.Run("VRF V1", func(t *testing.T) { testDefaultSubID := uint64(2) testDefaultMaxLink := "1000000000000000000" txRequest := func(t *testing.T, vrfReqID [32]byte, nilTxHash bool) (txmgr.Tx, txmgr.TxAttempt) { h := common.BytesToHash(vrfReqID[:]) txHash := common.Hash{} meta := txmgr.TxMeta{ RequestID: &h, MaxLink: &testDefaultMaxLink, // 1 LINK SubID: &testDefaultSubID, RequestTxHash: &txHash, } if nilTxHash { meta.RequestTxHash = nil } b, err := json.Marshal(meta) require.NoError(t, err) metaJson := sqlutil.JSON(b) tx := txmgr.Tx{ FromAddress: common.HexToAddress("0xfe0629509E6CB8dfa7a99214ae58Ceb465d5b5A9"), ToAddress: common.HexToAddress("0xff0Aac13eab788cb9a2D662D3FB661Aa5f58FA21"), EncodedPayload: []byte{42, 0, 0}, Value: big.Int(assets.NewEthValue(642)), FeeLimit: 1e9, CreatedAt: time.Unix(0, 0), State: txmgrcommon.TxUnstarted, Meta: &metaJson, } return tx, txmgr.TxAttempt{ Tx: tx, Hash: common.Hash{}, CreatedAt: tx.CreatedAt, State: txmgrtypes.TxAttemptInProgress, } } r1 := [32]byte{1} r2 := [32]byte{2} r3 := [32]byte{3} checker := txmgr.VRFV1Checker{ Callbacks: func(opts *bind.CallOpts, reqID [32]byte) (v1.Callbacks, error) { if opts.BlockNumber.Cmp(big.NewInt(6)) != 0 { // Ensure correct logic is applied to get callbacks. return v1.Callbacks{}, pkgerrors.New("error getting callback") } if reqID == r1 { // Request 1 is already fulfilled return v1.Callbacks{ SeedAndBlockNum: [32]byte{}, }, nil } else if reqID == r2 { // Request 2 errors return v1.Callbacks{}, pkgerrors.New("error getting commitment") } return v1.Callbacks{ SeedAndBlockNum: [32]byte{1}, }, nil }, Client: client, } mockBatch := client.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[1].Method == "eth_getTransactionReceipt" })).Return(nil).Run(func(args mock.Arguments) { batch := args.Get(1).([]rpc.BatchElem) // Return block 10 for eth_getBlockByNumber mostRecentHead := batch[0].Result.(*evmtypes.Head) mostRecentHead.Number = 10 // Return block 6 for eth_getTransactionReceipt requestTransactionReceipt := batch[1].Result.(*types.Receipt) requestTransactionReceipt.BlockNumber = big.NewInt(6) }) t.Run("already fulfilled", func(t *testing.T) { tx, attempt := txRequest(t, r1, false) err := checker.Check(ctx, log, tx, attempt) require.Error(t, err, "request already fulfilled") }) t.Run("nil RequestTxHash", func(t *testing.T) { tx, attempt := txRequest(t, r1, true) err := checker.Check(ctx, log, tx, attempt) require.NoError(t, err) }) t.Run("not fulfilled", func(t *testing.T) { tx, attempt := txRequest(t, r3, false) require.NoError(t, checker.Check(ctx, log, tx, attempt)) }) t.Run("error checking fulfillment, should transmit", func(t *testing.T) { tx, attempt := txRequest(t, r2, false) require.NoError(t, checker.Check(ctx, log, tx, attempt)) }) t.Run("failure fetching tx receipt and block head", func(t *testing.T) { tx, attempt := txRequest(t, r1, false) mockBatch.Return(pkgerrors.New("could not fetch")) err := checker.Check(ctx, log, tx, attempt) require.NoError(t, err) }) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `meta.RequestTxHash = nil` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `mostRecentHead.Number = 10` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `requestTransactionReceipt.BlockNumber = big.NewInt(6)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `t.Run("already fulfilled", func(t *testing.T) { tx, attempt := txRequest(t, r1, false) err := checker.Check(ctx, log, tx, attempt) require.Error(t, err, "request already fulfilled") })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `t.Run("nil RequestTxHash", func(t *testing.T) { tx, attempt := txRequest(t, r1, true) err := checker.Check(ctx, log, tx, attempt) require.NoError(t, err) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `t.Run("not fulfilled", func(t *testing.T) { tx, attempt := txRequest(t, r3, false) require.NoError(t, checker.Check(ctx, log, tx, attempt)) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `t.Run("error checking fulfillment, should transmit", func(t *testing.T) { tx, attempt := txRequest(t, r2, false) require.NoError(t, checker.Check(ctx, log, tx, attempt)) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `t.Run("failure fetching tx receipt and block head", func(t *testing.T) { tx, attempt := txRequest(t, r1, false) mockBatch.Return(pkgerrors.New("could not fetch")) err := checker.Check(ctx, log, tx, attempt) require.NoError(t, err) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `mockBatch.Return(pkgerrors.New("could not fetch"))` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `t.Run("already fulfilled", func(t *testing.T) { tx, attempt := txRequest(t, big.NewInt(1)) err := checker.Check(ctx, log, tx, attempt) require.Error(t, err, "request already fulfilled") })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `t.Run("not fulfilled", func(t *testing.T) { tx, attempt := txRequest(t, big.NewInt(3)) require.NoError(t, checker.Check(ctx, log, tx, attempt)) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `t.Run("error checking fulfillment, should transmit", func(t *testing.T) { tx, attempt := txRequest(t, big.NewInt(2)) require.NoError(t, checker.Check(ctx, log, tx, attempt)) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `t.Run("can't get header", func(t *testing.T) { checker.HeadByNumber = func(ctx context.Context, n *big.Int) (*evmtypes.Head, error) { return nil, pkgerrors.New("can't get head") } tx, attempt := txRequest(t, big.NewInt(3)) require.NoError(t, checker.Check(ctx, log, tx, attempt)) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `t.Run("nil request block number", func(t *testing.T) { checker.HeadByNumber = func(ctx context.Context, n *big.Int) (*evmtypes.Head, error) { return &evmtypes.Head{ Number: 1, }, nil } checker.RequestBlockNumber = nil tx, attempt := txRequest(t, big.NewInt(4)) require.NoError(t, checker.Check(ctx, log, tx, attempt)) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `checker.RequestBlockNumber = nil` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Run("no checker", func(t *testing.T) { c, err := factory.BuildChecker(txmgr.TransmitCheckerSpec{}) require.NoError(t, err) require.Equal(t, txmgr.NoChecker, c) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.BuildChecker(txmgr.TransmitCheckerSpec{})` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Run("vrf v1 checker", func(t *testing.T) { c, err := factory.BuildChecker(txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeVRFV1, VRFCoordinatorAddress: testutils.NewAddressPtr(), }) require.NoError(t, err) require.IsType(t, &txmgr.VRFV1Checker{}, c) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.BuildChecker(txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeVRFV1, VRFCoordinatorAddress: testutils.NewAddressPtr(), })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.NewAddressPtr()` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Run("vrf v2 checker", func(t *testing.T) { c, err := factory.BuildChecker(txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeVRFV2, VRFCoordinatorAddress: testutils.NewAddressPtr(), VRFRequestBlockNumber: big.NewInt(1), }) require.NoError(t, err) require.IsType(t, &txmgr.VRFV2Checker{}, c) // request block number not provided should error out. c, err = factory.BuildChecker(txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeVRFV2, VRFCoordinatorAddress: testutils.NewAddressPtr(), }) require.Error(t, err) require.Nil(t, c) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.BuildChecker(txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeVRFV2, VRFCoordinatorAddress: testutils.NewAddressPtr(), VRFRequestBlockNumber: big.NewInt(1), })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.NewAddressPtr()` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.NewInt(1)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.BuildChecker(txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeVRFV2, VRFCoordinatorAddress: testutils.NewAddressPtr(), })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.NewAddressPtr()` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Run("vrf v2 plus checker", func(t *testing.T) { c, err := factory.BuildChecker(txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeVRFV2Plus, VRFCoordinatorAddress: testutils.NewAddressPtr(), VRFRequestBlockNumber: big.NewInt(1), }) require.NoError(t, err) require.IsType(t, &txmgr.VRFV2Checker{}, c) // request block number not provided should error out. c, err = factory.BuildChecker(txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeVRFV2Plus, VRFCoordinatorAddress: testutils.NewAddressPtr(), }) require.Error(t, err) require.Nil(t, c) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.BuildChecker(txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeVRFV2Plus, VRFCoordinatorAddress: testutils.NewAddressPtr(), VRFRequestBlockNumber: big.NewInt(1), })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.NewAddressPtr()` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.NewInt(1)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.BuildChecker(txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeVRFV2Plus, VRFCoordinatorAddress: testutils.NewAddressPtr(), })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.NewAddressPtr()` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Run("simulate checker", func(t *testing.T) { c, err := factory.BuildChecker(txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeSimulate, }) require.NoError(t, err) require.Equal(t, &txmgr.SimulateChecker{Client: client}, c) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.BuildChecker(txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeSimulate, })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.BuildChecker(txmgr.TransmitCheckerSpec{ CheckerType: "invalid", })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Sugared(logger.Test(t))` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Run("no checker", func(t *testing.T) { checker := txmgr.NoChecker require.NoError(t, checker.Check(ctx, log, txmgr.Tx{}, txmgr.TxAttempt{})) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Run("simulate", func(t *testing.T) { checker := txmgr.SimulateChecker{Client: client} tx := txmgr.Tx{ FromAddress: common.HexToAddress("0xfe0629509E6CB8dfa7a99214ae58Ceb465d5b5A9"), ToAddress: common.HexToAddress("0xff0Aac13eab788cb9a2D662D3FB661Aa5f58FA21"), EncodedPayload: []byte{42, 0, 0}, Value: big.Int(assets.NewEthValue(642)), FeeLimit: 1e9, CreatedAt: time.Unix(0, 0), State: txmgrcommon.TxUnstarted, } attempt := txmgr.TxAttempt{ Tx: tx, Hash: common.Hash{}, CreatedAt: tx.CreatedAt, State: txmgrtypes.TxAttemptInProgress, } t.Run("success", func(t *testing.T) { client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x282" // 642 }), "latest").Return(nil).Once() require.NoError(t, checker.Check(ctx, log, tx, attempt)) }) t.Run("revert", func(t *testing.T) { jerr := evmclient.JsonError{ Code: 42, Message: "oh no, it reverted", Data: []byte{42, 166, 34}, } client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x282" // 642 }), "latest").Return(&jerr).Once() err := checker.Check(ctx, log, tx, attempt) expErrMsg := "transaction reverted during simulation: json-rpc error { Code = 42, Message = 'oh no, it reverted', Data = 'KqYi' }" require.EqualError(t, err, expErrMsg) }) t.Run("non revert error", func(t *testing.T) { client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x282" // 642 }), "latest").Return(pkgerrors.New("error")).Once() // Non-revert errors are logged but should not prevent transmission, and do not need // to be passed to the caller require.NoError(t, checker.Check(ctx, log, tx, attempt)) }) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.HexToAddress("0xfe0629509E6CB8dfa7a99214ae58Ceb465d5b5A9")` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.HexToAddress("0xff0Aac13eab788cb9a2D662D3FB661Aa5f58FA21")` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Int(assets.NewEthValue(642))` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.NewEthValue(642)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Unix(0, 0)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Run("success", func(t *testing.T) { client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x282" // 642 }), "latest").Return(nil).Once() require.NoError(t, checker.Check(ctx, log, tx, attempt)) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x282" // 642 }), "latest")` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.AnythingOfType("*hexutil.Bytes")` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x282" // 642 })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Sprintf("%s", callarg["value"])` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Once()` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Run("revert", func(t *testing.T) { jerr := evmclient.JsonError{ Code: 42, Message: "oh no, it reverted", Data: []byte{42, 166, 34}, } client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x282" // 642 }), "latest").Return(&jerr).Once() err := checker.Check(ctx, log, tx, attempt) expErrMsg := "transaction reverted during simulation: json-rpc error { Code = 42, Message = 'oh no, it reverted', Data = 'KqYi' }" require.EqualError(t, err, expErrMsg) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x282" // 642 }), "latest")` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.AnythingOfType("*hexutil.Bytes")` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x282" // 642 })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Sprintf("%s", callarg["value"])` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Return(&jerr)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Once()` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Check(ctx, log, tx, attempt)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Run("non revert error", func(t *testing.T) { client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x282" // 642 }), "latest").Return(pkgerrors.New("error")).Once() // Non-revert errors are logged but should not prevent transmission, and do not need // to be passed to the caller require.NoError(t, checker.Check(ctx, log, tx, attempt)) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", mock.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x282" // 642 }), "latest")` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.AnythingOfType("*hexutil.Bytes")` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.MatchedBy(func(callarg map[string]interface{}) bool { return fmt.Sprintf("%s", callarg["value"]) == "0x282" // 642 })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Sprintf("%s", callarg["value"])` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Return(pkgerrors.New("error"))` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.New("error")` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Once()` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Run("VRF V1", func(t *testing.T) { testDefaultSubID := uint64(2) testDefaultMaxLink := "1000000000000000000" txRequest := func(t *testing.T, vrfReqID [32]byte, nilTxHash bool) (txmgr.Tx, txmgr.TxAttempt) { h := common.BytesToHash(vrfReqID[:]) txHash := common.Hash{} meta := txmgr.TxMeta{ RequestID: &h, MaxLink: &testDefaultMaxLink, // 1 LINK SubID: &testDefaultSubID, RequestTxHash: &txHash, } if nilTxHash { meta.RequestTxHash = nil } b, err := json.Marshal(meta) require.NoError(t, err) metaJson := sqlutil.JSON(b) tx := txmgr.Tx{ FromAddress: common.HexToAddress("0xfe0629509E6CB8dfa7a99214ae58Ceb465d5b5A9"), ToAddress: common.HexToAddress("0xff0Aac13eab788cb9a2D662D3FB661Aa5f58FA21"), EncodedPayload: []byte{42, 0, 0}, Value: big.Int(assets.NewEthValue(642)), FeeLimit: 1e9, CreatedAt: time.Unix(0, 0), State: txmgrcommon.TxUnstarted, Meta: &metaJson, } return tx, txmgr.TxAttempt{ Tx: tx, Hash: common.Hash{}, CreatedAt: tx.CreatedAt, State: txmgrtypes.TxAttemptInProgress, } } r1 := [32]byte{1} r2 := [32]byte{2} r3 := [32]byte{3} checker := txmgr.VRFV1Checker{ Callbacks: func(opts *bind.CallOpts, reqID [32]byte) (v1.Callbacks, error) { if opts.BlockNumber.Cmp(big.NewInt(6)) != 0 { // Ensure correct logic is applied to get callbacks. return v1.Callbacks{}, pkgerrors.New("error getting callback") } if reqID == r1 { // Request 1 is already fulfilled return v1.Callbacks{ SeedAndBlockNum: [32]byte{}, }, nil } else if reqID == r2 { // Request 2 errors return v1.Callbacks{}, pkgerrors.New("error getting commitment") } return v1.Callbacks{ SeedAndBlockNum: [32]byte{1}, }, nil }, Client: client, } mockBatch := client.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[1].Method == "eth_getTransactionReceipt" })).Return(nil).Run(func(args mock.Arguments) { batch := args.Get(1).([]rpc.BatchElem) // Return block 10 for eth_getBlockByNumber mostRecentHead := batch[0].Result.(*evmtypes.Head) mostRecentHead.Number = 10 // Return block 6 for eth_getTransactionReceipt requestTransactionReceipt := batch[1].Result.(*types.Receipt) requestTransactionReceipt.BlockNumber = big.NewInt(6) }) t.Run("already fulfilled", func(t *testing.T) { tx, attempt := txRequest(t, r1, false) err := checker.Check(ctx, log, tx, attempt) require.Error(t, err, "request already fulfilled") }) t.Run("nil RequestTxHash", func(t *testing.T) { tx, attempt := txRequest(t, r1, true) err := checker.Check(ctx, log, tx, attempt) require.NoError(t, err) }) t.Run("not fulfilled", func(t *testing.T) { tx, attempt := txRequest(t, r3, false) require.NoError(t, checker.Check(ctx, log, tx, attempt)) }) t.Run("error checking fulfillment, should transmit", func(t *testing.T) { tx, attempt := txRequest(t, r2, false) require.NoError(t, checker.Check(ctx, log, tx, attempt)) }) t.Run("failure fetching tx receipt and block head", func(t *testing.T) { tx, attempt := txRequest(t, r1, false) mockBatch.Return(pkgerrors.New("could not fetch")) err := checker.Check(ctx, log, tx, attempt) require.NoError(t, err) }) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.BytesToHash(vrfReqID[:])` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Marshal(meta)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.JSON(b)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.HexToAddress("0xfe0629509E6CB8dfa7a99214ae58Ceb465d5b5A9")` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.HexToAddress("0xff0Aac13eab788cb9a2D662D3FB661Aa5f58FA21")` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Int(assets.NewEthValue(642))` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.NewEthValue(642)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Unix(0, 0)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.BlockNumber.Cmp(big.NewInt(6))` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.NewInt(6)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.New("error getting callback")` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.New("error getting commitment")` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[1].Method == "eth_getTransactionReceipt" }))` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[1].Method == "eth_getTransactionReceipt" })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Run(func(args mock.Arguments) { batch := args.Get(1).([]rpc.BatchElem) // Return block 10 for eth_getBlockByNumber mostRecentHead := batch[0].Result.(*evmtypes.Head) mostRecentHead.Number = 10 // Return block 6 for eth_getTransactionReceipt requestTransactionReceipt := batch[1].Result.(*types.Receipt) requestTransactionReceipt.BlockNumber = big.NewInt(6) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Get(1)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.NewInt(6)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Run("already fulfilled", func(t *testing.T) { tx, attempt := txRequest(t, r1, false) err := checker.Check(ctx, log, tx, attempt) require.Error(t, err, "request already fulfilled") })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Check(ctx, log, tx, attempt)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Run("nil RequestTxHash", func(t *testing.T) { tx, attempt := txRequest(t, r1, true) err := checker.Check(ctx, log, tx, attempt) require.NoError(t, err) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Check(ctx, log, tx, attempt)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Run("not fulfilled", func(t *testing.T) { tx, attempt := txRequest(t, r3, false) require.NoError(t, checker.Check(ctx, log, tx, attempt)) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Run("error checking fulfillment, should transmit", func(t *testing.T) { tx, attempt := txRequest(t, r2, false) require.NoError(t, checker.Check(ctx, log, tx, attempt)) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Run("failure fetching tx receipt and block head", func(t *testing.T) { tx, attempt := txRequest(t, r1, false) mockBatch.Return(pkgerrors.New("could not fetch")) err := checker.Check(ctx, log, tx, attempt) require.NoError(t, err) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Return(pkgerrors.New("could not fetch"))` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.New("could not fetch")` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Check(ctx, log, tx, attempt)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.BytesToHash(vrfReqID.Bytes())` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Bytes()` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Marshal(meta)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.JSON(b)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.HexToAddress("0xfe0629509E6CB8dfa7a99214ae58Ceb465d5b5A9")` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.HexToAddress("0xff0Aac13eab788cb9a2D662D3FB661Aa5f58FA21")` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Int(assets.NewEthValue(642))` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.NewEthValue(642)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Unix(0, 0)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.String()` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.String()` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.New("error getting commitment")` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.NewInt(1)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Run("already fulfilled", func(t *testing.T) { tx, attempt := txRequest(t, big.NewInt(1)) err := checker.Check(ctx, log, tx, attempt) require.Error(t, err, "request already fulfilled") })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.NewInt(1)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Check(ctx, log, tx, attempt)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Run("not fulfilled", func(t *testing.T) { tx, attempt := txRequest(t, big.NewInt(3)) require.NoError(t, checker.Check(ctx, log, tx, attempt)) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.NewInt(3)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Run("error checking fulfillment, should transmit", func(t *testing.T) { tx, attempt := txRequest(t, big.NewInt(2)) require.NoError(t, checker.Check(ctx, log, tx, attempt)) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.NewInt(2)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Run("can't get header", func(t *testing.T) { checker.HeadByNumber = func(ctx context.Context, n *big.Int) (*evmtypes.Head, error) { return nil, pkgerrors.New("can't get head") } tx, attempt := txRequest(t, big.NewInt(3)) require.NoError(t, checker.Check(ctx, log, tx, attempt)) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.New("can't get head")` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.NewInt(3)` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.Run("nil request block number", func(t *testing.T) { checker.HeadByNumber = func(ctx context.Context, n *big.Int) (*evmtypes.Head, error) { return &evmtypes.Head{ Number: 1, }, nil } checker.RequestBlockNumber = nil tx, attempt := txRequest(t, big.NewInt(4)) require.NoError(t, checker.Check(ctx, log, tx, attempt)) })` $DIR/core/chains/evm/txmgr/transmitchecker_test.go: `.NewInt(4)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `_, err = txm.SendNativeToken(tests.Context(t), big.NewInt(0), from, to, *value, 21000)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `t.Run("with queue under capacity inserts eth_tx", func(t *testing.T) { subject := uuid.New() strategy := newMockTxStrategy(t) strategy.On("Subject").Return(uuid.NullUUID{UUID: subject, Valid: true}) strategy.On("PruneQueue", mock.Anything, mock.Anything).Return(nil, nil) evmConfig.MaxQueued = uint64(1) etx, err := txm.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, Meta: nil, Strategy: strategy, }) assert.NoError(t, err) assert.Greater(t, etx.ID, int64(0)) assert.Equal(t, etx.State, txmgrcommon.TxUnstarted) assert.Equal(t, gasLimit, etx.FeeLimit) assert.Equal(t, fromAddress, etx.FromAddress) assert.Equal(t, toAddress, etx.ToAddress) assert.Equal(t, payload, etx.EncodedPayload) assert.Equal(t, big.Int(assets.NewEthValue(0)), etx.Value) assert.Equal(t, subject, etx.Subject.UUID) cltest.AssertCount(t, db, "evm.txes", 1) var dbEtx txmgr.DbEthTx require.NoError(t, db.Get(&dbEtx, `SELECT * FROM evm.txes ORDER BY id ASC LIMIT 1`)) assert.Equal(t, etx.State, txmgrcommon.TxUnstarted) assert.Equal(t, gasLimit, etx.FeeLimit) assert.Equal(t, fromAddress, etx.FromAddress) assert.Equal(t, toAddress, etx.ToAddress) assert.Equal(t, payload, etx.EncodedPayload) assert.Equal(t, big.Int(assets.NewEthValue(0)), etx.Value) assert.Equal(t, subject, etx.Subject.UUID) })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `strategy.On("Subject").Return(uuid.NullUUID{UUID: subject, Valid: true})` $DIR/core/chains/evm/txmgr/txmgr_test.go: `strategy.On("PruneQueue", mock.Anything, mock.Anything).Return(nil, nil)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `evmConfig.MaxQueued = uint64(1)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `cltest.AssertCount(t, db, "evm.txes", 1)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `mustInsertUnconfirmedEthTxWithInsufficientEthAttempt(t, txStore, 0, fromAddress)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `t.Run("with queue at capacity does not insert eth_tx", func(t *testing.T) { evmConfig.MaxQueued = uint64(1) _, err := txm.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: testutils.NewAddress(), EncodedPayload: []byte{1, 2, 3}, FeeLimit: 21000, Meta: nil, Strategy: txmgrcommon.NewSendEveryStrategy(), }) require.Error(t, err) assert.Contains(t, err.Error(), "Txm#CreateTransaction: cannot create transaction; too many unstarted transactions in the queue (1/1). WARNING: Hitting EVM.Transactions.MaxQueued") })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `evmConfig.MaxQueued = uint64(1)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `t.Run("doesn't insert eth_tx if a matching tx already exists for that pipeline_task_run_id", func(t *testing.T) { evmConfig.MaxQueued = uint64(3) id := uuid.New() tx1, err := txm.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: testutils.NewAddress(), EncodedPayload: []byte{1, 2, 3}, FeeLimit: 21000, PipelineTaskRunID: &id, Strategy: txmgrcommon.NewSendEveryStrategy(), }) assert.NoError(t, err) tx2, err := txm.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: testutils.NewAddress(), EncodedPayload: []byte{1, 2, 3}, FeeLimit: 21000, PipelineTaskRunID: &id, Strategy: txmgrcommon.NewSendEveryStrategy(), }) assert.NoError(t, err) assert.Equal(t, tx1.GetID(), tx2.GetID()) })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `evmConfig.MaxQueued = uint64(3)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `t.Run("returns error if eth key state is missing or doesn't match chain ID", func(t *testing.T) { rndAddr := testutils.NewAddress() _, err := txm.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: rndAddr, ToAddress: testutils.NewAddress(), EncodedPayload: []byte{1, 2, 3}, FeeLimit: 21000, Strategy: txmgrcommon.NewSendEveryStrategy(), }) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("no eth key exists with address %s", rndAddr.String())) _, otherAddress := cltest.MustInsertRandomKey(t, kst.Eth(), *ubig.NewI(1337)) _, err = txm.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: otherAddress, ToAddress: testutils.NewAddress(), EncodedPayload: []byte{1, 2, 3}, FeeLimit: 21000, Strategy: txmgrcommon.NewSendEveryStrategy(), }) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("cannot send transaction from %s on chain ID 0: eth key with address %s exists but is has not been enabled for chain 0 (enabled only for chain IDs: 1337)", otherAddress.Hex(), otherAddress.Hex())) })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `_, err = txm.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: otherAddress, ToAddress: testutils.NewAddress(), EncodedPayload: []byte{1, 2, 3}, FeeLimit: 21000, Strategy: txmgrcommon.NewSendEveryStrategy(), })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `t.Run("simulate transmit checker", func(t *testing.T) { pgtest.MustExec(t, db, `DELETE FROM evm.txes`) checker := txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeSimulate, } evmConfig.MaxQueued = uint64(1) etx, err := txm.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, Strategy: txmgrcommon.NewSendEveryStrategy(), Checker: checker, }) assert.NoError(t, err) cltest.AssertCount(t, db, "evm.txes", 1) var dbEtx txmgr.DbEthTx require.NoError(t, db.Get(&dbEtx, `SELECT * FROM evm.txes ORDER BY id ASC LIMIT 1`)) var c txmgr.TransmitCheckerSpec require.NotNil(t, etx.TransmitChecker) require.NoError(t, json.Unmarshal(*etx.TransmitChecker, &c)) require.Equal(t, checker, c) })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `pgtest.MustExec(t, db, `DELETE FROM evm.txes`)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `evmConfig.MaxQueued = uint64(1)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `cltest.AssertCount(t, db, "evm.txes", 1)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `t.Run("meta and vrf checker", func(t *testing.T) { pgtest.MustExec(t, db, `DELETE FROM evm.txes`) testDefaultSubID := uint64(2) testDefaultMaxLink := "1000000000000000000" testDefaultMaxEth := "2000000000000000000" // max uint256 is 1.1579209e+77 testDefaultGlobalSubID := crypto.Keccak256Hash([]byte("sub id")).String() jobID := int32(25) requestID := common.HexToHash("abcd") requestTxHash := common.HexToHash("dcba") meta := &txmgr.TxMeta{ JobID: &jobID, RequestID: &requestID, RequestTxHash: &requestTxHash, MaxLink: &testDefaultMaxLink, // 1e18 MaxEth: &testDefaultMaxEth, // 2e18 SubID: &testDefaultSubID, GlobalSubID: &testDefaultGlobalSubID, } evmConfig.MaxQueued = uint64(1) checker := txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeVRFV2, VRFCoordinatorAddress: testutils.NewAddressPtr(), } etx, err := txm.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, Meta: meta, Strategy: txmgrcommon.NewSendEveryStrategy(), Checker: checker, }) assert.NoError(t, err) cltest.AssertCount(t, db, "evm.txes", 1) var dbEtx txmgr.DbEthTx require.NoError(t, db.Get(&dbEtx, `SELECT * FROM evm.txes ORDER BY id ASC LIMIT 1`)) m, err := etx.GetMeta() require.NoError(t, err) require.Equal(t, meta, m) var c txmgr.TransmitCheckerSpec require.NotNil(t, etx.TransmitChecker) require.NoError(t, json.Unmarshal(*etx.TransmitChecker, &c)) require.Equal(t, checker, c) })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `pgtest.MustExec(t, db, `DELETE FROM evm.txes`)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `evmConfig.MaxQueued = uint64(1)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `cltest.AssertCount(t, db, "evm.txes", 1)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `t.Run("forwards tx when a proper forwarder is set up", func(t *testing.T) { pgtest.MustExec(t, db, `DELETE FROM evm.txes`) pgtest.MustExec(t, db, `DELETE FROM evm.forwarders`) evmConfig.MaxQueued = uint64(1) // Create mock forwarder, mock authorizedsenders call. form := forwarders.NewORM(db) fwdrAddr := testutils.NewAddress() fwdr, err := form.CreateForwarder(tests.Context(t), fwdrAddr, ubig.Big(cltest.FixtureChainID)) require.NoError(t, err) require.Equal(t, fwdr.Address, fwdrAddr) etx, err := txm.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, ForwarderAddress: fwdr.Address, Strategy: txmgrcommon.NewSendEveryStrategy(), }) assert.NoError(t, err) cltest.AssertCount(t, db, "evm.txes", 1) var dbEtx txmgr.DbEthTx require.NoError(t, db.Get(&dbEtx, `SELECT * FROM evm.txes ORDER BY id ASC LIMIT 1`)) m, err := etx.GetMeta() require.NoError(t, err) require.NotNil(t, m.FwdrDestAddress) require.Equal(t, etx.ToAddress.String(), fwdrAddr.String()) })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `pgtest.MustExec(t, db, `DELETE FROM evm.txes`)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `pgtest.MustExec(t, db, `DELETE FROM evm.forwarders`)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `evmConfig.MaxQueued = uint64(1)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `cltest.AssertCount(t, db, "evm.txes", 1)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `t.Run("insert Tx successfully with a IdempotencyKey", func(t *testing.T) { evmConfig.MaxQueued = uint64(3) id := uuid.New() idempotencyKey := "1" _, err := txm.CreateTransaction(tests.Context(t), txmgr.TxRequest{ IdempotencyKey: &idempotencyKey, FromAddress: fromAddress, ToAddress: testutils.NewAddress(), EncodedPayload: []byte{1, 2, 3}, FeeLimit: 21000, PipelineTaskRunID: &id, Strategy: txmgrcommon.NewSendEveryStrategy(), }) assert.NoError(t, err) })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `evmConfig.MaxQueued = uint64(3)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `evmConfig.MaxQueued = uint64(3)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `t.Run("if another key has any transactions with insufficient eth errors, transmits as normal", func(t *testing.T) { payload := cltest.MustRandomBytes(t, 100) evmConfig.MaxQueued = uint64(1) mustInsertUnconfirmedEthTxWithInsufficientEthAttempt(t, txStore, 0, otherKey.Address) strategy := newMockTxStrategy(t) strategy.On("Subject").Return(uuid.NullUUID{}) strategy.On("PruneQueue", mock.Anything, mock.Anything).Return(nil, nil) etx, err := txm.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: evmFromAddress, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, Meta: nil, Strategy: strategy, }) assert.NoError(t, err) require.Equal(t, payload, etx.EncodedPayload) })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `evmConfig.MaxQueued = uint64(1)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `mustInsertUnconfirmedEthTxWithInsufficientEthAttempt(t, txStore, 0, otherKey.Address)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `strategy.On("Subject").Return(uuid.NullUUID{})` $DIR/core/chains/evm/txmgr/txmgr_test.go: `strategy.On("PruneQueue", mock.Anything, mock.Anything).Return(nil, nil)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `t.Run("if this key has any transactions with insufficient eth errors, inserts it anyway", func(t *testing.T) { payload := cltest.MustRandomBytes(t, 100) evmConfig.MaxQueued = uint64(1) mustInsertUnconfirmedEthTxWithInsufficientEthAttempt(t, txStore, 0, thisKey.Address) strategy := newMockTxStrategy(t) strategy.On("Subject").Return(uuid.NullUUID{}) strategy.On("PruneQueue", mock.Anything, mock.Anything).Return(nil, nil) etx, err := txm.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: evmFromAddress, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, Meta: nil, Strategy: strategy, }) require.NoError(t, err) require.Equal(t, payload, etx.EncodedPayload) })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `evmConfig.MaxQueued = uint64(1)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `mustInsertUnconfirmedEthTxWithInsufficientEthAttempt(t, txStore, 0, thisKey.Address)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `strategy.On("Subject").Return(uuid.NullUUID{})` $DIR/core/chains/evm/txmgr/txmgr_test.go: `strategy.On("PruneQueue", mock.Anything, mock.Anything).Return(nil, nil)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 0, 42, thisKey.Address)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `strategy.On("Subject").Return(uuid.NullUUID{})` $DIR/core/chains/evm/txmgr/txmgr_test.go: `strategy.On("PruneQueue", mock.Anything, mock.Anything).Return(nil, nil)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `evmConfig.MaxQueued = uint64(1)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `config.SetFinalityDepth(uint32(42))` $DIR/core/chains/evm/txmgr/txmgr_test.go: `config.RpcDefaultBatchSize = uint32(4)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `evmConfig.ResendAfterThreshold = 1 * time.Hour` $DIR/core/chains/evm/txmgr/txmgr_test.go: `evmConfig.ReaperThreshold = 1 * time.Hour` $DIR/core/chains/evm/txmgr/txmgr_test.go: `evmConfig.ReaperInterval = 1 * time.Hour` $DIR/core/chains/evm/txmgr/txmgr_test.go: `kst.On("EnabledAddressesForChain", mock.Anything, &cltest.FixtureChainID).Return([]common.Address{}, nil)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `kst.On("SubscribeToKeyChanges", mock.Anything).Return(keyChangeCh, unsub.ItHappened)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `txm.OnNewLongestChain(tests.Context(t), head)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `evmConfig.BumpThreshold = uint64(1)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `t.Cleanup(cancel)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `txm.OnNewLongestChain(ctx, head)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `kst.On("EnabledAddressesForChain", mock.Anything, &cltest.FixtureChainID).Return(addr, nil)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `ethClient.On("PendingNonceAt", mock.AnythingOfType("*context.cancelCtx"), common.Address{}).Return(uint64(0), nil).Maybe()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `keyChangeCh <- struct{}{}` $DIR/core/chains/evm/txmgr/txmgr_test.go: `cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, i, i*42+1, addr)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, i, i*42+1, addr2)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(nil, nil)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `ethClient.On("BatchCallContextAll", mock.Anything, mock.Anything).Return(nil).Maybe()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `ethClient.On("PendingNonceAt", mock.Anything, addr).Return(uint64(128), nil).Maybe()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `ethClient.On("PendingNonceAt", mock.Anything, addr2).Return(uint64(44), nil).Maybe()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 2, addr2)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 4+int64(i), addr)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `t.Run("returns error if not started", func(t *testing.T) { err := txm.Reset(addr, false) require.Error(t, err) assert.EqualError(t, err, "not started") })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `servicetest.Run(t, txm)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `t.Run("returns no error if started", func(t *testing.T) { err := txm.Reset(addr, false) require.NoError(t, err) })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `err = db.Get(&s, `SELECT error FROM evm.txes WHERE from_address = $1 AND state = 'fatal_error'`, addr)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `err = db.Get(&count, `SELECT count(*) FROM evm.txes WHERE from_address = $1 AND state = 'fatal_error'`, addr2)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewEth(1)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.ToInt()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.MakeTestConfigs(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewEstimator(logger.Test(t), ethClient, config, evmConfig.GasEstimator())` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Transactions()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Listener()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.SendNativeToken(tests.Context(t), big.NewInt(0), from, to, *value, 21000)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewInt(0)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.MustInsertRandomKey(t, kst.Eth())` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewAddress()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.MakeTestConfigs(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewEstimator(logger.Test(t), ethClient, config, evmConfig.GasEstimator())` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Transactions()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Listener()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Run("with queue under capacity inserts eth_tx", func(t *testing.T) { subject := uuid.New() strategy := newMockTxStrategy(t) strategy.On("Subject").Return(uuid.NullUUID{UUID: subject, Valid: true}) strategy.On("PruneQueue", mock.Anything, mock.Anything).Return(nil, nil) evmConfig.MaxQueued = uint64(1) etx, err := txm.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, Meta: nil, Strategy: strategy, }) assert.NoError(t, err) assert.Greater(t, etx.ID, int64(0)) assert.Equal(t, etx.State, txmgrcommon.TxUnstarted) assert.Equal(t, gasLimit, etx.FeeLimit) assert.Equal(t, fromAddress, etx.FromAddress) assert.Equal(t, toAddress, etx.ToAddress) assert.Equal(t, payload, etx.EncodedPayload) assert.Equal(t, big.Int(assets.NewEthValue(0)), etx.Value) assert.Equal(t, subject, etx.Subject.UUID) cltest.AssertCount(t, db, "evm.txes", 1) var dbEtx txmgr.DbEthTx require.NoError(t, db.Get(&dbEtx, `SELECT * FROM evm.txes ORDER BY id ASC LIMIT 1`)) assert.Equal(t, etx.State, txmgrcommon.TxUnstarted) assert.Equal(t, gasLimit, etx.FeeLimit) assert.Equal(t, fromAddress, etx.FromAddress) assert.Equal(t, toAddress, etx.ToAddress) assert.Equal(t, payload, etx.EncodedPayload) assert.Equal(t, big.Int(assets.NewEthValue(0)), etx.Value) assert.Equal(t, subject, etx.Subject.UUID) })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.New()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.On("Subject")` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Return(uuid.NullUUID{UUID: subject, Valid: true})` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.On("PruneQueue", mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Return(nil, nil)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, Meta: nil, Strategy: strategy, })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.AssertCount(t, db, "evm.txes", 1)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Run("with queue at capacity does not insert eth_tx", func(t *testing.T) { evmConfig.MaxQueued = uint64(1) _, err := txm.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: testutils.NewAddress(), EncodedPayload: []byte{1, 2, 3}, FeeLimit: 21000, Meta: nil, Strategy: txmgrcommon.NewSendEveryStrategy(), }) require.Error(t, err) assert.Contains(t, err.Error(), "Txm#CreateTransaction: cannot create transaction; too many unstarted transactions in the queue (1/1). WARNING: Hitting EVM.Transactions.MaxQueued") })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: testutils.NewAddress(), EncodedPayload: []byte{1, 2, 3}, FeeLimit: 21000, Meta: nil, Strategy: txmgrcommon.NewSendEveryStrategy(), })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewAddress()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewSendEveryStrategy()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Run("doesn't insert eth_tx if a matching tx already exists for that pipeline_task_run_id", func(t *testing.T) { evmConfig.MaxQueued = uint64(3) id := uuid.New() tx1, err := txm.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: testutils.NewAddress(), EncodedPayload: []byte{1, 2, 3}, FeeLimit: 21000, PipelineTaskRunID: &id, Strategy: txmgrcommon.NewSendEveryStrategy(), }) assert.NoError(t, err) tx2, err := txm.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: testutils.NewAddress(), EncodedPayload: []byte{1, 2, 3}, FeeLimit: 21000, PipelineTaskRunID: &id, Strategy: txmgrcommon.NewSendEveryStrategy(), }) assert.NoError(t, err) assert.Equal(t, tx1.GetID(), tx2.GetID()) })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.New()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: testutils.NewAddress(), EncodedPayload: []byte{1, 2, 3}, FeeLimit: 21000, PipelineTaskRunID: &id, Strategy: txmgrcommon.NewSendEveryStrategy(), })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewAddress()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewSendEveryStrategy()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: testutils.NewAddress(), EncodedPayload: []byte{1, 2, 3}, FeeLimit: 21000, PipelineTaskRunID: &id, Strategy: txmgrcommon.NewSendEveryStrategy(), })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewAddress()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewSendEveryStrategy()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Run("returns error if eth key state is missing or doesn't match chain ID", func(t *testing.T) { rndAddr := testutils.NewAddress() _, err := txm.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: rndAddr, ToAddress: testutils.NewAddress(), EncodedPayload: []byte{1, 2, 3}, FeeLimit: 21000, Strategy: txmgrcommon.NewSendEveryStrategy(), }) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("no eth key exists with address %s", rndAddr.String())) _, otherAddress := cltest.MustInsertRandomKey(t, kst.Eth(), *ubig.NewI(1337)) _, err = txm.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: otherAddress, ToAddress: testutils.NewAddress(), EncodedPayload: []byte{1, 2, 3}, FeeLimit: 21000, Strategy: txmgrcommon.NewSendEveryStrategy(), }) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("cannot send transaction from %s on chain ID 0: eth key with address %s exists but is has not been enabled for chain 0 (enabled only for chain IDs: 1337)", otherAddress.Hex(), otherAddress.Hex())) })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewAddress()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: rndAddr, ToAddress: testutils.NewAddress(), EncodedPayload: []byte{1, 2, 3}, FeeLimit: 21000, Strategy: txmgrcommon.NewSendEveryStrategy(), })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewAddress()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewSendEveryStrategy()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.MustInsertRandomKey(t, kst.Eth(), *ubig.NewI(1337))` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewI(1337)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: otherAddress, ToAddress: testutils.NewAddress(), EncodedPayload: []byte{1, 2, 3}, FeeLimit: 21000, Strategy: txmgrcommon.NewSendEveryStrategy(), })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewAddress()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewSendEveryStrategy()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Run("simulate transmit checker", func(t *testing.T) { pgtest.MustExec(t, db, `DELETE FROM evm.txes`) checker := txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeSimulate, } evmConfig.MaxQueued = uint64(1) etx, err := txm.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, Strategy: txmgrcommon.NewSendEveryStrategy(), Checker: checker, }) assert.NoError(t, err) cltest.AssertCount(t, db, "evm.txes", 1) var dbEtx txmgr.DbEthTx require.NoError(t, db.Get(&dbEtx, `SELECT * FROM evm.txes ORDER BY id ASC LIMIT 1`)) var c txmgr.TransmitCheckerSpec require.NotNil(t, etx.TransmitChecker) require.NoError(t, json.Unmarshal(*etx.TransmitChecker, &c)) require.Equal(t, checker, c) })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.MustExec(t, db, `DELETE FROM evm.txes`)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, Strategy: txmgrcommon.NewSendEveryStrategy(), Checker: checker, })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewSendEveryStrategy()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.AssertCount(t, db, "evm.txes", 1)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Run("meta and vrf checker", func(t *testing.T) { pgtest.MustExec(t, db, `DELETE FROM evm.txes`) testDefaultSubID := uint64(2) testDefaultMaxLink := "1000000000000000000" testDefaultMaxEth := "2000000000000000000" // max uint256 is 1.1579209e+77 testDefaultGlobalSubID := crypto.Keccak256Hash([]byte("sub id")).String() jobID := int32(25) requestID := common.HexToHash("abcd") requestTxHash := common.HexToHash("dcba") meta := &txmgr.TxMeta{ JobID: &jobID, RequestID: &requestID, RequestTxHash: &requestTxHash, MaxLink: &testDefaultMaxLink, // 1e18 MaxEth: &testDefaultMaxEth, // 2e18 SubID: &testDefaultSubID, GlobalSubID: &testDefaultGlobalSubID, } evmConfig.MaxQueued = uint64(1) checker := txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeVRFV2, VRFCoordinatorAddress: testutils.NewAddressPtr(), } etx, err := txm.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, Meta: meta, Strategy: txmgrcommon.NewSendEveryStrategy(), Checker: checker, }) assert.NoError(t, err) cltest.AssertCount(t, db, "evm.txes", 1) var dbEtx txmgr.DbEthTx require.NoError(t, db.Get(&dbEtx, `SELECT * FROM evm.txes ORDER BY id ASC LIMIT 1`)) m, err := etx.GetMeta() require.NoError(t, err) require.Equal(t, meta, m) var c txmgr.TransmitCheckerSpec require.NotNil(t, etx.TransmitChecker) require.NoError(t, json.Unmarshal(*etx.TransmitChecker, &c)) require.Equal(t, checker, c) })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.MustExec(t, db, `DELETE FROM evm.txes`)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Keccak256Hash([]byte("sub id"))` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.String()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.HexToHash("abcd")` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.HexToHash("dcba")` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewAddressPtr()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, Meta: meta, Strategy: txmgrcommon.NewSendEveryStrategy(), Checker: checker, })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewSendEveryStrategy()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.AssertCount(t, db, "evm.txes", 1)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.GetMeta()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Run("forwards tx when a proper forwarder is set up", func(t *testing.T) { pgtest.MustExec(t, db, `DELETE FROM evm.txes`) pgtest.MustExec(t, db, `DELETE FROM evm.forwarders`) evmConfig.MaxQueued = uint64(1) // Create mock forwarder, mock authorizedsenders call. form := forwarders.NewORM(db) fwdrAddr := testutils.NewAddress() fwdr, err := form.CreateForwarder(tests.Context(t), fwdrAddr, ubig.Big(cltest.FixtureChainID)) require.NoError(t, err) require.Equal(t, fwdr.Address, fwdrAddr) etx, err := txm.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, ForwarderAddress: fwdr.Address, Strategy: txmgrcommon.NewSendEveryStrategy(), }) assert.NoError(t, err) cltest.AssertCount(t, db, "evm.txes", 1) var dbEtx txmgr.DbEthTx require.NoError(t, db.Get(&dbEtx, `SELECT * FROM evm.txes ORDER BY id ASC LIMIT 1`)) m, err := etx.GetMeta() require.NoError(t, err) require.NotNil(t, m.FwdrDestAddress) require.Equal(t, etx.ToAddress.String(), fwdrAddr.String()) })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.MustExec(t, db, `DELETE FROM evm.txes`)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.MustExec(t, db, `DELETE FROM evm.forwarders`)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewORM(db)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewAddress()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.CreateForwarder(tests.Context(t), fwdrAddr, ubig.Big(cltest.FixtureChainID))` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Big(cltest.FixtureChainID)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, ForwarderAddress: fwdr.Address, Strategy: txmgrcommon.NewSendEveryStrategy(), })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewSendEveryStrategy()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.AssertCount(t, db, "evm.txes", 1)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.GetMeta()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Run("insert Tx successfully with a IdempotencyKey", func(t *testing.T) { evmConfig.MaxQueued = uint64(3) id := uuid.New() idempotencyKey := "1" _, err := txm.CreateTransaction(tests.Context(t), txmgr.TxRequest{ IdempotencyKey: &idempotencyKey, FromAddress: fromAddress, ToAddress: testutils.NewAddress(), EncodedPayload: []byte{1, 2, 3}, FeeLimit: 21000, PipelineTaskRunID: &id, Strategy: txmgrcommon.NewSendEveryStrategy(), }) assert.NoError(t, err) })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.New()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.CreateTransaction(tests.Context(t), txmgr.TxRequest{ IdempotencyKey: &idempotencyKey, FromAddress: fromAddress, ToAddress: testutils.NewAddress(), EncodedPayload: []byte{1, 2, 3}, FeeLimit: 21000, PipelineTaskRunID: &id, Strategy: txmgrcommon.NewSendEveryStrategy(), })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewAddress()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewSendEveryStrategy()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.New()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.CreateTransaction(tests.Context(t), txmgr.TxRequest{ IdempotencyKey: &idempotencyKey, FromAddress: fromAddress, ToAddress: testutils.NewAddress(), EncodedPayload: []byte{1, 2, 3}, FeeLimit: 21000, PipelineTaskRunID: &id, Strategy: txmgrcommon.NewSendEveryStrategy(), })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewAddress()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewSendEveryStrategy()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.CreateTransaction(tests.Context(t), txmgr.TxRequest{ IdempotencyKey: &idempotencyKey, FromAddress: fromAddress, ToAddress: testutils.NewAddress(), EncodedPayload: []byte{1, 2, 3}, FeeLimit: 21000, PipelineTaskRunID: &id, Strategy: txmgrcommon.NewSendEveryStrategy(), })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewAddress()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewSendEveryStrategy()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.MustInsert(t, etKeyStore)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.MustInsert(t, etKeyStore)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewAddress()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.MakeTestConfigs(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewEstimator(logger.Test(t), ethClient, config, evmConfig.GasEstimator())` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Transactions()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Listener()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Run("if another key has any transactions with insufficient eth errors, transmits as normal", func(t *testing.T) { payload := cltest.MustRandomBytes(t, 100) evmConfig.MaxQueued = uint64(1) mustInsertUnconfirmedEthTxWithInsufficientEthAttempt(t, txStore, 0, otherKey.Address) strategy := newMockTxStrategy(t) strategy.On("Subject").Return(uuid.NullUUID{}) strategy.On("PruneQueue", mock.Anything, mock.Anything).Return(nil, nil) etx, err := txm.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: evmFromAddress, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, Meta: nil, Strategy: strategy, }) assert.NoError(t, err) require.Equal(t, payload, etx.EncodedPayload) })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.MustRandomBytes(t, 100)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.On("Subject")` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Return(uuid.NullUUID{})` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.On("PruneQueue", mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Return(nil, nil)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: evmFromAddress, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, Meta: nil, Strategy: strategy, })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Run("if this key has any transactions with insufficient eth errors, inserts it anyway", func(t *testing.T) { payload := cltest.MustRandomBytes(t, 100) evmConfig.MaxQueued = uint64(1) mustInsertUnconfirmedEthTxWithInsufficientEthAttempt(t, txStore, 0, thisKey.Address) strategy := newMockTxStrategy(t) strategy.On("Subject").Return(uuid.NullUUID{}) strategy.On("PruneQueue", mock.Anything, mock.Anything).Return(nil, nil) etx, err := txm.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: evmFromAddress, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, Meta: nil, Strategy: strategy, }) require.NoError(t, err) require.Equal(t, payload, etx.EncodedPayload) })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.MustRandomBytes(t, 100)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.On("Subject")` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Return(uuid.NullUUID{})` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.On("PruneQueue", mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Return(nil, nil)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: evmFromAddress, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, Meta: nil, Strategy: strategy, })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.MustRandomBytes(t, 100)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 0, 42, thisKey.Address)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.On("Subject")` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Return(uuid.NullUUID{})` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.On("PruneQueue", mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Return(nil, nil)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.CreateTransaction(tests.Context(t), txmgr.TxRequest{ FromAddress: evmFromAddress, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, Meta: nil, Strategy: strategy, })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewEth(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.MakeTestConfigs(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.SetFinalityDepth(uint32(42))` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.On("EnabledAddressesForChain", mock.Anything, &cltest.FixtureChainID)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Return([]common.Address{}, nil)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewAwaiter()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.On("SubscribeToKeyChanges", mock.Anything)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Return(keyChangeCh, unsub.ItHappened)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewEstimator(logger.Test(t), ethClient, config, evmConfig.GasEstimator())` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Transactions()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Listener()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Head(42)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.OnNewLongestChain(tests.Context(t), head)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.WithTimeout(tests.Context(t), 5*time.Second)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Context(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Cleanup(cancel)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.OnNewLongestChain(ctx, head)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.MustGenerateRandomKeyState(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Address.Address()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.On("EnabledAddressesForChain", mock.Anything, &cltest.FixtureChainID)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Return(addr, nil)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.On("PendingNonceAt", mock.AnythingOfType("*context.cancelCtx"), common.Address{})` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.AnythingOfType("*context.cancelCtx")` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Return(uint64(0), nil)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Maybe()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewTestGeneralConfig(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewChainScopedConfig(t, gcfg)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.MustInsert(t, kst.Eth())` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.MustInsert(t, kst.Eth())` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewTestTxStore(t, db)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, i, i*42+1, addr)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, i, i*42+1, addr2)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Return(nil, nil)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.On("BatchCallContextAll", mock.Anything, mock.Anything)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Return(nil)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Maybe()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.On("PendingNonceAt", mock.Anything, addr)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Return(uint64(128), nil)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Maybe()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.On("PendingNonceAt", mock.Anything, addr2)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Return(uint64(44), nil)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Maybe()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.NewEstimator(logger.Test(t), ethClient, cfg.EVM(), cfg.EVM().GasEstimator())` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Test(t)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.GasEstimator()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.EVM()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Transactions()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Database()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Database()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Listener()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Eth()` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 2, addr2)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 4+int64(i), addr)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Run("returns error if not started", func(t *testing.T) { err := txm.Reset(addr, false) require.Error(t, err) assert.EqualError(t, err, "not started") })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Reset(addr, false)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Run(t, txm)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Run("returns no error if started", func(t *testing.T) { err := txm.Reset(addr, false) require.NoError(t, err) })` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Reset(addr, false)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Reset(addr, true)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Get(&s, `SELECT error FROM evm.txes WHERE from_address = $1 AND state = 'fatal_error'`, addr)` $DIR/core/chains/evm/txmgr/txmgr_test.go: `.Get(&count, `SELECT count(*) FROM evm.txes WHERE from_address = $1 AND state = 'fatal_error'`, addr2)` $DIR/core/chains/evm/types/address_test.go: `zeroAddress = types.EIP55Address("")` $DIR/core/chains/evm/types/address_test.go: `err = zeroAddress.UnmarshalText([]byte("0xa0788FC17B1dEe36f057c42B6F373A34B014687e"))` $DIR/core/chains/evm/types/address_test.go: `t.Run(test.name, func(t *testing.T) { _, err := types.NewEIP55Address(test.input) valid := err == nil assert.Equal(t, test.valid, valid) })` $DIR/core/chains/evm/types/address_test.go: `err = eip55New.Scan(val)` $DIR/core/chains/evm/types/address_test.go: `err = collectionNew.Scan(val)` $DIR/core/chains/evm/types/address_test.go: `eip55 = types.EIP55AddressFromAddress(common.HexToAddress("0x1"))` $DIR/core/chains/evm/types/address_test.go: `.EIP55Address("0xa0788FC17B1dEe36f057c42B6F373A34B014687e")` $DIR/core/chains/evm/types/address_test.go: `.SetString("a0788FC17B1dEe36f057c42B6F373A34B014687e", 16)` $DIR/core/chains/evm/types/address_test.go: `.EIP55Address("")` $DIR/core/chains/evm/types/address_test.go: `.Unmarshal([]byte(`"0xa0788FC17B1dEe36f057c42B6F373A34B014687e"`), &zeroAddress)` $DIR/core/chains/evm/types/address_test.go: `.EIP55Address("")` $DIR/core/chains/evm/types/address_test.go: `.UnmarshalText([]byte("0xa0788FC17B1dEe36f057c42B6F373A34B014687e"))` $DIR/core/chains/evm/types/address_test.go: `.String()` $DIR/core/chains/evm/types/address_test.go: `.Run(test.name, func(t *testing.T) { _, err := types.NewEIP55Address(test.input) valid := err == nil assert.Equal(t, test.valid, valid) })` $DIR/core/chains/evm/types/address_test.go: `.NewEIP55Address(test.input)` $DIR/core/chains/evm/types/address_test.go: `.HexToAddress("0xa0788FC17B1dEe36f057c42B6F373A34B014687e")` $DIR/core/chains/evm/types/address_test.go: `.EIP55AddressFromAddress(addr)` $DIR/core/chains/evm/types/address_test.go: `.Address()` $DIR/core/chains/evm/types/address_test.go: `.NewEIP55Address("0xa0788FC17B1dEe36f057c42B6F373A34B014687e")` $DIR/core/chains/evm/types/address_test.go: `.Value()` $DIR/core/chains/evm/types/address_test.go: `.Scan(val)` $DIR/core/chains/evm/types/address_test.go: `.EIP55Address("0xa0788FC17B1dEe36f057c42B6F373A34B0146111")` $DIR/core/chains/evm/types/address_test.go: `.EIP55Address("0xa0788FC17B1dEe36f057c42B6F373A34B0146222")` $DIR/core/chains/evm/types/address_test.go: `.Value()` $DIR/core/chains/evm/types/address_test.go: `.Scan(val)` $DIR/core/chains/evm/types/address_test.go: `.EIP55AddressFromAddress(common.HexToAddress("0x0"))` $DIR/core/chains/evm/types/address_test.go: `.HexToAddress("0x0")` $DIR/core/chains/evm/types/address_test.go: `.EIP55AddressFromAddress(common.HexToAddress("0x1"))` $DIR/core/chains/evm/types/address_test.go: `.HexToAddress("0x1")` $DIR/core/chains/evm/types/address_test.go: `.IsZero()` $DIR/core/chains/evm/types/head_test.go: `t.Run(tc.Name, func(t *testing.T) { actual := tc.Head.LatestFinalizedHead() if tc.Finalized == nil { assert.Nil(t, actual) } else { require.NotNil(t, actual) assert.Equal(t, tc.Finalized.Number, actual.BlockNumber()) } })` $DIR/core/chains/evm/types/head_test.go: `.Run(tc.Name, func(t *testing.T) { actual := tc.Head.LatestFinalizedHead() if tc.Finalized == nil { assert.Nil(t, actual) } else { require.NotNil(t, actual) assert.Equal(t, tc.Finalized.Number, actual.BlockNumber()) } })` $DIR/core/chains/evm/types/head_test.go: `.Head.LatestFinalizedHead()` $DIR/core/chains/evm/types/models_test.go: `t.Run(test.want, func(t *testing.T) { num := evmtypes.NewHead(test.input, utils.NewHash(), utils.NewHash(), 0, nil) assert.Equal(t, test.want, fmt.Sprintf("%x", num.ToInt())) })` $DIR/core/chains/evm/types/models_test.go: `t.Run(test.name, func(t *testing.T) { assert.Equal(t, test.greater, test.left.GreaterThan(test.right)) })` $DIR/core/chains/evm/types/models_test.go: `t.Run(test.name, func(t *testing.T) { assert.Equal(t, test.want, test.bn.NextInt()) })` $DIR/core/chains/evm/types/models_test.go: `t.Run(strconv.Itoa(i), func(t *testing.T) { actual, err := test.ary.SafeByteSlice(test.start, test.end) assert.NoError(t, err) assert.Equal(t, test.expected, actual) })` $DIR/core/chains/evm/types/models_test.go: `t.Run(strconv.Itoa(i), func(t *testing.T) { actual, err := test.ary.SafeByteSlice(test.start, test.end) assert.EqualError(t, err, "out of bounds slice access") var expected []byte assert.Equal(t, expected, actual) })` $DIR/core/chains/evm/types/models_test.go: `t.Run(test.name, func(t *testing.T) { receipt := cltest.TxReceiptFromFixture(t, test.path) require.Equal(t, test.want, evmtypes.ReceiptIndicatesRunLogFulfillment(*receipt)) })` $DIR/core/chains/evm/types/models_test.go: `t.Run(test.name, func(t *testing.T) { var head evmtypes.Head err := head.UnmarshalJSON([]byte(test.json)) require.NoError(t, err) assert.Equal(t, test.expected.Hash, head.Hash) assert.Equal(t, test.expected.Number, head.Number) assert.Equal(t, test.expected.ParentHash, head.ParentHash) assert.Equal(t, test.expected.Timestamp.UTC().Unix(), head.Timestamp.UTC().Unix()) assert.Equal(t, test.expected.L1BlockNumber, head.L1BlockNumber) assert.Equal(t, test.expected.ReceiptsRoot, head.ReceiptsRoot) assert.Equal(t, test.expected.TransactionsRoot, head.TransactionsRoot) assert.Equal(t, test.expected.StateRoot, head.StateRoot) })` $DIR/core/chains/evm/types/models_test.go: `t.Run(test.name, func(t *testing.T) { bs, err := test.head.MarshalJSON() require.NoError(t, err) require.Equal(t, test.expected, string(bs)) })` $DIR/core/chains/evm/types/models_test.go: `t.Run("unmarshals parity block", func(t *testing.T) { b := new(evmtypes.Block) err := b.UnmarshalJSON([]byte(paritySampleBlock)) assert.NoError(t, err) assert.Equal(t, int64(32473599), b.Number) assert.Equal(t, "0x0ec62c2a397e114d84ce932387d841787d7ec5757ceba3708386da87934b7c82", b.Hash.Hex()) assert.Equal(t, "0x3aa1c729fb45888bc1ce777d00bad9637c0b5f7cb48b145ebacc16098e0132d4", b.ParentHash.Hex()) assert.Equal(t, assets.NewWeiI(7), b.BaseFeePerGas) assert.Equal(t, int64(1656602604), b.Timestamp.Unix()) assert.Len(t, b.Transactions, 2) })` $DIR/core/chains/evm/types/models_test.go: `t.Run("unmarshals geth block", func(t *testing.T) { b := new(evmtypes.Block) err := b.UnmarshalJSON([]byte(gethSampleBlock)) assert.NoError(t, err) assert.Equal(t, int64(15051090), b.Number) assert.Equal(t, "0x45eb0a650b6b0b9fd1ee676b870e43fa7614f1034f7404070327a332faed05c0", b.Hash.Hex()) assert.Equal(t, "0x653ea251c180d93296ef79378e64d7dc9a74f565a54df477faeb64d3330977dd", b.ParentHash.Hex()) assert.Equal(t, assets.NewWeiI(39678999761), b.BaseFeePerGas) assert.Equal(t, int64(1656603143), b.Timestamp.Unix()) assert.Len(t, b.Transactions, 7) })` $DIR/core/chains/evm/types/models_test.go: `t.Run("handles empty result", func(t *testing.T) { b := new(evmtypes.Block) err := b.UnmarshalJSON([]byte("null")) assert.Error(t, err) assert.Equal(t, pkgerrors.Cause(err), evmtypes.ErrMissingBlock) assert.True(t, pkgerrors.Is(err, evmtypes.ErrMissingBlock)) })` $DIR/core/chains/evm/types/models_test.go: `t.Run(tt.name, func(t *testing.T) { got := &evmtypes.Transaction{} err := got.UnmarshalJSON(tt.args.data) require.NoError(t, err) require.Equal(t, tt.want, got) })` $DIR/core/chains/evm/types/models_test.go: `err = json.Unmarshal(d, got)` $DIR/core/chains/evm/types/models_test.go: `err = json.Unmarshal(d, got)` $DIR/core/chains/evm/types/models_test.go: `t.Run("non zero", func(t *testing.T) { t.Parallel() want := evmtypes.TxType(2) d, err := json.Marshal(&want) require.NoError(t, err) got := new(evmtypes.TxType) err = json.Unmarshal(d, got) require.NoError(t, err) assert.Equal(t, want, *got) })` $DIR/core/chains/evm/types/models_test.go: `err = json.Unmarshal(d, got)` $DIR/core/chains/evm/types/models_test.go: `err = json.Unmarshal(d, got)` $DIR/core/chains/evm/types/models_test.go: `.NewInt(0)` $DIR/core/chains/evm/types/models_test.go: `.NewInt(0xf)` $DIR/core/chains/evm/types/models_test.go: `.NewInt(0x10)` $DIR/core/chains/evm/types/models_test.go: `.Run(test.want, func(t *testing.T) { num := evmtypes.NewHead(test.input, utils.NewHash(), utils.NewHash(), 0, nil) assert.Equal(t, test.want, fmt.Sprintf("%x", num.ToInt())) })` $DIR/core/chains/evm/types/models_test.go: `.NewHead(test.input, utils.NewHash(), utils.NewHash(), 0, nil)` $DIR/core/chains/evm/types/models_test.go: `.NewHash()` $DIR/core/chains/evm/types/models_test.go: `.NewHash()` $DIR/core/chains/evm/types/models_test.go: `.Head(1)` $DIR/core/chains/evm/types/models_test.go: `.Head(1)` $DIR/core/chains/evm/types/models_test.go: `.Head(1)` $DIR/core/chains/evm/types/models_test.go: `.Head(2)` $DIR/core/chains/evm/types/models_test.go: `.Head(2)` $DIR/core/chains/evm/types/models_test.go: `.Head(2)` $DIR/core/chains/evm/types/models_test.go: `.Head(2)` $DIR/core/chains/evm/types/models_test.go: `.Head(1)` $DIR/core/chains/evm/types/models_test.go: `.Run(test.name, func(t *testing.T) { assert.Equal(t, test.greater, test.left.GreaterThan(test.right)) })` $DIR/core/chains/evm/types/models_test.go: `.Head(1)` $DIR/core/chains/evm/types/models_test.go: `.NewInt(2)` $DIR/core/chains/evm/types/models_test.go: `.Run(test.name, func(t *testing.T) { assert.Equal(t, test.want, test.bn.NextInt()) })` $DIR/core/chains/evm/types/models_test.go: `.GetID()` $DIR/core/chains/evm/types/models_test.go: `.NewSqlxDB(t)` $DIR/core/chains/evm/types/models_test.go: `.NewKeyStore(t, db)` $DIR/core/chains/evm/types/models_test.go: `.Eth()` $DIR/core/chains/evm/types/models_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/chains/evm/types/models_test.go: `.NewLegacyTransaction(uint64(42), testutils.NewAddress(), big.NewInt(142), 242, big.NewInt(342), []byte{1, 2, 3})` $DIR/core/chains/evm/types/models_test.go: `.NewAddress()` $DIR/core/chains/evm/types/models_test.go: `.NewInt(142)` $DIR/core/chains/evm/types/models_test.go: `.NewInt(342)` $DIR/core/chains/evm/types/models_test.go: `.NewInt(3)` $DIR/core/chains/evm/types/models_test.go: `.SignTx(tests.Context(t), fromAddress, tx, chainID)` $DIR/core/chains/evm/types/models_test.go: `.Context(t)` $DIR/core/chains/evm/types/models_test.go: `.Bytes()` $DIR/core/chains/evm/types/models_test.go: `.GetGethSignedTx(attempt.SignedRawTx)` $DIR/core/chains/evm/types/models_test.go: `.Bytes()` $DIR/core/chains/evm/types/models_test.go: `.ChainLength()` $DIR/core/chains/evm/types/models_test.go: `.AsSlice(4)` $DIR/core/chains/evm/types/models_test.go: `.HexToFunctionSelector("0xb3f98adc")` $DIR/core/chains/evm/types/models_test.go: `.String()` $DIR/core/chains/evm/types/models_test.go: `.HexToFunctionSelector("0xb3f98adc123456")` $DIR/core/chains/evm/types/models_test.go: `.String()` $DIR/core/chains/evm/types/models_test.go: `.Unmarshal(bytes, &fid)` $DIR/core/chains/evm/types/models_test.go: `.String()` $DIR/core/chains/evm/types/models_test.go: `.Unmarshal(literalSelectorBytes, &fid)` $DIR/core/chains/evm/types/models_test.go: `.String()` $DIR/core/chains/evm/types/models_test.go: `.Unmarshal(bytes, &fid)` $DIR/core/chains/evm/types/models_test.go: `.Run(strconv.Itoa(i), func(t *testing.T) { actual, err := test.ary.SafeByteSlice(test.start, test.end) assert.NoError(t, err) assert.Equal(t, test.expected, actual) })` $DIR/core/chains/evm/types/models_test.go: `.Itoa(i)` $DIR/core/chains/evm/types/models_test.go: `.ary.SafeByteSlice(test.start, test.end)` $DIR/core/chains/evm/types/models_test.go: `.Run(strconv.Itoa(i), func(t *testing.T) { actual, err := test.ary.SafeByteSlice(test.start, test.end) assert.EqualError(t, err, "out of bounds slice access") var expected []byte assert.Equal(t, expected, actual) })` $DIR/core/chains/evm/types/models_test.go: `.Itoa(i)` $DIR/core/chains/evm/types/models_test.go: `.ary.SafeByteSlice(test.start, test.end)` $DIR/core/chains/evm/types/models_test.go: `.EarliestInChain()` $DIR/core/chains/evm/types/models_test.go: `.BlockNumber()` $DIR/core/chains/evm/types/models_test.go: `.NewHash()` $DIR/core/chains/evm/types/models_test.go: `.NewHash()` $DIR/core/chains/evm/types/models_test.go: `.NewHash()` $DIR/core/chains/evm/types/models_test.go: `.IsInChain(common.Hash{})` $DIR/core/chains/evm/types/models_test.go: `.Run(test.name, func(t *testing.T) { receipt := cltest.TxReceiptFromFixture(t, test.path) require.Equal(t, test.want, evmtypes.ReceiptIndicatesRunLogFulfillment(*receipt)) })` $DIR/core/chains/evm/types/models_test.go: `.TxReceiptFromFixture(t, test.path)` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0x41800b5c3f1717687d85fc9018faac0a6e90b39deaa0b99e7fe4fe796ddeb26a")` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d")` $DIR/core/chains/evm/types/models_test.go: `.Unix(0x58318da2, 0)` $DIR/core/chains/evm/types/models_test.go: `.UTC()` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421")` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421")` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0xc7b01007a10da045eacb90385887dd0c38fcb5db7393006bdde24b93873c334b")` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0x41800b5c3f1717687d85fc9018faac0a6e90b39deaa0b99e7fe4fe796ddeb26a")` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d")` $DIR/core/chains/evm/types/models_test.go: `.Unix(0x58318da2, 0)` $DIR/core/chains/evm/types/models_test.go: `.UTC()` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421")` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421")` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0xc7b01007a10da045eacb90385887dd0c38fcb5db7393006bdde24b93873c334b")` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0x752dab43f7a2482db39227d46cd307623b26167841e2207e93e7566ab7ab7871")` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0x923ad1e27c1d43cb2d2fb09e26d2502ca4b4914a2e0599161d279c6c06117d34")` $DIR/core/chains/evm/types/models_test.go: `.Unix(0x60d0952d, 0)` $DIR/core/chains/evm/types/models_test.go: `.UTC()` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0x2c292672b8fc9d223647a2569e19721f0757c96a1421753a93e141f8e56cf504")` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0x71448077f5ce420a8e24db62d4d58e8d8e6ad2c7e76318868e089d41f7e0faf3")` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000000")` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0x752dab43f7a2482db39227d46cd307623b26167841e2207e93e7566ab7ab7871")` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0x923ad1e27c1d43cb2d2fb09e26d2502ca4b4914a2e0599161d279c6c06117d34")` $DIR/core/chains/evm/types/models_test.go: `.Unix(0x60d0952d, 0)` $DIR/core/chains/evm/types/models_test.go: `.UTC()` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0x2c292672b8fc9d223647a2569e19721f0757c96a1421753a93e141f8e56cf504")` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0x71448077f5ce420a8e24db62d4d58e8d8e6ad2c7e76318868e089d41f7e0faf3")` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000000")` $DIR/core/chains/evm/types/models_test.go: `.Run(test.name, func(t *testing.T) { var head evmtypes.Head err := head.UnmarshalJSON([]byte(test.json)) require.NoError(t, err) assert.Equal(t, test.expected.Hash, head.Hash) assert.Equal(t, test.expected.Number, head.Number) assert.Equal(t, test.expected.ParentHash, head.ParentHash) assert.Equal(t, test.expected.Timestamp.UTC().Unix(), head.Timestamp.UTC().Unix()) assert.Equal(t, test.expected.L1BlockNumber, head.L1BlockNumber) assert.Equal(t, test.expected.ReceiptsRoot, head.ReceiptsRoot) assert.Equal(t, test.expected.TransactionsRoot, head.TransactionsRoot) assert.Equal(t, test.expected.StateRoot, head.StateRoot) })` $DIR/core/chains/evm/types/models_test.go: `.UnmarshalJSON([]byte(test.json))` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0x41800b5c3f1717687d85fc9018faac0a6e90b39deaa0b99e7fe4fe796ddeb26a")` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d")` $DIR/core/chains/evm/types/models_test.go: `.Unix(0x58318da2, 0)` $DIR/core/chains/evm/types/models_test.go: `.UTC()` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421")` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421")` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0xc7b01007a10da045eacb90385887dd0c38fcb5db7393006bdde24b93873c334b")` $DIR/core/chains/evm/types/models_test.go: `.Run(test.name, func(t *testing.T) { bs, err := test.head.MarshalJSON() require.NoError(t, err) require.Equal(t, test.expected, string(bs)) })` $DIR/core/chains/evm/types/models_test.go: `.head.MarshalJSON()` $DIR/core/chains/evm/types/models_test.go: `.Run("unmarshals parity block", func(t *testing.T) { b := new(evmtypes.Block) err := b.UnmarshalJSON([]byte(paritySampleBlock)) assert.NoError(t, err) assert.Equal(t, int64(32473599), b.Number) assert.Equal(t, "0x0ec62c2a397e114d84ce932387d841787d7ec5757ceba3708386da87934b7c82", b.Hash.Hex()) assert.Equal(t, "0x3aa1c729fb45888bc1ce777d00bad9637c0b5f7cb48b145ebacc16098e0132d4", b.ParentHash.Hex()) assert.Equal(t, assets.NewWeiI(7), b.BaseFeePerGas) assert.Equal(t, int64(1656602604), b.Timestamp.Unix()) assert.Len(t, b.Transactions, 2) })` $DIR/core/chains/evm/types/models_test.go: `.UnmarshalJSON([]byte(paritySampleBlock))` $DIR/core/chains/evm/types/models_test.go: `.Run("unmarshals geth block", func(t *testing.T) { b := new(evmtypes.Block) err := b.UnmarshalJSON([]byte(gethSampleBlock)) assert.NoError(t, err) assert.Equal(t, int64(15051090), b.Number) assert.Equal(t, "0x45eb0a650b6b0b9fd1ee676b870e43fa7614f1034f7404070327a332faed05c0", b.Hash.Hex()) assert.Equal(t, "0x653ea251c180d93296ef79378e64d7dc9a74f565a54df477faeb64d3330977dd", b.ParentHash.Hex()) assert.Equal(t, assets.NewWeiI(39678999761), b.BaseFeePerGas) assert.Equal(t, int64(1656603143), b.Timestamp.Unix()) assert.Len(t, b.Transactions, 7) })` $DIR/core/chains/evm/types/models_test.go: `.UnmarshalJSON([]byte(gethSampleBlock))` $DIR/core/chains/evm/types/models_test.go: `.Run("handles empty result", func(t *testing.T) { b := new(evmtypes.Block) err := b.UnmarshalJSON([]byte("null")) assert.Error(t, err) assert.Equal(t, pkgerrors.Cause(err), evmtypes.ErrMissingBlock) assert.True(t, pkgerrors.Is(err, evmtypes.ErrMissingBlock)) })` $DIR/core/chains/evm/types/models_test.go: `.UnmarshalJSON([]byte("null"))` $DIR/core/chains/evm/types/models_test.go: `.UnmarshalJSON([]byte(eip4844Block))` $DIR/core/chains/evm/types/models_test.go: `.NewWei(mustHexToBig(t, "978a846d2"))` $DIR/core/chains/evm/types/models_test.go: `.NewWei(mustHexToBig(t, "d0892241d"))` $DIR/core/chains/evm/types/models_test.go: `.NewWei(mustHexToBig(t, "3b9aca01"))` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0x754f49f0a2ca7680806d261dd36ee95ac88a81da59fef0b5d8d691478f075d46")` $DIR/core/chains/evm/types/models_test.go: `.NewWei(mustHexToBig(t, "17d9abf8b5"))` $DIR/core/chains/evm/types/models_test.go: `.NewWei(mustHexToBig(t, "8bb2c97000"))` $DIR/core/chains/evm/types/models_test.go: `.NewWei(mustHexToBig(t, "165a0bc00"))` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0xa97e14a2e87d322fcb97edc4b25cd976d18963cfad19bfd4b9c8066a6a2d97cf")` $DIR/core/chains/evm/types/models_test.go: `.NewWei(mustHexToBig(t, "4f7915f5"))` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0xbe6122d6aaf84fb85f4df136d4662c6dc344248e987255c0daa1193b3f17d5a9")` $DIR/core/chains/evm/types/models_test.go: `.Run(tt.name, func(t *testing.T) { got := &evmtypes.Transaction{} err := got.UnmarshalJSON(tt.args.data) require.NoError(t, err) require.Equal(t, tt.want, got) })` $DIR/core/chains/evm/types/models_test.go: `.UnmarshalJSON(tt.args.data)` $DIR/core/chains/evm/types/models_test.go: `.NewWei(mustHexToBig(t, "978a846d2"))` $DIR/core/chains/evm/types/models_test.go: `.NewWei(mustHexToBig(t, "d0892241d"))` $DIR/core/chains/evm/types/models_test.go: `.NewWei(mustHexToBig(t, "3b9aca01"))` $DIR/core/chains/evm/types/models_test.go: `.TxType(2)` $DIR/core/chains/evm/types/models_test.go: `.HexToHash("0x754f49f0a2ca7680806d261dd36ee95ac88a81da59fef0b5d8d691478f075d46")` $DIR/core/chains/evm/types/models_test.go: `.Marshal(want)` $DIR/core/chains/evm/types/models_test.go: `.Unmarshal(d, got)` $DIR/core/chains/evm/types/models_test.go: `.Marshal(smallBlock)` $DIR/core/chains/evm/types/models_test.go: `.Unmarshal(d, got)` $DIR/core/chains/evm/types/models_test.go: `.Run("non zero", func(t *testing.T) { t.Parallel() want := evmtypes.TxType(2) d, err := json.Marshal(&want) require.NoError(t, err) got := new(evmtypes.TxType) err = json.Unmarshal(d, got) require.NoError(t, err) assert.Equal(t, want, *got) })` $DIR/core/chains/evm/types/models_test.go: `.TxType(2)` $DIR/core/chains/evm/types/models_test.go: `.Marshal(&want)` $DIR/core/chains/evm/types/models_test.go: `.Unmarshal(d, got)` $DIR/core/chains/evm/types/models_test.go: `.TxType(0)` $DIR/core/chains/evm/types/models_test.go: `.Marshal(&want)` $DIR/core/chains/evm/types/models_test.go: `.Unmarshal(d, got)` $DIR/core/chains/evm/types/types_test.go: `zeroTxHash.TxHash = common.HexToHash("0x0")` $DIR/core/chains/evm/types/types_test.go: `receipt = types.FromGethReceipt(&zeroTxHash)` $DIR/core/chains/evm/types/types_test.go: `zeroBlockHash.BlockHash = common.HexToHash("0x0")` $DIR/core/chains/evm/types/types_test.go: `receipt = types.FromGethReceipt(&zeroBlockHash)` $DIR/core/chains/evm/types/types_test.go: `err = parsedReceipt.UnmarshalJSON(json)` $DIR/core/chains/evm/types/types_test.go: `err = parsedLog.UnmarshalJSON(json)` $DIR/core/chains/evm/types/types_test.go: `.FromGethReceipt(testGethReceipt)` $DIR/core/chains/evm/types/types_test.go: `.FromGethReceipt(testGethReceipt)` $DIR/core/chains/evm/types/types_test.go: `.HexToHash("0x0")` $DIR/core/chains/evm/types/types_test.go: `.FromGethReceipt(&zeroTxHash)` $DIR/core/chains/evm/types/types_test.go: `.IsZero()` $DIR/core/chains/evm/types/types_test.go: `.FromGethReceipt(testGethReceipt)` $DIR/core/chains/evm/types/types_test.go: `.HexToHash("0x0")` $DIR/core/chains/evm/types/types_test.go: `.FromGethReceipt(&zeroBlockHash)` $DIR/core/chains/evm/types/types_test.go: `.IsUnmined()` $DIR/core/chains/evm/types/types_test.go: `.FromGethReceipt(testGethReceipt)` $DIR/core/chains/evm/types/types_test.go: `.MarshalJSON()` $DIR/core/chains/evm/types/types_test.go: `.UnmarshalJSON(json)` $DIR/core/chains/evm/types/types_test.go: `.FromGethLog(testGethLog1)` $DIR/core/chains/evm/types/types_test.go: `.MarshalJSON()` $DIR/core/chains/evm/types/types_test.go: `.UnmarshalJSON(json)` $DIR/core/chains/evm/types/types_test.go: `.DecodeString("2ab9a2dc53736b361b72d900cdf9f78f9406fbbb")` $DIR/core/chains/evm/types/types_test.go: `.DecodeString("56b9a2dc53736b361b72d900cdf9f78f9406fbbb")` $DIR/core/chains/evm/types/types_test.go: `.DecodeString("6b361b72d900cdf9f78f9406fbbb6b361b72d900cdf9f78f9406fbbb")` $DIR/core/chains/evm/types/types_test.go: `.DecodeString("2ab9130c6b361b72d900cdf9f78f9406fbbb6b361b72d900cdf9f78f9406fbbb")` $DIR/core/chains/evm/types/types_test.go: `.DecodeString("56b9a2dc53736b361b72d900cdf9f78f9406fbbb06fbbb6b361b7206fbbb6b36")` $DIR/core/chains/evm/types/types_test.go: `.DecodeString("6b361b72d900cdf9f78f9406fbbb6b361b72d900cdf9f78f9406fbbb")` $DIR/core/chains/evm/utils/big/big_test.go: `t.Run(tc.payload, func(t *testing.T) { var b BigFloat err := json.Unmarshal([]byte(tc.payload), &b) require.NoError(t, err) assert.Equal(t, tc.exp.String(), b.Value().String()) })` $DIR/core/chains/evm/utils/big/big_test.go: `t.Run(tc.payload, func(t *testing.T) { var b BigFloat err := json.Unmarshal([]byte(tc.payload), &b) require.NoError(t, err) assert.Equal(t, tc.exp.String(), b.Value().String()) })` $DIR/core/chains/evm/utils/big/big_test.go: `t.Run(test.name, func(t *testing.T) { err := i.UnmarshalText([]byte(test.input)) require.NoError(t, err) assert.Equal(t, test.want, i.ToInt()) })` $DIR/core/chains/evm/utils/big/big_test.go: `t.Run(test.name, func(t *testing.T) { err := i.UnmarshalText([]byte(test.input)) require.Error(t, err) })` $DIR/core/chains/evm/utils/big/big_test.go: `t.Run(test.name, func(t *testing.T) { i := (*Big)(test.input) b, err := json.Marshal(&i) assert.NoError(t, err) assert.Equal(t, test.want, string(b)) })` $DIR/core/chains/evm/utils/big/big_test.go: `t.Run(test.name, func(t *testing.T) { i := new(Big) err := json.Unmarshal([]byte(test.input), &i) assert.NoError(t, err) assert.Equal(t, test.want, i) })` $DIR/core/chains/evm/utils/big/big_test.go: `t.Run(test.name, func(t *testing.T) { i := new(Big) err := json.Unmarshal([]byte(test.input), &i) assert.Error(t, err) })` $DIR/core/chains/evm/utils/big/big_test.go: `t.Run(test.name, func(t *testing.T) { big := &Big{} err := big.Scan(test.input) require.NoError(t, err) assert.Equal(t, test.want, big) })` $DIR/core/chains/evm/utils/big/big_test.go: `t.Run(test.name, func(t *testing.T) { big := &Big{} err := big.Scan(test.input) require.Error(t, err) })` $DIR/core/chains/evm/utils/big/big_test.go: `.NewFloat(1)` $DIR/core/chains/evm/utils/big/big_test.go: `.Marshal(tc.obj)` $DIR/core/chains/evm/utils/big/big_test.go: `.NewFloat(-1)` $DIR/core/chains/evm/utils/big/big_test.go: `.NewFloat(-1)` $DIR/core/chains/evm/utils/big/big_test.go: `.NewFloat(100)` $DIR/core/chains/evm/utils/big/big_test.go: `.NewFloat(100)` $DIR/core/chains/evm/utils/big/big_test.go: `.NewFloat(3.146)` $DIR/core/chains/evm/utils/big/big_test.go: `.NewFloat(3.146)` $DIR/core/chains/evm/utils/big/big_test.go: `.Run(tc.payload, func(t *testing.T) { var b BigFloat err := json.Unmarshal([]byte(tc.payload), &b) require.NoError(t, err) assert.Equal(t, tc.exp.String(), b.Value().String()) })` $DIR/core/chains/evm/utils/big/big_test.go: `.Unmarshal([]byte(tc.payload), &b)` $DIR/core/chains/evm/utils/big/big_test.go: `.NewFloat(-1)` $DIR/core/chains/evm/utils/big/big_test.go: `.NewFloat(100)` $DIR/core/chains/evm/utils/big/big_test.go: `.NewFloat(3.146)` $DIR/core/chains/evm/utils/big/big_test.go: `.RequireFromString("1.000000000000000001")` $DIR/core/chains/evm/utils/big/big_test.go: `.BigFloat()` $DIR/core/chains/evm/utils/big/big_test.go: `.RequireFromString("1000000.000000000000000001")` $DIR/core/chains/evm/utils/big/big_test.go: `.BigFloat()` $DIR/core/chains/evm/utils/big/big_test.go: `.RequireFromString("1000000000.000000000000000001")` $DIR/core/chains/evm/utils/big/big_test.go: `.BigFloat()` $DIR/core/chains/evm/utils/big/big_test.go: `.Run(tc.payload, func(t *testing.T) { var b BigFloat err := json.Unmarshal([]byte(tc.payload), &b) require.NoError(t, err) assert.Equal(t, tc.exp.String(), b.Value().String()) })` $DIR/core/chains/evm/utils/big/big_test.go: `.Unmarshal([]byte(tc.payload), &b)` $DIR/core/chains/evm/utils/big/big_test.go: `.NewInt(1234)` $DIR/core/chains/evm/utils/big/big_test.go: `.NewInt(1234)` $DIR/core/chains/evm/utils/big/big_test.go: `.NewInt(4660)` $DIR/core/chains/evm/utils/big/big_test.go: `.NewInt(4660)` $DIR/core/chains/evm/utils/big/big_test.go: `.NewInt(1234)` $DIR/core/chains/evm/utils/big/big_test.go: `.Run(test.name, func(t *testing.T) { err := i.UnmarshalText([]byte(test.input)) require.NoError(t, err) assert.Equal(t, test.want, i.ToInt()) })` $DIR/core/chains/evm/utils/big/big_test.go: `.UnmarshalText([]byte(test.input))` $DIR/core/chains/evm/utils/big/big_test.go: `.NewInt(0)` $DIR/core/chains/evm/utils/big/big_test.go: `.NewInt(0)` $DIR/core/chains/evm/utils/big/big_test.go: `.NewInt(0)` $DIR/core/chains/evm/utils/big/big_test.go: `.Run(test.name, func(t *testing.T) { err := i.UnmarshalText([]byte(test.input)) require.Error(t, err) })` $DIR/core/chains/evm/utils/big/big_test.go: `.UnmarshalText([]byte(test.input))` $DIR/core/chains/evm/utils/big/big_test.go: `.SetString("9223372036854775808", 10)` $DIR/core/chains/evm/utils/big/big_test.go: `.NewInt(0)` $DIR/core/chains/evm/utils/big/big_test.go: `.NewInt(1234)` $DIR/core/chains/evm/utils/big/big_test.go: `.Run(test.name, func(t *testing.T) { i := (*Big)(test.input) b, err := json.Marshal(&i) assert.NoError(t, err) assert.Equal(t, test.want, string(b)) })` $DIR/core/chains/evm/utils/big/big_test.go: `.Marshal(&i)` $DIR/core/chains/evm/utils/big/big_test.go: `.SetString("9223372036854775808", 10)` $DIR/core/chains/evm/utils/big/big_test.go: `.NewInt(0)` $DIR/core/chains/evm/utils/big/big_test.go: `.NewInt(1234)` $DIR/core/chains/evm/utils/big/big_test.go: `.Run(test.name, func(t *testing.T) { i := new(Big) err := json.Unmarshal([]byte(test.input), &i) assert.NoError(t, err) assert.Equal(t, test.want, i) })` $DIR/core/chains/evm/utils/big/big_test.go: `.Unmarshal([]byte(test.input), &i)` $DIR/core/chains/evm/utils/big/big_test.go: `.Run(test.name, func(t *testing.T) { i := new(Big) err := json.Unmarshal([]byte(test.input), &i) assert.Error(t, err) })` $DIR/core/chains/evm/utils/big/big_test.go: `.Unmarshal([]byte(test.input), &i)` $DIR/core/chains/evm/utils/big/big_test.go: `.SetString("115792089237316195423570985008687907853269984665640564039457584007913129639935", 10)` $DIR/core/chains/evm/utils/big/big_test.go: `.NewInt(0)` $DIR/core/chains/evm/utils/big/big_test.go: `.NewInt(1)` $DIR/core/chains/evm/utils/big/big_test.go: `.NewInt(0)` $DIR/core/chains/evm/utils/big/big_test.go: `.NewInt(14)` $DIR/core/chains/evm/utils/big/big_test.go: `.Run(test.name, func(t *testing.T) { big := &Big{} err := big.Scan(test.input) require.NoError(t, err) assert.Equal(t, test.want, big) })` $DIR/core/chains/evm/utils/big/big_test.go: `.Scan(test.input)` $DIR/core/chains/evm/utils/big/big_test.go: `.Run(test.name, func(t *testing.T) { big := &Big{} err := big.Scan(test.input) require.Error(t, err) })` $DIR/core/chains/evm/utils/big/big_test.go: `.Scan(test.input)` $DIR/core/chains/evm/utils/ethabi_test.go: `val, err = EVMWordSignedBigInt(new(big.Int).SetInt64(1))` $DIR/core/chains/evm/utils/ethabi_test.go: `val, err = EVMWordSignedBigInt(new(big.Int).SetInt64(256))` $DIR/core/chains/evm/utils/ethabi_test.go: `val, err = EVMWordSignedBigInt(new(big.Int).SetInt64(-1))` $DIR/core/chains/evm/utils/ethabi_test.go: `val, err = EVMWordSignedBigInt(MaxInt256)` $DIR/core/chains/evm/utils/ethabi_test.go: `val, err = EVMWordSignedBigInt(new(big.Int).Add(MaxInt256, big.NewInt(1)))` $DIR/core/chains/evm/utils/ethabi_test.go: `val, err = EVMWordBigInt(new(big.Int).SetInt64(1))` $DIR/core/chains/evm/utils/ethabi_test.go: `val, err = EVMWordBigInt(new(big.Int).SetInt64(256))` $DIR/core/chains/evm/utils/ethabi_test.go: `val, err = EVMWordBigInt(new(big.Int).SetInt64(-1))` $DIR/core/chains/evm/utils/ethabi_test.go: `val, err = EVMWordBigInt(MaxUint256)` $DIR/core/chains/evm/utils/ethabi_test.go: `val, err = EVMWordBigInt(new(big.Int).Add(MaxUint256, big.NewInt(1)))` $DIR/core/chains/evm/utils/ethabi_test.go: `t.Run(test.name, func(t *testing.T) { input := gjson.Parse(test.input) out, err := EVMTranscodeBytes(input) assert.NoError(t, err) assert.Equal(t, test.output, hexutil.Encode(out)) })` $DIR/core/chains/evm/utils/ethabi_test.go: `t.Run(test.name, func(t *testing.T) { out, err := EVMTranscodeBool(test.input) assert.NoError(t, err) assert.Equal(t, test.output, hexutil.Encode(out)) })` $DIR/core/chains/evm/utils/ethabi_test.go: `t.Run(test.name, func(t *testing.T) { out, err := EVMTranscodeUint256(test.input) if test.wantError { assert.Error(t, err) } else { assert.NoError(t, err) assert.Equal(t, test.output, hexutil.Encode(out)) } })` $DIR/core/chains/evm/utils/ethabi_test.go: `t.Run(test.name, func(t *testing.T) { out, err := EVMTranscodeInt256(test.input) if test.wantError { assert.Error(t, err) } else { assert.NoError(t, err) assert.Equal(t, test.output, hexutil.Encode(out)) } })` $DIR/core/chains/evm/utils/ethabi_test.go: `t.Run(test.name, func(t *testing.T) { input := gjson.GetBytes([]byte(test.input), "result") out, err := EVMTranscodeJSONWithFormat(input, test.format) require.NoError(t, err) assert.Equal(t, test.output, hexutil.Encode(out)) })` $DIR/core/chains/evm/utils/ethabi_test.go: `t.Run(tc.name, func(t *testing.T) { abiBytes, err := ABIEncode(tc.abiStr, tc.vals...) if tc.expectErr { t.Log(err) require.Error(t, err) return } require.NoError(t, err) res, err := ABIDecode(tc.abiStr, abiBytes) require.NoError(t, err) assert.Equal(t, tc.vals, res) })` $DIR/core/chains/evm/utils/ethabi_test.go: `.MustDecode("0x000000000000000000000000000000000000000000000000ffffffffffffffff")` $DIR/core/chains/evm/utils/ethabi_test.go: `.NewInt(1)` $DIR/core/chains/evm/utils/ethabi_test.go: `.NewInt(256)` $DIR/core/chains/evm/utils/ethabi_test.go: `.Sub(pow2(128), big.NewInt(1))` $DIR/core/chains/evm/utils/ethabi_test.go: `.NewInt(1)` $DIR/core/chains/evm/utils/ethabi_test.go: `.NewInt(-1)` $DIR/core/chains/evm/utils/ethabi_test.go: `.SetInt64(1)` $DIR/core/chains/evm/utils/ethabi_test.go: `.SetInt64(256)` $DIR/core/chains/evm/utils/ethabi_test.go: `.SetInt64(-1)` $DIR/core/chains/evm/utils/ethabi_test.go: `.Add(MaxInt256, big.NewInt(1))` $DIR/core/chains/evm/utils/ethabi_test.go: `.NewInt(1)` $DIR/core/chains/evm/utils/ethabi_test.go: `.SetInt64(1)` $DIR/core/chains/evm/utils/ethabi_test.go: `.SetInt64(256)` $DIR/core/chains/evm/utils/ethabi_test.go: `.SetInt64(-1)` $DIR/core/chains/evm/utils/ethabi_test.go: `.Add(MaxUint256, big.NewInt(1))` $DIR/core/chains/evm/utils/ethabi_test.go: `.NewInt(1)` $DIR/core/chains/evm/utils/ethabi_test.go: `.Run(test.name, func(t *testing.T) { input := gjson.Parse(test.input) out, err := EVMTranscodeBytes(input) assert.NoError(t, err) assert.Equal(t, test.output, hexutil.Encode(out)) })` $DIR/core/chains/evm/utils/ethabi_test.go: `.Parse(test.input)` $DIR/core/chains/evm/utils/ethabi_test.go: `.Parse("1e+300")` $DIR/core/chains/evm/utils/ethabi_test.go: `.Parse("{}")` $DIR/core/chains/evm/utils/ethabi_test.go: `.Run(test.name, func(t *testing.T) { out, err := EVMTranscodeBool(test.input) assert.NoError(t, err) assert.Equal(t, test.output, hexutil.Encode(out)) })` $DIR/core/chains/evm/utils/ethabi_test.go: `.Run(test.name, func(t *testing.T) { out, err := EVMTranscodeUint256(test.input) if test.wantError { assert.Error(t, err) } else { assert.NoError(t, err) assert.Equal(t, test.output, hexutil.Encode(out)) } })` $DIR/core/chains/evm/utils/ethabi_test.go: `.Run(test.name, func(t *testing.T) { out, err := EVMTranscodeInt256(test.input) if test.wantError { assert.Error(t, err) } else { assert.NoError(t, err) assert.Equal(t, test.output, hexutil.Encode(out)) } })` $DIR/core/chains/evm/utils/ethabi_test.go: `.Run(test.name, func(t *testing.T) { input := gjson.GetBytes([]byte(test.input), "result") out, err := EVMTranscodeJSONWithFormat(input, test.format) require.NoError(t, err) assert.Equal(t, test.output, hexutil.Encode(out)) })` $DIR/core/chains/evm/utils/ethabi_test.go: `.GetBytes([]byte(test.input), "result")` $DIR/core/chains/evm/utils/ethabi_test.go: `.NewInt(10)` $DIR/core/chains/evm/utils/ethabi_test.go: `.NewInt(12)` $DIR/core/chains/evm/utils/ethabi_test.go: `.NewInt(10)` $DIR/core/chains/evm/utils/ethabi_test.go: `.NewInt(1)` $DIR/core/chains/evm/utils/ethabi_test.go: `.NewInt(10)` $DIR/core/chains/evm/utils/ethabi_test.go: `.Run(tc.name, func(t *testing.T) { abiBytes, err := ABIEncode(tc.abiStr, tc.vals...) if tc.expectErr { t.Log(err) require.Error(t, err) return } require.NoError(t, err) res, err := ABIDecode(tc.abiStr, abiBytes) require.NoError(t, err) assert.Equal(t, tc.vals, res) })` $DIR/core/chains/evm/utils/utils_test.go: `t.Run(test.name, func(t *testing.T) { input, err := hexutil.Decode(test.input) assert.NoError(t, err) result, err := utils.Keccak256(input) assert.NoError(t, err) assert.Equal(t, test.want, hexutil.Encode(result)) })` $DIR/core/chains/evm/utils/utils_test.go: `t.Run(test.name, func(t *testing.T) { t.Parallel() actual := utils.IsEmptyAddress(test.addr) assert.Equal(t, test.want, actual) })` $DIR/core/chains/evm/utils/utils_test.go: `_, err = utils.Uint256ToBytes(large)` $DIR/core/chains/evm/utils/utils_test.go: `_, _ = utils.Uint256ToBytes(negative)` $DIR/core/chains/evm/utils/utils_test.go: `err = utils.CheckUint256(negative)` $DIR/core/chains/evm/utils/utils_test.go: `err = utils.CheckUint256(big.NewInt(123))` $DIR/core/chains/evm/utils/utils_test.go: `b, err = utils.HexToUint256("0xFFFFFFFF")` $DIR/core/chains/evm/utils/utils_test.go: `bs.Sleep()` $DIR/core/chains/evm/utils/utils_test.go: `bs.Min = d` $DIR/core/chains/evm/utils/utils_test.go: `bs.Factor = 2` $DIR/core/chains/evm/utils/utils_test.go: `bs.Sleep()` $DIR/core/chains/evm/utils/utils_test.go: `bs.Reset()` $DIR/core/chains/evm/utils/utils_test.go: `utils.RetryWithBackoff(ctx, func() bool { return false })` $DIR/core/chains/evm/utils/utils_test.go: `go utils.RetryWithBackoff(ctx, retry)` $DIR/core/chains/evm/utils/utils_test.go: `cancel()` $DIR/core/chains/evm/utils/utils_test.go: `utils.RetryWithBackoff(ctx, retry)` $DIR/core/chains/evm/utils/utils_test.go: `.Run(test.name, func(t *testing.T) { input, err := hexutil.Decode(test.input) assert.NoError(t, err) result, err := utils.Keccak256(input) assert.NoError(t, err) assert.Equal(t, test.want, hexutil.Encode(result)) })` $DIR/core/chains/evm/utils/utils_test.go: `.Decode(test.input)` $DIR/core/chains/evm/utils/utils_test.go: `.Keccak256(input)` $DIR/core/chains/evm/utils/utils_test.go: `.NewAddress()` $DIR/core/chains/evm/utils/utils_test.go: `.Run(test.name, func(t *testing.T) { t.Parallel() actual := utils.IsEmptyAddress(test.addr) assert.Equal(t, test.want, actual) })` $DIR/core/chains/evm/utils/utils_test.go: `.IsEmptyAddress(test.addr)` $DIR/core/chains/evm/utils/utils_test.go: `.ToLower(address)` $DIR/core/chains/evm/utils/utils_test.go: `.ToUpper(address)` $DIR/core/chains/evm/utils/utils_test.go: `.Combine(lowerErr, upperErr)` $DIR/core/chains/evm/utils/utils_test.go: `.NewInt(0)` $DIR/core/chains/evm/utils/utils_test.go: `.Sub(utils.MaxUint256, big.NewInt(1))` $DIR/core/chains/evm/utils/utils_test.go: `.NewInt(1)` $DIR/core/chains/evm/utils/utils_test.go: `.Uint256ToBytes(v)` $DIR/core/chains/evm/utils/utils_test.go: `.Uint256ToBytes32(v)` $DIR/core/chains/evm/utils/utils_test.go: `.NewInt(0)` $DIR/core/chains/evm/utils/utils_test.go: `.Add(utils.MaxUint256, big.NewInt(1))` $DIR/core/chains/evm/utils/utils_test.go: `.NewInt(1)` $DIR/core/chains/evm/utils/utils_test.go: `.Uint256ToBytes(large)` $DIR/core/chains/evm/utils/utils_test.go: `.NewInt(-1)` $DIR/core/chains/evm/utils/utils_test.go: `.Uint256ToBytes(negative)` $DIR/core/chains/evm/utils/utils_test.go: `.NewInt(0)` $DIR/core/chains/evm/utils/utils_test.go: `.Add(utils.MaxUint256, big.NewInt(1))` $DIR/core/chains/evm/utils/utils_test.go: `.NewInt(1)` $DIR/core/chains/evm/utils/utils_test.go: `.CheckUint256(large)` $DIR/core/chains/evm/utils/utils_test.go: `.NewInt(-123)` $DIR/core/chains/evm/utils/utils_test.go: `.CheckUint256(negative)` $DIR/core/chains/evm/utils/utils_test.go: `.CheckUint256(big.NewInt(123))` $DIR/core/chains/evm/utils/utils_test.go: `.NewInt(123)` $DIR/core/chains/evm/utils/utils_test.go: `.RandUint256()` $DIR/core/chains/evm/utils/utils_test.go: `.HexToUint256("0x00")` $DIR/core/chains/evm/utils/utils_test.go: `.HexToUint256("0xFFFFFFFF")` $DIR/core/chains/evm/utils/utils_test.go: `.Cmp(big.NewInt(4294967295))` $DIR/core/chains/evm/utils/utils_test.go: `.NewInt(4294967295)` $DIR/core/chains/evm/utils/utils_test.go: `.NewHash()` $DIR/core/chains/evm/utils/utils_test.go: `.NewHash()` $DIR/core/chains/evm/utils/utils_test.go: `.HexToHash("0x0")` $DIR/core/chains/evm/utils/utils_test.go: `.PadByteToHash(1)` $DIR/core/chains/evm/utils/utils_test.go: `.String()` $DIR/core/chains/evm/utils/utils_test.go: `.NewBackoffSleeper()` $DIR/core/chains/evm/utils/utils_test.go: `.Sleep()` $DIR/core/chains/evm/utils/utils_test.go: `.Sleep()` $DIR/core/chains/evm/utils/utils_test.go: `.Reset()` $DIR/core/chains/evm/utils/utils_test.go: `.Duration(0)` $DIR/core/chains/evm/utils/utils_test.go: `.Duration()` $DIR/core/chains/evm/utils/utils_test.go: `.WithCancel(tests.Context(t))` $DIR/core/chains/evm/utils/utils_test.go: `.Context(t)` $DIR/core/chains/evm/utils/utils_test.go: `.RetryWithBackoff(ctx, func() bool { return false })` $DIR/core/chains/evm/utils/utils_test.go: `.Add(1)` $DIR/core/chains/evm/utils/utils_test.go: `.RetryWithBackoff(ctx, retry)` $DIR/core/chains/evm/utils/utils_test.go: `.RetryWithBackoff(ctx, retry)` $DIR/core/chains/evm/utils/utils_test.go: `.Load()` $DIR/core/chains/legacyevm/chain_test.go: `c.On("ID").Return(big.NewInt(7))` $DIR/core/chains/legacyevm/chain_test.go: `t.Run(tt.name, func(t *testing.T) { o := legacyevm.ChainOpts{ AppConfig: tt.fields.AppConfig, MailMon: tt.fields.MailMon, DS: tt.fields.DB, } if err := o.Validate(); (err != nil) != tt.wantErr { t.Errorf("ChainOpts.Validate() error = %v, wantErr %v", err, tt.wantErr) } })` $DIR/core/chains/legacyevm/chain_test.go: `.NewGeneralConfig(t, nil)` $DIR/core/chains/legacyevm/chain_test.go: `.NewChain(t)` $DIR/core/chains/legacyevm/chain_test.go: `.On("ID")` $DIR/core/chains/legacyevm/chain_test.go: `.Return(big.NewInt(7))` $DIR/core/chains/legacyevm/chain_test.go: `.NewInt(7)` $DIR/core/chains/legacyevm/chain_test.go: `.ID()` $DIR/core/chains/legacyevm/chain_test.go: `.String()` $DIR/core/chains/legacyevm/chain_test.go: `.NewLegacyChains(m, legacyevmCfg.EVMConfigs())` $DIR/core/chains/legacyevm/chain_test.go: `.EVMConfigs()` $DIR/core/chains/legacyevm/chain_test.go: `.Get(c.ID().String())` $DIR/core/chains/legacyevm/chain_test.go: `.ID()` $DIR/core/chains/legacyevm/chain_test.go: `.String()` $DIR/core/chains/legacyevm/chain_test.go: `.NewTestGeneralConfig(t)` $DIR/core/chains/legacyevm/chain_test.go: `.NewSqlxDB(t)` $DIR/core/chains/legacyevm/chain_test.go: `.Run(tt.name, func(t *testing.T) { o := legacyevm.ChainOpts{ AppConfig: tt.fields.AppConfig, MailMon: tt.fields.MailMon, DS: tt.fields.DB, } if err := o.Validate(); (err != nil) != tt.wantErr { t.Errorf("ChainOpts.Validate() error = %v, wantErr %v", err, tt.wantErr) } })` $DIR/core/chains/legacyevm/chain_test.go: `.Validate()` $DIR/core/cmd/admin_commands_test.go: `client.PasswordPrompter = cltest.MockPasswordPrompter{ Password: cltest.Password, }` $DIR/core/cmd/admin_commands_test.go: `t.Run(test.name, func(t *testing.T) { set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(client.CreateUser, set, "") require.NoError(t, set.Set("email", test.email)) require.NoError(t, set.Set("role", test.role)) c := cli.NewContext(nil, set, nil) if test.err != "" { assert.ErrorContains(t, client.CreateUser(c), test.err) } else { assert.NoError(t, client.CreateUser(c)) } })` $DIR/core/cmd/admin_commands_test.go: `flagSetApplyFromAction(client.CreateUser, set, "")` $DIR/core/cmd/admin_commands_test.go: `t.Run(test.name, func(t *testing.T) { set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(client.ChangeRole, set, "") require.NoError(t, set.Set("email", test.email)) require.NoError(t, set.Set("new-role", test.role)) c := cli.NewContext(nil, set, nil) if test.err != "" { assert.ErrorContains(t, client.ChangeRole(c), test.err) } else { assert.NoError(t, client.ChangeRole(c)) } })` $DIR/core/cmd/admin_commands_test.go: `flagSetApplyFromAction(client.ChangeRole, set, "")` $DIR/core/cmd/admin_commands_test.go: `t.Run(test.name, func(t *testing.T) { set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(client.DeleteUser, set, "") require.NoError(t, set.Set("email", test.email)) c := cli.NewContext(nil, set, nil) if test.err != "" { assert.ErrorContains(t, client.DeleteUser(c), test.err) } else { assert.NoError(t, client.DeleteUser(c)) } })` $DIR/core/cmd/admin_commands_test.go: `flagSetApplyFromAction(client.DeleteUser, set, "")` $DIR/core/cmd/admin_commands_test.go: `flagSetApplyFromAction(client.ListUsers, set, "")` $DIR/core/cmd/admin_commands_test.go: `client.Renderer = testRenderer` $DIR/core/cmd/admin_commands_test.go: `userPresenterFound = true` $DIR/core/cmd/admin_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/admin_commands_test.go: `.Sprintf(`user with email %s already exists`, cltest.APIEmailAdmin)` $DIR/core/cmd/admin_commands_test.go: `.MustRandomUser(t)` $DIR/core/cmd/admin_commands_test.go: `.Run(test.name, func(t *testing.T) { set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(client.CreateUser, set, "") require.NoError(t, set.Set("email", test.email)) require.NoError(t, set.Set("role", test.role)) c := cli.NewContext(nil, set, nil) if test.err != "" { assert.ErrorContains(t, client.CreateUser(c), test.err) } else { assert.NoError(t, client.CreateUser(c)) } })` $DIR/core/cmd/admin_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/admin_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/admin_commands_test.go: `.Context(t)` $DIR/core/cmd/admin_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/admin_commands_test.go: `.MustRandomUser(t)` $DIR/core/cmd/admin_commands_test.go: `.MustRandomUser(t)` $DIR/core/cmd/admin_commands_test.go: `.Run(test.name, func(t *testing.T) { set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(client.ChangeRole, set, "") require.NoError(t, set.Set("email", test.email)) require.NoError(t, set.Set("new-role", test.role)) c := cli.NewContext(nil, set, nil) if test.err != "" { assert.ErrorContains(t, client.ChangeRole(c), test.err) } else { assert.NoError(t, client.ChangeRole(c)) } })` $DIR/core/cmd/admin_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/admin_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/admin_commands_test.go: `.Context(t)` $DIR/core/cmd/admin_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/admin_commands_test.go: `.MustRandomUser(t)` $DIR/core/cmd/admin_commands_test.go: `.Run(test.name, func(t *testing.T) { set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(client.DeleteUser, set, "") require.NoError(t, set.Set("email", test.email)) c := cli.NewContext(nil, set, nil) if test.err != "" { assert.ErrorContains(t, client.DeleteUser(c), test.err) } else { assert.NoError(t, client.DeleteUser(c)) } })` $DIR/core/cmd/admin_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/admin_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/admin_commands_test.go: `.Context(t)` $DIR/core/cmd/admin_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/admin_commands_test.go: `.MustRandomUser(t)` $DIR/core/cmd/admin_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/admin_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/admin_commands_test.go: `.ParseBool(presenter.HasActiveApiToken)` $DIR/core/cmd/admin_commands_test.go: `.Now()` $DIR/core/cmd/admin_commands_test.go: `.StringFrom("tokenKey")` $DIR/core/cmd/admin_commands_test.go: `.Now()` $DIR/core/cmd/admin_commands_test.go: `.Add(time.Duration(rand.Intn(10000)) * time.Second)` $DIR/core/cmd/admin_commands_test.go: `.Duration(rand.Intn(10000))` $DIR/core/cmd/admin_commands_test.go: `.Intn(10000)` $DIR/core/cmd/admin_commands_test.go: `.NewBufferString("")` $DIR/core/cmd/admin_commands_test.go: `.String()` $DIR/core/cmd/admin_commands_test.go: `.UpdatedAt.String()` $DIR/core/cmd/app_test.go: `t.Run(tt.name, func(t *testing.T) { if tt.args.envVar != "" { t.Setenv(string(env.Config), tt.args.envVar) } cfg, err := initServerConfig(tt.args.opts, tt.args.fileNames, tt.args.secretsFiles) if (err != nil) != tt.wantErr { t.Errorf("loadOpts() error = %v, wantErr %v", err, tt.wantErr) } if tt.wantCfg != nil { assert.Equal(t, tt.wantCfg, cfg) } })` $DIR/core/cmd/app_test.go: `t.Setenv(string(env.Config), tt.args.envVar)` $DIR/core/cmd/app_test.go: `.WriteTOMLFile(t, testConfigFileContents, "test.toml")` $DIR/core/cmd/app_test.go: `.WriteTOMLFile(t, testConfigFileContents, "test.toml")` $DIR/core/cmd/app_test.go: `.WriteTOMLFile(t, testConfigFileContents, "test.toml")` $DIR/core/cmd/app_test.go: `.WriteTOMLFile(t, testConfigFileContents, "test.toml")` $DIR/core/cmd/app_test.go: `.WriteTOMLFile(t, testSecretsFileContents, "test_secrets.toml")` $DIR/core/cmd/app_test.go: `.WriteTOMLFile(t, testConfigFileContents, "test.toml")` $DIR/core/cmd/app_test.go: `.WriteTOMLFile(t, testConfigFileContents, "test.toml")` $DIR/core/cmd/app_test.go: `.WriteTOMLFile(t, testConfigFileContents, "test.toml")` $DIR/core/cmd/app_test.go: `.WriteTOMLFile(t, testConfigFileContents, "test.toml")` $DIR/core/cmd/app_test.go: `.WriteTOMLFile(t, testConfigFileContents, "test.toml")` $DIR/core/cmd/app_test.go: `.WriteTOMLFile(t, testConfigFileContents, "test.toml")` $DIR/core/cmd/app_test.go: `.WriteTOMLFile(t, testConfigFileContents, "test.toml")` $DIR/core/cmd/app_test.go: `.Run(tt.name, func(t *testing.T) { if tt.args.envVar != "" { t.Setenv(string(env.Config), tt.args.envVar) } cfg, err := initServerConfig(tt.args.opts, tt.args.fileNames, tt.args.secretsFiles) if (err != nil) != tt.wantErr { t.Errorf("loadOpts() error = %v, wantErr %v", err, tt.wantErr) } if tt.wantCfg != nil { assert.Equal(t, tt.wantCfg, cfg) } })` $DIR/core/cmd/app_test.go: `.Setenv(string(env.Config), tt.args.envVar)` $DIR/core/cmd/blocks_commands_test.go: `c.EVM[0].ChainID = (*ubig.Big)(big.NewInt(5))` $DIR/core/cmd/blocks_commands_test.go: `c.EVM[0].Enabled = ptr(true)` $DIR/core/cmd/blocks_commands_test.go: `flagSetApplyFromAction(client.ReplayFromBlock, set, "")` $DIR/core/cmd/blocks_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/blocks_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/blocks_commands_test.go: `c.EVM[0].ChainID = (*ubig.Big)(big.NewInt(5))` $DIR/core/cmd/blocks_commands_test.go: `c.EVM[0].Enabled = ptr(true)` $DIR/core/cmd/blocks_commands_test.go: `flagSetApplyFromAction(client.FindLCA, set, "")` $DIR/core/cmd/blocks_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/blocks_commands_test.go: `.NewInt(5)` $DIR/core/cmd/blocks_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/blocks_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/blocks_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/blocks_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/blocks_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/blocks_commands_test.go: `.ReplayFromBlock(c)` $DIR/core/cmd/blocks_commands_test.go: `.NewInt(5)` $DIR/core/cmd/blocks_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/blocks_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/blocks_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/blocks_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/blocks_commands_test.go: `.FindLCA(c)` $DIR/core/cmd/bridge_commands_test.go: `buffer.Reset()` $DIR/core/cmd/bridge_commands_test.go: `output = buffer.String()` $DIR/core/cmd/bridge_commands_test.go: `err = app.BridgeORM().CreateBridgeType(ctx, bt2)` $DIR/core/cmd/bridge_commands_test.go: `p = bridges[1]` $DIR/core/cmd/bridge_commands_test.go: `flagSetApplyFromAction(client.ShowBridge, set, "")` $DIR/core/cmd/bridge_commands_test.go: `t.Run(test.name, func(t *testing.T) { set := flag.NewFlagSet("bridge", 0) flagSetApplyFromAction(client.CreateBridge, set, "") require.NoError(t, set.Parse([]string{test.param})) c := cli.NewContext(nil, set, nil) if test.errored { assert.Error(t, client.CreateBridge(c)) } else { assert.Nil(t, client.CreateBridge(c)) } })` $DIR/core/cmd/bridge_commands_test.go: `flagSetApplyFromAction(client.CreateBridge, set, "")` $DIR/core/cmd/bridge_commands_test.go: `flagSetApplyFromAction(client.RemoveBridge, set, "")` $DIR/core/cmd/bridge_commands_test.go: `.Now()` $DIR/core/cmd/bridge_commands_test.go: `.NewBufferString("")` $DIR/core/cmd/bridge_commands_test.go: `.NewJAID(name)` $DIR/core/cmd/bridge_commands_test.go: `.String()` $DIR/core/cmd/bridge_commands_test.go: `.Reset()` $DIR/core/cmd/bridge_commands_test.go: `.String()` $DIR/core/cmd/bridge_commands_test.go: `.Context(t)` $DIR/core/cmd/bridge_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/bridge_commands_test.go: `.MustParseBridgeName("cliindexbridges1")` $DIR/core/cmd/bridge_commands_test.go: `.WebURL(t, "https://testing.com/bridges")` $DIR/core/cmd/bridge_commands_test.go: `.BridgeORM()` $DIR/core/cmd/bridge_commands_test.go: `.CreateBridgeType(ctx, bt1)` $DIR/core/cmd/bridge_commands_test.go: `.MustParseBridgeName("cliindexbridges2")` $DIR/core/cmd/bridge_commands_test.go: `.WebURL(t, "https://testing.com/bridges")` $DIR/core/cmd/bridge_commands_test.go: `.BridgeORM()` $DIR/core/cmd/bridge_commands_test.go: `.CreateBridgeType(ctx, bt2)` $DIR/core/cmd/bridge_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/bridge_commands_test.go: `.MustParseBridgeName(testutils.RandomizeName("showbridge"))` $DIR/core/cmd/bridge_commands_test.go: `.RandomizeName("showbridge")` $DIR/core/cmd/bridge_commands_test.go: `.WebURL(t, "https://testing.com/bridges")` $DIR/core/cmd/bridge_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/bridge_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/bridge_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/bridge_commands_test.go: `.Run(test.name, func(t *testing.T) { set := flag.NewFlagSet("bridge", 0) flagSetApplyFromAction(client.CreateBridge, set, "") require.NoError(t, set.Parse([]string{test.param})) c := cli.NewContext(nil, set, nil) if test.errored { assert.Error(t, client.CreateBridge(c)) } else { assert.Nil(t, client.CreateBridge(c)) } })` $DIR/core/cmd/bridge_commands_test.go: `.NewFlagSet("bridge", 0)` $DIR/core/cmd/bridge_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/bridge_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/bridge_commands_test.go: `.MustParseBridgeName(testutils.RandomizeName("removebridge"))` $DIR/core/cmd/bridge_commands_test.go: `.RandomizeName("removebridge")` $DIR/core/cmd/bridge_commands_test.go: `.WebURL(t, "https://testing.com/bridges")` $DIR/core/cmd/bridge_commands_test.go: `.BridgeORM()` $DIR/core/cmd/bridge_commands_test.go: `.CreateBridgeType(testutils.Context(t), bt)` $DIR/core/cmd/bridge_commands_test.go: `.Context(t)` $DIR/core/cmd/bridge_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/bridge_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/cosmos_chains_commands_test.go: `.RandomChainID()` $DIR/core/cmd/cosmos_chains_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/cosmos_keys_commands_test.go: `buffer.Reset()` $DIR/core/cmd/cosmos_keys_commands_test.go: `output = buffer.String()` $DIR/core/cmd/cosmos_keys_commands_test.go: `requireCosmosKeyCount(t, app, 0)` $DIR/core/cmd/cosmos_keys_commands_test.go: `t.Run("ListCosmosKeys", func(tt *testing.T) { defer cleanup() ctx := testutils.Context(t) client, r := app.NewShellAndRenderer() key, err := app.GetKeyStore().Cosmos().Create(ctx) require.NoError(t, err) requireCosmosKeyCount(t, app, 1) assert.Nil(t, cmd.NewCosmosKeysClient(client).ListKeys(cltest.EmptyCLIContext())) require.Equal(t, 1, len(r.Renders)) keys := *r.Renders[0].(*cmd.CosmosKeyPresenters) assert.True(t, key.PublicKeyStr() == keys[0].PubKey) })` $DIR/core/cmd/cosmos_keys_commands_test.go: `requireCosmosKeyCount(t, app, 1)` $DIR/core/cmd/cosmos_keys_commands_test.go: `t.Run("CreateCosmosKey", func(tt *testing.T) { defer cleanup() client, _ := app.NewShellAndRenderer() require.NoError(t, cmd.NewCosmosKeysClient(client).CreateKey(nilContext)) keys, err := app.GetKeyStore().Cosmos().GetAll() require.NoError(t, err) require.Len(t, keys, 1) })` $DIR/core/cmd/cosmos_keys_commands_test.go: `t.Run("DeleteCosmosKey", func(tt *testing.T) { defer cleanup() ctx := testutils.Context(t) client, _ := app.NewShellAndRenderer() key, err := app.GetKeyStore().Cosmos().Create(ctx) require.NoError(t, err) requireCosmosKeyCount(t, app, 1) set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(cmd.NewCosmosKeysClient(client).DeleteKey, set, "cosmos") strID := key.ID() require.NoError(tt, set.Set("yes", "true")) require.NoError(tt, set.Parse([]string{strID})) c := cli.NewContext(nil, set, nil) err = cmd.NewCosmosKeysClient(client).DeleteKey(c) require.NoError(t, err) requireCosmosKeyCount(t, app, 0) })` $DIR/core/cmd/cosmos_keys_commands_test.go: `requireCosmosKeyCount(t, app, 1)` $DIR/core/cmd/cosmos_keys_commands_test.go: `flagSetApplyFromAction(cmd.NewCosmosKeysClient(client).DeleteKey, set, "cosmos")` $DIR/core/cmd/cosmos_keys_commands_test.go: `err = cmd.NewCosmosKeysClient(client).DeleteKey(c)` $DIR/core/cmd/cosmos_keys_commands_test.go: `requireCosmosKeyCount(t, app, 0)` $DIR/core/cmd/cosmos_keys_commands_test.go: `flagSetApplyFromAction(cmd.NewCosmosKeysClient(client).ExportKey, set, "cosmos")` $DIR/core/cmd/cosmos_keys_commands_test.go: `err = tclient.ExportKey(c)` $DIR/core/cmd/cosmos_keys_commands_test.go: `set = flag.NewFlagSet("test Cosmos export", 0)` $DIR/core/cmd/cosmos_keys_commands_test.go: `flagSetApplyFromAction(cmd.NewCosmosKeysClient(client).ExportKey, set, "cosmos")` $DIR/core/cmd/cosmos_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/cosmos_keys_commands_test.go: `requireCosmosKeyCount(t, app, 0)` $DIR/core/cmd/cosmos_keys_commands_test.go: `set = flag.NewFlagSet("test Cosmos import", 0)` $DIR/core/cmd/cosmos_keys_commands_test.go: `flagSetApplyFromAction(cmd.NewCosmosKeysClient(client).ImportKey, set, "cosmos")` $DIR/core/cmd/cosmos_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/cosmos_keys_commands_test.go: `requireCosmosKeyCount(t, app, 1)` $DIR/core/cmd/cosmos_keys_commands_test.go: `.NewBufferString("")` $DIR/core/cmd/cosmos_keys_commands_test.go: `.NewJAID(id)` $DIR/core/cmd/cosmos_keys_commands_test.go: `.String()` $DIR/core/cmd/cosmos_keys_commands_test.go: `.Reset()` $DIR/core/cmd/cosmos_keys_commands_test.go: `.String()` $DIR/core/cmd/cosmos_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/cosmos_keys_commands_test.go: `.Cosmos()` $DIR/core/cmd/cosmos_keys_commands_test.go: `.Background()` $DIR/core/cmd/cosmos_keys_commands_test.go: `.GetAll()` $DIR/core/cmd/cosmos_keys_commands_test.go: `.Run("ListCosmosKeys", func(tt *testing.T) { defer cleanup() ctx := testutils.Context(t) client, r := app.NewShellAndRenderer() key, err := app.GetKeyStore().Cosmos().Create(ctx) require.NoError(t, err) requireCosmosKeyCount(t, app, 1) assert.Nil(t, cmd.NewCosmosKeysClient(client).ListKeys(cltest.EmptyCLIContext())) require.Equal(t, 1, len(r.Renders)) keys := *r.Renders[0].(*cmd.CosmosKeyPresenters) assert.True(t, key.PublicKeyStr() == keys[0].PubKey) })` $DIR/core/cmd/cosmos_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/cosmos_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/cosmos_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/cosmos_keys_commands_test.go: `.Cosmos()` $DIR/core/cmd/cosmos_keys_commands_test.go: `.Create(ctx)` $DIR/core/cmd/cosmos_keys_commands_test.go: `.Run("CreateCosmosKey", func(tt *testing.T) { defer cleanup() client, _ := app.NewShellAndRenderer() require.NoError(t, cmd.NewCosmosKeysClient(client).CreateKey(nilContext)) keys, err := app.GetKeyStore().Cosmos().GetAll() require.NoError(t, err) require.Len(t, keys, 1) })` $DIR/core/cmd/cosmos_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/cosmos_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/cosmos_keys_commands_test.go: `.Cosmos()` $DIR/core/cmd/cosmos_keys_commands_test.go: `.GetAll()` $DIR/core/cmd/cosmos_keys_commands_test.go: `.Run("DeleteCosmosKey", func(tt *testing.T) { defer cleanup() ctx := testutils.Context(t) client, _ := app.NewShellAndRenderer() key, err := app.GetKeyStore().Cosmos().Create(ctx) require.NoError(t, err) requireCosmosKeyCount(t, app, 1) set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(cmd.NewCosmosKeysClient(client).DeleteKey, set, "cosmos") strID := key.ID() require.NoError(tt, set.Set("yes", "true")) require.NoError(tt, set.Parse([]string{strID})) c := cli.NewContext(nil, set, nil) err = cmd.NewCosmosKeysClient(client).DeleteKey(c) require.NoError(t, err) requireCosmosKeyCount(t, app, 0) })` $DIR/core/cmd/cosmos_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/cosmos_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/cosmos_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/cosmos_keys_commands_test.go: `.Cosmos()` $DIR/core/cmd/cosmos_keys_commands_test.go: `.Create(ctx)` $DIR/core/cmd/cosmos_keys_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/cosmos_keys_commands_test.go: `.NewCosmosKeysClient(client)` $DIR/core/cmd/cosmos_keys_commands_test.go: `.ID()` $DIR/core/cmd/cosmos_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/cosmos_keys_commands_test.go: `.NewCosmosKeysClient(client)` $DIR/core/cmd/cosmos_keys_commands_test.go: `.DeleteKey(c)` $DIR/core/cmd/cosmos_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/cosmos_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/cosmos_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/cosmos_keys_commands_test.go: `.Cosmos()` $DIR/core/cmd/cosmos_keys_commands_test.go: `.Create(ctx)` $DIR/core/cmd/cosmos_keys_commands_test.go: `.NewFlagSet("test Cosmos export", 0)` $DIR/core/cmd/cosmos_keys_commands_test.go: `.NewCosmosKeysClient(client)` $DIR/core/cmd/cosmos_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/cosmos_keys_commands_test.go: `.NewCosmosKeysClient(client)` $DIR/core/cmd/cosmos_keys_commands_test.go: `.ExportKey(c)` $DIR/core/cmd/cosmos_keys_commands_test.go: `.NewFlagSet("test Cosmos export", 0)` $DIR/core/cmd/cosmos_keys_commands_test.go: `.NewCosmosKeysClient(client)` $DIR/core/cmd/cosmos_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/cosmos_keys_commands_test.go: `.NewFlagSet("test Cosmos import", 0)` $DIR/core/cmd/cosmos_keys_commands_test.go: `.NewCosmosKeysClient(client)` $DIR/core/cmd/cosmos_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/cosmos_node_commands_test.go: `assertTableRenders(t, r)` $DIR/core/cmd/cosmos_node_commands_test.go: `.RandomChainID()` $DIR/core/cmd/cosmos_node_commands_test.go: `.MustParseURL("http://tender.mint.test/bombay-12")` $DIR/core/cmd/cosmos_node_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/cosmos_node_commands_test.go: `.Marshal(node)` $DIR/core/cmd/cosmos_node_commands_test.go: `.Split(b.String(), "\n")` $DIR/core/cmd/cosmos_node_commands_test.go: `.String()` $DIR/core/cmd/cosmos_transaction_commands_test.go: `params.InitCosmosSdk( /* bech32Prefix= */ "wasm", /* token= */ nativeToken, )` $DIR/core/cmd/cosmos_transaction_commands_test.go: `cosmosChain.SetDefaults()` $DIR/core/cmd/cosmos_transaction_commands_test.go: `t.Run(tt.amount, func(t *testing.T) { startBal, err := reader.Balance(from.Address, *cosmosChain.GasToken) require.NoError(t, err) set := flag.NewFlagSet("sendcosmoscoins", 0) flagSetApplyFromAction(client.CosmosSendNativeToken, set, "cosmos") require.NoError(t, set.Set("id", chainID)) require.NoError(t, set.Parse([]string{nativeToken, tt.amount, from.Address.String(), to.Address.String()})) c := cli.NewContext(cliapp, set, nil) err = client.CosmosSendNativeToken(c) if tt.expErr == "" { require.NoError(t, err) } else { require.Error(t, err) require.Contains(t, err.Error(), tt.expErr) return } // Check CLI output require.Greater(t, len(r.Renders), 0) renderer := r.Renders[len(r.Renders)-1] renderedMsg := renderer.(*cmd.CosmosMsgPresenter) require.NotEmpty(t, renderedMsg.ID) assert.Equal(t, string(cosmosdb.Unstarted), renderedMsg.State) assert.Nil(t, renderedMsg.TxHash) // Check balance sent, err := denom.ConvertDecCoinToDenom(sdk.NewDecCoinFromDec(nativeToken, sdk.MustNewDecFromStr(tt.amount)), *cosmosChain.GasToken) require.NoError(t, err) expBal := startBal.Sub(sent) testutils.AssertEventually(t, func() bool { endBal, err := reader.Balance(from.Address, *cosmosChain.GasToken) require.NoError(t, err) t.Logf("%s <= %s", endBal, expBal) return endBal.IsLTE(expBal) }) })` $DIR/core/cmd/cosmos_transaction_commands_test.go: `flagSetApplyFromAction(client.CosmosSendNativeToken, set, "cosmos")` $DIR/core/cmd/cosmos_transaction_commands_test.go: `err = client.CosmosSendNativeToken(c)` $DIR/core/cmd/cosmos_transaction_commands_test.go: `testutils.AssertEventually(t, func() bool { endBal, err := reader.Balance(from.Address, *cosmosChain.GasToken) require.NoError(t, err) t.Logf("%s <= %s", endBal, expBal) return endBal.IsLTE(expBal) })` $DIR/core/cmd/cosmos_transaction_commands_test.go: `.InitCosmosSdk( /* bech32Prefix= */ "wasm", /* token= */ nativeToken, )` $DIR/core/cmd/cosmos_transaction_commands_test.go: `.Run()` $DIR/core/cmd/cosmos_transaction_commands_test.go: `.Context(t)` $DIR/core/cmd/cosmos_transaction_commands_test.go: `.RandomChainID()` $DIR/core/cmd/cosmos_transaction_commands_test.go: `.SetDefaults()` $DIR/core/cmd/cosmos_transaction_commands_test.go: `.SetupLocalCosmosNode(t, chainID, *cosmosChain.GasToken)` $DIR/core/cmd/cosmos_transaction_commands_test.go: `.MustParseURL(url)` $DIR/core/cmd/cosmos_transaction_commands_test.go: `.GetRelayers()` $DIR/core/cmd/cosmos_transaction_commands_test.go: `.LegacyCosmosChains()` $DIR/core/cmd/cosmos_transaction_commands_test.go: `.Get(chainID)` $DIR/core/cmd/cosmos_transaction_commands_test.go: `.Reader("")` $DIR/core/cmd/cosmos_transaction_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/cosmos_transaction_commands_test.go: `.NewApp()` $DIR/core/cmd/cosmos_transaction_commands_test.go: `.Run(tt.amount, func(t *testing.T) { startBal, err := reader.Balance(from.Address, *cosmosChain.GasToken) require.NoError(t, err) set := flag.NewFlagSet("sendcosmoscoins", 0) flagSetApplyFromAction(client.CosmosSendNativeToken, set, "cosmos") require.NoError(t, set.Set("id", chainID)) require.NoError(t, set.Parse([]string{nativeToken, tt.amount, from.Address.String(), to.Address.String()})) c := cli.NewContext(cliapp, set, nil) err = client.CosmosSendNativeToken(c) if tt.expErr == "" { require.NoError(t, err) } else { require.Error(t, err) require.Contains(t, err.Error(), tt.expErr) return } // Check CLI output require.Greater(t, len(r.Renders), 0) renderer := r.Renders[len(r.Renders)-1] renderedMsg := renderer.(*cmd.CosmosMsgPresenter) require.NotEmpty(t, renderedMsg.ID) assert.Equal(t, string(cosmosdb.Unstarted), renderedMsg.State) assert.Nil(t, renderedMsg.TxHash) // Check balance sent, err := denom.ConvertDecCoinToDenom(sdk.NewDecCoinFromDec(nativeToken, sdk.MustNewDecFromStr(tt.amount)), *cosmosChain.GasToken) require.NoError(t, err) expBal := startBal.Sub(sent) testutils.AssertEventually(t, func() bool { endBal, err := reader.Balance(from.Address, *cosmosChain.GasToken) require.NoError(t, err) t.Logf("%s <= %s", endBal, expBal) return endBal.IsLTE(expBal) }) })` $DIR/core/cmd/cosmos_transaction_commands_test.go: `.Balance(from.Address, *cosmosChain.GasToken)` $DIR/core/cmd/cosmos_transaction_commands_test.go: `.NewFlagSet("sendcosmoscoins", 0)` $DIR/core/cmd/cosmos_transaction_commands_test.go: `.NewContext(cliapp, set, nil)` $DIR/core/cmd/cosmos_transaction_commands_test.go: `.CosmosSendNativeToken(c)` $DIR/core/cmd/cosmos_transaction_commands_test.go: `.ConvertDecCoinToDenom(sdk.NewDecCoinFromDec(nativeToken, sdk.MustNewDecFromStr(tt.amount)), *cosmosChain.GasToken)` $DIR/core/cmd/cosmos_transaction_commands_test.go: `.NewDecCoinFromDec(nativeToken, sdk.MustNewDecFromStr(tt.amount))` $DIR/core/cmd/cosmos_transaction_commands_test.go: `.MustNewDecFromStr(tt.amount)` $DIR/core/cmd/cosmos_transaction_commands_test.go: `.Sub(sent)` $DIR/core/cmd/cosmos_transaction_commands_test.go: `.AssertEventually(t, func() bool { endBal, err := reader.Balance(from.Address, *cosmosChain.GasToken) require.NoError(t, err) t.Logf("%s <= %s", endBal, expBal) return endBal.IsLTE(expBal) })` $DIR/core/cmd/cosmos_transaction_commands_test.go: `.Balance(from.Address, *cosmosChain.GasToken)` $DIR/core/cmd/cosmos_transaction_commands_test.go: `.IsLTE(expBal)` $DIR/core/cmd/csa_keys_commands_test.go: `buffer.Reset()` $DIR/core/cmd/csa_keys_commands_test.go: `output = buffer.String()` $DIR/core/cmd/csa_keys_commands_test.go: `requireCSAKeyCount(t, app, 1)` $DIR/core/cmd/csa_keys_commands_test.go: `requireCSAKeyCount(t, app, 0)` $DIR/core/cmd/csa_keys_commands_test.go: `flagSetApplyFromAction(client.ExportCSAKey, set, "")` $DIR/core/cmd/csa_keys_commands_test.go: `err = client.ExportCSAKey(c)` $DIR/core/cmd/csa_keys_commands_test.go: `set = flag.NewFlagSet("test CSA export", 0)` $DIR/core/cmd/csa_keys_commands_test.go: `flagSetApplyFromAction(client.ExportCSAKey, set, "")` $DIR/core/cmd/csa_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/csa_keys_commands_test.go: `requireCSAKeyCount(t, app, 0)` $DIR/core/cmd/csa_keys_commands_test.go: `set = flag.NewFlagSet("test CSA import", 0)` $DIR/core/cmd/csa_keys_commands_test.go: `flagSetApplyFromAction(client.ImportCSAKey, set, "")` $DIR/core/cmd/csa_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/csa_keys_commands_test.go: `.NewBufferString("")` $DIR/core/cmd/csa_keys_commands_test.go: `.NewJAID(pubKey)` $DIR/core/cmd/csa_keys_commands_test.go: `.String()` $DIR/core/cmd/csa_keys_commands_test.go: `.Reset()` $DIR/core/cmd/csa_keys_commands_test.go: `.String()` $DIR/core/cmd/csa_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/csa_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/csa_keys_commands_test.go: `.CSA()` $DIR/core/cmd/csa_keys_commands_test.go: `.Create(ctx)` $DIR/core/cmd/csa_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/csa_keys_commands_test.go: `.Sprintf("csa_%s", key.PublicKeyString())` $DIR/core/cmd/csa_keys_commands_test.go: `.PublicKeyString()` $DIR/core/cmd/csa_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/csa_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/csa_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/csa_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/csa_keys_commands_test.go: `.CSA()` $DIR/core/cmd/csa_keys_commands_test.go: `.Create(ctx)` $DIR/core/cmd/csa_keys_commands_test.go: `.NewFlagSet("test CSA export", 0)` $DIR/core/cmd/csa_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/csa_keys_commands_test.go: `.ExportCSAKey(c)` $DIR/core/cmd/csa_keys_commands_test.go: `.NewFlagSet("test CSA export", 0)` $DIR/core/cmd/csa_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/csa_keys_commands_test.go: `.NewFlagSet("test CSA import", 0)` $DIR/core/cmd/csa_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `buffer.Reset()` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `output = buffer.String()` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `requireDKGEncryptKeyCount(t, app, 0)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `t.Run("ListDKGEncryptKeys", func(tt *testing.T) { defer cleanup() ctx := testutils.Context(t) client, r := app.NewShellAndRenderer() key, err := app.GetKeyStore().DKGEncrypt().Create(ctx) assert.NoError(tt, err) requireDKGEncryptKeyCount(t, app, 1) assert.Nil(t, cmd.NewDKGEncryptKeysClient(client).ListKeys(cltest.EmptyCLIContext())) assert.Equal(t, 1, len(r.Renders)) keys := *r.Renders[0].(*cmd.DKGEncryptKeyPresenters) assert.True(t, key.PublicKeyString() == keys[0].PublicKey) })` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `requireDKGEncryptKeyCount(t, app, 1)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `t.Run("CreateDKGEncryptKey", func(tt *testing.T) { defer cleanup() client, _ := app.NewShellAndRenderer() assert.NoError(tt, cmd.NewDKGEncryptKeysClient(client).CreateKey(nilContext)) keys, err := app.GetKeyStore().DKGEncrypt().GetAll() assert.NoError(tt, err) assert.Len(t, keys, 1) })` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `t.Run("DeleteDKGEncryptKey", func(tt *testing.T) { defer cleanup() ctx := testutils.Context(t) client, _ := app.NewShellAndRenderer() key, err := app.GetKeyStore().DKGEncrypt().Create(ctx) assert.NoError(tt, err) requireDKGEncryptKeyCount(tt, app, 1) set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(cmd.NewDKGEncryptKeysClient(client).DeleteKey, set, "") require.NoError(tt, set.Set("yes", "true")) strID := key.ID() err = set.Parse([]string{strID}) require.NoError(t, err) c := cli.NewContext(nil, set, nil) err = cmd.NewDKGEncryptKeysClient(client).DeleteKey(c) assert.NoError(tt, err) requireDKGEncryptKeyCount(tt, app, 0) })` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `requireDKGEncryptKeyCount(tt, app, 1)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `flagSetApplyFromAction(cmd.NewDKGEncryptKeysClient(client).DeleteKey, set, "")` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `err = set.Parse([]string{strID})` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `err = cmd.NewDKGEncryptKeysClient(client).DeleteKey(c)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `requireDKGEncryptKeyCount(tt, app, 0)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `flagSetApplyFromAction(cmd.NewDKGEncryptKeysClient(client).ExportKey, set, "")` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `err = cmd.NewDKGEncryptKeysClient(client).ExportKey(c)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `set = flag.NewFlagSet("test DKGEncrypt export", 0)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `flagSetApplyFromAction(cmd.NewDKGEncryptKeysClient(client).ExportKey, set, "")` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `requireDKGEncryptKeyCount(tt, app, 0)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `set = flag.NewFlagSet("test DKGEncrypt import", 0)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `flagSetApplyFromAction(cmd.NewDKGEncryptKeysClient(client).ImportKey, set, "")` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `requireDKGEncryptKeyCount(tt, app, 1)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.NewBufferString("")` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.NewJAID(id)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.String()` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.Reset()` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.String()` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.DKGEncrypt()` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.Background()` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.GetAll()` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.Run("ListDKGEncryptKeys", func(tt *testing.T) { defer cleanup() ctx := testutils.Context(t) client, r := app.NewShellAndRenderer() key, err := app.GetKeyStore().DKGEncrypt().Create(ctx) assert.NoError(tt, err) requireDKGEncryptKeyCount(t, app, 1) assert.Nil(t, cmd.NewDKGEncryptKeysClient(client).ListKeys(cltest.EmptyCLIContext())) assert.Equal(t, 1, len(r.Renders)) keys := *r.Renders[0].(*cmd.DKGEncryptKeyPresenters) assert.True(t, key.PublicKeyString() == keys[0].PublicKey) })` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.DKGEncrypt()` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.Create(ctx)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.Run("CreateDKGEncryptKey", func(tt *testing.T) { defer cleanup() client, _ := app.NewShellAndRenderer() assert.NoError(tt, cmd.NewDKGEncryptKeysClient(client).CreateKey(nilContext)) keys, err := app.GetKeyStore().DKGEncrypt().GetAll() assert.NoError(tt, err) assert.Len(t, keys, 1) })` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.DKGEncrypt()` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.GetAll()` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.Run("DeleteDKGEncryptKey", func(tt *testing.T) { defer cleanup() ctx := testutils.Context(t) client, _ := app.NewShellAndRenderer() key, err := app.GetKeyStore().DKGEncrypt().Create(ctx) assert.NoError(tt, err) requireDKGEncryptKeyCount(tt, app, 1) set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(cmd.NewDKGEncryptKeysClient(client).DeleteKey, set, "") require.NoError(tt, set.Set("yes", "true")) strID := key.ID() err = set.Parse([]string{strID}) require.NoError(t, err) c := cli.NewContext(nil, set, nil) err = cmd.NewDKGEncryptKeysClient(client).DeleteKey(c) assert.NoError(tt, err) requireDKGEncryptKeyCount(tt, app, 0) })` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.DKGEncrypt()` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.Create(ctx)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.NewDKGEncryptKeysClient(client)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.ID()` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.Parse([]string{strID})` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.NewDKGEncryptKeysClient(client)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.DeleteKey(c)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.DKGEncrypt()` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.Create(ctx)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.NewFlagSet("test DKGEncrypt export", 0)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.NewDKGEncryptKeysClient(client)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.NewDKGEncryptKeysClient(client)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.ExportKey(c)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.NewFlagSet("test DKGEncrypt export", 0)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.NewDKGEncryptKeysClient(client)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.NewFlagSet("test DKGEncrypt import", 0)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.NewDKGEncryptKeysClient(client)` $DIR/core/cmd/dkgencrypt_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `buffer.Reset()` $DIR/core/cmd/dkgsign_keys_commands_test.go: `output = buffer.String()` $DIR/core/cmd/dkgsign_keys_commands_test.go: `requireDKGSignKeyCount(t, app, 0)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `t.Run("ListDKGSignKeys", func(tt *testing.T) { defer cleanup() ctx := testutils.Context(t) client, r := app.NewShellAndRenderer() key, err := app.GetKeyStore().DKGSign().Create(ctx) assert.NoError(tt, err) requireDKGSignKeyCount(t, app, 1) assert.Nil(t, cmd.NewDKGSignKeysClient(client).ListKeys(cltest.EmptyCLIContext())) assert.Equal(t, 1, len(r.Renders)) keys := *r.Renders[0].(*cmd.DKGSignKeyPresenters) assert.True(t, key.PublicKeyString() == keys[0].PublicKey) })` $DIR/core/cmd/dkgsign_keys_commands_test.go: `requireDKGSignKeyCount(t, app, 1)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `t.Run("CreateDKGSignKey", func(tt *testing.T) { defer cleanup() client, _ := app.NewShellAndRenderer() assert.NoError(tt, cmd.NewDKGSignKeysClient(client).CreateKey(nilContext)) keys, err := app.GetKeyStore().DKGSign().GetAll() assert.NoError(tt, err) assert.Len(t, keys, 1) })` $DIR/core/cmd/dkgsign_keys_commands_test.go: `t.Run("DeleteDKGSignKey", func(tt *testing.T) { defer cleanup() ctx := testutils.Context(t) client, _ := app.NewShellAndRenderer() key, err := app.GetKeyStore().DKGSign().Create(ctx) assert.NoError(tt, err) requireDKGSignKeyCount(tt, app, 1) set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(cmd.NewDKGSignKeysClient(client).DeleteKey, set, "") require.NoError(tt, set.Set("yes", "true")) strID := key.ID() err = set.Parse([]string{strID}) require.NoError(t, err) c := cli.NewContext(nil, set, nil) err = cmd.NewDKGSignKeysClient(client).DeleteKey(c) assert.NoError(tt, err) requireDKGSignKeyCount(tt, app, 0) })` $DIR/core/cmd/dkgsign_keys_commands_test.go: `requireDKGSignKeyCount(tt, app, 1)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `flagSetApplyFromAction(cmd.NewDKGSignKeysClient(client).DeleteKey, set, "")` $DIR/core/cmd/dkgsign_keys_commands_test.go: `err = set.Parse([]string{strID})` $DIR/core/cmd/dkgsign_keys_commands_test.go: `err = cmd.NewDKGSignKeysClient(client).DeleteKey(c)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `requireDKGSignKeyCount(tt, app, 0)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `flagSetApplyFromAction(cmd.NewDKGSignKeysClient(client).ExportKey, set, "")` $DIR/core/cmd/dkgsign_keys_commands_test.go: `err = cmd.NewDKGSignKeysClient(client).ExportKey(c)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `set = flag.NewFlagSet("test DKGSign export", 0)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `flagSetApplyFromAction(cmd.NewDKGSignKeysClient(client).ExportKey, set, "")` $DIR/core/cmd/dkgsign_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `requireDKGSignKeyCount(tt, app, 0)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `set = flag.NewFlagSet("test DKGSign import", 0)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `flagSetApplyFromAction(cmd.NewDKGSignKeysClient(client).ImportKey, set, "")` $DIR/core/cmd/dkgsign_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `requireDKGSignKeyCount(tt, app, 1)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.NewBufferString("")` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.NewJAID(id)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.String()` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.Reset()` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.String()` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.DKGSign()` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.Background()` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.GetAll()` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.Run("ListDKGSignKeys", func(tt *testing.T) { defer cleanup() ctx := testutils.Context(t) client, r := app.NewShellAndRenderer() key, err := app.GetKeyStore().DKGSign().Create(ctx) assert.NoError(tt, err) requireDKGSignKeyCount(t, app, 1) assert.Nil(t, cmd.NewDKGSignKeysClient(client).ListKeys(cltest.EmptyCLIContext())) assert.Equal(t, 1, len(r.Renders)) keys := *r.Renders[0].(*cmd.DKGSignKeyPresenters) assert.True(t, key.PublicKeyString() == keys[0].PublicKey) })` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.DKGSign()` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.Create(ctx)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.Run("CreateDKGSignKey", func(tt *testing.T) { defer cleanup() client, _ := app.NewShellAndRenderer() assert.NoError(tt, cmd.NewDKGSignKeysClient(client).CreateKey(nilContext)) keys, err := app.GetKeyStore().DKGSign().GetAll() assert.NoError(tt, err) assert.Len(t, keys, 1) })` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.DKGSign()` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.GetAll()` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.Run("DeleteDKGSignKey", func(tt *testing.T) { defer cleanup() ctx := testutils.Context(t) client, _ := app.NewShellAndRenderer() key, err := app.GetKeyStore().DKGSign().Create(ctx) assert.NoError(tt, err) requireDKGSignKeyCount(tt, app, 1) set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(cmd.NewDKGSignKeysClient(client).DeleteKey, set, "") require.NoError(tt, set.Set("yes", "true")) strID := key.ID() err = set.Parse([]string{strID}) require.NoError(t, err) c := cli.NewContext(nil, set, nil) err = cmd.NewDKGSignKeysClient(client).DeleteKey(c) assert.NoError(tt, err) requireDKGSignKeyCount(tt, app, 0) })` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.DKGSign()` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.Create(ctx)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.NewDKGSignKeysClient(client)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.ID()` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.Parse([]string{strID})` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.NewDKGSignKeysClient(client)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.DeleteKey(c)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.DKGSign()` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.Create(ctx)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.NewFlagSet("test DKGSign export", 0)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.NewDKGSignKeysClient(client)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.NewDKGSignKeysClient(client)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.ExportKey(c)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.NewFlagSet("test DKGSign export", 0)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.NewDKGSignKeysClient(client)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.NewFlagSet("test DKGSign import", 0)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.NewDKGSignKeysClient(client)` $DIR/core/cmd/dkgsign_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/eth_keys_commands_test.go: `buffer.Reset()` $DIR/core/cmd/eth_keys_commands_test.go: `output = buffer.String()` $DIR/core/cmd/eth_keys_commands_test.go: `ethClient.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything).Return(big.NewInt(42), nil)` $DIR/core/cmd/eth_keys_commands_test.go: `ethClient.On("LINKBalance", mock.Anything, mock.Anything, mock.Anything).Return(commonassets.NewLinkFromJuels(13), nil)` $DIR/core/cmd/eth_keys_commands_test.go: `ethClient.On("PendingNonceAt", mock.Anything, mock.Anything).Return(uint64(0), nil)` $DIR/core/cmd/eth_keys_commands_test.go: `c.EVM[0].Enabled = ptr(true)` $DIR/core/cmd/eth_keys_commands_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/cmd/eth_keys_commands_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/cmd/eth_keys_commands_test.go: `ethClient.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("fake error"))` $DIR/core/cmd/eth_keys_commands_test.go: `ethClient.On("LINKBalance", mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("fake error"))` $DIR/core/cmd/eth_keys_commands_test.go: `ethClient.On("PendingNonceAt", mock.Anything, mock.Anything).Return(uint64(0), nil)` $DIR/core/cmd/eth_keys_commands_test.go: `c.EVM[0].Enabled = ptr(true)` $DIR/core/cmd/eth_keys_commands_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/cmd/eth_keys_commands_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/cmd/eth_keys_commands_test.go: `c.EVM[0].Enabled = ptr(false)` $DIR/core/cmd/eth_keys_commands_test.go: `ethClient.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything).Return(big.NewInt(42), nil)` $DIR/core/cmd/eth_keys_commands_test.go: `ethClient.On("LINKBalance", mock.Anything, mock.Anything, mock.Anything).Return(commonassets.NewLinkFromJuels(42), nil)` $DIR/core/cmd/eth_keys_commands_test.go: `ethClient.On("PendingNonceAt", mock.Anything, mock.Anything).Return(uint64(0), nil)` $DIR/core/cmd/eth_keys_commands_test.go: `c.EVM[0].Enabled = ptr(true)` $DIR/core/cmd/eth_keys_commands_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/cmd/eth_keys_commands_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/cmd/eth_keys_commands_test.go: `cltest.AssertCount(t, db, "evm.key_states", 1)` $DIR/core/cmd/eth_keys_commands_test.go: `flagSetApplyFromAction(client.CreateETHKey, set, "")` $DIR/core/cmd/eth_keys_commands_test.go: `cltest.AssertCount(t, db, "evm.key_states", 2)` $DIR/core/cmd/eth_keys_commands_test.go: `keys, err = app.KeyStore.Eth().GetAll(testutils.Context(t))` $DIR/core/cmd/eth_keys_commands_test.go: `c.EVM[0].Enabled = ptr(true)` $DIR/core/cmd/eth_keys_commands_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/cmd/eth_keys_commands_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/cmd/eth_keys_commands_test.go: `flagSetApplyFromAction(client.DeleteETHKey, set, "")` $DIR/core/cmd/eth_keys_commands_test.go: `err = client.DeleteETHKey(c)` $DIR/core/cmd/eth_keys_commands_test.go: `_, err = ethKeyStore.Get(testutils.Context(t), key.Address.Hex())` $DIR/core/cmd/eth_keys_commands_test.go: `t.Cleanup(func() { deleteKeyExportFile(t) })` $DIR/core/cmd/eth_keys_commands_test.go: `deleteKeyExportFile(t)` $DIR/core/cmd/eth_keys_commands_test.go: `ethClient.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything).Return(big.NewInt(42), nil)` $DIR/core/cmd/eth_keys_commands_test.go: `ethClient.On("LINKBalance", mock.Anything, mock.Anything, mock.Anything).Return(commonassets.NewLinkFromJuels(42), nil)` $DIR/core/cmd/eth_keys_commands_test.go: `ethClient.On("PendingNonceAt", mock.Anything, mock.Anything).Return(uint64(0), nil)` $DIR/core/cmd/eth_keys_commands_test.go: `c.EVM[0].Enabled = ptr(true)` $DIR/core/cmd/eth_keys_commands_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/cmd/eth_keys_commands_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/cmd/eth_keys_commands_test.go: `flagSetApplyFromAction(client.RemoteLogin, set, "")` $DIR/core/cmd/eth_keys_commands_test.go: `err = client.ListETHKeys(c)` $DIR/core/cmd/eth_keys_commands_test.go: `r.Renders = nil` $DIR/core/cmd/eth_keys_commands_test.go: `err = os.MkdirAll(testdir, 0700|os.ModeDir)` $DIR/core/cmd/eth_keys_commands_test.go: `set = flag.NewFlagSet("test", 0)` $DIR/core/cmd/eth_keys_commands_test.go: `flagSetApplyFromAction(client.ExportETHKey, set, "")` $DIR/core/cmd/eth_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/eth_keys_commands_test.go: `err = client.ExportETHKey(c)` $DIR/core/cmd/eth_keys_commands_test.go: `set = flag.NewFlagSet("test", 0)` $DIR/core/cmd/eth_keys_commands_test.go: `flagSetApplyFromAction(client.DeleteETHKey, set, "")` $DIR/core/cmd/eth_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/eth_keys_commands_test.go: `err = client.DeleteETHKey(c)` $DIR/core/cmd/eth_keys_commands_test.go: `_, err = ethKeyStore.Get(testutils.Context(t), address)` $DIR/core/cmd/eth_keys_commands_test.go: `cltest.AssertCount(t, app.GetDB(), "evm.key_states", 0)` $DIR/core/cmd/eth_keys_commands_test.go: `set = flag.NewFlagSet("test", 0)` $DIR/core/cmd/eth_keys_commands_test.go: `flagSetApplyFromAction(client.ImportETHKey, set, "")` $DIR/core/cmd/eth_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/eth_keys_commands_test.go: `err = client.ImportETHKey(c)` $DIR/core/cmd/eth_keys_commands_test.go: `r.Renders = nil` $DIR/core/cmd/eth_keys_commands_test.go: `set = flag.NewFlagSet("test", 0)` $DIR/core/cmd/eth_keys_commands_test.go: `flagSetApplyFromAction(client.ListETHKeys, set, "")` $DIR/core/cmd/eth_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/eth_keys_commands_test.go: `err = client.ListETHKeys(c)` $DIR/core/cmd/eth_keys_commands_test.go: `_, err = ethKeyStore.Get(testutils.Context(t), address)` $DIR/core/cmd/eth_keys_commands_test.go: `set = flag.NewFlagSet("test Eth export invalid id", 0)` $DIR/core/cmd/eth_keys_commands_test.go: `flagSetApplyFromAction(client.ExportETHKey, set, "")` $DIR/core/cmd/eth_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/eth_keys_commands_test.go: `err = client.ExportETHKey(c)` $DIR/core/cmd/eth_keys_commands_test.go: `t.Cleanup(func() { deleteKeyExportFile(t) })` $DIR/core/cmd/eth_keys_commands_test.go: `deleteKeyExportFile(t)` $DIR/core/cmd/eth_keys_commands_test.go: `ethClient.On("PendingNonceAt", mock.Anything, mock.Anything).Return(uint64(0), nil)` $DIR/core/cmd/eth_keys_commands_test.go: `c.EVM[0].Enabled = ptr(true)` $DIR/core/cmd/eth_keys_commands_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/cmd/eth_keys_commands_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/cmd/eth_keys_commands_test.go: `ethClient.On("Dial", mock.Anything).Maybe()` $DIR/core/cmd/eth_keys_commands_test.go: `ethClient.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything).Return(big.NewInt(42), nil)` $DIR/core/cmd/eth_keys_commands_test.go: `ethClient.On("LINKBalance", mock.Anything, mock.Anything, mock.Anything).Return(commonassets.NewLinkFromJuels(42), nil)` $DIR/core/cmd/eth_keys_commands_test.go: `flagSetApplyFromAction(client.RemoteLogin, set, "")` $DIR/core/cmd/eth_keys_commands_test.go: `err = client.ListETHKeys(c)` $DIR/core/cmd/eth_keys_commands_test.go: `r.Renders = nil` $DIR/core/cmd/eth_keys_commands_test.go: `err = os.MkdirAll(testdir, 0700|os.ModeDir)` $DIR/core/cmd/eth_keys_commands_test.go: `set = flag.NewFlagSet("test", 0)` $DIR/core/cmd/eth_keys_commands_test.go: `flagSetApplyFromAction(client.ExportETHKey, set, "")` $DIR/core/cmd/eth_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/eth_keys_commands_test.go: `err = client.ExportETHKey(c)` $DIR/core/cmd/eth_keys_commands_test.go: `set = flag.NewFlagSet("test", 0)` $DIR/core/cmd/eth_keys_commands_test.go: `flagSetApplyFromAction(client.DeleteETHKey, set, "")` $DIR/core/cmd/eth_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/eth_keys_commands_test.go: `err = client.DeleteETHKey(c)` $DIR/core/cmd/eth_keys_commands_test.go: `_, err = ethKeyStore.Get(testutils.Context(t), address)` $DIR/core/cmd/eth_keys_commands_test.go: `set = flag.NewFlagSet("test", 0)` $DIR/core/cmd/eth_keys_commands_test.go: `flagSetApplyFromAction(client.ImportETHKey, set, "")` $DIR/core/cmd/eth_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/eth_keys_commands_test.go: `err = client.ImportETHKey(c)` $DIR/core/cmd/eth_keys_commands_test.go: `r.Renders = nil` $DIR/core/cmd/eth_keys_commands_test.go: `set = flag.NewFlagSet("test", 0)` $DIR/core/cmd/eth_keys_commands_test.go: `flagSetApplyFromAction(client.ListETHKeys, set, "")` $DIR/core/cmd/eth_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/eth_keys_commands_test.go: `err = client.ListETHKeys(c)` $DIR/core/cmd/eth_keys_commands_test.go: `_, err = ethKeyStore.Get(testutils.Context(t), address)` $DIR/core/cmd/eth_keys_commands_test.go: `set = flag.NewFlagSet("test Eth export invalid id", 0)` $DIR/core/cmd/eth_keys_commands_test.go: `flagSetApplyFromAction(client.ExportETHKey, set, "")` $DIR/core/cmd/eth_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/eth_keys_commands_test.go: `err = client.ExportETHKey(c)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewEth(1)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewLinkFromJuels(2)` $DIR/core/cmd/eth_keys_commands_test.go: `.Now()` $DIR/core/cmd/eth_keys_commands_test.go: `.Now()` $DIR/core/cmd/eth_keys_commands_test.go: `.Add(time.Second)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewI(12345)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewBufferString("")` $DIR/core/cmd/eth_keys_commands_test.go: `.NewJAID(bundleID)` $DIR/core/cmd/eth_keys_commands_test.go: `.String()` $DIR/core/cmd/eth_keys_commands_test.go: `.Reset()` $DIR/core/cmd/eth_keys_commands_test.go: `.String()` $DIR/core/cmd/eth_keys_commands_test.go: `.String()` $DIR/core/cmd/eth_keys_commands_test.go: `.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/cmd/eth_keys_commands_test.go: `.Return(big.NewInt(42), nil)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewInt(42)` $DIR/core/cmd/eth_keys_commands_test.go: `.On("LINKBalance", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/cmd/eth_keys_commands_test.go: `.Return(commonassets.NewLinkFromJuels(13), nil)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewLinkFromJuels(13)` $DIR/core/cmd/eth_keys_commands_test.go: `.On("PendingNonceAt", mock.Anything, mock.Anything)` $DIR/core/cmd/eth_keys_commands_test.go: `.Return(uint64(0), nil)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/eth_keys_commands_test.go: `.LinkBalance.String()` $DIR/core/cmd/eth_keys_commands_test.go: `.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/cmd/eth_keys_commands_test.go: `.Return(nil, errors.New("fake error"))` $DIR/core/cmd/eth_keys_commands_test.go: `.New("fake error")` $DIR/core/cmd/eth_keys_commands_test.go: `.On("LINKBalance", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/cmd/eth_keys_commands_test.go: `.Return(nil, errors.New("fake error"))` $DIR/core/cmd/eth_keys_commands_test.go: `.New("fake error")` $DIR/core/cmd/eth_keys_commands_test.go: `.On("PendingNonceAt", mock.Anything, mock.Anything)` $DIR/core/cmd/eth_keys_commands_test.go: `.Return(uint64(0), nil)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/eth_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/eth_keys_commands_test.go: `.KeyStore.Eth()` $DIR/core/cmd/eth_keys_commands_test.go: `.GetAll(testutils.Context(t))` $DIR/core/cmd/eth_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/eth_keys_commands_test.go: `.Address.String()` $DIR/core/cmd/eth_keys_commands_test.go: `.UpdatedAt.String()` $DIR/core/cmd/eth_keys_commands_test.go: `.CreatedAt.String()` $DIR/core/cmd/eth_keys_commands_test.go: `.ToRow()` $DIR/core/cmd/eth_keys_commands_test.go: `.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/cmd/eth_keys_commands_test.go: `.Return(big.NewInt(42), nil)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewInt(42)` $DIR/core/cmd/eth_keys_commands_test.go: `.On("LINKBalance", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/cmd/eth_keys_commands_test.go: `.Return(commonassets.NewLinkFromJuels(42), nil)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewLinkFromJuels(42)` $DIR/core/cmd/eth_keys_commands_test.go: `.On("PendingNonceAt", mock.Anything, mock.Anything)` $DIR/core/cmd/eth_keys_commands_test.go: `.Return(uint64(0), nil)` $DIR/core/cmd/eth_keys_commands_test.go: `.GetDB()` $DIR/core/cmd/eth_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/eth_keys_commands_test.go: `.AssertCount(t, db, "evm.key_states", 1)` $DIR/core/cmd/eth_keys_commands_test.go: `.KeyStore.Eth()` $DIR/core/cmd/eth_keys_commands_test.go: `.GetAll(testutils.Context(t))` $DIR/core/cmd/eth_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewInt(0)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/eth_keys_commands_test.go: `.AssertCount(t, db, "evm.key_states", 2)` $DIR/core/cmd/eth_keys_commands_test.go: `.KeyStore.Eth()` $DIR/core/cmd/eth_keys_commands_test.go: `.GetAll(testutils.Context(t))` $DIR/core/cmd/eth_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/eth_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/eth_keys_commands_test.go: `.Eth()` $DIR/core/cmd/eth_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/eth_keys_commands_test.go: `.Create(testutils.Context(t), &cltest.FixtureChainID)` $DIR/core/cmd/eth_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/eth_keys_commands_test.go: `.DeleteETHKey(c)` $DIR/core/cmd/eth_keys_commands_test.go: `.Get(testutils.Context(t), key.Address.Hex())` $DIR/core/cmd/eth_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/eth_keys_commands_test.go: `.Address.Hex()` $DIR/core/cmd/eth_keys_commands_test.go: `.Cleanup(func() { deleteKeyExportFile(t) })` $DIR/core/cmd/eth_keys_commands_test.go: `.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/cmd/eth_keys_commands_test.go: `.Return(big.NewInt(42), nil)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewInt(42)` $DIR/core/cmd/eth_keys_commands_test.go: `.On("LINKBalance", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/cmd/eth_keys_commands_test.go: `.Return(commonassets.NewLinkFromJuels(42), nil)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewLinkFromJuels(42)` $DIR/core/cmd/eth_keys_commands_test.go: `.On("PendingNonceAt", mock.Anything, mock.Anything)` $DIR/core/cmd/eth_keys_commands_test.go: `.Return(uint64(0), nil)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/eth_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/eth_keys_commands_test.go: `.Eth()` $DIR/core/cmd/eth_keys_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/eth_keys_commands_test.go: `.RemoteLogin(c)` $DIR/core/cmd/eth_keys_commands_test.go: `.ListETHKeys(c)` $DIR/core/cmd/eth_keys_commands_test.go: `.Join(os.TempDir(), t.Name())` $DIR/core/cmd/eth_keys_commands_test.go: `.TempDir()` $DIR/core/cmd/eth_keys_commands_test.go: `.Name()` $DIR/core/cmd/eth_keys_commands_test.go: `.MkdirAll(testdir, 0700|os.ModeDir)` $DIR/core/cmd/eth_keys_commands_test.go: `.RemoveAll(testdir)` $DIR/core/cmd/eth_keys_commands_test.go: `.Join(testdir, "key")` $DIR/core/cmd/eth_keys_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/eth_keys_commands_test.go: `.ExportETHKey(c)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/eth_keys_commands_test.go: `.DeleteETHKey(c)` $DIR/core/cmd/eth_keys_commands_test.go: `.Get(testutils.Context(t), address)` $DIR/core/cmd/eth_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/eth_keys_commands_test.go: `.AssertCount(t, app.GetDB(), "evm.key_states", 0)` $DIR/core/cmd/eth_keys_commands_test.go: `.GetDB()` $DIR/core/cmd/eth_keys_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/eth_keys_commands_test.go: `.ImportETHKey(c)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/eth_keys_commands_test.go: `.ListETHKeys(c)` $DIR/core/cmd/eth_keys_commands_test.go: `.Get(testutils.Context(t), address)` $DIR/core/cmd/eth_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewFlagSet("test Eth export invalid id", 0)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/eth_keys_commands_test.go: `.ExportETHKey(c)` $DIR/core/cmd/eth_keys_commands_test.go: `.JustError(os.Stat(keyName))` $DIR/core/cmd/eth_keys_commands_test.go: `.Stat(keyName)` $DIR/core/cmd/eth_keys_commands_test.go: `.Cleanup(func() { deleteKeyExportFile(t) })` $DIR/core/cmd/eth_keys_commands_test.go: `.On("PendingNonceAt", mock.Anything, mock.Anything)` $DIR/core/cmd/eth_keys_commands_test.go: `.Return(uint64(0), nil)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/eth_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/eth_keys_commands_test.go: `.Eth()` $DIR/core/cmd/eth_keys_commands_test.go: `.On("Dial", mock.Anything)` $DIR/core/cmd/eth_keys_commands_test.go: `.Maybe()` $DIR/core/cmd/eth_keys_commands_test.go: `.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/cmd/eth_keys_commands_test.go: `.Return(big.NewInt(42), nil)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewInt(42)` $DIR/core/cmd/eth_keys_commands_test.go: `.On("LINKBalance", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/cmd/eth_keys_commands_test.go: `.Return(commonassets.NewLinkFromJuels(42), nil)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewLinkFromJuels(42)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/eth_keys_commands_test.go: `.RemoteLogin(c)` $DIR/core/cmd/eth_keys_commands_test.go: `.ListETHKeys(c)` $DIR/core/cmd/eth_keys_commands_test.go: `.Join(os.TempDir(), t.Name())` $DIR/core/cmd/eth_keys_commands_test.go: `.TempDir()` $DIR/core/cmd/eth_keys_commands_test.go: `.Name()` $DIR/core/cmd/eth_keys_commands_test.go: `.MkdirAll(testdir, 0700|os.ModeDir)` $DIR/core/cmd/eth_keys_commands_test.go: `.RemoveAll(testdir)` $DIR/core/cmd/eth_keys_commands_test.go: `.Join(testdir, "key")` $DIR/core/cmd/eth_keys_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/eth_keys_commands_test.go: `.ExportETHKey(c)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/eth_keys_commands_test.go: `.DeleteETHKey(c)` $DIR/core/cmd/eth_keys_commands_test.go: `.Get(testutils.Context(t), address)` $DIR/core/cmd/eth_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/eth_keys_commands_test.go: `.ImportETHKey(c)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/eth_keys_commands_test.go: `.ListETHKeys(c)` $DIR/core/cmd/eth_keys_commands_test.go: `.Get(testutils.Context(t), address)` $DIR/core/cmd/eth_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewFlagSet("test Eth export invalid id", 0)` $DIR/core/cmd/eth_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/eth_keys_commands_test.go: `.ExportETHKey(c)` $DIR/core/cmd/eth_keys_commands_test.go: `.JustError(os.Stat(keyName))` $DIR/core/cmd/eth_keys_commands_test.go: `.Stat(keyName)` $DIR/core/cmd/evm_chains_commands_test.go: `c.EVM[0].Enabled = ptr(true)` $DIR/core/cmd/evm_chains_commands_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/cmd/evm_chains_commands_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/cmd/evm_chains_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/evm_node_commands_test.go: `c.EVM = evmcfg.EVMConfigs{&chain}` $DIR/core/cmd/evm_node_commands_test.go: `assertTableRenders(t, r)` $DIR/core/cmd/evm_node_commands_test.go: `.MustParseURL("ws://localhost:8546")` $DIR/core/cmd/evm_node_commands_test.go: `.MustParseURL("http://localhost:8546")` $DIR/core/cmd/evm_node_commands_test.go: `.MustParseURL("ws://localhost:8547")` $DIR/core/cmd/evm_node_commands_test.go: `.MustParseURL("http://localhost:8547")` $DIR/core/cmd/evm_node_commands_test.go: `.Defaults(chainID)` $DIR/core/cmd/evm_node_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/evm_node_commands_test.go: `.Marshal(node1)` $DIR/core/cmd/evm_node_commands_test.go: `.Marshal(node2)` $DIR/core/cmd/evm_node_commands_test.go: `.Split(b.String(), "\n")` $DIR/core/cmd/evm_node_commands_test.go: `.String()` $DIR/core/cmd/evm_transaction_commands_test.go: `flagSetApplyFromAction(client.IndexTransactions, set, "")` $DIR/core/cmd/evm_transaction_commands_test.go: `set = flag.NewFlagSet("test txattempts", 0)` $DIR/core/cmd/evm_transaction_commands_test.go: `flagSetApplyFromAction(client.IndexTransactions, set, "")` $DIR/core/cmd/evm_transaction_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/evm_transaction_commands_test.go: `renderedTxs = *r.Renders[1].(*cmd.EthTxPresenters)` $DIR/core/cmd/evm_transaction_commands_test.go: `flagSetApplyFromAction(client.ShowTransaction, set, "")` $DIR/core/cmd/evm_transaction_commands_test.go: `flagSetApplyFromAction(client.IndexTxAttempts, set, "")` $DIR/core/cmd/evm_transaction_commands_test.go: `set = flag.NewFlagSet("test transactions", 0)` $DIR/core/cmd/evm_transaction_commands_test.go: `flagSetApplyFromAction(client.IndexTxAttempts, set, "")` $DIR/core/cmd/evm_transaction_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/evm_transaction_commands_test.go: `renderedAttempts = *r.Renders[1].(*cmd.EthTxPresenters)` $DIR/core/cmd/evm_transaction_commands_test.go: `ethMock.On("BalanceAt", mock.Anything, key.Address, (*big.Int)(nil)).Return(balance.ToInt(), nil)` $DIR/core/cmd/evm_transaction_commands_test.go: `ethMock.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(0), nil).Maybe()` $DIR/core/cmd/evm_transaction_commands_test.go: `ethMock.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), nil).Once()` $DIR/core/cmd/evm_transaction_commands_test.go: `c.EVM[0].Enabled = ptr(true)` $DIR/core/cmd/evm_transaction_commands_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/cmd/evm_transaction_commands_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/cmd/evm_transaction_commands_test.go: `c.Database.Listener.FallbackPollInterval = commonconfig.MustNewDuration(time.Second)` $DIR/core/cmd/evm_transaction_commands_test.go: `flagSetApplyFromAction(client.SendEther, set, "")` $DIR/core/cmd/evm_transaction_commands_test.go: `ethMock.On("BalanceAt", mock.Anything, key.Address, (*big.Int)(nil)).Return(balance.ToInt(), nil)` $DIR/core/cmd/evm_transaction_commands_test.go: `ethMock.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(0), nil).Maybe()` $DIR/core/cmd/evm_transaction_commands_test.go: `ethMock.On("PendingNonceAt", mock.Anything, fromAddress).Return(uint64(0), nil).Once()` $DIR/core/cmd/evm_transaction_commands_test.go: `c.EVM[0].Enabled = ptr(true)` $DIR/core/cmd/evm_transaction_commands_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/cmd/evm_transaction_commands_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/cmd/evm_transaction_commands_test.go: `c.Database.Listener.FallbackPollInterval = commonconfig.MustNewDuration(time.Second)` $DIR/core/cmd/evm_transaction_commands_test.go: `flagSetApplyFromAction(client.SendEther, set, "")` $DIR/core/cmd/evm_transaction_commands_test.go: `err = set.Parse([]string{amount, fromAddress.Hex(), to})` $DIR/core/cmd/evm_transaction_commands_test.go: `err = set.Set("wei", "true")` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/evm_transaction_commands_test.go: `.MustInsertRandomKey(t, app.KeyStore.Eth())` $DIR/core/cmd/evm_transaction_commands_test.go: `.KeyStore.Eth()` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewTestTxStore(t, app.GetDB())` $DIR/core/cmd/evm_transaction_commands_test.go: `.GetDB()` $DIR/core/cmd/evm_transaction_commands_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 0, 1, from)` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewFlagSet("test transactions", 0)` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewFlagSet("test txattempts", 0)` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/evm_transaction_commands_test.go: `.GetDB()` $DIR/core/cmd/evm_transaction_commands_test.go: `.MustInsertRandomKey(t, app.KeyStore.Eth())` $DIR/core/cmd/evm_transaction_commands_test.go: `.KeyStore.Eth()` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewTestTxStore(t, db)` $DIR/core/cmd/evm_transaction_commands_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 0, 1, from)` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewFlagSet("test get tx", 0)` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/evm_transaction_commands_test.go: `.MustInsertRandomKey(t, app.KeyStore.Eth())` $DIR/core/cmd/evm_transaction_commands_test.go: `.KeyStore.Eth()` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewTestTxStore(t, app.GetDB())` $DIR/core/cmd/evm_transaction_commands_test.go: `.GetDB()` $DIR/core/cmd/evm_transaction_commands_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 0, 1, from)` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewFlagSet("test txattempts", 0)` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewFlagSet("test transactions", 0)` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/evm_transaction_commands_test.go: `.MustGenerateRandomKey(t)` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewEthValueS("200")` $DIR/core/cmd/evm_transaction_commands_test.go: `.On("BalanceAt", mock.Anything, key.Address, (*big.Int)(nil))` $DIR/core/cmd/evm_transaction_commands_test.go: `.Return(balance.ToInt(), nil)` $DIR/core/cmd/evm_transaction_commands_test.go: `.ToInt()` $DIR/core/cmd/evm_transaction_commands_test.go: `.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/cmd/evm_transaction_commands_test.go: `.Return(evmtypes.Nonce(0), nil)` $DIR/core/cmd/evm_transaction_commands_test.go: `.Nonce(0)` $DIR/core/cmd/evm_transaction_commands_test.go: `.Maybe()` $DIR/core/cmd/evm_transaction_commands_test.go: `.On("PendingNonceAt", mock.Anything, fromAddress)` $DIR/core/cmd/evm_transaction_commands_test.go: `.Return(uint64(0), nil)` $DIR/core/cmd/evm_transaction_commands_test.go: `.Once()` $DIR/core/cmd/evm_transaction_commands_test.go: `.MustNewDuration(time.Second)` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/evm_transaction_commands_test.go: `.GetDB()` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewTxStore(db, logger.TestLogger(t))` $DIR/core/cmd/evm_transaction_commands_test.go: `.TestLogger(t)` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewFlagSet("sendether", 0)` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewApp()` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewContext(cliapp, set, nil)` $DIR/core/cmd/evm_transaction_commands_test.go: `.GetAllTxes(testutils.Context(t))` $DIR/core/cmd/evm_transaction_commands_test.go: `.Context(t)` $DIR/core/cmd/evm_transaction_commands_test.go: `.Eth(evmTx.Value)` $DIR/core/cmd/evm_transaction_commands_test.go: `.GetAllTxAttempts(testutils.Context(t))` $DIR/core/cmd/evm_transaction_commands_test.go: `.Context(t)` $DIR/core/cmd/evm_transaction_commands_test.go: `.MustGenerateRandomKey(t)` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewEthValueS("200")` $DIR/core/cmd/evm_transaction_commands_test.go: `.On("BalanceAt", mock.Anything, key.Address, (*big.Int)(nil))` $DIR/core/cmd/evm_transaction_commands_test.go: `.Return(balance.ToInt(), nil)` $DIR/core/cmd/evm_transaction_commands_test.go: `.ToInt()` $DIR/core/cmd/evm_transaction_commands_test.go: `.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/cmd/evm_transaction_commands_test.go: `.Return(evmtypes.Nonce(0), nil)` $DIR/core/cmd/evm_transaction_commands_test.go: `.Nonce(0)` $DIR/core/cmd/evm_transaction_commands_test.go: `.Maybe()` $DIR/core/cmd/evm_transaction_commands_test.go: `.On("PendingNonceAt", mock.Anything, fromAddress)` $DIR/core/cmd/evm_transaction_commands_test.go: `.Return(uint64(0), nil)` $DIR/core/cmd/evm_transaction_commands_test.go: `.Once()` $DIR/core/cmd/evm_transaction_commands_test.go: `.MustNewDuration(time.Second)` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/evm_transaction_commands_test.go: `.GetDB()` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewTxStore(db, logger.TestLogger(t))` $DIR/core/cmd/evm_transaction_commands_test.go: `.TestLogger(t)` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewFlagSet("sendether", 0)` $DIR/core/cmd/evm_transaction_commands_test.go: `.Parse([]string{amount, fromAddress.Hex(), to})` $DIR/core/cmd/evm_transaction_commands_test.go: `.Hex()` $DIR/core/cmd/evm_transaction_commands_test.go: `.Set("wei", "true")` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewApp()` $DIR/core/cmd/evm_transaction_commands_test.go: `.NewContext(cliapp, set, nil)` $DIR/core/cmd/evm_transaction_commands_test.go: `.GetAllTxes(testutils.Context(t))` $DIR/core/cmd/evm_transaction_commands_test.go: `.Context(t)` $DIR/core/cmd/evm_transaction_commands_test.go: `.Eth(evmTx.Value)` $DIR/core/cmd/evm_transaction_commands_test.go: `.GetAllTxAttempts(testutils.Context(t))` $DIR/core/cmd/evm_transaction_commands_test.go: `.Context(t)` $DIR/core/cmd/external_initiator_commands_test.go: `buffer.Reset()` $DIR/core/cmd/external_initiator_commands_test.go: `output = buffer.String()` $DIR/core/cmd/external_initiator_commands_test.go: `.MustWebURL(t, "http://example.com")` $DIR/core/cmd/external_initiator_commands_test.go: `.Now()` $DIR/core/cmd/external_initiator_commands_test.go: `.Now()` $DIR/core/cmd/external_initiator_commands_test.go: `.NewBufferString("")` $DIR/core/cmd/external_initiator_commands_test.go: `.NewJAID(name)` $DIR/core/cmd/external_initiator_commands_test.go: `.String()` $DIR/core/cmd/external_initiator_commands_test.go: `.Reset()` $DIR/core/cmd/external_initiator_commands_test.go: `.String()` $DIR/core/cmd/forwarders_commands_test.go: `buffer.Reset()` $DIR/core/cmd/forwarders_commands_test.go: `output = buffer.String()` $DIR/core/cmd/forwarders_commands_test.go: `c.EVM[0].ChainID = id` $DIR/core/cmd/forwarders_commands_test.go: `c.EVM[0].Enabled = ptr(true)` $DIR/core/cmd/forwarders_commands_test.go: `flagSetApplyFromAction(client.TrackForwarder, set, "")` $DIR/core/cmd/forwarders_commands_test.go: `set = flag.NewFlagSet("test", 0)` $DIR/core/cmd/forwarders_commands_test.go: `flagSetApplyFromAction(client.DeleteForwarder, set, "")` $DIR/core/cmd/forwarders_commands_test.go: `fwds = *r.Renders[2].(*cmd.EVMForwarderPresenters)` $DIR/core/cmd/forwarders_commands_test.go: `c.EVM[0].ChainID = id` $DIR/core/cmd/forwarders_commands_test.go: `c.EVM[0].Enabled = ptr(true)` $DIR/core/cmd/forwarders_commands_test.go: `flagSetApplyFromAction(client.TrackForwarder, set, "")` $DIR/core/cmd/forwarders_commands_test.go: `c.EVM[0].Enabled = ptr(true)` $DIR/core/cmd/forwarders_commands_test.go: `flagSetApplyFromAction(client.DeleteForwarder, set, "")` $DIR/core/cmd/forwarders_commands_test.go: `.RandomAddress()` $DIR/core/cmd/forwarders_commands_test.go: `.NewI(4)` $DIR/core/cmd/forwarders_commands_test.go: `.Now()` $DIR/core/cmd/forwarders_commands_test.go: `.Now()` $DIR/core/cmd/forwarders_commands_test.go: `.Add(time.Second)` $DIR/core/cmd/forwarders_commands_test.go: `.NewBufferString("")` $DIR/core/cmd/forwarders_commands_test.go: `.NewJAID(id)` $DIR/core/cmd/forwarders_commands_test.go: `.String()` $DIR/core/cmd/forwarders_commands_test.go: `.Reset()` $DIR/core/cmd/forwarders_commands_test.go: `.String()` $DIR/core/cmd/forwarders_commands_test.go: `.Format(time.RFC3339)` $DIR/core/cmd/forwarders_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/forwarders_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/forwarders_commands_test.go: `.TrackForwarder(cli.NewContext(nil, set, nil))` $DIR/core/cmd/forwarders_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/forwarders_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/forwarders_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/forwarders_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/forwarders_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/forwarders_commands_test.go: `.TrackForwarder(cli.NewContext(nil, set, nil))` $DIR/core/cmd/forwarders_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/forwarders_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/forwarders_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/forwarders_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/jobs_commands_test.go: `buffer.Reset()` $DIR/core/cmd/jobs_commands_test.go: `output = buffer.String()` $DIR/core/cmd/jobs_commands_test.go: `t.Run("gets the tasks from the DAG in reverse order", func(t *testing.T) { r.PipelineSpec = presenters.PipelineSpec{ DotDAGSource: "ds1 [type=http method=GET url=\"example.com\" allowunrestrictednetworkaccess=\"true\"];\n ds1_parse [type=jsonparse path=\"USD\"];\n ds1_multiply [type=multiply times=100];\n ds1 -\u003e ds1_parse -\u003e ds1_multiply;\n", } tasks, err := r.GetTasks() assert.NoError(t, err) assert.Equal(t, []string{ "ds1 http", "ds1_parse jsonparse", "ds1_multiply multiply", }, tasks) })` $DIR/core/cmd/jobs_commands_test.go: `r.PipelineSpec = presenters.PipelineSpec{ DotDAGSource: "ds1 [type=http method=GET url=\"example.com\" allowunrestrictednetworkaccess=\"true\"];\n ds1_parse [type=jsonparse path=\"USD\"];\n ds1_multiply [type=multiply times=100];\n ds1 -\u003e ds1_parse -\u003e ds1_multiply;\n", }` $DIR/core/cmd/jobs_commands_test.go: `r.PipelineSpec = presenters.PipelineSpec{ DotDAGSource: "invalid dot", }` $DIR/core/cmd/jobs_commands_test.go: `t.Run("gets the tasks in a printable format", func(t *testing.T) { r.PipelineSpec = presenters.PipelineSpec{ DotDAGSource: " ds1 [type=http method=GET url=\"example.com\" allowunrestrictednetworkaccess=\"true\"];\n ds1_parse [type=jsonparse path=\"USD\"];\n ds1_multiply [type=multiply times=100];\n ds1 -\u003e ds1_parse -\u003e ds1_multiply;\n", } assert.Equal(t, []string{ "ds1 http", "ds1_parse jsonparse", "ds1_multiply multiply", }, r.FriendlyTasks()) })` $DIR/core/cmd/jobs_commands_test.go: `r.PipelineSpec = presenters.PipelineSpec{ DotDAGSource: " ds1 [type=http method=GET url=\"example.com\" allowunrestrictednetworkaccess=\"true\"];\n ds1_parse [type=jsonparse path=\"USD\"];\n ds1_multiply [type=multiply times=100];\n ds1 -\u003e ds1_parse -\u003e ds1_multiply;\n", }` $DIR/core/cmd/jobs_commands_test.go: `r.PipelineSpec = presenters.PipelineSpec{ DotDAGSource: "invalid dot", }` $DIR/core/cmd/jobs_commands_test.go: `t.Run(tc.name, func(t *testing.T) { assert.Equal(t, tc.result, tc.job.FriendlyCreatedAt()) })` $DIR/core/cmd/jobs_commands_test.go: `job.PipelineSpec.DotDAGSource = ""` $DIR/core/cmd/jobs_commands_test.go: `c.EVM[0].Enabled = ptr(true)` $DIR/core/cmd/jobs_commands_test.go: `flagSetApplyFromAction(client.CreateJob, fs, "")` $DIR/core/cmd/jobs_commands_test.go: `c.EVM[0].Enabled = ptr(true)` $DIR/core/cmd/jobs_commands_test.go: `flagSetApplyFromAction(client.CreateJob, fs, "")` $DIR/core/cmd/jobs_commands_test.go: `err = set.Parse([]string{createOutput.ID})` $DIR/core/cmd/jobs_commands_test.go: `c.Database.Listener.FallbackPollInterval = commonconfig.MustNewDuration(100 * time.Millisecond)` $DIR/core/cmd/jobs_commands_test.go: `c.OCR.Enabled = ptr(true)` $DIR/core/cmd/jobs_commands_test.go: `c.P2P.V2.Enabled = ptr(true)` $DIR/core/cmd/jobs_commands_test.go: `c.P2P.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", freeport.GetOne(t))}` $DIR/core/cmd/jobs_commands_test.go: `c.P2P.PeerID = &cltest.DefaultP2PPeerID` $DIR/core/cmd/jobs_commands_test.go: `c.EVM[0].Enabled = ptr(true)` $DIR/core/cmd/jobs_commands_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/cmd/jobs_commands_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/cmd/jobs_commands_test.go: `c.EVM[0].GasEstimator.Mode = ptr("FixedPrice")` $DIR/core/cmd/jobs_commands_test.go: `opts.FlagsAndDeps = append(opts.FlagsAndDeps, cltest.DefaultP2PKey)` $DIR/core/cmd/jobs_commands_test.go: `requireJobsCount(t, app.JobORM(), 0)` $DIR/core/cmd/jobs_commands_test.go: `flagSetApplyFromAction(client.CreateJob, fs, "")` $DIR/core/cmd/jobs_commands_test.go: `requireJobsCount(t, app.JobORM(), 1)` $DIR/core/cmd/jobs_commands_test.go: `c.Database.Listener.FallbackPollInterval = commonconfig.MustNewDuration(100 * time.Millisecond)` $DIR/core/cmd/jobs_commands_test.go: `c.EVM[0].Enabled = ptr(true)` $DIR/core/cmd/jobs_commands_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/cmd/jobs_commands_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/cmd/jobs_commands_test.go: `c.EVM[0].GasEstimator.Mode = ptr("FixedPrice")` $DIR/core/cmd/jobs_commands_test.go: `flagSetApplyFromAction(client.CreateJob, fs, "")` $DIR/core/cmd/jobs_commands_test.go: `requireJobsCount(t, app.JobORM(), 1)` $DIR/core/cmd/jobs_commands_test.go: `cltest.AwaitJobActive(t, app.JobSpawner(), jobID, 3*time.Second)` $DIR/core/cmd/jobs_commands_test.go: `flagSetApplyFromAction(client.DeleteJob, set, "")` $DIR/core/cmd/jobs_commands_test.go: `set = flag.NewFlagSet("test", 0)` $DIR/core/cmd/jobs_commands_test.go: `flagSetApplyFromAction(client.DeleteJob, set, "")` $DIR/core/cmd/jobs_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/jobs_commands_test.go: `.Interval(1 * time.Second)` $DIR/core/cmd/jobs_commands_test.go: `.Now()` $DIR/core/cmd/jobs_commands_test.go: `.Now()` $DIR/core/cmd/jobs_commands_test.go: `.Add(time.Second)` $DIR/core/cmd/jobs_commands_test.go: `.NewBufferString("")` $DIR/core/cmd/jobs_commands_test.go: `.NewJAID(id)` $DIR/core/cmd/jobs_commands_test.go: `.JobSpecType(jobSpecType)` $DIR/core/cmd/jobs_commands_test.go: `.String()` $DIR/core/cmd/jobs_commands_test.go: `.Reset()` $DIR/core/cmd/jobs_commands_test.go: `.String()` $DIR/core/cmd/jobs_commands_test.go: `.Format(time.RFC3339)` $DIR/core/cmd/jobs_commands_test.go: `.Run("gets the tasks from the DAG in reverse order", func(t *testing.T) { r.PipelineSpec = presenters.PipelineSpec{ DotDAGSource: "ds1 [type=http method=GET url=\"example.com\" allowunrestrictednetworkaccess=\"true\"];\n ds1_parse [type=jsonparse path=\"USD\"];\n ds1_multiply [type=multiply times=100];\n ds1 -\u003e ds1_parse -\u003e ds1_multiply;\n", } tasks, err := r.GetTasks() assert.NoError(t, err) assert.Equal(t, []string{ "ds1 http", "ds1_parse jsonparse", "ds1_multiply multiply", }, tasks) })` $DIR/core/cmd/jobs_commands_test.go: `.GetTasks()` $DIR/core/cmd/jobs_commands_test.go: `.GetTasks()` $DIR/core/cmd/jobs_commands_test.go: `.Run("gets the tasks in a printable format", func(t *testing.T) { r.PipelineSpec = presenters.PipelineSpec{ DotDAGSource: " ds1 [type=http method=GET url=\"example.com\" allowunrestrictednetworkaccess=\"true\"];\n ds1_parse [type=jsonparse path=\"USD\"];\n ds1_multiply [type=multiply times=100];\n ds1 -\u003e ds1_parse -\u003e ds1_multiply;\n", } assert.Equal(t, []string{ "ds1 http", "ds1_parse jsonparse", "ds1_multiply multiply", }, r.FriendlyTasks()) })` $DIR/core/cmd/jobs_commands_test.go: `.Now()` $DIR/core/cmd/jobs_commands_test.go: `.Format(time.RFC3339)` $DIR/core/cmd/jobs_commands_test.go: `.Format(time.RFC3339)` $DIR/core/cmd/jobs_commands_test.go: `.Format(time.RFC3339)` $DIR/core/cmd/jobs_commands_test.go: `.Format(time.RFC3339)` $DIR/core/cmd/jobs_commands_test.go: `.Format(time.RFC3339)` $DIR/core/cmd/jobs_commands_test.go: `.Format(time.RFC3339)` $DIR/core/cmd/jobs_commands_test.go: `.Format(time.RFC3339)` $DIR/core/cmd/jobs_commands_test.go: `.Run(tc.name, func(t *testing.T) { assert.Equal(t, tc.result, tc.job.FriendlyCreatedAt()) })` $DIR/core/cmd/jobs_commands_test.go: `.Now()` $DIR/core/cmd/jobs_commands_test.go: `.NewJAID("1")` $DIR/core/cmd/jobs_commands_test.go: `.Format(time.RFC3339)` $DIR/core/cmd/jobs_commands_test.go: `.ToRows()` $DIR/core/cmd/jobs_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/jobs_commands_test.go: `.NewFlagSet("", flag.ExitOnError)` $DIR/core/cmd/jobs_commands_test.go: `.CreateJob(cli.NewContext(nil, fs, nil))` $DIR/core/cmd/jobs_commands_test.go: `.NewContext(nil, fs, nil)` $DIR/core/cmd/jobs_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/jobs_commands_test.go: `.NewFlagSet("", flag.ExitOnError)` $DIR/core/cmd/jobs_commands_test.go: `.CreateJob(cli.NewContext(nil, fs, nil))` $DIR/core/cmd/jobs_commands_test.go: `.NewContext(nil, fs, nil)` $DIR/core/cmd/jobs_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/jobs_commands_test.go: `.Parse([]string{createOutput.ID})` $DIR/core/cmd/jobs_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/jobs_commands_test.go: `.MustNewDuration(100 * time.Millisecond)` $DIR/core/cmd/jobs_commands_test.go: `.Sprintf("127.0.0.1:%d", freeport.GetOne(t))` $DIR/core/cmd/jobs_commands_test.go: `.GetOne(t)` $DIR/core/cmd/jobs_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/jobs_commands_test.go: `.JobORM()` $DIR/core/cmd/jobs_commands_test.go: `.NewFlagSet("", flag.ExitOnError)` $DIR/core/cmd/jobs_commands_test.go: `.New()` $DIR/core/cmd/jobs_commands_test.go: `.Sprintf(ocrBootstrapSpec, nameAndExternalJobID, nameAndExternalJobID)` $DIR/core/cmd/jobs_commands_test.go: `.CreateJob(cli.NewContext(nil, fs, nil))` $DIR/core/cmd/jobs_commands_test.go: `.NewContext(nil, fs, nil)` $DIR/core/cmd/jobs_commands_test.go: `.JobORM()` $DIR/core/cmd/jobs_commands_test.go: `.OffChainReportingSpec.ContractAddress.String()` $DIR/core/cmd/jobs_commands_test.go: `.MustNewDuration(100 * time.Millisecond)` $DIR/core/cmd/jobs_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/jobs_commands_test.go: `.NewFlagSet("", flag.ExitOnError)` $DIR/core/cmd/jobs_commands_test.go: `.CreateJob(cli.NewContext(nil, fs, nil))` $DIR/core/cmd/jobs_commands_test.go: `.NewContext(nil, fs, nil)` $DIR/core/cmd/jobs_commands_test.go: `.JobORM()` $DIR/core/cmd/jobs_commands_test.go: `.Context(t)` $DIR/core/cmd/jobs_commands_test.go: `.JobORM()` $DIR/core/cmd/jobs_commands_test.go: `.FindJobs(ctx, 0, 1000)` $DIR/core/cmd/jobs_commands_test.go: `.AwaitJobActive(t, app.JobSpawner(), jobID, 3*time.Second)` $DIR/core/cmd/jobs_commands_test.go: `.JobSpawner()` $DIR/core/cmd/jobs_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/jobs_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/jobs_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/jobs_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/jobs_commands_test.go: `.JobORM()` $DIR/core/cmd/ocr2_keys_commands_test.go: `buffer.Reset()` $DIR/core/cmd/ocr2_keys_commands_test.go: `output = buffer.String()` $DIR/core/cmd/ocr2_keys_commands_test.go: `pubKeyConfig = key.ConfigEncryptionPublicKey()` $DIR/core/cmd/ocr2_keys_commands_test.go: `requireOCR2KeyCount(t, app, 0)` $DIR/core/cmd/ocr2_keys_commands_test.go: `t.Run("ListOCR2KeyBundles", func(tt *testing.T) { defer cleanup() ctx := testutils.Context(t) client, r := app.NewShellAndRenderer() key, err := app.GetKeyStore().OCR2().Create(ctx, "evm") require.NoError(t, err) requireOCR2KeyCount(t, app, 1) assert.Nil(t, client.ListOCR2KeyBundles(cltest.EmptyCLIContext())) require.Equal(t, 1, len(r.Renders)) output := *r.Renders[0].(*cmd.OCR2KeyBundlePresenters) require.Equal(t, key.ID(), output[0].ID) })` $DIR/core/cmd/ocr2_keys_commands_test.go: `requireOCR2KeyCount(t, app, 1)` $DIR/core/cmd/ocr2_keys_commands_test.go: `t.Run("CreateOCR2KeyBundle", func(tt *testing.T) { defer cleanup() client, r := app.NewShellAndRenderer() set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(client.CreateOCR2KeyBundle, set, "") require.NoError(tt, set.Parse([]string{"evm"})) c := cli.NewContext(nil, set, nil) require.NoError(t, client.CreateOCR2KeyBundle(c)) keys, err := app.GetKeyStore().OCR2().GetAll() require.NoError(t, err) require.Len(t, keys, 1) require.Equal(t, 1, len(r.Renders)) output := (*r.Renders[0].(*cmd.OCR2KeyBundlePresenter)) require.Equal(t, output.ID, keys[0].ID()) })` $DIR/core/cmd/ocr2_keys_commands_test.go: `flagSetApplyFromAction(client.CreateOCR2KeyBundle, set, "")` $DIR/core/cmd/ocr2_keys_commands_test.go: `t.Run("DeleteOCR2KeyBundle", func(tt *testing.T) { defer cleanup() ctx := testutils.Context(t) client, r := app.NewShellAndRenderer() key, err := app.GetKeyStore().OCR2().Create(ctx, "evm") require.NoError(t, err) requireOCR2KeyCount(t, app, 1) set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(client.DeleteOCR2KeyBundle, set, "") require.NoError(tt, set.Parse([]string{key.ID()})) require.NoError(tt, set.Set("yes", "true")) c := cli.NewContext(nil, set, nil) require.NoError(t, client.DeleteOCR2KeyBundle(c)) requireOCR2KeyCount(t, app, 0) require.Equal(t, 1, len(r.Renders)) output := *r.Renders[0].(*cmd.OCR2KeyBundlePresenter) assert.Equal(t, key.ID(), output.ID) })` $DIR/core/cmd/ocr2_keys_commands_test.go: `requireOCR2KeyCount(t, app, 1)` $DIR/core/cmd/ocr2_keys_commands_test.go: `flagSetApplyFromAction(client.DeleteOCR2KeyBundle, set, "")` $DIR/core/cmd/ocr2_keys_commands_test.go: `requireOCR2KeyCount(t, app, 0)` $DIR/core/cmd/ocr2_keys_commands_test.go: `flagSetApplyFromAction(client.ExportOCR2Key, set, "")` $DIR/core/cmd/ocr2_keys_commands_test.go: `err = client.ExportOCR2Key(c)` $DIR/core/cmd/ocr2_keys_commands_test.go: `set = flag.NewFlagSet("test OCR2 export", 0)` $DIR/core/cmd/ocr2_keys_commands_test.go: `flagSetApplyFromAction(client.ExportOCR2Key, set, "")` $DIR/core/cmd/ocr2_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/ocr2_keys_commands_test.go: `requireOCR2KeyCount(t, app, 0)` $DIR/core/cmd/ocr2_keys_commands_test.go: `set = flag.NewFlagSet("test OCR2 import", 0)` $DIR/core/cmd/ocr2_keys_commands_test.go: `flagSetApplyFromAction(client.ImportOCR2Key, set, "")` $DIR/core/cmd/ocr2_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/ocr2_keys_commands_test.go: `requireOCR2KeyCount(t, app, 1)` $DIR/core/cmd/ocr2_keys_commands_test.go: `.NewBufferString("")` $DIR/core/cmd/ocr2_keys_commands_test.go: `.ConfigEncryptionPublicKey()` $DIR/core/cmd/ocr2_keys_commands_test.go: `.OffchainPublicKey()` $DIR/core/cmd/ocr2_keys_commands_test.go: `.NewJAID(bundleID)` $DIR/core/cmd/ocr2_keys_commands_test.go: `.NewJAID(key.ID())` $DIR/core/cmd/ocr2_keys_commands_test.go: `.ID()` $DIR/core/cmd/ocr2_keys_commands_test.go: `.OnChainPublicKey()` $DIR/core/cmd/ocr2_keys_commands_test.go: `.EncodeToString(pubKey[:])` $DIR/core/cmd/ocr2_keys_commands_test.go: `.EncodeToString(pubKeyConfig[:])` $DIR/core/cmd/ocr2_keys_commands_test.go: `.String()` $DIR/core/cmd/ocr2_keys_commands_test.go: `.Reset()` $DIR/core/cmd/ocr2_keys_commands_test.go: `.String()` $DIR/core/cmd/ocr2_keys_commands_test.go: `.ConfigEncryptionPublicKey()` $DIR/core/cmd/ocr2_keys_commands_test.go: `.EncodeToString(pubKeyConfig[:])` $DIR/core/cmd/ocr2_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/ocr2_keys_commands_test.go: `.OCR2()` $DIR/core/cmd/ocr2_keys_commands_test.go: `.Background()` $DIR/core/cmd/ocr2_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/ocr2_keys_commands_test.go: `.OCR2()` $DIR/core/cmd/ocr2_keys_commands_test.go: `.GetAll()` $DIR/core/cmd/ocr2_keys_commands_test.go: `.Run("ListOCR2KeyBundles", func(tt *testing.T) { defer cleanup() ctx := testutils.Context(t) client, r := app.NewShellAndRenderer() key, err := app.GetKeyStore().OCR2().Create(ctx, "evm") require.NoError(t, err) requireOCR2KeyCount(t, app, 1) assert.Nil(t, client.ListOCR2KeyBundles(cltest.EmptyCLIContext())) require.Equal(t, 1, len(r.Renders)) output := *r.Renders[0].(*cmd.OCR2KeyBundlePresenters) require.Equal(t, key.ID(), output[0].ID) })` $DIR/core/cmd/ocr2_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/ocr2_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/ocr2_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/ocr2_keys_commands_test.go: `.OCR2()` $DIR/core/cmd/ocr2_keys_commands_test.go: `.Create(ctx, "evm")` $DIR/core/cmd/ocr2_keys_commands_test.go: `.Run("CreateOCR2KeyBundle", func(tt *testing.T) { defer cleanup() client, r := app.NewShellAndRenderer() set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(client.CreateOCR2KeyBundle, set, "") require.NoError(tt, set.Parse([]string{"evm"})) c := cli.NewContext(nil, set, nil) require.NoError(t, client.CreateOCR2KeyBundle(c)) keys, err := app.GetKeyStore().OCR2().GetAll() require.NoError(t, err) require.Len(t, keys, 1) require.Equal(t, 1, len(r.Renders)) output := (*r.Renders[0].(*cmd.OCR2KeyBundlePresenter)) require.Equal(t, output.ID, keys[0].ID()) })` $DIR/core/cmd/ocr2_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/ocr2_keys_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/ocr2_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/ocr2_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/ocr2_keys_commands_test.go: `.OCR2()` $DIR/core/cmd/ocr2_keys_commands_test.go: `.GetAll()` $DIR/core/cmd/ocr2_keys_commands_test.go: `.Run("DeleteOCR2KeyBundle", func(tt *testing.T) { defer cleanup() ctx := testutils.Context(t) client, r := app.NewShellAndRenderer() key, err := app.GetKeyStore().OCR2().Create(ctx, "evm") require.NoError(t, err) requireOCR2KeyCount(t, app, 1) set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(client.DeleteOCR2KeyBundle, set, "") require.NoError(tt, set.Parse([]string{key.ID()})) require.NoError(tt, set.Set("yes", "true")) c := cli.NewContext(nil, set, nil) require.NoError(t, client.DeleteOCR2KeyBundle(c)) requireOCR2KeyCount(t, app, 0) require.Equal(t, 1, len(r.Renders)) output := *r.Renders[0].(*cmd.OCR2KeyBundlePresenter) assert.Equal(t, key.ID(), output.ID) })` $DIR/core/cmd/ocr2_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/ocr2_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/ocr2_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/ocr2_keys_commands_test.go: `.OCR2()` $DIR/core/cmd/ocr2_keys_commands_test.go: `.Create(ctx, "evm")` $DIR/core/cmd/ocr2_keys_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/ocr2_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/ocr2_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/ocr2_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/ocr2_keys_commands_test.go: `.KeyStore.OCR2()` $DIR/core/cmd/ocr2_keys_commands_test.go: `.Add(ctx, cltest.DefaultOCR2Key)` $DIR/core/cmd/ocr2_keys_commands_test.go: `.NewFlagSet("test OCR2 export", 0)` $DIR/core/cmd/ocr2_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/ocr2_keys_commands_test.go: `.ExportOCR2Key(c)` $DIR/core/cmd/ocr2_keys_commands_test.go: `.NewFlagSet("test OCR2 export", 0)` $DIR/core/cmd/ocr2_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/ocr2_keys_commands_test.go: `.NewFlagSet("test OCR2 import", 0)` $DIR/core/cmd/ocr2_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/ocr_keys_commands_test.go: `buffer.Reset()` $DIR/core/cmd/ocr_keys_commands_test.go: `output = buffer.String()` $DIR/core/cmd/ocr_keys_commands_test.go: `pubKeyConfig = key.PublicKeyConfig()` $DIR/core/cmd/ocr_keys_commands_test.go: `requireOCRKeyCount(t, app, 1)` $DIR/core/cmd/ocr_keys_commands_test.go: `requireOCRKeyCount(t, app, 0)` $DIR/core/cmd/ocr_keys_commands_test.go: `requireOCRKeyCount(t, app, 1)` $DIR/core/cmd/ocr_keys_commands_test.go: `flagSetApplyFromAction(client.DeleteOCRKeyBundle, set, "")` $DIR/core/cmd/ocr_keys_commands_test.go: `requireOCRKeyCount(t, app, 0)` $DIR/core/cmd/ocr_keys_commands_test.go: `flagSetApplyFromAction(client.ExportOCRKey, set, "")` $DIR/core/cmd/ocr_keys_commands_test.go: `set = flag.NewFlagSet("test OCR export", 0)` $DIR/core/cmd/ocr_keys_commands_test.go: `flagSetApplyFromAction(client.ExportOCRKey, set, "")` $DIR/core/cmd/ocr_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/ocr_keys_commands_test.go: `requireOCRKeyCount(t, app, 0)` $DIR/core/cmd/ocr_keys_commands_test.go: `set = flag.NewFlagSet("test OCR import", 0)` $DIR/core/cmd/ocr_keys_commands_test.go: `flagSetApplyFromAction(client.ImportOCRKey, set, "")` $DIR/core/cmd/ocr_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/ocr_keys_commands_test.go: `.NewBufferString("")` $DIR/core/cmd/ocr_keys_commands_test.go: `.NewJAID(key.ID())` $DIR/core/cmd/ocr_keys_commands_test.go: `.ID()` $DIR/core/cmd/ocr_keys_commands_test.go: `.OnChainSigning.Address()` $DIR/core/cmd/ocr_keys_commands_test.go: `.OffChainSigning.PublicKey()` $DIR/core/cmd/ocr_keys_commands_test.go: `.PublicKeyConfig()` $DIR/core/cmd/ocr_keys_commands_test.go: `.String()` $DIR/core/cmd/ocr_keys_commands_test.go: `.PublicKeyConfig()` $DIR/core/cmd/ocr_keys_commands_test.go: `.Reset()` $DIR/core/cmd/ocr_keys_commands_test.go: `.String()` $DIR/core/cmd/ocr_keys_commands_test.go: `.PublicKeyConfig()` $DIR/core/cmd/ocr_keys_commands_test.go: `.EncodeToString(pubKeyConfig[:])` $DIR/core/cmd/ocr_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/ocr_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/ocr_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/ocr_keys_commands_test.go: `.OCR()` $DIR/core/cmd/ocr_keys_commands_test.go: `.Create(ctx)` $DIR/core/cmd/ocr_keys_commands_test.go: `.ID()` $DIR/core/cmd/ocr_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/ocr_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/ocr_keys_commands_test.go: `.OCR()` $DIR/core/cmd/ocr_keys_commands_test.go: `.GetAll()` $DIR/core/cmd/ocr_keys_commands_test.go: `.ID()` $DIR/core/cmd/ocr_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/ocr_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/ocr_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/ocr_keys_commands_test.go: `.OCR()` $DIR/core/cmd/ocr_keys_commands_test.go: `.Create(ctx)` $DIR/core/cmd/ocr_keys_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/ocr_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/ocr_keys_commands_test.go: `.ID()` $DIR/core/cmd/ocr_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/ocr_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/ocr_keys_commands_test.go: `.NewFlagSet("test OCR export", 0)` $DIR/core/cmd/ocr_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/ocr_keys_commands_test.go: `.ExportOCRKey(c)` $DIR/core/cmd/ocr_keys_commands_test.go: `.NewFlagSet("test OCR export", 0)` $DIR/core/cmd/ocr_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/ocr_keys_commands_test.go: `.NewFlagSet("test OCR import", 0)` $DIR/core/cmd/ocr_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/p2p_keys_commands_test.go: `buffer.Reset()` $DIR/core/cmd/p2p_keys_commands_test.go: `output = buffer.String()` $DIR/core/cmd/p2p_keys_commands_test.go: `requireP2PKeyCount(t, app, 1)` $DIR/core/cmd/p2p_keys_commands_test.go: `requireP2PKeyCount(t, app, 1)` $DIR/core/cmd/p2p_keys_commands_test.go: `flagSetApplyFromAction(client.DeleteP2PKey, set, "")` $DIR/core/cmd/p2p_keys_commands_test.go: `err = set.Parse([]string{strID})` $DIR/core/cmd/p2p_keys_commands_test.go: `err = client.DeleteP2PKey(c)` $DIR/core/cmd/p2p_keys_commands_test.go: `flagSetApplyFromAction(client.ExportP2PKey, set, "")` $DIR/core/cmd/p2p_keys_commands_test.go: `err = client.ExportP2PKey(c)` $DIR/core/cmd/p2p_keys_commands_test.go: `set = flag.NewFlagSet("test P2P export", 0)` $DIR/core/cmd/p2p_keys_commands_test.go: `flagSetApplyFromAction(client.ExportP2PKey, set, "")` $DIR/core/cmd/p2p_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/p2p_keys_commands_test.go: `requireP2PKeyCount(t, app, 0)` $DIR/core/cmd/p2p_keys_commands_test.go: `set = flag.NewFlagSet("test P2P import", 0)` $DIR/core/cmd/p2p_keys_commands_test.go: `flagSetApplyFromAction(client.ImportP2PKey, set, "")` $DIR/core/cmd/p2p_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/p2p_keys_commands_test.go: `.NewBufferString("")` $DIR/core/cmd/p2p_keys_commands_test.go: `.NewJAID(id)` $DIR/core/cmd/p2p_keys_commands_test.go: `.String()` $DIR/core/cmd/p2p_keys_commands_test.go: `.Reset()` $DIR/core/cmd/p2p_keys_commands_test.go: `.String()` $DIR/core/cmd/p2p_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/p2p_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/p2p_keys_commands_test.go: `.P2P()` $DIR/core/cmd/p2p_keys_commands_test.go: `.Create(ctx)` $DIR/core/cmd/p2p_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/p2p_keys_commands_test.go: `.PublicKeyHex()` $DIR/core/cmd/p2p_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/p2p_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/p2p_keys_commands_test.go: `.P2P()` $DIR/core/cmd/p2p_keys_commands_test.go: `.GetAll()` $DIR/core/cmd/p2p_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/p2p_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/p2p_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/p2p_keys_commands_test.go: `.P2P()` $DIR/core/cmd/p2p_keys_commands_test.go: `.Create(ctx)` $DIR/core/cmd/p2p_keys_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/p2p_keys_commands_test.go: `.ID()` $DIR/core/cmd/p2p_keys_commands_test.go: `.Parse([]string{strID})` $DIR/core/cmd/p2p_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/p2p_keys_commands_test.go: `.DeleteP2PKey(c)` $DIR/core/cmd/p2p_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/p2p_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/p2p_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/p2p_keys_commands_test.go: `.P2P()` $DIR/core/cmd/p2p_keys_commands_test.go: `.Create(ctx)` $DIR/core/cmd/p2p_keys_commands_test.go: `.NewFlagSet("test P2P export", 0)` $DIR/core/cmd/p2p_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/p2p_keys_commands_test.go: `.ExportP2PKey(c)` $DIR/core/cmd/p2p_keys_commands_test.go: `.NewFlagSet("test P2P export", 0)` $DIR/core/cmd/p2p_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/p2p_keys_commands_test.go: `.NewFlagSet("test P2P import", 0)` $DIR/core/cmd/p2p_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/presenters_test.go: `t.Run("GetID", func(t *testing.T) { assert.Equal(t, "1", jaid.GetID()) })` $DIR/core/cmd/presenters_test.go: `.Run("GetID", func(t *testing.T) { assert.Equal(t, "1", jaid.GetID()) })` $DIR/core/cmd/presenters_test.go: `.SetID("2")` $DIR/core/cmd/renderer_test.go: `t.Run("effective", func(t *testing.T) { resp, cleanup := client.Get("/v2/config/v2") t.Cleanup(cleanup) var effective web.ConfigV2Resource require.NoError(t, cltest.ParseJSONAPIResponse(t, resp, &effective)) assert.Equal(t, wantEffective, effective.Config) })` $DIR/core/cmd/renderer_test.go: `t.Cleanup(cleanup)` $DIR/core/cmd/renderer_test.go: `t.Cleanup(cleanup)` $DIR/core/cmd/renderer_test.go: `t.Run(test.name, func(t *testing.T) { tw := &testWriter{test.content, t, false} r := cmd.RendererTable{Writer: tw} assert.NoError(t, r.Render(&eia)) assert.True(t, tw.found) })` $DIR/core/cmd/renderer_test.go: `.Render(&keys)` $DIR/core/cmd/renderer_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/cmd/renderer_test.go: `.Config.ConfigTOML()` $DIR/core/cmd/renderer_test.go: `.NewHTTPClient(nil)` $DIR/core/cmd/renderer_test.go: `.Run("effective", func(t *testing.T) { resp, cleanup := client.Get("/v2/config/v2") t.Cleanup(cleanup) var effective web.ConfigV2Resource require.NoError(t, cltest.ParseJSONAPIResponse(t, resp, &effective)) assert.Equal(t, wantEffective, effective.Config) })` $DIR/core/cmd/renderer_test.go: `.Get("/v2/config/v2")` $DIR/core/cmd/renderer_test.go: `.Cleanup(cleanup)` $DIR/core/cmd/renderer_test.go: `.Get("/v2/config/v2?userOnly=true")` $DIR/core/cmd/renderer_test.go: `.Cleanup(cleanup)` $DIR/core/cmd/renderer_test.go: `.WebURL(t, "http://localhost:8888")` $DIR/core/cmd/renderer_test.go: `.URL.String()` $DIR/core/cmd/renderer_test.go: `.Run(test.name, func(t *testing.T) { tw := &testWriter{test.content, t, false} r := cmd.RendererTable{Writer: tw} assert.NoError(t, r.Render(&eia)) assert.True(t, tw.found) })` $DIR/core/cmd/renderer_test.go: `.Render(&anon)` $DIR/core/cmd/shell_local_test.go: `t.Run(test.name, func(t *testing.T) { cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { s.Password.Keystore = models.NewSecret("dummy") c.EVM[0].Nodes[0].Name = ptr("fake") c.EVM[0].Nodes[0].HTTPURL = commonconfig.MustParseURL("http://fake.com") c.EVM[0].Nodes[0].WSURL = commonconfig.MustParseURL("WSS://fake.com/ws") // seems to be needed for config validate c.Insecure.OCRDevelopmentMode = nil }) db := pgtest.NewSqlxDB(t) keyStore := cltest.NewKeyStore(t, db) authProviderORM := localauth.NewORM(db, time.Minute, logger.TestLogger(t), audit.NoopLogger) lggr := logger.TestLogger(t) opts := legacyevm.ChainRelayExtenderConfig{ Logger: lggr, KeyStore: keyStore.Eth(), ChainOpts: legacyevm.ChainOpts{ AppConfig: cfg, MailMon: &mailbox.Monitor{}, DS: db, }, } testRelayers := genTestEVMRelayers(t, opts, keyStore) // Purge the fixture users to test assumption of single admin // initialUser user created above pgtest.MustExec(t, db, "DELETE FROM users;") app := mocks.NewApplication(t) app.On("AuthenticationProvider").Return(authProviderORM).Maybe() app.On("BasicAdminUsersORM").Return(authProviderORM).Maybe() app.On("GetKeyStore").Return(keyStore).Maybe() app.On("GetRelayers").Return(testRelayers).Maybe() app.On("Start", mock.Anything).Maybe().Return(nil) app.On("Stop").Maybe().Return(nil) app.On("ID").Maybe().Return(uuid.New()) ethClient := evmtest.NewEthClientMock(t) ethClient.On("Dial", mock.Anything).Return(nil).Maybe() ethClient.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything).Return(big.NewInt(10), nil).Maybe() cltest.MustInsertRandomKey(t, keyStore.Eth()) apiPrompt := cltest.NewMockAPIInitializer(t) client := cmd.Shell{ Config: cfg, FallbackAPIInitializer: apiPrompt, Runner: cltest.EmptyRunner{}, AppFactory: cltest.InstanceAppFactory{App: app}, Logger: lggr, } set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(client.RunNode, set, "") require.NoError(t, set.Set("password", test.pwdfile)) c := cli.NewContext(nil, set, nil) run := func() error { cli := cmd.NewApp(&client) if err := cli.Before(c); err != nil { return err } return client.RunNode(c) } if test.wantUnlocked { assert.NoError(t, run()) assert.Equal(t, 1, apiPrompt.Count) } else { assert.Error(t, run()) assert.Equal(t, 0, apiPrompt.Count) } })` $DIR/core/cmd/shell_local_test.go: `s.Password.Keystore = models.NewSecret("dummy")` $DIR/core/cmd/shell_local_test.go: `c.EVM[0].Nodes[0].Name = ptr("fake")` $DIR/core/cmd/shell_local_test.go: `c.EVM[0].Nodes[0].HTTPURL = commonconfig.MustParseURL("http://fake.com")` $DIR/core/cmd/shell_local_test.go: `c.EVM[0].Nodes[0].WSURL = commonconfig.MustParseURL("WSS://fake.com/ws")` $DIR/core/cmd/shell_local_test.go: `c.Insecure.OCRDevelopmentMode = nil` $DIR/core/cmd/shell_local_test.go: `pgtest.MustExec(t, db, "DELETE FROM users;")` $DIR/core/cmd/shell_local_test.go: `app.On("AuthenticationProvider").Return(authProviderORM).Maybe()` $DIR/core/cmd/shell_local_test.go: `app.On("BasicAdminUsersORM").Return(authProviderORM).Maybe()` $DIR/core/cmd/shell_local_test.go: `app.On("GetKeyStore").Return(keyStore).Maybe()` $DIR/core/cmd/shell_local_test.go: `app.On("GetRelayers").Return(testRelayers).Maybe()` $DIR/core/cmd/shell_local_test.go: `app.On("Start", mock.Anything).Maybe().Return(nil)` $DIR/core/cmd/shell_local_test.go: `app.On("Stop").Maybe().Return(nil)` $DIR/core/cmd/shell_local_test.go: `app.On("ID").Maybe().Return(uuid.New())` $DIR/core/cmd/shell_local_test.go: `ethClient.On("Dial", mock.Anything).Return(nil).Maybe()` $DIR/core/cmd/shell_local_test.go: `ethClient.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything).Return(big.NewInt(10), nil).Maybe()` $DIR/core/cmd/shell_local_test.go: `cltest.MustInsertRandomKey(t, keyStore.Eth())` $DIR/core/cmd/shell_local_test.go: `flagSetApplyFromAction(client.RunNode, set, "")` $DIR/core/cmd/shell_local_test.go: `t.Run(test.name, func(t *testing.T) { cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { s.Password.Keystore = models.NewSecret("16charlengthp4SsW0rD1!@#_") c.EVM[0].Nodes[0].Name = ptr("fake") c.EVM[0].Nodes[0].WSURL = commonconfig.MustParseURL("WSS://fake.com/ws") c.EVM[0].Nodes[0].HTTPURL = commonconfig.MustParseURL("http://fake.com") // seems to be needed for config validate c.Insecure.OCRDevelopmentMode = nil }) db := pgtest.NewSqlxDB(t) authProviderORM := localauth.NewORM(db, time.Minute, logger.TestLogger(t), audit.NoopLogger) // Clear out fixture users/users created from the other test cases // This asserts that on initial run with an empty users table that the credentials file will instantiate and // create/run with a new admin user pgtest.MustExec(t, db, "DELETE FROM users;") keyStore := cltest.NewKeyStore(t, db) _, err := keyStore.Eth().Create(testutils.Context(t), &cltest.FixtureChainID) require.NoError(t, err) ethClient := evmtest.NewEthClientMock(t) ethClient.On("Dial", mock.Anything).Return(nil).Maybe() ethClient.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything).Return(big.NewInt(10), nil).Maybe() lggr := logger.TestLogger(t) opts := legacyevm.ChainRelayExtenderConfig{ Logger: lggr, KeyStore: keyStore.Eth(), ChainOpts: legacyevm.ChainOpts{ AppConfig: cfg, MailMon: &mailbox.Monitor{}, DS: db, }, } testRelayers := genTestEVMRelayers(t, opts, keyStore) app := mocks.NewApplication(t) app.On("BasicAdminUsersORM").Return(authProviderORM) app.On("GetKeyStore").Return(keyStore) app.On("GetRelayers").Return(testRelayers).Maybe() app.On("Start", mock.Anything).Maybe().Return(nil) app.On("Stop").Maybe().Return(nil) app.On("ID").Maybe().Return(uuid.New()) prompter := cmdMocks.NewPrompter(t) apiPrompt := cltest.NewMockAPIInitializer(t) client := cmd.Shell{ Config: cfg, AppFactory: cltest.InstanceAppFactory{App: app}, KeyStoreAuthenticator: cmd.TerminalKeyStoreAuthenticator{prompter}, FallbackAPIInitializer: apiPrompt, Runner: cltest.EmptyRunner{}, Logger: lggr, } set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(client.RunNode, set, "") require.NoError(t, set.Set("api", test.apiFile)) c := cli.NewContext(nil, set, nil) if test.wantError { err = client.RunNode(c) assert.ErrorContains(t, err, "error creating api initializer: open doesntexist.txt: no such file or directory") } else { assert.NoError(t, client.RunNode(c)) } assert.Equal(t, test.wantPrompt, apiPrompt.Count > 0) })` $DIR/core/cmd/shell_local_test.go: `s.Password.Keystore = models.NewSecret("16charlengthp4SsW0rD1!@#_")` $DIR/core/cmd/shell_local_test.go: `c.EVM[0].Nodes[0].Name = ptr("fake")` $DIR/core/cmd/shell_local_test.go: `c.EVM[0].Nodes[0].WSURL = commonconfig.MustParseURL("WSS://fake.com/ws")` $DIR/core/cmd/shell_local_test.go: `c.EVM[0].Nodes[0].HTTPURL = commonconfig.MustParseURL("http://fake.com")` $DIR/core/cmd/shell_local_test.go: `c.Insecure.OCRDevelopmentMode = nil` $DIR/core/cmd/shell_local_test.go: `pgtest.MustExec(t, db, "DELETE FROM users;")` $DIR/core/cmd/shell_local_test.go: `ethClient.On("Dial", mock.Anything).Return(nil).Maybe()` $DIR/core/cmd/shell_local_test.go: `ethClient.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything).Return(big.NewInt(10), nil).Maybe()` $DIR/core/cmd/shell_local_test.go: `app.On("BasicAdminUsersORM").Return(authProviderORM)` $DIR/core/cmd/shell_local_test.go: `app.On("GetKeyStore").Return(keyStore)` $DIR/core/cmd/shell_local_test.go: `app.On("GetRelayers").Return(testRelayers).Maybe()` $DIR/core/cmd/shell_local_test.go: `app.On("Start", mock.Anything).Maybe().Return(nil)` $DIR/core/cmd/shell_local_test.go: `app.On("Stop").Maybe().Return(nil)` $DIR/core/cmd/shell_local_test.go: `app.On("ID").Maybe().Return(uuid.New())` $DIR/core/cmd/shell_local_test.go: `flagSetApplyFromAction(client.RunNode, set, "")` $DIR/core/cmd/shell_local_test.go: `err = client.RunNode(c)` $DIR/core/cmd/shell_local_test.go: `t.Run(tt.name, func(t *testing.T) { cfg := logger.Config{ Dir: t.TempDir(), FileMaxSizeMB: int(tt.logFileSize(t) / utils.MB), } assert.NoError(t, os.MkdirAll(cfg.Dir, os.FileMode(0700))) lggr, closeFn := cfg.New() t.Cleanup(func() { assert.NoError(t, closeFn()) }) // Tries to create a log file by logging. The log file won't be created if there's no logging happening. lggr.Debug("Trying to create a log file by logging.") _, err := os.Stat(cfg.LogsFile()) require.Equal(t, os.IsNotExist(err), !tt.fileShouldExist) })` $DIR/core/cmd/shell_local_test.go: `t.Cleanup(func() { assert.NoError(t, closeFn()) })` $DIR/core/cmd/shell_local_test.go: `lggr.Debug("Trying to create a log file by logging.")` $DIR/core/cmd/shell_local_test.go: `c.Database.Dialect = dialects.Postgres` $DIR/core/cmd/shell_local_test.go: `c.EVM = nil` $DIR/core/cmd/shell_local_test.go: `c.Insecure.OCRDevelopmentMode = nil` $DIR/core/cmd/shell_local_test.go: `cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 7, 42, fromAddress)` $DIR/core/cmd/shell_local_test.go: `app.On("GetDB").Return(sqlxDB)` $DIR/core/cmd/shell_local_test.go: `app.On("GetKeyStore").Return(keyStore)` $DIR/core/cmd/shell_local_test.go: `app.On("ID").Maybe().Return(uuid.New())` $DIR/core/cmd/shell_local_test.go: `app.On("GetConfig").Return(config)` $DIR/core/cmd/shell_local_test.go: `app.On("GetRelayers").Return(mockRelayerChainInteroperators).Maybe()` $DIR/core/cmd/shell_local_test.go: `ethClient.On("Dial", mock.Anything).Return(nil)` $DIR/core/cmd/shell_local_test.go: `flagSetApplyFromAction(c.RebroadcastTransactions, set, "")` $DIR/core/cmd/shell_local_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == n }), mock.Anything).Once().Return(client.Successful, nil)` $DIR/core/cmd/shell_local_test.go: `t.Run(test.name, func(t *testing.T) { // Use the non-transactional db for this test because we need to // test multiple connections to the database, and changes made within // the transaction cannot be seen from another connection. config, sqlxDB := heavyweight.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Database.Dialect = dialects.Postgres // evm config is used in this test. but if set, it must be pass config validation. // simplest to make it nil c.EVM = nil // seems to be needed for config validate c.Insecure.OCRDevelopmentMode = nil }) keyStore := cltest.NewKeyStore(t, sqlxDB) _, fromAddress := cltest.MustInsertRandomKey(t, keyStore.Eth()) txStore := cltest.NewTestTxStore(t, sqlxDB) cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, int64(test.nonce), 42, fromAddress) lggr := logger.TestLogger(t) app := mocks.NewApplication(t) app.On("GetDB").Return(sqlxDB) app.On("GetKeyStore").Return(keyStore) app.On("ID").Maybe().Return(uuid.New()) app.On("GetConfig").Return(config) ethClient := evmtest.NewEthClientMockWithDefaultChain(t) ethClient.On("Dial", mock.Anything).Return(nil) legacy := cltest.NewLegacyChainsWithMockChain(t, ethClient, config) mockRelayerChainInteroperators := &chainlinkmocks.FakeRelayerChainInteroperators{EVMChains: legacy} app.On("GetRelayers").Return(mockRelayerChainInteroperators).Maybe() c := cmd.Shell{ Config: config, AppFactory: cltest.InstanceAppFactory{App: app}, FallbackAPIInitializer: cltest.NewMockAPIInitializer(t), Runner: cltest.EmptyRunner{}, Logger: lggr, } set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(c.RebroadcastTransactions, set, "") require.NoError(t, set.Set("evmChainID", testutils.FixtureChainID.String())) require.NoError(t, set.Set("beginningNonce", strconv.FormatUint(uint64(beginningNonce), 10))) require.NoError(t, set.Set("endingNonce", strconv.FormatUint(uint64(endingNonce), 10))) require.NoError(t, set.Set("gasPriceWei", gasPrice.String())) require.NoError(t, set.Set("gasLimit", strconv.FormatUint(gasLimit, 10))) require.NoError(t, set.Set("address", fromAddress.Hex())) require.NoError(t, set.Set("password", "../internal/fixtures/correct_password.txt")) ctx := cli.NewContext(nil, set, nil) for i := beginningNonce; i <= endingNonce; i++ { n := i ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return uint(tx.Nonce()) == n }), mock.Anything).Once().Return(client.Successful, nil) } assert.NoError(t, c.RebroadcastTransactions(ctx)) cltest.AssertEthTxAttemptCountStays(t, txStore, 1) })` $DIR/core/cmd/shell_local_test.go: `c.Database.Dialect = dialects.Postgres` $DIR/core/cmd/shell_local_test.go: `c.EVM = nil` $DIR/core/cmd/shell_local_test.go: `c.Insecure.OCRDevelopmentMode = nil` $DIR/core/cmd/shell_local_test.go: `cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, int64(test.nonce), 42, fromAddress)` $DIR/core/cmd/shell_local_test.go: `app.On("GetDB").Return(sqlxDB)` $DIR/core/cmd/shell_local_test.go: `app.On("GetKeyStore").Return(keyStore)` $DIR/core/cmd/shell_local_test.go: `app.On("ID").Maybe().Return(uuid.New())` $DIR/core/cmd/shell_local_test.go: `app.On("GetConfig").Return(config)` $DIR/core/cmd/shell_local_test.go: `ethClient.On("Dial", mock.Anything).Return(nil)` $DIR/core/cmd/shell_local_test.go: `app.On("GetRelayers").Return(mockRelayerChainInteroperators).Maybe()` $DIR/core/cmd/shell_local_test.go: `flagSetApplyFromAction(c.RebroadcastTransactions, set, "")` $DIR/core/cmd/shell_local_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return uint(tx.Nonce()) == n }), mock.Anything).Once().Return(client.Successful, nil)` $DIR/core/cmd/shell_local_test.go: `cltest.AssertEthTxAttemptCountStays(t, txStore, 1)` $DIR/core/cmd/shell_local_test.go: `t.Run(test.name, func(t *testing.T) { config, sqlxDB := heavyweight.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Database.Dialect = dialects.Postgres c.EVM = nil // seems to be needed for config validate c.Insecure.OCRDevelopmentMode = nil }) keyStore := cltest.NewKeyStore(t, sqlxDB) _, fromAddress := cltest.MustInsertRandomKey(t, keyStore.Eth()) if !test.enableAddress { err := keyStore.Eth().Disable(testutils.Context(t), fromAddress, testutils.FixtureChainID) require.NoError(t, err, "failed to disable test key") } lggr := logger.TestLogger(t) app := mocks.NewApplication(t) app.On("GetDB").Maybe().Return(sqlxDB) app.On("GetKeyStore").Return(keyStore) app.On("ID").Maybe().Return(uuid.New()) ethClient := evmtest.NewEthClientMockWithDefaultChain(t) ethClient.On("Dial", mock.Anything).Return(nil) legacy := cltest.NewLegacyChainsWithMockChain(t, ethClient, config) mockRelayerChainInteroperators := &chainlinkmocks.FakeRelayerChainInteroperators{EVMChains: legacy} app.On("GetRelayers").Return(mockRelayerChainInteroperators).Maybe() ethClient.On("SendTransactionReturnCode", mock.Anything, mock.Anything, mock.Anything).Maybe().Return(client.Successful, nil) client := cmd.Shell{ Config: config, AppFactory: cltest.InstanceAppFactory{App: app}, FallbackAPIInitializer: cltest.NewMockAPIInitializer(t), Runner: cltest.EmptyRunner{}, Logger: lggr, } set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(client.RebroadcastTransactions, set, "") require.NoError(t, set.Set("evmChainID", testutils.FixtureChainID.String())) require.NoError(t, set.Set("address", fromAddress.Hex())) require.NoError(t, set.Set("password", "../internal/fixtures/correct_password.txt")) c := cli.NewContext(nil, set, nil) if test.shouldError { require.ErrorContains(t, client.RebroadcastTransactions(c), test.errorContains) } else { app.On("GetConfig").Return(config).Once() require.NoError(t, client.RebroadcastTransactions(c)) } })` $DIR/core/cmd/shell_local_test.go: `c.Database.Dialect = dialects.Postgres` $DIR/core/cmd/shell_local_test.go: `c.EVM = nil` $DIR/core/cmd/shell_local_test.go: `c.Insecure.OCRDevelopmentMode = nil` $DIR/core/cmd/shell_local_test.go: `app.On("GetDB").Maybe().Return(sqlxDB)` $DIR/core/cmd/shell_local_test.go: `app.On("GetKeyStore").Return(keyStore)` $DIR/core/cmd/shell_local_test.go: `app.On("ID").Maybe().Return(uuid.New())` $DIR/core/cmd/shell_local_test.go: `ethClient.On("Dial", mock.Anything).Return(nil)` $DIR/core/cmd/shell_local_test.go: `app.On("GetRelayers").Return(mockRelayerChainInteroperators).Maybe()` $DIR/core/cmd/shell_local_test.go: `ethClient.On("SendTransactionReturnCode", mock.Anything, mock.Anything, mock.Anything).Maybe().Return(client.Successful, nil)` $DIR/core/cmd/shell_local_test.go: `flagSetApplyFromAction(client.RebroadcastTransactions, set, "")` $DIR/core/cmd/shell_local_test.go: `app.On("GetConfig").Return(config).Once()` $DIR/core/cmd/shell_local_test.go: `c.Database.Dialect = dialects.Postgres` $DIR/core/cmd/shell_local_test.go: `flagSetApplyFromAction(client.CleanupChainTables, set, "")` $DIR/core/cmd/shell_local_test.go: `s.Password.Keystore = models.NewSecret("dummy")` $DIR/core/cmd/shell_local_test.go: `c.EVM[0].Nodes[0].Name = ptr("fake")` $DIR/core/cmd/shell_local_test.go: `c.EVM[0].Nodes[0].HTTPURL = commonconfig.MustParseURL("http://fake.com")` $DIR/core/cmd/shell_local_test.go: `c.EVM[0].Nodes[0].WSURL = commonconfig.MustParseURL("WSS://fake.com/ws")` $DIR/core/cmd/shell_local_test.go: `c.Insecure.OCRDevelopmentMode = nil` $DIR/core/cmd/shell_local_test.go: `app.On("GetSqlxDB").Maybe().Return(db)` $DIR/core/cmd/shell_local_test.go: `t.Run("Returns error, if --start is not positive", func(t *testing.T) { set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(shell.RemoveBlocks, set, "") require.NoError(t, set.Set("start", "0")) require.NoError(t, set.Set("evm-chain-id", "12")) c := cli.NewContext(nil, set, nil) err := shell.RemoveBlocks(c) require.ErrorContains(t, err, "Must pass a positive value in '--start' parameter") })` $DIR/core/cmd/shell_local_test.go: `flagSetApplyFromAction(shell.RemoveBlocks, set, "")` $DIR/core/cmd/shell_local_test.go: `t.Run("Returns error, if removal fails", func(t *testing.T) { set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(shell.RemoveBlocks, set, "") require.NoError(t, set.Set("start", "10000")) require.NoError(t, set.Set("evm-chain-id", "12")) expectedError := fmt.Errorf("failed to delete log poller's data") app.On("DeleteLogPollerDataAfter", mock.Anything, big.NewInt(12), int64(10000)).Return(expectedError).Once() c := cli.NewContext(nil, set, nil) err := shell.RemoveBlocks(c) require.ErrorContains(t, err, expectedError.Error()) })` $DIR/core/cmd/shell_local_test.go: `flagSetApplyFromAction(shell.RemoveBlocks, set, "")` $DIR/core/cmd/shell_local_test.go: `app.On("DeleteLogPollerDataAfter", mock.Anything, big.NewInt(12), int64(10000)).Return(expectedError).Once()` $DIR/core/cmd/shell_local_test.go: `flagSetApplyFromAction(shell.RemoveBlocks, set, "")` $DIR/core/cmd/shell_local_test.go: `app.On("DeleteLogPollerDataAfter", mock.Anything, big.NewInt(12), int64(10000)).Return(nil).Once()` $DIR/core/cmd/shell_local_test.go: `.Run(test.name, func(t *testing.T) { cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { s.Password.Keystore = models.NewSecret("dummy") c.EVM[0].Nodes[0].Name = ptr("fake") c.EVM[0].Nodes[0].HTTPURL = commonconfig.MustParseURL("http://fake.com") c.EVM[0].Nodes[0].WSURL = commonconfig.MustParseURL("WSS://fake.com/ws") // seems to be needed for config validate c.Insecure.OCRDevelopmentMode = nil }) db := pgtest.NewSqlxDB(t) keyStore := cltest.NewKeyStore(t, db) authProviderORM := localauth.NewORM(db, time.Minute, logger.TestLogger(t), audit.NoopLogger) lggr := logger.TestLogger(t) opts := legacyevm.ChainRelayExtenderConfig{ Logger: lggr, KeyStore: keyStore.Eth(), ChainOpts: legacyevm.ChainOpts{ AppConfig: cfg, MailMon: &mailbox.Monitor{}, DS: db, }, } testRelayers := genTestEVMRelayers(t, opts, keyStore) // Purge the fixture users to test assumption of single admin // initialUser user created above pgtest.MustExec(t, db, "DELETE FROM users;") app := mocks.NewApplication(t) app.On("AuthenticationProvider").Return(authProviderORM).Maybe() app.On("BasicAdminUsersORM").Return(authProviderORM).Maybe() app.On("GetKeyStore").Return(keyStore).Maybe() app.On("GetRelayers").Return(testRelayers).Maybe() app.On("Start", mock.Anything).Maybe().Return(nil) app.On("Stop").Maybe().Return(nil) app.On("ID").Maybe().Return(uuid.New()) ethClient := evmtest.NewEthClientMock(t) ethClient.On("Dial", mock.Anything).Return(nil).Maybe() ethClient.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything).Return(big.NewInt(10), nil).Maybe() cltest.MustInsertRandomKey(t, keyStore.Eth()) apiPrompt := cltest.NewMockAPIInitializer(t) client := cmd.Shell{ Config: cfg, FallbackAPIInitializer: apiPrompt, Runner: cltest.EmptyRunner{}, AppFactory: cltest.InstanceAppFactory{App: app}, Logger: lggr, } set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(client.RunNode, set, "") require.NoError(t, set.Set("password", test.pwdfile)) c := cli.NewContext(nil, set, nil) run := func() error { cli := cmd.NewApp(&client) if err := cli.Before(c); err != nil { return err } return client.RunNode(c) } if test.wantUnlocked { assert.NoError(t, run()) assert.Equal(t, 1, apiPrompt.Count) } else { assert.Error(t, run()) assert.Equal(t, 0, apiPrompt.Count) } })` $DIR/core/cmd/shell_local_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { s.Password.Keystore = models.NewSecret("dummy") c.EVM[0].Nodes[0].Name = ptr("fake") c.EVM[0].Nodes[0].HTTPURL = commonconfig.MustParseURL("http://fake.com") c.EVM[0].Nodes[0].WSURL = commonconfig.MustParseURL("WSS://fake.com/ws") // seems to be needed for config validate c.Insecure.OCRDevelopmentMode = nil })` $DIR/core/cmd/shell_local_test.go: `.NewSecret("dummy")` $DIR/core/cmd/shell_local_test.go: `.MustParseURL("http://fake.com")` $DIR/core/cmd/shell_local_test.go: `.MustParseURL("WSS://fake.com/ws")` $DIR/core/cmd/shell_local_test.go: `.NewSqlxDB(t)` $DIR/core/cmd/shell_local_test.go: `.NewKeyStore(t, db)` $DIR/core/cmd/shell_local_test.go: `.NewORM(db, time.Minute, logger.TestLogger(t), audit.NoopLogger)` $DIR/core/cmd/shell_local_test.go: `.TestLogger(t)` $DIR/core/cmd/shell_local_test.go: `.TestLogger(t)` $DIR/core/cmd/shell_local_test.go: `.Eth()` $DIR/core/cmd/shell_local_test.go: `.MustExec(t, db, "DELETE FROM users;")` $DIR/core/cmd/shell_local_test.go: `.NewApplication(t)` $DIR/core/cmd/shell_local_test.go: `.On("AuthenticationProvider")` $DIR/core/cmd/shell_local_test.go: `.Return(authProviderORM)` $DIR/core/cmd/shell_local_test.go: `.Maybe()` $DIR/core/cmd/shell_local_test.go: `.On("BasicAdminUsersORM")` $DIR/core/cmd/shell_local_test.go: `.Return(authProviderORM)` $DIR/core/cmd/shell_local_test.go: `.Maybe()` $DIR/core/cmd/shell_local_test.go: `.On("GetKeyStore")` $DIR/core/cmd/shell_local_test.go: `.Return(keyStore)` $DIR/core/cmd/shell_local_test.go: `.Maybe()` $DIR/core/cmd/shell_local_test.go: `.On("GetRelayers")` $DIR/core/cmd/shell_local_test.go: `.Return(testRelayers)` $DIR/core/cmd/shell_local_test.go: `.Maybe()` $DIR/core/cmd/shell_local_test.go: `.On("Start", mock.Anything)` $DIR/core/cmd/shell_local_test.go: `.Maybe()` $DIR/core/cmd/shell_local_test.go: `.Return(nil)` $DIR/core/cmd/shell_local_test.go: `.On("Stop")` $DIR/core/cmd/shell_local_test.go: `.Maybe()` $DIR/core/cmd/shell_local_test.go: `.Return(nil)` $DIR/core/cmd/shell_local_test.go: `.On("ID")` $DIR/core/cmd/shell_local_test.go: `.Maybe()` $DIR/core/cmd/shell_local_test.go: `.Return(uuid.New())` $DIR/core/cmd/shell_local_test.go: `.New()` $DIR/core/cmd/shell_local_test.go: `.NewEthClientMock(t)` $DIR/core/cmd/shell_local_test.go: `.On("Dial", mock.Anything)` $DIR/core/cmd/shell_local_test.go: `.Return(nil)` $DIR/core/cmd/shell_local_test.go: `.Maybe()` $DIR/core/cmd/shell_local_test.go: `.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/cmd/shell_local_test.go: `.Return(big.NewInt(10), nil)` $DIR/core/cmd/shell_local_test.go: `.NewInt(10)` $DIR/core/cmd/shell_local_test.go: `.Maybe()` $DIR/core/cmd/shell_local_test.go: `.MustInsertRandomKey(t, keyStore.Eth())` $DIR/core/cmd/shell_local_test.go: `.Eth()` $DIR/core/cmd/shell_local_test.go: `.NewMockAPIInitializer(t)` $DIR/core/cmd/shell_local_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/shell_local_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_local_test.go: `.NewApp(&client)` $DIR/core/cmd/shell_local_test.go: `.Before(c)` $DIR/core/cmd/shell_local_test.go: `.RunNode(c)` $DIR/core/cmd/shell_local_test.go: `.Run(test.name, func(t *testing.T) { cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { s.Password.Keystore = models.NewSecret("16charlengthp4SsW0rD1!@#_") c.EVM[0].Nodes[0].Name = ptr("fake") c.EVM[0].Nodes[0].WSURL = commonconfig.MustParseURL("WSS://fake.com/ws") c.EVM[0].Nodes[0].HTTPURL = commonconfig.MustParseURL("http://fake.com") // seems to be needed for config validate c.Insecure.OCRDevelopmentMode = nil }) db := pgtest.NewSqlxDB(t) authProviderORM := localauth.NewORM(db, time.Minute, logger.TestLogger(t), audit.NoopLogger) // Clear out fixture users/users created from the other test cases // This asserts that on initial run with an empty users table that the credentials file will instantiate and // create/run with a new admin user pgtest.MustExec(t, db, "DELETE FROM users;") keyStore := cltest.NewKeyStore(t, db) _, err := keyStore.Eth().Create(testutils.Context(t), &cltest.FixtureChainID) require.NoError(t, err) ethClient := evmtest.NewEthClientMock(t) ethClient.On("Dial", mock.Anything).Return(nil).Maybe() ethClient.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything).Return(big.NewInt(10), nil).Maybe() lggr := logger.TestLogger(t) opts := legacyevm.ChainRelayExtenderConfig{ Logger: lggr, KeyStore: keyStore.Eth(), ChainOpts: legacyevm.ChainOpts{ AppConfig: cfg, MailMon: &mailbox.Monitor{}, DS: db, }, } testRelayers := genTestEVMRelayers(t, opts, keyStore) app := mocks.NewApplication(t) app.On("BasicAdminUsersORM").Return(authProviderORM) app.On("GetKeyStore").Return(keyStore) app.On("GetRelayers").Return(testRelayers).Maybe() app.On("Start", mock.Anything).Maybe().Return(nil) app.On("Stop").Maybe().Return(nil) app.On("ID").Maybe().Return(uuid.New()) prompter := cmdMocks.NewPrompter(t) apiPrompt := cltest.NewMockAPIInitializer(t) client := cmd.Shell{ Config: cfg, AppFactory: cltest.InstanceAppFactory{App: app}, KeyStoreAuthenticator: cmd.TerminalKeyStoreAuthenticator{prompter}, FallbackAPIInitializer: apiPrompt, Runner: cltest.EmptyRunner{}, Logger: lggr, } set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(client.RunNode, set, "") require.NoError(t, set.Set("api", test.apiFile)) c := cli.NewContext(nil, set, nil) if test.wantError { err = client.RunNode(c) assert.ErrorContains(t, err, "error creating api initializer: open doesntexist.txt: no such file or directory") } else { assert.NoError(t, client.RunNode(c)) } assert.Equal(t, test.wantPrompt, apiPrompt.Count > 0) })` $DIR/core/cmd/shell_local_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { s.Password.Keystore = models.NewSecret("16charlengthp4SsW0rD1!@#_") c.EVM[0].Nodes[0].Name = ptr("fake") c.EVM[0].Nodes[0].WSURL = commonconfig.MustParseURL("WSS://fake.com/ws") c.EVM[0].Nodes[0].HTTPURL = commonconfig.MustParseURL("http://fake.com") // seems to be needed for config validate c.Insecure.OCRDevelopmentMode = nil })` $DIR/core/cmd/shell_local_test.go: `.NewSecret("16charlengthp4SsW0rD1!@#_")` $DIR/core/cmd/shell_local_test.go: `.MustParseURL("WSS://fake.com/ws")` $DIR/core/cmd/shell_local_test.go: `.MustParseURL("http://fake.com")` $DIR/core/cmd/shell_local_test.go: `.NewSqlxDB(t)` $DIR/core/cmd/shell_local_test.go: `.NewORM(db, time.Minute, logger.TestLogger(t), audit.NoopLogger)` $DIR/core/cmd/shell_local_test.go: `.TestLogger(t)` $DIR/core/cmd/shell_local_test.go: `.MustExec(t, db, "DELETE FROM users;")` $DIR/core/cmd/shell_local_test.go: `.NewKeyStore(t, db)` $DIR/core/cmd/shell_local_test.go: `.Eth()` $DIR/core/cmd/shell_local_test.go: `.Create(testutils.Context(t), &cltest.FixtureChainID)` $DIR/core/cmd/shell_local_test.go: `.Context(t)` $DIR/core/cmd/shell_local_test.go: `.NewEthClientMock(t)` $DIR/core/cmd/shell_local_test.go: `.On("Dial", mock.Anything)` $DIR/core/cmd/shell_local_test.go: `.Return(nil)` $DIR/core/cmd/shell_local_test.go: `.Maybe()` $DIR/core/cmd/shell_local_test.go: `.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/cmd/shell_local_test.go: `.Return(big.NewInt(10), nil)` $DIR/core/cmd/shell_local_test.go: `.NewInt(10)` $DIR/core/cmd/shell_local_test.go: `.Maybe()` $DIR/core/cmd/shell_local_test.go: `.TestLogger(t)` $DIR/core/cmd/shell_local_test.go: `.Eth()` $DIR/core/cmd/shell_local_test.go: `.NewApplication(t)` $DIR/core/cmd/shell_local_test.go: `.On("BasicAdminUsersORM")` $DIR/core/cmd/shell_local_test.go: `.Return(authProviderORM)` $DIR/core/cmd/shell_local_test.go: `.On("GetKeyStore")` $DIR/core/cmd/shell_local_test.go: `.Return(keyStore)` $DIR/core/cmd/shell_local_test.go: `.On("GetRelayers")` $DIR/core/cmd/shell_local_test.go: `.Return(testRelayers)` $DIR/core/cmd/shell_local_test.go: `.Maybe()` $DIR/core/cmd/shell_local_test.go: `.On("Start", mock.Anything)` $DIR/core/cmd/shell_local_test.go: `.Maybe()` $DIR/core/cmd/shell_local_test.go: `.Return(nil)` $DIR/core/cmd/shell_local_test.go: `.On("Stop")` $DIR/core/cmd/shell_local_test.go: `.Maybe()` $DIR/core/cmd/shell_local_test.go: `.Return(nil)` $DIR/core/cmd/shell_local_test.go: `.On("ID")` $DIR/core/cmd/shell_local_test.go: `.Maybe()` $DIR/core/cmd/shell_local_test.go: `.Return(uuid.New())` $DIR/core/cmd/shell_local_test.go: `.New()` $DIR/core/cmd/shell_local_test.go: `.NewPrompter(t)` $DIR/core/cmd/shell_local_test.go: `.NewMockAPIInitializer(t)` $DIR/core/cmd/shell_local_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/shell_local_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_local_test.go: `.RunNode(c)` $DIR/core/cmd/shell_local_test.go: `.UnmarshalText([]byte("100mb"))` $DIR/core/cmd/shell_local_test.go: `.Run(tt.name, func(t *testing.T) { cfg := logger.Config{ Dir: t.TempDir(), FileMaxSizeMB: int(tt.logFileSize(t) / utils.MB), } assert.NoError(t, os.MkdirAll(cfg.Dir, os.FileMode(0700))) lggr, closeFn := cfg.New() t.Cleanup(func() { assert.NoError(t, closeFn()) }) // Tries to create a log file by logging. The log file won't be created if there's no logging happening. lggr.Debug("Trying to create a log file by logging.") _, err := os.Stat(cfg.LogsFile()) require.Equal(t, os.IsNotExist(err), !tt.fileShouldExist) })` $DIR/core/cmd/shell_local_test.go: `.TempDir()` $DIR/core/cmd/shell_local_test.go: `.logFileSize(t)` $DIR/core/cmd/shell_local_test.go: `.New()` $DIR/core/cmd/shell_local_test.go: `.Cleanup(func() { assert.NoError(t, closeFn()) })` $DIR/core/cmd/shell_local_test.go: `.Debug("Trying to create a log file by logging.")` $DIR/core/cmd/shell_local_test.go: `.Stat(cfg.LogsFile())` $DIR/core/cmd/shell_local_test.go: `.LogsFile()` $DIR/core/cmd/shell_local_test.go: `.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Database.Dialect = dialects.Postgres // evm config is used in this test. but if set, it must be pass config validation. // simplest to make it nil c.EVM = nil // seems to be needed for config validate c.Insecure.OCRDevelopmentMode = nil })` $DIR/core/cmd/shell_local_test.go: `.NewKeyStore(t, sqlxDB)` $DIR/core/cmd/shell_local_test.go: `.MustInsertRandomKey(t, keyStore.Eth())` $DIR/core/cmd/shell_local_test.go: `.Eth()` $DIR/core/cmd/shell_local_test.go: `.NewTestTxStore(t, sqlxDB)` $DIR/core/cmd/shell_local_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 7, 42, fromAddress)` $DIR/core/cmd/shell_local_test.go: `.TestLogger(t)` $DIR/core/cmd/shell_local_test.go: `.NewApplication(t)` $DIR/core/cmd/shell_local_test.go: `.On("GetDB")` $DIR/core/cmd/shell_local_test.go: `.Return(sqlxDB)` $DIR/core/cmd/shell_local_test.go: `.On("GetKeyStore")` $DIR/core/cmd/shell_local_test.go: `.Return(keyStore)` $DIR/core/cmd/shell_local_test.go: `.On("ID")` $DIR/core/cmd/shell_local_test.go: `.Maybe()` $DIR/core/cmd/shell_local_test.go: `.Return(uuid.New())` $DIR/core/cmd/shell_local_test.go: `.New()` $DIR/core/cmd/shell_local_test.go: `.On("GetConfig")` $DIR/core/cmd/shell_local_test.go: `.Return(config)` $DIR/core/cmd/shell_local_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/cmd/shell_local_test.go: `.NewLegacyChainsWithMockChain(t, ethClient, config)` $DIR/core/cmd/shell_local_test.go: `.On("GetRelayers")` $DIR/core/cmd/shell_local_test.go: `.Return(mockRelayerChainInteroperators)` $DIR/core/cmd/shell_local_test.go: `.Maybe()` $DIR/core/cmd/shell_local_test.go: `.On("Dial", mock.Anything)` $DIR/core/cmd/shell_local_test.go: `.Return(nil)` $DIR/core/cmd/shell_local_test.go: `.NewMockAPIInitializer(t)` $DIR/core/cmd/shell_local_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/shell_local_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_local_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == n }), mock.Anything)` $DIR/core/cmd/shell_local_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return tx.Nonce() == n })` $DIR/core/cmd/shell_local_test.go: `.Nonce()` $DIR/core/cmd/shell_local_test.go: `.Once()` $DIR/core/cmd/shell_local_test.go: `.Return(client.Successful, nil)` $DIR/core/cmd/shell_local_test.go: `.RebroadcastTransactions(ctx)` $DIR/core/cmd/shell_local_test.go: `.NewInt(100000000000)` $DIR/core/cmd/shell_local_test.go: `.Run(test.name, func(t *testing.T) { // Use the non-transactional db for this test because we need to // test multiple connections to the database, and changes made within // the transaction cannot be seen from another connection. config, sqlxDB := heavyweight.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Database.Dialect = dialects.Postgres // evm config is used in this test. but if set, it must be pass config validation. // simplest to make it nil c.EVM = nil // seems to be needed for config validate c.Insecure.OCRDevelopmentMode = nil }) keyStore := cltest.NewKeyStore(t, sqlxDB) _, fromAddress := cltest.MustInsertRandomKey(t, keyStore.Eth()) txStore := cltest.NewTestTxStore(t, sqlxDB) cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, int64(test.nonce), 42, fromAddress) lggr := logger.TestLogger(t) app := mocks.NewApplication(t) app.On("GetDB").Return(sqlxDB) app.On("GetKeyStore").Return(keyStore) app.On("ID").Maybe().Return(uuid.New()) app.On("GetConfig").Return(config) ethClient := evmtest.NewEthClientMockWithDefaultChain(t) ethClient.On("Dial", mock.Anything).Return(nil) legacy := cltest.NewLegacyChainsWithMockChain(t, ethClient, config) mockRelayerChainInteroperators := &chainlinkmocks.FakeRelayerChainInteroperators{EVMChains: legacy} app.On("GetRelayers").Return(mockRelayerChainInteroperators).Maybe() c := cmd.Shell{ Config: config, AppFactory: cltest.InstanceAppFactory{App: app}, FallbackAPIInitializer: cltest.NewMockAPIInitializer(t), Runner: cltest.EmptyRunner{}, Logger: lggr, } set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(c.RebroadcastTransactions, set, "") require.NoError(t, set.Set("evmChainID", testutils.FixtureChainID.String())) require.NoError(t, set.Set("beginningNonce", strconv.FormatUint(uint64(beginningNonce), 10))) require.NoError(t, set.Set("endingNonce", strconv.FormatUint(uint64(endingNonce), 10))) require.NoError(t, set.Set("gasPriceWei", gasPrice.String())) require.NoError(t, set.Set("gasLimit", strconv.FormatUint(gasLimit, 10))) require.NoError(t, set.Set("address", fromAddress.Hex())) require.NoError(t, set.Set("password", "../internal/fixtures/correct_password.txt")) ctx := cli.NewContext(nil, set, nil) for i := beginningNonce; i <= endingNonce; i++ { n := i ethClient.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return uint(tx.Nonce()) == n }), mock.Anything).Once().Return(client.Successful, nil) } assert.NoError(t, c.RebroadcastTransactions(ctx)) cltest.AssertEthTxAttemptCountStays(t, txStore, 1) })` $DIR/core/cmd/shell_local_test.go: `.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Database.Dialect = dialects.Postgres // evm config is used in this test. but if set, it must be pass config validation. // simplest to make it nil c.EVM = nil // seems to be needed for config validate c.Insecure.OCRDevelopmentMode = nil })` $DIR/core/cmd/shell_local_test.go: `.NewKeyStore(t, sqlxDB)` $DIR/core/cmd/shell_local_test.go: `.MustInsertRandomKey(t, keyStore.Eth())` $DIR/core/cmd/shell_local_test.go: `.Eth()` $DIR/core/cmd/shell_local_test.go: `.NewTestTxStore(t, sqlxDB)` $DIR/core/cmd/shell_local_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, int64(test.nonce), 42, fromAddress)` $DIR/core/cmd/shell_local_test.go: `.TestLogger(t)` $DIR/core/cmd/shell_local_test.go: `.NewApplication(t)` $DIR/core/cmd/shell_local_test.go: `.On("GetDB")` $DIR/core/cmd/shell_local_test.go: `.Return(sqlxDB)` $DIR/core/cmd/shell_local_test.go: `.On("GetKeyStore")` $DIR/core/cmd/shell_local_test.go: `.Return(keyStore)` $DIR/core/cmd/shell_local_test.go: `.On("ID")` $DIR/core/cmd/shell_local_test.go: `.Maybe()` $DIR/core/cmd/shell_local_test.go: `.Return(uuid.New())` $DIR/core/cmd/shell_local_test.go: `.New()` $DIR/core/cmd/shell_local_test.go: `.On("GetConfig")` $DIR/core/cmd/shell_local_test.go: `.Return(config)` $DIR/core/cmd/shell_local_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/cmd/shell_local_test.go: `.On("Dial", mock.Anything)` $DIR/core/cmd/shell_local_test.go: `.Return(nil)` $DIR/core/cmd/shell_local_test.go: `.NewLegacyChainsWithMockChain(t, ethClient, config)` $DIR/core/cmd/shell_local_test.go: `.On("GetRelayers")` $DIR/core/cmd/shell_local_test.go: `.Return(mockRelayerChainInteroperators)` $DIR/core/cmd/shell_local_test.go: `.Maybe()` $DIR/core/cmd/shell_local_test.go: `.NewMockAPIInitializer(t)` $DIR/core/cmd/shell_local_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/shell_local_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_local_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.MatchedBy(func(tx *gethTypes.Transaction) bool { return uint(tx.Nonce()) == n }), mock.Anything)` $DIR/core/cmd/shell_local_test.go: `.MatchedBy(func(tx *gethTypes.Transaction) bool { return uint(tx.Nonce()) == n })` $DIR/core/cmd/shell_local_test.go: `.Nonce()` $DIR/core/cmd/shell_local_test.go: `.Once()` $DIR/core/cmd/shell_local_test.go: `.Return(client.Successful, nil)` $DIR/core/cmd/shell_local_test.go: `.AssertEthTxAttemptCountStays(t, txStore, 1)` $DIR/core/cmd/shell_local_test.go: `.Run(test.name, func(t *testing.T) { config, sqlxDB := heavyweight.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Database.Dialect = dialects.Postgres c.EVM = nil // seems to be needed for config validate c.Insecure.OCRDevelopmentMode = nil }) keyStore := cltest.NewKeyStore(t, sqlxDB) _, fromAddress := cltest.MustInsertRandomKey(t, keyStore.Eth()) if !test.enableAddress { err := keyStore.Eth().Disable(testutils.Context(t), fromAddress, testutils.FixtureChainID) require.NoError(t, err, "failed to disable test key") } lggr := logger.TestLogger(t) app := mocks.NewApplication(t) app.On("GetDB").Maybe().Return(sqlxDB) app.On("GetKeyStore").Return(keyStore) app.On("ID").Maybe().Return(uuid.New()) ethClient := evmtest.NewEthClientMockWithDefaultChain(t) ethClient.On("Dial", mock.Anything).Return(nil) legacy := cltest.NewLegacyChainsWithMockChain(t, ethClient, config) mockRelayerChainInteroperators := &chainlinkmocks.FakeRelayerChainInteroperators{EVMChains: legacy} app.On("GetRelayers").Return(mockRelayerChainInteroperators).Maybe() ethClient.On("SendTransactionReturnCode", mock.Anything, mock.Anything, mock.Anything).Maybe().Return(client.Successful, nil) client := cmd.Shell{ Config: config, AppFactory: cltest.InstanceAppFactory{App: app}, FallbackAPIInitializer: cltest.NewMockAPIInitializer(t), Runner: cltest.EmptyRunner{}, Logger: lggr, } set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(client.RebroadcastTransactions, set, "") require.NoError(t, set.Set("evmChainID", testutils.FixtureChainID.String())) require.NoError(t, set.Set("address", fromAddress.Hex())) require.NoError(t, set.Set("password", "../internal/fixtures/correct_password.txt")) c := cli.NewContext(nil, set, nil) if test.shouldError { require.ErrorContains(t, client.RebroadcastTransactions(c), test.errorContains) } else { app.On("GetConfig").Return(config).Once() require.NoError(t, client.RebroadcastTransactions(c)) } })` $DIR/core/cmd/shell_local_test.go: `.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Database.Dialect = dialects.Postgres c.EVM = nil // seems to be needed for config validate c.Insecure.OCRDevelopmentMode = nil })` $DIR/core/cmd/shell_local_test.go: `.NewKeyStore(t, sqlxDB)` $DIR/core/cmd/shell_local_test.go: `.MustInsertRandomKey(t, keyStore.Eth())` $DIR/core/cmd/shell_local_test.go: `.Eth()` $DIR/core/cmd/shell_local_test.go: `.Eth()` $DIR/core/cmd/shell_local_test.go: `.Disable(testutils.Context(t), fromAddress, testutils.FixtureChainID)` $DIR/core/cmd/shell_local_test.go: `.Context(t)` $DIR/core/cmd/shell_local_test.go: `.TestLogger(t)` $DIR/core/cmd/shell_local_test.go: `.NewApplication(t)` $DIR/core/cmd/shell_local_test.go: `.On("GetDB")` $DIR/core/cmd/shell_local_test.go: `.Maybe()` $DIR/core/cmd/shell_local_test.go: `.Return(sqlxDB)` $DIR/core/cmd/shell_local_test.go: `.On("GetKeyStore")` $DIR/core/cmd/shell_local_test.go: `.Return(keyStore)` $DIR/core/cmd/shell_local_test.go: `.On("ID")` $DIR/core/cmd/shell_local_test.go: `.Maybe()` $DIR/core/cmd/shell_local_test.go: `.Return(uuid.New())` $DIR/core/cmd/shell_local_test.go: `.New()` $DIR/core/cmd/shell_local_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/cmd/shell_local_test.go: `.On("Dial", mock.Anything)` $DIR/core/cmd/shell_local_test.go: `.Return(nil)` $DIR/core/cmd/shell_local_test.go: `.NewLegacyChainsWithMockChain(t, ethClient, config)` $DIR/core/cmd/shell_local_test.go: `.On("GetRelayers")` $DIR/core/cmd/shell_local_test.go: `.Return(mockRelayerChainInteroperators)` $DIR/core/cmd/shell_local_test.go: `.Maybe()` $DIR/core/cmd/shell_local_test.go: `.On("SendTransactionReturnCode", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/cmd/shell_local_test.go: `.Maybe()` $DIR/core/cmd/shell_local_test.go: `.Return(client.Successful, nil)` $DIR/core/cmd/shell_local_test.go: `.NewMockAPIInitializer(t)` $DIR/core/cmd/shell_local_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/shell_local_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_local_test.go: `.On("GetConfig")` $DIR/core/cmd/shell_local_test.go: `.Return(config)` $DIR/core/cmd/shell_local_test.go: `.Once()` $DIR/core/cmd/shell_local_test.go: `.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Database.Dialect = dialects.Postgres })` $DIR/core/cmd/shell_local_test.go: `.TestLogger(t)` $DIR/core/cmd/shell_local_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/shell_local_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_local_test.go: `.CleanupChainTables(c)` $DIR/core/cmd/shell_local_test.go: `.NewSqlxDB(t)` $DIR/core/cmd/shell_local_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { s.Password.Keystore = models.NewSecret("dummy") c.EVM[0].Nodes[0].Name = ptr("fake") c.EVM[0].Nodes[0].HTTPURL = commonconfig.MustParseURL("http://fake.com") c.EVM[0].Nodes[0].WSURL = commonconfig.MustParseURL("WSS://fake.com/ws") // seems to be needed for config validate c.Insecure.OCRDevelopmentMode = nil })` $DIR/core/cmd/shell_local_test.go: `.NewSecret("dummy")` $DIR/core/cmd/shell_local_test.go: `.MustParseURL("http://fake.com")` $DIR/core/cmd/shell_local_test.go: `.MustParseURL("WSS://fake.com/ws")` $DIR/core/cmd/shell_local_test.go: `.TestLogger(t)` $DIR/core/cmd/shell_local_test.go: `.NewApplication(t)` $DIR/core/cmd/shell_local_test.go: `.On("GetSqlxDB")` $DIR/core/cmd/shell_local_test.go: `.Maybe()` $DIR/core/cmd/shell_local_test.go: `.Return(db)` $DIR/core/cmd/shell_local_test.go: `.NewMockAPIInitializer(t)` $DIR/core/cmd/shell_local_test.go: `.Run("Returns error, if --start is not positive", func(t *testing.T) { set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(shell.RemoveBlocks, set, "") require.NoError(t, set.Set("start", "0")) require.NoError(t, set.Set("evm-chain-id", "12")) c := cli.NewContext(nil, set, nil) err := shell.RemoveBlocks(c) require.ErrorContains(t, err, "Must pass a positive value in '--start' parameter") })` $DIR/core/cmd/shell_local_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/shell_local_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_local_test.go: `.RemoveBlocks(c)` $DIR/core/cmd/shell_local_test.go: `.Run("Returns error, if removal fails", func(t *testing.T) { set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(shell.RemoveBlocks, set, "") require.NoError(t, set.Set("start", "10000")) require.NoError(t, set.Set("evm-chain-id", "12")) expectedError := fmt.Errorf("failed to delete log poller's data") app.On("DeleteLogPollerDataAfter", mock.Anything, big.NewInt(12), int64(10000)).Return(expectedError).Once() c := cli.NewContext(nil, set, nil) err := shell.RemoveBlocks(c) require.ErrorContains(t, err, expectedError.Error()) })` $DIR/core/cmd/shell_local_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/shell_local_test.go: `.On("DeleteLogPollerDataAfter", mock.Anything, big.NewInt(12), int64(10000))` $DIR/core/cmd/shell_local_test.go: `.NewInt(12)` $DIR/core/cmd/shell_local_test.go: `.Return(expectedError)` $DIR/core/cmd/shell_local_test.go: `.Once()` $DIR/core/cmd/shell_local_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_local_test.go: `.RemoveBlocks(c)` $DIR/core/cmd/shell_local_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/shell_local_test.go: `.On("DeleteLogPollerDataAfter", mock.Anything, big.NewInt(12), int64(10000))` $DIR/core/cmd/shell_local_test.go: `.NewInt(12)` $DIR/core/cmd/shell_local_test.go: `.Return(nil)` $DIR/core/cmd/shell_local_test.go: `.Once()` $DIR/core/cmd/shell_local_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_local_test.go: `.RemoveBlocks(c)` $DIR/core/cmd/shell_remote_test.go: `c.EVM[0].Enabled = ptr(true)` $DIR/core/cmd/shell_remote_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/cmd/shell_remote_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/cmd/shell_remote_test.go: `c.EVM[0].GasEstimator.Mode = ptr("FixedPrice")` $DIR/core/cmd/shell_remote_test.go: `flagSetApplyFromAction(client.ReplayFromBlock, set, "")` $DIR/core/cmd/shell_remote_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/shell_remote_test.go: `t.Run(test.name, func(t *testing.T) { ctx := testutils.Context(t) app := startNewApplicationV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.JobPipeline.ExternalInitiatorsEnabled = ptr(true) }) client, _ := app.NewShellAndRenderer() set := flag.NewFlagSet("create", 0) flagSetApplyFromAction(client.CreateExternalInitiator, set, "") assert.NoError(t, set.Parse(test.args)) c := cli.NewContext(nil, set, nil) err := client.CreateExternalInitiator(c) require.NoError(t, err) var exi bridges.ExternalInitiator err = app.GetDB().GetContext(ctx, &exi, `SELECT * FROM external_initiators WHERE name = $1`, test.args[0]) require.NoError(t, err) if len(test.args) > 1 { assert.Equal(t, test.args[1], exi.URL.String()) } })` $DIR/core/cmd/shell_remote_test.go: `c.JobPipeline.ExternalInitiatorsEnabled = ptr(true)` $DIR/core/cmd/shell_remote_test.go: `flagSetApplyFromAction(client.CreateExternalInitiator, set, "")` $DIR/core/cmd/shell_remote_test.go: `err = app.GetDB().GetContext(ctx, &exi, `SELECT * FROM external_initiators WHERE name = $1`, test.args[0])` $DIR/core/cmd/shell_remote_test.go: `t.Run(test.name, func(t *testing.T) { app := startNewApplicationV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.JobPipeline.ExternalInitiatorsEnabled = ptr(true) }) client, _ := app.NewShellAndRenderer() initialExis := len(cltest.AllExternalInitiators(t, app.GetDB())) set := flag.NewFlagSet("create", 0) flagSetApplyFromAction(client.CreateExternalInitiator, set, "") assert.NoError(t, set.Parse(test.args)) c := cli.NewContext(nil, set, nil) err := client.CreateExternalInitiator(c) assert.Error(t, err) exis := cltest.AllExternalInitiators(t, app.GetDB()) assert.Len(t, exis, initialExis) })` $DIR/core/cmd/shell_remote_test.go: `c.JobPipeline.ExternalInitiatorsEnabled = ptr(true)` $DIR/core/cmd/shell_remote_test.go: `flagSetApplyFromAction(client.CreateExternalInitiator, set, "")` $DIR/core/cmd/shell_remote_test.go: `c.JobPipeline.ExternalInitiatorsEnabled = ptr(true)` $DIR/core/cmd/shell_remote_test.go: `err = app.BridgeORM().CreateExternalInitiator(testutils.Context(t), exi)` $DIR/core/cmd/shell_remote_test.go: `flagSetApplyFromAction(client.DeleteExternalInitiator, set, "")` $DIR/core/cmd/shell_remote_test.go: `c.JobPipeline.ExternalInitiatorsEnabled = ptr(true)` $DIR/core/cmd/shell_remote_test.go: `flagSetApplyFromAction(client.DeleteExternalInitiator, set, "")` $DIR/core/cmd/shell_remote_test.go: `t.Run(test.name, func(t *testing.T) { enteredStrings := []string{test.email, test.pwd} prompter := &cltest.MockCountingPrompter{T: t, EnteredStrings: enteredStrings} client := app.NewAuthenticatingShell(prompter) set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(client.RemoteLogin, set, "") require.NoError(t, set.Set("file", test.file)) require.NoError(t, set.Set("bypass-version-check", "true")) c := cli.NewContext(nil, set, nil) err := client.RemoteLogin(c) if test.wantError { assert.Error(t, err) } else { assert.NoError(t, err) } })` $DIR/core/cmd/shell_remote_test.go: `flagSetApplyFromAction(client.RemoteLogin, set, "")` $DIR/core/cmd/shell_remote_test.go: `client.HTTP = &mockHTTPClient{client.HTTP, remoteVersion, remoteSha}` $DIR/core/cmd/shell_remote_test.go: `flagSetApplyFromAction(client.RemoteLogin, set, "")` $DIR/core/cmd/shell_remote_test.go: `set = flag.NewFlagSet("test", 0)` $DIR/core/cmd/shell_remote_test.go: `flagSetApplyFromAction(client.RemoteLogin, set, "")` $DIR/core/cmd/shell_remote_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/shell_remote_test.go: `err = client.RemoteLogin(c)` $DIR/core/cmd/shell_remote_test.go: `t.Run(test.name, func(t *testing.T) { enteredStrings := []string{u.Email, cltest.Password} prompter := &cltest.MockCountingPrompter{T: t, EnteredStrings: enteredStrings} client := app.NewAuthenticatingShell(prompter) client.HTTP = &mockHTTPClient{client.HTTP, test.remoteVersion, test.remoteSha} err := client.CheckRemoteBuildCompatibility(logger.TestLogger(t), test.bypassVersionFlag, test.cliVersion, test.cliSha) if test.wantError { assert.Error(t, err) assert.ErrorIs(t, err, cmd.ErrIncompatible{ RemoteVersion: test.remoteVersion, RemoteSha: test.remoteSha, CLIVersion: test.cliVersion, CLISha: test.cliSha, }) } else { assert.NoError(t, err) } })` $DIR/core/cmd/shell_remote_test.go: `client.HTTP = &mockHTTPClient{client.HTTP, test.remoteVersion, test.remoteSha}` $DIR/core/cmd/shell_remote_test.go: `flagSetApplyFromAction(client.RemoteLogin, set, "")` $DIR/core/cmd/shell_remote_test.go: `err = otherClient.RemoteLogin(c)` $DIR/core/cmd/shell_remote_test.go: `client.ChangePasswordPrompter = cltest.MockChangePasswordPrompter{ UpdatePasswordRequest: web.UpdatePasswordRequest{ OldPassword: testutils.Password, NewPassword: "12345", }, }` $DIR/core/cmd/shell_remote_test.go: `err = client.ChangePassword(cli.NewContext(nil, nil, nil))` $DIR/core/cmd/shell_remote_test.go: `client.ChangePasswordPrompter = cltest.MockChangePasswordPrompter{ UpdatePasswordRequest: web.UpdatePasswordRequest{ OldPassword: testutils.Password, NewPassword: testutils.Password + "foo", }, }` $DIR/core/cmd/shell_remote_test.go: `err = client.ChangePassword(cli.NewContext(nil, nil, nil))` $DIR/core/cmd/shell_remote_test.go: `err = otherClient.IndexBridges(c)` $DIR/core/cmd/shell_remote_test.go: `flagSetApplyFromAction(client.RemoteLogin, set, "")` $DIR/core/cmd/shell_remote_test.go: `set.Uint("seconds", uint(d.Seconds()), "")` $DIR/core/cmd/shell_remote_test.go: `set.String("output_dir", tDir, "")` $DIR/core/cmd/shell_remote_test.go: `err = client.Profile(cli.NewContext(nil, set, nil))` $DIR/core/cmd/shell_remote_test.go: `flagSetApplyFromAction(client.RemoteLogin, set, "")` $DIR/core/cmd/shell_remote_test.go: `set.Uint("seconds", 1, "")` $DIR/core/cmd/shell_remote_test.go: `set.String("output_dir", tDir, "")` $DIR/core/cmd/shell_remote_test.go: `err = client.Profile(cli.NewContext(nil, set, nil))` $DIR/core/cmd/shell_remote_test.go: `set.Uint("seconds", 1, "")` $DIR/core/cmd/shell_remote_test.go: `set.String("output_dir", t.TempDir(), "")` $DIR/core/cmd/shell_remote_test.go: `t.Run("user", func(t *testing.T) { got, err := client.ConfigV2Str(true) require.NoError(t, err) assert.Equal(t, user, got, diff.Diff(user, got)) })` $DIR/core/cmd/shell_remote_test.go: `c.EVM[0].Enabled = ptr(true)` $DIR/core/cmd/shell_remote_test.go: `c.OCR.Enabled = ptr(true)` $DIR/core/cmd/shell_remote_test.go: `c.P2P.V2.Enabled = ptr(true)` $DIR/core/cmd/shell_remote_test.go: `c.P2P.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", freeport.GetOne(t))}` $DIR/core/cmd/shell_remote_test.go: `c.P2P.PeerID = &cltest.DefaultP2PPeerID` $DIR/core/cmd/shell_remote_test.go: `c.EVM[0].GasEstimator.Mode = ptr("FixedPrice")` $DIR/core/cmd/shell_remote_test.go: `opts.FlagsAndDeps = append(opts.FlagsAndDeps, cltest.DefaultP2PKey)` $DIR/core/cmd/shell_remote_test.go: `err = toml.Unmarshal([]byte(ocrspec.Toml()), &ocrSpec)` $DIR/core/cmd/shell_remote_test.go: `jb.OCROracleSpec = &ocrSpec` $DIR/core/cmd/shell_remote_test.go: `jb.OCROracleSpec.TransmitterAddress = &key.EIP55Address` $DIR/core/cmd/shell_remote_test.go: `err = app.AddJobV2(testutils.Context(t), &jb)` $DIR/core/cmd/shell_remote_test.go: `flagSetApplyFromAction(client.RemoteLogin, set, "")` $DIR/core/cmd/shell_remote_test.go: `flagSetApplyFromAction(client.RemoteLogin, set, "")` $DIR/core/cmd/shell_remote_test.go: `flagSetApplyFromAction(client.RemoteLogin, set, "")` $DIR/core/cmd/shell_remote_test.go: `client.CookieAuthenticator = cmd.NewSessionCookieAuthenticator(app.NewClientOpts(), &cmd.MemoryCookieStore{}, logger.TestLogger(t))` $DIR/core/cmd/shell_remote_test.go: `client.HTTP = cmd.NewAuthenticatedHTTPClient(app.Logger, app.NewClientOpts(), client.CookieAuthenticator, sr)` $DIR/core/cmd/shell_remote_test.go: `flagSetApplyFromAction(client.ListJobs, fs, "")` $DIR/core/cmd/shell_remote_test.go: `pgtest.MustExec(t, app.GetDB(), "delete from sessions where email = $1", user.Email)` $DIR/core/cmd/shell_remote_test.go: `err = client.ListJobs(cli.NewContext(nil, fs, nil))` $DIR/core/cmd/shell_remote_test.go: `client.CookieAuthenticator = FailingAuthenticator{}` $DIR/core/cmd/shell_remote_test.go: `client.HTTP = cmd.NewAuthenticatedHTTPClient(app.Logger, app.NewClientOpts(), client.CookieAuthenticator, sr)` $DIR/core/cmd/shell_remote_test.go: `flagSetApplyFromAction(client.ListJobs, fs, "")` $DIR/core/cmd/shell_remote_test.go: `flagSetApplyFromAction(client.SetLogLevel, set, "")` $DIR/core/cmd/shell_remote_test.go: `set = flag.NewFlagSet("logsql", 0)` $DIR/core/cmd/shell_remote_test.go: `flagSetApplyFromAction(client.SetLogSQL, set, "")` $DIR/core/cmd/shell_remote_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/shell_remote_test.go: `err = client.SetLogSQL(c)` $DIR/core/cmd/shell_remote_test.go: `sqlEnabled = false` $DIR/core/cmd/shell_remote_test.go: `set = flag.NewFlagSet("logsql", 0)` $DIR/core/cmd/shell_remote_test.go: `flagSetApplyFromAction(client.SetLogSQL, set, "")` $DIR/core/cmd/shell_remote_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/shell_remote_test.go: `err = client.SetLogSQL(c)` $DIR/core/cmd/shell_remote_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/shell_remote_test.go: `.NewFlagSet("flagset", 0)` $DIR/core/cmd/shell_remote_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_remote_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_remote_test.go: `.ReplayFromBlock(c)` $DIR/core/cmd/shell_remote_test.go: `.Run(test.name, func(t *testing.T) { ctx := testutils.Context(t) app := startNewApplicationV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.JobPipeline.ExternalInitiatorsEnabled = ptr(true) }) client, _ := app.NewShellAndRenderer() set := flag.NewFlagSet("create", 0) flagSetApplyFromAction(client.CreateExternalInitiator, set, "") assert.NoError(t, set.Parse(test.args)) c := cli.NewContext(nil, set, nil) err := client.CreateExternalInitiator(c) require.NoError(t, err) var exi bridges.ExternalInitiator err = app.GetDB().GetContext(ctx, &exi, `SELECT * FROM external_initiators WHERE name = $1`, test.args[0]) require.NoError(t, err) if len(test.args) > 1 { assert.Equal(t, test.args[1], exi.URL.String()) } })` $DIR/core/cmd/shell_remote_test.go: `.Context(t)` $DIR/core/cmd/shell_remote_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/shell_remote_test.go: `.NewFlagSet("create", 0)` $DIR/core/cmd/shell_remote_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_remote_test.go: `.CreateExternalInitiator(c)` $DIR/core/cmd/shell_remote_test.go: `.GetDB()` $DIR/core/cmd/shell_remote_test.go: `.GetContext(ctx, &exi, `SELECT * FROM external_initiators WHERE name = $1`, test.args[0])` $DIR/core/cmd/shell_remote_test.go: `.Run(test.name, func(t *testing.T) { app := startNewApplicationV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.JobPipeline.ExternalInitiatorsEnabled = ptr(true) }) client, _ := app.NewShellAndRenderer() initialExis := len(cltest.AllExternalInitiators(t, app.GetDB())) set := flag.NewFlagSet("create", 0) flagSetApplyFromAction(client.CreateExternalInitiator, set, "") assert.NoError(t, set.Parse(test.args)) c := cli.NewContext(nil, set, nil) err := client.CreateExternalInitiator(c) assert.Error(t, err) exis := cltest.AllExternalInitiators(t, app.GetDB()) assert.Len(t, exis, initialExis) })` $DIR/core/cmd/shell_remote_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/shell_remote_test.go: `.AllExternalInitiators(t, app.GetDB())` $DIR/core/cmd/shell_remote_test.go: `.GetDB()` $DIR/core/cmd/shell_remote_test.go: `.NewFlagSet("create", 0)` $DIR/core/cmd/shell_remote_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_remote_test.go: `.CreateExternalInitiator(c)` $DIR/core/cmd/shell_remote_test.go: `.AllExternalInitiators(t, app.GetDB())` $DIR/core/cmd/shell_remote_test.go: `.GetDB()` $DIR/core/cmd/shell_remote_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/shell_remote_test.go: `.NewToken()` $DIR/core/cmd/shell_remote_test.go: `.NewExternalInitiator(token, &bridges.ExternalInitiatorRequest{Name: uuid.New().String()}, )` $DIR/core/cmd/shell_remote_test.go: `.New()` $DIR/core/cmd/shell_remote_test.go: `.String()` $DIR/core/cmd/shell_remote_test.go: `.BridgeORM()` $DIR/core/cmd/shell_remote_test.go: `.CreateExternalInitiator(testutils.Context(t), exi)` $DIR/core/cmd/shell_remote_test.go: `.Context(t)` $DIR/core/cmd/shell_remote_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/shell_remote_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_remote_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/shell_remote_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/shell_remote_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_remote_test.go: `.AuthenticationProvider()` $DIR/core/cmd/shell_remote_test.go: `.NewUserWithSession(t, orm)` $DIR/core/cmd/shell_remote_test.go: `.Run(test.name, func(t *testing.T) { enteredStrings := []string{test.email, test.pwd} prompter := &cltest.MockCountingPrompter{T: t, EnteredStrings: enteredStrings} client := app.NewAuthenticatingShell(prompter) set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(client.RemoteLogin, set, "") require.NoError(t, set.Set("file", test.file)) require.NoError(t, set.Set("bypass-version-check", "true")) c := cli.NewContext(nil, set, nil) err := client.RemoteLogin(c) if test.wantError { assert.Error(t, err) } else { assert.NoError(t, err) } })` $DIR/core/cmd/shell_remote_test.go: `.NewAuthenticatingShell(prompter)` $DIR/core/cmd/shell_remote_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/shell_remote_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_remote_test.go: `.RemoteLogin(c)` $DIR/core/cmd/shell_remote_test.go: `.NewUserWithSession(t, app.AuthenticationProvider())` $DIR/core/cmd/shell_remote_test.go: `.AuthenticationProvider()` $DIR/core/cmd/shell_remote_test.go: `.NewAuthenticatingShell(prompter)` $DIR/core/cmd/shell_remote_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/shell_remote_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_remote_test.go: `.RemoteLogin(c)` $DIR/core/cmd/shell_remote_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/shell_remote_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_remote_test.go: `.RemoteLogin(c)` $DIR/core/cmd/shell_remote_test.go: `.NewUserWithSession(t, app.AuthenticationProvider())` $DIR/core/cmd/shell_remote_test.go: `.AuthenticationProvider()` $DIR/core/cmd/shell_remote_test.go: `.Run(test.name, func(t *testing.T) { enteredStrings := []string{u.Email, cltest.Password} prompter := &cltest.MockCountingPrompter{T: t, EnteredStrings: enteredStrings} client := app.NewAuthenticatingShell(prompter) client.HTTP = &mockHTTPClient{client.HTTP, test.remoteVersion, test.remoteSha} err := client.CheckRemoteBuildCompatibility(logger.TestLogger(t), test.bypassVersionFlag, test.cliVersion, test.cliSha) if test.wantError { assert.Error(t, err) assert.ErrorIs(t, err, cmd.ErrIncompatible{ RemoteVersion: test.remoteVersion, RemoteSha: test.remoteSha, CLIVersion: test.cliVersion, CLISha: test.cliSha, }) } else { assert.NoError(t, err) } })` $DIR/core/cmd/shell_remote_test.go: `.NewAuthenticatingShell(prompter)` $DIR/core/cmd/shell_remote_test.go: `.CheckRemoteBuildCompatibility(logger.TestLogger(t), test.bypassVersionFlag, test.cliVersion, test.cliSha)` $DIR/core/cmd/shell_remote_test.go: `.TestLogger(t)` $DIR/core/cmd/shell_remote_test.go: `.NewUserWithSession(t, app.AuthenticationProvider())` $DIR/core/cmd/shell_remote_test.go: `.AuthenticationProvider()` $DIR/core/cmd/shell_remote_test.go: `.NewAuthenticatingShell(prompter)` $DIR/core/cmd/shell_remote_test.go: `.NewAuthenticatingShell(prompter)` $DIR/core/cmd/shell_remote_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/shell_remote_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_remote_test.go: `.RemoteLogin(c)` $DIR/core/cmd/shell_remote_test.go: `.RemoteLogin(c)` $DIR/core/cmd/shell_remote_test.go: `.ChangePassword(cli.NewContext(nil, nil, nil))` $DIR/core/cmd/shell_remote_test.go: `.NewContext(nil, nil, nil)` $DIR/core/cmd/shell_remote_test.go: `.ChangePassword(cli.NewContext(nil, nil, nil))` $DIR/core/cmd/shell_remote_test.go: `.NewContext(nil, nil, nil)` $DIR/core/cmd/shell_remote_test.go: `.IndexBridges(c)` $DIR/core/cmd/shell_remote_test.go: `.NewUserWithSession(t, app.AuthenticationProvider())` $DIR/core/cmd/shell_remote_test.go: `.AuthenticationProvider()` $DIR/core/cmd/shell_remote_test.go: `.NewAuthenticatingShell(prompter)` $DIR/core/cmd/shell_remote_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/shell_remote_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_remote_test.go: `.RemoteLogin(c)` $DIR/core/cmd/shell_remote_test.go: `.Config.WebServer()` $DIR/core/cmd/shell_remote_test.go: `.HTTPWriteTimeout()` $DIR/core/cmd/shell_remote_test.go: `.Uint("seconds", uint(d.Seconds()), "")` $DIR/core/cmd/shell_remote_test.go: `.Seconds()` $DIR/core/cmd/shell_remote_test.go: `.TempDir()` $DIR/core/cmd/shell_remote_test.go: `.String("output_dir", tDir, "")` $DIR/core/cmd/shell_remote_test.go: `.Profile(cli.NewContext(nil, set, nil))` $DIR/core/cmd/shell_remote_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_remote_test.go: `.NewUserWithSession(t, app.AuthenticationProvider())` $DIR/core/cmd/shell_remote_test.go: `.AuthenticationProvider()` $DIR/core/cmd/shell_remote_test.go: `.NewAuthenticatingShell(prompter)` $DIR/core/cmd/shell_remote_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/shell_remote_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_remote_test.go: `.RemoteLogin(c)` $DIR/core/cmd/shell_remote_test.go: `.Uint("seconds", 1, "")` $DIR/core/cmd/shell_remote_test.go: `.TempDir()` $DIR/core/cmd/shell_remote_test.go: `.String("output_dir", tDir, "")` $DIR/core/cmd/shell_remote_test.go: `.Profile(cli.NewContext(nil, set, nil))` $DIR/core/cmd/shell_remote_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_remote_test.go: `.ReadDir(tDir)` $DIR/core/cmd/shell_remote_test.go: `.NewAuthenticatingShell(&cltest.MockCountingPrompter{T: t, EnteredStrings: []string{}})` $DIR/core/cmd/shell_remote_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/shell_remote_test.go: `.Uint("seconds", 1, "")` $DIR/core/cmd/shell_remote_test.go: `.String("output_dir", t.TempDir(), "")` $DIR/core/cmd/shell_remote_test.go: `.TempDir()` $DIR/core/cmd/shell_remote_test.go: `.Profile(cli.NewContext(nil, set, nil))` $DIR/core/cmd/shell_remote_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_remote_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/shell_remote_test.go: `.Config.ConfigTOML()` $DIR/core/cmd/shell_remote_test.go: `.Run("user", func(t *testing.T) { got, err := client.ConfigV2Str(true) require.NoError(t, err) assert.Equal(t, user, got, diff.Diff(user, got)) })` $DIR/core/cmd/shell_remote_test.go: `.ConfigV2Str(true)` $DIR/core/cmd/shell_remote_test.go: `.ConfigV2Str(false)` $DIR/core/cmd/shell_remote_test.go: `.Context(t)` $DIR/core/cmd/shell_remote_test.go: `.Sprintf("127.0.0.1:%d", freeport.GetOne(t))` $DIR/core/cmd/shell_remote_test.go: `.GetOne(t)` $DIR/core/cmd/shell_remote_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/shell_remote_test.go: `.MustCreateBridge(t, app.GetDB(), cltest.BridgeOpts{})` $DIR/core/cmd/shell_remote_test.go: `.GetDB()` $DIR/core/cmd/shell_remote_test.go: `.MustCreateBridge(t, app.GetDB(), cltest.BridgeOpts{})` $DIR/core/cmd/shell_remote_test.go: `.GetDB()` $DIR/core/cmd/shell_remote_test.go: `.GenerateOCRSpec(testspecs.OCRSpecParams{DS1BridgeName: bridge.Name.String(), DS2BridgeName: bridge2.Name.String()})` $DIR/core/cmd/shell_remote_test.go: `.Name.String()` $DIR/core/cmd/shell_remote_test.go: `.Name.String()` $DIR/core/cmd/shell_remote_test.go: `.Unmarshal([]byte(ocrspec.Toml()), &jb)` $DIR/core/cmd/shell_remote_test.go: `.Toml()` $DIR/core/cmd/shell_remote_test.go: `.Unmarshal([]byte(ocrspec.Toml()), &ocrSpec)` $DIR/core/cmd/shell_remote_test.go: `.Toml()` $DIR/core/cmd/shell_remote_test.go: `.MustInsertRandomKey(t, app.KeyStore.Eth())` $DIR/core/cmd/shell_remote_test.go: `.KeyStore.Eth()` $DIR/core/cmd/shell_remote_test.go: `.AddJobV2(testutils.Context(t), &jb)` $DIR/core/cmd/shell_remote_test.go: `.Context(t)` $DIR/core/cmd/shell_remote_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/shell_remote_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_remote_test.go: `.TriggerPipelineRun(c)` $DIR/core/cmd/shell_remote_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/shell_remote_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/shell_remote_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_remote_test.go: `.TriggerPipelineRun(c)` $DIR/core/cmd/shell_remote_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/shell_remote_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/shell_remote_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_remote_test.go: `.TriggerPipelineRun(c)` $DIR/core/cmd/shell_remote_test.go: `.Context(t)` $DIR/core/cmd/shell_remote_test.go: `.MustRandomUser(t)` $DIR/core/cmd/shell_remote_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/shell_remote_test.go: `.NewSessionCookieAuthenticator(app.NewClientOpts(), &cmd.MemoryCookieStore{}, logger.TestLogger(t))` $DIR/core/cmd/shell_remote_test.go: `.NewClientOpts()` $DIR/core/cmd/shell_remote_test.go: `.TestLogger(t)` $DIR/core/cmd/shell_remote_test.go: `.NewAuthenticatedHTTPClient(app.Logger, app.NewClientOpts(), client.CookieAuthenticator, sr)` $DIR/core/cmd/shell_remote_test.go: `.NewClientOpts()` $DIR/core/cmd/shell_remote_test.go: `.NewFlagSet("", flag.ExitOnError)` $DIR/core/cmd/shell_remote_test.go: `.ListJobs(cli.NewContext(nil, fs, nil))` $DIR/core/cmd/shell_remote_test.go: `.NewContext(nil, fs, nil)` $DIR/core/cmd/shell_remote_test.go: `.MustExec(t, app.GetDB(), "delete from sessions where email = $1", user.Email)` $DIR/core/cmd/shell_remote_test.go: `.GetDB()` $DIR/core/cmd/shell_remote_test.go: `.ListJobs(cli.NewContext(nil, fs, nil))` $DIR/core/cmd/shell_remote_test.go: `.NewContext(nil, fs, nil)` $DIR/core/cmd/shell_remote_test.go: `.Context(t)` $DIR/core/cmd/shell_remote_test.go: `.MustRandomUser(t)` $DIR/core/cmd/shell_remote_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/shell_remote_test.go: `.NewAuthenticatedHTTPClient(app.Logger, app.NewClientOpts(), client.CookieAuthenticator, sr)` $DIR/core/cmd/shell_remote_test.go: `.NewClientOpts()` $DIR/core/cmd/shell_remote_test.go: `.NewFlagSet("", flag.ExitOnError)` $DIR/core/cmd/shell_remote_test.go: `.ListJobs(cli.NewContext(nil, fs, nil))` $DIR/core/cmd/shell_remote_test.go: `.NewContext(nil, fs, nil)` $DIR/core/cmd/shell_remote_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/shell_remote_test.go: `.NewFlagSet("loglevel", 0)` $DIR/core/cmd/shell_remote_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_remote_test.go: `.SetLogLevel(c)` $DIR/core/cmd/shell_remote_test.go: `.NewFlagSet("logsql", 0)` $DIR/core/cmd/shell_remote_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_remote_test.go: `.SetLogSQL(c)` $DIR/core/cmd/shell_remote_test.go: `.NewFlagSet("logsql", 0)` $DIR/core/cmd/shell_remote_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/shell_remote_test.go: `.SetLogSQL(c)` $DIR/core/cmd/shell_remote_test.go: `.Config.Database()` $DIR/core/cmd/shell_remote_test.go: `.LogSQL()` $DIR/core/cmd/shell_test.go: `t.Run(test.name, func(t *testing.T) { sr := sessions.SessionRequest{Email: test.email, Password: test.pwd} store := &cmd.MemoryCookieStore{} tca := cmd.NewSessionCookieAuthenticator(cmd.ClientOpts{}, store, logger.TestLogger(t)) cookie, err := tca.Authenticate(ctx, sr) assert.Error(t, err) assert.Nil(t, cookie) cookie, err = store.Retrieve() assert.NoError(t, err) assert.Nil(t, cookie) })` $DIR/core/cmd/shell_test.go: `cookie, err = store.Retrieve()` $DIR/core/cmd/shell_test.go: `t.Run(test.name, func(t *testing.T) { sr := sessions.SessionRequest{Email: test.email, Password: test.pwd} store := &cmd.MemoryCookieStore{} tca := cmd.NewSessionCookieAuthenticator(app.NewClientOpts(), store, logger.TestLogger(t)) cookie, err := tca.Authenticate(ctx, sr) if test.wantError { assert.Error(t, err) assert.Nil(t, cookie) cookie, err = store.Retrieve() assert.NoError(t, err) assert.Nil(t, cookie) } else { assert.NoError(t, err) assert.NotNil(t, cookie) retrievedCookie, err := store.Retrieve() assert.NoError(t, err) assert.Equal(t, cookie, retrievedCookie) } })` $DIR/core/cmd/shell_test.go: `cookie, err = store.Retrieve()` $DIR/core/cmd/shell_test.go: `t.Run("missing cookie file", func(t *testing.T) { store := cmd.DiskCookieStore{Config: cfg} cookie, err := store.Retrieve() assert.NoError(t, err) assert.Nil(t, cookie) })` $DIR/core/cmd/shell_test.go: `t.Run("invalid cookie file", func(t *testing.T) { cfg.rootdir = "../internal/fixtures/badcookie" store := cmd.DiskCookieStore{Config: cfg} cookie, err := store.Retrieve() assert.Error(t, err) assert.Nil(t, cookie) })` $DIR/core/cmd/shell_test.go: `cfg.rootdir = "../internal/fixtures/badcookie"` $DIR/core/cmd/shell_test.go: `cfg.rootdir = "../internal/fixtures"` $DIR/core/cmd/shell_test.go: `t.Run(test.name, func(t *testing.T) { ctx := testutils.Context(t) db := pgtest.NewSqlxDB(t) lggr := logger.TestLogger(t) orm := localauth.NewORM(db, time.Minute, lggr, audit.NoopLogger) mock := &cltest.MockCountingPrompter{T: t, EnteredStrings: test.enteredStrings, NotTerminal: !test.isTerminal} tai := cmd.NewPromptingAPIInitializer(mock) // Clear out fixture users/users created from the other test cases // This asserts that on initial run with an empty users table that the credentials file will instantiate and // create/run with a new admin user pgtest.MustExec(t, db, "DELETE FROM users;") user, err := tai.Initialize(ctx, orm, lggr) if test.isError { assert.Error(t, err) } else { assert.NoError(t, err) assert.Equal(t, len(test.enteredStrings), mock.Count) persistedUser, err := orm.FindUser(ctx, email) assert.NoError(t, err) assert.Equal(t, user.Email, persistedUser.Email) assert.Equal(t, user.HashedPassword, persistedUser.HashedPassword) } })` $DIR/core/cmd/shell_test.go: `pgtest.MustExec(t, db, "DELETE FROM users;")` $DIR/core/cmd/shell_test.go: `t.Run(test.name, func(t *testing.T) { ctx := testutils.Context(t) db := pgtest.NewSqlxDB(t) lggr := logger.TestLogger(t) orm := localauth.NewORM(db, time.Minute, lggr, audit.NoopLogger) // Clear out fixture users/users created from the other test cases // This asserts that on initial run with an empty users table that the credentials file will instantiate and // create/run with a new admin user pgtest.MustExec(t, db, "DELETE FROM users;") tfi := cmd.NewFileAPIInitializer(test.file) user, err := tfi.Initialize(ctx, orm, lggr) if test.wantError { assert.Error(t, err) } else { assert.NoError(t, err) assert.Equal(t, cltest.APIEmailAdmin, user.Email) persistedUser, err := orm.FindUser(ctx, user.Email) assert.NoError(t, err) assert.Equal(t, persistedUser.Email, user.Email) } })` $DIR/core/cmd/shell_test.go: `pgtest.MustExec(t, db, "DELETE FROM users;")` $DIR/core/cmd/shell_test.go: `t.Run(test.name, func(t *testing.T) { ctx := testutils.Context(t) lggr := logger.TestLogger(t) tfi := cmd.NewFileAPIInitializer(test.file) user, err := tfi.Initialize(ctx, orm, lggr) if test.wantError { assert.Error(t, err) } else { assert.NoError(t, err) assert.Equal(t, cltest.APIEmailAdmin, user.Email) } })` $DIR/core/cmd/shell_test.go: `t.Run(test.email, func(t *testing.T) { enteredStrings := []string{test.email, test.pwd} prompter := &cltest.MockCountingPrompter{T: t, EnteredStrings: enteredStrings} builder := cmd.NewPromptingSessionRequestBuilder(prompter) sr, err := builder.Build("") require.NoError(t, err) assert.Equal(t, test.email, sr.Email) assert.Equal(t, test.pwd, sr.Password) })` $DIR/core/cmd/shell_test.go: `t.Run(test.name, func(t *testing.T) { sr, err := builder.Build(test.file) assert.Equal(t, test.wantEmail, sr.Email) if test.wantError { assert.Error(t, err) } else { assert.NoError(t, err) } })` $DIR/core/cmd/shell_test.go: `c.Solana = solcfg.TOMLConfigs{ &solcfg.TOMLConfig{ ChainID: ptr[string]("solana-id-1"), Enabled: ptr(true), Chain: solcfg.Chain{}, Nodes: []*solcfg.Node{}, }, &solcfg.TOMLConfig{ ChainID: ptr[string]("solana-id-2"), Enabled: ptr(true), Chain: solcfg.Chain{}, Nodes: []*solcfg.Node{}, }, &solcfg.TOMLConfig{ ChainID: ptr[string]("disabled-solana-id-1"), Enabled: ptr(false), Chain: solcfg.Chain{}, Nodes: []*solcfg.Node{}, }, }` $DIR/core/cmd/shell_test.go: `c.Solana = solcfg.TOMLConfigs{ &solcfg.TOMLConfig{ ChainID: ptr[string]("solana-id-1"), Enabled: ptr(true), Chain: solcfg.Chain{}, Nodes: []*solcfg.Node{}, }, }` $DIR/core/cmd/shell_test.go: `t.Run("no plugin", func(t *testing.T) { relayers, err := rf.NewSolana(ks, tConfig.SolanaConfigs()) require.NoError(t, err) require.NotNil(t, relayers) require.Len(t, relayers, nEnabledChains) // no using plugin, so registry should be empty require.Len(t, reg.List(), 0) })` $DIR/core/cmd/shell_test.go: `t.Run("plugin", func(t *testing.T) { t.Setenv("CL_SOLANA_CMD", "phony_solana_cmd") relayers, err := rf.NewSolana(ks, tConfig.SolanaConfigs()) require.NoError(t, err) require.NotNil(t, relayers) require.Len(t, relayers, nEnabledChains) // make sure registry has the plugin require.Len(t, reg.List(), nEnabledChains) })` $DIR/core/cmd/shell_test.go: `t.Setenv("CL_SOLANA_CMD", "phony_solana_cmd")` $DIR/core/cmd/shell_test.go: `c.Solana = solcfg.TOMLConfigs{ &solcfg.TOMLConfig{ ChainID: ptr[string]("dupe"), Enabled: ptr(true), Chain: solcfg.Chain{}, Nodes: []*solcfg.Node{}, }, &solcfg.TOMLConfig{ ChainID: ptr[string]("dupe"), Enabled: ptr(true), Chain: solcfg.Chain{}, Nodes: []*solcfg.Node{}, }, }` $DIR/core/cmd/shell_test.go: `t.Run("no plugin, duplicate chains", func(t *testing.T) { _, err := rf.NewSolana(ks, duplicateConfig.SolanaConfigs()) require.Error(t, err) })` $DIR/core/cmd/shell_test.go: `t.Run("plugin, duplicate chains", func(t *testing.T) { t.Setenv("CL_SOLANA_CMD", "phony_solana_cmd") _, err := rf.NewSolana(ks, duplicateConfig.SolanaConfigs()) require.Error(t, err) })` $DIR/core/cmd/shell_test.go: `t.Setenv("CL_SOLANA_CMD", "phony_solana_cmd")` $DIR/core/cmd/shell_test.go: `t.Run("plugin env parsing fails", func(t *testing.T) { t.Setenv("CL_SOLANA_CMD", "phony_solana_cmd") t.Setenv("CL_SOLANA_ENV", "fake_path") _, err := rf.NewSolana(ks, t2Config.SolanaConfigs()) require.Error(t, err) require.Contains(t, err.Error(), "failed to parse Solana env file") })` $DIR/core/cmd/shell_test.go: `t.Setenv("CL_SOLANA_CMD", "phony_solana_cmd")` $DIR/core/cmd/shell_test.go: `t.Setenv("CL_SOLANA_ENV", "fake_path")` $DIR/core/cmd/shell_test.go: `t.Setenv("CL_SOLANA_CMD", "phony_solana_cmd")` $DIR/core/cmd/shell_test.go: `c.Starknet = stkcfg.TOMLConfigs{ &stkcfg.TOMLConfig{ ChainID: ptr[string]("starknet-id-1"), Enabled: ptr(true), Chain: stkcfg.Chain{}, Nodes: []*stkcfg.Node{}, FeederURL: commoncfg.MustParseURL("https://feeder.url"), }, &stkcfg.TOMLConfig{ ChainID: ptr[string]("starknet-id-2"), Enabled: ptr(true), Chain: stkcfg.Chain{}, Nodes: []*stkcfg.Node{}, FeederURL: commoncfg.MustParseURL("https://feeder.url"), }, &stkcfg.TOMLConfig{ ChainID: ptr[string]("disabled-starknet-id-1"), Enabled: ptr(false), Chain: stkcfg.Chain{}, Nodes: []*stkcfg.Node{}, FeederURL: commoncfg.MustParseURL("https://feeder.url"), }, }` $DIR/core/cmd/shell_test.go: `c.Starknet = stkcfg.TOMLConfigs{ &stkcfg.TOMLConfig{ ChainID: ptr[string]("starknet-id-3"), Enabled: ptr(true), Chain: stkcfg.Chain{}, Nodes: []*stkcfg.Node{}, FeederURL: commoncfg.MustParseURL("https://feeder.url"), }, }` $DIR/core/cmd/shell_test.go: `t.Run("no plugin", func(t *testing.T) { relayers, err := rf.NewStarkNet(ks, tConfig.StarknetConfigs()) require.NoError(t, err) require.NotNil(t, relayers) require.Len(t, relayers, nEnabledChains) // no using plugin, so registry should be empty require.Len(t, reg.List(), 0) })` $DIR/core/cmd/shell_test.go: `t.Run("plugin", func(t *testing.T) { t.Setenv("CL_STARKNET_CMD", "phony_starknet_cmd") relayers, err := rf.NewStarkNet(ks, tConfig.StarknetConfigs()) require.NoError(t, err) require.NotNil(t, relayers) require.Len(t, relayers, nEnabledChains) // make sure registry has the plugin require.Len(t, reg.List(), nEnabledChains) })` $DIR/core/cmd/shell_test.go: `t.Setenv("CL_STARKNET_CMD", "phony_starknet_cmd")` $DIR/core/cmd/shell_test.go: `c.Starknet = stkcfg.TOMLConfigs{ &stkcfg.TOMLConfig{ ChainID: ptr[string]("dupe"), Enabled: ptr(true), Chain: stkcfg.Chain{}, Nodes: []*stkcfg.Node{}, FeederURL: commoncfg.MustParseURL("https://feeder.url"), }, &stkcfg.TOMLConfig{ ChainID: ptr[string]("dupe"), Enabled: ptr(true), Chain: stkcfg.Chain{}, Nodes: []*stkcfg.Node{}, FeederURL: commoncfg.MustParseURL("https://feeder.url"), }, }` $DIR/core/cmd/shell_test.go: `t.Run("no plugin, duplicate chains", func(t *testing.T) { _, err := rf.NewStarkNet(ks, duplicateConfig.StarknetConfigs()) require.Error(t, err) })` $DIR/core/cmd/shell_test.go: `t.Run("plugin, duplicate chains", func(t *testing.T) { t.Setenv("CL_STARKNET_CMD", "phony_starknet_cmd") _, err := rf.NewStarkNet(ks, duplicateConfig.StarknetConfigs()) require.Error(t, err) })` $DIR/core/cmd/shell_test.go: `t.Setenv("CL_STARKNET_CMD", "phony_starknet_cmd")` $DIR/core/cmd/shell_test.go: `t.Run("plugin env parsing fails", func(t *testing.T) { t.Setenv("CL_STARKNET_CMD", "phony_starknet_cmd") t.Setenv("CL_STARKNET_ENV", "fake_path") _, err := rf.NewStarkNet(ks, t2Config.StarknetConfigs()) require.Error(t, err) require.Contains(t, err.Error(), "failed to parse Starknet env file") })` $DIR/core/cmd/shell_test.go: `t.Setenv("CL_STARKNET_CMD", "phony_starknet_cmd")` $DIR/core/cmd/shell_test.go: `t.Setenv("CL_STARKNET_ENV", "fake_path")` $DIR/core/cmd/shell_test.go: `t.Setenv("CL_STARKNET_CMD", "phony_starknet_cmd")` $DIR/core/cmd/shell_test.go: `.Context(t)` $DIR/core/cmd/shell_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/cmd/shell_test.go: `.NewUserWithSession(t, app.AuthenticationProvider())` $DIR/core/cmd/shell_test.go: `.AuthenticationProvider()` $DIR/core/cmd/shell_test.go: `.Run(test.name, func(t *testing.T) { sr := sessions.SessionRequest{Email: test.email, Password: test.pwd} store := &cmd.MemoryCookieStore{} tca := cmd.NewSessionCookieAuthenticator(cmd.ClientOpts{}, store, logger.TestLogger(t)) cookie, err := tca.Authenticate(ctx, sr) assert.Error(t, err) assert.Nil(t, cookie) cookie, err = store.Retrieve() assert.NoError(t, err) assert.Nil(t, cookie) })` $DIR/core/cmd/shell_test.go: `.NewSessionCookieAuthenticator(cmd.ClientOpts{}, store, logger.TestLogger(t))` $DIR/core/cmd/shell_test.go: `.TestLogger(t)` $DIR/core/cmd/shell_test.go: `.Authenticate(ctx, sr)` $DIR/core/cmd/shell_test.go: `.Retrieve()` $DIR/core/cmd/shell_test.go: `.Context(t)` $DIR/core/cmd/shell_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/cmd/shell_test.go: `.NewUserWithSession(t, app.AuthenticationProvider())` $DIR/core/cmd/shell_test.go: `.AuthenticationProvider()` $DIR/core/cmd/shell_test.go: `.Run(test.name, func(t *testing.T) { sr := sessions.SessionRequest{Email: test.email, Password: test.pwd} store := &cmd.MemoryCookieStore{} tca := cmd.NewSessionCookieAuthenticator(app.NewClientOpts(), store, logger.TestLogger(t)) cookie, err := tca.Authenticate(ctx, sr) if test.wantError { assert.Error(t, err) assert.Nil(t, cookie) cookie, err = store.Retrieve() assert.NoError(t, err) assert.Nil(t, cookie) } else { assert.NoError(t, err) assert.NotNil(t, cookie) retrievedCookie, err := store.Retrieve() assert.NoError(t, err) assert.Equal(t, cookie, retrievedCookie) } })` $DIR/core/cmd/shell_test.go: `.NewSessionCookieAuthenticator(app.NewClientOpts(), store, logger.TestLogger(t))` $DIR/core/cmd/shell_test.go: `.NewClientOpts()` $DIR/core/cmd/shell_test.go: `.TestLogger(t)` $DIR/core/cmd/shell_test.go: `.Authenticate(ctx, sr)` $DIR/core/cmd/shell_test.go: `.Retrieve()` $DIR/core/cmd/shell_test.go: `.Retrieve()` $DIR/core/cmd/shell_test.go: `.Run("missing cookie file", func(t *testing.T) { store := cmd.DiskCookieStore{Config: cfg} cookie, err := store.Retrieve() assert.NoError(t, err) assert.Nil(t, cookie) })` $DIR/core/cmd/shell_test.go: `.Retrieve()` $DIR/core/cmd/shell_test.go: `.Run("invalid cookie file", func(t *testing.T) { cfg.rootdir = "../internal/fixtures/badcookie" store := cmd.DiskCookieStore{Config: cfg} cookie, err := store.Retrieve() assert.Error(t, err) assert.Nil(t, cookie) })` $DIR/core/cmd/shell_test.go: `.Retrieve()` $DIR/core/cmd/shell_test.go: `.Retrieve()` $DIR/core/cmd/shell_test.go: `.Run(test.name, func(t *testing.T) { ctx := testutils.Context(t) db := pgtest.NewSqlxDB(t) lggr := logger.TestLogger(t) orm := localauth.NewORM(db, time.Minute, lggr, audit.NoopLogger) mock := &cltest.MockCountingPrompter{T: t, EnteredStrings: test.enteredStrings, NotTerminal: !test.isTerminal} tai := cmd.NewPromptingAPIInitializer(mock) // Clear out fixture users/users created from the other test cases // This asserts that on initial run with an empty users table that the credentials file will instantiate and // create/run with a new admin user pgtest.MustExec(t, db, "DELETE FROM users;") user, err := tai.Initialize(ctx, orm, lggr) if test.isError { assert.Error(t, err) } else { assert.NoError(t, err) assert.Equal(t, len(test.enteredStrings), mock.Count) persistedUser, err := orm.FindUser(ctx, email) assert.NoError(t, err) assert.Equal(t, user.Email, persistedUser.Email) assert.Equal(t, user.HashedPassword, persistedUser.HashedPassword) } })` $DIR/core/cmd/shell_test.go: `.Context(t)` $DIR/core/cmd/shell_test.go: `.NewSqlxDB(t)` $DIR/core/cmd/shell_test.go: `.TestLogger(t)` $DIR/core/cmd/shell_test.go: `.NewORM(db, time.Minute, lggr, audit.NoopLogger)` $DIR/core/cmd/shell_test.go: `.NewPromptingAPIInitializer(mock)` $DIR/core/cmd/shell_test.go: `.MustExec(t, db, "DELETE FROM users;")` $DIR/core/cmd/shell_test.go: `.Initialize(ctx, orm, lggr)` $DIR/core/cmd/shell_test.go: `.FindUser(ctx, email)` $DIR/core/cmd/shell_test.go: `.Context(t)` $DIR/core/cmd/shell_test.go: `.NewSqlxDB(t)` $DIR/core/cmd/shell_test.go: `.TestLogger(t)` $DIR/core/cmd/shell_test.go: `.NewORM(db, time.Minute, lggr, audit.NoopLogger)` $DIR/core/cmd/shell_test.go: `.Exec("DELETE FROM users;")` $DIR/core/cmd/shell_test.go: `.MustRandomUser(t)` $DIR/core/cmd/shell_test.go: `.NewPromptingAPIInitializer(mock)` $DIR/core/cmd/shell_test.go: `.Initialize(ctx, orm, lggr)` $DIR/core/cmd/shell_test.go: `.Run(test.name, func(t *testing.T) { ctx := testutils.Context(t) db := pgtest.NewSqlxDB(t) lggr := logger.TestLogger(t) orm := localauth.NewORM(db, time.Minute, lggr, audit.NoopLogger) // Clear out fixture users/users created from the other test cases // This asserts that on initial run with an empty users table that the credentials file will instantiate and // create/run with a new admin user pgtest.MustExec(t, db, "DELETE FROM users;") tfi := cmd.NewFileAPIInitializer(test.file) user, err := tfi.Initialize(ctx, orm, lggr) if test.wantError { assert.Error(t, err) } else { assert.NoError(t, err) assert.Equal(t, cltest.APIEmailAdmin, user.Email) persistedUser, err := orm.FindUser(ctx, user.Email) assert.NoError(t, err) assert.Equal(t, persistedUser.Email, user.Email) } })` $DIR/core/cmd/shell_test.go: `.Context(t)` $DIR/core/cmd/shell_test.go: `.NewSqlxDB(t)` $DIR/core/cmd/shell_test.go: `.TestLogger(t)` $DIR/core/cmd/shell_test.go: `.NewORM(db, time.Minute, lggr, audit.NoopLogger)` $DIR/core/cmd/shell_test.go: `.MustExec(t, db, "DELETE FROM users;")` $DIR/core/cmd/shell_test.go: `.NewFileAPIInitializer(test.file)` $DIR/core/cmd/shell_test.go: `.Initialize(ctx, orm, lggr)` $DIR/core/cmd/shell_test.go: `.FindUser(ctx, user.Email)` $DIR/core/cmd/shell_test.go: `.NewSqlxDB(t)` $DIR/core/cmd/shell_test.go: `.NewORM(db, time.Minute, logger.TestLogger(t), audit.NoopLogger)` $DIR/core/cmd/shell_test.go: `.TestLogger(t)` $DIR/core/cmd/shell_test.go: `.Run(test.name, func(t *testing.T) { ctx := testutils.Context(t) lggr := logger.TestLogger(t) tfi := cmd.NewFileAPIInitializer(test.file) user, err := tfi.Initialize(ctx, orm, lggr) if test.wantError { assert.Error(t, err) } else { assert.NoError(t, err) assert.Equal(t, cltest.APIEmailAdmin, user.Email) } })` $DIR/core/cmd/shell_test.go: `.Context(t)` $DIR/core/cmd/shell_test.go: `.TestLogger(t)` $DIR/core/cmd/shell_test.go: `.NewFileAPIInitializer(test.file)` $DIR/core/cmd/shell_test.go: `.Initialize(ctx, orm, lggr)` $DIR/core/cmd/shell_test.go: `.Run(test.email, func(t *testing.T) { enteredStrings := []string{test.email, test.pwd} prompter := &cltest.MockCountingPrompter{T: t, EnteredStrings: enteredStrings} builder := cmd.NewPromptingSessionRequestBuilder(prompter) sr, err := builder.Build("") require.NoError(t, err) assert.Equal(t, test.email, sr.Email) assert.Equal(t, test.pwd, sr.Password) })` $DIR/core/cmd/shell_test.go: `.NewPromptingSessionRequestBuilder(prompter)` $DIR/core/cmd/shell_test.go: `.Build("")` $DIR/core/cmd/shell_test.go: `.NewFileSessionRequestBuilder(logger.TestLogger(t))` $DIR/core/cmd/shell_test.go: `.TestLogger(t)` $DIR/core/cmd/shell_test.go: `.Run(test.name, func(t *testing.T) { sr, err := builder.Build(test.file) assert.Equal(t, test.wantEmail, sr.Email) if test.wantError { assert.Error(t, err) } else { assert.NoError(t, err) } })` $DIR/core/cmd/shell_test.go: `.Build(test.file)` $DIR/core/cmd/shell_test.go: `.Int(rand.Reader, big.NewInt(256*1024*1024))` $DIR/core/cmd/shell_test.go: `.NewInt(256*1024*1024)` $DIR/core/cmd/shell_test.go: `.Base(fmt.Sprintf("%s-%d", t.Name(), r.Int64()))` $DIR/core/cmd/shell_test.go: `.Sprintf("%s-%d", t.Name(), r.Int64())` $DIR/core/cmd/shell_test.go: `.Name()` $DIR/core/cmd/shell_test.go: `.Int64()` $DIR/core/cmd/shell_test.go: `.TestLogger(t)` $DIR/core/cmd/shell_test.go: `.NewUserCache(subDir, func() logger.Logger { return lggr })` $DIR/core/cmd/shell_test.go: `.RootDir()` $DIR/core/cmd/shell_test.go: `.TestLogger(t)` $DIR/core/cmd/shell_test.go: `.NewLoopRegistry(lggr, nil)` $DIR/core/cmd/shell_test.go: `.NewSolana(t)` $DIR/core/cmd/shell_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Solana = solcfg.TOMLConfigs{ &solcfg.TOMLConfig{ ChainID: ptr[string]("solana-id-1"), Enabled: ptr(true), Chain: solcfg.Chain{}, Nodes: []*solcfg.Node{}, }, &solcfg.TOMLConfig{ ChainID: ptr[string]("solana-id-2"), Enabled: ptr(true), Chain: solcfg.Chain{}, Nodes: []*solcfg.Node{}, }, &solcfg.TOMLConfig{ ChainID: ptr[string]("disabled-solana-id-1"), Enabled: ptr(false), Chain: solcfg.Chain{}, Nodes: []*solcfg.Node{}, }, } })` $DIR/core/cmd/shell_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Solana = solcfg.TOMLConfigs{ &solcfg.TOMLConfig{ ChainID: ptr[string]("solana-id-1"), Enabled: ptr(true), Chain: solcfg.Chain{}, Nodes: []*solcfg.Node{}, }, } })` $DIR/core/cmd/shell_test.go: `.Run("no plugin", func(t *testing.T) { relayers, err := rf.NewSolana(ks, tConfig.SolanaConfigs()) require.NoError(t, err) require.NotNil(t, relayers) require.Len(t, relayers, nEnabledChains) // no using plugin, so registry should be empty require.Len(t, reg.List(), 0) })` $DIR/core/cmd/shell_test.go: `.NewSolana(ks, tConfig.SolanaConfigs())` $DIR/core/cmd/shell_test.go: `.SolanaConfigs()` $DIR/core/cmd/shell_test.go: `.Run("plugin", func(t *testing.T) { t.Setenv("CL_SOLANA_CMD", "phony_solana_cmd") relayers, err := rf.NewSolana(ks, tConfig.SolanaConfigs()) require.NoError(t, err) require.NotNil(t, relayers) require.Len(t, relayers, nEnabledChains) // make sure registry has the plugin require.Len(t, reg.List(), nEnabledChains) })` $DIR/core/cmd/shell_test.go: `.Setenv("CL_SOLANA_CMD", "phony_solana_cmd")` $DIR/core/cmd/shell_test.go: `.NewSolana(ks, tConfig.SolanaConfigs())` $DIR/core/cmd/shell_test.go: `.SolanaConfigs()` $DIR/core/cmd/shell_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Solana = solcfg.TOMLConfigs{ &solcfg.TOMLConfig{ ChainID: ptr[string]("dupe"), Enabled: ptr(true), Chain: solcfg.Chain{}, Nodes: []*solcfg.Node{}, }, &solcfg.TOMLConfig{ ChainID: ptr[string]("dupe"), Enabled: ptr(true), Chain: solcfg.Chain{}, Nodes: []*solcfg.Node{}, }, } })` $DIR/core/cmd/shell_test.go: `.Run("no plugin, duplicate chains", func(t *testing.T) { _, err := rf.NewSolana(ks, duplicateConfig.SolanaConfigs()) require.Error(t, err) })` $DIR/core/cmd/shell_test.go: `.NewSolana(ks, duplicateConfig.SolanaConfigs())` $DIR/core/cmd/shell_test.go: `.SolanaConfigs()` $DIR/core/cmd/shell_test.go: `.Run("plugin, duplicate chains", func(t *testing.T) { t.Setenv("CL_SOLANA_CMD", "phony_solana_cmd") _, err := rf.NewSolana(ks, duplicateConfig.SolanaConfigs()) require.Error(t, err) })` $DIR/core/cmd/shell_test.go: `.Setenv("CL_SOLANA_CMD", "phony_solana_cmd")` $DIR/core/cmd/shell_test.go: `.NewSolana(ks, duplicateConfig.SolanaConfigs())` $DIR/core/cmd/shell_test.go: `.SolanaConfigs()` $DIR/core/cmd/shell_test.go: `.Run("plugin env parsing fails", func(t *testing.T) { t.Setenv("CL_SOLANA_CMD", "phony_solana_cmd") t.Setenv("CL_SOLANA_ENV", "fake_path") _, err := rf.NewSolana(ks, t2Config.SolanaConfigs()) require.Error(t, err) require.Contains(t, err.Error(), "failed to parse Solana env file") })` $DIR/core/cmd/shell_test.go: `.Setenv("CL_SOLANA_CMD", "phony_solana_cmd")` $DIR/core/cmd/shell_test.go: `.Setenv("CL_SOLANA_ENV", "fake_path")` $DIR/core/cmd/shell_test.go: `.NewSolana(ks, t2Config.SolanaConfigs())` $DIR/core/cmd/shell_test.go: `.SolanaConfigs()` $DIR/core/cmd/shell_test.go: `.Setenv("CL_SOLANA_CMD", "phony_solana_cmd")` $DIR/core/cmd/shell_test.go: `.NewSolana(ks, tConfig.SolanaConfigs())` $DIR/core/cmd/shell_test.go: `.SolanaConfigs()` $DIR/core/cmd/shell_test.go: `.TestLogger(t)` $DIR/core/cmd/shell_test.go: `.NewLoopRegistry(lggr, nil)` $DIR/core/cmd/shell_test.go: `.NewStarkNet(t)` $DIR/core/cmd/shell_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Starknet = stkcfg.TOMLConfigs{ &stkcfg.TOMLConfig{ ChainID: ptr[string]("starknet-id-1"), Enabled: ptr(true), Chain: stkcfg.Chain{}, Nodes: []*stkcfg.Node{}, FeederURL: commoncfg.MustParseURL("https://feeder.url"), }, &stkcfg.TOMLConfig{ ChainID: ptr[string]("starknet-id-2"), Enabled: ptr(true), Chain: stkcfg.Chain{}, Nodes: []*stkcfg.Node{}, FeederURL: commoncfg.MustParseURL("https://feeder.url"), }, &stkcfg.TOMLConfig{ ChainID: ptr[string]("disabled-starknet-id-1"), Enabled: ptr(false), Chain: stkcfg.Chain{}, Nodes: []*stkcfg.Node{}, FeederURL: commoncfg.MustParseURL("https://feeder.url"), }, } })` $DIR/core/cmd/shell_test.go: `.MustParseURL("https://feeder.url")` $DIR/core/cmd/shell_test.go: `.MustParseURL("https://feeder.url")` $DIR/core/cmd/shell_test.go: `.MustParseURL("https://feeder.url")` $DIR/core/cmd/shell_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Starknet = stkcfg.TOMLConfigs{ &stkcfg.TOMLConfig{ ChainID: ptr[string]("starknet-id-3"), Enabled: ptr(true), Chain: stkcfg.Chain{}, Nodes: []*stkcfg.Node{}, FeederURL: commoncfg.MustParseURL("https://feeder.url"), }, } })` $DIR/core/cmd/shell_test.go: `.MustParseURL("https://feeder.url")` $DIR/core/cmd/shell_test.go: `.Run("no plugin", func(t *testing.T) { relayers, err := rf.NewStarkNet(ks, tConfig.StarknetConfigs()) require.NoError(t, err) require.NotNil(t, relayers) require.Len(t, relayers, nEnabledChains) // no using plugin, so registry should be empty require.Len(t, reg.List(), 0) })` $DIR/core/cmd/shell_test.go: `.NewStarkNet(ks, tConfig.StarknetConfigs())` $DIR/core/cmd/shell_test.go: `.StarknetConfigs()` $DIR/core/cmd/shell_test.go: `.Run("plugin", func(t *testing.T) { t.Setenv("CL_STARKNET_CMD", "phony_starknet_cmd") relayers, err := rf.NewStarkNet(ks, tConfig.StarknetConfigs()) require.NoError(t, err) require.NotNil(t, relayers) require.Len(t, relayers, nEnabledChains) // make sure registry has the plugin require.Len(t, reg.List(), nEnabledChains) })` $DIR/core/cmd/shell_test.go: `.Setenv("CL_STARKNET_CMD", "phony_starknet_cmd")` $DIR/core/cmd/shell_test.go: `.NewStarkNet(ks, tConfig.StarknetConfigs())` $DIR/core/cmd/shell_test.go: `.StarknetConfigs()` $DIR/core/cmd/shell_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Starknet = stkcfg.TOMLConfigs{ &stkcfg.TOMLConfig{ ChainID: ptr[string]("dupe"), Enabled: ptr(true), Chain: stkcfg.Chain{}, Nodes: []*stkcfg.Node{}, FeederURL: commoncfg.MustParseURL("https://feeder.url"), }, &stkcfg.TOMLConfig{ ChainID: ptr[string]("dupe"), Enabled: ptr(true), Chain: stkcfg.Chain{}, Nodes: []*stkcfg.Node{}, FeederURL: commoncfg.MustParseURL("https://feeder.url"), }, } })` $DIR/core/cmd/shell_test.go: `.MustParseURL("https://feeder.url")` $DIR/core/cmd/shell_test.go: `.MustParseURL("https://feeder.url")` $DIR/core/cmd/shell_test.go: `.Run("no plugin, duplicate chains", func(t *testing.T) { _, err := rf.NewStarkNet(ks, duplicateConfig.StarknetConfigs()) require.Error(t, err) })` $DIR/core/cmd/shell_test.go: `.NewStarkNet(ks, duplicateConfig.StarknetConfigs())` $DIR/core/cmd/shell_test.go: `.StarknetConfigs()` $DIR/core/cmd/shell_test.go: `.Run("plugin, duplicate chains", func(t *testing.T) { t.Setenv("CL_STARKNET_CMD", "phony_starknet_cmd") _, err := rf.NewStarkNet(ks, duplicateConfig.StarknetConfigs()) require.Error(t, err) })` $DIR/core/cmd/shell_test.go: `.Setenv("CL_STARKNET_CMD", "phony_starknet_cmd")` $DIR/core/cmd/shell_test.go: `.NewStarkNet(ks, duplicateConfig.StarknetConfigs())` $DIR/core/cmd/shell_test.go: `.StarknetConfigs()` $DIR/core/cmd/shell_test.go: `.Run("plugin env parsing fails", func(t *testing.T) { t.Setenv("CL_STARKNET_CMD", "phony_starknet_cmd") t.Setenv("CL_STARKNET_ENV", "fake_path") _, err := rf.NewStarkNet(ks, t2Config.StarknetConfigs()) require.Error(t, err) require.Contains(t, err.Error(), "failed to parse Starknet env file") })` $DIR/core/cmd/shell_test.go: `.Setenv("CL_STARKNET_CMD", "phony_starknet_cmd")` $DIR/core/cmd/shell_test.go: `.Setenv("CL_STARKNET_ENV", "fake_path")` $DIR/core/cmd/shell_test.go: `.NewStarkNet(ks, t2Config.StarknetConfigs())` $DIR/core/cmd/shell_test.go: `.StarknetConfigs()` $DIR/core/cmd/shell_test.go: `.Setenv("CL_STARKNET_CMD", "phony_starknet_cmd")` $DIR/core/cmd/shell_test.go: `.NewStarkNet(ks, tConfig.StarknetConfigs())` $DIR/core/cmd/shell_test.go: `.StarknetConfigs()` $DIR/core/cmd/solana_chains_commands_test.go: `.RandomChainID()` $DIR/core/cmd/solana_chains_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/solana_keys_commands_test.go: `buffer.Reset()` $DIR/core/cmd/solana_keys_commands_test.go: `output = buffer.String()` $DIR/core/cmd/solana_keys_commands_test.go: `requireSolanaKeyCount(t, app, 0)` $DIR/core/cmd/solana_keys_commands_test.go: `t.Run("ListSolanaKeys", func(tt *testing.T) { defer cleanup() ctx := testutils.Context(t) client, r := app.NewShellAndRenderer() key, err := app.GetKeyStore().Solana().Create(ctx) require.NoError(t, err) requireSolanaKeyCount(t, app, 1) assert.Nil(t, cmd.NewSolanaKeysClient(client).ListKeys(cltest.EmptyCLIContext())) require.Equal(t, 1, len(r.Renders)) keys := *r.Renders[0].(*cmd.SolanaKeyPresenters) assert.True(t, key.PublicKeyStr() == keys[0].PubKey) })` $DIR/core/cmd/solana_keys_commands_test.go: `requireSolanaKeyCount(t, app, 1)` $DIR/core/cmd/solana_keys_commands_test.go: `t.Run("CreateSolanaKey", func(tt *testing.T) { defer cleanup() client, _ := app.NewShellAndRenderer() require.NoError(t, cmd.NewSolanaKeysClient(client).CreateKey(nilContext)) keys, err := app.GetKeyStore().Solana().GetAll() require.NoError(t, err) require.Len(t, keys, 1) })` $DIR/core/cmd/solana_keys_commands_test.go: `t.Run("DeleteSolanaKey", func(tt *testing.T) { defer cleanup() ctx := testutils.Context(t) client, _ := app.NewShellAndRenderer() key, err := app.GetKeyStore().Solana().Create(ctx) require.NoError(t, err) requireSolanaKeyCount(t, app, 1) set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(cmd.NewSolanaKeysClient(client).DeleteKey, set, "solana") require.NoError(tt, set.Set("yes", "true")) strID := key.ID() err = set.Parse([]string{strID}) require.NoError(t, err) c := cli.NewContext(nil, set, nil) err = cmd.NewSolanaKeysClient(client).DeleteKey(c) require.NoError(t, err) requireSolanaKeyCount(t, app, 0) })` $DIR/core/cmd/solana_keys_commands_test.go: `requireSolanaKeyCount(t, app, 1)` $DIR/core/cmd/solana_keys_commands_test.go: `flagSetApplyFromAction(cmd.NewSolanaKeysClient(client).DeleteKey, set, "solana")` $DIR/core/cmd/solana_keys_commands_test.go: `err = set.Parse([]string{strID})` $DIR/core/cmd/solana_keys_commands_test.go: `err = cmd.NewSolanaKeysClient(client).DeleteKey(c)` $DIR/core/cmd/solana_keys_commands_test.go: `requireSolanaKeyCount(t, app, 0)` $DIR/core/cmd/solana_keys_commands_test.go: `flagSetApplyFromAction(cmd.NewSolanaKeysClient(client).ExportKey, set, "solana")` $DIR/core/cmd/solana_keys_commands_test.go: `err = cmd.NewSolanaKeysClient(client).ExportKey(c)` $DIR/core/cmd/solana_keys_commands_test.go: `set = flag.NewFlagSet("test Solana export", 0)` $DIR/core/cmd/solana_keys_commands_test.go: `flagSetApplyFromAction(cmd.NewSolanaKeysClient(client).ExportKey, set, "solana")` $DIR/core/cmd/solana_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/solana_keys_commands_test.go: `requireSolanaKeyCount(t, app, 0)` $DIR/core/cmd/solana_keys_commands_test.go: `set = flag.NewFlagSet("test Solana import", 0)` $DIR/core/cmd/solana_keys_commands_test.go: `flagSetApplyFromAction(cmd.NewSolanaKeysClient(client).ImportKey, set, "solana")` $DIR/core/cmd/solana_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/solana_keys_commands_test.go: `requireSolanaKeyCount(t, app, 1)` $DIR/core/cmd/solana_keys_commands_test.go: `.NewBufferString("")` $DIR/core/cmd/solana_keys_commands_test.go: `.NewJAID(id)` $DIR/core/cmd/solana_keys_commands_test.go: `.String()` $DIR/core/cmd/solana_keys_commands_test.go: `.Reset()` $DIR/core/cmd/solana_keys_commands_test.go: `.String()` $DIR/core/cmd/solana_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/solana_keys_commands_test.go: `.Solana()` $DIR/core/cmd/solana_keys_commands_test.go: `.Background()` $DIR/core/cmd/solana_keys_commands_test.go: `.GetAll()` $DIR/core/cmd/solana_keys_commands_test.go: `.Run("ListSolanaKeys", func(tt *testing.T) { defer cleanup() ctx := testutils.Context(t) client, r := app.NewShellAndRenderer() key, err := app.GetKeyStore().Solana().Create(ctx) require.NoError(t, err) requireSolanaKeyCount(t, app, 1) assert.Nil(t, cmd.NewSolanaKeysClient(client).ListKeys(cltest.EmptyCLIContext())) require.Equal(t, 1, len(r.Renders)) keys := *r.Renders[0].(*cmd.SolanaKeyPresenters) assert.True(t, key.PublicKeyStr() == keys[0].PubKey) })` $DIR/core/cmd/solana_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/solana_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/solana_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/solana_keys_commands_test.go: `.Solana()` $DIR/core/cmd/solana_keys_commands_test.go: `.Create(ctx)` $DIR/core/cmd/solana_keys_commands_test.go: `.Run("CreateSolanaKey", func(tt *testing.T) { defer cleanup() client, _ := app.NewShellAndRenderer() require.NoError(t, cmd.NewSolanaKeysClient(client).CreateKey(nilContext)) keys, err := app.GetKeyStore().Solana().GetAll() require.NoError(t, err) require.Len(t, keys, 1) })` $DIR/core/cmd/solana_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/solana_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/solana_keys_commands_test.go: `.Solana()` $DIR/core/cmd/solana_keys_commands_test.go: `.GetAll()` $DIR/core/cmd/solana_keys_commands_test.go: `.Run("DeleteSolanaKey", func(tt *testing.T) { defer cleanup() ctx := testutils.Context(t) client, _ := app.NewShellAndRenderer() key, err := app.GetKeyStore().Solana().Create(ctx) require.NoError(t, err) requireSolanaKeyCount(t, app, 1) set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(cmd.NewSolanaKeysClient(client).DeleteKey, set, "solana") require.NoError(tt, set.Set("yes", "true")) strID := key.ID() err = set.Parse([]string{strID}) require.NoError(t, err) c := cli.NewContext(nil, set, nil) err = cmd.NewSolanaKeysClient(client).DeleteKey(c) require.NoError(t, err) requireSolanaKeyCount(t, app, 0) })` $DIR/core/cmd/solana_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/solana_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/solana_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/solana_keys_commands_test.go: `.Solana()` $DIR/core/cmd/solana_keys_commands_test.go: `.Create(ctx)` $DIR/core/cmd/solana_keys_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/solana_keys_commands_test.go: `.NewSolanaKeysClient(client)` $DIR/core/cmd/solana_keys_commands_test.go: `.ID()` $DIR/core/cmd/solana_keys_commands_test.go: `.Parse([]string{strID})` $DIR/core/cmd/solana_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/solana_keys_commands_test.go: `.NewSolanaKeysClient(client)` $DIR/core/cmd/solana_keys_commands_test.go: `.DeleteKey(c)` $DIR/core/cmd/solana_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/solana_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/solana_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/solana_keys_commands_test.go: `.Solana()` $DIR/core/cmd/solana_keys_commands_test.go: `.Create(ctx)` $DIR/core/cmd/solana_keys_commands_test.go: `.NewFlagSet("test Solana export", 0)` $DIR/core/cmd/solana_keys_commands_test.go: `.NewSolanaKeysClient(client)` $DIR/core/cmd/solana_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/solana_keys_commands_test.go: `.NewSolanaKeysClient(client)` $DIR/core/cmd/solana_keys_commands_test.go: `.ExportKey(c)` $DIR/core/cmd/solana_keys_commands_test.go: `.NewFlagSet("test Solana export", 0)` $DIR/core/cmd/solana_keys_commands_test.go: `.NewSolanaKeysClient(client)` $DIR/core/cmd/solana_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/solana_keys_commands_test.go: `.NewFlagSet("test Solana import", 0)` $DIR/core/cmd/solana_keys_commands_test.go: `.NewSolanaKeysClient(client)` $DIR/core/cmd/solana_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/solana_node_commands_test.go: `assertTableRenders(t, r)` $DIR/core/cmd/solana_node_commands_test.go: `.RandomChainID()` $DIR/core/cmd/solana_node_commands_test.go: `.MustParseURL("https://solana1.example")` $DIR/core/cmd/solana_node_commands_test.go: `.MustParseURL("https://solana2.example")` $DIR/core/cmd/solana_node_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/solana_node_commands_test.go: `.Marshal(node1)` $DIR/core/cmd/solana_node_commands_test.go: `.Marshal(node2)` $DIR/core/cmd/solana_node_commands_test.go: `.Split(b.String(), "\n")` $DIR/core/cmd/solana_node_commands_test.go: `.String()` $DIR/core/cmd/solana_transaction_commands_test.go: `solanaClient.FundTestAccounts(t, []solanago.PublicKey{from.PublicKey()}, url)` $DIR/core/cmd/solana_transaction_commands_test.go: `t.Run(tt.amount, func(t *testing.T) { startBal, err := balance(from.PublicKey(), url) require.NoError(t, err) set := flag.NewFlagSet("sendsolcoins", 0) flagSetApplyFromAction(client.SolanaSendSol, set, "solana") require.NoError(t, set.Set("id", chainID)) require.NoError(t, set.Parse([]string{tt.amount, from.PublicKey().String(), to.PublicKey().String()})) c := cli.NewContext(cliapp, set, nil) err = client.SolanaSendSol(c) if tt.expErr == "" { require.NoError(t, err) } else { require.Error(t, err) require.Contains(t, err.Error(), tt.expErr) return } // Check CLI output require.Greater(t, len(r.Renders), 0) renderer := r.Renders[len(r.Renders)-1] renderedMsg := renderer.(*cmd.SolanaMsgPresenter) t.Logf("%+v\n", renderedMsg) require.NotEmpty(t, renderedMsg.ID) assert.Equal(t, chainID, renderedMsg.ChainID) assert.Equal(t, from.PublicKey().String(), renderedMsg.From) assert.Equal(t, to.PublicKey().String(), renderedMsg.To) assert.Equal(t, tt.amount, strconv.FormatUint(renderedMsg.Amount, 10)) // wait for updated balance updated := false endBal := uint64(0) for i := 0; i < 5; i++ { time.Sleep(time.Second) // wait for tx execution // Check balance endBal, err = balance(from.PublicKey(), url) require.NoError(t, err) require.NoError(t, err) // exit if difference found if endBal != startBal { updated = true break } } require.True(t, updated, "end bal == start bal, transaction likely not succeeded") // Check balance if assert.NotEqual(t, 0, startBal) && assert.NotEqual(t, 0, endBal) { diff := startBal - endBal receiveBal, err := balance(to.PublicKey(), url) require.NoError(t, err) assert.Equal(t, tt.amount, strconv.FormatUint(receiveBal, 10)) assert.Greater(t, diff, receiveBal) } })` $DIR/core/cmd/solana_transaction_commands_test.go: `flagSetApplyFromAction(client.SolanaSendSol, set, "solana")` $DIR/core/cmd/solana_transaction_commands_test.go: `err = client.SolanaSendSol(c)` $DIR/core/cmd/solana_transaction_commands_test.go: `time.Sleep(time.Second)` $DIR/core/cmd/solana_transaction_commands_test.go: `endBal, err = balance(from.PublicKey(), url)` $DIR/core/cmd/solana_transaction_commands_test.go: `updated = true` $DIR/core/cmd/solana_transaction_commands_test.go: `.Context(t)` $DIR/core/cmd/solana_transaction_commands_test.go: `.SetupLocalSolNode(t)` $DIR/core/cmd/solana_transaction_commands_test.go: `.Name()` $DIR/core/cmd/solana_transaction_commands_test.go: `.MustParseURL(url)` $DIR/core/cmd/solana_transaction_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/solana_transaction_commands_test.go: `.Solana()` $DIR/core/cmd/solana_transaction_commands_test.go: `.Create(ctx)` $DIR/core/cmd/solana_transaction_commands_test.go: `.NewRandomPrivateKey()` $DIR/core/cmd/solana_transaction_commands_test.go: `.FundTestAccounts(t, []solanago.PublicKey{from.PublicKey()}, url)` $DIR/core/cmd/solana_transaction_commands_test.go: `.PublicKey()` $DIR/core/cmd/solana_transaction_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/solana_transaction_commands_test.go: `.NewApp()` $DIR/core/cmd/solana_transaction_commands_test.go: `.Run(tt.amount, func(t *testing.T) { startBal, err := balance(from.PublicKey(), url) require.NoError(t, err) set := flag.NewFlagSet("sendsolcoins", 0) flagSetApplyFromAction(client.SolanaSendSol, set, "solana") require.NoError(t, set.Set("id", chainID)) require.NoError(t, set.Parse([]string{tt.amount, from.PublicKey().String(), to.PublicKey().String()})) c := cli.NewContext(cliapp, set, nil) err = client.SolanaSendSol(c) if tt.expErr == "" { require.NoError(t, err) } else { require.Error(t, err) require.Contains(t, err.Error(), tt.expErr) return } // Check CLI output require.Greater(t, len(r.Renders), 0) renderer := r.Renders[len(r.Renders)-1] renderedMsg := renderer.(*cmd.SolanaMsgPresenter) t.Logf("%+v\n", renderedMsg) require.NotEmpty(t, renderedMsg.ID) assert.Equal(t, chainID, renderedMsg.ChainID) assert.Equal(t, from.PublicKey().String(), renderedMsg.From) assert.Equal(t, to.PublicKey().String(), renderedMsg.To) assert.Equal(t, tt.amount, strconv.FormatUint(renderedMsg.Amount, 10)) // wait for updated balance updated := false endBal := uint64(0) for i := 0; i < 5; i++ { time.Sleep(time.Second) // wait for tx execution // Check balance endBal, err = balance(from.PublicKey(), url) require.NoError(t, err) require.NoError(t, err) // exit if difference found if endBal != startBal { updated = true break } } require.True(t, updated, "end bal == start bal, transaction likely not succeeded") // Check balance if assert.NotEqual(t, 0, startBal) && assert.NotEqual(t, 0, endBal) { diff := startBal - endBal receiveBal, err := balance(to.PublicKey(), url) require.NoError(t, err) assert.Equal(t, tt.amount, strconv.FormatUint(receiveBal, 10)) assert.Greater(t, diff, receiveBal) } })` $DIR/core/cmd/solana_transaction_commands_test.go: `.PublicKey()` $DIR/core/cmd/solana_transaction_commands_test.go: `.NewFlagSet("sendsolcoins", 0)` $DIR/core/cmd/solana_transaction_commands_test.go: `.NewContext(cliapp, set, nil)` $DIR/core/cmd/solana_transaction_commands_test.go: `.SolanaSendSol(c)` $DIR/core/cmd/solana_transaction_commands_test.go: `.Sleep(time.Second)` $DIR/core/cmd/solana_transaction_commands_test.go: `.PublicKey()` $DIR/core/cmd/solana_transaction_commands_test.go: `.PublicKey()` $DIR/core/cmd/starknet_keys_commands_test.go: `buffer.Reset()` $DIR/core/cmd/starknet_keys_commands_test.go: `output = buffer.String()` $DIR/core/cmd/starknet_keys_commands_test.go: `requireStarkNetKeyCount(t, app, 0)` $DIR/core/cmd/starknet_keys_commands_test.go: `t.Run("ListStarkNetKeys", func(tt *testing.T) { defer cleanup() ctx := testutils.Context(t) client, r := app.NewShellAndRenderer() key, err := app.GetKeyStore().StarkNet().Create(ctx) require.NoError(t, err) requireStarkNetKeyCount(t, app, 1) assert.Nil(t, cmd.NewStarkNetKeysClient(client).ListKeys(cltest.EmptyCLIContext())) require.Equal(t, 1, len(r.Renders)) keys := *r.Renders[0].(*cmd.StarkNetKeyPresenters) assert.True(t, key.StarkKeyStr() == keys[0].StarkKey) })` $DIR/core/cmd/starknet_keys_commands_test.go: `requireStarkNetKeyCount(t, app, 1)` $DIR/core/cmd/starknet_keys_commands_test.go: `t.Run("CreateStarkNetKey", func(tt *testing.T) { defer cleanup() client, _ := app.NewShellAndRenderer() require.NoError(t, cmd.NewStarkNetKeysClient(client).CreateKey(nilContext)) keys, err := app.GetKeyStore().StarkNet().GetAll() require.NoError(t, err) require.Len(t, keys, 1) })` $DIR/core/cmd/starknet_keys_commands_test.go: `t.Run("DeleteStarkNetKey", func(tt *testing.T) { defer cleanup() ctx := testutils.Context(t) client, _ := app.NewShellAndRenderer() key, err := app.GetKeyStore().StarkNet().Create(ctx) require.NoError(t, err) requireStarkNetKeyCount(t, app, 1) set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(cmd.NewStarkNetKeysClient(client).DeleteKey, set, "starknet") require.NoError(tt, set.Set("yes", "true")) strID := key.ID() err = set.Parse([]string{strID}) require.NoError(t, err) c := cli.NewContext(nil, set, nil) err = cmd.NewStarkNetKeysClient(client).DeleteKey(c) require.NoError(t, err) requireStarkNetKeyCount(t, app, 0) })` $DIR/core/cmd/starknet_keys_commands_test.go: `requireStarkNetKeyCount(t, app, 1)` $DIR/core/cmd/starknet_keys_commands_test.go: `flagSetApplyFromAction(cmd.NewStarkNetKeysClient(client).DeleteKey, set, "starknet")` $DIR/core/cmd/starknet_keys_commands_test.go: `err = set.Parse([]string{strID})` $DIR/core/cmd/starknet_keys_commands_test.go: `err = cmd.NewStarkNetKeysClient(client).DeleteKey(c)` $DIR/core/cmd/starknet_keys_commands_test.go: `requireStarkNetKeyCount(t, app, 0)` $DIR/core/cmd/starknet_keys_commands_test.go: `flagSetApplyFromAction(cmd.NewStarkNetKeysClient(client).ExportKey, set, "starknet")` $DIR/core/cmd/starknet_keys_commands_test.go: `err = cmd.NewStarkNetKeysClient(client).ExportKey(c)` $DIR/core/cmd/starknet_keys_commands_test.go: `set = flag.NewFlagSet("test StarkNet export", 0)` $DIR/core/cmd/starknet_keys_commands_test.go: `flagSetApplyFromAction(cmd.NewStarkNetKeysClient(client).ExportKey, set, "starknet")` $DIR/core/cmd/starknet_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/starknet_keys_commands_test.go: `requireStarkNetKeyCount(t, app, 0)` $DIR/core/cmd/starknet_keys_commands_test.go: `set = flag.NewFlagSet("test StarkNet import", 0)` $DIR/core/cmd/starknet_keys_commands_test.go: `flagSetApplyFromAction(cmd.NewStarkNetKeysClient(client).ImportKey, set, "starknet")` $DIR/core/cmd/starknet_keys_commands_test.go: `c = cli.NewContext(nil, set, nil)` $DIR/core/cmd/starknet_keys_commands_test.go: `requireStarkNetKeyCount(t, app, 1)` $DIR/core/cmd/starknet_keys_commands_test.go: `.NewBufferString("")` $DIR/core/cmd/starknet_keys_commands_test.go: `.NewJAID(id)` $DIR/core/cmd/starknet_keys_commands_test.go: `.String()` $DIR/core/cmd/starknet_keys_commands_test.go: `.Reset()` $DIR/core/cmd/starknet_keys_commands_test.go: `.String()` $DIR/core/cmd/starknet_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/starknet_keys_commands_test.go: `.StarkNet()` $DIR/core/cmd/starknet_keys_commands_test.go: `.Background()` $DIR/core/cmd/starknet_keys_commands_test.go: `.GetAll()` $DIR/core/cmd/starknet_keys_commands_test.go: `.Run("ListStarkNetKeys", func(tt *testing.T) { defer cleanup() ctx := testutils.Context(t) client, r := app.NewShellAndRenderer() key, err := app.GetKeyStore().StarkNet().Create(ctx) require.NoError(t, err) requireStarkNetKeyCount(t, app, 1) assert.Nil(t, cmd.NewStarkNetKeysClient(client).ListKeys(cltest.EmptyCLIContext())) require.Equal(t, 1, len(r.Renders)) keys := *r.Renders[0].(*cmd.StarkNetKeyPresenters) assert.True(t, key.StarkKeyStr() == keys[0].StarkKey) })` $DIR/core/cmd/starknet_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/starknet_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/starknet_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/starknet_keys_commands_test.go: `.StarkNet()` $DIR/core/cmd/starknet_keys_commands_test.go: `.Create(ctx)` $DIR/core/cmd/starknet_keys_commands_test.go: `.Run("CreateStarkNetKey", func(tt *testing.T) { defer cleanup() client, _ := app.NewShellAndRenderer() require.NoError(t, cmd.NewStarkNetKeysClient(client).CreateKey(nilContext)) keys, err := app.GetKeyStore().StarkNet().GetAll() require.NoError(t, err) require.Len(t, keys, 1) })` $DIR/core/cmd/starknet_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/starknet_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/starknet_keys_commands_test.go: `.StarkNet()` $DIR/core/cmd/starknet_keys_commands_test.go: `.GetAll()` $DIR/core/cmd/starknet_keys_commands_test.go: `.Run("DeleteStarkNetKey", func(tt *testing.T) { defer cleanup() ctx := testutils.Context(t) client, _ := app.NewShellAndRenderer() key, err := app.GetKeyStore().StarkNet().Create(ctx) require.NoError(t, err) requireStarkNetKeyCount(t, app, 1) set := flag.NewFlagSet("test", 0) flagSetApplyFromAction(cmd.NewStarkNetKeysClient(client).DeleteKey, set, "starknet") require.NoError(tt, set.Set("yes", "true")) strID := key.ID() err = set.Parse([]string{strID}) require.NoError(t, err) c := cli.NewContext(nil, set, nil) err = cmd.NewStarkNetKeysClient(client).DeleteKey(c) require.NoError(t, err) requireStarkNetKeyCount(t, app, 0) })` $DIR/core/cmd/starknet_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/starknet_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/starknet_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/starknet_keys_commands_test.go: `.StarkNet()` $DIR/core/cmd/starknet_keys_commands_test.go: `.Create(ctx)` $DIR/core/cmd/starknet_keys_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/starknet_keys_commands_test.go: `.NewStarkNetKeysClient(client)` $DIR/core/cmd/starknet_keys_commands_test.go: `.ID()` $DIR/core/cmd/starknet_keys_commands_test.go: `.Parse([]string{strID})` $DIR/core/cmd/starknet_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/starknet_keys_commands_test.go: `.NewStarkNetKeysClient(client)` $DIR/core/cmd/starknet_keys_commands_test.go: `.DeleteKey(c)` $DIR/core/cmd/starknet_keys_commands_test.go: `.Context(t)` $DIR/core/cmd/starknet_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/starknet_keys_commands_test.go: `.GetKeyStore()` $DIR/core/cmd/starknet_keys_commands_test.go: `.StarkNet()` $DIR/core/cmd/starknet_keys_commands_test.go: `.Create(ctx)` $DIR/core/cmd/starknet_keys_commands_test.go: `.NewFlagSet("test StarkNet export", 0)` $DIR/core/cmd/starknet_keys_commands_test.go: `.NewStarkNetKeysClient(client)` $DIR/core/cmd/starknet_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/starknet_keys_commands_test.go: `.NewStarkNetKeysClient(client)` $DIR/core/cmd/starknet_keys_commands_test.go: `.ExportKey(c)` $DIR/core/cmd/starknet_keys_commands_test.go: `.NewFlagSet("test StarkNet export", 0)` $DIR/core/cmd/starknet_keys_commands_test.go: `.NewStarkNetKeysClient(client)` $DIR/core/cmd/starknet_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/starknet_keys_commands_test.go: `.NewFlagSet("test StarkNet import", 0)` $DIR/core/cmd/starknet_keys_commands_test.go: `.NewStarkNetKeysClient(client)` $DIR/core/cmd/starknet_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/starknet_node_commands_test.go: `assertTableRenders(t, r)` $DIR/core/cmd/starknet_node_commands_test.go: `.MustParseURL("https://starknet1.example")` $DIR/core/cmd/starknet_node_commands_test.go: `.MustParseURL("https://starknet2.example")` $DIR/core/cmd/starknet_node_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/starknet_node_commands_test.go: `.Marshal(node1)` $DIR/core/cmd/starknet_node_commands_test.go: `.Marshal(node2)` $DIR/core/cmd/starknet_node_commands_test.go: `.Split(b.String(), "\n")` $DIR/core/cmd/starknet_node_commands_test.go: `.String()` $DIR/core/cmd/vrf_keys_commands_test.go: `buffer.Reset()` $DIR/core/cmd/vrf_keys_commands_test.go: `output = buffer.String()` $DIR/core/cmd/vrf_keys_commands_test.go: `keys = *r.Renders[2].(*cmd.VRFKeyPresenters)` $DIR/core/cmd/vrf_keys_commands_test.go: `AssertKeysEqual(t, k1, keys[0])` $DIR/core/cmd/vrf_keys_commands_test.go: `keys = *r.Renders[4].(*cmd.VRFKeyPresenters)` $DIR/core/cmd/vrf_keys_commands_test.go: `flagSetApplyFromAction(client.DeleteVRFKey, set, "")` $DIR/core/cmd/vrf_keys_commands_test.go: `AssertKeysEqual(t, k2, deletedKey)` $DIR/core/cmd/vrf_keys_commands_test.go: `flagSetApplyFromAction(client.ExportVRFKey, set, "")` $DIR/core/cmd/vrf_keys_commands_test.go: `t.Cleanup(func() { os.Remove(keyName) })` $DIR/core/cmd/vrf_keys_commands_test.go: `os.Remove(keyName)` $DIR/core/cmd/vrf_keys_commands_test.go: `flagSetApplyFromAction(client.ImportVRFKey, importSet, "")` $DIR/core/cmd/vrf_keys_commands_test.go: `set = flag.NewFlagSet("test", 0)` $DIR/core/cmd/vrf_keys_commands_test.go: `flagSetApplyFromAction(client.DeleteVRFKey, set, "")` $DIR/core/cmd/vrf_keys_commands_test.go: `.NewBufferString("")` $DIR/core/cmd/vrf_keys_commands_test.go: `.String()` $DIR/core/cmd/vrf_keys_commands_test.go: `.Reset()` $DIR/core/cmd/vrf_keys_commands_test.go: `.String()` $DIR/core/cmd/vrf_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/vrf_keys_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/cmd/vrf_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/vrf_keys_commands_test.go: `.DeleteVRFKey(c)` $DIR/core/cmd/vrf_keys_commands_test.go: `.KeyStore.VRF()` $DIR/core/cmd/vrf_keys_commands_test.go: `.GetAll()` $DIR/core/cmd/vrf_keys_commands_test.go: `.NewShellAndRenderer()` $DIR/core/cmd/vrf_keys_commands_test.go: `.NewFlagSet("test VRF export", 0)` $DIR/core/cmd/vrf_keys_commands_test.go: `.NewContext(nil, set, nil)` $DIR/core/cmd/vrf_keys_commands_test.go: `.Cleanup(func() { os.Remove(keyName) })` $DIR/core/cmd/vrf_keys_commands_test.go: `.Remove(keyName)` $DIR/core/cmd/vrf_keys_commands_test.go: `.NewFlagSet("test VRF import", 0)` $DIR/core/cmd/vrf_keys_commands_test.go: `.NewContext(nil, importSet, nil)` $DIR/core/cmd/vrf_keys_commands_test.go: `.NewFlagSet("test", 0)` $DIR/core/config/config_internal_test.go: `val, err = parse.BigInt("15")` $DIR/core/config/config_internal_test.go: `val, err = parse.BigInt("x")` $DIR/core/config/config_internal_test.go: `val, err = parse.BigInt("")` $DIR/core/config/config_internal_test.go: `val, err = parse.LogLevel("")` $DIR/core/config/config_internal_test.go: `val, err = parse.LogLevel("primus sucks")` $DIR/core/config/config_internal_test.go: `t.Run(test.name, func(t *testing.T) { i, err := parse.URL(test.input) if test.wantError { assert.Error(t, err) } else { require.NoError(t, err) w, ok := i.(*url.URL) require.True(t, ok) assert.Equal(t, test.input, w.String()) } })` $DIR/core/config/config_internal_test.go: `val, err = parse.Bool("false")` $DIR/core/config/config_internal_test.go: `_, err = parse.Bool("")` $DIR/core/config/config_internal_test.go: `.BigInt("0")` $DIR/core/config/config_internal_test.go: `.BigInt("15")` $DIR/core/config/config_internal_test.go: `.BigInt("x")` $DIR/core/config/config_internal_test.go: `.BigInt("")` $DIR/core/config/config_internal_test.go: `.LogLevel("ERROR")` $DIR/core/config/config_internal_test.go: `.LogLevel("")` $DIR/core/config/config_internal_test.go: `.LogLevel("primus sucks")` $DIR/core/config/config_internal_test.go: `.Level(0)` $DIR/core/config/config_internal_test.go: `.Run(test.name, func(t *testing.T) { i, err := parse.URL(test.input) if test.wantError { assert.Error(t, err) } else { require.NoError(t, err) w, ok := i.(*url.URL) require.True(t, ok) assert.Equal(t, test.input, w.String()) } })` $DIR/core/config/config_internal_test.go: `.URL(test.input)` $DIR/core/config/config_internal_test.go: `.Bool("true")` $DIR/core/config/config_internal_test.go: `.Bool("false")` $DIR/core/config/config_internal_test.go: `.Bool("")` $DIR/core/config/docs/docs_test.go: `d.DisallowUnknownFields()` $DIR/core/config/docs/docs_test.go: `cfgtest.AssertFieldsNotNil(t, c)` $DIR/core/config/docs/docs_test.go: `t.Run("EVM", func(t *testing.T) { fallbackDefaults := evmcfg.Defaults(nil) docDefaults := defaults.EVM[0].Chain require.Equal(t, chaintype.ChainType(""), docDefaults.ChainType.ChainType()) docDefaults.ChainType = nil // clean up KeySpecific as a special case require.Equal(t, 1, len(docDefaults.KeySpecific)) ks := evmcfg.KeySpecific{Key: new(types.EIP55Address), GasEstimator: evmcfg.KeySpecificGasEstimator{PriceMax: new(assets.Wei)}} require.Equal(t, ks, docDefaults.KeySpecific[0]) docDefaults.KeySpecific = nil // EVM.GasEstimator.BumpTxDepth doesn't have a constant default - it is derived from another field require.Zero(t, *docDefaults.GasEstimator.BumpTxDepth) docDefaults.GasEstimator.BumpTxDepth = nil // per-job limits are nilable require.Zero(t, *docDefaults.GasEstimator.LimitJobType.OCR) require.Zero(t, *docDefaults.GasEstimator.LimitJobType.OCR2) require.Zero(t, *docDefaults.GasEstimator.LimitJobType.DR) require.Zero(t, *docDefaults.GasEstimator.LimitJobType.Keeper) require.Zero(t, *docDefaults.GasEstimator.LimitJobType.VRF) require.Zero(t, *docDefaults.GasEstimator.LimitJobType.FM) docDefaults.GasEstimator.LimitJobType = evmcfg.GasLimitJobType{} // EIP1559FeeCapBufferBlocks doesn't have a constant default - it is derived from another field require.Zero(t, *docDefaults.GasEstimator.BlockHistory.EIP1559FeeCapBufferBlocks) docDefaults.GasEstimator.BlockHistory.EIP1559FeeCapBufferBlocks = nil // addresses w/o global values require.Zero(t, *docDefaults.FlagsContractAddress) require.Zero(t, *docDefaults.LinkContractAddress) require.Zero(t, *docDefaults.OperatorFactoryAddress) docDefaults.FlagsContractAddress = nil docDefaults.LinkContractAddress = nil docDefaults.OperatorFactoryAddress = nil require.Empty(t, docDefaults.Workflow.FromAddress) require.Empty(t, docDefaults.Workflow.ForwarderAddress) docDefaults.Workflow.FromAddress = nil docDefaults.Workflow.ForwarderAddress = nil docDefaults.NodePool.Errors = evmcfg.ClientErrors{} // Transactions.AutoPurge configs are only set if the feature is enabled docDefaults.Transactions.AutoPurge.DetectionApiUrl = nil docDefaults.Transactions.AutoPurge.Threshold = nil docDefaults.Transactions.AutoPurge.MinAttempts = nil assertTOML(t, fallbackDefaults, docDefaults) })` $DIR/core/config/docs/docs_test.go: `docDefaults.ChainType = nil` $DIR/core/config/docs/docs_test.go: `docDefaults.KeySpecific = nil` $DIR/core/config/docs/docs_test.go: `docDefaults.GasEstimator.BumpTxDepth = nil` $DIR/core/config/docs/docs_test.go: `docDefaults.GasEstimator.LimitJobType = evmcfg.GasLimitJobType{}` $DIR/core/config/docs/docs_test.go: `docDefaults.GasEstimator.BlockHistory.EIP1559FeeCapBufferBlocks = nil` $DIR/core/config/docs/docs_test.go: `docDefaults.FlagsContractAddress = nil` $DIR/core/config/docs/docs_test.go: `docDefaults.LinkContractAddress = nil` $DIR/core/config/docs/docs_test.go: `docDefaults.OperatorFactoryAddress = nil` $DIR/core/config/docs/docs_test.go: `docDefaults.Workflow.FromAddress = nil` $DIR/core/config/docs/docs_test.go: `docDefaults.Workflow.ForwarderAddress = nil` $DIR/core/config/docs/docs_test.go: `docDefaults.NodePool.Errors = evmcfg.ClientErrors{}` $DIR/core/config/docs/docs_test.go: `docDefaults.Transactions.AutoPurge.DetectionApiUrl = nil` $DIR/core/config/docs/docs_test.go: `docDefaults.Transactions.AutoPurge.Threshold = nil` $DIR/core/config/docs/docs_test.go: `docDefaults.Transactions.AutoPurge.MinAttempts = nil` $DIR/core/config/docs/docs_test.go: `assertTOML(t, fallbackDefaults, docDefaults)` $DIR/core/config/docs/docs_test.go: `t.Run("Cosmos", func(t *testing.T) { var fallbackDefaults coscfg.TOMLConfig fallbackDefaults.SetDefaults() assertTOML(t, fallbackDefaults.Chain, defaults.Cosmos[0].Chain) })` $DIR/core/config/docs/docs_test.go: `fallbackDefaults.SetDefaults()` $DIR/core/config/docs/docs_test.go: `assertTOML(t, fallbackDefaults.Chain, defaults.Cosmos[0].Chain)` $DIR/core/config/docs/docs_test.go: `t.Run("Solana", func(t *testing.T) { var fallbackDefaults solcfg.TOMLConfig fallbackDefaults.SetDefaults() assertTOML(t, fallbackDefaults.Chain, defaults.Solana[0].Chain) })` $DIR/core/config/docs/docs_test.go: `fallbackDefaults.SetDefaults()` $DIR/core/config/docs/docs_test.go: `assertTOML(t, fallbackDefaults.Chain, defaults.Solana[0].Chain)` $DIR/core/config/docs/docs_test.go: `fallbackDefaults.SetDefaults()` $DIR/core/config/docs/docs_test.go: `assertTOML(t, fallbackDefaults.Chain, defaults.Starknet[0].Chain)` $DIR/core/config/docs/docs_test.go: `.NewDecoder(strings.NewReader(docs.DocsTOML))` $DIR/core/config/docs/docs_test.go: `.NewReader(docs.DocsTOML)` $DIR/core/config/docs/docs_test.go: `.DisallowUnknownFields()` $DIR/core/config/docs/docs_test.go: `.Decode(&c)` $DIR/core/config/docs/docs_test.go: `.Contains(err.Error(), "undecoded keys: ")` $DIR/core/config/docs/docs_test.go: `.As(err, &strict)` $DIR/core/config/docs/docs_test.go: `.AssertFieldsNotNil(t, c)` $DIR/core/config/docs/docs_test.go: `.Run("EVM", func(t *testing.T) { fallbackDefaults := evmcfg.Defaults(nil) docDefaults := defaults.EVM[0].Chain require.Equal(t, chaintype.ChainType(""), docDefaults.ChainType.ChainType()) docDefaults.ChainType = nil // clean up KeySpecific as a special case require.Equal(t, 1, len(docDefaults.KeySpecific)) ks := evmcfg.KeySpecific{Key: new(types.EIP55Address), GasEstimator: evmcfg.KeySpecificGasEstimator{PriceMax: new(assets.Wei)}} require.Equal(t, ks, docDefaults.KeySpecific[0]) docDefaults.KeySpecific = nil // EVM.GasEstimator.BumpTxDepth doesn't have a constant default - it is derived from another field require.Zero(t, *docDefaults.GasEstimator.BumpTxDepth) docDefaults.GasEstimator.BumpTxDepth = nil // per-job limits are nilable require.Zero(t, *docDefaults.GasEstimator.LimitJobType.OCR) require.Zero(t, *docDefaults.GasEstimator.LimitJobType.OCR2) require.Zero(t, *docDefaults.GasEstimator.LimitJobType.DR) require.Zero(t, *docDefaults.GasEstimator.LimitJobType.Keeper) require.Zero(t, *docDefaults.GasEstimator.LimitJobType.VRF) require.Zero(t, *docDefaults.GasEstimator.LimitJobType.FM) docDefaults.GasEstimator.LimitJobType = evmcfg.GasLimitJobType{} // EIP1559FeeCapBufferBlocks doesn't have a constant default - it is derived from another field require.Zero(t, *docDefaults.GasEstimator.BlockHistory.EIP1559FeeCapBufferBlocks) docDefaults.GasEstimator.BlockHistory.EIP1559FeeCapBufferBlocks = nil // addresses w/o global values require.Zero(t, *docDefaults.FlagsContractAddress) require.Zero(t, *docDefaults.LinkContractAddress) require.Zero(t, *docDefaults.OperatorFactoryAddress) docDefaults.FlagsContractAddress = nil docDefaults.LinkContractAddress = nil docDefaults.OperatorFactoryAddress = nil require.Empty(t, docDefaults.Workflow.FromAddress) require.Empty(t, docDefaults.Workflow.ForwarderAddress) docDefaults.Workflow.FromAddress = nil docDefaults.Workflow.ForwarderAddress = nil docDefaults.NodePool.Errors = evmcfg.ClientErrors{} // Transactions.AutoPurge configs are only set if the feature is enabled docDefaults.Transactions.AutoPurge.DetectionApiUrl = nil docDefaults.Transactions.AutoPurge.Threshold = nil docDefaults.Transactions.AutoPurge.MinAttempts = nil assertTOML(t, fallbackDefaults, docDefaults) })` $DIR/core/config/docs/docs_test.go: `.Defaults(nil)` $DIR/core/config/docs/docs_test.go: `.Run("Cosmos", func(t *testing.T) { var fallbackDefaults coscfg.TOMLConfig fallbackDefaults.SetDefaults() assertTOML(t, fallbackDefaults.Chain, defaults.Cosmos[0].Chain) })` $DIR/core/config/docs/docs_test.go: `.SetDefaults()` $DIR/core/config/docs/docs_test.go: `.Run("Solana", func(t *testing.T) { var fallbackDefaults solcfg.TOMLConfig fallbackDefaults.SetDefaults() assertTOML(t, fallbackDefaults.Chain, defaults.Solana[0].Chain) })` $DIR/core/config/docs/docs_test.go: `.SetDefaults()` $DIR/core/config/docs/docs_test.go: `.SetDefaults()` $DIR/core/config/env/env_test.go: `t.Run(tt.name, func(t *testing.T) { got := NewPlugin(tt.kind) require.Equal(t, tt.exp, got) })` $DIR/core/config/env/env_test.go: `.Run(tt.name, func(t *testing.T) { got := NewPlugin(tt.kind) require.Equal(t, tt.exp, got) })` $DIR/core/config/toml/types_test.go: `t.Run(test.name, func(t *testing.T) { url := testutils.MustParseURL(t, test.url) err := validateDBURL(*url) if test.wantErr == "" { assert.Nil(t, err) } else { assert.EqualError(t, err, test.wantErr) } })` $DIR/core/config/toml/types_test.go: `t.Run(tt.name, func(t *testing.T) { buildMode := build.Mode() if tt.buildMode != "" { buildMode = tt.buildMode } err := tt.input.validateConfig(buildMode) if err == nil && len(tt.expectedErrContains) > 0 { t.Errorf("expected errors but got none") return } if err != nil { errStr := err.Error() for _, expectedErrSubStr := range tt.expectedErrContains { if !strings.Contains(errStr, expectedErrSubStr) { t.Errorf("expected error to contain substring %q but got %v", expectedErrSubStr, errStr) } } } })` $DIR/core/config/toml/types_test.go: `buildMode = tt.buildMode` $DIR/core/config/toml/types_test.go: `t.Run(tt.name, func(t *testing.T) { var tlsCertPath string if *tt.mode == "tls" { tlsCertPath = "/path/to/cert.pem" } tracing := &Tracing{ Enabled: ptr(true), TLSCertPath: &tlsCertPath, Mode: tt.mode, CollectorTarget: tt.collectorTarget, } err := tracing.ValidateConfig() if tt.wantErr { assert.Error(t, err) assert.Equal(t, tt.errMsg, err.Error()) } else { assert.NoError(t, err) } })` $DIR/core/config/toml/types_test.go: `tlsCertPath = "/path/to/cert.pem"` $DIR/core/config/toml/types_test.go: `t.Run(tt.name, func(t *testing.T) { tracing := Tracing{ SamplingRatio: tt.samplingRatio, Enabled: ptr(true), } err := tracing.ValidateConfig() if tt.wantErr { assert.Error(t, err) assert.Equal(t, tt.errMsg, err.Error()) } else { assert.NoError(t, err) } })` $DIR/core/config/toml/types_test.go: `t.Run(tt.name, func(t *testing.T) { tracing := &Tracing{ Mode: ptr("tls"), TLSCertPath: tt.tlsCertPath, Enabled: ptr(true), } err := tracing.ValidateConfig() if tt.wantErr { assert.Error(t, err) assert.Equal(t, tt.errMsg, err.Error()) } else { assert.NoError(t, err) } })` $DIR/core/config/toml/types_test.go: `t.Run(tt.name, func(t *testing.T) { tracing := &Tracing{ Mode: ptr("unencrypted"), TLSCertPath: tt.tlsCertPath, Enabled: ptr(true), } err := tracing.ValidateConfig() if tt.wantErr { assert.Error(t, err) assert.Equal(t, tt.errMsg, err.Error()) } else { assert.NoError(t, err) } })` $DIR/core/config/toml/types_test.go: `t.Run(tt.name, func(t *testing.T) { tracing := &Tracing{ Enabled: ptr(true), Mode: tt.mode, TLSCertPath: tt.tlsCertPath, } err := tracing.ValidateConfig() if tt.wantErr { assert.Error(t, err) assert.Equal(t, tt.errMsg, err.Error()) } else { assert.NoError(t, err) } })` $DIR/core/config/toml/types_test.go: `t.Run(tt.name, func(t *testing.T) { mercury := &Mercury{ TLS: MercuryTLS{ CertFile: tt.tlsCertPath, }, } err := mercury.ValidateConfig() if tt.wantErr { assert.Error(t, err) assert.Equal(t, tt.errMsg, err.Error()) } else { assert.NoError(t, err) } })` $DIR/core/config/toml/types_test.go: `.MustSecretURL("https://facebook.com")` $DIR/core/config/toml/types_test.go: `.NewSecret("new user1")` $DIR/core/config/toml/types_test.go: `.NewSecret("new password1")` $DIR/core/config/toml/types_test.go: `.MustSecretURL("HTTPS://GOOGLE.COM")` $DIR/core/config/toml/types_test.go: `.NewSecret("new user1")` $DIR/core/config/toml/types_test.go: `.NewSecret("new password2")` $DIR/core/config/toml/types_test.go: `.MustSecretURL("https://abc.com")` $DIR/core/config/toml/types_test.go: `.MustSecretURL("HTTPS://GOOGLE1.COM")` $DIR/core/config/toml/types_test.go: `.NewSecret("new user1")` $DIR/core/config/toml/types_test.go: `.NewSecret("new password2")` $DIR/core/config/toml/types_test.go: `.ValidateConfig()` $DIR/core/config/toml/types_test.go: `.MustSecretURL("HTTPS://GOOGLE.COM")` $DIR/core/config/toml/types_test.go: `.NewSecret("new user1")` $DIR/core/config/toml/types_test.go: `.NewSecret("new password1")` $DIR/core/config/toml/types_test.go: `.MustSecretURL("HTTPS://GOOGLE.COM")` $DIR/core/config/toml/types_test.go: `.NewSecret("new user2")` $DIR/core/config/toml/types_test.go: `.NewSecret("new password2")` $DIR/core/config/toml/types_test.go: `.ValidateConfig()` $DIR/core/config/toml/types_test.go: `.NewSecret("new user1")` $DIR/core/config/toml/types_test.go: `.NewSecret("new password1")` $DIR/core/config/toml/types_test.go: `.ValidateConfig()` $DIR/core/config/toml/types_test.go: `.Sprintf("%s %s\n", utils.ErrMsgHeader, "password is less than 16 characters long")` $DIR/core/config/toml/types_test.go: `.Sprintf("%s %s\n", utils.ErrMsgHeader, "password is less than 16 characters long")` $DIR/core/config/toml/types_test.go: `.Run(test.name, func(t *testing.T) { url := testutils.MustParseURL(t, test.url) err := validateDBURL(*url) if test.wantErr == "" { assert.Nil(t, err) } else { assert.EqualError(t, err, test.wantErr) } })` $DIR/core/config/toml/types_test.go: `.MustParseURL(t, test.url)` $DIR/core/config/toml/types_test.go: `.URL(url.URL{Scheme: "https", Host: "localhost"})` $DIR/core/config/toml/types_test.go: `.NewSecretURL(&validUrl)` $DIR/core/config/toml/types_test.go: `.URL(url.URL{})` $DIR/core/config/toml/types_test.go: `.NewSecretURL(&invalidEmptyUrl)` $DIR/core/config/toml/types_test.go: `.URL(url.URL{Scheme: "http", Host: "localhost"})` $DIR/core/config/toml/types_test.go: `.NewSecretURL(&invalidBackupURL)` $DIR/core/config/toml/types_test.go: `.Run(tt.name, func(t *testing.T) { buildMode := build.Mode() if tt.buildMode != "" { buildMode = tt.buildMode } err := tt.input.validateConfig(buildMode) if err == nil && len(tt.expectedErrContains) > 0 { t.Errorf("expected errors but got none") return } if err != nil { errStr := err.Error() for _, expectedErrSubStr := range tt.expectedErrContains { if !strings.Contains(errStr, expectedErrSubStr) { t.Errorf("expected error to contain substring %q but got %v", expectedErrSubStr, errStr) } } } })` $DIR/core/config/toml/types_test.go: `.Mode()` $DIR/core/config/toml/types_test.go: `.input.validateConfig(buildMode)` $DIR/core/config/toml/types_test.go: `.Contains(errStr, expectedErrSubStr)` $DIR/core/config/toml/types_test.go: `.Run(tt.name, func(t *testing.T) { var tlsCertPath string if *tt.mode == "tls" { tlsCertPath = "/path/to/cert.pem" } tracing := &Tracing{ Enabled: ptr(true), TLSCertPath: &tlsCertPath, Mode: tt.mode, CollectorTarget: tt.collectorTarget, } err := tracing.ValidateConfig() if tt.wantErr { assert.Error(t, err) assert.Equal(t, tt.errMsg, err.Error()) } else { assert.NoError(t, err) } })` $DIR/core/config/toml/types_test.go: `.ValidateConfig()` $DIR/core/config/toml/types_test.go: `.Run(tt.name, func(t *testing.T) { tracing := Tracing{ SamplingRatio: tt.samplingRatio, Enabled: ptr(true), } err := tracing.ValidateConfig() if tt.wantErr { assert.Error(t, err) assert.Equal(t, tt.errMsg, err.Error()) } else { assert.NoError(t, err) } })` $DIR/core/config/toml/types_test.go: `.ValidateConfig()` $DIR/core/config/toml/types_test.go: `.Repeat("z", 4097)` $DIR/core/config/toml/types_test.go: `.Repeat("z", 4097)` $DIR/core/config/toml/types_test.go: `.Repeat("z", 4097)` $DIR/core/config/toml/types_test.go: `.Run(tt.name, func(t *testing.T) { tracing := &Tracing{ Mode: ptr("tls"), TLSCertPath: tt.tlsCertPath, Enabled: ptr(true), } err := tracing.ValidateConfig() if tt.wantErr { assert.Error(t, err) assert.Equal(t, tt.errMsg, err.Error()) } else { assert.NoError(t, err) } })` $DIR/core/config/toml/types_test.go: `.ValidateConfig()` $DIR/core/config/toml/types_test.go: `.Run(tt.name, func(t *testing.T) { tracing := &Tracing{ Mode: ptr("unencrypted"), TLSCertPath: tt.tlsCertPath, Enabled: ptr(true), } err := tracing.ValidateConfig() if tt.wantErr { assert.Error(t, err) assert.Equal(t, tt.errMsg, err.Error()) } else { assert.NoError(t, err) } })` $DIR/core/config/toml/types_test.go: `.ValidateConfig()` $DIR/core/config/toml/types_test.go: `.Run(tt.name, func(t *testing.T) { tracing := &Tracing{ Enabled: ptr(true), Mode: tt.mode, TLSCertPath: tt.tlsCertPath, } err := tracing.ValidateConfig() if tt.wantErr { assert.Error(t, err) assert.Equal(t, tt.errMsg, err.Error()) } else { assert.NoError(t, err) } })` $DIR/core/config/toml/types_test.go: `.ValidateConfig()` $DIR/core/config/toml/types_test.go: `.Repeat("z", 4097)` $DIR/core/config/toml/types_test.go: `.Repeat("z", 4097)` $DIR/core/config/toml/types_test.go: `.Run(tt.name, func(t *testing.T) { mercury := &Mercury{ TLS: MercuryTLS{ CertFile: tt.tlsCertPath, }, } err := mercury.ValidateConfig() if tt.wantErr { assert.Error(t, err) assert.Equal(t, tt.errMsg, err.Error()) } else { assert.NoError(t, err) } })` $DIR/core/config/toml/types_test.go: `.ValidateConfig()` $DIR/core/gethwrappers/abigen_test.go: `.MustNewSimTransactor(t)` $DIR/core/gethwrappers/abigen_test.go: `.NewSimulatedBackendWithDatabase(rawdb.NewMemoryDatabase(), map[common.Address]core.GenesisAccount{ owner.From: { Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), }, }, 10e6)` $DIR/core/gethwrappers/abigen_test.go: `.NewMemoryDatabase()` $DIR/core/gethwrappers/abigen_test.go: `.NewInt(0)` $DIR/core/gethwrappers/abigen_test.go: `.Mul(big.NewInt(10), big.NewInt(1e18))` $DIR/core/gethwrappers/abigen_test.go: `.NewInt(10)` $DIR/core/gethwrappers/abigen_test.go: `.NewInt(1e18)` $DIR/core/gethwrappers/abigen_test.go: `.DeployLogEmitter(owner, ec)` $DIR/core/gethwrappers/abigen_test.go: `.Address()` $DIR/core/gethwrappers/go_generate_test.go: `testutils.SkipShort(t, "requires compiled artifacts")` $DIR/core/gethwrappers/go_generate_test.go: `wd = ""` $DIR/core/gethwrappers/go_generate_test.go: `compareCurrentCompilerArtifactAgainstRecordsAndSoliditySources(t, contractVersionInfo)` $DIR/core/gethwrappers/go_generate_test.go: `flag.Parse()` $DIR/core/gethwrappers/go_generate_test.go: `ensureArtifacts()` $DIR/core/gethwrappers/go_generate_test.go: `.SkipShort(t, "requires compiled artifacts")` $DIR/core/gethwrappers/go_generate_test.go: `.Getwd()` $DIR/core/gethwrappers/go_generate_test.go: `.ReadFile(filepath.Join(getProjectRoot(t), "contracts/LinkToken.json"))` $DIR/core/gethwrappers/go_generate_test.go: `.Join(getProjectRoot(t), "contracts/LinkToken.json")` $DIR/core/gethwrappers/go_generate_test.go: `.Sprintf("%x", sha256.Sum256(linkDetails))` $DIR/core/gethwrappers/go_generate_test.go: `.Sum256(linkDetails)` $DIR/core/gethwrappers/go_generate_test.go: `.Parse()` $DIR/core/gethwrappers/go_generate_test.go: `.Short()` $DIR/core/gethwrappers/go_generate_test.go: `.Run()` $DIR/core/internal/features/features_test.go: `c.JobPipeline.ExternalInitiatorsEnabled = ptr(true)` $DIR/core/internal/features/features_test.go: `c.Database.Listener.FallbackPollInterval = commonconfig.MustNewDuration(10 * time.Millisecond)` $DIR/core/internal/features/features_test.go: `eiNotifiedOfCreate = true` $DIR/core/internal/features/features_test.go: `w.WriteHeader(http.StatusOK)` $DIR/core/internal/features/features_test.go: `eiNotifiedOfDelete = true` $DIR/core/internal/features/features_test.go: `eiURL = mockEI.URL` $DIR/core/internal/features/features_test.go: `eia = &auth.Token{ AccessKey: eip.AccessKey, Secret: eip.Secret, }` $DIR/core/internal/features/features_test.go: `bridgeCalled = true` $DIR/core/internal/features/features_test.go: `w.WriteHeader(http.StatusOK)` $DIR/core/internal/features/features_test.go: `_, err = io.WriteString(w, `{}`)` $DIR/core/internal/features/features_test.go: `jobID = job.ID` $DIR/core/internal/features/features_test.go: `t.Run("calling webhook_spec with non-matching external_initiator_id returns unauthorized", func(t *testing.T) { eiaWrong := auth.NewToken() body := cltest.MustJSONMarshal(t, eiRequest) headers := make(map[string]string) headers[static.ExternalInitiatorAccessKeyHeader] = eiaWrong.AccessKey headers[static.ExternalInitiatorSecretHeader] = eiaWrong.Secret url := app.Server.URL + "/v2/jobs/" + jobUUID.String() + "/runs" bodyBuf := bytes.NewBufferString(body) resp, cleanup := cltest.UnauthenticatedPost(t, url, bodyBuf, headers) defer cleanup() cltest.AssertServerResponse(t, resp, 401) cltest.AssertCountStays(t, app.GetDB(), "pipeline_runs", 0) })` $DIR/core/internal/features/features_test.go: `headers[static.ExternalInitiatorAccessKeyHeader] = eiaWrong.AccessKey` $DIR/core/internal/features/features_test.go: `headers[static.ExternalInitiatorSecretHeader] = eiaWrong.Secret` $DIR/core/internal/features/features_test.go: `cltest.AssertServerResponse(t, resp, 401)` $DIR/core/internal/features/features_test.go: `cltest.AssertCountStays(t, app.GetDB(), "pipeline_runs", 0)` $DIR/core/internal/features/features_test.go: `t.Run("calling webhook_spec with matching external_initiator_id works", func(t *testing.T) { // Simulate request from EI -> Core node cltest.AwaitJobActive(t, app.JobSpawner(), jobID, 3*time.Second) _ = cltest.CreateJobRunViaExternalInitiatorV2(t, app, jobUUID, *eia, cltest.MustJSONMarshal(t, eiRequest)) pipelineORM := pipeline.NewORM(app.GetDB(), logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns()) bridgeORM := bridges.NewORM(app.GetDB()) jobORM := job.NewORM(app.GetDB(), pipelineORM, bridgeORM, app.KeyStore, logger.TestLogger(t)) runs := cltest.WaitForPipelineComplete(t, 0, jobID, 1, 2, jobORM, 5*time.Second, 300*time.Millisecond) require.Len(t, runs, 1) run := runs[0] require.Len(t, run.PipelineTaskRuns, 2) require.Empty(t, run.PipelineTaskRuns[0].Error) require.Empty(t, run.PipelineTaskRuns[1].Error) assert.True(t, bridgeCalled, "expected bridge server to be called") })` $DIR/core/internal/features/features_test.go: `cltest.AwaitJobActive(t, app.JobSpawner(), jobID, 3*time.Second)` $DIR/core/internal/features/features_test.go: `_ = cltest.CreateJobRunViaExternalInitiatorV2(t, app, jobUUID, *eia, cltest.MustJSONMarshal(t, eiRequest))` $DIR/core/internal/features/features_test.go: `cltest.DeleteJobViaWeb(t, app, jobID)` $DIR/core/internal/features/features_test.go: `headers[webauth.APIKey] = key` $DIR/core/internal/features/features_test.go: `headers[webauth.APISecret] = secret` $DIR/core/internal/features/features_test.go: `t.Run(test.name, func(t *testing.T) { ctx := testutils.Context(t) // Simulate a consumer contract calling to obtain ETH quotes in 3 different currencies // in a single callback. config := configtest.NewGeneralConfigSimulated(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Database.Listener.FallbackPollInterval = commonconfig.MustNewDuration(100 * time.Millisecond) c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(true) }) operatorContracts := setupOperatorContracts(t) b := operatorContracts.sim app := cltest.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, b) sendingKeys, err := app.KeyStore.Eth().EnabledKeysForChain(ctx, testutils.SimulatedChainID) require.NoError(t, err) authorizedSenders := []common.Address{sendingKeys[0].Address} tx, err := operatorContracts.operator.SetAuthorizedSenders(operatorContracts.user, authorizedSenders) require.NoError(t, err) b.Commit() cltest.RequireTxSuccessful(t, b, tx.Hash()) // Fund node account with ETH. n, err := b.NonceAt(testutils.Context(t), operatorContracts.user.From, nil) require.NoError(t, err) tx = cltest.NewLegacyTransaction(n, sendingKeys[0].Address, assets.Ether(100).ToInt(), 21000, big.NewInt(1000000000), nil) signedTx, err := operatorContracts.user.Signer(operatorContracts.user.From, tx) require.NoError(t, err) err = b.SendTransaction(testutils.Context(t), signedTx) require.NoError(t, err) b.Commit() err = app.Start(testutils.Context(t)) require.NoError(t, err) mockServerUSD := cltest.NewHTTPMockServer(t, 200, "GET", `{"USD": 614.64}`) mockServerEUR := cltest.NewHTTPMockServer(t, 200, "GET", `{"EUR": 507.07}`) mockServerJPY := cltest.NewHTTPMockServer(t, 200, "GET", `{"JPY": 63818.86}`) nameAndExternalJobID := uuid.New() addr := operatorContracts.operatorAddress.Hex() spec := fmt.Sprintf(multiWordSpecTemplate, nameAndExternalJobID, addr, nameAndExternalJobID, addr) j := cltest.CreateJobViaWeb(t, app, []byte(cltest.MustJSONMarshal(t, web.CreateJobRequest{TOML: spec}))) cltest.AwaitJobActive(t, app.JobSpawner(), j.ID, 5*time.Second) var jobID [32]byte copy(jobID[:], j.ExternalJobID[:]) tx, err = operatorContracts.multiWord.SetSpecID(operatorContracts.user, jobID) require.NoError(t, err) b.Commit() cltest.RequireTxSuccessful(t, b, tx.Hash()) operatorContracts.user.GasLimit = 1000000 tx, err = operatorContracts.multiWord.RequestMultipleParametersWithCustomURLs(operatorContracts.user, mockServerUSD.URL, "USD", mockServerEUR.URL, "EUR", mockServerJPY.URL, "JPY", big.NewInt(1000), ) require.NoError(t, err) b.Commit() cltest.RequireTxSuccessful(t, b, tx.Hash()) empty := big.NewInt(0) assertPricesUint256(t, empty, empty, empty, operatorContracts.multiWord) stopBlocks := utils.FiniteTicker(100*time.Millisecond, func() { triggerAllKeys(t, app) b.Commit() }) defer stopBlocks() pipelineRuns := cltest.WaitForPipelineComplete(t, 0, j.ID, 1, 14, app.JobORM(), testutils.WaitTimeout(t)/2, time.Second) pipelineRun := pipelineRuns[0] assertPipelineTaskRunsSuccessful(t, pipelineRun.PipelineTaskRuns) assertPricesUint256(t, big.NewInt(61464), big.NewInt(50707), big.NewInt(6381886), operatorContracts.multiWord) nameAndExternalJobID = uuid.New() singleWordSpec := fmt.Sprintf(singleWordSpecTemplate, nameAndExternalJobID, addr, nameAndExternalJobID, addr) jobSingleWord := cltest.CreateJobViaWeb(t, app, []byte(cltest.MustJSONMarshal(t, web.CreateJobRequest{TOML: singleWordSpec}))) cltest.AwaitJobActive(t, app.JobSpawner(), jobSingleWord.ID, 5*time.Second) var jobIDSingleWord [32]byte copy(jobIDSingleWord[:], jobSingleWord.ExternalJobID[:]) tx, err = operatorContracts.singleWord.SetSpecID(operatorContracts.user, jobIDSingleWord) require.NoError(t, err) b.Commit() cltest.RequireTxSuccessful(t, b, tx.Hash()) mockServerUSD2 := cltest.NewHTTPMockServer(t, 200, "GET", `{"USD": 614.64}`) tx, err = operatorContracts.singleWord.RequestMultipleParametersWithCustomURLs(operatorContracts.user, mockServerUSD2.URL, "USD", big.NewInt(1000), ) require.NoError(t, err) b.Commit() cltest.RequireTxSuccessful(t, b, tx.Hash()) pipelineRuns = cltest.WaitForPipelineComplete(t, 0, jobSingleWord.ID, 1, 8, app.JobORM(), testutils.WaitTimeout(t), time.Second) pipelineRun = pipelineRuns[0] assertPipelineTaskRunsSuccessful(t, pipelineRun.PipelineTaskRuns) v, err := operatorContracts.singleWord.CurrentPriceInt(nil) require.NoError(t, err) assert.Equal(t, big.NewInt(61464), v) })` $DIR/core/internal/features/features_test.go: `c.Database.Listener.FallbackPollInterval = commonconfig.MustNewDuration(100 * time.Millisecond)` $DIR/core/internal/features/features_test.go: `c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(true)` $DIR/core/internal/features/features_test.go: `b.Commit()` $DIR/core/internal/features/features_test.go: `cltest.RequireTxSuccessful(t, b, tx.Hash())` $DIR/core/internal/features/features_test.go: `tx = cltest.NewLegacyTransaction(n, sendingKeys[0].Address, assets.Ether(100).ToInt(), 21000, big.NewInt(1000000000), nil)` $DIR/core/internal/features/features_test.go: `err = b.SendTransaction(testutils.Context(t), signedTx)` $DIR/core/internal/features/features_test.go: `b.Commit()` $DIR/core/internal/features/features_test.go: `err = app.Start(testutils.Context(t))` $DIR/core/internal/features/features_test.go: `cltest.AwaitJobActive(t, app.JobSpawner(), j.ID, 5*time.Second)` $DIR/core/internal/features/features_test.go: `copy(jobID[:], j.ExternalJobID[:])` $DIR/core/internal/features/features_test.go: `tx, err = operatorContracts.multiWord.SetSpecID(operatorContracts.user, jobID)` $DIR/core/internal/features/features_test.go: `b.Commit()` $DIR/core/internal/features/features_test.go: `cltest.RequireTxSuccessful(t, b, tx.Hash())` $DIR/core/internal/features/features_test.go: `operatorContracts.user.GasLimit = 1000000` $DIR/core/internal/features/features_test.go: `tx, err = operatorContracts.multiWord.RequestMultipleParametersWithCustomURLs(operatorContracts.user, mockServerUSD.URL, "USD", mockServerEUR.URL, "EUR", mockServerJPY.URL, "JPY", big.NewInt(1000), )` $DIR/core/internal/features/features_test.go: `b.Commit()` $DIR/core/internal/features/features_test.go: `cltest.RequireTxSuccessful(t, b, tx.Hash())` $DIR/core/internal/features/features_test.go: `assertPricesUint256(t, empty, empty, empty, operatorContracts.multiWord)` $DIR/core/internal/features/features_test.go: `triggerAllKeys(t, app)` $DIR/core/internal/features/features_test.go: `b.Commit()` $DIR/core/internal/features/features_test.go: `assertPipelineTaskRunsSuccessful(t, pipelineRun.PipelineTaskRuns)` $DIR/core/internal/features/features_test.go: `assertPricesUint256(t, big.NewInt(61464), big.NewInt(50707), big.NewInt(6381886), operatorContracts.multiWord)` $DIR/core/internal/features/features_test.go: `nameAndExternalJobID = uuid.New()` $DIR/core/internal/features/features_test.go: `cltest.AwaitJobActive(t, app.JobSpawner(), jobSingleWord.ID, 5*time.Second)` $DIR/core/internal/features/features_test.go: `copy(jobIDSingleWord[:], jobSingleWord.ExternalJobID[:])` $DIR/core/internal/features/features_test.go: `tx, err = operatorContracts.singleWord.SetSpecID(operatorContracts.user, jobIDSingleWord)` $DIR/core/internal/features/features_test.go: `b.Commit()` $DIR/core/internal/features/features_test.go: `cltest.RequireTxSuccessful(t, b, tx.Hash())` $DIR/core/internal/features/features_test.go: `tx, err = operatorContracts.singleWord.RequestMultipleParametersWithCustomURLs(operatorContracts.user, mockServerUSD2.URL, "USD", big.NewInt(1000), )` $DIR/core/internal/features/features_test.go: `b.Commit()` $DIR/core/internal/features/features_test.go: `cltest.RequireTxSuccessful(t, b, tx.Hash())` $DIR/core/internal/features/features_test.go: `pipelineRuns = cltest.WaitForPipelineComplete(t, 0, jobSingleWord.ID, 1, 8, app.JobORM(), testutils.WaitTimeout(t), time.Second)` $DIR/core/internal/features/features_test.go: `pipelineRun = pipelineRuns[0]` $DIR/core/internal/features/features_test.go: `assertPipelineTaskRunsSuccessful(t, pipelineRun.PipelineTaskRuns)` $DIR/core/internal/features/features_test.go: `t.Run("with FailOnRevert enabled, run succeeds when transaction is successful", func(t *testing.T) { app, sendingAddr, o := setupAppForEthTx(t, operatorContracts) tomlSpec := ` type = "webhook" schemaVersion = 1 observationSource = """ submit_tx [type=ethtx to="%s" data="%s" minConfirmations="2" failOnRevert=false evmChainID="%s" from="[\\"%s\\"]" ] """ ` // This succeeds for whatever reason revertingData := "0xdeadbeef" tomlSpec = fmt.Sprintf(tomlSpec, operatorContracts.linkTokenAddress.String(), revertingData, testutils.SimulatedChainID.String(), sendingAddr) j := cltest.CreateJobViaWeb(t, app, []byte(cltest.MustJSONMarshal(t, web.CreateJobRequest{TOML: tomlSpec}))) cltest.AwaitJobActive(t, app.JobSpawner(), j.ID, testutils.WaitTimeout(t)) run := cltest.CreateJobRunViaUser(t, app, j.ExternalJobID, "") assert.Equal(t, []*string(nil), run.Outputs) assert.Equal(t, []*string(nil), run.Errors) testutils.WaitForLogMessage(t, o, "Sending transaction") b.Commit() // Needs at least two confirmations b.Commit() // Needs at least two confirmations b.Commit() // Needs at least two confirmations testutils.WaitForLogMessage(t, o, "Resume run success") pipelineRuns := cltest.WaitForPipelineComplete(t, 0, j.ID, 1, 1, app.JobORM(), testutils.WaitTimeout(t), time.Second) // The run should have succeeded but with the receipt detailing the reverted transaction pipelineRun := pipelineRuns[0] assertPipelineTaskRunsSuccessful(t, pipelineRun.PipelineTaskRuns) outputs := pipelineRun.Outputs.Val.([]interface{}) require.Len(t, outputs, 1) output := outputs[0] receipt := output.(map[string]interface{}) assert.Equal(t, "0x7", receipt["blockNumber"]) assert.Equal(t, "0x538f", receipt["gasUsed"]) assert.Equal(t, "0x0", receipt["status"]) // success })` $DIR/core/internal/features/features_test.go: `tomlSpec = fmt.Sprintf(tomlSpec, operatorContracts.linkTokenAddress.String(), revertingData, testutils.SimulatedChainID.String(), sendingAddr)` $DIR/core/internal/features/features_test.go: `cltest.AwaitJobActive(t, app.JobSpawner(), j.ID, testutils.WaitTimeout(t))` $DIR/core/internal/features/features_test.go: `testutils.WaitForLogMessage(t, o, "Sending transaction")` $DIR/core/internal/features/features_test.go: `b.Commit()` $DIR/core/internal/features/features_test.go: `b.Commit()` $DIR/core/internal/features/features_test.go: `b.Commit()` $DIR/core/internal/features/features_test.go: `testutils.WaitForLogMessage(t, o, "Resume run success")` $DIR/core/internal/features/features_test.go: `assertPipelineTaskRunsSuccessful(t, pipelineRun.PipelineTaskRuns)` $DIR/core/internal/features/features_test.go: `t.Run("with FailOnRevert enabled, run fails with transaction reverted error", func(t *testing.T) { app, sendingAddr, o := setupAppForEthTx(t, operatorContracts) tomlSpec := ` type = "webhook" schemaVersion = 1 observationSource = """ submit_tx [type=ethtx to="%s" data="%s" minConfirmations="2" failOnRevert=true evmChainID="%s" from="[\\"%s\\"]" ] """ ` // This data is a call to link token's `transfer` function and will revert due to insufficient LINK on the sender address revertingData := "0xa9059cbb000000000000000000000000526485b5abdd8ae9c6a63548e0215a83e7135e6100000000000000000000000000000000000000000000000db069932ea4fe1400" tomlSpec = fmt.Sprintf(tomlSpec, operatorContracts.linkTokenAddress.String(), revertingData, testutils.SimulatedChainID.String(), sendingAddr) j := cltest.CreateJobViaWeb(t, app, []byte(cltest.MustJSONMarshal(t, web.CreateJobRequest{TOML: tomlSpec}))) cltest.AwaitJobActive(t, app.JobSpawner(), j.ID, testutils.WaitTimeout(t)) run := cltest.CreateJobRunViaUser(t, app, j.ExternalJobID, "") assert.Equal(t, []*string(nil), run.Outputs) assert.Equal(t, []*string(nil), run.Errors) testutils.WaitForLogMessage(t, o, "Sending transaction") b.Commit() // Needs at least two confirmations b.Commit() // Needs at least two confirmations b.Commit() // Needs at least two confirmations testutils.WaitForLogMessage(t, o, "Resume run success") pipelineRuns := cltest.WaitForPipelineError(t, 0, j.ID, 1, 1, app.JobORM(), testutils.WaitTimeout(t), time.Second) // The run should have failed as a revert pipelineRun := pipelineRuns[0] assertPipelineTaskRunsErrored(t, pipelineRun.PipelineTaskRuns) })` $DIR/core/internal/features/features_test.go: `tomlSpec = fmt.Sprintf(tomlSpec, operatorContracts.linkTokenAddress.String(), revertingData, testutils.SimulatedChainID.String(), sendingAddr)` $DIR/core/internal/features/features_test.go: `cltest.AwaitJobActive(t, app.JobSpawner(), j.ID, testutils.WaitTimeout(t))` $DIR/core/internal/features/features_test.go: `testutils.WaitForLogMessage(t, o, "Sending transaction")` $DIR/core/internal/features/features_test.go: `b.Commit()` $DIR/core/internal/features/features_test.go: `b.Commit()` $DIR/core/internal/features/features_test.go: `b.Commit()` $DIR/core/internal/features/features_test.go: `testutils.WaitForLogMessage(t, o, "Resume run success")` $DIR/core/internal/features/features_test.go: `assertPipelineTaskRunsErrored(t, pipelineRun.PipelineTaskRuns)` $DIR/core/internal/features/features_test.go: `tomlSpec = fmt.Sprintf(tomlSpec, operatorContracts.linkTokenAddress.String(), revertingData, testutils.SimulatedChainID.String(), sendingAddr)` $DIR/core/internal/features/features_test.go: `cltest.AwaitJobActive(t, app.JobSpawner(), j.ID, testutils.WaitTimeout(t))` $DIR/core/internal/features/features_test.go: `testutils.WaitForLogMessage(t, o, "Sending transaction")` $DIR/core/internal/features/features_test.go: `b.Commit()` $DIR/core/internal/features/features_test.go: `b.Commit()` $DIR/core/internal/features/features_test.go: `b.Commit()` $DIR/core/internal/features/features_test.go: `testutils.WaitForLogMessage(t, o, "Resume run success")` $DIR/core/internal/features/features_test.go: `assertPipelineTaskRunsSuccessful(t, pipelineRun.PipelineTaskRuns)` $DIR/core/internal/features/features_test.go: `testutils.SkipShort(t, "long test")` $DIR/core/internal/features/features_test.go: `t.Run(test.name, func(t *testing.T) { t.Parallel() bootstrapNodePortV2 := freeport.GetOne(t) g := gomega.NewWithT(t) owner, b, ocrContractAddress, ocrContract, flagsContract, flagsContractAddress := setupOCRContracts(t) // Note it's plausible these ports could be occupied on a CI machine. // May need a port randomize + retry approach if we observe collisions. appBootstrap, bootstrapPeerID, _, _ := setupNode(t, owner, bootstrapNodePortV2, b, nil) var ( oracles []confighelper.OracleIdentityExtra transmitters []common.Address keys []ocrkey.KeyV2 apps []*cltest.TestApplication ) ports := freeport.GetN(t, numOracles) for i := 0; i < numOracles; i++ { app, peerID, transmitter, key := setupNode(t, owner, ports[i], b, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].FlagsContractAddress = ptr(evmtypes.EIP55AddressFromAddress(flagsContractAddress)) c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(test.eip1559) c.P2P.V2.DefaultBootstrappers = &[]ocrcommontypes.BootstrapperLocator{ {PeerID: bootstrapPeerID, Addrs: []string{fmt.Sprintf("127.0.0.1:%d", bootstrapNodePortV2)}}, } }) keys = append(keys, key) apps = append(apps, app) transmitters = append(transmitters, transmitter) oracles = append(oracles, confighelper.OracleIdentityExtra{ OracleIdentity: confighelper.OracleIdentity{ OnChainSigningAddress: ocrtypes.OnChainSigningAddress(key.OnChainSigning.Address()), TransmitAddress: transmitter, OffchainPublicKey: key.PublicKeyOffChain(), PeerID: peerID, }, SharedSecretEncryptionPublicKey: key.PublicKeyConfig(), }) } stopBlocks := utils.FiniteTicker(time.Second, func() { b.Commit() }) defer stopBlocks() _, err := ocrContract.SetPayees(owner, transmitters, transmitters, ) require.NoError(t, err) signers, transmitters, threshold, encodedConfigVersion, encodedConfig, err := confighelper.ContractSetConfigArgsForIntegrationTest( oracles, 1, 1000000000/100, // threshold PPB ) require.NoError(t, err) _, err = ocrContract.SetConfig(owner, signers, transmitters, threshold, encodedConfigVersion, encodedConfig, ) require.NoError(t, err) b.Commit() err = appBootstrap.Start(testutils.Context(t)) require.NoError(t, err) jb, err := ocr.ValidatedOracleSpecToml(appBootstrap.Config, appBootstrap.GetRelayers().LegacyEVMChains(), fmt.Sprintf(` type = "offchainreporting" schemaVersion = 1 name = "boot" contractAddress = "%s" evmChainID = "%s" isBootstrapPeer = true `, ocrContractAddress, testutils.SimulatedChainID.String())) require.NoError(t, err) jb.Name = null.NewString("boot", true) err = appBootstrap.AddJobV2(testutils.Context(t), &jb) require.NoError(t, err) // Raising flags to initiate hibernation _, err = flagsContract.RaiseFlag(owner, ocrContractAddress) require.NoError(t, err, "failed to raise flag for ocrContractAddress") _, err = flagsContract.RaiseFlag(owner, evmutils.ZeroAddress) require.NoError(t, err, "failed to raise flag for ZeroAddress") b.Commit() var jids []int32 var servers, slowServers = make([]*httptest.Server, 4), make([]*httptest.Server, 4) // We expect metadata of: // latestAnswer:nil // First call // latestAnswer:0 // latestAnswer:10 // latestAnswer:20 // latestAnswer:30 var metaLock sync.Mutex expectedMeta := map[string]struct{}{ "0": {}, "10": {}, "20": {}, "30": {}, } for i := 0; i < numOracles; i++ { err = apps[i].Start(testutils.Context(t)) require.NoError(t, err) // Since this API speed is > ObservationTimeout we should ignore it and still produce values. slowServers[i] = httptest.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { time.Sleep(5 * time.Second) res.WriteHeader(http.StatusOK) _, err := res.Write([]byte(`{"data":10}`)) require.NoError(t, err) })) t.Cleanup(slowServers[i].Close) servers[i] = httptest.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { b, err := io.ReadAll(req.Body) require.NoError(t, err) var m bridges.BridgeMetaDataJSON require.NoError(t, json.Unmarshal(b, &m)) if m.Meta.LatestAnswer != nil && m.Meta.UpdatedAt != nil { metaLock.Lock() delete(expectedMeta, m.Meta.LatestAnswer.String()) metaLock.Unlock() } res.WriteHeader(http.StatusOK) _, err = res.Write([]byte(`{"data":10}`)) require.NoError(t, err) })) t.Cleanup(servers[i].Close) u, _ := url.Parse(servers[i].URL) err := apps[i].BridgeORM().CreateBridgeType(testutils.Context(t), &bridges.BridgeType{ Name: bridges.BridgeName(fmt.Sprintf("bridge%d", i)), URL: models.WebURL(*u), }) require.NoError(t, err) // Note we need: observationTimeout + observationGracePeriod + DeltaGrace (500ms) < DeltaRound (1s) // So 200ms + 200ms + 500ms < 1s jb, err := ocr.ValidatedOracleSpecToml(apps[i].Config, apps[i].GetRelayers().LegacyEVMChains(), fmt.Sprintf(` type = "offchainreporting" schemaVersion = 1 name = "web oracle spec" contractAddress = "%s" evmChainID = "%s" isBootstrapPeer = false keyBundleID = "%s" transmitterAddress = "%s" observationTimeout = "100ms" contractConfigConfirmations = 1 contractConfigTrackerPollInterval = "1s" observationSource = """ // data source 1 ds1 [type=bridge name="%s"]; ds1_parse [type=jsonparse path="data"]; ds1_multiply [type=multiply times=%d]; // data source 2 ds2 [type=http method=GET url="%s"]; ds2_parse [type=jsonparse path="data"]; ds2_multiply [type=multiply times=%d]; ds1 -> ds1_parse -> ds1_multiply -> answer1; ds2 -> ds2_parse -> ds2_multiply -> answer1; answer1 [type=median index=0]; """ `, ocrContractAddress, testutils.SimulatedChainID.String(), keys[i].ID(), transmitters[i], fmt.Sprintf("bridge%d", i), i, slowServers[i].URL, i)) require.NoError(t, err) jb.Name = null.NewString("testocr", true) err = apps[i].AddJobV2(testutils.Context(t), &jb) require.NoError(t, err) jids = append(jids, jb.ID) } // Assert that all the OCR jobs get a run with valid values eventually. for i := 0; i < numOracles; i++ { // Want at least 2 runs so we see all the metadata. pr := cltest.WaitForPipelineComplete(t, i, jids[i], 2, 7, apps[i].JobORM(), time.Minute, time.Second) jb, err := pr[0].Outputs.MarshalJSON() require.NoError(t, err) assert.Equal(t, []byte(fmt.Sprintf("[\"%d\"]", 10*i)), jb, "pr[0] %+v pr[1] %+v", pr[0], pr[1]) require.NoError(t, err) } // 4 oracles reporting 0, 10, 20, 30. Answer should be 20 (results[4/2]). g.Eventually(func() string { answer, err := ocrContract.LatestAnswer(nil) require.NoError(t, err) return answer.String() }, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.Equal("20")) ctx := testutils.Context(t) for _, app := range apps { jobs, _, err := app.JobORM().FindJobs(ctx, 0, 1000) require.NoError(t, err) // No spec errors for _, j := range jobs { ignore := 0 for i := range j.JobSpecErrors { // Non-fatal timing related error, ignore for testing. if strings.Contains(j.JobSpecErrors[i].Description, "leader's phase conflicts tGrace timeout") { ignore++ } } require.Len(t, j.JobSpecErrors, ignore) } } metaLock.Lock() defer metaLock.Unlock() assert.Len(t, expectedMeta, 0, "expected metadata %v", expectedMeta) })` $DIR/core/internal/features/features_test.go: `c.EVM[0].FlagsContractAddress = ptr(evmtypes.EIP55AddressFromAddress(flagsContractAddress))` $DIR/core/internal/features/features_test.go: `c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(test.eip1559)` $DIR/core/internal/features/features_test.go: `c.P2P.V2.DefaultBootstrappers = &[]ocrcommontypes.BootstrapperLocator{ {PeerID: bootstrapPeerID, Addrs: []string{fmt.Sprintf("127.0.0.1:%d", bootstrapNodePortV2)}}, }` $DIR/core/internal/features/features_test.go: `keys = append(keys, key)` $DIR/core/internal/features/features_test.go: `apps = append(apps, app)` $DIR/core/internal/features/features_test.go: `transmitters = append(transmitters, transmitter)` $DIR/core/internal/features/features_test.go: `oracles = append(oracles, confighelper.OracleIdentityExtra{ OracleIdentity: confighelper.OracleIdentity{ OnChainSigningAddress: ocrtypes.OnChainSigningAddress(key.OnChainSigning.Address()), TransmitAddress: transmitter, OffchainPublicKey: key.PublicKeyOffChain(), PeerID: peerID, }, SharedSecretEncryptionPublicKey: key.PublicKeyConfig(), })` $DIR/core/internal/features/features_test.go: `b.Commit()` $DIR/core/internal/features/features_test.go: `_, err = ocrContract.SetConfig(owner, signers, transmitters, threshold, encodedConfigVersion, encodedConfig, )` $DIR/core/internal/features/features_test.go: `b.Commit()` $DIR/core/internal/features/features_test.go: `err = appBootstrap.Start(testutils.Context(t))` $DIR/core/internal/features/features_test.go: `jb.Name = null.NewString("boot", true)` $DIR/core/internal/features/features_test.go: `err = appBootstrap.AddJobV2(testutils.Context(t), &jb)` $DIR/core/internal/features/features_test.go: `_, err = flagsContract.RaiseFlag(owner, ocrContractAddress)` $DIR/core/internal/features/features_test.go: `_, err = flagsContract.RaiseFlag(owner, evmutils.ZeroAddress)` $DIR/core/internal/features/features_test.go: `b.Commit()` $DIR/core/internal/features/features_test.go: `err = apps[i].Start(testutils.Context(t))` $DIR/core/internal/features/features_test.go: `time.Sleep(5 * time.Second)` $DIR/core/internal/features/features_test.go: `res.WriteHeader(http.StatusOK)` $DIR/core/internal/features/features_test.go: `t.Cleanup(slowServers[i].Close)` $DIR/core/internal/features/features_test.go: `metaLock.Lock()` $DIR/core/internal/features/features_test.go: `delete(expectedMeta, m.Meta.LatestAnswer.String())` $DIR/core/internal/features/features_test.go: `metaLock.Unlock()` $DIR/core/internal/features/features_test.go: `res.WriteHeader(http.StatusOK)` $DIR/core/internal/features/features_test.go: `_, err = res.Write([]byte(`{"data":10}`))` $DIR/core/internal/features/features_test.go: `t.Cleanup(servers[i].Close)` $DIR/core/internal/features/features_test.go: `jb.Name = null.NewString("testocr", true)` $DIR/core/internal/features/features_test.go: `err = apps[i].AddJobV2(testutils.Context(t), &jb)` $DIR/core/internal/features/features_test.go: `jids = append(jids, jb.ID)` $DIR/core/internal/features/features_test.go: `g.Eventually(func() string { answer, err := ocrContract.LatestAnswer(nil) require.NoError(t, err) return answer.String() }, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.Equal("20"))` $DIR/core/internal/features/features_test.go: `ignore++` $DIR/core/internal/features/features_test.go: `metaLock.Lock()` $DIR/core/internal/features/features_test.go: `testutils.SkipShort(t, "long test")` $DIR/core/internal/features/features_test.go: `c.Feature.LogPoller = ptr(true)` $DIR/core/internal/features/features_test.go: `c.EVM[0].FlagsContractAddress = ptr(evmtypes.EIP55AddressFromAddress(flagsContractAddress))` $DIR/core/internal/features/features_test.go: `c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(true)` $DIR/core/internal/features/features_test.go: `c.P2P.V2.DefaultBootstrappers = &[]ocrcommontypes.BootstrapperLocator{ {PeerID: bootstrapPeerID, Addrs: []string{fmt.Sprintf("127.0.0.1:%d", bootstrapNodePortV2)}}, }` $DIR/core/internal/features/features_test.go: `keys = append(keys, key)` $DIR/core/internal/features/features_test.go: `apps = append(apps, app)` $DIR/core/internal/features/features_test.go: `forwardersContracts = append(forwardersContracts, forwarder)` $DIR/core/internal/features/features_test.go: `transmitters = append(transmitters, transmitter)` $DIR/core/internal/features/features_test.go: `oracles = append(oracles, confighelper.OracleIdentityExtra{ OracleIdentity: confighelper.OracleIdentity{ OnChainSigningAddress: ocrtypes.OnChainSigningAddress(key.OnChainSigning.Address()), TransmitAddress: forwarder, OffchainPublicKey: key.PublicKeyOffChain(), PeerID: peerID, }, SharedSecretEncryptionPublicKey: key.PublicKeyConfig(), })` $DIR/core/internal/features/features_test.go: `b.Commit()` $DIR/core/internal/features/features_test.go: `b.Commit()` $DIR/core/internal/features/features_test.go: `_, err = ocrContract.SetConfig(owner, signers, effectiveTransmitters, // forwarder Addresses threshold, encodedConfigVersion, encodedConfig, )` $DIR/core/internal/features/features_test.go: `b.Commit()` $DIR/core/internal/features/features_test.go: `err = appBootstrap.Start(testutils.Context(t))` $DIR/core/internal/features/features_test.go: `jb.Name = null.NewString("boot", true)` $DIR/core/internal/features/features_test.go: `err = appBootstrap.AddJobV2(testutils.Context(t), &jb)` $DIR/core/internal/features/features_test.go: `_, err = flagsContract.RaiseFlag(owner, ocrContractAddress)` $DIR/core/internal/features/features_test.go: `_, err = flagsContract.RaiseFlag(owner, evmutils.ZeroAddress)` $DIR/core/internal/features/features_test.go: `b.Commit()` $DIR/core/internal/features/features_test.go: `err = apps[i].Start(testutils.Context(t))` $DIR/core/internal/features/features_test.go: `time.Sleep(5 * time.Second)` $DIR/core/internal/features/features_test.go: `res.WriteHeader(http.StatusOK)` $DIR/core/internal/features/features_test.go: `t.Cleanup(slowServers[i].Close)` $DIR/core/internal/features/features_test.go: `metaLock.Lock()` $DIR/core/internal/features/features_test.go: `delete(expectedMeta, m.Meta.LatestAnswer.String())` $DIR/core/internal/features/features_test.go: `metaLock.Unlock()` $DIR/core/internal/features/features_test.go: `res.WriteHeader(http.StatusOK)` $DIR/core/internal/features/features_test.go: `_, err = res.Write([]byte(`{"data":10}`))` $DIR/core/internal/features/features_test.go: `t.Cleanup(servers[i].Close)` $DIR/core/internal/features/features_test.go: `jb.Name = null.NewString("testocr", true)` $DIR/core/internal/features/features_test.go: `err = apps[i].AddJobV2(testutils.Context(t), &jb)` $DIR/core/internal/features/features_test.go: `jids = append(jids, jb.ID)` $DIR/core/internal/features/features_test.go: `g.Eventually(func() string { answer, err := ocrContract.LatestAnswer(nil) require.NoError(t, err) return answer.String() }, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.Equal("20"))` $DIR/core/internal/features/features_test.go: `ignore++` $DIR/core/internal/features/features_test.go: `metaLock.Lock()` $DIR/core/internal/features/features_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/internal/features/features_test.go: `c.EVM[0].GasEstimator.BlockHistory.CheckInclusionBlocks = ptr[uint16](0)` $DIR/core/internal/features/features_test.go: `c.EVM[0].GasEstimator.PriceDefault = assets.NewWeiI(initialDefaultGasPrice)` $DIR/core/internal/features/features_test.go: `c.EVM[0].GasEstimator.Mode = ptr("BlockHistory")` $DIR/core/internal/features/features_test.go: `c.EVM[0].RPCBlockQueryDelay = ptr[uint16](0)` $DIR/core/internal/features/features_test.go: `c.EVM[0].GasEstimator.BlockHistory.BlockHistorySize = ptr[uint16](2)` $DIR/core/internal/features/features_test.go: `c.EVM[0].FinalityDepth = ptr[uint32](3)` $DIR/core/internal/features/features_test.go: `ethClient.On("ConfiguredChainID").Return(big.NewInt(client.NullClientChainID)).Maybe()` $DIR/core/internal/features/features_test.go: `ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything). Return( func(ctx context.Context, ch chan<- *evmtypes.Head) ethereum.Subscription { sub := mockEth.NewSub(t) chchNewHeads <- evmtestutils.NewRawSub(ch, sub.Err()) return sub }, func(ctx context.Context, ch chan<- *evmtypes.Head) error { return nil }, )` $DIR/core/internal/features/features_test.go: `chchNewHeads <- evmtestutils.NewRawSub(ch, sub.Err())` $DIR/core/internal/features/features_test.go: `ethClient.On("PendingNonceAt", mock.Anything, mock.Anything).Maybe().Return(uint64(0), nil)` $DIR/core/internal/features/features_test.go: `ethClient.On("HeadByNumber", mock.Anything, mock.AnythingOfType("*big.Int")).Return(&h42, nil)` $DIR/core/internal/features/features_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == "0x2a" && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == "0x29" })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &b42 elems[1].Result = &b41 })` $DIR/core/internal/features/features_test.go: `elems[0].Result = &b42` $DIR/core/internal/features/features_test.go: `elems[1].Result = &b41` $DIR/core/internal/features/features_test.go: `ethClient.On("Dial", mock.Anything).Return(nil)` $DIR/core/internal/features/features_test.go: `ethClient.On("ConfiguredChainID", mock.Anything).Return(*evmtest.MustGetDefaultChainID(t, cfg.EVMConfigs()), nil)` $DIR/core/internal/features/features_test.go: `ethClient.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything).Maybe().Return(oneETH.ToInt(), nil)` $DIR/core/internal/features/features_test.go: `ethClient.On("HeadByHash", mock.Anything, h40.Hash).Return(&h40, nil).Maybe()` $DIR/core/internal/features/features_test.go: `ethClient.On("HeadByHash", mock.Anything, h41.Hash).Return(&h41, nil).Maybe()` $DIR/core/internal/features/features_test.go: `ethClient.On("HeadByHash", mock.Anything, h42.Hash).Return(&h42, nil).Maybe()` $DIR/core/internal/features/features_test.go: `servicetest.Run(t, re)` $DIR/core/internal/features/features_test.go: `ethClient.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == "0x2b" })).Return(nil).Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &b43 })` $DIR/core/internal/features/features_test.go: `elems[0].Result = &b43` $DIR/core/internal/features/features_test.go: `ethClient.On("Close").Return().Once()` $DIR/core/internal/features/features_test.go: `h43.ParentHash = h42.Hash` $DIR/core/internal/features/features_test.go: `newHeads.TrySend(h43)` $DIR/core/internal/features/features_test.go: `.Context(t)` $DIR/core/internal/features/features_test.go: `.NewEthMocksWithStartupAssertions(t)` $DIR/core/internal/features/features_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.JobPipeline.ExternalInitiatorsEnabled = ptr(true) c.Database.Listener.FallbackPollInterval = commonconfig.MustNewDuration(10 * time.Millisecond) })` $DIR/core/internal/features/features_test.go: `.MustNewDuration(10 * time.Millisecond)` $DIR/core/internal/features/features_test.go: `.NewApplicationWithConfig(t, cfg, ethClient, cltest.UseRealExternalInitiatorManager)` $DIR/core/internal/features/features_test.go: `.MustParse("0EEC7E1D-D0D2-476C-A1A8-72DFB6633F46")` $DIR/core/internal/features/features_test.go: `.String()` $DIR/core/internal/features/features_test.go: `.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if !eiNotifiedOfCreate { require.Equal(t, http.MethodPost, r.Method) eiNotifiedOfCreate = true defer r.Body.Close() var gotCreateJobRequest map[string]interface{} err := json.NewDecoder(r.Body).Decode(&gotCreateJobRequest) require.NoError(t, err) require.Equal(t, expectedCreateJobRequest, gotCreateJobRequest) w.WriteHeader(http.StatusOK) } else { require.Equal(t, http.MethodDelete, r.Method) eiNotifiedOfDelete = true defer r.Body.Close() require.Equal(t, fmt.Sprintf("/%v", jobUUID.String()), r.URL.Path) } }))` $DIR/core/internal/features/features_test.go: `.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if !eiNotifiedOfCreate { require.Equal(t, http.MethodPost, r.Method) eiNotifiedOfCreate = true defer r.Body.Close() var gotCreateJobRequest map[string]interface{} err := json.NewDecoder(r.Body).Decode(&gotCreateJobRequest) require.NoError(t, err) require.Equal(t, expectedCreateJobRequest, gotCreateJobRequest) w.WriteHeader(http.StatusOK) } else { require.Equal(t, http.MethodDelete, r.Method) eiNotifiedOfDelete = true defer r.Body.Close() require.Equal(t, fmt.Sprintf("/%v", jobUUID.String()), r.URL.Path) } })` $DIR/core/internal/features/features_test.go: `.NewDecoder(r.Body)` $DIR/core/internal/features/features_test.go: `.Decode(&gotCreateJobRequest)` $DIR/core/internal/features/features_test.go: `.WriteHeader(http.StatusOK)` $DIR/core/internal/features/features_test.go: `.Marshal(eiCreate)` $DIR/core/internal/features/features_test.go: `.CreateExternalInitiatorViaWeb(t, app, string(eiCreateJSON))` $DIR/core/internal/features/features_test.go: `.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { bridgeCalled = true defer r.Body.Close() var gotBridgeRequest map[string]interface{} err := json.NewDecoder(r.Body).Decode(&gotBridgeRequest) require.NoError(t, err) expectedBridgeRequest := map[string]interface{}{ "value": float64(42), } require.Equal(t, expectedBridgeRequest, gotBridgeRequest) w.WriteHeader(http.StatusOK) require.NoError(t, err) _, err = io.WriteString(w, `{}`) require.NoError(t, err) }))` $DIR/core/internal/features/features_test.go: `.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { bridgeCalled = true defer r.Body.Close() var gotBridgeRequest map[string]interface{} err := json.NewDecoder(r.Body).Decode(&gotBridgeRequest) require.NoError(t, err) expectedBridgeRequest := map[string]interface{}{ "value": float64(42), } require.Equal(t, expectedBridgeRequest, gotBridgeRequest) w.WriteHeader(http.StatusOK) require.NoError(t, err) _, err = io.WriteString(w, `{}`) require.NoError(t, err) })` $DIR/core/internal/features/features_test.go: `.NewDecoder(r.Body)` $DIR/core/internal/features/features_test.go: `.Decode(&gotBridgeRequest)` $DIR/core/internal/features/features_test.go: `.WriteHeader(http.StatusOK)` $DIR/core/internal/features/features_test.go: `.WriteString(w, `{}`)` $DIR/core/internal/features/features_test.go: `.Parse(bridgeServer.URL)` $DIR/core/internal/features/features_test.go: `.BridgeORM()` $DIR/core/internal/features/features_test.go: `.CreateBridgeType(ctx, &bridges.BridgeType{ Name: bridges.BridgeName("substrate-adapter1"), URL: models.WebURL(*u), })` $DIR/core/internal/features/features_test.go: `.BridgeName("substrate-adapter1")` $DIR/core/internal/features/features_test.go: `.WebURL(*u)` $DIR/core/internal/features/features_test.go: `.Sprintf(` type = "webhook" schemaVersion = 1 externalJobID = "%v" externalInitiators = [ { name = "%s", spec = """ %s """ } ] observationSource = """ parse [type=jsonparse path="result" data="$(jobRun.requestBody)"] submit [type=bridge name="substrate-adapter1" requestData=<{ "value": $(parse) }>] parse -> submit """ `, jobUUID, eiName, cltest.MustJSONMarshal(t, eiSpec))` $DIR/core/internal/features/features_test.go: `.MustJSONMarshal(t, eiSpec)` $DIR/core/internal/features/features_test.go: `.ValidatedWebhookSpec(ctx, tomlSpec, app.GetExternalInitiatorManager())` $DIR/core/internal/features/features_test.go: `.GetExternalInitiatorManager()` $DIR/core/internal/features/features_test.go: `.CreateJobViaWeb(t, app, []byte(cltest.MustJSONMarshal(t, web.CreateJobRequest{TOML: tomlSpec})))` $DIR/core/internal/features/features_test.go: `.MustJSONMarshal(t, web.CreateJobRequest{TOML: tomlSpec})` $DIR/core/internal/features/features_test.go: `.Run("calling webhook_spec with non-matching external_initiator_id returns unauthorized", func(t *testing.T) { eiaWrong := auth.NewToken() body := cltest.MustJSONMarshal(t, eiRequest) headers := make(map[string]string) headers[static.ExternalInitiatorAccessKeyHeader] = eiaWrong.AccessKey headers[static.ExternalInitiatorSecretHeader] = eiaWrong.Secret url := app.Server.URL + "/v2/jobs/" + jobUUID.String() + "/runs" bodyBuf := bytes.NewBufferString(body) resp, cleanup := cltest.UnauthenticatedPost(t, url, bodyBuf, headers) defer cleanup() cltest.AssertServerResponse(t, resp, 401) cltest.AssertCountStays(t, app.GetDB(), "pipeline_runs", 0) })` $DIR/core/internal/features/features_test.go: `.NewToken()` $DIR/core/internal/features/features_test.go: `.MustJSONMarshal(t, eiRequest)` $DIR/core/internal/features/features_test.go: `.String()` $DIR/core/internal/features/features_test.go: `.NewBufferString(body)` $DIR/core/internal/features/features_test.go: `.UnauthenticatedPost(t, url, bodyBuf, headers)` $DIR/core/internal/features/features_test.go: `.AssertServerResponse(t, resp, 401)` $DIR/core/internal/features/features_test.go: `.AssertCountStays(t, app.GetDB(), "pipeline_runs", 0)` $DIR/core/internal/features/features_test.go: `.GetDB()` $DIR/core/internal/features/features_test.go: `.Run("calling webhook_spec with matching external_initiator_id works", func(t *testing.T) { // Simulate request from EI -> Core node cltest.AwaitJobActive(t, app.JobSpawner(), jobID, 3*time.Second) _ = cltest.CreateJobRunViaExternalInitiatorV2(t, app, jobUUID, *eia, cltest.MustJSONMarshal(t, eiRequest)) pipelineORM := pipeline.NewORM(app.GetDB(), logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns()) bridgeORM := bridges.NewORM(app.GetDB()) jobORM := job.NewORM(app.GetDB(), pipelineORM, bridgeORM, app.KeyStore, logger.TestLogger(t)) runs := cltest.WaitForPipelineComplete(t, 0, jobID, 1, 2, jobORM, 5*time.Second, 300*time.Millisecond) require.Len(t, runs, 1) run := runs[0] require.Len(t, run.PipelineTaskRuns, 2) require.Empty(t, run.PipelineTaskRuns[0].Error) require.Empty(t, run.PipelineTaskRuns[1].Error) assert.True(t, bridgeCalled, "expected bridge server to be called") })` $DIR/core/internal/features/features_test.go: `.AwaitJobActive(t, app.JobSpawner(), jobID, 3*time.Second)` $DIR/core/internal/features/features_test.go: `.JobSpawner()` $DIR/core/internal/features/features_test.go: `.CreateJobRunViaExternalInitiatorV2(t, app, jobUUID, *eia, cltest.MustJSONMarshal(t, eiRequest))` $DIR/core/internal/features/features_test.go: `.MustJSONMarshal(t, eiRequest)` $DIR/core/internal/features/features_test.go: `.NewORM(app.GetDB(), logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns())` $DIR/core/internal/features/features_test.go: `.GetDB()` $DIR/core/internal/features/features_test.go: `.TestLogger(t)` $DIR/core/internal/features/features_test.go: `.JobPipeline()` $DIR/core/internal/features/features_test.go: `.MaxSuccessfulRuns()` $DIR/core/internal/features/features_test.go: `.NewORM(app.GetDB())` $DIR/core/internal/features/features_test.go: `.GetDB()` $DIR/core/internal/features/features_test.go: `.NewORM(app.GetDB(), pipelineORM, bridgeORM, app.KeyStore, logger.TestLogger(t))` $DIR/core/internal/features/features_test.go: `.GetDB()` $DIR/core/internal/features/features_test.go: `.TestLogger(t)` $DIR/core/internal/features/features_test.go: `.WaitForPipelineComplete(t, 0, jobID, 1, 2, jobORM, 5*time.Second, 300*time.Millisecond)` $DIR/core/internal/features/features_test.go: `.DeleteJobViaWeb(t, app, jobID)` $DIR/core/internal/features/features_test.go: `.Context(t)` $DIR/core/internal/features/features_test.go: `.NewApplication(t)` $DIR/core/internal/features/features_test.go: `.MustRandomUser(t)` $DIR/core/internal/features/features_test.go: `.New()` $DIR/core/internal/features/features_test.go: `.String()` $DIR/core/internal/features/features_test.go: `.New()` $DIR/core/internal/features/features_test.go: `.String()` $DIR/core/internal/features/features_test.go: `.AuthenticationProvider()` $DIR/core/internal/features/features_test.go: `.UnauthenticatedGet(t, url, headers)` $DIR/core/internal/features/features_test.go: `.Run(test.name, func(t *testing.T) { ctx := testutils.Context(t) // Simulate a consumer contract calling to obtain ETH quotes in 3 different currencies // in a single callback. config := configtest.NewGeneralConfigSimulated(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Database.Listener.FallbackPollInterval = commonconfig.MustNewDuration(100 * time.Millisecond) c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(true) }) operatorContracts := setupOperatorContracts(t) b := operatorContracts.sim app := cltest.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, b) sendingKeys, err := app.KeyStore.Eth().EnabledKeysForChain(ctx, testutils.SimulatedChainID) require.NoError(t, err) authorizedSenders := []common.Address{sendingKeys[0].Address} tx, err := operatorContracts.operator.SetAuthorizedSenders(operatorContracts.user, authorizedSenders) require.NoError(t, err) b.Commit() cltest.RequireTxSuccessful(t, b, tx.Hash()) // Fund node account with ETH. n, err := b.NonceAt(testutils.Context(t), operatorContracts.user.From, nil) require.NoError(t, err) tx = cltest.NewLegacyTransaction(n, sendingKeys[0].Address, assets.Ether(100).ToInt(), 21000, big.NewInt(1000000000), nil) signedTx, err := operatorContracts.user.Signer(operatorContracts.user.From, tx) require.NoError(t, err) err = b.SendTransaction(testutils.Context(t), signedTx) require.NoError(t, err) b.Commit() err = app.Start(testutils.Context(t)) require.NoError(t, err) mockServerUSD := cltest.NewHTTPMockServer(t, 200, "GET", `{"USD": 614.64}`) mockServerEUR := cltest.NewHTTPMockServer(t, 200, "GET", `{"EUR": 507.07}`) mockServerJPY := cltest.NewHTTPMockServer(t, 200, "GET", `{"JPY": 63818.86}`) nameAndExternalJobID := uuid.New() addr := operatorContracts.operatorAddress.Hex() spec := fmt.Sprintf(multiWordSpecTemplate, nameAndExternalJobID, addr, nameAndExternalJobID, addr) j := cltest.CreateJobViaWeb(t, app, []byte(cltest.MustJSONMarshal(t, web.CreateJobRequest{TOML: spec}))) cltest.AwaitJobActive(t, app.JobSpawner(), j.ID, 5*time.Second) var jobID [32]byte copy(jobID[:], j.ExternalJobID[:]) tx, err = operatorContracts.multiWord.SetSpecID(operatorContracts.user, jobID) require.NoError(t, err) b.Commit() cltest.RequireTxSuccessful(t, b, tx.Hash()) operatorContracts.user.GasLimit = 1000000 tx, err = operatorContracts.multiWord.RequestMultipleParametersWithCustomURLs(operatorContracts.user, mockServerUSD.URL, "USD", mockServerEUR.URL, "EUR", mockServerJPY.URL, "JPY", big.NewInt(1000), ) require.NoError(t, err) b.Commit() cltest.RequireTxSuccessful(t, b, tx.Hash()) empty := big.NewInt(0) assertPricesUint256(t, empty, empty, empty, operatorContracts.multiWord) stopBlocks := utils.FiniteTicker(100*time.Millisecond, func() { triggerAllKeys(t, app) b.Commit() }) defer stopBlocks() pipelineRuns := cltest.WaitForPipelineComplete(t, 0, j.ID, 1, 14, app.JobORM(), testutils.WaitTimeout(t)/2, time.Second) pipelineRun := pipelineRuns[0] assertPipelineTaskRunsSuccessful(t, pipelineRun.PipelineTaskRuns) assertPricesUint256(t, big.NewInt(61464), big.NewInt(50707), big.NewInt(6381886), operatorContracts.multiWord) nameAndExternalJobID = uuid.New() singleWordSpec := fmt.Sprintf(singleWordSpecTemplate, nameAndExternalJobID, addr, nameAndExternalJobID, addr) jobSingleWord := cltest.CreateJobViaWeb(t, app, []byte(cltest.MustJSONMarshal(t, web.CreateJobRequest{TOML: singleWordSpec}))) cltest.AwaitJobActive(t, app.JobSpawner(), jobSingleWord.ID, 5*time.Second) var jobIDSingleWord [32]byte copy(jobIDSingleWord[:], jobSingleWord.ExternalJobID[:]) tx, err = operatorContracts.singleWord.SetSpecID(operatorContracts.user, jobIDSingleWord) require.NoError(t, err) b.Commit() cltest.RequireTxSuccessful(t, b, tx.Hash()) mockServerUSD2 := cltest.NewHTTPMockServer(t, 200, "GET", `{"USD": 614.64}`) tx, err = operatorContracts.singleWord.RequestMultipleParametersWithCustomURLs(operatorContracts.user, mockServerUSD2.URL, "USD", big.NewInt(1000), ) require.NoError(t, err) b.Commit() cltest.RequireTxSuccessful(t, b, tx.Hash()) pipelineRuns = cltest.WaitForPipelineComplete(t, 0, jobSingleWord.ID, 1, 8, app.JobORM(), testutils.WaitTimeout(t), time.Second) pipelineRun = pipelineRuns[0] assertPipelineTaskRunsSuccessful(t, pipelineRun.PipelineTaskRuns) v, err := operatorContracts.singleWord.CurrentPriceInt(nil) require.NoError(t, err) assert.Equal(t, big.NewInt(61464), v) })` $DIR/core/internal/features/features_test.go: `.Context(t)` $DIR/core/internal/features/features_test.go: `.NewGeneralConfigSimulated(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Database.Listener.FallbackPollInterval = commonconfig.MustNewDuration(100 * time.Millisecond) c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(true) })` $DIR/core/internal/features/features_test.go: `.MustNewDuration(100 * time.Millisecond)` $DIR/core/internal/features/features_test.go: `.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, b)` $DIR/core/internal/features/features_test.go: `.KeyStore.Eth()` $DIR/core/internal/features/features_test.go: `.EnabledKeysForChain(ctx, testutils.SimulatedChainID)` $DIR/core/internal/features/features_test.go: `.operator.SetAuthorizedSenders(operatorContracts.user, authorizedSenders)` $DIR/core/internal/features/features_test.go: `.Commit()` $DIR/core/internal/features/features_test.go: `.RequireTxSuccessful(t, b, tx.Hash())` $DIR/core/internal/features/features_test.go: `.Hash()` $DIR/core/internal/features/features_test.go: `.NonceAt(testutils.Context(t), operatorContracts.user.From, nil)` $DIR/core/internal/features/features_test.go: `.Context(t)` $DIR/core/internal/features/features_test.go: `.NewLegacyTransaction(n, sendingKeys[0].Address, assets.Ether(100).ToInt(), 21000, big.NewInt(1000000000), nil)` $DIR/core/internal/features/features_test.go: `.Ether(100)` $DIR/core/internal/features/features_test.go: `.ToInt()` $DIR/core/internal/features/features_test.go: `.NewInt(1000000000)` $DIR/core/internal/features/features_test.go: `.user.Signer(operatorContracts.user.From, tx)` $DIR/core/internal/features/features_test.go: `.SendTransaction(testutils.Context(t), signedTx)` $DIR/core/internal/features/features_test.go: `.Context(t)` $DIR/core/internal/features/features_test.go: `.Commit()` $DIR/core/internal/features/features_test.go: `.Start(testutils.Context(t))` $DIR/core/internal/features/features_test.go: `.Context(t)` $DIR/core/internal/features/features_test.go: `.NewHTTPMockServer(t, 200, "GET", `{"USD": 614.64}`)` $DIR/core/internal/features/features_test.go: `.NewHTTPMockServer(t, 200, "GET", `{"EUR": 507.07}`)` $DIR/core/internal/features/features_test.go: `.NewHTTPMockServer(t, 200, "GET", `{"JPY": 63818.86}`)` $DIR/core/internal/features/features_test.go: `.New()` $DIR/core/internal/features/features_test.go: `.operatorAddress.Hex()` $DIR/core/internal/features/features_test.go: `.Sprintf(multiWordSpecTemplate, nameAndExternalJobID, addr, nameAndExternalJobID, addr)` $DIR/core/internal/features/features_test.go: `.CreateJobViaWeb(t, app, []byte(cltest.MustJSONMarshal(t, web.CreateJobRequest{TOML: spec})))` $DIR/core/internal/features/features_test.go: `.MustJSONMarshal(t, web.CreateJobRequest{TOML: spec})` $DIR/core/internal/features/features_test.go: `.AwaitJobActive(t, app.JobSpawner(), j.ID, 5*time.Second)` $DIR/core/internal/features/features_test.go: `.JobSpawner()` $DIR/core/internal/features/features_test.go: `.multiWord.SetSpecID(operatorContracts.user, jobID)` $DIR/core/internal/features/features_test.go: `.Commit()` $DIR/core/internal/features/features_test.go: `.RequireTxSuccessful(t, b, tx.Hash())` $DIR/core/internal/features/features_test.go: `.Hash()` $DIR/core/internal/features/features_test.go: `.multiWord.RequestMultipleParametersWithCustomURLs(operatorContracts.user, mockServerUSD.URL, "USD", mockServerEUR.URL, "EUR", mockServerJPY.URL, "JPY", big.NewInt(1000), )` $DIR/core/internal/features/features_test.go: `.NewInt(1000)` $DIR/core/internal/features/features_test.go: `.Commit()` $DIR/core/internal/features/features_test.go: `.RequireTxSuccessful(t, b, tx.Hash())` $DIR/core/internal/features/features_test.go: `.Hash()` $DIR/core/internal/features/features_test.go: `.NewInt(0)` $DIR/core/internal/features/features_test.go: `.FiniteTicker(100*time.Millisecond, func() { triggerAllKeys(t, app) b.Commit() })` $DIR/core/internal/features/features_test.go: `.Commit()` $DIR/core/internal/features/features_test.go: `.WaitForPipelineComplete(t, 0, j.ID, 1, 14, app.JobORM(), testutils.WaitTimeout(t)/2, time.Second)` $DIR/core/internal/features/features_test.go: `.JobORM()` $DIR/core/internal/features/features_test.go: `.WaitTimeout(t)` $DIR/core/internal/features/features_test.go: `.NewInt(61464)` $DIR/core/internal/features/features_test.go: `.NewInt(50707)` $DIR/core/internal/features/features_test.go: `.NewInt(6381886)` $DIR/core/internal/features/features_test.go: `.New()` $DIR/core/internal/features/features_test.go: `.Sprintf(singleWordSpecTemplate, nameAndExternalJobID, addr, nameAndExternalJobID, addr)` $DIR/core/internal/features/features_test.go: `.CreateJobViaWeb(t, app, []byte(cltest.MustJSONMarshal(t, web.CreateJobRequest{TOML: singleWordSpec})))` $DIR/core/internal/features/features_test.go: `.MustJSONMarshal(t, web.CreateJobRequest{TOML: singleWordSpec})` $DIR/core/internal/features/features_test.go: `.AwaitJobActive(t, app.JobSpawner(), jobSingleWord.ID, 5*time.Second)` $DIR/core/internal/features/features_test.go: `.JobSpawner()` $DIR/core/internal/features/features_test.go: `.singleWord.SetSpecID(operatorContracts.user, jobIDSingleWord)` $DIR/core/internal/features/features_test.go: `.Commit()` $DIR/core/internal/features/features_test.go: `.RequireTxSuccessful(t, b, tx.Hash())` $DIR/core/internal/features/features_test.go: `.Hash()` $DIR/core/internal/features/features_test.go: `.NewHTTPMockServer(t, 200, "GET", `{"USD": 614.64}`)` $DIR/core/internal/features/features_test.go: `.singleWord.RequestMultipleParametersWithCustomURLs(operatorContracts.user, mockServerUSD2.URL, "USD", big.NewInt(1000), )` $DIR/core/internal/features/features_test.go: `.NewInt(1000)` $DIR/core/internal/features/features_test.go: `.Commit()` $DIR/core/internal/features/features_test.go: `.RequireTxSuccessful(t, b, tx.Hash())` $DIR/core/internal/features/features_test.go: `.Hash()` $DIR/core/internal/features/features_test.go: `.WaitForPipelineComplete(t, 0, jobSingleWord.ID, 1, 8, app.JobORM(), testutils.WaitTimeout(t), time.Second)` $DIR/core/internal/features/features_test.go: `.JobORM()` $DIR/core/internal/features/features_test.go: `.WaitTimeout(t)` $DIR/core/internal/features/features_test.go: `.singleWord.CurrentPriceInt(nil)` $DIR/core/internal/features/features_test.go: `.Run("with FailOnRevert enabled, run succeeds when transaction is successful", func(t *testing.T) { app, sendingAddr, o := setupAppForEthTx(t, operatorContracts) tomlSpec := ` type = "webhook" schemaVersion = 1 observationSource = """ submit_tx [type=ethtx to="%s" data="%s" minConfirmations="2" failOnRevert=false evmChainID="%s" from="[\\"%s\\"]" ] """ ` // This succeeds for whatever reason revertingData := "0xdeadbeef" tomlSpec = fmt.Sprintf(tomlSpec, operatorContracts.linkTokenAddress.String(), revertingData, testutils.SimulatedChainID.String(), sendingAddr) j := cltest.CreateJobViaWeb(t, app, []byte(cltest.MustJSONMarshal(t, web.CreateJobRequest{TOML: tomlSpec}))) cltest.AwaitJobActive(t, app.JobSpawner(), j.ID, testutils.WaitTimeout(t)) run := cltest.CreateJobRunViaUser(t, app, j.ExternalJobID, "") assert.Equal(t, []*string(nil), run.Outputs) assert.Equal(t, []*string(nil), run.Errors) testutils.WaitForLogMessage(t, o, "Sending transaction") b.Commit() // Needs at least two confirmations b.Commit() // Needs at least two confirmations b.Commit() // Needs at least two confirmations testutils.WaitForLogMessage(t, o, "Resume run success") pipelineRuns := cltest.WaitForPipelineComplete(t, 0, j.ID, 1, 1, app.JobORM(), testutils.WaitTimeout(t), time.Second) // The run should have succeeded but with the receipt detailing the reverted transaction pipelineRun := pipelineRuns[0] assertPipelineTaskRunsSuccessful(t, pipelineRun.PipelineTaskRuns) outputs := pipelineRun.Outputs.Val.([]interface{}) require.Len(t, outputs, 1) output := outputs[0] receipt := output.(map[string]interface{}) assert.Equal(t, "0x7", receipt["blockNumber"]) assert.Equal(t, "0x538f", receipt["gasUsed"]) assert.Equal(t, "0x0", receipt["status"]) // success })` $DIR/core/internal/features/features_test.go: `.Sprintf(tomlSpec, operatorContracts.linkTokenAddress.String(), revertingData, testutils.SimulatedChainID.String(), sendingAddr)` $DIR/core/internal/features/features_test.go: `.linkTokenAddress.String()` $DIR/core/internal/features/features_test.go: `.SimulatedChainID.String()` $DIR/core/internal/features/features_test.go: `.CreateJobViaWeb(t, app, []byte(cltest.MustJSONMarshal(t, web.CreateJobRequest{TOML: tomlSpec})))` $DIR/core/internal/features/features_test.go: `.MustJSONMarshal(t, web.CreateJobRequest{TOML: tomlSpec})` $DIR/core/internal/features/features_test.go: `.AwaitJobActive(t, app.JobSpawner(), j.ID, testutils.WaitTimeout(t))` $DIR/core/internal/features/features_test.go: `.JobSpawner()` $DIR/core/internal/features/features_test.go: `.WaitTimeout(t)` $DIR/core/internal/features/features_test.go: `.CreateJobRunViaUser(t, app, j.ExternalJobID, "")` $DIR/core/internal/features/features_test.go: `.WaitForLogMessage(t, o, "Sending transaction")` $DIR/core/internal/features/features_test.go: `.Commit()` $DIR/core/internal/features/features_test.go: `.Commit()` $DIR/core/internal/features/features_test.go: `.Commit()` $DIR/core/internal/features/features_test.go: `.WaitForLogMessage(t, o, "Resume run success")` $DIR/core/internal/features/features_test.go: `.WaitForPipelineComplete(t, 0, j.ID, 1, 1, app.JobORM(), testutils.WaitTimeout(t), time.Second)` $DIR/core/internal/features/features_test.go: `.JobORM()` $DIR/core/internal/features/features_test.go: `.WaitTimeout(t)` $DIR/core/internal/features/features_test.go: `.Run("with FailOnRevert enabled, run fails with transaction reverted error", func(t *testing.T) { app, sendingAddr, o := setupAppForEthTx(t, operatorContracts) tomlSpec := ` type = "webhook" schemaVersion = 1 observationSource = """ submit_tx [type=ethtx to="%s" data="%s" minConfirmations="2" failOnRevert=true evmChainID="%s" from="[\\"%s\\"]" ] """ ` // This data is a call to link token's `transfer` function and will revert due to insufficient LINK on the sender address revertingData := "0xa9059cbb000000000000000000000000526485b5abdd8ae9c6a63548e0215a83e7135e6100000000000000000000000000000000000000000000000db069932ea4fe1400" tomlSpec = fmt.Sprintf(tomlSpec, operatorContracts.linkTokenAddress.String(), revertingData, testutils.SimulatedChainID.String(), sendingAddr) j := cltest.CreateJobViaWeb(t, app, []byte(cltest.MustJSONMarshal(t, web.CreateJobRequest{TOML: tomlSpec}))) cltest.AwaitJobActive(t, app.JobSpawner(), j.ID, testutils.WaitTimeout(t)) run := cltest.CreateJobRunViaUser(t, app, j.ExternalJobID, "") assert.Equal(t, []*string(nil), run.Outputs) assert.Equal(t, []*string(nil), run.Errors) testutils.WaitForLogMessage(t, o, "Sending transaction") b.Commit() // Needs at least two confirmations b.Commit() // Needs at least two confirmations b.Commit() // Needs at least two confirmations testutils.WaitForLogMessage(t, o, "Resume run success") pipelineRuns := cltest.WaitForPipelineError(t, 0, j.ID, 1, 1, app.JobORM(), testutils.WaitTimeout(t), time.Second) // The run should have failed as a revert pipelineRun := pipelineRuns[0] assertPipelineTaskRunsErrored(t, pipelineRun.PipelineTaskRuns) })` $DIR/core/internal/features/features_test.go: `.Sprintf(tomlSpec, operatorContracts.linkTokenAddress.String(), revertingData, testutils.SimulatedChainID.String(), sendingAddr)` $DIR/core/internal/features/features_test.go: `.linkTokenAddress.String()` $DIR/core/internal/features/features_test.go: `.SimulatedChainID.String()` $DIR/core/internal/features/features_test.go: `.CreateJobViaWeb(t, app, []byte(cltest.MustJSONMarshal(t, web.CreateJobRequest{TOML: tomlSpec})))` $DIR/core/internal/features/features_test.go: `.MustJSONMarshal(t, web.CreateJobRequest{TOML: tomlSpec})` $DIR/core/internal/features/features_test.go: `.AwaitJobActive(t, app.JobSpawner(), j.ID, testutils.WaitTimeout(t))` $DIR/core/internal/features/features_test.go: `.JobSpawner()` $DIR/core/internal/features/features_test.go: `.WaitTimeout(t)` $DIR/core/internal/features/features_test.go: `.CreateJobRunViaUser(t, app, j.ExternalJobID, "")` $DIR/core/internal/features/features_test.go: `.WaitForLogMessage(t, o, "Sending transaction")` $DIR/core/internal/features/features_test.go: `.Commit()` $DIR/core/internal/features/features_test.go: `.Commit()` $DIR/core/internal/features/features_test.go: `.Commit()` $DIR/core/internal/features/features_test.go: `.WaitForLogMessage(t, o, "Resume run success")` $DIR/core/internal/features/features_test.go: `.WaitForPipelineError(t, 0, j.ID, 1, 1, app.JobORM(), testutils.WaitTimeout(t), time.Second)` $DIR/core/internal/features/features_test.go: `.JobORM()` $DIR/core/internal/features/features_test.go: `.WaitTimeout(t)` $DIR/core/internal/features/features_test.go: `.Sprintf(tomlSpec, operatorContracts.linkTokenAddress.String(), revertingData, testutils.SimulatedChainID.String(), sendingAddr)` $DIR/core/internal/features/features_test.go: `.linkTokenAddress.String()` $DIR/core/internal/features/features_test.go: `.SimulatedChainID.String()` $DIR/core/internal/features/features_test.go: `.CreateJobViaWeb(t, app, []byte(cltest.MustJSONMarshal(t, web.CreateJobRequest{TOML: tomlSpec})))` $DIR/core/internal/features/features_test.go: `.MustJSONMarshal(t, web.CreateJobRequest{TOML: tomlSpec})` $DIR/core/internal/features/features_test.go: `.AwaitJobActive(t, app.JobSpawner(), j.ID, testutils.WaitTimeout(t))` $DIR/core/internal/features/features_test.go: `.JobSpawner()` $DIR/core/internal/features/features_test.go: `.WaitTimeout(t)` $DIR/core/internal/features/features_test.go: `.CreateJobRunViaUser(t, app, j.ExternalJobID, "")` $DIR/core/internal/features/features_test.go: `.WaitForLogMessage(t, o, "Sending transaction")` $DIR/core/internal/features/features_test.go: `.Commit()` $DIR/core/internal/features/features_test.go: `.Commit()` $DIR/core/internal/features/features_test.go: `.Commit()` $DIR/core/internal/features/features_test.go: `.WaitForLogMessage(t, o, "Resume run success")` $DIR/core/internal/features/features_test.go: `.WaitForPipelineComplete(t, 0, j.ID, 1, 1, app.JobORM(), testutils.WaitTimeout(t), time.Second)` $DIR/core/internal/features/features_test.go: `.JobORM()` $DIR/core/internal/features/features_test.go: `.WaitTimeout(t)` $DIR/core/internal/features/features_test.go: `.SkipShort(t, "long test")` $DIR/core/internal/features/features_test.go: `.Run(test.name, func(t *testing.T) { t.Parallel() bootstrapNodePortV2 := freeport.GetOne(t) g := gomega.NewWithT(t) owner, b, ocrContractAddress, ocrContract, flagsContract, flagsContractAddress := setupOCRContracts(t) // Note it's plausible these ports could be occupied on a CI machine. // May need a port randomize + retry approach if we observe collisions. appBootstrap, bootstrapPeerID, _, _ := setupNode(t, owner, bootstrapNodePortV2, b, nil) var ( oracles []confighelper.OracleIdentityExtra transmitters []common.Address keys []ocrkey.KeyV2 apps []*cltest.TestApplication ) ports := freeport.GetN(t, numOracles) for i := 0; i < numOracles; i++ { app, peerID, transmitter, key := setupNode(t, owner, ports[i], b, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].FlagsContractAddress = ptr(evmtypes.EIP55AddressFromAddress(flagsContractAddress)) c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(test.eip1559) c.P2P.V2.DefaultBootstrappers = &[]ocrcommontypes.BootstrapperLocator{ {PeerID: bootstrapPeerID, Addrs: []string{fmt.Sprintf("127.0.0.1:%d", bootstrapNodePortV2)}}, } }) keys = append(keys, key) apps = append(apps, app) transmitters = append(transmitters, transmitter) oracles = append(oracles, confighelper.OracleIdentityExtra{ OracleIdentity: confighelper.OracleIdentity{ OnChainSigningAddress: ocrtypes.OnChainSigningAddress(key.OnChainSigning.Address()), TransmitAddress: transmitter, OffchainPublicKey: key.PublicKeyOffChain(), PeerID: peerID, }, SharedSecretEncryptionPublicKey: key.PublicKeyConfig(), }) } stopBlocks := utils.FiniteTicker(time.Second, func() { b.Commit() }) defer stopBlocks() _, err := ocrContract.SetPayees(owner, transmitters, transmitters, ) require.NoError(t, err) signers, transmitters, threshold, encodedConfigVersion, encodedConfig, err := confighelper.ContractSetConfigArgsForIntegrationTest( oracles, 1, 1000000000/100, // threshold PPB ) require.NoError(t, err) _, err = ocrContract.SetConfig(owner, signers, transmitters, threshold, encodedConfigVersion, encodedConfig, ) require.NoError(t, err) b.Commit() err = appBootstrap.Start(testutils.Context(t)) require.NoError(t, err) jb, err := ocr.ValidatedOracleSpecToml(appBootstrap.Config, appBootstrap.GetRelayers().LegacyEVMChains(), fmt.Sprintf(` type = "offchainreporting" schemaVersion = 1 name = "boot" contractAddress = "%s" evmChainID = "%s" isBootstrapPeer = true `, ocrContractAddress, testutils.SimulatedChainID.String())) require.NoError(t, err) jb.Name = null.NewString("boot", true) err = appBootstrap.AddJobV2(testutils.Context(t), &jb) require.NoError(t, err) // Raising flags to initiate hibernation _, err = flagsContract.RaiseFlag(owner, ocrContractAddress) require.NoError(t, err, "failed to raise flag for ocrContractAddress") _, err = flagsContract.RaiseFlag(owner, evmutils.ZeroAddress) require.NoError(t, err, "failed to raise flag for ZeroAddress") b.Commit() var jids []int32 var servers, slowServers = make([]*httptest.Server, 4), make([]*httptest.Server, 4) // We expect metadata of: // latestAnswer:nil // First call // latestAnswer:0 // latestAnswer:10 // latestAnswer:20 // latestAnswer:30 var metaLock sync.Mutex expectedMeta := map[string]struct{}{ "0": {}, "10": {}, "20": {}, "30": {}, } for i := 0; i < numOracles; i++ { err = apps[i].Start(testutils.Context(t)) require.NoError(t, err) // Since this API speed is > ObservationTimeout we should ignore it and still produce values. slowServers[i] = httptest.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { time.Sleep(5 * time.Second) res.WriteHeader(http.StatusOK) _, err := res.Write([]byte(`{"data":10}`)) require.NoError(t, err) })) t.Cleanup(slowServers[i].Close) servers[i] = httptest.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { b, err := io.ReadAll(req.Body) require.NoError(t, err) var m bridges.BridgeMetaDataJSON require.NoError(t, json.Unmarshal(b, &m)) if m.Meta.LatestAnswer != nil && m.Meta.UpdatedAt != nil { metaLock.Lock() delete(expectedMeta, m.Meta.LatestAnswer.String()) metaLock.Unlock() } res.WriteHeader(http.StatusOK) _, err = res.Write([]byte(`{"data":10}`)) require.NoError(t, err) })) t.Cleanup(servers[i].Close) u, _ := url.Parse(servers[i].URL) err := apps[i].BridgeORM().CreateBridgeType(testutils.Context(t), &bridges.BridgeType{ Name: bridges.BridgeName(fmt.Sprintf("bridge%d", i)), URL: models.WebURL(*u), }) require.NoError(t, err) // Note we need: observationTimeout + observationGracePeriod + DeltaGrace (500ms) < DeltaRound (1s) // So 200ms + 200ms + 500ms < 1s jb, err := ocr.ValidatedOracleSpecToml(apps[i].Config, apps[i].GetRelayers().LegacyEVMChains(), fmt.Sprintf(` type = "offchainreporting" schemaVersion = 1 name = "web oracle spec" contractAddress = "%s" evmChainID = "%s" isBootstrapPeer = false keyBundleID = "%s" transmitterAddress = "%s" observationTimeout = "100ms" contractConfigConfirmations = 1 contractConfigTrackerPollInterval = "1s" observationSource = """ // data source 1 ds1 [type=bridge name="%s"]; ds1_parse [type=jsonparse path="data"]; ds1_multiply [type=multiply times=%d]; // data source 2 ds2 [type=http method=GET url="%s"]; ds2_parse [type=jsonparse path="data"]; ds2_multiply [type=multiply times=%d]; ds1 -> ds1_parse -> ds1_multiply -> answer1; ds2 -> ds2_parse -> ds2_multiply -> answer1; answer1 [type=median index=0]; """ `, ocrContractAddress, testutils.SimulatedChainID.String(), keys[i].ID(), transmitters[i], fmt.Sprintf("bridge%d", i), i, slowServers[i].URL, i)) require.NoError(t, err) jb.Name = null.NewString("testocr", true) err = apps[i].AddJobV2(testutils.Context(t), &jb) require.NoError(t, err) jids = append(jids, jb.ID) } // Assert that all the OCR jobs get a run with valid values eventually. for i := 0; i < numOracles; i++ { // Want at least 2 runs so we see all the metadata. pr := cltest.WaitForPipelineComplete(t, i, jids[i], 2, 7, apps[i].JobORM(), time.Minute, time.Second) jb, err := pr[0].Outputs.MarshalJSON() require.NoError(t, err) assert.Equal(t, []byte(fmt.Sprintf("[\"%d\"]", 10*i)), jb, "pr[0] %+v pr[1] %+v", pr[0], pr[1]) require.NoError(t, err) } // 4 oracles reporting 0, 10, 20, 30. Answer should be 20 (results[4/2]). g.Eventually(func() string { answer, err := ocrContract.LatestAnswer(nil) require.NoError(t, err) return answer.String() }, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.Equal("20")) ctx := testutils.Context(t) for _, app := range apps { jobs, _, err := app.JobORM().FindJobs(ctx, 0, 1000) require.NoError(t, err) // No spec errors for _, j := range jobs { ignore := 0 for i := range j.JobSpecErrors { // Non-fatal timing related error, ignore for testing. if strings.Contains(j.JobSpecErrors[i].Description, "leader's phase conflicts tGrace timeout") { ignore++ } } require.Len(t, j.JobSpecErrors, ignore) } } metaLock.Lock() defer metaLock.Unlock() assert.Len(t, expectedMeta, 0, "expected metadata %v", expectedMeta) })` $DIR/core/internal/features/features_test.go: `.GetOne(t)` $DIR/core/internal/features/features_test.go: `.NewWithT(t)` $DIR/core/internal/features/features_test.go: `.GetN(t, numOracles)` $DIR/core/internal/features/features_test.go: `.EIP55AddressFromAddress(flagsContractAddress)` $DIR/core/internal/features/features_test.go: `.Sprintf("127.0.0.1:%d", bootstrapNodePortV2)` $DIR/core/internal/features/features_test.go: `.OnChainSigningAddress(key.OnChainSigning.Address())` $DIR/core/internal/features/features_test.go: `.OnChainSigning.Address()` $DIR/core/internal/features/features_test.go: `.PublicKeyOffChain()` $DIR/core/internal/features/features_test.go: `.PublicKeyConfig()` $DIR/core/internal/features/features_test.go: `.FiniteTicker(time.Second, func() { b.Commit() })` $DIR/core/internal/features/features_test.go: `.Commit()` $DIR/core/internal/features/features_test.go: `.SetPayees(owner, transmitters, transmitters, )` $DIR/core/internal/features/features_test.go: `.ContractSetConfigArgsForIntegrationTest( oracles, 1, 1000000000/100, // threshold PPB )` $DIR/core/internal/features/features_test.go: `.SetConfig(owner, signers, transmitters, threshold, encodedConfigVersion, encodedConfig, )` $DIR/core/internal/features/features_test.go: `.Commit()` $DIR/core/internal/features/features_test.go: `.Start(testutils.Context(t))` $DIR/core/internal/features/features_test.go: `.Context(t)` $DIR/core/internal/features/features_test.go: `.ValidatedOracleSpecToml(appBootstrap.Config, appBootstrap.GetRelayers().LegacyEVMChains(), fmt.Sprintf(` type = "offchainreporting" schemaVersion = 1 name = "boot" contractAddress = "%s" evmChainID = "%s" isBootstrapPeer = true `, ocrContractAddress, testutils.SimulatedChainID.String()))` $DIR/core/internal/features/features_test.go: `.GetRelayers()` $DIR/core/internal/features/features_test.go: `.LegacyEVMChains()` $DIR/core/internal/features/features_test.go: `.Sprintf(` type = "offchainreporting" schemaVersion = 1 name = "boot" contractAddress = "%s" evmChainID = "%s" isBootstrapPeer = true `, ocrContractAddress, testutils.SimulatedChainID.String())` $DIR/core/internal/features/features_test.go: `.SimulatedChainID.String()` $DIR/core/internal/features/features_test.go: `.NewString("boot", true)` $DIR/core/internal/features/features_test.go: `.AddJobV2(testutils.Context(t), &jb)` $DIR/core/internal/features/features_test.go: `.Context(t)` $DIR/core/internal/features/features_test.go: `.RaiseFlag(owner, ocrContractAddress)` $DIR/core/internal/features/features_test.go: `.RaiseFlag(owner, evmutils.ZeroAddress)` $DIR/core/internal/features/features_test.go: `.Commit()` $DIR/core/internal/features/features_test.go: `.Start(testutils.Context(t))` $DIR/core/internal/features/features_test.go: `.Context(t)` $DIR/core/internal/features/features_test.go: `.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { time.Sleep(5 * time.Second) res.WriteHeader(http.StatusOK) _, err := res.Write([]byte(`{"data":10}`)) require.NoError(t, err) }))` $DIR/core/internal/features/features_test.go: `.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { time.Sleep(5 * time.Second) res.WriteHeader(http.StatusOK) _, err := res.Write([]byte(`{"data":10}`)) require.NoError(t, err) })` $DIR/core/internal/features/features_test.go: `.Sleep(5 * time.Second)` $DIR/core/internal/features/features_test.go: `.WriteHeader(http.StatusOK)` $DIR/core/internal/features/features_test.go: `.Write([]byte(`{"data":10}`))` $DIR/core/internal/features/features_test.go: `.Cleanup(slowServers[i].Close)` $DIR/core/internal/features/features_test.go: `.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { b, err := io.ReadAll(req.Body) require.NoError(t, err) var m bridges.BridgeMetaDataJSON require.NoError(t, json.Unmarshal(b, &m)) if m.Meta.LatestAnswer != nil && m.Meta.UpdatedAt != nil { metaLock.Lock() delete(expectedMeta, m.Meta.LatestAnswer.String()) metaLock.Unlock() } res.WriteHeader(http.StatusOK) _, err = res.Write([]byte(`{"data":10}`)) require.NoError(t, err) }))` $DIR/core/internal/features/features_test.go: `.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { b, err := io.ReadAll(req.Body) require.NoError(t, err) var m bridges.BridgeMetaDataJSON require.NoError(t, json.Unmarshal(b, &m)) if m.Meta.LatestAnswer != nil && m.Meta.UpdatedAt != nil { metaLock.Lock() delete(expectedMeta, m.Meta.LatestAnswer.String()) metaLock.Unlock() } res.WriteHeader(http.StatusOK) _, err = res.Write([]byte(`{"data":10}`)) require.NoError(t, err) })` $DIR/core/internal/features/features_test.go: `.ReadAll(req.Body)` $DIR/core/internal/features/features_test.go: `.Lock()` $DIR/core/internal/features/features_test.go: `.Meta.LatestAnswer.String()` $DIR/core/internal/features/features_test.go: `.Unlock()` $DIR/core/internal/features/features_test.go: `.WriteHeader(http.StatusOK)` $DIR/core/internal/features/features_test.go: `.Write([]byte(`{"data":10}`))` $DIR/core/internal/features/features_test.go: `.Cleanup(servers[i].Close)` $DIR/core/internal/features/features_test.go: `.Parse(servers[i].URL)` $DIR/core/internal/features/features_test.go: `.BridgeORM()` $DIR/core/internal/features/features_test.go: `.CreateBridgeType(testutils.Context(t), &bridges.BridgeType{ Name: bridges.BridgeName(fmt.Sprintf("bridge%d", i)), URL: models.WebURL(*u), })` $DIR/core/internal/features/features_test.go: `.Context(t)` $DIR/core/internal/features/features_test.go: `.BridgeName(fmt.Sprintf("bridge%d", i))` $DIR/core/internal/features/features_test.go: `.Sprintf("bridge%d", i)` $DIR/core/internal/features/features_test.go: `.WebURL(*u)` $DIR/core/internal/features/features_test.go: `.ValidatedOracleSpecToml(apps[i].Config, apps[i].GetRelayers().LegacyEVMChains(), fmt.Sprintf(` type = "offchainreporting" schemaVersion = 1 name = "web oracle spec" contractAddress = "%s" evmChainID = "%s" isBootstrapPeer = false keyBundleID = "%s" transmitterAddress = "%s" observationTimeout = "100ms" contractConfigConfirmations = 1 contractConfigTrackerPollInterval = "1s" observationSource = """ // data source 1 ds1 [type=bridge name="%s"]; ds1_parse [type=jsonparse path="data"]; ds1_multiply [type=multiply times=%d]; // data source 2 ds2 [type=http method=GET url="%s"]; ds2_parse [type=jsonparse path="data"]; ds2_multiply [type=multiply times=%d]; ds1 -> ds1_parse -> ds1_multiply -> answer1; ds2 -> ds2_parse -> ds2_multiply -> answer1; answer1 [type=median index=0]; """ `, ocrContractAddress, testutils.SimulatedChainID.String(), keys[i].ID(), transmitters[i], fmt.Sprintf("bridge%d", i), i, slowServers[i].URL, i))` $DIR/core/internal/features/features_test.go: `.GetRelayers()` $DIR/core/internal/features/features_test.go: `.LegacyEVMChains()` $DIR/core/internal/features/features_test.go: `.Sprintf(` type = "offchainreporting" schemaVersion = 1 name = "web oracle spec" contractAddress = "%s" evmChainID = "%s" isBootstrapPeer = false keyBundleID = "%s" transmitterAddress = "%s" observationTimeout = "100ms" contractConfigConfirmations = 1 contractConfigTrackerPollInterval = "1s" observationSource = """ // data source 1 ds1 [type=bridge name="%s"]; ds1_parse [type=jsonparse path="data"]; ds1_multiply [type=multiply times=%d]; // data source 2 ds2 [type=http method=GET url="%s"]; ds2_parse [type=jsonparse path="data"]; ds2_multiply [type=multiply times=%d]; ds1 -> ds1_parse -> ds1_multiply -> answer1; ds2 -> ds2_parse -> ds2_multiply -> answer1; answer1 [type=median index=0]; """ `, ocrContractAddress, testutils.SimulatedChainID.String(), keys[i].ID(), transmitters[i], fmt.Sprintf("bridge%d", i), i, slowServers[i].URL, i)` $DIR/core/internal/features/features_test.go: `.SimulatedChainID.String()` $DIR/core/internal/features/features_test.go: `.ID()` $DIR/core/internal/features/features_test.go: `.Sprintf("bridge%d", i)` $DIR/core/internal/features/features_test.go: `.NewString("testocr", true)` $DIR/core/internal/features/features_test.go: `.AddJobV2(testutils.Context(t), &jb)` $DIR/core/internal/features/features_test.go: `.Context(t)` $DIR/core/internal/features/features_test.go: `.WaitForPipelineComplete(t, i, jids[i], 2, 7, apps[i].JobORM(), time.Minute, time.Second)` $DIR/core/internal/features/features_test.go: `.JobORM()` $DIR/core/internal/features/features_test.go: `.Outputs.MarshalJSON()` $DIR/core/internal/features/features_test.go: `.Eventually(func() string { answer, err := ocrContract.LatestAnswer(nil) require.NoError(t, err) return answer.String() }, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/internal/features/features_test.go: `.LatestAnswer(nil)` $DIR/core/internal/features/features_test.go: `.String()` $DIR/core/internal/features/features_test.go: `.WaitTimeout(t)` $DIR/core/internal/features/features_test.go: `.Should(gomega.Equal("20"))` $DIR/core/internal/features/features_test.go: `.Equal("20")` $DIR/core/internal/features/features_test.go: `.Context(t)` $DIR/core/internal/features/features_test.go: `.JobORM()` $DIR/core/internal/features/features_test.go: `.FindJobs(ctx, 0, 1000)` $DIR/core/internal/features/features_test.go: `.Contains(j.JobSpecErrors[i].Description, "leader's phase conflicts tGrace timeout")` $DIR/core/internal/features/features_test.go: `.Lock()` $DIR/core/internal/features/features_test.go: `.Unlock()` $DIR/core/internal/features/features_test.go: `.SkipShort(t, "long test")` $DIR/core/internal/features/features_test.go: `.GetOne(t)` $DIR/core/internal/features/features_test.go: `.NewWithT(t)` $DIR/core/internal/features/features_test.go: `.GetN(t, numOracles)` $DIR/core/internal/features/features_test.go: `.EIP55AddressFromAddress(flagsContractAddress)` $DIR/core/internal/features/features_test.go: `.Sprintf("127.0.0.1:%d", bootstrapNodePortV2)` $DIR/core/internal/features/features_test.go: `.OnChainSigningAddress(key.OnChainSigning.Address())` $DIR/core/internal/features/features_test.go: `.OnChainSigning.Address()` $DIR/core/internal/features/features_test.go: `.PublicKeyOffChain()` $DIR/core/internal/features/features_test.go: `.PublicKeyConfig()` $DIR/core/internal/features/features_test.go: `.FiniteTicker(time.Second, func() { b.Commit() })` $DIR/core/internal/features/features_test.go: `.Commit()` $DIR/core/internal/features/features_test.go: `.SetPayees(owner, forwardersContracts, transmitters, )` $DIR/core/internal/features/features_test.go: `.Commit()` $DIR/core/internal/features/features_test.go: `.ContractSetConfigArgsForIntegrationTest( oracles, 1, 1000000000/100, // threshold PPB )` $DIR/core/internal/features/features_test.go: `.SetConfig(owner, signers, effectiveTransmitters, // forwarder Addresses threshold, encodedConfigVersion, encodedConfig, )` $DIR/core/internal/features/features_test.go: `.Commit()` $DIR/core/internal/features/features_test.go: `.Start(testutils.Context(t))` $DIR/core/internal/features/features_test.go: `.Context(t)` $DIR/core/internal/features/features_test.go: `.ValidatedOracleSpecToml(appBootstrap.Config, appBootstrap.GetRelayers().LegacyEVMChains(), fmt.Sprintf(` type = "offchainreporting" schemaVersion = 1 name = "boot" contractAddress = "%s" evmChainID = "%s" forwardingAllowed = true isBootstrapPeer = true `, ocrContractAddress, testutils.SimulatedChainID.String()))` $DIR/core/internal/features/features_test.go: `.GetRelayers()` $DIR/core/internal/features/features_test.go: `.LegacyEVMChains()` $DIR/core/internal/features/features_test.go: `.Sprintf(` type = "offchainreporting" schemaVersion = 1 name = "boot" contractAddress = "%s" evmChainID = "%s" forwardingAllowed = true isBootstrapPeer = true `, ocrContractAddress, testutils.SimulatedChainID.String())` $DIR/core/internal/features/features_test.go: `.SimulatedChainID.String()` $DIR/core/internal/features/features_test.go: `.NewString("boot", true)` $DIR/core/internal/features/features_test.go: `.AddJobV2(testutils.Context(t), &jb)` $DIR/core/internal/features/features_test.go: `.Context(t)` $DIR/core/internal/features/features_test.go: `.RaiseFlag(owner, ocrContractAddress)` $DIR/core/internal/features/features_test.go: `.RaiseFlag(owner, evmutils.ZeroAddress)` $DIR/core/internal/features/features_test.go: `.Commit()` $DIR/core/internal/features/features_test.go: `.Start(testutils.Context(t))` $DIR/core/internal/features/features_test.go: `.Context(t)` $DIR/core/internal/features/features_test.go: `.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { time.Sleep(5 * time.Second) res.WriteHeader(http.StatusOK) _, err := res.Write([]byte(`{"data":10}`)) require.NoError(t, err) }))` $DIR/core/internal/features/features_test.go: `.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { time.Sleep(5 * time.Second) res.WriteHeader(http.StatusOK) _, err := res.Write([]byte(`{"data":10}`)) require.NoError(t, err) })` $DIR/core/internal/features/features_test.go: `.Sleep(5 * time.Second)` $DIR/core/internal/features/features_test.go: `.WriteHeader(http.StatusOK)` $DIR/core/internal/features/features_test.go: `.Write([]byte(`{"data":10}`))` $DIR/core/internal/features/features_test.go: `.Cleanup(slowServers[i].Close)` $DIR/core/internal/features/features_test.go: `.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { b, err := io.ReadAll(req.Body) require.NoError(t, err) var m bridges.BridgeMetaDataJSON require.NoError(t, json.Unmarshal(b, &m)) if m.Meta.LatestAnswer != nil && m.Meta.UpdatedAt != nil { metaLock.Lock() delete(expectedMeta, m.Meta.LatestAnswer.String()) metaLock.Unlock() } res.WriteHeader(http.StatusOK) _, err = res.Write([]byte(`{"data":10}`)) require.NoError(t, err) }))` $DIR/core/internal/features/features_test.go: `.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { b, err := io.ReadAll(req.Body) require.NoError(t, err) var m bridges.BridgeMetaDataJSON require.NoError(t, json.Unmarshal(b, &m)) if m.Meta.LatestAnswer != nil && m.Meta.UpdatedAt != nil { metaLock.Lock() delete(expectedMeta, m.Meta.LatestAnswer.String()) metaLock.Unlock() } res.WriteHeader(http.StatusOK) _, err = res.Write([]byte(`{"data":10}`)) require.NoError(t, err) })` $DIR/core/internal/features/features_test.go: `.ReadAll(req.Body)` $DIR/core/internal/features/features_test.go: `.Lock()` $DIR/core/internal/features/features_test.go: `.Meta.LatestAnswer.String()` $DIR/core/internal/features/features_test.go: `.Unlock()` $DIR/core/internal/features/features_test.go: `.WriteHeader(http.StatusOK)` $DIR/core/internal/features/features_test.go: `.Write([]byte(`{"data":10}`))` $DIR/core/internal/features/features_test.go: `.Cleanup(servers[i].Close)` $DIR/core/internal/features/features_test.go: `.Parse(servers[i].URL)` $DIR/core/internal/features/features_test.go: `.BridgeORM()` $DIR/core/internal/features/features_test.go: `.CreateBridgeType(testutils.Context(t), &bridges.BridgeType{ Name: bridges.BridgeName(fmt.Sprintf("bridge%d", i)), URL: models.WebURL(*u), })` $DIR/core/internal/features/features_test.go: `.Context(t)` $DIR/core/internal/features/features_test.go: `.BridgeName(fmt.Sprintf("bridge%d", i))` $DIR/core/internal/features/features_test.go: `.Sprintf("bridge%d", i)` $DIR/core/internal/features/features_test.go: `.WebURL(*u)` $DIR/core/internal/features/features_test.go: `.ValidatedOracleSpecToml(apps[i].Config, apps[i].GetRelayers().LegacyEVMChains(), fmt.Sprintf(` type = "offchainreporting" schemaVersion = 1 name = "web oracle spec" contractAddress = "%s" evmChainID = "%s" forwardingAllowed = true isBootstrapPeer = false keyBundleID = "%s" transmitterAddress = "%s" observationTimeout = "100ms" contractConfigConfirmations = 1 contractConfigTrackerPollInterval = "1s" observationSource = """ // data source 1 ds1 [type=bridge name="%s"]; ds1_parse [type=jsonparse path="data"]; ds1_multiply [type=multiply times=%d]; // data source 2 ds2 [type=http method=GET url="%s"]; ds2_parse [type=jsonparse path="data"]; ds2_multiply [type=multiply times=%d]; ds1 -> ds1_parse -> ds1_multiply -> answer1; ds2 -> ds2_parse -> ds2_multiply -> answer1; answer1 [type=median index=0]; """ `, ocrContractAddress, testutils.SimulatedChainID.String(), keys[i].ID(), transmitters[i], fmt.Sprintf("bridge%d", i), i, slowServers[i].URL, i))` $DIR/core/internal/features/features_test.go: `.GetRelayers()` $DIR/core/internal/features/features_test.go: `.LegacyEVMChains()` $DIR/core/internal/features/features_test.go: `.Sprintf(` type = "offchainreporting" schemaVersion = 1 name = "web oracle spec" contractAddress = "%s" evmChainID = "%s" forwardingAllowed = true isBootstrapPeer = false keyBundleID = "%s" transmitterAddress = "%s" observationTimeout = "100ms" contractConfigConfirmations = 1 contractConfigTrackerPollInterval = "1s" observationSource = """ // data source 1 ds1 [type=bridge name="%s"]; ds1_parse [type=jsonparse path="data"]; ds1_multiply [type=multiply times=%d]; // data source 2 ds2 [type=http method=GET url="%s"]; ds2_parse [type=jsonparse path="data"]; ds2_multiply [type=multiply times=%d]; ds1 -> ds1_parse -> ds1_multiply -> answer1; ds2 -> ds2_parse -> ds2_multiply -> answer1; answer1 [type=median index=0]; """ `, ocrContractAddress, testutils.SimulatedChainID.String(), keys[i].ID(), transmitters[i], fmt.Sprintf("bridge%d", i), i, slowServers[i].URL, i)` $DIR/core/internal/features/features_test.go: `.SimulatedChainID.String()` $DIR/core/internal/features/features_test.go: `.ID()` $DIR/core/internal/features/features_test.go: `.Sprintf("bridge%d", i)` $DIR/core/internal/features/features_test.go: `.NewString("testocr", true)` $DIR/core/internal/features/features_test.go: `.AddJobV2(testutils.Context(t), &jb)` $DIR/core/internal/features/features_test.go: `.Context(t)` $DIR/core/internal/features/features_test.go: `.WaitForPipelineComplete(t, i, jids[i], 2, 7, apps[i].JobORM(), time.Minute, time.Second)` $DIR/core/internal/features/features_test.go: `.JobORM()` $DIR/core/internal/features/features_test.go: `.Outputs.MarshalJSON()` $DIR/core/internal/features/features_test.go: `.Eventually(func() string { answer, err := ocrContract.LatestAnswer(nil) require.NoError(t, err) return answer.String() }, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/internal/features/features_test.go: `.LatestAnswer(nil)` $DIR/core/internal/features/features_test.go: `.String()` $DIR/core/internal/features/features_test.go: `.WaitTimeout(t)` $DIR/core/internal/features/features_test.go: `.Should(gomega.Equal("20"))` $DIR/core/internal/features/features_test.go: `.Equal("20")` $DIR/core/internal/features/features_test.go: `.Context(t)` $DIR/core/internal/features/features_test.go: `.JobORM()` $DIR/core/internal/features/features_test.go: `.FindJobs(ctx, 0, 1000)` $DIR/core/internal/features/features_test.go: `.Contains(j.JobSpecErrors[i].Description, "leader's phase conflicts tGrace timeout")` $DIR/core/internal/features/features_test.go: `.Lock()` $DIR/core/internal/features/features_test.go: `.Unlock()` $DIR/core/internal/features/features_test.go: `.Context(t)` $DIR/core/internal/features/features_test.go: `.NewWeiI(10 * initialDefaultGasPrice)` $DIR/core/internal/features/features_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].BalanceMonitor.Enabled = ptr(false) c.EVM[0].GasEstimator.BlockHistory.CheckInclusionBlocks = ptr[uint16](0) c.EVM[0].GasEstimator.PriceDefault = assets.NewWeiI(initialDefaultGasPrice) c.EVM[0].GasEstimator.Mode = ptr("BlockHistory") c.EVM[0].RPCBlockQueryDelay = ptr[uint16](0) c.EVM[0].GasEstimator.BlockHistory.BlockHistorySize = ptr[uint16](2) c.EVM[0].FinalityDepth = ptr[uint32](3) })` $DIR/core/internal/features/features_test.go: `.NewWeiI(initialDefaultGasPrice)` $DIR/core/internal/features/features_test.go: `.NewEthMocks(t)` $DIR/core/internal/features/features_test.go: `.On("ConfiguredChainID")` $DIR/core/internal/features/features_test.go: `.Return(big.NewInt(client.NullClientChainID))` $DIR/core/internal/features/features_test.go: `.NewInt(client.NullClientChainID)` $DIR/core/internal/features/features_test.go: `.Maybe()` $DIR/core/internal/features/features_test.go: `.NewSqlxDB(t)` $DIR/core/internal/features/features_test.go: `.NewKeyStore(t, db)` $DIR/core/internal/features/features_test.go: `.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, KeyStore: kst.Eth(), Client: ethClient, GeneralConfig: cfg})` $DIR/core/internal/features/features_test.go: `.Eth()` $DIR/core/internal/features/features_test.go: `.NewHash()` $DIR/core/internal/features/features_test.go: `.LegacyTransactionsFromGasPrices(41_000_000_000, 41_500_000_000)` $DIR/core/internal/features/features_test.go: `.NewHash()` $DIR/core/internal/features/features_test.go: `.LegacyTransactionsFromGasPrices(44_000_000_000, 45_000_000_000)` $DIR/core/internal/features/features_test.go: `.NewHash()` $DIR/core/internal/features/features_test.go: `.LegacyTransactionsFromGasPrices(48_000_000_000, 49_000_000_000, 31_000_000_000)` $DIR/core/internal/features/features_test.go: `.New(evmtest.MustGetDefaultChainID(t, cfg.EVMConfigs()))` $DIR/core/internal/features/features_test.go: `.MustGetDefaultChainID(t, cfg.EVMConfigs())` $DIR/core/internal/features/features_test.go: `.EVMConfigs()` $DIR/core/internal/features/features_test.go: `.NewHash()` $DIR/core/internal/features/features_test.go: `.On("SubscribeNewHead", mock.Anything, mock.Anything)` $DIR/core/internal/features/features_test.go: `. Return( func(ctx context.Context, ch chan<- *evmtypes.Head) ethereum.Subscription { sub := mockEth.NewSub(t) chchNewHeads <- evmtestutils.NewRawSub(ch, sub.Err()) return sub }, func(ctx context.Context, ch chan<- *evmtypes.Head) error { return nil }, )` $DIR/core/internal/features/features_test.go: `.NewSub(t)` $DIR/core/internal/features/features_test.go: `.NewRawSub(ch, sub.Err())` $DIR/core/internal/features/features_test.go: `.Err()` $DIR/core/internal/features/features_test.go: `.On("PendingNonceAt", mock.Anything, mock.Anything)` $DIR/core/internal/features/features_test.go: `.Maybe()` $DIR/core/internal/features/features_test.go: `.Return(uint64(0), nil)` $DIR/core/internal/features/features_test.go: `.On("HeadByNumber", mock.Anything, mock.AnythingOfType("*big.Int"))` $DIR/core/internal/features/features_test.go: `.AnythingOfType("*big.Int")` $DIR/core/internal/features/features_test.go: `.Return(&h42, nil)` $DIR/core/internal/features/features_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == "0x2a" && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == "0x29" }))` $DIR/core/internal/features/features_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == "0x2a" && b[1].Method == "eth_getBlockByNumber" && b[1].Args[0] == "0x29" })` $DIR/core/internal/features/features_test.go: `.Return(nil)` $DIR/core/internal/features/features_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &b42 elems[1].Result = &b41 })` $DIR/core/internal/features/features_test.go: `.Get(1)` $DIR/core/internal/features/features_test.go: `.On("Dial", mock.Anything)` $DIR/core/internal/features/features_test.go: `.Return(nil)` $DIR/core/internal/features/features_test.go: `.On("ConfiguredChainID", mock.Anything)` $DIR/core/internal/features/features_test.go: `.Return(*evmtest.MustGetDefaultChainID(t, cfg.EVMConfigs()), nil)` $DIR/core/internal/features/features_test.go: `.MustGetDefaultChainID(t, cfg.EVMConfigs())` $DIR/core/internal/features/features_test.go: `.EVMConfigs()` $DIR/core/internal/features/features_test.go: `.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/internal/features/features_test.go: `.Maybe()` $DIR/core/internal/features/features_test.go: `.Return(oneETH.ToInt(), nil)` $DIR/core/internal/features/features_test.go: `.ToInt()` $DIR/core/internal/features/features_test.go: `.On("HeadByHash", mock.Anything, h40.Hash)` $DIR/core/internal/features/features_test.go: `.Return(&h40, nil)` $DIR/core/internal/features/features_test.go: `.Maybe()` $DIR/core/internal/features/features_test.go: `.On("HeadByHash", mock.Anything, h41.Hash)` $DIR/core/internal/features/features_test.go: `.Return(&h41, nil)` $DIR/core/internal/features/features_test.go: `.Maybe()` $DIR/core/internal/features/features_test.go: `.On("HeadByHash", mock.Anything, h42.Hash)` $DIR/core/internal/features/features_test.go: `.Return(&h42, nil)` $DIR/core/internal/features/features_test.go: `.Maybe()` $DIR/core/internal/features/features_test.go: `.NewLegacyChainsFromRelayerExtenders(cc)` $DIR/core/internal/features/features_test.go: `.Slice()` $DIR/core/internal/features/features_test.go: `.Run(t, re)` $DIR/core/internal/features/features_test.go: `.After(10 * time.Second)` $DIR/core/internal/features/features_test.go: `.MustGetDefaultChain(t, legacyChains)` $DIR/core/internal/features/features_test.go: `.GasEstimator()` $DIR/core/internal/features/features_test.go: `.GetFee(testutils.Context(t), nil, 500_000, maxGasPrice)` $DIR/core/internal/features/features_test.go: `.Context(t)` $DIR/core/internal/features/features_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == "0x2b" }))` $DIR/core/internal/features/features_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 1 && b[0].Method == "eth_getBlockByNumber" && b[0].Args[0] == "0x2b" })` $DIR/core/internal/features/features_test.go: `.Return(nil)` $DIR/core/internal/features/features_test.go: `.Run(func(args mock.Arguments) { elems := args.Get(1).([]rpc.BatchElem) elems[0].Result = &b43 })` $DIR/core/internal/features/features_test.go: `.Get(1)` $DIR/core/internal/features/features_test.go: `.On("Close")` $DIR/core/internal/features/features_test.go: `.Return()` $DIR/core/internal/features/features_test.go: `.Once()` $DIR/core/internal/features/features_test.go: `.Head(43)` $DIR/core/internal/features/features_test.go: `.TrySend(h43)` $DIR/core/internal/features/features_test.go: `.NewWithT(t)` $DIR/core/internal/features/features_test.go: `.Eventually(func() string { gasPrice, _, err := estimator.GetFee(testutils.Context(t), nil, 500000, maxGasPrice) require.NoError(t, err) return gasPrice.Legacy.String() }, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/internal/features/features_test.go: `.GetFee(testutils.Context(t), nil, 500000, maxGasPrice)` $DIR/core/internal/features/features_test.go: `.Context(t)` $DIR/core/internal/features/features_test.go: `.Legacy.String()` $DIR/core/internal/features/features_test.go: `.WaitTimeout(t)` $DIR/core/internal/features/features_test.go: `.Equal("45 gwei")` $DIR/core/internal/features/ocr2/features_ocr2_plugin_test.go: `t.Setenv(string(env.MedianPlugin.Cmd), "chainlink-feeds")` $DIR/core/internal/features/ocr2/features_ocr2_plugin_test.go: `.Setenv(string(env.MedianPlugin.Cmd), "chainlink-feeds")` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `kbs = append(kbs, node.keybundle)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `apps = append(apps, node.app)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `forwarderContracts = append(forwarderContracts, node.effectiveTransmitter)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `transmitters = append(transmitters, node.transmitter)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `oracles = append(oracles, confighelper2.OracleIdentityExtra{ OracleIdentity: confighelper2.OracleIdentity{ OnchainPublicKey: node.keybundle.PublicKey(), TransmitAccount: ocrtypes2.Account(node.effectiveTransmitter.String()), OffchainPublicKey: node.keybundle.OffchainPublicKey(), PeerID: node.peerID, }, ConfigEncryptionPublicKey: node.keybundle.ConfigEncryptionPublicKey(), })` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `b.Commit()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `time.Sleep(5 * time.Second)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `res.WriteHeader(http.StatusOK)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `t.Cleanup(func() { slowServers[s].Close() })` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `metaLock.Lock()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `delete(expectedMeta, m.Meta.LatestAnswer.String())` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `metaLock.Unlock()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `res.WriteHeader(http.StatusOK)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `_, err = res.Write([]byte(`{"data":10}`))` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `t.Cleanup(func() { servers[s].Close() })` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `err = apps[i].AddJobV2(testutils.Context(t), &ocrJob)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `jids = append(jids, ocrJob.ID)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `wg.Add(1)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `wg.Wait()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `gomega.NewGomegaWithT(t).Eventually(func() string { answer, err := ocrContract.LatestAnswer(nil) require.NoError(t, err) return answer.String() }, 1*time.Minute, 200*time.Millisecond).Should(gomega.Equal("20"))` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `ignore++` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `metaLock.Lock()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `maps.Copy(em, expectedMeta)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `metaLock.Unlock()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.TestLogger(t)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.GetOne(t)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.GetN(t, 4)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Sprintf("127.0.0.1:%d", bootstrapNodePort)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.keybundle.PublicKey()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Account(node.effectiveTransmitter.String())` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.effectiveTransmitter.String()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.keybundle.OffchainPublicKey()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.keybundle.ConfigEncryptionPublicKey()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.NewTicker(1 * time.Second)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Stop()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Commit()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Sprintf(` type = "bootstrap" name = "bootstrap" relay = "evm" schemaVersion = 1 forwardingAllowed = true contractID = "%s" [relayConfig] chainID = 1337 `, ocrContractAddress)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Context(t)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { time.Sleep(5 * time.Second) res.WriteHeader(http.StatusOK) _, err := res.Write([]byte(`{"data":10}`)) require.NoError(t, err) }))` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { time.Sleep(5 * time.Second) res.WriteHeader(http.StatusOK) _, err := res.Write([]byte(`{"data":10}`)) require.NoError(t, err) })` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Sleep(5 * time.Second)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.WriteHeader(http.StatusOK)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Write([]byte(`{"data":10}`))` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Cleanup(func() { slowServers[s].Close() })` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { b, err := io.ReadAll(req.Body) require.NoError(t, err) var m bridges.BridgeMetaDataJSON require.NoError(t, json.Unmarshal(b, &m)) if m.Meta.LatestAnswer != nil && m.Meta.UpdatedAt != nil { metaLock.Lock() delete(expectedMeta, m.Meta.LatestAnswer.String()) metaLock.Unlock() } res.WriteHeader(http.StatusOK) _, err = res.Write([]byte(`{"data":10}`)) require.NoError(t, err) }))` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { b, err := io.ReadAll(req.Body) require.NoError(t, err) var m bridges.BridgeMetaDataJSON require.NoError(t, json.Unmarshal(b, &m)) if m.Meta.LatestAnswer != nil && m.Meta.UpdatedAt != nil { metaLock.Lock() delete(expectedMeta, m.Meta.LatestAnswer.String()) metaLock.Unlock() } res.WriteHeader(http.StatusOK) _, err = res.Write([]byte(`{"data":10}`)) require.NoError(t, err) })` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.ReadAll(req.Body)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Lock()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Meta.LatestAnswer.String()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Unlock()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.WriteHeader(http.StatusOK)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Write([]byte(`{"data":10}`))` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Cleanup(func() { servers[s].Close() })` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Parse(servers[i].URL)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.ValidatedOracleSpecToml(testutils.Context(t), apps[i].Config.OCR2(), apps[i].Config.Insecure(), fmt.Sprintf(` type = "offchainreporting2" relay = "evm" schemaVersion = 1 pluginType = "median" name = "web oracle spec" forwardingAllowed = true contractID = "%s" ocrKeyBundleID = "%s" transmitterID = "%s" contractConfigConfirmations = 1 contractConfigTrackerPollInterval = "1s" observationSource = """ // data source 1 ds1 [type=bridge name="%s"]; ds1_parse [type=jsonparse path="data"]; ds1_multiply [type=multiply times=%d]; // data source 2 ds2 [type=http method=GET url="%s"]; ds2_parse [type=jsonparse path="data"]; ds2_multiply [type=multiply times=%d]; ds1 -> ds1_parse -> ds1_multiply -> answer1; ds2 -> ds2_parse -> ds2_multiply -> answer1; answer1 [type=median index=0]; """ [relayConfig] chainID = 1337 [pluginConfig] juelsPerFeeCoinSource = """ // data source 1 ds1 [type=bridge name="%s"]; ds1_parse [type=jsonparse path="data"]; ds1_multiply [type=multiply times=%d]; // data source 2 ds2 [type=http method=GET url="%s"]; ds2_parse [type=jsonparse path="data"]; ds2_multiply [type=multiply times=%d]; ds1 -> ds1_parse -> ds1_multiply -> answer1; ds2 -> ds2_parse -> ds2_multiply -> answer1; answer1 [type=median index=0]; """ [pluginConfig.juelsPerFeeCoinCache] updateInterval = "1m" `, ocrContractAddress, kbs[i].ID(), transmitters[i], fmt.Sprintf("bridge%d", i), i, slowServers[i].URL, i, fmt.Sprintf("bridge%d", i), i, slowServers[i].URL, i), nil)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Context(t)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Config.OCR2()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Config.Insecure()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Sprintf(` type = "offchainreporting2" relay = "evm" schemaVersion = 1 pluginType = "median" name = "web oracle spec" forwardingAllowed = true contractID = "%s" ocrKeyBundleID = "%s" transmitterID = "%s" contractConfigConfirmations = 1 contractConfigTrackerPollInterval = "1s" observationSource = """ // data source 1 ds1 [type=bridge name="%s"]; ds1_parse [type=jsonparse path="data"]; ds1_multiply [type=multiply times=%d]; // data source 2 ds2 [type=http method=GET url="%s"]; ds2_parse [type=jsonparse path="data"]; ds2_multiply [type=multiply times=%d]; ds1 -> ds1_parse -> ds1_multiply -> answer1; ds2 -> ds2_parse -> ds2_multiply -> answer1; answer1 [type=median index=0]; """ [relayConfig] chainID = 1337 [pluginConfig] juelsPerFeeCoinSource = """ // data source 1 ds1 [type=bridge name="%s"]; ds1_parse [type=jsonparse path="data"]; ds1_multiply [type=multiply times=%d]; // data source 2 ds2 [type=http method=GET url="%s"]; ds2_parse [type=jsonparse path="data"]; ds2_multiply [type=multiply times=%d]; ds1 -> ds1_parse -> ds1_multiply -> answer1; ds2 -> ds2_parse -> ds2_multiply -> answer1; answer1 [type=median index=0]; """ [pluginConfig.juelsPerFeeCoinCache] updateInterval = "1m" `, ocrContractAddress, kbs[i].ID(), transmitters[i], fmt.Sprintf("bridge%d", i), i, slowServers[i].URL, i, fmt.Sprintf("bridge%d", i), i, slowServers[i].URL, i)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.ID()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Sprintf("bridge%d", i)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Sprintf("bridge%d", i)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.AddJobV2(testutils.Context(t), &ocrJob)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Context(t)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Add(1)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Done()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.WaitForPipelineComplete(t, ic, jids[ic], 2, 7, apps[ic].JobORM(), 2*time.Minute, 5*time.Second)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.JobORM()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Outputs.MarshalJSON()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Wait()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.NewGomegaWithT(t)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Eventually(func() string { answer, err := ocrContract.LatestAnswer(nil) require.NoError(t, err) return answer.String() }, 1*time.Minute, 200*time.Millisecond)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.LatestAnswer(nil)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.String()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Should(gomega.Equal("20"))` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Equal("20")` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.JobORM()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.FindJobs(ctx, 0, 1000)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Contains(j.JobSpecErrors[i].Description, "leader's phase conflicts tGrace timeout")` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Lock()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Copy(em, expectedMeta)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Unlock()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.JSON(strings.NewReader(ocr2aggregator.OCR2AggregatorABI))` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.NewReader(ocr2aggregator.OCR2AggregatorABI)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.NewOCRContractTransmitter(testutils.Context(t), ocrContractAddress, apps[0].GetRelayers().LegacyEVMChains().Slice()[0].Client(), contractABI, nil, apps[0].GetRelayers().LegacyEVMChains().Slice()[0].LogPoller(), lggr, nil)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Context(t)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.GetRelayers()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.LegacyEVMChains()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Slice()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Client()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.GetRelayers()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.LegacyEVMChains()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Slice()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.LogPoller()` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.LatestConfigDigestAndEpoch(testutils.Context(t))` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.Context(t)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.LatestConfigDetails(nil)` $DIR/core/internal/features/ocr2/features_ocr2_test.go: `.LatestConfigDigestAndEpoch(nil)` $DIR/core/internal/testutils/pgtest/txdb_test.go: `_, err = db.Exec(`CREATE TABLE txdb_test (id TEXT NOT NULL)`)` $DIR/core/internal/testutils/pgtest/txdb_test.go: `t.Cleanup(func() { _ = dropTable() })` $DIR/core/internal/testutils/pgtest/txdb_test.go: `_ = dropTable()` $DIR/core/internal/testutils/pgtest/txdb_test.go: `_, err = db.Exec(`INSERT INTO txdb_test VALUES ($1)`, uuid.New().String())` $DIR/core/internal/testutils/pgtest/txdb_test.go: `err = db.Select(&ids, `SELECT id from txdb_test`)` $DIR/core/internal/testutils/pgtest/txdb_test.go: `ensureValuesPresent(t, db)` $DIR/core/internal/testutils/pgtest/txdb_test.go: `cancel()` $DIR/core/internal/testutils/pgtest/txdb_test.go: `time.Sleep(time.Second * 10)` $DIR/core/internal/testutils/pgtest/txdb_test.go: `ensureValuesPresent(t, db)` $DIR/core/internal/testutils/pgtest/txdb_test.go: `.Exec(`DROP TABLE IF EXISTS txdb_test`)` $DIR/core/internal/testutils/pgtest/txdb_test.go: `.Exec(`CREATE TABLE txdb_test (id TEXT NOT NULL)`)` $DIR/core/internal/testutils/pgtest/txdb_test.go: `.Cleanup(func() { _ = dropTable() })` $DIR/core/internal/testutils/pgtest/txdb_test.go: `.Exec(`INSERT INTO txdb_test VALUES ($1)`, uuid.New().String())` $DIR/core/internal/testutils/pgtest/txdb_test.go: `.New()` $DIR/core/internal/testutils/pgtest/txdb_test.go: `.String()` $DIR/core/internal/testutils/pgtest/txdb_test.go: `.Select(&ids, `SELECT id from txdb_test`)` $DIR/core/internal/testutils/pgtest/txdb_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/internal/testutils/pgtest/txdb_test.go: `.Context(t)` $DIR/core/internal/testutils/pgtest/txdb_test.go: `.BeginTx(ctx, nil)` $DIR/core/internal/testutils/pgtest/txdb_test.go: `.Sleep(time.Second * 10)` $DIR/core/logger/audit/audit_logger_test.go: `auditLoggerService.SetLoggingClient(&mockHTTPClient)` $DIR/core/logger/audit/audit_logger_test.go: `set.Bool("bypass-version-check", true, "")` $DIR/core/logger/audit/audit_logger_test.go: `set.String("admin-credentials-file", "", "")` $DIR/core/logger/audit/audit_logger_test.go: `err = client.RemoteLogin(c)` $DIR/core/logger/audit/audit_logger_test.go: `.TestLogger(t)` $DIR/core/logger/audit/audit_logger_test.go: `.NewAuditLogger(logger.Named("AuditLogger"), &auditLoggerTestConfig)` $DIR/core/logger/audit/audit_logger_test.go: `.Named("AuditLogger")` $DIR/core/logger/audit/audit_logger_test.go: `.SetLoggingClient(&mockHTTPClient)` $DIR/core/logger/audit/audit_logger_test.go: `.NewApplication(t, logger, auditLogger)` $DIR/core/logger/audit/audit_logger_test.go: `.NewAuthenticatingShell(prompter)` $DIR/core/logger/audit/audit_logger_test.go: `.NewFlagSet("test", 0)` $DIR/core/logger/audit/audit_logger_test.go: `.Bool("bypass-version-check", true, "")` $DIR/core/logger/audit/audit_logger_test.go: `.String("admin-credentials-file", "", "")` $DIR/core/logger/audit/audit_logger_test.go: `.NewContext(nil, set, nil)` $DIR/core/logger/audit/audit_logger_test.go: `.RemoteLogin(c)` $DIR/core/logger/audit/audit_logger_test.go: `.After(5 * time.Second)` $DIR/core/logger/disk_stats_test.go: `_, err = diskSpaceAvailable("")` $DIR/core/logger/fields_test.go: `f1["key1"] = "value1"` $DIR/core/logger/fields_test.go: `f2["key2"] = "value2"` $DIR/core/logger/fields_test.go: `f["str"] = "foo"` $DIR/core/logger/fields_test.go: `f["int"] = 123` $DIR/core/logger/fields_test.go: `f["str"] = "foo"` $DIR/core/logger/fields_test.go: `f["int"] = 123` $DIR/core/logger/fields_test.go: `t.Run("single", func(t *testing.T) { t.Parallel() assert.Panics(t, func() { //lint:ignore SA5012 we expect panic here _ = f.With("xyz") }, "expected even number of arguments") })` $DIR/core/logger/fields_test.go: `.Merge(f2)` $DIR/core/logger/fields_test.go: `.Merge(f1)` $DIR/core/logger/fields_test.go: `.Slice()` $DIR/core/logger/fields_test.go: `.With("bool", true, "float", 3.14)` $DIR/core/logger/fields_test.go: `.Run("single", func(t *testing.T) { t.Parallel() assert.Panics(t, func() { //lint:ignore SA5012 we expect panic here _ = f.With("xyz") }, "expected even number of arguments") })` $DIR/core/logger/fields_test.go: `.With()` $DIR/core/logger/internal/colortest/prettyconsole_test.go: `t.Run(tt.name, func(t *testing.T) { tr := &testReader{} pc := logger.PrettyConsole{Sink: tr} _, err := pc.Write([]byte(tt.input)) if tt.wantError { assert.Error(t, err) } else { t.Log(tr.Written) assert.Equal(t, tt.want, tr.Written) } })` $DIR/core/logger/internal/colortest/prettyconsole_test.go: `.Run(tt.name, func(t *testing.T) { tr := &testReader{} pc := logger.PrettyConsole{Sink: tr} _, err := pc.Write([]byte(tt.input)) if tt.wantError { assert.Error(t, err) } else { t.Log(tr.Written) assert.Equal(t, tt.want, tr.Written) } })` $DIR/core/logger/internal/colortest/prettyconsole_test.go: `.Write([]byte(tt.input))` $DIR/core/logger/logger_test.go: `err = sw.Close()` $DIR/core/logger/logger_test.go: `.Write([]byte("Hello, World!"))` $DIR/core/logger/null_logger_test.go: `t.Run("names", func(t *testing.T) { t.Parallel() l := logger.NullLogger assert.Equal(t, l, l.Named("foo")) assert.Equal(t, l, l.With("foo")) assert.Equal(t, l, l.Helper(123)) })` $DIR/core/logger/null_logger_test.go: `l.SetLogLevel(zapcore.DebugLevel)` $DIR/core/logger/null_logger_test.go: `l.Trace()` $DIR/core/logger/null_logger_test.go: `l.Debug()` $DIR/core/logger/null_logger_test.go: `l.Info()` $DIR/core/logger/null_logger_test.go: `l.Warn()` $DIR/core/logger/null_logger_test.go: `l.Critical()` $DIR/core/logger/null_logger_test.go: `l.Panic()` $DIR/core/logger/null_logger_test.go: `l.Tracef("msg")` $DIR/core/logger/null_logger_test.go: `l.Debugf("msg")` $DIR/core/logger/null_logger_test.go: `l.Infof("msg")` $DIR/core/logger/null_logger_test.go: `l.Warnf("msg")` $DIR/core/logger/null_logger_test.go: `l.Criticalf("msg")` $DIR/core/logger/null_logger_test.go: `l.Panicf("msg")` $DIR/core/logger/null_logger_test.go: `l.Tracew("msg")` $DIR/core/logger/null_logger_test.go: `l.Debugw("msg")` $DIR/core/logger/null_logger_test.go: `l.Infow("msg")` $DIR/core/logger/null_logger_test.go: `l.Warnw("msg")` $DIR/core/logger/null_logger_test.go: `l.Errorw("msg")` $DIR/core/logger/null_logger_test.go: `l.Criticalw("msg")` $DIR/core/logger/null_logger_test.go: `l.Panicw("msg")` $DIR/core/logger/null_logger_test.go: `l.Fatalw("msg")` $DIR/core/logger/null_logger_test.go: `l.Recover(nil)` $DIR/core/logger/null_logger_test.go: `.Run("names", func(t *testing.T) { t.Parallel() l := logger.NullLogger assert.Equal(t, l, l.Named("foo")) assert.Equal(t, l, l.With("foo")) assert.Equal(t, l, l.Helper(123)) })` $DIR/core/logger/null_logger_test.go: `.SetLogLevel(zapcore.DebugLevel)` $DIR/core/logger/null_logger_test.go: `.Trace()` $DIR/core/logger/null_logger_test.go: `.Debug()` $DIR/core/logger/null_logger_test.go: `.Info()` $DIR/core/logger/null_logger_test.go: `.Warn()` $DIR/core/logger/null_logger_test.go: `.Critical()` $DIR/core/logger/null_logger_test.go: `.Panic()` $DIR/core/logger/null_logger_test.go: `.Tracef("msg")` $DIR/core/logger/null_logger_test.go: `.Debugf("msg")` $DIR/core/logger/null_logger_test.go: `.Infof("msg")` $DIR/core/logger/null_logger_test.go: `.Warnf("msg")` $DIR/core/logger/null_logger_test.go: `.Criticalf("msg")` $DIR/core/logger/null_logger_test.go: `.Panicf("msg")` $DIR/core/logger/null_logger_test.go: `.Tracew("msg")` $DIR/core/logger/null_logger_test.go: `.Debugw("msg")` $DIR/core/logger/null_logger_test.go: `.Infow("msg")` $DIR/core/logger/null_logger_test.go: `.Warnw("msg")` $DIR/core/logger/null_logger_test.go: `.Errorw("msg")` $DIR/core/logger/null_logger_test.go: `.Criticalw("msg")` $DIR/core/logger/null_logger_test.go: `.Panicw("msg")` $DIR/core/logger/null_logger_test.go: `.Fatalw("msg")` $DIR/core/logger/null_logger_test.go: `.Recover(nil)` $DIR/core/logger/passthrough_test.go: `t.Run(test.name, func(t *testing.T) { t.Parallel() m := setupMockLogger(t) l := test.create(m) l.With() l.Named("xxx") l.SetLogLevel(zapcore.DebugLevel) l.Trace() l.Debug() l.Info() l.Warn() l.Error() l.Critical() l.Panic() l.Fatal() l.Tracef("msg") l.Debugf("msg") l.Infof("msg") l.Warnf("msg") l.Errorf("msg") l.Criticalf("msg") l.Panicf("msg") l.Fatalf("msg") l.Tracew("msg") l.Debugw("msg") l.Infow("msg") l.Warnw("msg") l.Errorw("msg") l.Criticalw("msg") l.Panicw("msg") l.Fatalw("msg") nm := l.Name() require.Equal(t, "mockLogger", nm) err := l.Sync() assert.ErrorIs(t, err, errTest) l.Recover(errTest) })` $DIR/core/logger/passthrough_test.go: `l.With()` $DIR/core/logger/passthrough_test.go: `l.Named("xxx")` $DIR/core/logger/passthrough_test.go: `l.SetLogLevel(zapcore.DebugLevel)` $DIR/core/logger/passthrough_test.go: `l.Trace()` $DIR/core/logger/passthrough_test.go: `l.Debug()` $DIR/core/logger/passthrough_test.go: `l.Info()` $DIR/core/logger/passthrough_test.go: `l.Warn()` $DIR/core/logger/passthrough_test.go: `l.Critical()` $DIR/core/logger/passthrough_test.go: `l.Panic()` $DIR/core/logger/passthrough_test.go: `l.Tracef("msg")` $DIR/core/logger/passthrough_test.go: `l.Debugf("msg")` $DIR/core/logger/passthrough_test.go: `l.Infof("msg")` $DIR/core/logger/passthrough_test.go: `l.Warnf("msg")` $DIR/core/logger/passthrough_test.go: `l.Criticalf("msg")` $DIR/core/logger/passthrough_test.go: `l.Panicf("msg")` $DIR/core/logger/passthrough_test.go: `l.Tracew("msg")` $DIR/core/logger/passthrough_test.go: `l.Debugw("msg")` $DIR/core/logger/passthrough_test.go: `l.Infow("msg")` $DIR/core/logger/passthrough_test.go: `l.Warnw("msg")` $DIR/core/logger/passthrough_test.go: `l.Errorw("msg")` $DIR/core/logger/passthrough_test.go: `l.Criticalw("msg")` $DIR/core/logger/passthrough_test.go: `l.Panicw("msg")` $DIR/core/logger/passthrough_test.go: `l.Fatalw("msg")` $DIR/core/logger/passthrough_test.go: `l.Recover(errTest)` $DIR/core/logger/passthrough_test.go: `.Run(test.name, func(t *testing.T) { t.Parallel() m := setupMockLogger(t) l := test.create(m) l.With() l.Named("xxx") l.SetLogLevel(zapcore.DebugLevel) l.Trace() l.Debug() l.Info() l.Warn() l.Error() l.Critical() l.Panic() l.Fatal() l.Tracef("msg") l.Debugf("msg") l.Infof("msg") l.Warnf("msg") l.Errorf("msg") l.Criticalf("msg") l.Panicf("msg") l.Fatalf("msg") l.Tracew("msg") l.Debugw("msg") l.Infow("msg") l.Warnw("msg") l.Errorw("msg") l.Criticalw("msg") l.Panicw("msg") l.Fatalw("msg") nm := l.Name() require.Equal(t, "mockLogger", nm) err := l.Sync() assert.ErrorIs(t, err, errTest) l.Recover(errTest) })` $DIR/core/logger/passthrough_test.go: `.create(m)` $DIR/core/logger/passthrough_test.go: `.With()` $DIR/core/logger/passthrough_test.go: `.Named("xxx")` $DIR/core/logger/passthrough_test.go: `.SetLogLevel(zapcore.DebugLevel)` $DIR/core/logger/passthrough_test.go: `.Trace()` $DIR/core/logger/passthrough_test.go: `.Debug()` $DIR/core/logger/passthrough_test.go: `.Info()` $DIR/core/logger/passthrough_test.go: `.Warn()` $DIR/core/logger/passthrough_test.go: `.Critical()` $DIR/core/logger/passthrough_test.go: `.Panic()` $DIR/core/logger/passthrough_test.go: `.Tracef("msg")` $DIR/core/logger/passthrough_test.go: `.Debugf("msg")` $DIR/core/logger/passthrough_test.go: `.Infof("msg")` $DIR/core/logger/passthrough_test.go: `.Warnf("msg")` $DIR/core/logger/passthrough_test.go: `.Criticalf("msg")` $DIR/core/logger/passthrough_test.go: `.Panicf("msg")` $DIR/core/logger/passthrough_test.go: `.Tracew("msg")` $DIR/core/logger/passthrough_test.go: `.Debugw("msg")` $DIR/core/logger/passthrough_test.go: `.Infow("msg")` $DIR/core/logger/passthrough_test.go: `.Warnw("msg")` $DIR/core/logger/passthrough_test.go: `.Errorw("msg")` $DIR/core/logger/passthrough_test.go: `.Criticalw("msg")` $DIR/core/logger/passthrough_test.go: `.Panicw("msg")` $DIR/core/logger/passthrough_test.go: `.Fatalw("msg")` $DIR/core/logger/passthrough_test.go: `.Name()` $DIR/core/logger/passthrough_test.go: `.Sync()` $DIR/core/logger/passthrough_test.go: `.Recover(errTest)` $DIR/core/logger/prometheus_test.go: `repeat(l.Warn, 1)` $DIR/core/logger/prometheus_test.go: `repeat(l.Error, 2)` $DIR/core/logger/prometheus_test.go: `repeat(l.Critical, 3)` $DIR/core/logger/prometheus_test.go: `repeat(l.Panic, 4)` $DIR/core/logger/prometheus_test.go: `repeat(l.Fatal, 5)` $DIR/core/logger/prometheus_test.go: `assertCounterValue(t, warnCounter, 1)` $DIR/core/logger/prometheus_test.go: `assertCounterValue(t, errorCounter, 2)` $DIR/core/logger/prometheus_test.go: `assertCounterValue(t, criticalCounter, 3)` $DIR/core/logger/prometheus_test.go: `assertCounterValue(t, panicCounter, 4)` $DIR/core/logger/prometheus_test.go: `assertCounterValue(t, fatalCounter, 5)` $DIR/core/logger/prometheus_test.go: `repeat(nl.Warn, 1)` $DIR/core/logger/prometheus_test.go: `repeat(nl.Error, 1)` $DIR/core/logger/prometheus_test.go: `repeat(nl.Critical, 1)` $DIR/core/logger/prometheus_test.go: `repeat(nl.Panic, 1)` $DIR/core/logger/prometheus_test.go: `repeat(nl.Fatal, 1)` $DIR/core/logger/prometheus_test.go: `assertCounterValue(t, warnCounter, 2)` $DIR/core/logger/prometheus_test.go: `assertCounterValue(t, errorCounter, 3)` $DIR/core/logger/prometheus_test.go: `assertCounterValue(t, criticalCounter, 4)` $DIR/core/logger/prometheus_test.go: `assertCounterValue(t, panicCounter, 5)` $DIR/core/logger/prometheus_test.go: `assertCounterValue(t, fatalCounter, 6)` $DIR/core/logger/prometheus_test.go: `repeat(wl.Warn, 1)` $DIR/core/logger/prometheus_test.go: `repeat(wl.Error, 1)` $DIR/core/logger/prometheus_test.go: `repeat(wl.Critical, 1)` $DIR/core/logger/prometheus_test.go: `repeat(wl.Panic, 1)` $DIR/core/logger/prometheus_test.go: `repeat(wl.Fatal, 1)` $DIR/core/logger/prometheus_test.go: `assertCounterValue(t, warnCounter, 3)` $DIR/core/logger/prometheus_test.go: `assertCounterValue(t, errorCounter, 4)` $DIR/core/logger/prometheus_test.go: `assertCounterValue(t, criticalCounter, 5)` $DIR/core/logger/prometheus_test.go: `assertCounterValue(t, panicCounter, 6)` $DIR/core/logger/prometheus_test.go: `assertCounterValue(t, fatalCounter, 7)` $DIR/core/logger/prometheus_test.go: `l.Warnf("msg")` $DIR/core/logger/prometheus_test.go: `l.Warnw("msg")` $DIR/core/logger/prometheus_test.go: `assertCounterValue(t, warnCounter, 5)` $DIR/core/logger/prometheus_test.go: `assertCounterValue(t, errorCounter, 6)` $DIR/core/logger/prometheus_test.go: `l.Criticalf("msg")` $DIR/core/logger/prometheus_test.go: `l.Criticalw("msg")` $DIR/core/logger/prometheus_test.go: `assertCounterValue(t, criticalCounter, 7)` $DIR/core/logger/prometheus_test.go: `l.Panicf("msg")` $DIR/core/logger/prometheus_test.go: `l.Panicw("msg")` $DIR/core/logger/prometheus_test.go: `l.Recover(nil)` $DIR/core/logger/prometheus_test.go: `assertCounterValue(t, panicCounter, 9)` $DIR/core/logger/prometheus_test.go: `l.Fatalw("msg")` $DIR/core/logger/prometheus_test.go: `.Sprintf("test_counter_%d", rand.Int31n(999999))` $DIR/core/logger/prometheus_test.go: `.Int31n(999999)` $DIR/core/logger/prometheus_test.go: `.NewCounter(prometheus.CounterOpts{Name: name})` $DIR/core/logger/prometheus_test.go: `.Named("foo")` $DIR/core/logger/prometheus_test.go: `.With("bar")` $DIR/core/logger/prometheus_test.go: `.Warnf("msg")` $DIR/core/logger/prometheus_test.go: `.Warnw("msg")` $DIR/core/logger/prometheus_test.go: `.Criticalf("msg")` $DIR/core/logger/prometheus_test.go: `.Criticalw("msg")` $DIR/core/logger/prometheus_test.go: `.Panicf("msg")` $DIR/core/logger/prometheus_test.go: `.Panicw("msg")` $DIR/core/logger/prometheus_test.go: `.Recover(nil)` $DIR/core/logger/prometheus_test.go: `.Fatalw("msg")` $DIR/core/logger/sentry_test.go: `t.Run("with even number of keys/values", func(t *testing.T) { keysAndValues := []interface{}{ "foo", 1, "bar", 42.43, "boggly", "str", } m := toMap(keysAndValues) assert.Equal(t, map[string]interface{}{"bar": 42.43, "boggly": "str", "foo": 1}, m) })` $DIR/core/logger/sentry_test.go: `.Run("with even number of keys/values", func(t *testing.T) { keysAndValues := []interface{}{ "foo", 1, "bar", 42.43, "boggly", "str", } m := toMap(keysAndValues) assert.Equal(t, map[string]interface{}{"bar": 42.43, "boggly": "str", "foo": 1}, m) })` $DIR/core/logger/test_logger_test.go: `lgr.Warn(testMessage)` $DIR/core/logger/test_logger_test.go: `srvLgr.SetLogLevel(zapcore.DebugLevel)` $DIR/core/logger/test_logger_test.go: `srvLgr.Debugw(serviceMessage, key, value)` $DIR/core/logger/test_logger_test.go: `logs = observed.TakeAll()` $DIR/core/logger/test_logger_test.go: `log = logs[0]` $DIR/core/logger/test_logger_test.go: `wrkLgr.Infow(workerMessage, resultKey, resultVal)` $DIR/core/logger/test_logger_test.go: `logs = observed.TakeAll()` $DIR/core/logger/test_logger_test.go: `log = logs[0]` $DIR/core/logger/test_logger_test.go: `lgr.Critical(critMsg)` $DIR/core/logger/test_logger_test.go: `logs = observed.TakeAll()` $DIR/core/logger/test_logger_test.go: `log = logs[0]` $DIR/core/logger/test_logger_test.go: `.Warn(testMessage)` $DIR/core/logger/test_logger_test.go: `.TakeAll()` $DIR/core/logger/test_logger_test.go: `.ContextMap()` $DIR/core/logger/test_logger_test.go: `.Named(serviceName)` $DIR/core/logger/test_logger_test.go: `.SetLogLevel(zapcore.DebugLevel)` $DIR/core/logger/test_logger_test.go: `.Debugw(serviceMessage, key, value)` $DIR/core/logger/test_logger_test.go: `.TakeAll()` $DIR/core/logger/test_logger_test.go: `.Named(workerName)` $DIR/core/logger/test_logger_test.go: `.With(idKey, workerId)` $DIR/core/logger/test_logger_test.go: `.Infow(workerMessage, resultKey, resultVal)` $DIR/core/logger/test_logger_test.go: `.TakeAll()` $DIR/core/logger/test_logger_test.go: `.Critical(critMsg)` $DIR/core/logger/test_logger_test.go: `.TakeAll()` $DIR/core/logger/trace_noop_test.go: `lgr.Trace(testMessage)` $DIR/core/logger/trace_noop_test.go: `lgr.SetLogLevel(zapcore.DebugLevel)` $DIR/core/logger/trace_noop_test.go: `lgr.Trace(testMessage)` $DIR/core/logger/trace_noop_test.go: `.Trace(testMessage)` $DIR/core/logger/trace_noop_test.go: `.SetLogLevel(zapcore.DebugLevel)` $DIR/core/logger/trace_noop_test.go: `.Trace(testMessage)` $DIR/core/logger/trace_noop_test.go: `.TakeAll()` $DIR/core/logger/trace_test.go: `lgr.SetLogLevel(zapcore.InfoLevel)` $DIR/core/logger/trace_test.go: `lgr.Trace(testMessage)` $DIR/core/logger/trace_test.go: `lgr.SetLogLevel(zapcore.DebugLevel)` $DIR/core/logger/trace_test.go: `lgr.Trace(testMessage)` $DIR/core/logger/trace_test.go: `.SetLogLevel(zapcore.InfoLevel)` $DIR/core/logger/trace_test.go: `.Trace(testMessage)` $DIR/core/logger/trace_test.go: `.SetLogLevel(zapcore.DebugLevel)` $DIR/core/logger/trace_test.go: `.Trace(testMessage)` $DIR/core/logger/trace_test.go: `.TakeAll()` $DIR/core/logger/zap_test.go: `err = logFileSize.UnmarshalText([]byte("100mb"))` $DIR/core/logger/zap_test.go: `t.Run("on logger creation", func(t *testing.T) { pollChan := make(chan time.Time) stop := func() { close(pollChan) } local.diskSpaceAvailableFn = func(path string) (utils.FileSize, error) { assert.Equal(t, logsDir, path) return maxSize, nil } local.diskPollConfig = zapDiskPollConfig{ stop: stop, pollChan: pollChan, } local.FileMaxSizeMB = int(maxSize/utils.MB) * 2 lggr := newTestLogger(t, local) pollChan <- time.Now() <-local.testDiskLogLvlChan lggr.Debug("trying to write to disk when the disk logs should not be created") logFile := local.LogsFile() _, err = os.ReadFile(logFile) require.Error(t, err) require.Contains(t, err.Error(), "no such file or directory") })` $DIR/core/logger/zap_test.go: `close(pollChan)` $DIR/core/logger/zap_test.go: `local.diskPollConfig = zapDiskPollConfig{ stop: stop, pollChan: pollChan, }` $DIR/core/logger/zap_test.go: `local.FileMaxSizeMB = int(maxSize/utils.MB) * 2` $DIR/core/logger/zap_test.go: `pollChan <- time.Now()` $DIR/core/logger/zap_test.go: `<-local.testDiskLogLvlChan` $DIR/core/logger/zap_test.go: `lggr.Debug("trying to write to disk when the disk logs should not be created")` $DIR/core/logger/zap_test.go: `_, err = os.ReadFile(logFile)` $DIR/core/logger/zap_test.go: `t.Run("on logger creation generic error", func(t *testing.T) { pollChan := make(chan time.Time) stop := func() { close(pollChan) } local.diskSpaceAvailableFn = func(path string) (utils.FileSize, error) { assert.Equal(t, logsDir, path) return 0, nil } local.diskPollConfig = zapDiskPollConfig{ stop: stop, pollChan: pollChan, } local.FileMaxSizeMB = int(maxSize/utils.MB) * 2 lggr := newTestLogger(t, local) pollChan <- time.Now() <-local.testDiskLogLvlChan lggr.Debug("trying to write to disk when the disk logs should not be created - generic error") logFile := local.LogsFile() _, err = os.ReadFile(logFile) require.Error(t, err) require.Contains(t, err.Error(), "no such file or directory") })` $DIR/core/logger/zap_test.go: `close(pollChan)` $DIR/core/logger/zap_test.go: `local.diskPollConfig = zapDiskPollConfig{ stop: stop, pollChan: pollChan, }` $DIR/core/logger/zap_test.go: `local.FileMaxSizeMB = int(maxSize/utils.MB) * 2` $DIR/core/logger/zap_test.go: `pollChan <- time.Now()` $DIR/core/logger/zap_test.go: `<-local.testDiskLogLvlChan` $DIR/core/logger/zap_test.go: `lggr.Debug("trying to write to disk when the disk logs should not be created - generic error")` $DIR/core/logger/zap_test.go: `_, err = os.ReadFile(logFile)` $DIR/core/logger/zap_test.go: `t.Run("after logger is created", func(t *testing.T) { pollChan := make(chan time.Time) stop := func() { close(pollChan) } available := maxSize * 10 local.diskSpaceAvailableFn = func(path string) (utils.FileSize, error) { assert.Equal(t, logsDir, path) return available, nil } local.diskPollConfig = zapDiskPollConfig{ stop: stop, pollChan: pollChan, } local.FileMaxSizeMB = int(maxSize/utils.MB) * 2 lggr := newTestLogger(t, local) lggr.Debug("writing to disk on test") available = maxSize pollChan <- time.Now() <-local.testDiskLogLvlChan lggr.SetLogLevel(zapcore.WarnLevel) lggr.Debug("writing to disk on test again") lggr.Warn("writing to disk on test again") logFile := local.LogsFile() b, err := os.ReadFile(logFile) assert.NoError(t, err) logs := string(b) lines := strings.Split(logs, "\n") // the last line is a blank line, hence why using len(lines) - 2 makes sense actualMessage := lines[len(lines)-2] expectedMessage := fmt.Sprintf( "Disk space is not enough to log into disk any longer, required disk space: %s, Available disk space: %s", local.RequiredDiskSpace(), maxSize, ) require.Contains(t, actualMessage, expectedMessage) })` $DIR/core/logger/zap_test.go: `close(pollChan)` $DIR/core/logger/zap_test.go: `local.diskPollConfig = zapDiskPollConfig{ stop: stop, pollChan: pollChan, }` $DIR/core/logger/zap_test.go: `local.FileMaxSizeMB = int(maxSize/utils.MB) * 2` $DIR/core/logger/zap_test.go: `lggr.Debug("writing to disk on test")` $DIR/core/logger/zap_test.go: `available = maxSize` $DIR/core/logger/zap_test.go: `pollChan <- time.Now()` $DIR/core/logger/zap_test.go: `<-local.testDiskLogLvlChan` $DIR/core/logger/zap_test.go: `lggr.SetLogLevel(zapcore.WarnLevel)` $DIR/core/logger/zap_test.go: `lggr.Debug("writing to disk on test again")` $DIR/core/logger/zap_test.go: `lggr.Warn("writing to disk on test again")` $DIR/core/logger/zap_test.go: `close(pollChan)` $DIR/core/logger/zap_test.go: `local.diskPollConfig = zapDiskPollConfig{ stop: stop, pollChan: pollChan, }` $DIR/core/logger/zap_test.go: `local.FileMaxSizeMB = int(maxSize/utils.MB) * 2` $DIR/core/logger/zap_test.go: `lggr.Debug("test")` $DIR/core/logger/zap_test.go: `available = maxSize` $DIR/core/logger/zap_test.go: `pollChan <- time.Now()` $DIR/core/logger/zap_test.go: `<-local.testDiskLogLvlChan` $DIR/core/logger/zap_test.go: `available = maxSize * 12` $DIR/core/logger/zap_test.go: `pollChan <- time.Now()` $DIR/core/logger/zap_test.go: `<-local.testDiskLogLvlChan` $DIR/core/logger/zap_test.go: `lggr.Debug("test again")` $DIR/core/logger/zap_test.go: `err = logFileSize.UnmarshalText([]byte("100mb"))` $DIR/core/logger/zap_test.go: `close(pollChan)` $DIR/core/logger/zap_test.go: `local.FileMaxSizeMB = int(maxSize/utils.MB) * 2` $DIR/core/logger/zap_test.go: `lggr.Debug("test message with caller")` $DIR/core/logger/zap_test.go: `pollChan <- time.Now()` $DIR/core/logger/zap_test.go: `<-local.testDiskLogLvlChan` $DIR/core/logger/zap_test.go: `.FileSize(5 * utils.MB)` $DIR/core/logger/zap_test.go: `.TempDir()` $DIR/core/logger/zap_test.go: `.CreateTemp(logsDir, "*")` $DIR/core/logger/zap_test.go: `.UnmarshalText([]byte("100mb"))` $DIR/core/logger/zap_test.go: `.Run("on logger creation", func(t *testing.T) { pollChan := make(chan time.Time) stop := func() { close(pollChan) } local.diskSpaceAvailableFn = func(path string) (utils.FileSize, error) { assert.Equal(t, logsDir, path) return maxSize, nil } local.diskPollConfig = zapDiskPollConfig{ stop: stop, pollChan: pollChan, } local.FileMaxSizeMB = int(maxSize/utils.MB) * 2 lggr := newTestLogger(t, local) pollChan <- time.Now() <-local.testDiskLogLvlChan lggr.Debug("trying to write to disk when the disk logs should not be created") logFile := local.LogsFile() _, err = os.ReadFile(logFile) require.Error(t, err) require.Contains(t, err.Error(), "no such file or directory") })` $DIR/core/logger/zap_test.go: `.Now()` $DIR/core/logger/zap_test.go: `.Debug("trying to write to disk when the disk logs should not be created")` $DIR/core/logger/zap_test.go: `.LogsFile()` $DIR/core/logger/zap_test.go: `.ReadFile(logFile)` $DIR/core/logger/zap_test.go: `.Run("on logger creation generic error", func(t *testing.T) { pollChan := make(chan time.Time) stop := func() { close(pollChan) } local.diskSpaceAvailableFn = func(path string) (utils.FileSize, error) { assert.Equal(t, logsDir, path) return 0, nil } local.diskPollConfig = zapDiskPollConfig{ stop: stop, pollChan: pollChan, } local.FileMaxSizeMB = int(maxSize/utils.MB) * 2 lggr := newTestLogger(t, local) pollChan <- time.Now() <-local.testDiskLogLvlChan lggr.Debug("trying to write to disk when the disk logs should not be created - generic error") logFile := local.LogsFile() _, err = os.ReadFile(logFile) require.Error(t, err) require.Contains(t, err.Error(), "no such file or directory") })` $DIR/core/logger/zap_test.go: `.Now()` $DIR/core/logger/zap_test.go: `.Debug("trying to write to disk when the disk logs should not be created - generic error")` $DIR/core/logger/zap_test.go: `.LogsFile()` $DIR/core/logger/zap_test.go: `.ReadFile(logFile)` $DIR/core/logger/zap_test.go: `.Run("after logger is created", func(t *testing.T) { pollChan := make(chan time.Time) stop := func() { close(pollChan) } available := maxSize * 10 local.diskSpaceAvailableFn = func(path string) (utils.FileSize, error) { assert.Equal(t, logsDir, path) return available, nil } local.diskPollConfig = zapDiskPollConfig{ stop: stop, pollChan: pollChan, } local.FileMaxSizeMB = int(maxSize/utils.MB) * 2 lggr := newTestLogger(t, local) lggr.Debug("writing to disk on test") available = maxSize pollChan <- time.Now() <-local.testDiskLogLvlChan lggr.SetLogLevel(zapcore.WarnLevel) lggr.Debug("writing to disk on test again") lggr.Warn("writing to disk on test again") logFile := local.LogsFile() b, err := os.ReadFile(logFile) assert.NoError(t, err) logs := string(b) lines := strings.Split(logs, "\n") // the last line is a blank line, hence why using len(lines) - 2 makes sense actualMessage := lines[len(lines)-2] expectedMessage := fmt.Sprintf( "Disk space is not enough to log into disk any longer, required disk space: %s, Available disk space: %s", local.RequiredDiskSpace(), maxSize, ) require.Contains(t, actualMessage, expectedMessage) })` $DIR/core/logger/zap_test.go: `.Debug("writing to disk on test")` $DIR/core/logger/zap_test.go: `.Now()` $DIR/core/logger/zap_test.go: `.SetLogLevel(zapcore.WarnLevel)` $DIR/core/logger/zap_test.go: `.Debug("writing to disk on test again")` $DIR/core/logger/zap_test.go: `.Warn("writing to disk on test again")` $DIR/core/logger/zap_test.go: `.LogsFile()` $DIR/core/logger/zap_test.go: `.ReadFile(logFile)` $DIR/core/logger/zap_test.go: `.Split(logs, "\n")` $DIR/core/logger/zap_test.go: `.Sprintf( "Disk space is not enough to log into disk any longer, required disk space: %s, Available disk space: %s", local.RequiredDiskSpace(), maxSize, )` $DIR/core/logger/zap_test.go: `.RequiredDiskSpace()` $DIR/core/logger/zap_test.go: `.Debug("test")` $DIR/core/logger/zap_test.go: `.Now()` $DIR/core/logger/zap_test.go: `.Now()` $DIR/core/logger/zap_test.go: `.Debug("test again")` $DIR/core/logger/zap_test.go: `.LogsFile()` $DIR/core/logger/zap_test.go: `.ReadFile(logFile)` $DIR/core/logger/zap_test.go: `.Split(logs, "\n")` $DIR/core/logger/zap_test.go: `.Sprintf( "Disk space is not enough to log into disk any longer, required disk space: %s, Available disk space: %s", local.RequiredDiskSpace(), maxSize, )` $DIR/core/logger/zap_test.go: `.RequiredDiskSpace()` $DIR/core/logger/zap_test.go: `.FileSize(5 * utils.MB)` $DIR/core/logger/zap_test.go: `.TempDir()` $DIR/core/logger/zap_test.go: `.CreateTemp(logsDir, "*")` $DIR/core/logger/zap_test.go: `.UnmarshalText([]byte("100mb"))` $DIR/core/logger/zap_test.go: `.Debug("test message with caller")` $DIR/core/logger/zap_test.go: `.Now()` $DIR/core/logger/zap_test.go: `.LogsFile()` $DIR/core/logger/zap_test.go: `.ReadFile(logFile)` $DIR/core/logger/zap_test.go: `.Split(logs, "\n")` $DIR/core/logger/zap_test.go: `.Named("Lggr1")` $DIR/core/logger/zap_test.go: `.Named("Lggr2")` $DIR/core/logger/zap_test.go: `.Name()` $DIR/core/null/int64_test.go: `t.Run(fmt.Sprintf("%d", test.input), func(t *testing.T) { i := null.Int64From(test.input) assert.True(t, i.Valid) assert.Equal(t, test.input, i.Int64) })` $DIR/core/null/int64_test.go: `t.Run(test.name, func(t *testing.T) { var i null.Int64 err := json.Unmarshal([]byte(test.input), &i) require.NoError(t, err) assert.True(t, i.Valid) assert.Equal(t, int64(12345), i.Int64) })` $DIR/core/null/int64_test.go: `t.Run(test.name, func(t *testing.T) { var i null.Int64 err := json.Unmarshal([]byte(test.input), &i) require.NoError(t, err) assert.False(t, i.Valid) })` $DIR/core/null/int64_test.go: `t.Run(test.name, func(t *testing.T) { var i null.Int64 err := json.Unmarshal([]byte(test.input), &i) require.Error(t, err) assert.False(t, i.Valid) })` $DIR/core/null/int64_test.go: `err = json.Unmarshal([]byte(strconv.FormatUint(math.MaxUint64, 10)), &i)` $DIR/core/null/int64_test.go: `t.Run(test.name, func(t *testing.T) { var i null.Int64 err := i.UnmarshalText([]byte(test.input)) require.NoError(t, err) assert.False(t, i.Valid) })` $DIR/core/null/int64_test.go: `assertJSONEquals(t, data, "12345", "non-empty json marshal")` $DIR/core/null/int64_test.go: `data, err = json.Marshal(null)` $DIR/core/null/int64_test.go: `assertJSONEquals(t, data, "12345", "non-empty text marshal")` $DIR/core/null/int64_test.go: `data, err = null.MarshalText()` $DIR/core/null/int64_test.go: `change.SetValid(12345)` $DIR/core/null/int64_test.go: `err = i.Scan(int32(12345))` $DIR/core/null/int64_test.go: `err = i.Scan(int64(12345))` $DIR/core/null/int64_test.go: `err = i.Scan(math.MaxInt64)` $DIR/core/null/int64_test.go: `err = i.Scan(uint(12345))` $DIR/core/null/int64_test.go: `err = i.Scan(uint64(12345))` $DIR/core/null/int64_test.go: `err = i.Scan(overflowingUint64)` $DIR/core/null/int64_test.go: `err = i.Scan(overflowingUint)` $DIR/core/null/int64_test.go: `err = i.Scan(nil)` $DIR/core/null/int64_test.go: `.Run(fmt.Sprintf("%d", test.input), func(t *testing.T) { i := null.Int64From(test.input) assert.True(t, i.Valid) assert.Equal(t, test.input, i.Int64) })` $DIR/core/null/int64_test.go: `.Sprintf("%d", test.input)` $DIR/core/null/int64_test.go: `.Int64From(test.input)` $DIR/core/null/int64_test.go: `.Run(test.name, func(t *testing.T) { var i null.Int64 err := json.Unmarshal([]byte(test.input), &i) require.NoError(t, err) assert.True(t, i.Valid) assert.Equal(t, int64(12345), i.Int64) })` $DIR/core/null/int64_test.go: `.Unmarshal([]byte(test.input), &i)` $DIR/core/null/int64_test.go: `.Run(test.name, func(t *testing.T) { var i null.Int64 err := json.Unmarshal([]byte(test.input), &i) require.NoError(t, err) assert.False(t, i.Valid) })` $DIR/core/null/int64_test.go: `.Unmarshal([]byte(test.input), &i)` $DIR/core/null/int64_test.go: `.Run(test.name, func(t *testing.T) { var i null.Int64 err := json.Unmarshal([]byte(test.input), &i) require.Error(t, err) assert.False(t, i.Valid) })` $DIR/core/null/int64_test.go: `.Unmarshal([]byte(test.input), &i)` $DIR/core/null/int64_test.go: `.Unmarshal([]byte(strconv.FormatInt(math.MaxInt64, 10)), &i)` $DIR/core/null/int64_test.go: `.FormatInt(math.MaxInt64, 10)` $DIR/core/null/int64_test.go: `.Unmarshal([]byte(strconv.FormatUint(math.MaxUint64, 10)), &i)` $DIR/core/null/int64_test.go: `.FormatUint(math.MaxUint64, 10)` $DIR/core/null/int64_test.go: `.UnmarshalText([]byte("12345"))` $DIR/core/null/int64_test.go: `.Run(test.name, func(t *testing.T) { var i null.Int64 err := i.UnmarshalText([]byte(test.input)) require.NoError(t, err) assert.False(t, i.Valid) })` $DIR/core/null/int64_test.go: `.UnmarshalText([]byte(test.input))` $DIR/core/null/int64_test.go: `.Int64From(12345)` $DIR/core/null/int64_test.go: `.Marshal(i)` $DIR/core/null/int64_test.go: `.NewInt64(0, false)` $DIR/core/null/int64_test.go: `.Marshal(null)` $DIR/core/null/int64_test.go: `.Int64From(12345)` $DIR/core/null/int64_test.go: `.MarshalText()` $DIR/core/null/int64_test.go: `.NewInt64(0, false)` $DIR/core/null/int64_test.go: `.MarshalText()` $DIR/core/null/int64_test.go: `.NewInt64(0, false)` $DIR/core/null/int64_test.go: `.SetValid(12345)` $DIR/core/null/int64_test.go: `.Scan(int(12345))` $DIR/core/null/int64_test.go: `.Scan(int32(12345))` $DIR/core/null/int64_test.go: `.Scan(int64(12345))` $DIR/core/null/int64_test.go: `.Scan(math.MaxInt64)` $DIR/core/null/int64_test.go: `.Scan(uint(12345))` $DIR/core/null/int64_test.go: `.Scan(uint64(12345))` $DIR/core/null/int64_test.go: `.Scan(overflowingUint64)` $DIR/core/null/int64_test.go: `.Scan(overflowingUint)` $DIR/core/null/int64_test.go: `.Scan(nil)` $DIR/core/null/uint32_test.go: `t.Run(fmt.Sprintf("%d", test.input), func(t *testing.T) { i := null.Uint32From(test.input) assert.True(t, i.Valid) assert.Equal(t, test.input, i.Uint32) })` $DIR/core/null/uint32_test.go: `t.Run(test.name, func(t *testing.T) { var i null.Uint32 err := json.Unmarshal([]byte(test.input), &i) require.NoError(t, err) assert.True(t, i.Valid) assert.Equal(t, uint32(12345), i.Uint32) })` $DIR/core/null/uint32_test.go: `t.Run(test.name, func(t *testing.T) { var i null.Uint32 err := json.Unmarshal([]byte(test.input), &i) require.NoError(t, err) assert.False(t, i.Valid) })` $DIR/core/null/uint32_test.go: `t.Run(test.name, func(t *testing.T) { var i null.Uint32 err := json.Unmarshal([]byte(test.input), &i) require.Error(t, err) assert.False(t, i.Valid) })` $DIR/core/null/uint32_test.go: `err = json.Unmarshal([]byte(strconv.FormatUint(maxUint32+1, 10)), &i)` $DIR/core/null/uint32_test.go: `t.Run(test.name, func(t *testing.T) { var i null.Uint32 err := i.UnmarshalText([]byte(test.input)) require.NoError(t, err) assert.False(t, i.Valid) })` $DIR/core/null/uint32_test.go: `assertJSONEquals(t, data, "12345", "non-empty json marshal")` $DIR/core/null/uint32_test.go: `data, err = json.Marshal(null)` $DIR/core/null/uint32_test.go: `assertJSONEquals(t, data, "12345", "non-empty text marshal")` $DIR/core/null/uint32_test.go: `data, err = null.MarshalText()` $DIR/core/null/uint32_test.go: `change.SetValid(12345)` $DIR/core/null/uint32_test.go: `err = i.Scan(int64(12345))` $DIR/core/null/uint32_test.go: `err = i.Scan(int64(math.MaxInt64))` $DIR/core/null/uint32_test.go: `err = i.Scan(uint(12345))` $DIR/core/null/uint32_test.go: `err = i.Scan(uint(math.MaxUint64))` $DIR/core/null/uint32_test.go: `err = i.Scan(uint32(12345))` $DIR/core/null/uint32_test.go: `err = i.Scan(nil)` $DIR/core/null/uint32_test.go: `.Run(fmt.Sprintf("%d", test.input), func(t *testing.T) { i := null.Uint32From(test.input) assert.True(t, i.Valid) assert.Equal(t, test.input, i.Uint32) })` $DIR/core/null/uint32_test.go: `.Sprintf("%d", test.input)` $DIR/core/null/uint32_test.go: `.Uint32From(test.input)` $DIR/core/null/uint32_test.go: `.Run(test.name, func(t *testing.T) { var i null.Uint32 err := json.Unmarshal([]byte(test.input), &i) require.NoError(t, err) assert.True(t, i.Valid) assert.Equal(t, uint32(12345), i.Uint32) })` $DIR/core/null/uint32_test.go: `.Unmarshal([]byte(test.input), &i)` $DIR/core/null/uint32_test.go: `.Run(test.name, func(t *testing.T) { var i null.Uint32 err := json.Unmarshal([]byte(test.input), &i) require.NoError(t, err) assert.False(t, i.Valid) })` $DIR/core/null/uint32_test.go: `.Unmarshal([]byte(test.input), &i)` $DIR/core/null/uint32_test.go: `.Run(test.name, func(t *testing.T) { var i null.Uint32 err := json.Unmarshal([]byte(test.input), &i) require.Error(t, err) assert.False(t, i.Valid) })` $DIR/core/null/uint32_test.go: `.Unmarshal([]byte(test.input), &i)` $DIR/core/null/uint32_test.go: `.Unmarshal([]byte(strconv.FormatUint(maxUint32, 10)), &i)` $DIR/core/null/uint32_test.go: `.FormatUint(maxUint32, 10)` $DIR/core/null/uint32_test.go: `.Unmarshal([]byte(strconv.FormatUint(maxUint32+1, 10)), &i)` $DIR/core/null/uint32_test.go: `.FormatUint(maxUint32+1, 10)` $DIR/core/null/uint32_test.go: `.UnmarshalText([]byte("12345"))` $DIR/core/null/uint32_test.go: `.Run(test.name, func(t *testing.T) { var i null.Uint32 err := i.UnmarshalText([]byte(test.input)) require.NoError(t, err) assert.False(t, i.Valid) })` $DIR/core/null/uint32_test.go: `.UnmarshalText([]byte(test.input))` $DIR/core/null/uint32_test.go: `.Uint32From(12345)` $DIR/core/null/uint32_test.go: `.Marshal(i)` $DIR/core/null/uint32_test.go: `.NewUint32(0, false)` $DIR/core/null/uint32_test.go: `.Marshal(null)` $DIR/core/null/uint32_test.go: `.Uint32From(12345)` $DIR/core/null/uint32_test.go: `.MarshalText()` $DIR/core/null/uint32_test.go: `.NewUint32(0, false)` $DIR/core/null/uint32_test.go: `.MarshalText()` $DIR/core/null/uint32_test.go: `.NewUint32(0, false)` $DIR/core/null/uint32_test.go: `.SetValid(12345)` $DIR/core/null/uint32_test.go: `.Scan(12345)` $DIR/core/null/uint32_test.go: `.Scan(int64(12345))` $DIR/core/null/uint32_test.go: `.Scan(int64(math.MaxInt64))` $DIR/core/null/uint32_test.go: `.Scan(uint(12345))` $DIR/core/null/uint32_test.go: `.Scan(uint(math.MaxUint64))` $DIR/core/null/uint32_test.go: `.Scan(uint32(12345))` $DIR/core/null/uint32_test.go: `.Scan(nil)` $DIR/core/scripts/common/helpers_test.go: `t.Run(test.name, func(t *testing.T) { testFunc := func(val *big.Int) bool { return val.Cmp(big.NewInt(test.result)) < 1 } result := BinarySearch(big.NewInt(test.top), big.NewInt(test.bottom), testFunc) assert.Equal(t, test.result, result.Int64()) })` $DIR/core/scripts/common/helpers_test.go: `.Run(test.name, func(t *testing.T) { testFunc := func(val *big.Int) bool { return val.Cmp(big.NewInt(test.result)) < 1 } result := BinarySearch(big.NewInt(test.top), big.NewInt(test.bottom), testFunc) assert.Equal(t, test.result, result.Int64()) })` $DIR/core/scripts/common/helpers_test.go: `.Cmp(big.NewInt(test.result))` $DIR/core/scripts/common/helpers_test.go: `.NewInt(test.result)` $DIR/core/scripts/common/helpers_test.go: `.NewInt(test.top)` $DIR/core/scripts/common/helpers_test.go: `.NewInt(test.bottom)` $DIR/core/scripts/functions/src/files_test.go: `t.Run(tt.name, func(t *testing.T) { pth := filepath.Join(t.TempDir(), strings.ReplaceAll(tt.name, " ", "_")) err := writeLines(tt.args.lines, pth) assert.NoError(t, err) got, err := readLines(pth) assert.NoError(t, err) assert.Equal(t, tt.args.lines, got) })` $DIR/core/scripts/functions/src/files_test.go: `.Run(tt.name, func(t *testing.T) { pth := filepath.Join(t.TempDir(), strings.ReplaceAll(tt.name, " ", "_")) err := writeLines(tt.args.lines, pth) assert.NoError(t, err) got, err := readLines(pth) assert.NoError(t, err) assert.Equal(t, tt.args.lines, got) })` $DIR/core/scripts/functions/src/files_test.go: `.Join(t.TempDir(), strings.ReplaceAll(tt.name, " ", "_"))` $DIR/core/scripts/functions/src/files_test.go: `.TempDir()` $DIR/core/scripts/functions/src/files_test.go: `.ReplaceAll(tt.name, " ", "_")` $DIR/core/scripts/keystone/src/03_gen_crib_cluster_overrides_cmd_test.go: `.Join(lines, "\n")` $DIR/core/scripts/keystone/src/88_gen_jobspecs_test.go: `.ToString()` $DIR/core/scripts/keystone/src/88_gen_ocr3_config_test.go: `.Custom("OffchainConfig", func(s any) (any, error) { // coerce the value to a string s, ok := s.(string) if !ok { return nil, errors.New("offchain config is not a string") } // if the string is not empty if s == "" { return nil, errors.New("offchain config is empty") } return "", nil })` $DIR/core/scripts/keystone/src/88_gen_ocr3_config_test.go: `.New("offchain config is not a string")` $DIR/core/scripts/keystone/src/88_gen_ocr3_config_test.go: `.New("offchain config is empty")` $DIR/core/scripts/keystone/src/99_files_test.go: `t.Run(tt.name, func(t *testing.T) { pth := filepath.Join(t.TempDir(), strings.ReplaceAll(tt.name, " ", "_")) err := writeLines(tt.args.lines, pth) assert.NoError(t, err) got, err := readLines(pth) assert.NoError(t, err) assert.Equal(t, tt.args.lines, got) })` $DIR/core/scripts/keystone/src/99_files_test.go: `.Run(tt.name, func(t *testing.T) { pth := filepath.Join(t.TempDir(), strings.ReplaceAll(tt.name, " ", "_")) err := writeLines(tt.args.lines, pth) assert.NoError(t, err) got, err := readLines(pth) assert.NoError(t, err) assert.Equal(t, tt.args.lines, got) })` $DIR/core/scripts/keystone/src/99_files_test.go: `.Join(t.TempDir(), strings.ReplaceAll(tt.name, " ", "_"))` $DIR/core/scripts/keystone/src/99_files_test.go: `.TempDir()` $DIR/core/scripts/keystone/src/99_files_test.go: `.ReplaceAll(tt.name, " ", "_")` $DIR/core/services/blockhashstore/bhs_test.go: `txm.On("CreateTransaction", mock.Anything, mock.MatchedBy(func(tx txmgr.TxRequest) bool { return tx.FromAddress.String() == k1.Address.String() })).Once().Return(txmgr.Tx{}, nil)` $DIR/core/services/blockhashstore/bhs_test.go: `txm.On("CreateTransaction", mock.Anything, mock.MatchedBy(func(tx txmgr.TxRequest) bool { return tx.FromAddress.String() == k2.Address.String() })).Once().Return(txmgr.Tx{}, nil)` $DIR/core/services/blockhashstore/bhs_test.go: `err = bhs.Store(ctx, 1)` $DIR/core/services/blockhashstore/bhs_test.go: `err = bhs.Store(ctx, 2)` $DIR/core/services/blockhashstore/bhs_test.go: `.Context(t)` $DIR/core/services/blockhashstore/bhs_test.go: `.NewSqlxDB(t)` $DIR/core/services/blockhashstore/bhs_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/services/blockhashstore/bhs_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/blockhashstore/bhs_test.go: `.NewKeyStore(t, db)` $DIR/core/services/blockhashstore/bhs_test.go: `.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, KeyStore: kst.Eth(), GeneralConfig: cfg, Client: ethClient})` $DIR/core/services/blockhashstore/bhs_test.go: `.Eth()` $DIR/core/services/blockhashstore/bhs_test.go: `.NewLegacyChainsFromRelayerExtenders(relayExtenders)` $DIR/core/services/blockhashstore/bhs_test.go: `.Get(cltest.FixtureChainID.String())` $DIR/core/services/blockhashstore/bhs_test.go: `.FixtureChainID.String()` $DIR/core/services/blockhashstore/bhs_test.go: `.TestLogger(t)` $DIR/core/services/blockhashstore/bhs_test.go: `.New(db, utils.FastScryptParams, lggr)` $DIR/core/services/blockhashstore/bhs_test.go: `.Eth()` $DIR/core/services/blockhashstore/bhs_test.go: `.Create(ctx, &cltest.FixtureChainID)` $DIR/core/services/blockhashstore/bhs_test.go: `.Eth()` $DIR/core/services/blockhashstore/bhs_test.go: `.Create(ctx, &cltest.FixtureChainID)` $DIR/core/services/blockhashstore/bhs_test.go: `.HexToAddress("0x31Ca8bf590360B3198749f852D5c516c642846F6")` $DIR/core/services/blockhashstore/bhs_test.go: `.NewBlockhashStore(bhsAddress, chain.Client())` $DIR/core/services/blockhashstore/bhs_test.go: `.Client()` $DIR/core/services/blockhashstore/bhs_test.go: `.NewBulletproofBHS( chain.Config().EVM().GasEstimator(), cfg.Database(), fromAddresses, txm, store, nil, &cltest.FixtureChainID, ks.Eth(), )` $DIR/core/services/blockhashstore/bhs_test.go: `.Config()` $DIR/core/services/blockhashstore/bhs_test.go: `.EVM()` $DIR/core/services/blockhashstore/bhs_test.go: `.GasEstimator()` $DIR/core/services/blockhashstore/bhs_test.go: `.Database()` $DIR/core/services/blockhashstore/bhs_test.go: `.Eth()` $DIR/core/services/blockhashstore/bhs_test.go: `.On("CreateTransaction", mock.Anything, mock.MatchedBy(func(tx txmgr.TxRequest) bool { return tx.FromAddress.String() == k1.Address.String() }))` $DIR/core/services/blockhashstore/bhs_test.go: `.MatchedBy(func(tx txmgr.TxRequest) bool { return tx.FromAddress.String() == k1.Address.String() })` $DIR/core/services/blockhashstore/bhs_test.go: `.FromAddress.String()` $DIR/core/services/blockhashstore/bhs_test.go: `.Address.String()` $DIR/core/services/blockhashstore/bhs_test.go: `.Once()` $DIR/core/services/blockhashstore/bhs_test.go: `.Return(txmgr.Tx{}, nil)` $DIR/core/services/blockhashstore/bhs_test.go: `.On("CreateTransaction", mock.Anything, mock.MatchedBy(func(tx txmgr.TxRequest) bool { return tx.FromAddress.String() == k2.Address.String() }))` $DIR/core/services/blockhashstore/bhs_test.go: `.MatchedBy(func(tx txmgr.TxRequest) bool { return tx.FromAddress.String() == k2.Address.String() })` $DIR/core/services/blockhashstore/bhs_test.go: `.FromAddress.String()` $DIR/core/services/blockhashstore/bhs_test.go: `.Address.String()` $DIR/core/services/blockhashstore/bhs_test.go: `.Once()` $DIR/core/services/blockhashstore/bhs_test.go: `.Return(txmgr.Tx{}, nil)` $DIR/core/services/blockhashstore/bhs_test.go: `.Store(ctx, 1)` $DIR/core/services/blockhashstore/bhs_test.go: `.Store(ctx, 2)` $DIR/core/services/blockhashstore/delegate_test.go: `t.Run("happy", func(t *testing.T) { spec := job.Job{BlockhashStoreSpec: &job.BlockhashStoreSpec{WaitBlocks: defaultWaitBlocks, EVMChainID: (*big.Big)(testutils.FixtureChainID)}} services, err := delegate.ServicesForSpec(testutils.Context(t), spec) require.NoError(t, err) require.Len(t, services, 1) })` $DIR/core/services/blockhashstore/delegate_test.go: `t.Run("happy with coordinators", func(t *testing.T) { coordinatorV1 := cltest.NewEIP55Address() coordinatorV2 := cltest.NewEIP55Address() coordinatorV2Plus := cltest.NewEIP55Address() spec := job.Job{BlockhashStoreSpec: &job.BlockhashStoreSpec{ WaitBlocks: defaultWaitBlocks, CoordinatorV1Address: &coordinatorV1, CoordinatorV2Address: &coordinatorV2, CoordinatorV2PlusAddress: &coordinatorV2Plus, EVMChainID: (*big.Big)(testutils.FixtureChainID), }} services, err := delegate.ServicesForSpec(testutils.Context(t), spec) require.NoError(t, err) require.Len(t, services, 1) })` $DIR/core/services/blockhashstore/delegate_test.go: `t.Run("missing BlockhashStoreSpec", func(t *testing.T) { spec := job.Job{BlockhashStoreSpec: nil} _, err := delegate.ServicesForSpec(testutils.Context(t), spec) assert.Error(t, err) })` $DIR/core/services/blockhashstore/delegate_test.go: `t.Run("wrong EVMChainID", func(t *testing.T) { spec := job.Job{BlockhashStoreSpec: &job.BlockhashStoreSpec{ EVMChainID: big.NewI(123), }} _, err := delegate.ServicesForSpec(testutils.Context(t), spec) assert.Error(t, err) })` $DIR/core/services/blockhashstore/delegate_test.go: `_, err = delegate.ServicesForSpec(testutils.Context(t), spec)` $DIR/core/services/blockhashstore/delegate_test.go: `err = services[0].Start(testutils.Context(t))` $DIR/core/services/blockhashstore/delegate_test.go: `err = services[0].Close()` $DIR/core/services/blockhashstore/delegate_test.go: `.TestLogger(t)` $DIR/core/services/blockhashstore/delegate_test.go: `.NewDelegate(nil, lggr, nil, nil)` $DIR/core/services/blockhashstore/delegate_test.go: `.JobType()` $DIR/core/services/blockhashstore/delegate_test.go: `.legacyChains.Slice()` $DIR/core/services/blockhashstore/delegate_test.go: `.Config()` $DIR/core/services/blockhashstore/delegate_test.go: `.EVM()` $DIR/core/services/blockhashstore/delegate_test.go: `.FinalityDepth()` $DIR/core/services/blockhashstore/delegate_test.go: `.Run("happy", func(t *testing.T) { spec := job.Job{BlockhashStoreSpec: &job.BlockhashStoreSpec{WaitBlocks: defaultWaitBlocks, EVMChainID: (*big.Big)(testutils.FixtureChainID)}} services, err := delegate.ServicesForSpec(testutils.Context(t), spec) require.NoError(t, err) require.Len(t, services, 1) })` $DIR/core/services/blockhashstore/delegate_test.go: `.ServicesForSpec(testutils.Context(t), spec)` $DIR/core/services/blockhashstore/delegate_test.go: `.Context(t)` $DIR/core/services/blockhashstore/delegate_test.go: `.Run("happy with coordinators", func(t *testing.T) { coordinatorV1 := cltest.NewEIP55Address() coordinatorV2 := cltest.NewEIP55Address() coordinatorV2Plus := cltest.NewEIP55Address() spec := job.Job{BlockhashStoreSpec: &job.BlockhashStoreSpec{ WaitBlocks: defaultWaitBlocks, CoordinatorV1Address: &coordinatorV1, CoordinatorV2Address: &coordinatorV2, CoordinatorV2PlusAddress: &coordinatorV2Plus, EVMChainID: (*big.Big)(testutils.FixtureChainID), }} services, err := delegate.ServicesForSpec(testutils.Context(t), spec) require.NoError(t, err) require.Len(t, services, 1) })` $DIR/core/services/blockhashstore/delegate_test.go: `.NewEIP55Address()` $DIR/core/services/blockhashstore/delegate_test.go: `.NewEIP55Address()` $DIR/core/services/blockhashstore/delegate_test.go: `.NewEIP55Address()` $DIR/core/services/blockhashstore/delegate_test.go: `.ServicesForSpec(testutils.Context(t), spec)` $DIR/core/services/blockhashstore/delegate_test.go: `.Context(t)` $DIR/core/services/blockhashstore/delegate_test.go: `.Run("missing BlockhashStoreSpec", func(t *testing.T) { spec := job.Job{BlockhashStoreSpec: nil} _, err := delegate.ServicesForSpec(testutils.Context(t), spec) assert.Error(t, err) })` $DIR/core/services/blockhashstore/delegate_test.go: `.ServicesForSpec(testutils.Context(t), spec)` $DIR/core/services/blockhashstore/delegate_test.go: `.Context(t)` $DIR/core/services/blockhashstore/delegate_test.go: `.Run("wrong EVMChainID", func(t *testing.T) { spec := job.Job{BlockhashStoreSpec: &job.BlockhashStoreSpec{ EVMChainID: big.NewI(123), }} _, err := delegate.ServicesForSpec(testutils.Context(t), spec) assert.Error(t, err) })` $DIR/core/services/blockhashstore/delegate_test.go: `.NewI(123)` $DIR/core/services/blockhashstore/delegate_test.go: `.ServicesForSpec(testutils.Context(t), spec)` $DIR/core/services/blockhashstore/delegate_test.go: `.Context(t)` $DIR/core/services/blockhashstore/delegate_test.go: `.Context(t)` $DIR/core/services/blockhashstore/delegate_test.go: `.ethKeyStore.Delete(ctx, testData.sendingKey.ID())` $DIR/core/services/blockhashstore/delegate_test.go: `.sendingKey.ID()` $DIR/core/services/blockhashstore/delegate_test.go: `.ServicesForSpec(testutils.Context(t), spec)` $DIR/core/services/blockhashstore/delegate_test.go: `.Context(t)` $DIR/core/services/blockhashstore/delegate_test.go: `.legacyChains.Slice()` $DIR/core/services/blockhashstore/delegate_test.go: `.Config()` $DIR/core/services/blockhashstore/delegate_test.go: `.EVM()` $DIR/core/services/blockhashstore/delegate_test.go: `.FinalityDepth()` $DIR/core/services/blockhashstore/delegate_test.go: `.WaitTimeout(t)` $DIR/core/services/blockhashstore/delegate_test.go: `.ServicesForSpec(testutils.Context(t), spec)` $DIR/core/services/blockhashstore/delegate_test.go: `.Context(t)` $DIR/core/services/blockhashstore/delegate_test.go: `.Start(testutils.Context(t))` $DIR/core/services/blockhashstore/delegate_test.go: `.Context(t)` $DIR/core/services/blockhashstore/delegate_test.go: `.logs.FilterMessage("Stopping BHS feeder")` $DIR/core/services/blockhashstore/delegate_test.go: `.Len()` $DIR/core/services/blockhashstore/feeder_test.go: `t.Run("bhs_heartbeat_happy_path", func(t *testing.T) { expectedDuration := 600 * time.Second mockBHS := bhsmocks.NewBHS(t) mockLogger := loggermocks.NewLogger(t) feeder := NewFeeder( mockLogger, &TestCoordinator{}, // Not used for this test mockBHS, &mocklp.LogPoller{}, // Not used for this test 0, 25, // Not used for this test 100, // Not used for this test expectedDuration, func(ctx context.Context) (uint64, error) { return tests[0].latest, nil }) ctx, cancel := context.WithCancel(testutils.Context(t)) mockTimer := bhsmocks.NewTimer(t) mockBHS.On("StoreEarliest", ctx).Return(nil).Once() mockTimer.On("After", expectedDuration).Return(func() <-chan time.Time { c := make(chan time.Time) close(c) return c }()).Once() mockTimer.On("After", expectedDuration).Return(func() <-chan time.Time { c := make(chan time.Time) return c }()).Run(func(args mock.Arguments) { cancel() }).Once() mockLogger.On("Infow", "Starting heartbeat blockhash using storeEarliest every 10m0s").Once() mockLogger.On("Infow", "storing heartbeat blockhash using storeEarliest", "heartbeatPeriodSeconds", expectedDuration.Seconds()).Once() require.Len(t, mockLogger.ExpectedCalls, 2) require.Len(t, mockTimer.ExpectedCalls, 2) defer mockTimer.AssertExpectations(t) defer mockBHS.AssertExpectations(t) defer mockLogger.AssertExpectations(t) feeder.StartHeartbeats(ctx, mockTimer) })` $DIR/core/services/blockhashstore/feeder_test.go: `mockBHS.On("StoreEarliest", ctx).Return(nil).Once()` $DIR/core/services/blockhashstore/feeder_test.go: `mockTimer.On("After", expectedDuration).Return(func() <-chan time.Time { c := make(chan time.Time) close(c) return c }()).Once()` $DIR/core/services/blockhashstore/feeder_test.go: `close(c)` $DIR/core/services/blockhashstore/feeder_test.go: `mockTimer.On("After", expectedDuration).Return(func() <-chan time.Time { c := make(chan time.Time) return c }()).Run(func(args mock.Arguments) { cancel() }).Once()` $DIR/core/services/blockhashstore/feeder_test.go: `cancel()` $DIR/core/services/blockhashstore/feeder_test.go: `mockLogger.On("Infow", "Starting heartbeat blockhash using storeEarliest every 10m0s").Once()` $DIR/core/services/blockhashstore/feeder_test.go: `mockLogger.On("Infow", "storing heartbeat blockhash using storeEarliest", "heartbeatPeriodSeconds", expectedDuration.Seconds()).Once()` $DIR/core/services/blockhashstore/feeder_test.go: `feeder.StartHeartbeats(ctx, mockTimer)` $DIR/core/services/blockhashstore/feeder_test.go: `t.Run("bhs_heartbeat_sad_path_store_earliest_err", func(t *testing.T) { expectedDuration := 600 * time.Second expectedError := fmt.Errorf("insufficient gas") mockBHS := bhsmocks.NewBHS(t) mockLogger := loggermocks.NewLogger(t) feeder := NewFeeder( mockLogger, &TestCoordinator{}, // Not used for this test mockBHS, &mocklp.LogPoller{}, // Not used for this test 0, 25, // Not used for this test 100, // Not used for this test expectedDuration, func(ctx context.Context) (uint64, error) { return tests[0].latest, nil }) ctx, cancel := context.WithCancel(testutils.Context(t)) mockTimer := bhsmocks.NewTimer(t) mockBHS.On("StoreEarliest", ctx).Return(expectedError).Once() mockTimer.On("After", expectedDuration).Return(func() <-chan time.Time { c := make(chan time.Time) close(c) return c }()).Once() mockTimer.On("After", expectedDuration).Return(func() <-chan time.Time { c := make(chan time.Time) return c }()).Run(func(args mock.Arguments) { cancel() }).Once() mockLogger.On("Infow", "Starting heartbeat blockhash using storeEarliest every 10m0s").Once() mockLogger.On("Infow", "storing heartbeat blockhash using storeEarliest", "heartbeatPeriodSeconds", expectedDuration.Seconds()).Once() mockLogger.On("Infow", "failed to store heartbeat blockhash using storeEarliest", "heartbeatPeriodSeconds", expectedDuration.Seconds(), "err", expectedError).Once() require.Len(t, mockLogger.ExpectedCalls, 3) require.Len(t, mockTimer.ExpectedCalls, 2) defer mockTimer.AssertExpectations(t) defer mockBHS.AssertExpectations(t) defer mockLogger.AssertExpectations(t) feeder.StartHeartbeats(ctx, mockTimer) })` $DIR/core/services/blockhashstore/feeder_test.go: `mockBHS.On("StoreEarliest", ctx).Return(expectedError).Once()` $DIR/core/services/blockhashstore/feeder_test.go: `mockTimer.On("After", expectedDuration).Return(func() <-chan time.Time { c := make(chan time.Time) close(c) return c }()).Once()` $DIR/core/services/blockhashstore/feeder_test.go: `close(c)` $DIR/core/services/blockhashstore/feeder_test.go: `mockTimer.On("After", expectedDuration).Return(func() <-chan time.Time { c := make(chan time.Time) return c }()).Run(func(args mock.Arguments) { cancel() }).Once()` $DIR/core/services/blockhashstore/feeder_test.go: `cancel()` $DIR/core/services/blockhashstore/feeder_test.go: `mockLogger.On("Infow", "Starting heartbeat blockhash using storeEarliest every 10m0s").Once()` $DIR/core/services/blockhashstore/feeder_test.go: `mockLogger.On("Infow", "storing heartbeat blockhash using storeEarliest", "heartbeatPeriodSeconds", expectedDuration.Seconds()).Once()` $DIR/core/services/blockhashstore/feeder_test.go: `mockLogger.On("Infow", "failed to store heartbeat blockhash using storeEarliest", "heartbeatPeriodSeconds", expectedDuration.Seconds(), "err", expectedError).Once()` $DIR/core/services/blockhashstore/feeder_test.go: `feeder.StartHeartbeats(ctx, mockTimer)` $DIR/core/services/blockhashstore/feeder_test.go: `mockLogger.On("Infow", "Not starting heartbeat blockhash using storeEarliest").Once()` $DIR/core/services/blockhashstore/feeder_test.go: `feeder.StartHeartbeats(testutils.Context(t), mockTimer)` $DIR/core/services/blockhashstore/feeder_test.go: `t.Run(test.name, test.testFeeder)` $DIR/core/services/blockhashstore/feeder_test.go: `t.Run(test.name, test.testFeederWithLogPollerVRFv1)` $DIR/core/services/blockhashstore/feeder_test.go: `t.Run(test.name, test.testFeederWithLogPollerVRFv2)` $DIR/core/services/blockhashstore/feeder_test.go: `t.Run(test.name, test.testFeederWithLogPollerVRFv2Plus)` $DIR/core/services/blockhashstore/feeder_test.go: `bhs.Stored = nil` $DIR/core/services/blockhashstore/feeder_test.go: `.Run("bhs_heartbeat_happy_path", func(t *testing.T) { expectedDuration := 600 * time.Second mockBHS := bhsmocks.NewBHS(t) mockLogger := loggermocks.NewLogger(t) feeder := NewFeeder( mockLogger, &TestCoordinator{}, // Not used for this test mockBHS, &mocklp.LogPoller{}, // Not used for this test 0, 25, // Not used for this test 100, // Not used for this test expectedDuration, func(ctx context.Context) (uint64, error) { return tests[0].latest, nil }) ctx, cancel := context.WithCancel(testutils.Context(t)) mockTimer := bhsmocks.NewTimer(t) mockBHS.On("StoreEarliest", ctx).Return(nil).Once() mockTimer.On("After", expectedDuration).Return(func() <-chan time.Time { c := make(chan time.Time) close(c) return c }()).Once() mockTimer.On("After", expectedDuration).Return(func() <-chan time.Time { c := make(chan time.Time) return c }()).Run(func(args mock.Arguments) { cancel() }).Once() mockLogger.On("Infow", "Starting heartbeat blockhash using storeEarliest every 10m0s").Once() mockLogger.On("Infow", "storing heartbeat blockhash using storeEarliest", "heartbeatPeriodSeconds", expectedDuration.Seconds()).Once() require.Len(t, mockLogger.ExpectedCalls, 2) require.Len(t, mockTimer.ExpectedCalls, 2) defer mockTimer.AssertExpectations(t) defer mockBHS.AssertExpectations(t) defer mockLogger.AssertExpectations(t) feeder.StartHeartbeats(ctx, mockTimer) })` $DIR/core/services/blockhashstore/feeder_test.go: `.NewBHS(t)` $DIR/core/services/blockhashstore/feeder_test.go: `.NewLogger(t)` $DIR/core/services/blockhashstore/feeder_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/blockhashstore/feeder_test.go: `.Context(t)` $DIR/core/services/blockhashstore/feeder_test.go: `.NewTimer(t)` $DIR/core/services/blockhashstore/feeder_test.go: `.On("StoreEarliest", ctx)` $DIR/core/services/blockhashstore/feeder_test.go: `.Return(nil)` $DIR/core/services/blockhashstore/feeder_test.go: `.Once()` $DIR/core/services/blockhashstore/feeder_test.go: `.On("After", expectedDuration)` $DIR/core/services/blockhashstore/feeder_test.go: `.Return(func() <-chan time.Time { c := make(chan time.Time) close(c) return c }())` $DIR/core/services/blockhashstore/feeder_test.go: `.Once()` $DIR/core/services/blockhashstore/feeder_test.go: `.On("After", expectedDuration)` $DIR/core/services/blockhashstore/feeder_test.go: `.Return(func() <-chan time.Time { c := make(chan time.Time) return c }())` $DIR/core/services/blockhashstore/feeder_test.go: `.Run(func(args mock.Arguments) { cancel() })` $DIR/core/services/blockhashstore/feeder_test.go: `.Once()` $DIR/core/services/blockhashstore/feeder_test.go: `.On("Infow", "Starting heartbeat blockhash using storeEarliest every 10m0s")` $DIR/core/services/blockhashstore/feeder_test.go: `.Once()` $DIR/core/services/blockhashstore/feeder_test.go: `.On("Infow", "storing heartbeat blockhash using storeEarliest", "heartbeatPeriodSeconds", expectedDuration.Seconds())` $DIR/core/services/blockhashstore/feeder_test.go: `.Seconds()` $DIR/core/services/blockhashstore/feeder_test.go: `.Once()` $DIR/core/services/blockhashstore/feeder_test.go: `.AssertExpectations(t)` $DIR/core/services/blockhashstore/feeder_test.go: `.AssertExpectations(t)` $DIR/core/services/blockhashstore/feeder_test.go: `.AssertExpectations(t)` $DIR/core/services/blockhashstore/feeder_test.go: `.StartHeartbeats(ctx, mockTimer)` $DIR/core/services/blockhashstore/feeder_test.go: `.Run("bhs_heartbeat_sad_path_store_earliest_err", func(t *testing.T) { expectedDuration := 600 * time.Second expectedError := fmt.Errorf("insufficient gas") mockBHS := bhsmocks.NewBHS(t) mockLogger := loggermocks.NewLogger(t) feeder := NewFeeder( mockLogger, &TestCoordinator{}, // Not used for this test mockBHS, &mocklp.LogPoller{}, // Not used for this test 0, 25, // Not used for this test 100, // Not used for this test expectedDuration, func(ctx context.Context) (uint64, error) { return tests[0].latest, nil }) ctx, cancel := context.WithCancel(testutils.Context(t)) mockTimer := bhsmocks.NewTimer(t) mockBHS.On("StoreEarliest", ctx).Return(expectedError).Once() mockTimer.On("After", expectedDuration).Return(func() <-chan time.Time { c := make(chan time.Time) close(c) return c }()).Once() mockTimer.On("After", expectedDuration).Return(func() <-chan time.Time { c := make(chan time.Time) return c }()).Run(func(args mock.Arguments) { cancel() }).Once() mockLogger.On("Infow", "Starting heartbeat blockhash using storeEarliest every 10m0s").Once() mockLogger.On("Infow", "storing heartbeat blockhash using storeEarliest", "heartbeatPeriodSeconds", expectedDuration.Seconds()).Once() mockLogger.On("Infow", "failed to store heartbeat blockhash using storeEarliest", "heartbeatPeriodSeconds", expectedDuration.Seconds(), "err", expectedError).Once() require.Len(t, mockLogger.ExpectedCalls, 3) require.Len(t, mockTimer.ExpectedCalls, 2) defer mockTimer.AssertExpectations(t) defer mockBHS.AssertExpectations(t) defer mockLogger.AssertExpectations(t) feeder.StartHeartbeats(ctx, mockTimer) })` $DIR/core/services/blockhashstore/feeder_test.go: `.NewBHS(t)` $DIR/core/services/blockhashstore/feeder_test.go: `.NewLogger(t)` $DIR/core/services/blockhashstore/feeder_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/blockhashstore/feeder_test.go: `.Context(t)` $DIR/core/services/blockhashstore/feeder_test.go: `.NewTimer(t)` $DIR/core/services/blockhashstore/feeder_test.go: `.On("StoreEarliest", ctx)` $DIR/core/services/blockhashstore/feeder_test.go: `.Return(expectedError)` $DIR/core/services/blockhashstore/feeder_test.go: `.Once()` $DIR/core/services/blockhashstore/feeder_test.go: `.On("After", expectedDuration)` $DIR/core/services/blockhashstore/feeder_test.go: `.Return(func() <-chan time.Time { c := make(chan time.Time) close(c) return c }())` $DIR/core/services/blockhashstore/feeder_test.go: `.Once()` $DIR/core/services/blockhashstore/feeder_test.go: `.On("After", expectedDuration)` $DIR/core/services/blockhashstore/feeder_test.go: `.Return(func() <-chan time.Time { c := make(chan time.Time) return c }())` $DIR/core/services/blockhashstore/feeder_test.go: `.Run(func(args mock.Arguments) { cancel() })` $DIR/core/services/blockhashstore/feeder_test.go: `.Once()` $DIR/core/services/blockhashstore/feeder_test.go: `.On("Infow", "Starting heartbeat blockhash using storeEarliest every 10m0s")` $DIR/core/services/blockhashstore/feeder_test.go: `.Once()` $DIR/core/services/blockhashstore/feeder_test.go: `.On("Infow", "storing heartbeat blockhash using storeEarliest", "heartbeatPeriodSeconds", expectedDuration.Seconds())` $DIR/core/services/blockhashstore/feeder_test.go: `.Seconds()` $DIR/core/services/blockhashstore/feeder_test.go: `.Once()` $DIR/core/services/blockhashstore/feeder_test.go: `.On("Infow", "failed to store heartbeat blockhash using storeEarliest", "heartbeatPeriodSeconds", expectedDuration.Seconds(), "err", expectedError)` $DIR/core/services/blockhashstore/feeder_test.go: `.Seconds()` $DIR/core/services/blockhashstore/feeder_test.go: `.Once()` $DIR/core/services/blockhashstore/feeder_test.go: `.AssertExpectations(t)` $DIR/core/services/blockhashstore/feeder_test.go: `.AssertExpectations(t)` $DIR/core/services/blockhashstore/feeder_test.go: `.AssertExpectations(t)` $DIR/core/services/blockhashstore/feeder_test.go: `.StartHeartbeats(ctx, mockTimer)` $DIR/core/services/blockhashstore/feeder_test.go: `.NewBHS(t)` $DIR/core/services/blockhashstore/feeder_test.go: `.NewLogger(t)` $DIR/core/services/blockhashstore/feeder_test.go: `.NewTimer(t)` $DIR/core/services/blockhashstore/feeder_test.go: `.On("Infow", "Not starting heartbeat blockhash using storeEarliest")` $DIR/core/services/blockhashstore/feeder_test.go: `.Once()` $DIR/core/services/blockhashstore/feeder_test.go: `.AssertExpectations(t)` $DIR/core/services/blockhashstore/feeder_test.go: `.AssertExpectations(t)` $DIR/core/services/blockhashstore/feeder_test.go: `.AssertExpectations(t)` $DIR/core/services/blockhashstore/feeder_test.go: `.StartHeartbeats(testutils.Context(t), mockTimer)` $DIR/core/services/blockhashstore/feeder_test.go: `.Context(t)` $DIR/core/services/blockhashstore/feeder_test.go: `.Run(test.name, test.testFeeder)` $DIR/core/services/blockhashstore/feeder_test.go: `.Run(test.name, test.testFeederWithLogPollerVRFv1)` $DIR/core/services/blockhashstore/feeder_test.go: `.Run(test.name, test.testFeederWithLogPollerVRFv2)` $DIR/core/services/blockhashstore/feeder_test.go: `.Run(test.name, test.testFeederWithLogPollerVRFv2Plus)` $DIR/core/services/blockhashstore/feeder_test.go: `.TestLogger(t)` $DIR/core/services/blockhashstore/validate_test.go: `t.Run(test.name, func(t *testing.T) { s, err := ValidatedSpec(test.toml) test.assertion(t, s, err) })` $DIR/core/services/blockhashstore/validate_test.go: `test.assertion(t, s, err)` $DIR/core/services/blockhashstore/validate_test.go: `.EIP55Address("0x1F72B4A5DCf7CC6d2E38423bF2f4BFA7db97d139")` $DIR/core/services/blockhashstore/validate_test.go: `.EIP55Address("0x2be990eE17832b59E0086534c5ea2459Aa75E38F")` $DIR/core/services/blockhashstore/validate_test.go: `.Run(test.name, func(t *testing.T) { s, err := ValidatedSpec(test.toml) test.assertion(t, s, err) })` $DIR/core/services/blockhashstore/validate_test.go: `.assertion(t, s, err)` $DIR/core/services/blockheaderfeeder/block_header_feeder_test.go: `t.Run(test.name, test.testFeeder)` $DIR/core/services/blockheaderfeeder/block_header_feeder_test.go: `ks.On("GetRoundRobinAddress", mock.Anything, testutils.FixtureChainID, mock.Anything).Maybe().Return(common.HexToAddress(fromAddress), nil)` $DIR/core/services/blockheaderfeeder/block_header_feeder_test.go: `batchBHS.Stored = nil` $DIR/core/services/blockheaderfeeder/block_header_feeder_test.go: `feeder.coordinator = &blockhashstore.TestCoordinator{ RequestEvents: []blockhashstore.Event{ {Block: 74, ID: "request1"}, {Block: 75, ID: "request2"}, }, }` $DIR/core/services/blockheaderfeeder/block_header_feeder_test.go: `batchBHS.Stored = nil` $DIR/core/services/blockheaderfeeder/block_header_feeder_test.go: `batchBHS.Stored = []uint64{175}` $DIR/core/services/blockheaderfeeder/block_header_feeder_test.go: `feeder.coordinator = &blockhashstore.TestCoordinator{RequestEvents: []blockhashstore.Event{{Block: 174, ID: "request"}}}` $DIR/core/services/blockheaderfeeder/block_header_feeder_test.go: `feeder.coordinator = &blockhashstore.TestCoordinator{RequestEvents: []blockhashstore.Event{{Block: 74, ID: "request"}}}` $DIR/core/services/blockheaderfeeder/block_header_feeder_test.go: `batchBHS.Stored = []uint64{75}` $DIR/core/services/blockheaderfeeder/block_header_feeder_test.go: `.New("internal failure")` $DIR/core/services/blockheaderfeeder/block_header_feeder_test.go: `.New("invalid header")` $DIR/core/services/blockheaderfeeder/block_header_feeder_test.go: `.Run(test.name, test.testFeeder)` $DIR/core/services/blockheaderfeeder/block_header_feeder_test.go: `.EIP55Address(fromAddress)` $DIR/core/services/blockheaderfeeder/block_header_feeder_test.go: `.NewEth(t)` $DIR/core/services/blockheaderfeeder/block_header_feeder_test.go: `.On("GetRoundRobinAddress", mock.Anything, testutils.FixtureChainID, mock.Anything)` $DIR/core/services/blockheaderfeeder/block_header_feeder_test.go: `.Maybe()` $DIR/core/services/blockheaderfeeder/block_header_feeder_test.go: `.Return(common.HexToAddress(fromAddress), nil)` $DIR/core/services/blockheaderfeeder/block_header_feeder_test.go: `.HexToAddress(fromAddress)` $DIR/core/services/blockheaderfeeder/block_header_feeder_test.go: `.TestLogger(t)` $DIR/core/services/blockheaderfeeder/validate_test.go: `t.Run(test.name, func(t *testing.T) { s, err := ValidatedSpec(test.toml) test.assertion(t, s, err) })` $DIR/core/services/blockheaderfeeder/validate_test.go: `test.assertion(t, s, err)` $DIR/core/services/blockheaderfeeder/validate_test.go: `.EIP55Address("0x1F72B4A5DCf7CC6d2E38423bF2f4BFA7db97d139")` $DIR/core/services/blockheaderfeeder/validate_test.go: `.EIP55Address("0x2be990eE17832b59E0086534c5ea2459Aa75E38F")` $DIR/core/services/blockheaderfeeder/validate_test.go: `.EIP55Address("0x92B5e28Ac583812874e4271380c7d070C5FB6E6b")` $DIR/core/services/blockheaderfeeder/validate_test.go: `.Run(test.name, func(t *testing.T) { s, err := ValidatedSpec(test.toml) test.assertion(t, s, err) })` $DIR/core/services/blockheaderfeeder/validate_test.go: `.assertion(t, s, err)` $DIR/core/services/ccip/orm_test.go: `updates[selector] = generateGasPriceUpdates(selector, numUpdatesPerSourceSelector)` $DIR/core/services/ccip/orm_test.go: `err = orm.InsertGasPricesForDestChain(ctx, destSelector, int32(i), updatesPerSelector[lastIndex:])` $DIR/core/services/ccip/orm_test.go: `expectedPrices[selector] = updatesPerSelector[lastIndex]` $DIR/core/services/ccip/orm_test.go: `combinedUpdates = append(combinedUpdates, updatesPerSelector[0])` $DIR/core/services/ccip/orm_test.go: `expectedPrices[selector] = updatesPerSelector[0]` $DIR/core/services/ccip/orm_test.go: `err = orm.InsertGasPricesForDestChain(ctx, destSelector, 1, combinedUpdates)` $DIR/core/services/ccip/orm_test.go: `prices, err = orm.GetGasPricesByDestChain(ctx, destSelector)` $DIR/core/services/ccip/orm_test.go: `updates[selector] = generateGasPriceUpdates(selector, numUpdatesPerSourceSelector)` $DIR/core/services/ccip/orm_test.go: `time.Sleep(time.Duration(sleepSec) * time.Second)` $DIR/core/services/ccip/orm_test.go: `err = orm.ClearGasPricesByDestChain(ctx, destSelector, 0)` $DIR/core/services/ccip/orm_test.go: `updates[addr] = generateTokenPriceUpdates(addr, numUpdatesPerAddress)` $DIR/core/services/ccip/orm_test.go: `err = orm.InsertTokenPricesForDestChain(ctx, destSelector, int32(i), updatesPerAddr[lastIndex:])` $DIR/core/services/ccip/orm_test.go: `expectedPrices[addr] = updatesPerAddr[lastIndex]` $DIR/core/services/ccip/orm_test.go: `combinedUpdates = append(combinedUpdates, updatesPerAddr[0])` $DIR/core/services/ccip/orm_test.go: `expectedPrices[addr] = updatesPerAddr[0]` $DIR/core/services/ccip/orm_test.go: `err = orm.InsertTokenPricesForDestChain(ctx, destSelector, 1, combinedUpdates)` $DIR/core/services/ccip/orm_test.go: `prices, err = orm.GetTokenPricesByDestChain(ctx, destSelector)` $DIR/core/services/ccip/orm_test.go: `updates[addr] = generateTokenPriceUpdates(addr, numUpdatesPerAddress)` $DIR/core/services/ccip/orm_test.go: `time.Sleep(time.Duration(sleepSec) * time.Second)` $DIR/core/services/ccip/orm_test.go: `err = orm.ClearTokenPricesByDestChain(ctx, destSelector, 0)` $DIR/core/services/ccip/orm_test.go: `.Context(t)` $DIR/core/services/ccip/orm_test.go: `.GetGasPricesByDestChain(ctx, 1)` $DIR/core/services/ccip/orm_test.go: `.Context(t)` $DIR/core/services/ccip/orm_test.go: `.GetTokenPricesByDestChain(ctx, 1)` $DIR/core/services/ccip/orm_test.go: `.Context(t)` $DIR/core/services/ccip/orm_test.go: `.InsertGasPricesForDestChain(ctx, destSelector, int32(i), updatesPerSelector[:lastIndex])` $DIR/core/services/ccip/orm_test.go: `.InsertGasPricesForDestChain(ctx, destSelector, int32(i), updatesPerSelector[lastIndex:])` $DIR/core/services/ccip/orm_test.go: `.GetGasPricesByDestChain(ctx, destSelector)` $DIR/core/services/ccip/orm_test.go: `.InsertGasPricesForDestChain(ctx, destSelector, 1, combinedUpdates)` $DIR/core/services/ccip/orm_test.go: `.GetGasPricesByDestChain(ctx, destSelector)` $DIR/core/services/ccip/orm_test.go: `.Context(t)` $DIR/core/services/ccip/orm_test.go: `.InsertGasPricesForDestChain(ctx, destSelector, 1, updatesPerSelector)` $DIR/core/services/ccip/orm_test.go: `.Sleep(time.Duration(sleepSec) * time.Second)` $DIR/core/services/ccip/orm_test.go: `.Duration(sleepSec)` $DIR/core/services/ccip/orm_test.go: `.InsertGasPricesForDestChain(ctx, destSelector, 1, updatesPerSelector)` $DIR/core/services/ccip/orm_test.go: `.ClearGasPricesByDestChain(ctx, destSelector, sleepSec)` $DIR/core/services/ccip/orm_test.go: `.ClearGasPricesByDestChain(ctx, destSelector, 0)` $DIR/core/services/ccip/orm_test.go: `.Context(t)` $DIR/core/services/ccip/orm_test.go: `.InsertTokenPricesForDestChain(ctx, destSelector, int32(i), updatesPerAddr[:lastIndex])` $DIR/core/services/ccip/orm_test.go: `.InsertTokenPricesForDestChain(ctx, destSelector, int32(i), updatesPerAddr[lastIndex:])` $DIR/core/services/ccip/orm_test.go: `.GetTokenPricesByDestChain(ctx, destSelector)` $DIR/core/services/ccip/orm_test.go: `.InsertTokenPricesForDestChain(ctx, destSelector, 1, combinedUpdates)` $DIR/core/services/ccip/orm_test.go: `.GetTokenPricesByDestChain(ctx, destSelector)` $DIR/core/services/ccip/orm_test.go: `.Context(t)` $DIR/core/services/ccip/orm_test.go: `.InsertTokenPricesForDestChain(ctx, destSelector, 1, updatesPerAddr)` $DIR/core/services/ccip/orm_test.go: `.Sleep(time.Duration(sleepSec) * time.Second)` $DIR/core/services/ccip/orm_test.go: `.Duration(sleepSec)` $DIR/core/services/ccip/orm_test.go: `.InsertTokenPricesForDestChain(ctx, destSelector, 1, updatesPerAddr)` $DIR/core/services/ccip/orm_test.go: `.ClearTokenPricesByDestChain(ctx, destSelector, sleepSec)` $DIR/core/services/ccip/orm_test.go: `.ClearTokenPricesByDestChain(ctx, destSelector, 0)` $DIR/core/services/chainlink/config_audit_logger_test.go: `.New()` $DIR/core/services/chainlink/config_audit_logger_test.go: `.AuditLogger()` $DIR/core/services/chainlink/config_audit_logger_test.go: `.ForwardToUrl()` $DIR/core/services/chainlink/config_audit_logger_test.go: `.Headers()` $DIR/core/services/chainlink/config_auto_pprof_test.go: `.New()` $DIR/core/services/chainlink/config_auto_pprof_test.go: `.AutoPprof()` $DIR/core/services/chainlink/config_auto_pprof_test.go: `.GoroutineThreshold()` $DIR/core/services/chainlink/config_capabilities_test.go: `.New()` $DIR/core/services/chainlink/config_capabilities_test.go: `.Capabilities()` $DIR/core/services/chainlink/config_capabilities_test.go: `.Peering()` $DIR/core/services/chainlink/config_capabilities_test.go: `.V2()` $DIR/core/services/chainlink/config_capabilities_test.go: `.ListenAddresses()` $DIR/core/services/chainlink/config_database_test.go: `.New()` $DIR/core/services/chainlink/config_database_test.go: `.Database()` $DIR/core/services/chainlink/config_database_test.go: `.Backup()` $DIR/core/services/chainlink/config_database_test.go: `.Database()` $DIR/core/services/chainlink/config_database_test.go: `.URL()` $DIR/core/services/chainlink/config_database_test.go: `.Lock()` $DIR/core/services/chainlink/config_database_test.go: `.Listener()` $DIR/core/services/chainlink/config_database_test.go: `.FallbackPollInterval()` $DIR/core/services/chainlink/config_feature_test.go: `.New()` $DIR/core/services/chainlink/config_feature_test.go: `.Feature()` $DIR/core/services/chainlink/config_feature_test.go: `.UICSAKeys()` $DIR/core/services/chainlink/config_flux_monitor_test.go: `.New()` $DIR/core/services/chainlink/config_flux_monitor_test.go: `.FluxMonitor()` $DIR/core/services/chainlink/config_flux_monitor_test.go: `.SimulateTransactions()` $DIR/core/services/chainlink/config_general_dev_test.go: `t.Run("all insecure configs are false by default", func(t *testing.T) { config, err := GeneralConfigOpts{}.New(logger.TestLogger(t)) require.NoError(t, err) assert.False(t, config.Insecure().DevWebServer()) assert.False(t, config.Insecure().DisableRateLimiting()) assert.False(t, config.Insecure().InfiniteDepthQueries()) assert.False(t, config.Insecure().OCRDevelopmentMode()) })` $DIR/core/services/chainlink/config_general_dev_test.go: `t.Run("insecure config ignore override on non-dev builds", func(t *testing.T) { config, err := GeneralConfigOpts{ OverrideFn: func(c *Config, s *Secrets) { *c.Insecure.DevWebServer = true *c.Insecure.DisableRateLimiting = true *c.Insecure.InfiniteDepthQueries = true *c.Insecure.OCRDevelopmentMode = true }}.New(logger.TestLogger(t)) require.NoError(t, err) assert.True(t, config.Insecure().DevWebServer()) assert.True(t, config.Insecure().DisableRateLimiting()) assert.True(t, config.Insecure().InfiniteDepthQueries()) assert.True(t, config.OCRDevelopmentMode()) })` $DIR/core/services/chainlink/config_general_dev_test.go: `*c.Insecure.DevWebServer = true` $DIR/core/services/chainlink/config_general_dev_test.go: `*c.Insecure.DisableRateLimiting = true` $DIR/core/services/chainlink/config_general_dev_test.go: `*c.Insecure.InfiniteDepthQueries = true` $DIR/core/services/chainlink/config_general_dev_test.go: `*c.Insecure.OCRDevelopmentMode = true` $DIR/core/services/chainlink/config_general_dev_test.go: `err = cfg.c.Validate()` $DIR/core/services/chainlink/config_general_dev_test.go: `.Run("all insecure configs are false by default", func(t *testing.T) { config, err := GeneralConfigOpts{}.New(logger.TestLogger(t)) require.NoError(t, err) assert.False(t, config.Insecure().DevWebServer()) assert.False(t, config.Insecure().DisableRateLimiting()) assert.False(t, config.Insecure().InfiniteDepthQueries()) assert.False(t, config.Insecure().OCRDevelopmentMode()) })` $DIR/core/services/chainlink/config_general_dev_test.go: `.New(logger.TestLogger(t))` $DIR/core/services/chainlink/config_general_dev_test.go: `.TestLogger(t)` $DIR/core/services/chainlink/config_general_dev_test.go: `.Run("insecure config ignore override on non-dev builds", func(t *testing.T) { config, err := GeneralConfigOpts{ OverrideFn: func(c *Config, s *Secrets) { *c.Insecure.DevWebServer = true *c.Insecure.DisableRateLimiting = true *c.Insecure.InfiniteDepthQueries = true *c.Insecure.OCRDevelopmentMode = true }}.New(logger.TestLogger(t)) require.NoError(t, err) assert.True(t, config.Insecure().DevWebServer()) assert.True(t, config.Insecure().DisableRateLimiting()) assert.True(t, config.Insecure().InfiniteDepthQueries()) assert.True(t, config.OCRDevelopmentMode()) })` $DIR/core/services/chainlink/config_general_dev_test.go: `.New(logger.TestLogger(t))` $DIR/core/services/chainlink/config_general_dev_test.go: `.TestLogger(t)` $DIR/core/services/chainlink/config_general_dev_test.go: `.ParseConfig(` [insecure] DevWebServer = true `)` $DIR/core/services/chainlink/config_general_dev_test.go: `.init()` $DIR/core/services/chainlink/config_general_dev_test.go: `.c.Validate()` $DIR/core/services/chainlink/config_general_test.go: `t.Run("all insecure configs are false by default", func(t *testing.T) { config, err := GeneralConfigOpts{}.New() require.NoError(t, err) assert.False(t, config.Insecure().DevWebServer()) assert.False(t, config.Insecure().DisableRateLimiting()) assert.False(t, config.Insecure().InfiniteDepthQueries()) assert.False(t, config.Insecure().OCRDevelopmentMode()) })` $DIR/core/services/chainlink/config_general_test.go: `t.Run("insecure config ignore override on non-dev builds", func(t *testing.T) { config, err := GeneralConfigOpts{ OverrideFn: func(c *Config, s *Secrets) { *c.Insecure.DevWebServer = true *c.Insecure.DisableRateLimiting = true *c.Insecure.InfiniteDepthQueries = true *c.AuditLogger.Enabled = true }}.New() require.NoError(t, err) // Just asserting that override logic work on a safe config assert.True(t, config.AuditLogger().Enabled()) assert.False(t, config.Insecure().DevWebServer()) assert.False(t, config.Insecure().DisableRateLimiting()) assert.False(t, config.Insecure().InfiniteDepthQueries()) })` $DIR/core/services/chainlink/config_general_test.go: `*c.Insecure.DevWebServer = true` $DIR/core/services/chainlink/config_general_test.go: `*c.Insecure.DisableRateLimiting = true` $DIR/core/services/chainlink/config_general_test.go: `*c.Insecure.InfiniteDepthQueries = true` $DIR/core/services/chainlink/config_general_test.go: `*c.AuditLogger.Enabled = true` $DIR/core/services/chainlink/config_general_test.go: `err = cfg.Validate()` $DIR/core/services/chainlink/config_general_test.go: `t.Setenv(string(env.Config), "")` $DIR/core/services/chainlink/config_general_test.go: `t.Run("unset db url", func(t *testing.T) { t.Setenv(string(env.DatabaseURL), "") config, err := GeneralConfigOpts{}.New() require.NoError(t, err) err = config.ValidateDB() require.Error(t, err) require.ErrorIs(t, err, ErrInvalidSecrets) })` $DIR/core/services/chainlink/config_general_test.go: `t.Setenv(string(env.DatabaseURL), "")` $DIR/core/services/chainlink/config_general_test.go: `err = config.ValidateDB()` $DIR/core/services/chainlink/config_general_test.go: `t.Run("dev url", func(t *testing.T) { t.Setenv(string(env.DatabaseURL), "postgres://postgres:admin@localhost:5432/chainlink_dev_test?sslmode=disable") config, err := GeneralConfigOpts{}.New() require.NoError(t, err) err = config.ValidateDB() require.NoError(t, err) })` $DIR/core/services/chainlink/config_general_test.go: `t.Setenv(string(env.DatabaseURL), "postgres://postgres:admin@localhost:5432/chainlink_dev_test?sslmode=disable")` $DIR/core/services/chainlink/config_general_test.go: `err = config.ValidateDB()` $DIR/core/services/chainlink/config_general_test.go: `t.Setenv(string(env.DatabaseURL), "postgres://postgres:pwdTooShort@localhost:5432/chainlink_dev_prod?sslmode=disable")` $DIR/core/services/chainlink/config_general_test.go: `t.Setenv(string(env.DatabaseAllowSimplePasswords), "false")` $DIR/core/services/chainlink/config_general_test.go: `err = config.ValidateDB()` $DIR/core/services/chainlink/config_general_test.go: `config.SetLogSQL(true)` $DIR/core/services/chainlink/config_general_test.go: `config.SetLogSQL(false)` $DIR/core/services/chainlink/config_general_test.go: `err = opts.Setup(configFiles, secretsFiles)` $DIR/core/services/chainlink/config_general_test.go: `err = opts.parse()` $DIR/core/services/chainlink/config_general_test.go: `err = assertDeepEqualityMercurySecrets(*merge(mercurySecrets_a.Mercury, mercurySecrets_b.Mercury), opts.Secrets.Mercury)` $DIR/core/services/chainlink/config_general_test.go: `.New()` $DIR/core/services/chainlink/config_general_test.go: `.WebServer()` $DIR/core/services/chainlink/config_general_test.go: `.SessionTimeout()` $DIR/core/services/chainlink/config_general_test.go: `.Duration()` $DIR/core/services/chainlink/config_general_test.go: `.Run("all insecure configs are false by default", func(t *testing.T) { config, err := GeneralConfigOpts{}.New() require.NoError(t, err) assert.False(t, config.Insecure().DevWebServer()) assert.False(t, config.Insecure().DisableRateLimiting()) assert.False(t, config.Insecure().InfiniteDepthQueries()) assert.False(t, config.Insecure().OCRDevelopmentMode()) })` $DIR/core/services/chainlink/config_general_test.go: `.New()` $DIR/core/services/chainlink/config_general_test.go: `.Run("insecure config ignore override on non-dev builds", func(t *testing.T) { config, err := GeneralConfigOpts{ OverrideFn: func(c *Config, s *Secrets) { *c.Insecure.DevWebServer = true *c.Insecure.DisableRateLimiting = true *c.Insecure.InfiniteDepthQueries = true *c.AuditLogger.Enabled = true }}.New() require.NoError(t, err) // Just asserting that override logic work on a safe config assert.True(t, config.AuditLogger().Enabled()) assert.False(t, config.Insecure().DevWebServer()) assert.False(t, config.Insecure().DisableRateLimiting()) assert.False(t, config.Insecure().InfiniteDepthQueries()) })` $DIR/core/services/chainlink/config_general_test.go: `.New()` $DIR/core/services/chainlink/config_general_test.go: `.New()` $DIR/core/services/chainlink/config_general_test.go: `.Validate()` $DIR/core/services/chainlink/config_general_test.go: `.Setenv(string(env.Config), "")` $DIR/core/services/chainlink/config_general_test.go: `.Run("unset db url", func(t *testing.T) { t.Setenv(string(env.DatabaseURL), "") config, err := GeneralConfigOpts{}.New() require.NoError(t, err) err = config.ValidateDB() require.Error(t, err) require.ErrorIs(t, err, ErrInvalidSecrets) })` $DIR/core/services/chainlink/config_general_test.go: `.Setenv(string(env.DatabaseURL), "")` $DIR/core/services/chainlink/config_general_test.go: `.New()` $DIR/core/services/chainlink/config_general_test.go: `.ValidateDB()` $DIR/core/services/chainlink/config_general_test.go: `.Run("dev url", func(t *testing.T) { t.Setenv(string(env.DatabaseURL), "postgres://postgres:admin@localhost:5432/chainlink_dev_test?sslmode=disable") config, err := GeneralConfigOpts{}.New() require.NoError(t, err) err = config.ValidateDB() require.NoError(t, err) })` $DIR/core/services/chainlink/config_general_test.go: `.Setenv(string(env.DatabaseURL), "postgres://postgres:admin@localhost:5432/chainlink_dev_test?sslmode=disable")` $DIR/core/services/chainlink/config_general_test.go: `.New()` $DIR/core/services/chainlink/config_general_test.go: `.ValidateDB()` $DIR/core/services/chainlink/config_general_test.go: `.Setenv(string(env.DatabaseURL), "postgres://postgres:pwdTooShort@localhost:5432/chainlink_dev_prod?sslmode=disable")` $DIR/core/services/chainlink/config_general_test.go: `.Setenv(string(env.DatabaseAllowSimplePasswords), "false")` $DIR/core/services/chainlink/config_general_test.go: `.New()` $DIR/core/services/chainlink/config_general_test.go: `.ValidateDB()` $DIR/core/services/chainlink/config_general_test.go: `.New()` $DIR/core/services/chainlink/config_general_test.go: `.SetLogSQL(true)` $DIR/core/services/chainlink/config_general_test.go: `.SetLogSQL(false)` $DIR/core/services/chainlink/config_general_test.go: `.Database()` $DIR/core/services/chainlink/config_general_test.go: `.LogSQL()` $DIR/core/services/chainlink/config_general_test.go: `.Setup(configFiles, secretsFiles)` $DIR/core/services/chainlink/config_general_test.go: `.parse()` $DIR/core/services/chainlink/config_insecure_test.go: `.New()` $DIR/core/services/chainlink/config_insecure_test.go: `.Insecure()` $DIR/core/services/chainlink/config_insecure_test.go: `.InfiniteDepthQueries()` $DIR/core/services/chainlink/config_job_pipeline_test.go: `.New()` $DIR/core/services/chainlink/config_job_pipeline_test.go: `.JobPipeline()` $DIR/core/services/chainlink/config_job_pipeline_test.go: `.NewDuration(1 * time.Minute)` $DIR/core/services/chainlink/config_job_pipeline_test.go: `.ExternalInitiatorsEnabled()` $DIR/core/services/chainlink/config_keeper_test.go: `.New()` $DIR/core/services/chainlink/config_keeper_test.go: `.Keeper()` $DIR/core/services/chainlink/config_keeper_test.go: `.Registry()` $DIR/core/services/chainlink/config_keeper_test.go: `.SyncUpkeepQueueSize()` $DIR/core/services/chainlink/config_log_test.go: `.New()` $DIR/core/services/chainlink/config_log_test.go: `.File()` $DIR/core/services/chainlink/config_log_test.go: `.Level(3)` $DIR/core/services/chainlink/config_log_test.go: `.Level()` $DIR/core/services/chainlink/config_mercury_test.go: `.New()` $DIR/core/services/chainlink/config_mercury_test.go: `.Mercury()` $DIR/core/services/chainlink/config_mercury_test.go: `.Credentials("cred2")` $DIR/core/services/chainlink/config_mercury_test.go: `.TLS()` $DIR/core/services/chainlink/config_mercury_test.go: `.CertFile()` $DIR/core/services/chainlink/config_ocr2_test.go: `.New()` $DIR/core/services/chainlink/config_ocr2_test.go: `.OCR2()` $DIR/core/services/chainlink/config_ocr2_test.go: `.ParseDuration("1m0s")` $DIR/core/services/chainlink/config_ocr2_test.go: `.ParseDuration("3s")` $DIR/core/services/chainlink/config_ocr2_test.go: `.ParseDuration("8s")` $DIR/core/services/chainlink/config_ocr2_test.go: `.ParseDuration("1h0m0s")` $DIR/core/services/chainlink/config_ocr2_test.go: `.ParseDuration("1m0s")` $DIR/core/services/chainlink/config_ocr2_test.go: `.KeyBundleID()` $DIR/core/services/chainlink/config_ocr_test.go: `.New()` $DIR/core/services/chainlink/config_ocr_test.go: `.OCR()` $DIR/core/services/chainlink/config_ocr_test.go: `.ParseDuration("11s")` $DIR/core/services/chainlink/config_ocr_test.go: `.ParseDuration("3s")` $DIR/core/services/chainlink/config_ocr_test.go: `.ParseDuration("1h0m0s")` $DIR/core/services/chainlink/config_ocr_test.go: `.ParseDuration("1m0s")` $DIR/core/services/chainlink/config_ocr_test.go: `.KeyBundleID()` $DIR/core/services/chainlink/config_ocr_test.go: `.TransmitterAddress()` $DIR/core/services/chainlink/config_ocr_test.go: `.String()` $DIR/core/services/chainlink/config_p2p_test.go: `.New()` $DIR/core/services/chainlink/config_p2p_test.go: `.P2P()` $DIR/core/services/chainlink/config_p2p_test.go: `.V2()` $DIR/core/services/chainlink/config_p2p_test.go: `.ListenAddresses()` $DIR/core/services/chainlink/config_password_test.go: `.New()` $DIR/core/services/chainlink/config_password_test.go: `.Password()` $DIR/core/services/chainlink/config_password_test.go: `.Keystore()` $DIR/core/services/chainlink/config_prometheus_test.go: `.New()` $DIR/core/services/chainlink/config_prometheus_test.go: `.Prometheus()` $DIR/core/services/chainlink/config_prometheus_test.go: `.AuthToken()` $DIR/core/services/chainlink/config_pyroscope_test.go: `.New()` $DIR/core/services/chainlink/config_pyroscope_test.go: `.Pyroscope()` $DIR/core/services/chainlink/config_pyroscope_test.go: `.Environment()` $DIR/core/services/chainlink/config_telemetry_ingress_test.go: `.New()` $DIR/core/services/chainlink/config_telemetry_ingress_test.go: `.TelemetryIngress()` $DIR/core/services/chainlink/config_telemetry_ingress_test.go: `.TelemetryIngress()` $DIR/core/services/chainlink/config_telemetry_ingress_test.go: `.Endpoints()` $DIR/core/services/chainlink/config_telemetry_ingress_test.go: `.ServerPubKey()` $DIR/core/services/chainlink/config_test.go: `full.AuditLogger = toml.AuditLogger{ Enabled: ptr(true), ForwardToUrl: mustURL("http://localhost:9898"), Headers: ptr(serviceHeaders), JsonWrapperKey: ptr("event"), }` $DIR/core/services/chainlink/config_test.go: `full.Feature = toml.Feature{ FeedsManager: ptr(true), LogPoller: ptr(true), UICSAKeys: ptr(true), }` $DIR/core/services/chainlink/config_test.go: `full.Database = toml.Database{ DefaultIdleInTxSessionTimeout: commoncfg.MustNewDuration(time.Minute), DefaultLockTimeout: commoncfg.MustNewDuration(time.Hour), DefaultQueryTimeout: commoncfg.MustNewDuration(time.Second), LogQueries: ptr(true), MigrateOnStartup: ptr(true), MaxIdleConns: ptr[int64](7), MaxOpenConns: ptr[int64](13), Listener: toml.DatabaseListener{ MaxReconnectDuration: commoncfg.MustNewDuration(time.Minute), MinReconnectInterval: commoncfg.MustNewDuration(5 * time.Minute), FallbackPollInterval: commoncfg.MustNewDuration(2 * time.Minute), }, Lock: toml.DatabaseLock{ Enabled: ptr(false), LeaseDuration: &minute, LeaseRefreshInterval: &second, }, Backup: toml.DatabaseBackup{ Dir: ptr("test/backup/dir"), Frequency: &hour, Mode: &legacy.DatabaseBackupModeFull, OnVersionUpgrade: ptr(true), }, }` $DIR/core/services/chainlink/config_test.go: `full.TelemetryIngress = toml.TelemetryIngress{ UniConn: ptr(true), Logging: ptr(true), BufferSize: ptr[uint16](1234), MaxBatchSize: ptr[uint16](4321), SendInterval: commoncfg.MustNewDuration(time.Minute), SendTimeout: commoncfg.MustNewDuration(5 * time.Second), UseBatchSend: ptr(true), Endpoints: []toml.TelemetryIngressEndpoint{{ Network: ptr("EVM"), ChainID: ptr("1"), ServerPubKey: ptr("test-pub-key"), URL: mustURL("prom.test")}, }, }` $DIR/core/services/chainlink/config_test.go: `full.Log = toml.Log{ Level: ptr(toml.LogLevel(zapcore.DPanicLevel)), JSONConsole: ptr(true), UnixTS: ptr(true), File: toml.LogFile{ Dir: ptr("log/file/dir"), MaxSize: ptr[utils.FileSize](100 * utils.GB), MaxAgeDays: ptr[int64](17), MaxBackups: ptr[int64](9), }, }` $DIR/core/services/chainlink/config_test.go: `full.WebServer = toml.WebServer{ AuthenticationMethod: ptr("local"), AllowOrigins: ptr("*"), BridgeResponseURL: mustURL("https://bridge.response"), BridgeCacheTTL: commoncfg.MustNewDuration(10 * time.Second), HTTPWriteTimeout: commoncfg.MustNewDuration(time.Minute), HTTPPort: ptr[uint16](56), SecureCookies: ptr(true), SessionTimeout: commoncfg.MustNewDuration(time.Hour), SessionReaperExpiration: commoncfg.MustNewDuration(7 * 24 * time.Hour), HTTPMaxSize: ptr(utils.FileSize(uint64(32770))), StartTimeout: commoncfg.MustNewDuration(15 * time.Second), ListenIP: mustIP("192.158.1.37"), MFA: toml.WebServerMFA{ RPID: ptr("test-rpid"), RPOrigin: ptr("test-rp-origin"), }, LDAP: toml.WebServerLDAP{ ServerTLS: ptr(true), SessionTimeout: commoncfg.MustNewDuration(15 * time.Minute), QueryTimeout: commoncfg.MustNewDuration(2 * time.Minute), BaseUserAttr: ptr("uid"), BaseDN: ptr("dc=custom,dc=example,dc=com"), UsersDN: ptr("ou=users"), GroupsDN: ptr("ou=groups"), ActiveAttribute: ptr("organizationalStatus"), ActiveAttributeAllowedValue: ptr("ACTIVE"), AdminUserGroupCN: ptr("NodeAdmins"), EditUserGroupCN: ptr("NodeEditors"), RunUserGroupCN: ptr("NodeRunners"), ReadUserGroupCN: ptr("NodeReadOnly"), UserApiTokenEnabled: ptr(false), UserAPITokenDuration: commoncfg.MustNewDuration(240 * time.Hour), UpstreamSyncInterval: commoncfg.MustNewDuration(0 * time.Second), UpstreamSyncRateLimit: commoncfg.MustNewDuration(2 * time.Minute), }, RateLimit: toml.WebServerRateLimit{ Authenticated: ptr[int64](42), AuthenticatedPeriod: commoncfg.MustNewDuration(time.Second), Unauthenticated: ptr[int64](7), UnauthenticatedPeriod: commoncfg.MustNewDuration(time.Minute), }, TLS: toml.WebServerTLS{ CertPath: ptr("tls/cert/path"), Host: ptr("tls-host"), KeyPath: ptr("tls/key/path"), HTTPSPort: ptr[uint16](6789), ForceRedirect: ptr(true), ListenIP: mustIP("192.158.1.38"), }, }` $DIR/core/services/chainlink/config_test.go: `full.JobPipeline = toml.JobPipeline{ ExternalInitiatorsEnabled: ptr(true), MaxRunDuration: commoncfg.MustNewDuration(time.Hour), MaxSuccessfulRuns: ptr[uint64](123456), ReaperInterval: commoncfg.MustNewDuration(4 * time.Hour), ReaperThreshold: commoncfg.MustNewDuration(7 * 24 * time.Hour), ResultWriteQueueDepth: ptr[uint32](10), VerboseLogging: ptr(false), HTTPRequest: toml.JobPipelineHTTPRequest{ MaxSize: ptr[utils.FileSize](100 * utils.MB), DefaultTimeout: commoncfg.MustNewDuration(time.Minute), }, }` $DIR/core/services/chainlink/config_test.go: `full.FluxMonitor = toml.FluxMonitor{ DefaultTransactionQueueDepth: ptr[uint32](100), SimulateTransactions: ptr(true), }` $DIR/core/services/chainlink/config_test.go: `full.OCR2 = toml.OCR2{ Enabled: ptr(true), ContractConfirmations: ptr[uint32](11), BlockchainTimeout: commoncfg.MustNewDuration(3 * time.Second), ContractPollInterval: commoncfg.MustNewDuration(time.Hour), ContractSubscribeInterval: commoncfg.MustNewDuration(time.Minute), ContractTransmitterTransmitTimeout: commoncfg.MustNewDuration(time.Minute), DatabaseTimeout: commoncfg.MustNewDuration(8 * time.Second), KeyBundleID: ptr(models.MustSha256HashFromHex("7a5f66bbe6594259325bf2b4f5b1a9c9")), CaptureEATelemetry: ptr(false), CaptureAutomationCustomTelemetry: ptr(true), DefaultTransactionQueueDepth: ptr[uint32](1), SimulateTransactions: ptr(false), TraceLogging: ptr(false), }` $DIR/core/services/chainlink/config_test.go: `full.OCR = toml.OCR{ Enabled: ptr(true), ObservationTimeout: commoncfg.MustNewDuration(11 * time.Second), BlockchainTimeout: commoncfg.MustNewDuration(3 * time.Second), ContractPollInterval: commoncfg.MustNewDuration(time.Hour), ContractSubscribeInterval: commoncfg.MustNewDuration(time.Minute), DefaultTransactionQueueDepth: ptr[uint32](12), KeyBundleID: ptr(models.MustSha256HashFromHex("acdd42797a8b921b2910497badc50006")), SimulateTransactions: ptr(true), TransmitterAddress: ptr(types.MustEIP55Address("0xa0788FC17B1dEe36f057c42B6F373A34B014687e")), CaptureEATelemetry: ptr(false), TraceLogging: ptr(false), }` $DIR/core/services/chainlink/config_test.go: `full.P2P = toml.P2P{ IncomingMessageBufferSize: ptr[int64](13), OutgoingMessageBufferSize: ptr[int64](17), PeerID: mustPeerID("12D3KooWMoejJznyDuEk5aX6GvbjaG12UzeornPCBNzMRqdwrFJw"), TraceLogging: ptr(true), V2: toml.P2PV2{ Enabled: ptr(false), AnnounceAddresses: &[]string{"a", "b", "c"}, DefaultBootstrappers: &[]ocrcommontypes.BootstrapperLocator{ {PeerID: "12D3KooWMoejJznyDuEk5aX6GvbjaG12UzeornPCBNzMRqdwrFJw", Addrs: []string{"foo:42", "bar:10"}}, {PeerID: "12D3KooWMoejJznyDuEk5aX6GvbjaG12UzeornPCBNzMRqdwrFJw", Addrs: []string{"test:99"}}, }, DeltaDial: commoncfg.MustNewDuration(time.Minute), DeltaReconcile: commoncfg.MustNewDuration(time.Second), ListenAddresses: &[]string{"foo", "bar"}, }, }` $DIR/core/services/chainlink/config_test.go: `full.Capabilities = toml.Capabilities{ Peering: toml.P2P{ IncomingMessageBufferSize: ptr[int64](13), OutgoingMessageBufferSize: ptr[int64](17), PeerID: mustPeerID("12D3KooWMoejJznyDuEk5aX6GvbjaG12UzeornPCBNzMRqdwrFJw"), TraceLogging: ptr(true), V2: toml.P2PV2{ Enabled: ptr(false), AnnounceAddresses: &[]string{"a", "b", "c"}, DefaultBootstrappers: &[]ocrcommontypes.BootstrapperLocator{ {PeerID: "12D3KooWMoejJznyDuEk5aX6GvbjaG12UzeornPCBNzMRqdwrFJw", Addrs: []string{"foo:42", "bar:10"}}, {PeerID: "12D3KooWMoejJznyDuEk5aX6GvbjaG12UzeornPCBNzMRqdwrFJw", Addrs: []string{"test:99"}}, }, DeltaDial: commoncfg.MustNewDuration(time.Minute), DeltaReconcile: commoncfg.MustNewDuration(2 * time.Second), ListenAddresses: &[]string{"foo", "bar"}, }, }, }` $DIR/core/services/chainlink/config_test.go: `full.Keeper = toml.Keeper{ DefaultTransactionQueueDepth: ptr[uint32](17), GasPriceBufferPercent: ptr[uint16](12), GasTipCapBufferPercent: ptr[uint16](43), BaseFeeBufferPercent: ptr[uint16](89), MaxGracePeriod: ptr[int64](31), TurnLookBack: ptr[int64](91), Registry: toml.KeeperRegistry{ CheckGasOverhead: ptr[uint32](90), PerformGasOverhead: ptr[uint32](math.MaxUint32), SyncInterval: commoncfg.MustNewDuration(time.Hour), SyncUpkeepQueueSize: ptr[uint32](31), MaxPerformDataSize: ptr[uint32](5000), }, }` $DIR/core/services/chainlink/config_test.go: `full.AutoPprof = toml.AutoPprof{ Enabled: ptr(true), ProfileRoot: ptr("prof/root"), PollInterval: commoncfg.MustNewDuration(time.Minute), GatherDuration: commoncfg.MustNewDuration(12 * time.Second), GatherTraceDuration: commoncfg.MustNewDuration(13 * time.Second), MaxProfileSize: ptr[utils.FileSize](utils.GB), CPUProfileRate: ptr[int64](7), MemProfileRate: ptr[int64](9), BlockProfileRate: ptr[int64](5), MutexProfileFraction: ptr[int64](2), MemThreshold: ptr[utils.FileSize](utils.GB), GoroutineThreshold: ptr[int64](999), }` $DIR/core/services/chainlink/config_test.go: `full.Pyroscope = toml.Pyroscope{ ServerAddress: ptr("http://localhost:4040"), Environment: ptr("tests"), }` $DIR/core/services/chainlink/config_test.go: `full.Sentry = toml.Sentry{ Debug: ptr(true), DSN: ptr("sentry-dsn"), Environment: ptr("dev"), Release: ptr("v1.2.3"), }` $DIR/core/services/chainlink/config_test.go: `full.EVM = []*evmcfg.EVMConfig{ { ChainID: ubig.NewI(1), Enabled: ptr(false), Chain: evmcfg.Chain{ AutoCreateKey: ptr(false), BalanceMonitor: evmcfg.BalanceMonitor{ Enabled: ptr(true), }, BlockBackfillDepth: ptr[uint32](100), BlockBackfillSkip: ptr(true), ChainType: chaintype.NewChainTypeConfig("Optimism"), FinalityDepth: ptr[uint32](42), FinalityTagEnabled: ptr[bool](false), FlagsContractAddress: mustAddress("0xae4E781a6218A8031764928E88d457937A954fC3"), GasEstimator: evmcfg.GasEstimator{ Mode: ptr("SuggestedPrice"), EIP1559DynamicFees: ptr(true), BumpPercent: ptr[uint16](10), BumpThreshold: ptr[uint32](6), BumpTxDepth: ptr[uint32](6), BumpMin: assets.NewWeiI(100), FeeCapDefault: assets.NewWeiI(math.MaxInt64), LimitDefault: ptr[uint64](12), LimitMax: ptr[uint64](17), LimitMultiplier: mustDecimal("1.234"), LimitTransfer: ptr[uint64](100), TipCapDefault: assets.NewWeiI(2), TipCapMin: assets.NewWeiI(1), PriceDefault: assets.NewWeiI(math.MaxInt64), PriceMax: assets.NewWei(mustHexToBig(t, "FFFFFFFFFFFF")), PriceMin: assets.NewWeiI(13), LimitJobType: evmcfg.GasLimitJobType{ OCR: ptr[uint32](1001), DR: ptr[uint32](1002), VRF: ptr[uint32](1003), FM: ptr[uint32](1004), Keeper: ptr[uint32](1005), OCR2: ptr[uint32](1006), }, BlockHistory: evmcfg.BlockHistoryEstimator{ BatchSize: ptr[uint32](17), BlockHistorySize: ptr[uint16](12), CheckInclusionBlocks: ptr[uint16](18), CheckInclusionPercentile: ptr[uint16](19), EIP1559FeeCapBufferBlocks: ptr[uint16](13), TransactionPercentile: ptr[uint16](15), }, }, KeySpecific: []evmcfg.KeySpecific{ { Key: mustAddress("0x2a3e23c6f242F5345320814aC8a1b4E58707D292"), GasEstimator: evmcfg.KeySpecificGasEstimator{ PriceMax: assets.NewWei(mustHexToBig(t, "FFFFFFFFFFFFFFFFFFFFFFFF")), }, }, }, LinkContractAddress: mustAddress("0x538aAaB4ea120b2bC2fe5D296852D948F07D849e"), LogBackfillBatchSize: ptr[uint32](17), LogPollInterval: &minute, LogKeepBlocksDepth: ptr[uint32](100000), LogPrunePageSize: ptr[uint32](0), BackupLogPollerBlockDelay: ptr[uint64](532), MinContractPayment: commonassets.NewLinkFromJuels(math.MaxInt64), MinIncomingConfirmations: ptr[uint32](13), NonceAutoSync: ptr(true), NoNewHeadsThreshold: &minute, OperatorFactoryAddress: mustAddress("0xa5B85635Be42F21f94F28034B7DA440EeFF0F418"), RPCDefaultBatchSize: ptr[uint32](17), RPCBlockQueryDelay: ptr[uint16](10), Transactions: evmcfg.Transactions{ MaxInFlight: ptr[uint32](19), MaxQueued: ptr[uint32](99), ReaperInterval: &minute, ReaperThreshold: &minute, ResendAfterThreshold: &hour, ForwardersEnabled: ptr(true), AutoPurge: evmcfg.AutoPurgeConfig{ Enabled: ptr(false), }, }, HeadTracker: evmcfg.HeadTracker{ HistoryDepth: ptr[uint32](15), MaxBufferSize: ptr[uint32](17), SamplingInterval: &hour, FinalityTagBypass: ptr[bool](false), MaxAllowedFinalityDepth: ptr[uint32](1500), }, NodePool: evmcfg.NodePool{ PollFailureThreshold: ptr[uint32](5), PollInterval: &minute, SelectionMode: &selectionMode, SyncThreshold: ptr[uint32](13), LeaseDuration: &zeroSeconds, NodeIsSyncingEnabled: ptr(true), FinalizedBlockPollInterval: &second, Errors: evmcfg.ClientErrors{ NonceTooLow: ptr[string]("(: |^)nonce too low"), NonceTooHigh: ptr[string]("(: |^)nonce too high"), ReplacementTransactionUnderpriced: ptr[string]("(: |^)replacement transaction underpriced"), LimitReached: ptr[string]("(: |^)limit reached"), TransactionAlreadyInMempool: ptr[string]("(: |^)transaction already in mempool"), TerminallyUnderpriced: ptr[string]("(: |^)terminally underpriced"), InsufficientEth: ptr[string]("(: |^)insufficient eth"), TxFeeExceedsCap: ptr[string]("(: |^)tx fee exceeds cap"), L2FeeTooLow: ptr[string]("(: |^)l2 fee too low"), L2FeeTooHigh: ptr[string]("(: |^)l2 fee too high"), L2Full: ptr[string]("(: |^)l2 full"), TransactionAlreadyMined: ptr[string]("(: |^)transaction already mined"), Fatal: ptr[string]("(: |^)fatal"), ServiceUnavailable: ptr[string]("(: |^)service unavailable"), }, }, OCR: evmcfg.OCR{ ContractConfirmations: ptr[uint16](11), ContractTransmitterTransmitTimeout: &minute, DatabaseTimeout: &second, DeltaCOverride: commoncfg.MustNewDuration(time.Hour), DeltaCJitterOverride: commoncfg.MustNewDuration(time.Second), ObservationGracePeriod: &second, }, OCR2: evmcfg.OCR2{ Automation: evmcfg.Automation{ GasLimit: ptr[uint32](540), }, }, }, Nodes: []*evmcfg.Node{ { Name: ptr("foo"), HTTPURL: mustURL("https://foo.web"), WSURL: mustURL("wss://web.socket/test/foo"), }, { Name: ptr("bar"), HTTPURL: mustURL("https://bar.com"), WSURL: mustURL("wss://web.socket/test/bar"), }, { Name: ptr("broadcast"), HTTPURL: mustURL("http://broadcast.mirror"), SendOnly: ptr(true), }, }}, }` $DIR/core/services/chainlink/config_test.go: `full.Solana = []*solcfg.TOMLConfig{ { ChainID: ptr("mainnet"), Enabled: ptr(false), Chain: solcfg.Chain{ BalancePollPeriod: commoncfg.MustNewDuration(time.Minute), ConfirmPollPeriod: commoncfg.MustNewDuration(time.Second), OCR2CachePollPeriod: commoncfg.MustNewDuration(time.Minute), OCR2CacheTTL: commoncfg.MustNewDuration(time.Hour), TxTimeout: commoncfg.MustNewDuration(time.Hour), TxRetryTimeout: commoncfg.MustNewDuration(time.Minute), TxConfirmTimeout: commoncfg.MustNewDuration(time.Second), SkipPreflight: ptr(true), Commitment: ptr("banana"), MaxRetries: ptr[int64](7), FeeEstimatorMode: ptr("fixed"), ComputeUnitPriceMax: ptr[uint64](1000), ComputeUnitPriceMin: ptr[uint64](10), ComputeUnitPriceDefault: ptr[uint64](100), FeeBumpPeriod: commoncfg.MustNewDuration(time.Minute), BlockHistoryPollPeriod: commoncfg.MustNewDuration(time.Minute), }, Nodes: []*solcfg.Node{ {Name: ptr("primary"), URL: commoncfg.MustParseURL("http://solana.web")}, {Name: ptr("foo"), URL: commoncfg.MustParseURL("http://solana.foo")}, {Name: ptr("bar"), URL: commoncfg.MustParseURL("http://solana.bar")}, }, }, }` $DIR/core/services/chainlink/config_test.go: `full.Starknet = []*stkcfg.TOMLConfig{ { ChainID: ptr("foobar"), Enabled: ptr(true), Chain: stkcfg.Chain{ OCR2CachePollPeriod: commoncfg.MustNewDuration(6 * time.Hour), OCR2CacheTTL: commoncfg.MustNewDuration(3 * time.Minute), RequestTimeout: commoncfg.MustNewDuration(time.Minute + 3*time.Second), TxTimeout: commoncfg.MustNewDuration(13 * time.Second), ConfirmationPoll: commoncfg.MustNewDuration(42 * time.Second), }, FeederURL: commoncfg.MustParseURL("http://feeder.url"), Nodes: []*stkcfg.Node{ {Name: ptr("primary"), URL: commoncfg.MustParseURL("http://stark.node"), APIKey: ptr("key")}, }, }, }` $DIR/core/services/chainlink/config_test.go: `full.Cosmos = []*coscfg.TOMLConfig{ { ChainID: ptr("Malaga-420"), Enabled: ptr(true), Chain: coscfg.Chain{ Bech32Prefix: ptr("wasm"), BlockRate: commoncfg.MustNewDuration(time.Minute), BlocksUntilTxTimeout: ptr[int64](12), ConfirmPollPeriod: commoncfg.MustNewDuration(time.Second), FallbackGasPrice: mustDecimal("0.001"), GasToken: ptr("ucosm"), GasLimitMultiplier: mustDecimal("1.2"), MaxMsgsPerBatch: ptr[int64](17), OCR2CachePollPeriod: commoncfg.MustNewDuration(time.Minute), OCR2CacheTTL: commoncfg.MustNewDuration(time.Hour), TxMsgTimeout: commoncfg.MustNewDuration(time.Second), }, Nodes: []*coscfg.Node{ {Name: ptr("primary"), TendermintURL: commoncfg.MustParseURL("http://tender.mint")}, {Name: ptr("foo"), TendermintURL: commoncfg.MustParseURL("http://foo.url")}, {Name: ptr("bar"), TendermintURL: commoncfg.MustParseURL("http://bar.web")}, }, }, }` $DIR/core/services/chainlink/config_test.go: `full.Mercury = toml.Mercury{ Cache: toml.MercuryCache{ LatestReportTTL: commoncfg.MustNewDuration(100 * time.Second), MaxStaleAge: commoncfg.MustNewDuration(101 * time.Second), LatestReportDeadline: commoncfg.MustNewDuration(102 * time.Second), }, TLS: toml.MercuryTLS{ CertFile: ptr("/path/to/cert.pem"), }, Transmitter: toml.MercuryTransmitter{ TransmitQueueMaxSize: ptr(uint32(123)), TransmitTimeout: commoncfg.MustNewDuration(234 * time.Second), }, }` $DIR/core/services/chainlink/config_test.go: `t.Run(tt.name, func(t *testing.T) { s, err := tt.config.TOMLString() require.NoError(t, err) assert.Equal(t, tt.exp, s, diff.Diff(tt.exp, s)) var got Config require.NoError(t, config.DecodeTOML(strings.NewReader(s), &got)) ts, err := got.TOMLString() require.NoError(t, err) assert.Equal(t, tt.config, got, diff.Diff(s, ts)) })` $DIR/core/services/chainlink/config_test.go: `got.EVM[c].Workflow.FromAddress = &addr` $DIR/core/services/chainlink/config_test.go: `got.EVM[c].Workflow.ForwarderAddress = &addr` $DIR/core/services/chainlink/config_test.go: `got.EVM[c].Nodes[n].WSURL = new(commoncfg.URL)` $DIR/core/services/chainlink/config_test.go: `got.EVM[c].Nodes[n].SendOnly = ptr(true)` $DIR/core/services/chainlink/config_test.go: `got.EVM[c].Nodes[n].Order = ptr(int32(100))` $DIR/core/services/chainlink/config_test.go: `got.EVM[c].Transactions.AutoPurge.Threshold = ptr(uint32(0))` $DIR/core/services/chainlink/config_test.go: `got.EVM[c].Transactions.AutoPurge.MinAttempts = ptr(uint32(0))` $DIR/core/services/chainlink/config_test.go: `got.EVM[c].Transactions.AutoPurge.DetectionApiUrl = new(commoncfg.URL)` $DIR/core/services/chainlink/config_test.go: `t.Run(tt.name, func(t *testing.T) { var c Config require.NoError(t, config.DecodeTOML(strings.NewReader(tt.toml), &c)) c.setDefaults() assertValidationError(t, &c, tt.exp) })` $DIR/core/services/chainlink/config_test.go: `c.setDefaults()` $DIR/core/services/chainlink/config_test.go: `assertValidationError(t, &c, tt.exp)` $DIR/core/services/chainlink/config_test.go: `t.Run(tt.name, func(t *testing.T) { lggr, observed := logger.TestLoggerObserved(t, zapcore.InfoLevel) opts := GeneralConfigOpts{ SkipEnv: true, ConfigStrings: []string{tt.inputConfig}, SecretsStrings: []string{tt.inputSecrets}, } c, err := opts.New() require.NoError(t, err) c.LogConfiguration(lggr.Infof, lggr.Warnf) inputLogs := observed.FilterMessageSnippet(secrets).All() if assert.Len(t, inputLogs, 1) { assert.Equal(t, zapcore.InfoLevel, inputLogs[0].Level) got := strings.TrimPrefix(inputLogs[0].Message, secrets) got = strings.TrimSuffix(got, "\n") assert.Equal(t, tt.wantSecrets, got) } inputLogs = observed.FilterMessageSnippet(input).All() if assert.Len(t, inputLogs, 1) { assert.Equal(t, zapcore.InfoLevel, inputLogs[0].Level) got := strings.TrimPrefix(inputLogs[0].Message, input) got = strings.TrimSuffix(got, "\n") assert.Equal(t, tt.wantConfig, got) } inputLogs = observed.FilterMessageSnippet(effective).All() if assert.Len(t, inputLogs, 1) { assert.Equal(t, zapcore.InfoLevel, inputLogs[0].Level) got := strings.TrimPrefix(inputLogs[0].Message, effective) got = strings.TrimSuffix(got, "\n") assert.Equal(t, tt.wantEffective, got) } inputLogs = observed.FilterMessageSnippet(warning).All() if tt.wantWarning != "" && assert.Len(t, inputLogs, 1) { assert.Equal(t, zapcore.WarnLevel, inputLogs[0].Level) got := strings.TrimPrefix(inputLogs[0].Message, warning) got = strings.TrimSuffix(got, "\n") assert.Equal(t, tt.wantWarning, got) } })` $DIR/core/services/chainlink/config_test.go: `c.LogConfiguration(lggr.Infof, lggr.Warnf)` $DIR/core/services/chainlink/config_test.go: `got = strings.TrimSuffix(got, "\n")` $DIR/core/services/chainlink/config_test.go: `inputLogs = observed.FilterMessageSnippet(input).All()` $DIR/core/services/chainlink/config_test.go: `got = strings.TrimSuffix(got, "\n")` $DIR/core/services/chainlink/config_test.go: `inputLogs = observed.FilterMessageSnippet(effective).All()` $DIR/core/services/chainlink/config_test.go: `got = strings.TrimSuffix(got, "\n")` $DIR/core/services/chainlink/config_test.go: `inputLogs = observed.FilterMessageSnippet(warning).All()` $DIR/core/services/chainlink/config_test.go: `got = strings.TrimSuffix(got, "\n")` $DIR/core/services/chainlink/config_test.go: `t.Setenv("CL_DATABASE_URL", DBURL_OVERRIDE)` $DIR/core/services/chainlink/config_test.go: `c.SetPasswords(ptr(PWD_OVERRIDE), nil)` $DIR/core/services/chainlink/config_test.go: `t.Run(tt.name, func(t *testing.T) { var s Secrets require.NoError(t, config.DecodeTOML(strings.NewReader(tt.toml), &s)) assertValidationError(t, &s, tt.exp) })` $DIR/core/services/chainlink/config_test.go: `assertValidationError(t, &s, tt.exp)` $DIR/core/services/chainlink/config_test.go: `c.EVM = evmcfg.EVMConfigs{{ChainID: ubig.NewI(99999133712345)}}` $DIR/core/services/chainlink/config_test.go: `c.Cosmos = coscfg.TOMLConfigs{{ChainID: ptr("unknown cosmos chain")}}` $DIR/core/services/chainlink/config_test.go: `c.Solana = solcfg.TOMLConfigs{{ChainID: ptr("unknown solana chain")}}` $DIR/core/services/chainlink/config_test.go: `c.Starknet = stkcfg.TOMLConfigs{{ChainID: ptr("unknown starknet chain")}}` $DIR/core/services/chainlink/config_test.go: `c.setDefaults()` $DIR/core/services/chainlink/config_test.go: `t.Setenv("LOG_LEVEL", "warn")` $DIR/core/services/chainlink/config_test.go: `t.Setenv("DATABASE_URL", "foo")` $DIR/core/services/chainlink/config_test.go: `t.Setenv("GAS_UPDATER_ENABLED", "true")` $DIR/core/services/chainlink/config_test.go: `t.Setenv("ETH_GAS_BUMP_TX_DEPTH", "7")` $DIR/core/services/chainlink/config_test.go: `t.Run(tt.name, func(t *testing.T) { var c Config for _, fs := range tt.from { var f Config require.NoError(t, config.DecodeTOML(strings.NewReader(fs), &f)) require.NoError(t, c.SetFrom(&f)) } ts, err := c.TOMLString() require.NoError(t, err) assert.Equal(t, tt.exp, ts) })` $DIR/core/services/chainlink/config_test.go: `t.Run(tt.name, func(t *testing.T) { err := tt.config.warnings() if len(tt.expectedErrors) == 0 { assert.NoError(t, err) } else { for _, expectedErr := range tt.expectedErrors { assert.Contains(t, err.Error(), expectedErr) } } })` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Second * 0)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Second)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Minute)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Hour)` $DIR/core/services/chainlink/config_test.go: `.MakePeerID(s)` $DIR/core/services/chainlink/config_test.go: `.NewFromString(s)` $DIR/core/services/chainlink/config_test.go: `.NewEIP55Address(s)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(10 * time.Second)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Minute)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Hour)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Second)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Minute)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(5 * time.Minute)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(2 * time.Minute)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Minute)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(5 * time.Second)` $DIR/core/services/chainlink/config_test.go: `.LogLevel(zapcore.DPanicLevel)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(10 * time.Second)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Minute)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Hour)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(7 * 24 * time.Hour)` $DIR/core/services/chainlink/config_test.go: `.FileSize(uint64(32770))` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(15 * time.Second)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(15 * time.Minute)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(2 * time.Minute)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(240 * time.Hour)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(0 * time.Second)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(2 * time.Minute)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Second)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Minute)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Hour)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(4 * time.Hour)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(7 * 24 * time.Hour)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Minute)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(3 * time.Second)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Hour)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Minute)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Minute)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(8 * time.Second)` $DIR/core/services/chainlink/config_test.go: `.MustSha256HashFromHex("7a5f66bbe6594259325bf2b4f5b1a9c9")` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(11 * time.Second)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(3 * time.Second)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Hour)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Minute)` $DIR/core/services/chainlink/config_test.go: `.MustSha256HashFromHex("acdd42797a8b921b2910497badc50006")` $DIR/core/services/chainlink/config_test.go: `.MustEIP55Address("0xa0788FC17B1dEe36f057c42B6F373A34B014687e")` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Minute)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Second)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Minute)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(2 * time.Second)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Hour)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Minute)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(12 * time.Second)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(13 * time.Second)` $DIR/core/services/chainlink/config_test.go: `.NewI(1)` $DIR/core/services/chainlink/config_test.go: `.NewChainTypeConfig("Optimism")` $DIR/core/services/chainlink/config_test.go: `.NewWeiI(100)` $DIR/core/services/chainlink/config_test.go: `.NewWeiI(math.MaxInt64)` $DIR/core/services/chainlink/config_test.go: `.NewWeiI(2)` $DIR/core/services/chainlink/config_test.go: `.NewWeiI(1)` $DIR/core/services/chainlink/config_test.go: `.NewWeiI(math.MaxInt64)` $DIR/core/services/chainlink/config_test.go: `.NewWei(mustHexToBig(t, "FFFFFFFFFFFF"))` $DIR/core/services/chainlink/config_test.go: `.NewWeiI(13)` $DIR/core/services/chainlink/config_test.go: `.NewWei(mustHexToBig(t, "FFFFFFFFFFFFFFFFFFFFFFFF"))` $DIR/core/services/chainlink/config_test.go: `.NewLinkFromJuels(math.MaxInt64)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Hour)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Second)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Minute)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Second)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Minute)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Hour)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Hour)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Minute)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Second)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Minute)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Minute)` $DIR/core/services/chainlink/config_test.go: `.MustParseURL("http://solana.web")` $DIR/core/services/chainlink/config_test.go: `.MustParseURL("http://solana.foo")` $DIR/core/services/chainlink/config_test.go: `.MustParseURL("http://solana.bar")` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(6 * time.Hour)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(3 * time.Minute)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Minute + 3*time.Second)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(13 * time.Second)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(42 * time.Second)` $DIR/core/services/chainlink/config_test.go: `.MustParseURL("http://feeder.url")` $DIR/core/services/chainlink/config_test.go: `.MustParseURL("http://stark.node")` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Minute)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Second)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Minute)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Hour)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(time.Second)` $DIR/core/services/chainlink/config_test.go: `.MustParseURL("http://tender.mint")` $DIR/core/services/chainlink/config_test.go: `.MustParseURL("http://foo.url")` $DIR/core/services/chainlink/config_test.go: `.MustParseURL("http://bar.web")` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(100 * time.Second)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(101 * time.Second)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(102 * time.Second)` $DIR/core/services/chainlink/config_test.go: `.MustNewDuration(234 * time.Second)` $DIR/core/services/chainlink/config_test.go: `.Run(tt.name, func(t *testing.T) { s, err := tt.config.TOMLString() require.NoError(t, err) assert.Equal(t, tt.exp, s, diff.Diff(tt.exp, s)) var got Config require.NoError(t, config.DecodeTOML(strings.NewReader(s), &got)) ts, err := got.TOMLString() require.NoError(t, err) assert.Equal(t, tt.config, got, diff.Diff(s, ts)) })` $DIR/core/services/chainlink/config_test.go: `.config.TOMLString()` $DIR/core/services/chainlink/config_test.go: `.TOMLString()` $DIR/core/services/chainlink/config_test.go: `.NewEIP55Address("0x2a3e23c6f242F5345320814aC8a1b4E58707D292")` $DIR/core/services/chainlink/config_test.go: `.Run(tt.name, func(t *testing.T) { var c Config require.NoError(t, config.DecodeTOML(strings.NewReader(tt.toml), &c)) c.setDefaults() assertValidationError(t, &c, tt.exp) })` $DIR/core/services/chainlink/config_test.go: `.setDefaults()` $DIR/core/services/chainlink/config_test.go: `.Run(tt.name, func(t *testing.T) { lggr, observed := logger.TestLoggerObserved(t, zapcore.InfoLevel) opts := GeneralConfigOpts{ SkipEnv: true, ConfigStrings: []string{tt.inputConfig}, SecretsStrings: []string{tt.inputSecrets}, } c, err := opts.New() require.NoError(t, err) c.LogConfiguration(lggr.Infof, lggr.Warnf) inputLogs := observed.FilterMessageSnippet(secrets).All() if assert.Len(t, inputLogs, 1) { assert.Equal(t, zapcore.InfoLevel, inputLogs[0].Level) got := strings.TrimPrefix(inputLogs[0].Message, secrets) got = strings.TrimSuffix(got, "\n") assert.Equal(t, tt.wantSecrets, got) } inputLogs = observed.FilterMessageSnippet(input).All() if assert.Len(t, inputLogs, 1) { assert.Equal(t, zapcore.InfoLevel, inputLogs[0].Level) got := strings.TrimPrefix(inputLogs[0].Message, input) got = strings.TrimSuffix(got, "\n") assert.Equal(t, tt.wantConfig, got) } inputLogs = observed.FilterMessageSnippet(effective).All() if assert.Len(t, inputLogs, 1) { assert.Equal(t, zapcore.InfoLevel, inputLogs[0].Level) got := strings.TrimPrefix(inputLogs[0].Message, effective) got = strings.TrimSuffix(got, "\n") assert.Equal(t, tt.wantEffective, got) } inputLogs = observed.FilterMessageSnippet(warning).All() if tt.wantWarning != "" && assert.Len(t, inputLogs, 1) { assert.Equal(t, zapcore.WarnLevel, inputLogs[0].Level) got := strings.TrimPrefix(inputLogs[0].Message, warning) got = strings.TrimSuffix(got, "\n") assert.Equal(t, tt.wantWarning, got) } })` $DIR/core/services/chainlink/config_test.go: `.TestLoggerObserved(t, zapcore.InfoLevel)` $DIR/core/services/chainlink/config_test.go: `.New()` $DIR/core/services/chainlink/config_test.go: `.LogConfiguration(lggr.Infof, lggr.Warnf)` $DIR/core/services/chainlink/config_test.go: `.FilterMessageSnippet(secrets)` $DIR/core/services/chainlink/config_test.go: `.All()` $DIR/core/services/chainlink/config_test.go: `.TrimPrefix(inputLogs[0].Message, secrets)` $DIR/core/services/chainlink/config_test.go: `.TrimSuffix(got, "\n")` $DIR/core/services/chainlink/config_test.go: `.FilterMessageSnippet(input)` $DIR/core/services/chainlink/config_test.go: `.All()` $DIR/core/services/chainlink/config_test.go: `.TrimPrefix(inputLogs[0].Message, input)` $DIR/core/services/chainlink/config_test.go: `.TrimSuffix(got, "\n")` $DIR/core/services/chainlink/config_test.go: `.FilterMessageSnippet(effective)` $DIR/core/services/chainlink/config_test.go: `.All()` $DIR/core/services/chainlink/config_test.go: `.TrimPrefix(inputLogs[0].Message, effective)` $DIR/core/services/chainlink/config_test.go: `.TrimSuffix(got, "\n")` $DIR/core/services/chainlink/config_test.go: `.FilterMessageSnippet(warning)` $DIR/core/services/chainlink/config_test.go: `.All()` $DIR/core/services/chainlink/config_test.go: `.TrimPrefix(inputLogs[0].Message, warning)` $DIR/core/services/chainlink/config_test.go: `.TrimSuffix(got, "\n")` $DIR/core/services/chainlink/config_test.go: `.New()` $DIR/core/services/chainlink/config_test.go: `.New()` $DIR/core/services/chainlink/config_test.go: `.Setenv("CL_DATABASE_URL", DBURL_OVERRIDE)` $DIR/core/services/chainlink/config_test.go: `.New()` $DIR/core/services/chainlink/config_test.go: `.SetPasswords(ptr(PWD_OVERRIDE), nil)` $DIR/core/services/chainlink/config_test.go: `.Database()` $DIR/core/services/chainlink/config_test.go: `.URL()` $DIR/core/services/chainlink/config_test.go: `.String()` $DIR/core/services/chainlink/config_test.go: `.Run(tt.name, func(t *testing.T) { var s Secrets require.NoError(t, config.DecodeTOML(strings.NewReader(tt.toml), &s)) assertValidationError(t, &s, tt.exp) })` $DIR/core/services/chainlink/config_test.go: `.NewI(99999133712345)` $DIR/core/services/chainlink/config_test.go: `.setDefaults()` $DIR/core/services/chainlink/config_test.go: `.TOMLString()` $DIR/core/services/chainlink/config_test.go: `.Setenv("LOG_LEVEL", "warn")` $DIR/core/services/chainlink/config_test.go: `.Setenv("DATABASE_URL", "foo")` $DIR/core/services/chainlink/config_test.go: `.Setenv("GAS_UPDATER_ENABLED", "true")` $DIR/core/services/chainlink/config_test.go: `.Setenv("ETH_GAS_BUMP_TX_DEPTH", "7")` $DIR/core/services/chainlink/config_test.go: `.Run(tt.name, func(t *testing.T) { var c Config for _, fs := range tt.from { var f Config require.NoError(t, config.DecodeTOML(strings.NewReader(fs), &f)) require.NoError(t, c.SetFrom(&f)) } ts, err := c.TOMLString() require.NoError(t, err) assert.Equal(t, tt.exp, ts) })` $DIR/core/services/chainlink/config_test.go: `.TOMLString()` $DIR/core/services/chainlink/config_test.go: `.Run(tt.name, func(t *testing.T) { err := tt.config.warnings() if len(tt.expectedErrors) == 0 { assert.NoError(t, err) } else { for _, expectedErr := range tt.expectedErrors { assert.Contains(t, err.Error(), expectedErr) } } })` $DIR/core/services/chainlink/config_test.go: `.config.warnings()` $DIR/core/services/chainlink/config_threshold_test.go: `.New()` $DIR/core/services/chainlink/config_threshold_test.go: `.Threshold()` $DIR/core/services/chainlink/config_threshold_test.go: `.ThresholdKeyShare()` $DIR/core/services/chainlink/config_tracing_test.go: `.Attributes()` $DIR/core/services/chainlink/config_web_server_test.go: `.New()` $DIR/core/services/chainlink/config_web_server_test.go: `.WebServer()` $DIR/core/services/chainlink/config_web_server_test.go: `.TLS()` $DIR/core/services/chainlink/config_web_server_test.go: `.RateLimit()` $DIR/core/services/chainlink/config_web_server_test.go: `.MFA()` $DIR/core/services/chainlink/config_web_server_test.go: `.RPOrigin()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `c.EVM[0] = &evmcfg.EVMConfig{ ChainID: evmChainID1, Enabled: ptr(true), Chain: cfg, Nodes: evmcfg.EVMNodes{&node1_1, &node1_2}, }` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `c.EVM = append(c.EVM, &evmcfg.EVMConfig{ ChainID: evmChainID2, Chain: evmcfg.Defaults(id2), Enabled: ptr(true), Nodes: evmcfg.EVMNodes{&node2_1}, })` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `c.Solana = solcfg.TOMLConfigs{ &solcfg.TOMLConfig{ ChainID: &solanaChainID1, Enabled: ptr(true), Chain: solcfg.Chain{}, Nodes: []*solcfg.Node{{ Name: ptr("solana chain 1 node 1"), URL: ((*commonconfig.URL)(commonconfig.MustParseURL("http://localhost:8547").URL())), }}, }, &solcfg.TOMLConfig{ ChainID: &solanaChainID2, Enabled: ptr(true), Chain: solcfg.Chain{}, Nodes: []*solcfg.Node{{ Name: ptr("solana chain 2 node 1"), URL: ((*commonconfig.URL)(commonconfig.MustParseURL("http://localhost:8527").URL())), }}, }, }` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `c.Starknet = stkcfg.TOMLConfigs{ &stkcfg.TOMLConfig{ ChainID: &starknetChainID1, Enabled: ptr(true), Chain: stkcfg.Chain{}, FeederURL: commonconfig.MustParseURL("http://feeder.url"), Nodes: []*stkcfg.Node{ { Name: ptr("starknet chain 1 node 1"), URL: ((*commonconfig.URL)(commonconfig.MustParseURL("http://localhost:8547").URL())), APIKey: ptr("key"), }, { Name: ptr("starknet chain 1 node 2"), URL: ((*commonconfig.URL)(commonconfig.MustParseURL("http://localhost:8548").URL())), APIKey: ptr("key"), }, { Name: ptr("starknet chain 1 node 3"), URL: ((*commonconfig.URL)(commonconfig.MustParseURL("http://localhost:8549").URL())), APIKey: ptr("key"), }, }, }, &stkcfg.TOMLConfig{ ChainID: &starknetChainID2, Enabled: ptr(true), Chain: stkcfg.Chain{}, FeederURL: commonconfig.MustParseURL("http://feeder.url"), Nodes: []*stkcfg.Node{ { Name: ptr("starknet chain 2 node 1"), URL: ((*commonconfig.URL)(commonconfig.MustParseURL("http://localhost:3547").URL())), APIKey: ptr("key"), }, }, }, }` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `c.Cosmos = coscfg.TOMLConfigs{ &coscfg.TOMLConfig{ ChainID: &cosmosChainID1, Enabled: ptr(true), Chain: coscfg.Chain{ GasLimitMultiplier: ptr(decimal.RequireFromString("1.55555")), Bech32Prefix: ptr("wasm"), GasToken: ptr("cosm"), }, Nodes: coscfg.Nodes{ &coscfg.Node{ Name: ptr("cosmos chain 1 node 1"), TendermintURL: (*commonconfig.URL)(commonconfig.MustParseURL("http://localhost:9548").URL()), }, }, }, &coscfg.TOMLConfig{ ChainID: &cosmosChainID2, Enabled: ptr(true), Chain: coscfg.Chain{ GasLimitMultiplier: ptr(decimal.RequireFromString("0.777")), Bech32Prefix: ptr("wasm"), GasToken: ptr("cosm"), }, Nodes: coscfg.Nodes{ &coscfg.Node{ Name: ptr("cosmos chain 2 node 1"), TendermintURL: (*commonconfig.URL)(commonconfig.MustParseURL("http://localhost:9598").URL()), }, }, }, }` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `t.Run(tt.name, func(t *testing.T) { t.Parallel() var cr *chainlink.CoreRelayerChainInteroperators { var err error cr, err = chainlink.NewCoreRelayerChainInteroperators(tt.initFuncs...) require.NoError(t, err) expectedChainCnt := tt.expectedEVMChainCnt + tt.expectedCosmosChainCnt + tt.expectedSolanaChainCnt + tt.expectedStarknetChainCnt allChainsStats, cnt, err := cr.ChainStatuses(testctx, 0, 0) assert.NoError(t, err) assert.Len(t, allChainsStats, expectedChainCnt) assert.Equal(t, cnt, len(allChainsStats)) assert.Len(t, cr.Slice(), expectedChainCnt) // should be one relayer per chain and one service per relayer assert.Len(t, cr.Slice(), expectedChainCnt) assert.Len(t, cr.Services(), expectedChainCnt) expectedNodeCnt := tt.expectedEVMNodeCnt + tt.expectedCosmosNodeCnt + tt.expectedSolanaNodeCnt + tt.expectedStarknetNodeCnt allNodeStats, cnt, err := cr.NodeStatuses(testctx, 0, 0) assert.NoError(t, err) assert.Len(t, allNodeStats, expectedNodeCnt) assert.Equal(t, cnt, len(allNodeStats)) } gotRelayerNetworks := make(map[string]struct{}) for relayNetwork := range types.SupportedRelays { var expectedChainCnt, expectedNodeCnt int switch relayNetwork { case types.NetworkEVM: expectedChainCnt, expectedNodeCnt = tt.expectedEVMChainCnt, tt.expectedEVMNodeCnt case types.NetworkCosmos: expectedChainCnt, expectedNodeCnt = tt.expectedCosmosChainCnt, tt.expectedCosmosNodeCnt case types.NetworkSolana: expectedChainCnt, expectedNodeCnt = tt.expectedSolanaChainCnt, tt.expectedSolanaNodeCnt case types.NetworkStarkNet: expectedChainCnt, expectedNodeCnt = tt.expectedStarknetChainCnt, tt.expectedStarknetNodeCnt default: require.Fail(t, "untested relay network", relayNetwork) } interops := cr.List(chainlink.FilterRelayersByType(relayNetwork)) assert.Len(t, cr.List(chainlink.FilterRelayersByType(relayNetwork)).Slice(), expectedChainCnt) if len(interops.Slice()) > 0 { gotRelayerNetworks[relayNetwork] = struct{}{} } // check legacy chains for those that haven't migrated fully to the loop relayer interface if relayNetwork == types.NetworkEVM { _, wantEVM := tt.expectedRelayerNetworks[types.NetworkEVM] if wantEVM { assert.Len(t, cr.LegacyEVMChains().Slice(), expectedChainCnt) } else { assert.Nil(t, cr.LegacyEVMChains()) } } if relayNetwork == types.NetworkCosmos { _, wantCosmos := tt.expectedRelayerNetworks[types.NetworkCosmos] if wantCosmos { assert.Len(t, cr.LegacyCosmosChains().Slice(), expectedChainCnt) } else { assert.Nil(t, cr.LegacyCosmosChains()) } } nodesStats, cnt, err := interops.NodeStatuses(testctx, 0, 0) assert.NoError(t, err) assert.Len(t, nodesStats, expectedNodeCnt) assert.Equal(t, cnt, len(nodesStats)) } assert.EqualValues(t, gotRelayerNetworks, tt.expectedRelayerNetworks) allRelayerIds := [][]types.RelayID{ tt.expectedEVMRelayerIds, tt.expectedCosmosRelayerIds, tt.expectedSolanaRelayerIds, tt.expectedStarknetRelayerIds, } for _, chainSpecificRelayerIds := range allRelayerIds { for _, wantId := range chainSpecificRelayerIds { lr, err := cr.Get(wantId) assert.NotNil(t, lr) assert.NoError(t, err) stat, err := cr.ChainStatus(testctx, wantId) assert.NoError(t, err) assert.Equal(t, wantId.ChainID, stat.ID) // check legacy chains for evm and cosmos if wantId.Network == types.NetworkEVM { c, err := cr.LegacyEVMChains().Get(wantId.ChainID) assert.NoError(t, err) assert.NotNil(t, c) assert.Equal(t, wantId.ChainID, c.ID().String()) } if wantId.Network == types.NetworkCosmos { c, err := cr.LegacyCosmosChains().Get(wantId.ChainID) assert.NoError(t, err) assert.NotNil(t, c) assert.Equal(t, wantId.ChainID, c.ID()) } } } expectedMissing := types.RelayID{Network: types.NetworkCosmos, ChainID: "not a chain id"} unwanted, err := cr.Get(expectedMissing) assert.Nil(t, unwanted) assert.ErrorIs(t, err, chainlink.ErrNoSuchRelayer) })` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `cr, err = chainlink.NewCoreRelayerChainInteroperators(tt.initFuncs...)` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `expectedChainCnt, expectedNodeCnt = tt.expectedEVMChainCnt, tt.expectedEVMNodeCnt` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `expectedChainCnt, expectedNodeCnt = tt.expectedCosmosChainCnt, tt.expectedCosmosNodeCnt` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `expectedChainCnt, expectedNodeCnt = tt.expectedSolanaChainCnt, tt.expectedSolanaNodeCnt` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `expectedChainCnt, expectedNodeCnt = tt.expectedStarknetChainCnt, tt.expectedStarknetNodeCnt` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `gotRelayerNetworks[relayNetwork] = struct{}{}` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.New(big.NewInt(1))` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.NewInt(1)` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.New(big.NewInt(2))` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.NewInt(2)` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { cfg := evmcfg.Defaults(evmChainID1) node1_1 := evmcfg.Node{ Name: ptr("Test node chain1:1"), WSURL: commonconfig.MustParseURL("ws://localhost:8546"), HTTPURL: commonconfig.MustParseURL("http://localhost:8546"), SendOnly: ptr(false), Order: ptr(int32(15)), } node1_2 := evmcfg.Node{ Name: ptr("Test node chain1:2"), WSURL: commonconfig.MustParseURL("ws://localhost:8547"), HTTPURL: commonconfig.MustParseURL("http://localhost:8547"), SendOnly: ptr(false), Order: ptr(int32(36)), } node2_1 := evmcfg.Node{ Name: ptr("Test node chain2:1"), WSURL: commonconfig.MustParseURL("ws://localhost:8547"), HTTPURL: commonconfig.MustParseURL("http://localhost:8547"), SendOnly: ptr(false), Order: ptr(int32(11)), } c.EVM[0] = &evmcfg.EVMConfig{ ChainID: evmChainID1, Enabled: ptr(true), Chain: cfg, Nodes: evmcfg.EVMNodes{&node1_1, &node1_2}, } id2 := ubig.New(big.NewInt(2)) c.EVM = append(c.EVM, &evmcfg.EVMConfig{ ChainID: evmChainID2, Chain: evmcfg.Defaults(id2), Enabled: ptr(true), Nodes: evmcfg.EVMNodes{&node2_1}, }) c.Solana = solcfg.TOMLConfigs{ &solcfg.TOMLConfig{ ChainID: &solanaChainID1, Enabled: ptr(true), Chain: solcfg.Chain{}, Nodes: []*solcfg.Node{{ Name: ptr("solana chain 1 node 1"), URL: ((*commonconfig.URL)(commonconfig.MustParseURL("http://localhost:8547").URL())), }}, }, &solcfg.TOMLConfig{ ChainID: &solanaChainID2, Enabled: ptr(true), Chain: solcfg.Chain{}, Nodes: []*solcfg.Node{{ Name: ptr("solana chain 2 node 1"), URL: ((*commonconfig.URL)(commonconfig.MustParseURL("http://localhost:8527").URL())), }}, }, } c.Starknet = stkcfg.TOMLConfigs{ &stkcfg.TOMLConfig{ ChainID: &starknetChainID1, Enabled: ptr(true), Chain: stkcfg.Chain{}, FeederURL: commonconfig.MustParseURL("http://feeder.url"), Nodes: []*stkcfg.Node{ { Name: ptr("starknet chain 1 node 1"), URL: ((*commonconfig.URL)(commonconfig.MustParseURL("http://localhost:8547").URL())), APIKey: ptr("key"), }, { Name: ptr("starknet chain 1 node 2"), URL: ((*commonconfig.URL)(commonconfig.MustParseURL("http://localhost:8548").URL())), APIKey: ptr("key"), }, { Name: ptr("starknet chain 1 node 3"), URL: ((*commonconfig.URL)(commonconfig.MustParseURL("http://localhost:8549").URL())), APIKey: ptr("key"), }, }, }, &stkcfg.TOMLConfig{ ChainID: &starknetChainID2, Enabled: ptr(true), Chain: stkcfg.Chain{}, FeederURL: commonconfig.MustParseURL("http://feeder.url"), Nodes: []*stkcfg.Node{ { Name: ptr("starknet chain 2 node 1"), URL: ((*commonconfig.URL)(commonconfig.MustParseURL("http://localhost:3547").URL())), APIKey: ptr("key"), }, }, }, } c.Cosmos = coscfg.TOMLConfigs{ &coscfg.TOMLConfig{ ChainID: &cosmosChainID1, Enabled: ptr(true), Chain: coscfg.Chain{ GasLimitMultiplier: ptr(decimal.RequireFromString("1.55555")), Bech32Prefix: ptr("wasm"), GasToken: ptr("cosm"), }, Nodes: coscfg.Nodes{ &coscfg.Node{ Name: ptr("cosmos chain 1 node 1"), TendermintURL: (*commonconfig.URL)(commonconfig.MustParseURL("http://localhost:9548").URL()), }, }, }, &coscfg.TOMLConfig{ ChainID: &cosmosChainID2, Enabled: ptr(true), Chain: coscfg.Chain{ GasLimitMultiplier: ptr(decimal.RequireFromString("0.777")), Bech32Prefix: ptr("wasm"), GasToken: ptr("cosm"), }, Nodes: coscfg.Nodes{ &coscfg.Node{ Name: ptr("cosmos chain 2 node 1"), TendermintURL: (*commonconfig.URL)(commonconfig.MustParseURL("http://localhost:9598").URL()), }, }, }, } })` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.Defaults(evmChainID1)` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.MustParseURL("ws://localhost:8546")` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.MustParseURL("http://localhost:8546")` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.MustParseURL("ws://localhost:8547")` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.MustParseURL("http://localhost:8547")` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.MustParseURL("ws://localhost:8547")` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.MustParseURL("http://localhost:8547")` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.New(big.NewInt(2))` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.NewInt(2)` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.Defaults(id2)` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.MustParseURL("http://localhost:8547")` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.URL()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.MustParseURL("http://localhost:8527")` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.URL()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.MustParseURL("http://feeder.url")` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.MustParseURL("http://localhost:8547")` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.URL()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.MustParseURL("http://localhost:8548")` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.URL()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.MustParseURL("http://localhost:8549")` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.URL()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.MustParseURL("http://feeder.url")` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.MustParseURL("http://localhost:3547")` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.URL()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.RequireFromString("1.55555")` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.MustParseURL("http://localhost:9548")` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.URL()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.RequireFromString("0.777")` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.MustParseURL("http://localhost:9598")` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.URL()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.NewSqlxDB(t)` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.NewKeyStore(t, db)` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.TestLogger(t)` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.NewLoopRegistry(lggr, nil)` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.Context(t)` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.InitEVM(testctx, factory, chainlink.EVMFactoryConfig{ ChainOpts: legacyevm.ChainOpts{ AppConfig: cfg, MailMon: &mailbox.Monitor{}, DS: db, }, CSAETHKeystore: keyStore, })` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.String()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.String()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.InitSolana(testctx, factory, chainlink.SolanaFactoryConfig{ Keystore: keyStore.Solana(), TOMLConfigs: cfg.SolanaConfigs()})` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.Solana()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.SolanaConfigs()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.InitStarknet(testctx, factory, chainlink.StarkNetFactoryConfig{ Keystore: keyStore.StarkNet(), TOMLConfigs: cfg.StarknetConfigs()})` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.StarkNet()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.StarknetConfigs()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.InitCosmos(testctx, factory, chainlink.CosmosFactoryConfig{ Keystore: keyStore.Cosmos(), TOMLConfigs: cfg.CosmosConfigs(), DS: db, })` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.Cosmos()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.CosmosConfigs()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.InitSolana(testctx, factory, chainlink.SolanaFactoryConfig{ Keystore: keyStore.Solana(), TOMLConfigs: cfg.SolanaConfigs()})` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.Solana()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.SolanaConfigs()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.InitEVM(testctx, factory, chainlink.EVMFactoryConfig{ ChainOpts: legacyevm.ChainOpts{ AppConfig: cfg, MailMon: &mailbox.Monitor{}, DS: db, }, CSAETHKeystore: keyStore, })` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.InitStarknet(testctx, factory, chainlink.StarkNetFactoryConfig{ Keystore: keyStore.StarkNet(), TOMLConfigs: cfg.StarknetConfigs()})` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.StarkNet()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.StarknetConfigs()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.InitCosmos(testctx, factory, chainlink.CosmosFactoryConfig{ Keystore: keyStore.Cosmos(), TOMLConfigs: cfg.CosmosConfigs(), DS: db, })` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.Cosmos()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.CosmosConfigs()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.String()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.String()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.Run(tt.name, func(t *testing.T) { t.Parallel() var cr *chainlink.CoreRelayerChainInteroperators { var err error cr, err = chainlink.NewCoreRelayerChainInteroperators(tt.initFuncs...) require.NoError(t, err) expectedChainCnt := tt.expectedEVMChainCnt + tt.expectedCosmosChainCnt + tt.expectedSolanaChainCnt + tt.expectedStarknetChainCnt allChainsStats, cnt, err := cr.ChainStatuses(testctx, 0, 0) assert.NoError(t, err) assert.Len(t, allChainsStats, expectedChainCnt) assert.Equal(t, cnt, len(allChainsStats)) assert.Len(t, cr.Slice(), expectedChainCnt) // should be one relayer per chain and one service per relayer assert.Len(t, cr.Slice(), expectedChainCnt) assert.Len(t, cr.Services(), expectedChainCnt) expectedNodeCnt := tt.expectedEVMNodeCnt + tt.expectedCosmosNodeCnt + tt.expectedSolanaNodeCnt + tt.expectedStarknetNodeCnt allNodeStats, cnt, err := cr.NodeStatuses(testctx, 0, 0) assert.NoError(t, err) assert.Len(t, allNodeStats, expectedNodeCnt) assert.Equal(t, cnt, len(allNodeStats)) } gotRelayerNetworks := make(map[string]struct{}) for relayNetwork := range types.SupportedRelays { var expectedChainCnt, expectedNodeCnt int switch relayNetwork { case types.NetworkEVM: expectedChainCnt, expectedNodeCnt = tt.expectedEVMChainCnt, tt.expectedEVMNodeCnt case types.NetworkCosmos: expectedChainCnt, expectedNodeCnt = tt.expectedCosmosChainCnt, tt.expectedCosmosNodeCnt case types.NetworkSolana: expectedChainCnt, expectedNodeCnt = tt.expectedSolanaChainCnt, tt.expectedSolanaNodeCnt case types.NetworkStarkNet: expectedChainCnt, expectedNodeCnt = tt.expectedStarknetChainCnt, tt.expectedStarknetNodeCnt default: require.Fail(t, "untested relay network", relayNetwork) } interops := cr.List(chainlink.FilterRelayersByType(relayNetwork)) assert.Len(t, cr.List(chainlink.FilterRelayersByType(relayNetwork)).Slice(), expectedChainCnt) if len(interops.Slice()) > 0 { gotRelayerNetworks[relayNetwork] = struct{}{} } // check legacy chains for those that haven't migrated fully to the loop relayer interface if relayNetwork == types.NetworkEVM { _, wantEVM := tt.expectedRelayerNetworks[types.NetworkEVM] if wantEVM { assert.Len(t, cr.LegacyEVMChains().Slice(), expectedChainCnt) } else { assert.Nil(t, cr.LegacyEVMChains()) } } if relayNetwork == types.NetworkCosmos { _, wantCosmos := tt.expectedRelayerNetworks[types.NetworkCosmos] if wantCosmos { assert.Len(t, cr.LegacyCosmosChains().Slice(), expectedChainCnt) } else { assert.Nil(t, cr.LegacyCosmosChains()) } } nodesStats, cnt, err := interops.NodeStatuses(testctx, 0, 0) assert.NoError(t, err) assert.Len(t, nodesStats, expectedNodeCnt) assert.Equal(t, cnt, len(nodesStats)) } assert.EqualValues(t, gotRelayerNetworks, tt.expectedRelayerNetworks) allRelayerIds := [][]types.RelayID{ tt.expectedEVMRelayerIds, tt.expectedCosmosRelayerIds, tt.expectedSolanaRelayerIds, tt.expectedStarknetRelayerIds, } for _, chainSpecificRelayerIds := range allRelayerIds { for _, wantId := range chainSpecificRelayerIds { lr, err := cr.Get(wantId) assert.NotNil(t, lr) assert.NoError(t, err) stat, err := cr.ChainStatus(testctx, wantId) assert.NoError(t, err) assert.Equal(t, wantId.ChainID, stat.ID) // check legacy chains for evm and cosmos if wantId.Network == types.NetworkEVM { c, err := cr.LegacyEVMChains().Get(wantId.ChainID) assert.NoError(t, err) assert.NotNil(t, c) assert.Equal(t, wantId.ChainID, c.ID().String()) } if wantId.Network == types.NetworkCosmos { c, err := cr.LegacyCosmosChains().Get(wantId.ChainID) assert.NoError(t, err) assert.NotNil(t, c) assert.Equal(t, wantId.ChainID, c.ID()) } } } expectedMissing := types.RelayID{Network: types.NetworkCosmos, ChainID: "not a chain id"} unwanted, err := cr.Get(expectedMissing) assert.Nil(t, unwanted) assert.ErrorIs(t, err, chainlink.ErrNoSuchRelayer) })` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.NewCoreRelayerChainInteroperators(tt.initFuncs...)` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.ChainStatuses(testctx, 0, 0)` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.NodeStatuses(testctx, 0, 0)` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.List(chainlink.FilterRelayersByType(relayNetwork))` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.FilterRelayersByType(relayNetwork)` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.Slice()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.NodeStatuses(testctx, 0, 0)` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.Get(wantId)` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.ChainStatus(testctx, wantId)` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.LegacyEVMChains()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.Get(wantId.ChainID)` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.LegacyCosmosChains()` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.Get(wantId.ChainID)` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.Get(expectedMissing)` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.New("this is a bad func")` $DIR/core/services/chainlink/relayer_chain_interoperators_test.go: `.NewCoreRelayerChainInteroperators(badFunc())` $DIR/core/services/chainlink/secret_generator_test.go: `.TempDir()` $DIR/core/services/chainlink/secret_generator_test.go: `.Generate(rootDir)` $DIR/core/services/chainlink/secret_generator_test.go: `.Generate(rootDir)` $DIR/core/services/cron/cron_test.go: `err = service.Start(testutils.Context(t))` $DIR/core/services/cron/cron_test.go: `runner.On("Run", mock.Anything, mock.AnythingOfType("*pipeline.Run"), mock.Anything, mock.Anything, mock.Anything). Run(func(args mock.Arguments) { awaiter.ItHappened() }). Return(false, nil). Once()` $DIR/core/services/cron/cron_test.go: `awaiter.ItHappened()` $DIR/core/services/cron/cron_test.go: `err = service.Start(testutils.Context(t))` $DIR/core/services/cron/cron_test.go: `.NewRunner(t)` $DIR/core/services/cron/cron_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/cron/cron_test.go: `.NewSqlxDB(t)` $DIR/core/services/cron/cron_test.go: `.NewKeyStore(t, db)` $DIR/core/services/cron/cron_test.go: `.TestLogger(t)` $DIR/core/services/cron/cron_test.go: `.NewORM(db, lggr, cfg.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/cron/cron_test.go: `.JobPipeline()` $DIR/core/services/cron/cron_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/cron/cron_test.go: `.NewORM(db)` $DIR/core/services/cron/cron_test.go: `.NewORM(db, orm, btORM, keyStore, lggr)` $DIR/core/services/cron/cron_test.go: `.New()` $DIR/core/services/cron/cron_test.go: `.NewDelegate(runner, lggr)` $DIR/core/services/cron/cron_test.go: `.ServicesForSpec(testutils.Context(t), *jb)` $DIR/core/services/cron/cron_test.go: `.Context(t)` $DIR/core/services/cron/cron_test.go: `.Start(testutils.Context(t))` $DIR/core/services/cron/cron_test.go: `.Context(t)` $DIR/core/services/cron/cron_test.go: `.NewRunner(t)` $DIR/core/services/cron/cron_test.go: `.NewAwaiter()` $DIR/core/services/cron/cron_test.go: `.On("Run", mock.Anything, mock.AnythingOfType("*pipeline.Run"), mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/cron/cron_test.go: `.AnythingOfType("*pipeline.Run")` $DIR/core/services/cron/cron_test.go: `. Run(func(args mock.Arguments) { awaiter.ItHappened() })` $DIR/core/services/cron/cron_test.go: `.ItHappened()` $DIR/core/services/cron/cron_test.go: `. Return(false, nil)` $DIR/core/services/cron/cron_test.go: `. Once()` $DIR/core/services/cron/cron_test.go: `.NewCronFromJobSpec(spec, runner, logger.TestLogger(t))` $DIR/core/services/cron/cron_test.go: `.TestLogger(t)` $DIR/core/services/cron/cron_test.go: `.Start(testutils.Context(t))` $DIR/core/services/cron/cron_test.go: `.Context(t)` $DIR/core/services/cron/validate_test.go: `err = jsonapi.Unmarshal(b, &r)` $DIR/core/services/cron/validate_test.go: `t.Run(tc.name, func(t *testing.T) { s, err := cron.ValidatedCronSpec(tc.toml) tc.assertion(t, s, err) })` $DIR/core/services/cron/validate_test.go: `tc.assertion(t, s, err)` $DIR/core/services/cron/validate_test.go: `.Marshal(s.CronSpec)` $DIR/core/services/cron/validate_test.go: `.Unmarshal(b, &r)` $DIR/core/services/cron/validate_test.go: `.Run(tc.name, func(t *testing.T) { s, err := cron.ValidatedCronSpec(tc.toml) tc.assertion(t, s, err) })` $DIR/core/services/cron/validate_test.go: `.ValidatedCronSpec(tc.toml)` $DIR/core/services/cron/validate_test.go: `.assertion(t, s, err)` $DIR/core/services/directrequest/delegate_test.go: `c.EVM[0].MinIncomingConfirmations = ptr[uint32](1)` $DIR/core/services/directrequest/delegate_test.go: `t.Run("Spec without DirectRequestSpec", func(t *testing.T) { spec := job.Job{} _, err := delegate.ServicesForSpec(testutils.Context(t), spec) assert.Error(t, err, "expects a *job.DirectRequestSpec to be present") })` $DIR/core/services/directrequest/delegate_test.go: `testutils.SkipShortDB(t)` $DIR/core/services/directrequest/delegate_test.go: `t.Run("Log is an OracleRequest", func(t *testing.T) { uni := NewDirectRequestUniverse(t) defer uni.Cleanup() log := log_mocks.NewBroadcast(t) log.On("ReceiptsRoot").Return(common.Hash{}) log.On("TransactionsRoot").Return(common.Hash{}) log.On("StateRoot").Return(common.Hash{}) log.On("EVMChainID").Return(*big.NewInt(0)) uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) logOracleRequest := operator_wrapper.OperatorOracleRequest{ CancelExpiration: big.NewInt(0), } log.On("RawLog").Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, }) log.On("DecodedLog").Return(&logOracleRequest) log.On("String").Return("") uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) runBeganAwaiter := cltest.NewAwaiter() uni.runner.On("Run", mock.Anything, mock.AnythingOfType("*pipeline.Run"), mock.Anything, mock.Anything, mock.Anything). Return(false, nil). Run(func(args mock.Arguments) { runBeganAwaiter.ItHappened() fn := args.Get(4).(func(source sqlutil.DataSource) error) require.NoError(t, fn(nil)) }).Once() ctx := testutils.Context(t) err := uni.service.Start(ctx) require.NoError(t, err) require.NotNil(t, uni.listener, "listener was nil; expected broadcaster.Register to have been called") // check if the job exists under the correct ID drJob, jErr := uni.jobORM.FindJob(ctx, uni.listener.JobID()) require.NoError(t, jErr) require.Equal(t, drJob.ID, uni.listener.JobID()) require.NotNil(t, drJob.DirectRequestSpec) uni.listener.HandleLog(ctx, log) runBeganAwaiter.AwaitOrFail(t, 5*time.Second) uni.service.Close() })` $DIR/core/services/directrequest/delegate_test.go: `log.On("ReceiptsRoot").Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `log.On("TransactionsRoot").Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `log.On("StateRoot").Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `log.On("EVMChainID").Return(*big.NewInt(0))` $DIR/core/services/directrequest/delegate_test.go: `uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `log.On("RawLog").Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, })` $DIR/core/services/directrequest/delegate_test.go: `log.On("DecodedLog").Return(&logOracleRequest)` $DIR/core/services/directrequest/delegate_test.go: `log.On("String").Return("")` $DIR/core/services/directrequest/delegate_test.go: `uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/directrequest/delegate_test.go: `uni.runner.On("Run", mock.Anything, mock.AnythingOfType("*pipeline.Run"), mock.Anything, mock.Anything, mock.Anything). Return(false, nil). Run(func(args mock.Arguments) { runBeganAwaiter.ItHappened() fn := args.Get(4).(func(source sqlutil.DataSource) error) require.NoError(t, fn(nil)) }).Once()` $DIR/core/services/directrequest/delegate_test.go: `runBeganAwaiter.ItHappened()` $DIR/core/services/directrequest/delegate_test.go: `uni.listener.HandleLog(ctx, log)` $DIR/core/services/directrequest/delegate_test.go: `runBeganAwaiter.AwaitOrFail(t, 5*time.Second)` $DIR/core/services/directrequest/delegate_test.go: `t.Run("Log is not consumed, as it's too young", func(t *testing.T) { uni := NewDirectRequestUniverse(t) defer uni.Cleanup() log := log_mocks.NewBroadcast(t) uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil).Maybe() logOracleRequest := operator_wrapper.OperatorOracleRequest{ CancelExpiration: big.NewInt(0), } log.On("RawLog").Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, BlockNumber: 0, }).Maybe() log.On("DecodedLog").Return(&logOracleRequest).Maybe() log.On("String").Return("") log.On("EVMChainID").Return(*big.NewInt(0)) uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil).Maybe() ctx := testutils.Context(t) err := uni.service.Start(ctx) require.NoError(t, err) uni.listener.HandleLog(ctx, log) uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) log.On("ReceiptsRoot").Return(common.Hash{}) log.On("TransactionsRoot").Return(common.Hash{}) log.On("StateRoot").Return(common.Hash{}) runBeganAwaiter := cltest.NewAwaiter() uni.runner.On("Run", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything). Run(func(args mock.Arguments) { runBeganAwaiter.ItHappened() fn := args.Get(4).(func(sqlutil.DataSource) error) require.NoError(t, fn(nil)) }).Once().Return(false, nil) // but should after this one, as the head Number is larger runBeganAwaiter.AwaitOrFail(t, 5*time.Second) uni.service.Close() })` $DIR/core/services/directrequest/delegate_test.go: `uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil).Maybe()` $DIR/core/services/directrequest/delegate_test.go: `log.On("RawLog").Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, BlockNumber: 0, }).Maybe()` $DIR/core/services/directrequest/delegate_test.go: `log.On("DecodedLog").Return(&logOracleRequest).Maybe()` $DIR/core/services/directrequest/delegate_test.go: `log.On("String").Return("")` $DIR/core/services/directrequest/delegate_test.go: `log.On("EVMChainID").Return(*big.NewInt(0))` $DIR/core/services/directrequest/delegate_test.go: `uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil).Maybe()` $DIR/core/services/directrequest/delegate_test.go: `uni.listener.HandleLog(ctx, log)` $DIR/core/services/directrequest/delegate_test.go: `uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `log.On("ReceiptsRoot").Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `log.On("TransactionsRoot").Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `log.On("StateRoot").Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `uni.runner.On("Run", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything). Run(func(args mock.Arguments) { runBeganAwaiter.ItHappened() fn := args.Get(4).(func(sqlutil.DataSource) error) require.NoError(t, fn(nil)) }).Once().Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `runBeganAwaiter.ItHappened()` $DIR/core/services/directrequest/delegate_test.go: `runBeganAwaiter.AwaitOrFail(t, 5*time.Second)` $DIR/core/services/directrequest/delegate_test.go: `t.Run("Log has wrong jobID", func(t *testing.T) { uni := NewDirectRequestUniverse(t) defer uni.Cleanup() log := log_mocks.NewBroadcast(t) lbAwaiter := cltest.NewAwaiter() uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { lbAwaiter.ItHappened() }).Return(nil) logCancelOracleRequest := operator_wrapper.OperatorCancelOracleRequest{RequestId: uni.spec.ExternalIDEncodeStringToTopic()} logAwaiter := cltest.NewAwaiter() log.On("DecodedLog").Run(func(args mock.Arguments) { logAwaiter.ItHappened() }).Return(&logCancelOracleRequest) log.On("RawLog").Return(types.Log{ Topics: []common.Hash{{}, {}}, }) log.On("String").Return("") ctx := testutils.Context(t) err := uni.service.Start(ctx) require.NoError(t, err) uni.listener.HandleLog(ctx, log) logAwaiter.AwaitOrFail(t) lbAwaiter.AwaitOrFail(t) uni.service.Close() })` $DIR/core/services/directrequest/delegate_test.go: `uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { lbAwaiter.ItHappened() }).Return(nil)` $DIR/core/services/directrequest/delegate_test.go: `lbAwaiter.ItHappened()` $DIR/core/services/directrequest/delegate_test.go: `log.On("DecodedLog").Run(func(args mock.Arguments) { logAwaiter.ItHappened() }).Return(&logCancelOracleRequest)` $DIR/core/services/directrequest/delegate_test.go: `logAwaiter.ItHappened()` $DIR/core/services/directrequest/delegate_test.go: `log.On("RawLog").Return(types.Log{ Topics: []common.Hash{{}, {}}, })` $DIR/core/services/directrequest/delegate_test.go: `log.On("String").Return("")` $DIR/core/services/directrequest/delegate_test.go: `uni.listener.HandleLog(ctx, log)` $DIR/core/services/directrequest/delegate_test.go: `logAwaiter.AwaitOrFail(t)` $DIR/core/services/directrequest/delegate_test.go: `lbAwaiter.AwaitOrFail(t)` $DIR/core/services/directrequest/delegate_test.go: `t.Run("Log is a CancelOracleRequest with no matching run", func(t *testing.T) { uni := NewDirectRequestUniverse(t) defer uni.Cleanup() log := log_mocks.NewBroadcast(t) uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) logCancelOracleRequest := operator_wrapper.OperatorCancelOracleRequest{RequestId: uni.spec.ExternalIDEncodeStringToTopic()} log.On("RawLog").Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, }) log.On("String").Return("") log.On("DecodedLog").Return(&logCancelOracleRequest) lbAwaiter := cltest.NewAwaiter() uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { lbAwaiter.ItHappened() }).Return(nil) ctx := testutils.Context(t) err := uni.service.Start(ctx) require.NoError(t, err) uni.listener.HandleLog(ctx, log) lbAwaiter.AwaitOrFail(t) uni.service.Close() })` $DIR/core/services/directrequest/delegate_test.go: `uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `log.On("RawLog").Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, })` $DIR/core/services/directrequest/delegate_test.go: `log.On("String").Return("")` $DIR/core/services/directrequest/delegate_test.go: `log.On("DecodedLog").Return(&logCancelOracleRequest)` $DIR/core/services/directrequest/delegate_test.go: `uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { lbAwaiter.ItHappened() }).Return(nil)` $DIR/core/services/directrequest/delegate_test.go: `lbAwaiter.ItHappened()` $DIR/core/services/directrequest/delegate_test.go: `uni.listener.HandleLog(ctx, log)` $DIR/core/services/directrequest/delegate_test.go: `lbAwaiter.AwaitOrFail(t)` $DIR/core/services/directrequest/delegate_test.go: `t.Run("Log is a CancelOracleRequest with a matching run", func(t *testing.T) { uni := NewDirectRequestUniverse(t) defer uni.Cleanup() runLog := log_mocks.NewBroadcast(t) runLog.On("ReceiptsRoot").Return(common.Hash{}) runLog.On("TransactionsRoot").Return(common.Hash{}) runLog.On("StateRoot").Return(common.Hash{}) runLog.On("EVMChainID").Return(*big.NewInt(0)) uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) logOracleRequest := operator_wrapper.OperatorOracleRequest{ CancelExpiration: big.NewInt(0), RequestId: uni.spec.ExternalIDEncodeStringToTopic(), } runLog.On("RawLog").Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, }) runLog.On("DecodedLog").Return(&logOracleRequest) runLog.On("String").Return("") uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) cancelLog := log_mocks.NewBroadcast(t) uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) logCancelOracleRequest := operator_wrapper.OperatorCancelOracleRequest{RequestId: uni.spec.ExternalIDEncodeStringToTopic()} cancelLog.On("RawLog").Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, }) cancelLog.On("DecodedLog").Return(&logCancelOracleRequest) cancelLog.On("String").Return("") uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) ctx := testutils.Context(t) err := uni.service.Start(ctx) require.NoError(t, err) timeout := 5 * time.Second runBeganAwaiter := cltest.NewAwaiter() runCancelledAwaiter := cltest.NewAwaiter() uni.runner.On("Run", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { runBeganAwaiter.ItHappened() ctx := args[0].(context.Context) select { case <-time.After(timeout): t.Fatalf("Timed out waiting for Run to be canceled (%v)", timeout) case <-ctx.Done(): runCancelledAwaiter.ItHappened() } }).Once().Return(false, nil) uni.listener.HandleLog(ctx, runLog) runBeganAwaiter.AwaitOrFail(t, timeout) uni.listener.HandleLog(ctx, cancelLog) runCancelledAwaiter.AwaitOrFail(t, timeout) uni.service.Close() })` $DIR/core/services/directrequest/delegate_test.go: `runLog.On("ReceiptsRoot").Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `runLog.On("TransactionsRoot").Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `runLog.On("StateRoot").Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `runLog.On("EVMChainID").Return(*big.NewInt(0))` $DIR/core/services/directrequest/delegate_test.go: `uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `runLog.On("RawLog").Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, })` $DIR/core/services/directrequest/delegate_test.go: `runLog.On("DecodedLog").Return(&logOracleRequest)` $DIR/core/services/directrequest/delegate_test.go: `runLog.On("String").Return("")` $DIR/core/services/directrequest/delegate_test.go: `uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/directrequest/delegate_test.go: `uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `cancelLog.On("RawLog").Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, })` $DIR/core/services/directrequest/delegate_test.go: `cancelLog.On("DecodedLog").Return(&logCancelOracleRequest)` $DIR/core/services/directrequest/delegate_test.go: `cancelLog.On("String").Return("")` $DIR/core/services/directrequest/delegate_test.go: `uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/directrequest/delegate_test.go: `uni.runner.On("Run", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { runBeganAwaiter.ItHappened() ctx := args[0].(context.Context) select { case <-time.After(timeout): t.Fatalf("Timed out waiting for Run to be canceled (%v)", timeout) case <-ctx.Done(): runCancelledAwaiter.ItHappened() } }).Once().Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `runBeganAwaiter.ItHappened()` $DIR/core/services/directrequest/delegate_test.go: `runCancelledAwaiter.ItHappened()` $DIR/core/services/directrequest/delegate_test.go: `uni.listener.HandleLog(ctx, runLog)` $DIR/core/services/directrequest/delegate_test.go: `runBeganAwaiter.AwaitOrFail(t, timeout)` $DIR/core/services/directrequest/delegate_test.go: `uni.listener.HandleLog(ctx, cancelLog)` $DIR/core/services/directrequest/delegate_test.go: `runCancelledAwaiter.AwaitOrFail(t, timeout)` $DIR/core/services/directrequest/delegate_test.go: `t.Run("Log has sufficient funds", func(t *testing.T) { cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].MinIncomingConfirmations = ptr[uint32](1) c.EVM[0].MinContractPayment = assets.NewLinkFromJuels(100) }) uni := NewDirectRequestUniverseWithConfig(t, cfg, nil) defer uni.Cleanup() log := log_mocks.NewBroadcast(t) log.On("ReceiptsRoot").Return(common.Hash{}) log.On("TransactionsRoot").Return(common.Hash{}) log.On("StateRoot").Return(common.Hash{}) log.On("EVMChainID").Return(*big.NewInt(0)) uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) logOracleRequest := operator_wrapper.OperatorOracleRequest{ CancelExpiration: big.NewInt(0), Payment: big.NewInt(100), } log.On("RawLog").Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, }) log.On("DecodedLog").Return(&logOracleRequest) log.On("String").Return("") uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) runBeganAwaiter := cltest.NewAwaiter() uni.runner.On("Run", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { runBeganAwaiter.ItHappened() fn := args.Get(4).(func(sqlutil.DataSource) error) require.NoError(t, fn(nil)) }).Once().Return(false, nil) ctx := testutils.Context(t) err := uni.service.Start(ctx) require.NoError(t, err) // check if the job exists under the correct ID drJob, jErr := uni.jobORM.FindJob(ctx, uni.listener.JobID()) require.NoError(t, jErr) require.Equal(t, drJob.ID, uni.listener.JobID()) require.NotNil(t, drJob.DirectRequestSpec) uni.listener.HandleLog(ctx, log) runBeganAwaiter.AwaitOrFail(t, 5*time.Second) uni.service.Close() })` $DIR/core/services/directrequest/delegate_test.go: `c.EVM[0].MinIncomingConfirmations = ptr[uint32](1)` $DIR/core/services/directrequest/delegate_test.go: `c.EVM[0].MinContractPayment = assets.NewLinkFromJuels(100)` $DIR/core/services/directrequest/delegate_test.go: `log.On("ReceiptsRoot").Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `log.On("TransactionsRoot").Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `log.On("StateRoot").Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `log.On("EVMChainID").Return(*big.NewInt(0))` $DIR/core/services/directrequest/delegate_test.go: `uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `log.On("RawLog").Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, })` $DIR/core/services/directrequest/delegate_test.go: `log.On("DecodedLog").Return(&logOracleRequest)` $DIR/core/services/directrequest/delegate_test.go: `log.On("String").Return("")` $DIR/core/services/directrequest/delegate_test.go: `uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/directrequest/delegate_test.go: `uni.runner.On("Run", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { runBeganAwaiter.ItHappened() fn := args.Get(4).(func(sqlutil.DataSource) error) require.NoError(t, fn(nil)) }).Once().Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `runBeganAwaiter.ItHappened()` $DIR/core/services/directrequest/delegate_test.go: `uni.listener.HandleLog(ctx, log)` $DIR/core/services/directrequest/delegate_test.go: `runBeganAwaiter.AwaitOrFail(t, 5*time.Second)` $DIR/core/services/directrequest/delegate_test.go: `t.Run("Log has insufficient funds", func(t *testing.T) { cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].MinIncomingConfirmations = ptr[uint32](1) c.EVM[0].MinContractPayment = assets.NewLinkFromJuels(100) }) uni := NewDirectRequestUniverseWithConfig(t, cfg, nil) defer uni.Cleanup() log := log_mocks.NewBroadcast(t) uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) logOracleRequest := operator_wrapper.OperatorOracleRequest{ CancelExpiration: big.NewInt(0), Payment: big.NewInt(99), } log.On("RawLog").Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, }) log.On("DecodedLog").Return(&logOracleRequest) log.On("String").Return("") markConsumedLogAwaiter := cltest.NewAwaiter() uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { markConsumedLogAwaiter.ItHappened() }).Return(nil) ctx := testutils.Context(t) err := uni.service.Start(ctx) require.NoError(t, err) uni.listener.HandleLog(ctx, log) markConsumedLogAwaiter.AwaitOrFail(t, 5*time.Second) uni.service.Close() })` $DIR/core/services/directrequest/delegate_test.go: `c.EVM[0].MinIncomingConfirmations = ptr[uint32](1)` $DIR/core/services/directrequest/delegate_test.go: `c.EVM[0].MinContractPayment = assets.NewLinkFromJuels(100)` $DIR/core/services/directrequest/delegate_test.go: `uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `log.On("RawLog").Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, })` $DIR/core/services/directrequest/delegate_test.go: `log.On("DecodedLog").Return(&logOracleRequest)` $DIR/core/services/directrequest/delegate_test.go: `log.On("String").Return("")` $DIR/core/services/directrequest/delegate_test.go: `uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { markConsumedLogAwaiter.ItHappened() }).Return(nil)` $DIR/core/services/directrequest/delegate_test.go: `markConsumedLogAwaiter.ItHappened()` $DIR/core/services/directrequest/delegate_test.go: `uni.listener.HandleLog(ctx, log)` $DIR/core/services/directrequest/delegate_test.go: `markConsumedLogAwaiter.AwaitOrFail(t, 5*time.Second)` $DIR/core/services/directrequest/delegate_test.go: `t.Run("requesters is specified and log is requested by a whitelisted address", func(t *testing.T) { requester := testutils.NewAddress() cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].MinIncomingConfirmations = ptr[uint32](1) c.EVM[0].MinContractPayment = assets.NewLinkFromJuels(100) }) uni := NewDirectRequestUniverseWithConfig(t, cfg, func(jb *job.Job) { jb.DirectRequestSpec.Requesters = []common.Address{testutils.NewAddress(), requester} }) defer uni.Cleanup() log := log_mocks.NewBroadcast(t) log.On("ReceiptsRoot").Return(common.Hash{}) log.On("TransactionsRoot").Return(common.Hash{}) log.On("StateRoot").Return(common.Hash{}) log.On("EVMChainID").Return(*big.NewInt(0)) uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) logOracleRequest := operator_wrapper.OperatorOracleRequest{ CancelExpiration: big.NewInt(0), Payment: big.NewInt(100), Requester: requester, } log.On("RawLog").Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, }) log.On("DecodedLog").Return(&logOracleRequest) log.On("String").Return("") markConsumedLogAwaiter := cltest.NewAwaiter() uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { markConsumedLogAwaiter.ItHappened() }).Return(nil) runBeganAwaiter := cltest.NewAwaiter() uni.runner.On("Run", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { runBeganAwaiter.ItHappened() fn := args.Get(4).(func(sqlutil.DataSource) error) require.NoError(t, fn(nil)) }).Once().Return(false, nil) ctx := testutils.Context(t) err := uni.service.Start(ctx) require.NoError(t, err) // check if the job exists under the correct ID drJob, jErr := uni.jobORM.FindJob(ctx, uni.listener.JobID()) require.NoError(t, jErr) require.Equal(t, drJob.ID, uni.listener.JobID()) require.NotNil(t, drJob.DirectRequestSpec) uni.listener.HandleLog(ctx, log) runBeganAwaiter.AwaitOrFail(t, 5*time.Second) uni.service.Close() })` $DIR/core/services/directrequest/delegate_test.go: `c.EVM[0].MinIncomingConfirmations = ptr[uint32](1)` $DIR/core/services/directrequest/delegate_test.go: `c.EVM[0].MinContractPayment = assets.NewLinkFromJuels(100)` $DIR/core/services/directrequest/delegate_test.go: `jb.DirectRequestSpec.Requesters = []common.Address{testutils.NewAddress(), requester}` $DIR/core/services/directrequest/delegate_test.go: `log.On("ReceiptsRoot").Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `log.On("TransactionsRoot").Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `log.On("StateRoot").Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `log.On("EVMChainID").Return(*big.NewInt(0))` $DIR/core/services/directrequest/delegate_test.go: `uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `log.On("RawLog").Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, })` $DIR/core/services/directrequest/delegate_test.go: `log.On("DecodedLog").Return(&logOracleRequest)` $DIR/core/services/directrequest/delegate_test.go: `log.On("String").Return("")` $DIR/core/services/directrequest/delegate_test.go: `uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { markConsumedLogAwaiter.ItHappened() }).Return(nil)` $DIR/core/services/directrequest/delegate_test.go: `markConsumedLogAwaiter.ItHappened()` $DIR/core/services/directrequest/delegate_test.go: `uni.runner.On("Run", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { runBeganAwaiter.ItHappened() fn := args.Get(4).(func(sqlutil.DataSource) error) require.NoError(t, fn(nil)) }).Once().Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `runBeganAwaiter.ItHappened()` $DIR/core/services/directrequest/delegate_test.go: `uni.listener.HandleLog(ctx, log)` $DIR/core/services/directrequest/delegate_test.go: `runBeganAwaiter.AwaitOrFail(t, 5*time.Second)` $DIR/core/services/directrequest/delegate_test.go: `c.EVM[0].MinIncomingConfirmations = ptr[uint32](1)` $DIR/core/services/directrequest/delegate_test.go: `c.EVM[0].MinContractPayment = assets.NewLinkFromJuels(100)` $DIR/core/services/directrequest/delegate_test.go: `jb.DirectRequestSpec.Requesters = []common.Address{testutils.NewAddress(), testutils.NewAddress()}` $DIR/core/services/directrequest/delegate_test.go: `uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `log.On("RawLog").Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, })` $DIR/core/services/directrequest/delegate_test.go: `log.On("DecodedLog").Return(&logOracleRequest)` $DIR/core/services/directrequest/delegate_test.go: `log.On("String").Return("")` $DIR/core/services/directrequest/delegate_test.go: `uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { markConsumedLogAwaiter.ItHappened() }).Return(nil)` $DIR/core/services/directrequest/delegate_test.go: `markConsumedLogAwaiter.ItHappened()` $DIR/core/services/directrequest/delegate_test.go: `uni.listener.HandleLog(ctx, log)` $DIR/core/services/directrequest/delegate_test.go: `markConsumedLogAwaiter.AwaitOrFail(t, 5*time.Second)` $DIR/core/services/directrequest/delegate_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/services/directrequest/delegate_test.go: `.NewRunner(t)` $DIR/core/services/directrequest/delegate_test.go: `.NewSqlxDB(t)` $DIR/core/services/directrequest/delegate_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].MinIncomingConfirmations = ptr[uint32](1) })` $DIR/core/services/directrequest/delegate_test.go: `.NewKeyStore(t, db)` $DIR/core/services/directrequest/delegate_test.go: `.Run(t, mailboxtest.NewMonitor(t))` $DIR/core/services/directrequest/delegate_test.go: `.NewMonitor(t)` $DIR/core/services/directrequest/delegate_test.go: `.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, GeneralConfig: cfg, Client: ethClient, MailMon: mailMon, KeyStore: keyStore.Eth()})` $DIR/core/services/directrequest/delegate_test.go: `.Eth()` $DIR/core/services/directrequest/delegate_test.go: `.TestLogger(t)` $DIR/core/services/directrequest/delegate_test.go: `.NewLegacyChainsFromRelayerExtenders(relayerExtenders)` $DIR/core/services/directrequest/delegate_test.go: `.NewDelegate(lggr, runner, nil, legacyChains, mailMon)` $DIR/core/services/directrequest/delegate_test.go: `.Run("Spec without DirectRequestSpec", func(t *testing.T) { spec := job.Job{} _, err := delegate.ServicesForSpec(testutils.Context(t), spec) assert.Error(t, err, "expects a *job.DirectRequestSpec to be present") })` $DIR/core/services/directrequest/delegate_test.go: `.ServicesForSpec(testutils.Context(t), spec)` $DIR/core/services/directrequest/delegate_test.go: `.Context(t)` $DIR/core/services/directrequest/delegate_test.go: `.ServicesForSpec(testutils.Context(t), spec)` $DIR/core/services/directrequest/delegate_test.go: `.Context(t)` $DIR/core/services/directrequest/delegate_test.go: `.SkipShortDB(t)` $DIR/core/services/directrequest/delegate_test.go: `.Run("Log is an OracleRequest", func(t *testing.T) { uni := NewDirectRequestUniverse(t) defer uni.Cleanup() log := log_mocks.NewBroadcast(t) log.On("ReceiptsRoot").Return(common.Hash{}) log.On("TransactionsRoot").Return(common.Hash{}) log.On("StateRoot").Return(common.Hash{}) log.On("EVMChainID").Return(*big.NewInt(0)) uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) logOracleRequest := operator_wrapper.OperatorOracleRequest{ CancelExpiration: big.NewInt(0), } log.On("RawLog").Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, }) log.On("DecodedLog").Return(&logOracleRequest) log.On("String").Return("") uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) runBeganAwaiter := cltest.NewAwaiter() uni.runner.On("Run", mock.Anything, mock.AnythingOfType("*pipeline.Run"), mock.Anything, mock.Anything, mock.Anything). Return(false, nil). Run(func(args mock.Arguments) { runBeganAwaiter.ItHappened() fn := args.Get(4).(func(source sqlutil.DataSource) error) require.NoError(t, fn(nil)) }).Once() ctx := testutils.Context(t) err := uni.service.Start(ctx) require.NoError(t, err) require.NotNil(t, uni.listener, "listener was nil; expected broadcaster.Register to have been called") // check if the job exists under the correct ID drJob, jErr := uni.jobORM.FindJob(ctx, uni.listener.JobID()) require.NoError(t, jErr) require.Equal(t, drJob.ID, uni.listener.JobID()) require.NotNil(t, drJob.DirectRequestSpec) uni.listener.HandleLog(ctx, log) runBeganAwaiter.AwaitOrFail(t, 5*time.Second) uni.service.Close() })` $DIR/core/services/directrequest/delegate_test.go: `.Cleanup()` $DIR/core/services/directrequest/delegate_test.go: `.NewBroadcast(t)` $DIR/core/services/directrequest/delegate_test.go: `.On("ReceiptsRoot")` $DIR/core/services/directrequest/delegate_test.go: `.Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `.On("TransactionsRoot")` $DIR/core/services/directrequest/delegate_test.go: `.Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `.On("StateRoot")` $DIR/core/services/directrequest/delegate_test.go: `.Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `.On("EVMChainID")` $DIR/core/services/directrequest/delegate_test.go: `.Return(*big.NewInt(0))` $DIR/core/services/directrequest/delegate_test.go: `.NewInt(0)` $DIR/core/services/directrequest/delegate_test.go: `.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/directrequest/delegate_test.go: `.Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `.NewInt(0)` $DIR/core/services/directrequest/delegate_test.go: `.On("RawLog")` $DIR/core/services/directrequest/delegate_test.go: `.Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, })` $DIR/core/services/directrequest/delegate_test.go: `.spec.ExternalIDEncodeStringToTopic()` $DIR/core/services/directrequest/delegate_test.go: `.On("DecodedLog")` $DIR/core/services/directrequest/delegate_test.go: `.Return(&logOracleRequest)` $DIR/core/services/directrequest/delegate_test.go: `.On("String")` $DIR/core/services/directrequest/delegate_test.go: `.Return("")` $DIR/core/services/directrequest/delegate_test.go: `.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/directrequest/delegate_test.go: `.Return(nil)` $DIR/core/services/directrequest/delegate_test.go: `.NewAwaiter()` $DIR/core/services/directrequest/delegate_test.go: `.runner.On("Run", mock.Anything, mock.AnythingOfType("*pipeline.Run"), mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/directrequest/delegate_test.go: `.AnythingOfType("*pipeline.Run")` $DIR/core/services/directrequest/delegate_test.go: `. Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `. Run(func(args mock.Arguments) { runBeganAwaiter.ItHappened() fn := args.Get(4).(func(source sqlutil.DataSource) error) require.NoError(t, fn(nil)) })` $DIR/core/services/directrequest/delegate_test.go: `.ItHappened()` $DIR/core/services/directrequest/delegate_test.go: `.Get(4)` $DIR/core/services/directrequest/delegate_test.go: `.Once()` $DIR/core/services/directrequest/delegate_test.go: `.Context(t)` $DIR/core/services/directrequest/delegate_test.go: `.service.Start(ctx)` $DIR/core/services/directrequest/delegate_test.go: `.jobORM.FindJob(ctx, uni.listener.JobID())` $DIR/core/services/directrequest/delegate_test.go: `.listener.JobID()` $DIR/core/services/directrequest/delegate_test.go: `.listener.HandleLog(ctx, log)` $DIR/core/services/directrequest/delegate_test.go: `.AwaitOrFail(t, 5*time.Second)` $DIR/core/services/directrequest/delegate_test.go: `.Run("Log is not consumed, as it's too young", func(t *testing.T) { uni := NewDirectRequestUniverse(t) defer uni.Cleanup() log := log_mocks.NewBroadcast(t) uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil).Maybe() logOracleRequest := operator_wrapper.OperatorOracleRequest{ CancelExpiration: big.NewInt(0), } log.On("RawLog").Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, BlockNumber: 0, }).Maybe() log.On("DecodedLog").Return(&logOracleRequest).Maybe() log.On("String").Return("") log.On("EVMChainID").Return(*big.NewInt(0)) uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil).Maybe() ctx := testutils.Context(t) err := uni.service.Start(ctx) require.NoError(t, err) uni.listener.HandleLog(ctx, log) uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) log.On("ReceiptsRoot").Return(common.Hash{}) log.On("TransactionsRoot").Return(common.Hash{}) log.On("StateRoot").Return(common.Hash{}) runBeganAwaiter := cltest.NewAwaiter() uni.runner.On("Run", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything). Run(func(args mock.Arguments) { runBeganAwaiter.ItHappened() fn := args.Get(4).(func(sqlutil.DataSource) error) require.NoError(t, fn(nil)) }).Once().Return(false, nil) // but should after this one, as the head Number is larger runBeganAwaiter.AwaitOrFail(t, 5*time.Second) uni.service.Close() })` $DIR/core/services/directrequest/delegate_test.go: `.Cleanup()` $DIR/core/services/directrequest/delegate_test.go: `.NewBroadcast(t)` $DIR/core/services/directrequest/delegate_test.go: `.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/directrequest/delegate_test.go: `.Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `.Maybe()` $DIR/core/services/directrequest/delegate_test.go: `.NewInt(0)` $DIR/core/services/directrequest/delegate_test.go: `.On("RawLog")` $DIR/core/services/directrequest/delegate_test.go: `.Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, BlockNumber: 0, })` $DIR/core/services/directrequest/delegate_test.go: `.spec.ExternalIDEncodeStringToTopic()` $DIR/core/services/directrequest/delegate_test.go: `.Maybe()` $DIR/core/services/directrequest/delegate_test.go: `.On("DecodedLog")` $DIR/core/services/directrequest/delegate_test.go: `.Return(&logOracleRequest)` $DIR/core/services/directrequest/delegate_test.go: `.Maybe()` $DIR/core/services/directrequest/delegate_test.go: `.On("String")` $DIR/core/services/directrequest/delegate_test.go: `.Return("")` $DIR/core/services/directrequest/delegate_test.go: `.On("EVMChainID")` $DIR/core/services/directrequest/delegate_test.go: `.Return(*big.NewInt(0))` $DIR/core/services/directrequest/delegate_test.go: `.NewInt(0)` $DIR/core/services/directrequest/delegate_test.go: `.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/directrequest/delegate_test.go: `.Return(nil)` $DIR/core/services/directrequest/delegate_test.go: `.Maybe()` $DIR/core/services/directrequest/delegate_test.go: `.Context(t)` $DIR/core/services/directrequest/delegate_test.go: `.service.Start(ctx)` $DIR/core/services/directrequest/delegate_test.go: `.listener.HandleLog(ctx, log)` $DIR/core/services/directrequest/delegate_test.go: `.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/directrequest/delegate_test.go: `.Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `.On("ReceiptsRoot")` $DIR/core/services/directrequest/delegate_test.go: `.Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `.On("TransactionsRoot")` $DIR/core/services/directrequest/delegate_test.go: `.Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `.On("StateRoot")` $DIR/core/services/directrequest/delegate_test.go: `.Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `.NewAwaiter()` $DIR/core/services/directrequest/delegate_test.go: `.runner.On("Run", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/directrequest/delegate_test.go: `. Run(func(args mock.Arguments) { runBeganAwaiter.ItHappened() fn := args.Get(4).(func(sqlutil.DataSource) error) require.NoError(t, fn(nil)) })` $DIR/core/services/directrequest/delegate_test.go: `.ItHappened()` $DIR/core/services/directrequest/delegate_test.go: `.Get(4)` $DIR/core/services/directrequest/delegate_test.go: `.Once()` $DIR/core/services/directrequest/delegate_test.go: `.Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `.AwaitOrFail(t, 5*time.Second)` $DIR/core/services/directrequest/delegate_test.go: `.Run("Log has wrong jobID", func(t *testing.T) { uni := NewDirectRequestUniverse(t) defer uni.Cleanup() log := log_mocks.NewBroadcast(t) lbAwaiter := cltest.NewAwaiter() uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { lbAwaiter.ItHappened() }).Return(nil) logCancelOracleRequest := operator_wrapper.OperatorCancelOracleRequest{RequestId: uni.spec.ExternalIDEncodeStringToTopic()} logAwaiter := cltest.NewAwaiter() log.On("DecodedLog").Run(func(args mock.Arguments) { logAwaiter.ItHappened() }).Return(&logCancelOracleRequest) log.On("RawLog").Return(types.Log{ Topics: []common.Hash{{}, {}}, }) log.On("String").Return("") ctx := testutils.Context(t) err := uni.service.Start(ctx) require.NoError(t, err) uni.listener.HandleLog(ctx, log) logAwaiter.AwaitOrFail(t) lbAwaiter.AwaitOrFail(t) uni.service.Close() })` $DIR/core/services/directrequest/delegate_test.go: `.Cleanup()` $DIR/core/services/directrequest/delegate_test.go: `.NewBroadcast(t)` $DIR/core/services/directrequest/delegate_test.go: `.NewAwaiter()` $DIR/core/services/directrequest/delegate_test.go: `.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/directrequest/delegate_test.go: `.Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/directrequest/delegate_test.go: `.Run(func(args mock.Arguments) { lbAwaiter.ItHappened() })` $DIR/core/services/directrequest/delegate_test.go: `.ItHappened()` $DIR/core/services/directrequest/delegate_test.go: `.Return(nil)` $DIR/core/services/directrequest/delegate_test.go: `.spec.ExternalIDEncodeStringToTopic()` $DIR/core/services/directrequest/delegate_test.go: `.NewAwaiter()` $DIR/core/services/directrequest/delegate_test.go: `.On("DecodedLog")` $DIR/core/services/directrequest/delegate_test.go: `.Run(func(args mock.Arguments) { logAwaiter.ItHappened() })` $DIR/core/services/directrequest/delegate_test.go: `.ItHappened()` $DIR/core/services/directrequest/delegate_test.go: `.Return(&logCancelOracleRequest)` $DIR/core/services/directrequest/delegate_test.go: `.On("RawLog")` $DIR/core/services/directrequest/delegate_test.go: `.Return(types.Log{ Topics: []common.Hash{{}, {}}, })` $DIR/core/services/directrequest/delegate_test.go: `.On("String")` $DIR/core/services/directrequest/delegate_test.go: `.Return("")` $DIR/core/services/directrequest/delegate_test.go: `.Context(t)` $DIR/core/services/directrequest/delegate_test.go: `.service.Start(ctx)` $DIR/core/services/directrequest/delegate_test.go: `.listener.HandleLog(ctx, log)` $DIR/core/services/directrequest/delegate_test.go: `.AwaitOrFail(t)` $DIR/core/services/directrequest/delegate_test.go: `.AwaitOrFail(t)` $DIR/core/services/directrequest/delegate_test.go: `.Run("Log is a CancelOracleRequest with no matching run", func(t *testing.T) { uni := NewDirectRequestUniverse(t) defer uni.Cleanup() log := log_mocks.NewBroadcast(t) uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) logCancelOracleRequest := operator_wrapper.OperatorCancelOracleRequest{RequestId: uni.spec.ExternalIDEncodeStringToTopic()} log.On("RawLog").Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, }) log.On("String").Return("") log.On("DecodedLog").Return(&logCancelOracleRequest) lbAwaiter := cltest.NewAwaiter() uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { lbAwaiter.ItHappened() }).Return(nil) ctx := testutils.Context(t) err := uni.service.Start(ctx) require.NoError(t, err) uni.listener.HandleLog(ctx, log) lbAwaiter.AwaitOrFail(t) uni.service.Close() })` $DIR/core/services/directrequest/delegate_test.go: `.Cleanup()` $DIR/core/services/directrequest/delegate_test.go: `.NewBroadcast(t)` $DIR/core/services/directrequest/delegate_test.go: `.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/directrequest/delegate_test.go: `.Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `.spec.ExternalIDEncodeStringToTopic()` $DIR/core/services/directrequest/delegate_test.go: `.On("RawLog")` $DIR/core/services/directrequest/delegate_test.go: `.Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, })` $DIR/core/services/directrequest/delegate_test.go: `.spec.ExternalIDEncodeStringToTopic()` $DIR/core/services/directrequest/delegate_test.go: `.On("String")` $DIR/core/services/directrequest/delegate_test.go: `.Return("")` $DIR/core/services/directrequest/delegate_test.go: `.On("DecodedLog")` $DIR/core/services/directrequest/delegate_test.go: `.Return(&logCancelOracleRequest)` $DIR/core/services/directrequest/delegate_test.go: `.NewAwaiter()` $DIR/core/services/directrequest/delegate_test.go: `.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/directrequest/delegate_test.go: `.Run(func(args mock.Arguments) { lbAwaiter.ItHappened() })` $DIR/core/services/directrequest/delegate_test.go: `.ItHappened()` $DIR/core/services/directrequest/delegate_test.go: `.Return(nil)` $DIR/core/services/directrequest/delegate_test.go: `.Context(t)` $DIR/core/services/directrequest/delegate_test.go: `.service.Start(ctx)` $DIR/core/services/directrequest/delegate_test.go: `.listener.HandleLog(ctx, log)` $DIR/core/services/directrequest/delegate_test.go: `.AwaitOrFail(t)` $DIR/core/services/directrequest/delegate_test.go: `.Run("Log is a CancelOracleRequest with a matching run", func(t *testing.T) { uni := NewDirectRequestUniverse(t) defer uni.Cleanup() runLog := log_mocks.NewBroadcast(t) runLog.On("ReceiptsRoot").Return(common.Hash{}) runLog.On("TransactionsRoot").Return(common.Hash{}) runLog.On("StateRoot").Return(common.Hash{}) runLog.On("EVMChainID").Return(*big.NewInt(0)) uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) logOracleRequest := operator_wrapper.OperatorOracleRequest{ CancelExpiration: big.NewInt(0), RequestId: uni.spec.ExternalIDEncodeStringToTopic(), } runLog.On("RawLog").Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, }) runLog.On("DecodedLog").Return(&logOracleRequest) runLog.On("String").Return("") uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) cancelLog := log_mocks.NewBroadcast(t) uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) logCancelOracleRequest := operator_wrapper.OperatorCancelOracleRequest{RequestId: uni.spec.ExternalIDEncodeStringToTopic()} cancelLog.On("RawLog").Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, }) cancelLog.On("DecodedLog").Return(&logCancelOracleRequest) cancelLog.On("String").Return("") uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) ctx := testutils.Context(t) err := uni.service.Start(ctx) require.NoError(t, err) timeout := 5 * time.Second runBeganAwaiter := cltest.NewAwaiter() runCancelledAwaiter := cltest.NewAwaiter() uni.runner.On("Run", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { runBeganAwaiter.ItHappened() ctx := args[0].(context.Context) select { case <-time.After(timeout): t.Fatalf("Timed out waiting for Run to be canceled (%v)", timeout) case <-ctx.Done(): runCancelledAwaiter.ItHappened() } }).Once().Return(false, nil) uni.listener.HandleLog(ctx, runLog) runBeganAwaiter.AwaitOrFail(t, timeout) uni.listener.HandleLog(ctx, cancelLog) runCancelledAwaiter.AwaitOrFail(t, timeout) uni.service.Close() })` $DIR/core/services/directrequest/delegate_test.go: `.Cleanup()` $DIR/core/services/directrequest/delegate_test.go: `.NewBroadcast(t)` $DIR/core/services/directrequest/delegate_test.go: `.On("ReceiptsRoot")` $DIR/core/services/directrequest/delegate_test.go: `.Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `.On("TransactionsRoot")` $DIR/core/services/directrequest/delegate_test.go: `.Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `.On("StateRoot")` $DIR/core/services/directrequest/delegate_test.go: `.Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `.On("EVMChainID")` $DIR/core/services/directrequest/delegate_test.go: `.Return(*big.NewInt(0))` $DIR/core/services/directrequest/delegate_test.go: `.NewInt(0)` $DIR/core/services/directrequest/delegate_test.go: `.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/directrequest/delegate_test.go: `.Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `.NewInt(0)` $DIR/core/services/directrequest/delegate_test.go: `.spec.ExternalIDEncodeStringToTopic()` $DIR/core/services/directrequest/delegate_test.go: `.On("RawLog")` $DIR/core/services/directrequest/delegate_test.go: `.Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, })` $DIR/core/services/directrequest/delegate_test.go: `.spec.ExternalIDEncodeStringToTopic()` $DIR/core/services/directrequest/delegate_test.go: `.On("DecodedLog")` $DIR/core/services/directrequest/delegate_test.go: `.Return(&logOracleRequest)` $DIR/core/services/directrequest/delegate_test.go: `.On("String")` $DIR/core/services/directrequest/delegate_test.go: `.Return("")` $DIR/core/services/directrequest/delegate_test.go: `.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/directrequest/delegate_test.go: `.Return(nil)` $DIR/core/services/directrequest/delegate_test.go: `.NewBroadcast(t)` $DIR/core/services/directrequest/delegate_test.go: `.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/directrequest/delegate_test.go: `.Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `.spec.ExternalIDEncodeStringToTopic()` $DIR/core/services/directrequest/delegate_test.go: `.On("RawLog")` $DIR/core/services/directrequest/delegate_test.go: `.Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, })` $DIR/core/services/directrequest/delegate_test.go: `.spec.ExternalIDEncodeStringToTopic()` $DIR/core/services/directrequest/delegate_test.go: `.On("DecodedLog")` $DIR/core/services/directrequest/delegate_test.go: `.Return(&logCancelOracleRequest)` $DIR/core/services/directrequest/delegate_test.go: `.On("String")` $DIR/core/services/directrequest/delegate_test.go: `.Return("")` $DIR/core/services/directrequest/delegate_test.go: `.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/directrequest/delegate_test.go: `.Return(nil)` $DIR/core/services/directrequest/delegate_test.go: `.Context(t)` $DIR/core/services/directrequest/delegate_test.go: `.service.Start(ctx)` $DIR/core/services/directrequest/delegate_test.go: `.NewAwaiter()` $DIR/core/services/directrequest/delegate_test.go: `.NewAwaiter()` $DIR/core/services/directrequest/delegate_test.go: `.runner.On("Run", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/directrequest/delegate_test.go: `.Run(func(args mock.Arguments) { runBeganAwaiter.ItHappened() ctx := args[0].(context.Context) select { case <-time.After(timeout): t.Fatalf("Timed out waiting for Run to be canceled (%v)", timeout) case <-ctx.Done(): runCancelledAwaiter.ItHappened() } })` $DIR/core/services/directrequest/delegate_test.go: `.ItHappened()` $DIR/core/services/directrequest/delegate_test.go: `.After(timeout)` $DIR/core/services/directrequest/delegate_test.go: `.Done()` $DIR/core/services/directrequest/delegate_test.go: `.ItHappened()` $DIR/core/services/directrequest/delegate_test.go: `.Once()` $DIR/core/services/directrequest/delegate_test.go: `.Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `.listener.HandleLog(ctx, runLog)` $DIR/core/services/directrequest/delegate_test.go: `.AwaitOrFail(t, timeout)` $DIR/core/services/directrequest/delegate_test.go: `.listener.HandleLog(ctx, cancelLog)` $DIR/core/services/directrequest/delegate_test.go: `.AwaitOrFail(t, timeout)` $DIR/core/services/directrequest/delegate_test.go: `.Run("Log has sufficient funds", func(t *testing.T) { cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].MinIncomingConfirmations = ptr[uint32](1) c.EVM[0].MinContractPayment = assets.NewLinkFromJuels(100) }) uni := NewDirectRequestUniverseWithConfig(t, cfg, nil) defer uni.Cleanup() log := log_mocks.NewBroadcast(t) log.On("ReceiptsRoot").Return(common.Hash{}) log.On("TransactionsRoot").Return(common.Hash{}) log.On("StateRoot").Return(common.Hash{}) log.On("EVMChainID").Return(*big.NewInt(0)) uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) logOracleRequest := operator_wrapper.OperatorOracleRequest{ CancelExpiration: big.NewInt(0), Payment: big.NewInt(100), } log.On("RawLog").Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, }) log.On("DecodedLog").Return(&logOracleRequest) log.On("String").Return("") uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) runBeganAwaiter := cltest.NewAwaiter() uni.runner.On("Run", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { runBeganAwaiter.ItHappened() fn := args.Get(4).(func(sqlutil.DataSource) error) require.NoError(t, fn(nil)) }).Once().Return(false, nil) ctx := testutils.Context(t) err := uni.service.Start(ctx) require.NoError(t, err) // check if the job exists under the correct ID drJob, jErr := uni.jobORM.FindJob(ctx, uni.listener.JobID()) require.NoError(t, jErr) require.Equal(t, drJob.ID, uni.listener.JobID()) require.NotNil(t, drJob.DirectRequestSpec) uni.listener.HandleLog(ctx, log) runBeganAwaiter.AwaitOrFail(t, 5*time.Second) uni.service.Close() })` $DIR/core/services/directrequest/delegate_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].MinIncomingConfirmations = ptr[uint32](1) c.EVM[0].MinContractPayment = assets.NewLinkFromJuels(100) })` $DIR/core/services/directrequest/delegate_test.go: `.NewLinkFromJuels(100)` $DIR/core/services/directrequest/delegate_test.go: `.Cleanup()` $DIR/core/services/directrequest/delegate_test.go: `.NewBroadcast(t)` $DIR/core/services/directrequest/delegate_test.go: `.On("ReceiptsRoot")` $DIR/core/services/directrequest/delegate_test.go: `.Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `.On("TransactionsRoot")` $DIR/core/services/directrequest/delegate_test.go: `.Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `.On("StateRoot")` $DIR/core/services/directrequest/delegate_test.go: `.Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `.On("EVMChainID")` $DIR/core/services/directrequest/delegate_test.go: `.Return(*big.NewInt(0))` $DIR/core/services/directrequest/delegate_test.go: `.NewInt(0)` $DIR/core/services/directrequest/delegate_test.go: `.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/directrequest/delegate_test.go: `.Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `.NewInt(0)` $DIR/core/services/directrequest/delegate_test.go: `.NewInt(100)` $DIR/core/services/directrequest/delegate_test.go: `.On("RawLog")` $DIR/core/services/directrequest/delegate_test.go: `.Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, })` $DIR/core/services/directrequest/delegate_test.go: `.spec.ExternalIDEncodeStringToTopic()` $DIR/core/services/directrequest/delegate_test.go: `.On("DecodedLog")` $DIR/core/services/directrequest/delegate_test.go: `.Return(&logOracleRequest)` $DIR/core/services/directrequest/delegate_test.go: `.On("String")` $DIR/core/services/directrequest/delegate_test.go: `.Return("")` $DIR/core/services/directrequest/delegate_test.go: `.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/directrequest/delegate_test.go: `.Return(nil)` $DIR/core/services/directrequest/delegate_test.go: `.NewAwaiter()` $DIR/core/services/directrequest/delegate_test.go: `.runner.On("Run", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/directrequest/delegate_test.go: `.Run(func(args mock.Arguments) { runBeganAwaiter.ItHappened() fn := args.Get(4).(func(sqlutil.DataSource) error) require.NoError(t, fn(nil)) })` $DIR/core/services/directrequest/delegate_test.go: `.ItHappened()` $DIR/core/services/directrequest/delegate_test.go: `.Get(4)` $DIR/core/services/directrequest/delegate_test.go: `.Once()` $DIR/core/services/directrequest/delegate_test.go: `.Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `.Context(t)` $DIR/core/services/directrequest/delegate_test.go: `.service.Start(ctx)` $DIR/core/services/directrequest/delegate_test.go: `.jobORM.FindJob(ctx, uni.listener.JobID())` $DIR/core/services/directrequest/delegate_test.go: `.listener.JobID()` $DIR/core/services/directrequest/delegate_test.go: `.listener.HandleLog(ctx, log)` $DIR/core/services/directrequest/delegate_test.go: `.AwaitOrFail(t, 5*time.Second)` $DIR/core/services/directrequest/delegate_test.go: `.Run("Log has insufficient funds", func(t *testing.T) { cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].MinIncomingConfirmations = ptr[uint32](1) c.EVM[0].MinContractPayment = assets.NewLinkFromJuels(100) }) uni := NewDirectRequestUniverseWithConfig(t, cfg, nil) defer uni.Cleanup() log := log_mocks.NewBroadcast(t) uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) logOracleRequest := operator_wrapper.OperatorOracleRequest{ CancelExpiration: big.NewInt(0), Payment: big.NewInt(99), } log.On("RawLog").Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, }) log.On("DecodedLog").Return(&logOracleRequest) log.On("String").Return("") markConsumedLogAwaiter := cltest.NewAwaiter() uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { markConsumedLogAwaiter.ItHappened() }).Return(nil) ctx := testutils.Context(t) err := uni.service.Start(ctx) require.NoError(t, err) uni.listener.HandleLog(ctx, log) markConsumedLogAwaiter.AwaitOrFail(t, 5*time.Second) uni.service.Close() })` $DIR/core/services/directrequest/delegate_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].MinIncomingConfirmations = ptr[uint32](1) c.EVM[0].MinContractPayment = assets.NewLinkFromJuels(100) })` $DIR/core/services/directrequest/delegate_test.go: `.NewLinkFromJuels(100)` $DIR/core/services/directrequest/delegate_test.go: `.Cleanup()` $DIR/core/services/directrequest/delegate_test.go: `.NewBroadcast(t)` $DIR/core/services/directrequest/delegate_test.go: `.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/directrequest/delegate_test.go: `.Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `.NewInt(0)` $DIR/core/services/directrequest/delegate_test.go: `.NewInt(99)` $DIR/core/services/directrequest/delegate_test.go: `.On("RawLog")` $DIR/core/services/directrequest/delegate_test.go: `.Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, })` $DIR/core/services/directrequest/delegate_test.go: `.spec.ExternalIDEncodeStringToTopic()` $DIR/core/services/directrequest/delegate_test.go: `.On("DecodedLog")` $DIR/core/services/directrequest/delegate_test.go: `.Return(&logOracleRequest)` $DIR/core/services/directrequest/delegate_test.go: `.On("String")` $DIR/core/services/directrequest/delegate_test.go: `.Return("")` $DIR/core/services/directrequest/delegate_test.go: `.NewAwaiter()` $DIR/core/services/directrequest/delegate_test.go: `.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/directrequest/delegate_test.go: `.Run(func(args mock.Arguments) { markConsumedLogAwaiter.ItHappened() })` $DIR/core/services/directrequest/delegate_test.go: `.ItHappened()` $DIR/core/services/directrequest/delegate_test.go: `.Return(nil)` $DIR/core/services/directrequest/delegate_test.go: `.Context(t)` $DIR/core/services/directrequest/delegate_test.go: `.service.Start(ctx)` $DIR/core/services/directrequest/delegate_test.go: `.listener.HandleLog(ctx, log)` $DIR/core/services/directrequest/delegate_test.go: `.AwaitOrFail(t, 5*time.Second)` $DIR/core/services/directrequest/delegate_test.go: `.Run("requesters is specified and log is requested by a whitelisted address", func(t *testing.T) { requester := testutils.NewAddress() cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].MinIncomingConfirmations = ptr[uint32](1) c.EVM[0].MinContractPayment = assets.NewLinkFromJuels(100) }) uni := NewDirectRequestUniverseWithConfig(t, cfg, func(jb *job.Job) { jb.DirectRequestSpec.Requesters = []common.Address{testutils.NewAddress(), requester} }) defer uni.Cleanup() log := log_mocks.NewBroadcast(t) log.On("ReceiptsRoot").Return(common.Hash{}) log.On("TransactionsRoot").Return(common.Hash{}) log.On("StateRoot").Return(common.Hash{}) log.On("EVMChainID").Return(*big.NewInt(0)) uni.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) logOracleRequest := operator_wrapper.OperatorOracleRequest{ CancelExpiration: big.NewInt(0), Payment: big.NewInt(100), Requester: requester, } log.On("RawLog").Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, }) log.On("DecodedLog").Return(&logOracleRequest) log.On("String").Return("") markConsumedLogAwaiter := cltest.NewAwaiter() uni.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { markConsumedLogAwaiter.ItHappened() }).Return(nil) runBeganAwaiter := cltest.NewAwaiter() uni.runner.On("Run", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { runBeganAwaiter.ItHappened() fn := args.Get(4).(func(sqlutil.DataSource) error) require.NoError(t, fn(nil)) }).Once().Return(false, nil) ctx := testutils.Context(t) err := uni.service.Start(ctx) require.NoError(t, err) // check if the job exists under the correct ID drJob, jErr := uni.jobORM.FindJob(ctx, uni.listener.JobID()) require.NoError(t, jErr) require.Equal(t, drJob.ID, uni.listener.JobID()) require.NotNil(t, drJob.DirectRequestSpec) uni.listener.HandleLog(ctx, log) runBeganAwaiter.AwaitOrFail(t, 5*time.Second) uni.service.Close() })` $DIR/core/services/directrequest/delegate_test.go: `.NewAddress()` $DIR/core/services/directrequest/delegate_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].MinIncomingConfirmations = ptr[uint32](1) c.EVM[0].MinContractPayment = assets.NewLinkFromJuels(100) })` $DIR/core/services/directrequest/delegate_test.go: `.NewLinkFromJuels(100)` $DIR/core/services/directrequest/delegate_test.go: `.NewAddress()` $DIR/core/services/directrequest/delegate_test.go: `.Cleanup()` $DIR/core/services/directrequest/delegate_test.go: `.NewBroadcast(t)` $DIR/core/services/directrequest/delegate_test.go: `.On("ReceiptsRoot")` $DIR/core/services/directrequest/delegate_test.go: `.Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `.On("TransactionsRoot")` $DIR/core/services/directrequest/delegate_test.go: `.Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `.On("StateRoot")` $DIR/core/services/directrequest/delegate_test.go: `.Return(common.Hash{})` $DIR/core/services/directrequest/delegate_test.go: `.On("EVMChainID")` $DIR/core/services/directrequest/delegate_test.go: `.Return(*big.NewInt(0))` $DIR/core/services/directrequest/delegate_test.go: `.NewInt(0)` $DIR/core/services/directrequest/delegate_test.go: `.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/directrequest/delegate_test.go: `.Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `.NewInt(0)` $DIR/core/services/directrequest/delegate_test.go: `.NewInt(100)` $DIR/core/services/directrequest/delegate_test.go: `.On("RawLog")` $DIR/core/services/directrequest/delegate_test.go: `.Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, })` $DIR/core/services/directrequest/delegate_test.go: `.spec.ExternalIDEncodeStringToTopic()` $DIR/core/services/directrequest/delegate_test.go: `.On("DecodedLog")` $DIR/core/services/directrequest/delegate_test.go: `.Return(&logOracleRequest)` $DIR/core/services/directrequest/delegate_test.go: `.On("String")` $DIR/core/services/directrequest/delegate_test.go: `.Return("")` $DIR/core/services/directrequest/delegate_test.go: `.NewAwaiter()` $DIR/core/services/directrequest/delegate_test.go: `.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/directrequest/delegate_test.go: `.Run(func(args mock.Arguments) { markConsumedLogAwaiter.ItHappened() })` $DIR/core/services/directrequest/delegate_test.go: `.ItHappened()` $DIR/core/services/directrequest/delegate_test.go: `.Return(nil)` $DIR/core/services/directrequest/delegate_test.go: `.NewAwaiter()` $DIR/core/services/directrequest/delegate_test.go: `.runner.On("Run", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/directrequest/delegate_test.go: `.Run(func(args mock.Arguments) { runBeganAwaiter.ItHappened() fn := args.Get(4).(func(sqlutil.DataSource) error) require.NoError(t, fn(nil)) })` $DIR/core/services/directrequest/delegate_test.go: `.ItHappened()` $DIR/core/services/directrequest/delegate_test.go: `.Get(4)` $DIR/core/services/directrequest/delegate_test.go: `.Once()` $DIR/core/services/directrequest/delegate_test.go: `.Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `.Context(t)` $DIR/core/services/directrequest/delegate_test.go: `.service.Start(ctx)` $DIR/core/services/directrequest/delegate_test.go: `.jobORM.FindJob(ctx, uni.listener.JobID())` $DIR/core/services/directrequest/delegate_test.go: `.listener.JobID()` $DIR/core/services/directrequest/delegate_test.go: `.listener.HandleLog(ctx, log)` $DIR/core/services/directrequest/delegate_test.go: `.AwaitOrFail(t, 5*time.Second)` $DIR/core/services/directrequest/delegate_test.go: `.NewAddress()` $DIR/core/services/directrequest/delegate_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].MinIncomingConfirmations = ptr[uint32](1) c.EVM[0].MinContractPayment = assets.NewLinkFromJuels(100) })` $DIR/core/services/directrequest/delegate_test.go: `.NewLinkFromJuels(100)` $DIR/core/services/directrequest/delegate_test.go: `.NewAddress()` $DIR/core/services/directrequest/delegate_test.go: `.NewAddress()` $DIR/core/services/directrequest/delegate_test.go: `.Cleanup()` $DIR/core/services/directrequest/delegate_test.go: `.NewBroadcast(t)` $DIR/core/services/directrequest/delegate_test.go: `.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/directrequest/delegate_test.go: `.Return(false, nil)` $DIR/core/services/directrequest/delegate_test.go: `.NewInt(0)` $DIR/core/services/directrequest/delegate_test.go: `.NewInt(100)` $DIR/core/services/directrequest/delegate_test.go: `.On("RawLog")` $DIR/core/services/directrequest/delegate_test.go: `.Return(types.Log{ Topics: []common.Hash{ {}, uni.spec.ExternalIDEncodeStringToTopic(), }, })` $DIR/core/services/directrequest/delegate_test.go: `.spec.ExternalIDEncodeStringToTopic()` $DIR/core/services/directrequest/delegate_test.go: `.On("DecodedLog")` $DIR/core/services/directrequest/delegate_test.go: `.Return(&logOracleRequest)` $DIR/core/services/directrequest/delegate_test.go: `.On("String")` $DIR/core/services/directrequest/delegate_test.go: `.Return("")` $DIR/core/services/directrequest/delegate_test.go: `.NewAwaiter()` $DIR/core/services/directrequest/delegate_test.go: `.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/directrequest/delegate_test.go: `.Run(func(args mock.Arguments) { markConsumedLogAwaiter.ItHappened() })` $DIR/core/services/directrequest/delegate_test.go: `.ItHappened()` $DIR/core/services/directrequest/delegate_test.go: `.Return(nil)` $DIR/core/services/directrequest/delegate_test.go: `.Context(t)` $DIR/core/services/directrequest/delegate_test.go: `.service.Start(ctx)` $DIR/core/services/directrequest/delegate_test.go: `.listener.HandleLog(ctx, log)` $DIR/core/services/directrequest/delegate_test.go: `.AwaitOrFail(t, 5*time.Second)` $DIR/core/services/directrequest/validate_test.go: `t.Run("no minIncomingConfirmations specified", func(t *testing.T) { t.Parallel() toml := ` type = "directrequest" schemaVersion = 1 name = "example eth request event spec" ` s, err := ValidatedDirectRequestSpec(toml) require.NoError(t, err) assert.False(t, s.DirectRequestSpec.MinIncomingConfirmations.Valid) })` $DIR/core/services/directrequest/validate_test.go: `.Run("no minIncomingConfirmations specified", func(t *testing.T) { t.Parallel() toml := ` type = "directrequest" schemaVersion = 1 name = "example eth request event spec" ` s, err := ValidatedDirectRequestSpec(toml) require.NoError(t, err) assert.False(t, s.DirectRequestSpec.MinIncomingConfirmations.Valid) })` $DIR/core/services/feeds/connection_manager_test.go: `t.Run(tt.name, func(t *testing.T) { mgr := &connectionsManager{ connections: tt.fields.connections, } if got := mgr.IsConnected(tt.args.id); got != tt.want { t.Errorf("IsConnected() = %v, want %v", got, tt.want) } })` $DIR/core/services/feeds/connection_manager_test.go: `.Run(tt.name, func(t *testing.T) { mgr := &connectionsManager{ connections: tt.fields.connections, } if got := mgr.IsConnected(tt.args.id); got != tt.want { t.Errorf("IsConnected() = %v, want %v", got, tt.want) } })` $DIR/core/services/feeds/connection_manager_test.go: `.IsConnected(tt.args.id)` $DIR/core/services/feeds/models_test.go: `t.Run(tt.name, func(t *testing.T) { ct, err := NewChainType(tt.give) assert.Equal(t, tt.want, ct) if tt.wantErr != nil { assert.EqualError(t, err, tt.wantErr.Error()) } })` $DIR/core/services/feeds/models_test.go: `pt, err = ToPluginType("execute")` $DIR/core/services/feeds/models_test.go: `pt, err = ToPluginType("median")` $DIR/core/services/feeds/models_test.go: `pt, err = ToPluginType("mercury")` $DIR/core/services/feeds/models_test.go: `pt, err = ToPluginType("rebalancer")` $DIR/core/services/feeds/models_test.go: `pt, err = ToPluginType("xxx")` $DIR/core/services/feeds/models_test.go: `t.Run(tt.name, func(t *testing.T) { val, err := tt.give.Value() require.NoError(t, err) actual, ok := val.([]byte) require.True(t, ok) assert.Equal(t, tt.want, string(actual)) })` $DIR/core/services/feeds/models_test.go: `t.Run(tt.name, func(t *testing.T) { var actual OCR1Config err := actual.Scan([]byte(tt.give)) require.NoError(t, err) assert.Equal(t, tt.want, actual) })` $DIR/core/services/feeds/models_test.go: `t.Run(tc.name, func(t *testing.T) { t.Parallel() jp := &JobProposalSpec{Status: tc.status} assert.Equal(t, tc.want, jp.CanEditDefinition()) })` $DIR/core/services/feeds/models_test.go: `.New("invalid chain type")` $DIR/core/services/feeds/models_test.go: `.Run(tt.name, func(t *testing.T) { ct, err := NewChainType(tt.give) assert.Equal(t, tt.want, ct) if tt.wantErr != nil { assert.EqualError(t, err, tt.wantErr.Error()) } })` $DIR/core/services/feeds/models_test.go: `.Value()` $DIR/core/services/feeds/models_test.go: `.Scan([]byte(give))` $DIR/core/services/feeds/models_test.go: `.StringFrom(multiaddr)` $DIR/core/services/feeds/models_test.go: `.StringFrom(p2pPeerID)` $DIR/core/services/feeds/models_test.go: `.StringFrom(keyBundleID)` $DIR/core/services/feeds/models_test.go: `.StringFrom(multiaddr)` $DIR/core/services/feeds/models_test.go: `.StringFromPtr(nil)` $DIR/core/services/feeds/models_test.go: `.StringFromPtr(nil)` $DIR/core/services/feeds/models_test.go: `.StringFromPtr(nil)` $DIR/core/services/feeds/models_test.go: `.StringFrom(p2pPeerID)` $DIR/core/services/feeds/models_test.go: `.StringFrom(keyBundleID)` $DIR/core/services/feeds/models_test.go: `.Run(tt.name, func(t *testing.T) { val, err := tt.give.Value() require.NoError(t, err) actual, ok := val.([]byte) require.True(t, ok) assert.Equal(t, tt.want, string(actual)) })` $DIR/core/services/feeds/models_test.go: `.give.Value()` $DIR/core/services/feeds/models_test.go: `.StringFrom(multiaddr)` $DIR/core/services/feeds/models_test.go: `.StringFrom(p2pPeerID)` $DIR/core/services/feeds/models_test.go: `.StringFrom(keyBundleID)` $DIR/core/services/feeds/models_test.go: `.StringFrom(multiaddr)` $DIR/core/services/feeds/models_test.go: `.StringFromPtr(nil)` $DIR/core/services/feeds/models_test.go: `.StringFromPtr(nil)` $DIR/core/services/feeds/models_test.go: `.StringFromPtr(nil)` $DIR/core/services/feeds/models_test.go: `.StringFrom(p2pPeerID)` $DIR/core/services/feeds/models_test.go: `.StringFrom(keyBundleID)` $DIR/core/services/feeds/models_test.go: `.Run(tt.name, func(t *testing.T) { var actual OCR1Config err := actual.Scan([]byte(tt.give)) require.NoError(t, err) assert.Equal(t, tt.want, actual) })` $DIR/core/services/feeds/models_test.go: `.Scan([]byte(tt.give))` $DIR/core/services/feeds/models_test.go: `.Value()` $DIR/core/services/feeds/models_test.go: `.Scan(give)` $DIR/core/services/feeds/models_test.go: `.StringFrom("multiaddr")` $DIR/core/services/feeds/models_test.go: `.StringFrom("forwarderaddress")` $DIR/core/services/feeds/models_test.go: `.StringFrom("peerid")` $DIR/core/services/feeds/models_test.go: `.StringFrom("ocrkeyid")` $DIR/core/services/feeds/models_test.go: `.Value()` $DIR/core/services/feeds/models_test.go: `.StringFrom("multiaddr")` $DIR/core/services/feeds/models_test.go: `.StringFrom("forwarderaddress")` $DIR/core/services/feeds/models_test.go: `.StringFrom("peerid")` $DIR/core/services/feeds/models_test.go: `.StringFrom("ocrkeyid")` $DIR/core/services/feeds/models_test.go: `.Scan([]byte(give))` $DIR/core/services/feeds/models_test.go: `.Run(tc.name, func(t *testing.T) { t.Parallel() jp := &JobProposalSpec{Status: tc.status} assert.Equal(t, tc.want, jp.CanEditDefinition()) })` $DIR/core/services/feeds/models_test.go: `.toMetrics()` $DIR/core/services/feeds/orm_test.go: `count, err = orm.CountManagers(ctx)` $DIR/core/services/feeds/orm_test.go: `_, err = orm.GetManager(ctx, -1)` $DIR/core/services/feeds/orm_test.go: `err = orm.UpdateManager(ctx, updatedMgr)` $DIR/core/services/feeds/orm_test.go: `assertChainConfigEqual(t, map[string]interface{}{ "feedsManagerID": cfg1.FeedsManagerID, "chainID": cfg1.ChainID, "chainType": cfg1.ChainType, "accountAddress": cfg1.AccountAddress, "accountAddressPublicKey": cfg1.AccountAddressPublicKey, "adminAddress": cfg1.AdminAddress, "fluxMonitorConfig": cfg1.FluxMonitorConfig, "ocrConfig": cfg1.OCR1Config, "ocr2Config": cfg1.OCR2Config, }, *actual)` $DIR/core/services/feeds/orm_test.go: `actual, err = orm.GetChainConfig(ctx, ids[1])` $DIR/core/services/feeds/orm_test.go: `assertChainConfigEqual(t, map[string]interface{}{ "feedsManagerID": cfg2.FeedsManagerID, "chainID": cfg2.ChainID, "chainType": cfg2.ChainType, "accountAddress": cfg2.AccountAddress, "adminAddress": cfg2.AdminAddress, "fluxMonitorConfig": cfg1.FluxMonitorConfig, "ocrConfig": cfg1.OCR1Config, "ocr2Config": cfg1.OCR2Config, }, *actual)` $DIR/core/services/feeds/orm_test.go: `ids, err = orm.CreateBatchChainConfig(ctx, []feeds.ChainConfig{})` $DIR/core/services/feeds/orm_test.go: `_, err = orm.GetChainConfig(ctx, id)` $DIR/core/services/feeds/orm_test.go: `_, err = orm.GetChainConfig(ctx, id)` $DIR/core/services/feeds/orm_test.go: `updateCfg.ID = id` $DIR/core/services/feeds/orm_test.go: `id, err = orm.UpdateChainConfig(ctx, updateCfg)` $DIR/core/services/feeds/orm_test.go: `_, err = orm.CreateJobProposal(ctx, deletedJp)` $DIR/core/services/feeds/orm_test.go: `t.Run("by id", func(t *testing.T) { actual, err := orm.GetJobProposal(ctx, id) require.NoError(t, err) assert.Equal(t, id, actual.ID) assertJobEquals(actual) _, err = orm.GetJobProposal(ctx, int64(0)) require.Error(t, err) })` $DIR/core/services/feeds/orm_test.go: `assertJobEquals(actual)` $DIR/core/services/feeds/orm_test.go: `_, err = orm.GetJobProposal(ctx, int64(0))` $DIR/core/services/feeds/orm_test.go: `assertJobEquals(actual)` $DIR/core/services/feeds/orm_test.go: `_, err = orm.GetJobProposalByRemoteUUID(ctx, deletedUUID)` $DIR/core/services/feeds/orm_test.go: `_, err = orm.GetJobProposalByRemoteUUID(ctx, uuid.New())` $DIR/core/services/feeds/orm_test.go: `createJobProposal(t, orm, feeds.JobProposalStatusPending, fmID)` $DIR/core/services/feeds/orm_test.go: `createJobProposal(t, orm, feeds.JobProposalStatusCancelled, fmID)` $DIR/core/services/feeds/orm_test.go: `_, err = orm.UpsertJobProposal(ctx, &feeds.JobProposal{ RemoteUUID: jUUID, Status: feeds.JobProposalStatusRejected, FeedsManagerID: fmID, })` $DIR/core/services/feeds/orm_test.go: `createJobSpec(t, orm, jpID)` $DIR/core/services/feeds/orm_test.go: `err = orm.ApproveSpec(ctx, specID, jUUID)` $DIR/core/services/feeds/orm_test.go: `err = orm.DeleteProposal(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `t.Run(tc.name, func(t *testing.T) { orm := setupORM(t) counts := tc.before(t, orm) assert.Equal(t, tc.wantPending, counts.Pending) assert.Equal(t, tc.wantApproved, counts.Approved) assert.Equal(t, tc.wantRejected, counts.Rejected) assert.Equal(t, tc.wantCancelled, counts.Cancelled) assert.Equal(t, tc.wantDeleted, counts.Deleted) assert.Equal(t, tc.wantRevoked, counts.Revoked) })` $DIR/core/services/feeds/orm_test.go: `err = orm.UpdateJobProposalStatus(ctx, jpID, feeds.JobProposalStatusRejected)` $DIR/core/services/feeds/orm_test.go: `count, err = orm.CountJobProposals(ctx)` $DIR/core/services/feeds/orm_test.go: `jp.Multiaddrs = pq.StringArray{"dns/example.com"}` $DIR/core/services/feeds/orm_test.go: `jp.Name = null.StringFrom("jp1_updated")` $DIR/core/services/feeds/orm_test.go: `jpID, err = orm.UpsertJobProposal(ctx, jp)` $DIR/core/services/feeds/orm_test.go: `err = orm.ApproveSpec(ctx, specID, externalJobID.UUID)` $DIR/core/services/feeds/orm_test.go: `actual, err = orm.GetJobProposal(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `jp.Multiaddrs = pq.StringArray{"dns/example1.com"}` $DIR/core/services/feeds/orm_test.go: `jp.Name = null.StringFrom("jp1_updated_again")` $DIR/core/services/feeds/orm_test.go: `jp.Status = feeds.JobProposalStatusPending` $DIR/core/services/feeds/orm_test.go: `_, err = orm.UpsertJobProposal(ctx, jp)` $DIR/core/services/feeds/orm_test.go: `actual, err = orm.GetJobProposal(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `err = orm.DeleteProposal(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `actual, err = orm.GetJobProposal(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `jp.Status = feeds.JobProposalStatusRejected` $DIR/core/services/feeds/orm_test.go: `jpID, err = orm.UpsertJobProposal(ctx, jp)` $DIR/core/services/feeds/orm_test.go: `actual, err = orm.GetJobProposal(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `err = orm.ApproveSpec(ctx, specID, externalJobID.UUID)` $DIR/core/services/feeds/orm_test.go: `t.Run(tc.name, func(t *testing.T) { ctx := testutils.Context(t) orm := setupORM(t) jpID, specID := tc.before(t, orm) err := orm.CancelSpec(ctx, specID) if tc.wantErr != "" { require.EqualError(t, err, tc.wantErr) } else { require.NoError(t, err) actual, err := orm.GetSpec(ctx, specID) require.NoError(t, err) assert.Equal(t, specID, actual.ID) assert.Equal(t, tc.wantSpecStatus, actual.Status) actualJP, err := orm.GetJobProposal(ctx, jpID) require.NoError(t, err) assert.Equal(t, tc.wantProposalStatus, actualJP.Status) assert.False(t, actualJP.PendingUpdate) } })` $DIR/core/services/feeds/orm_test.go: `createJobSpec(t, orm, jpID)` $DIR/core/services/feeds/orm_test.go: `_, err = orm.UpsertJobProposal(ctx, &feeds.JobProposal{ RemoteUUID: jp.RemoteUUID, Status: feeds.JobProposalStatusPending, FeedsManagerID: fmID, })` $DIR/core/services/feeds/orm_test.go: `_, err = orm.CreateSpec(ctx, feeds.JobProposalSpec{ Definition: "spec data", Version: 2, Status: feeds.SpecStatusPending, JobProposalID: jpID, })` $DIR/core/services/feeds/orm_test.go: `createJobSpec(t, orm, jpID)` $DIR/core/services/feeds/orm_test.go: `createJobSpec(t, orm, jpID)` $DIR/core/services/feeds/orm_test.go: `t.Run(tc.name, func(t *testing.T) { ctx := testutils.Context(t) orm := setupORM(t) jpID := tc.before(t, orm) err := orm.DeleteProposal(ctx, jpID) if tc.wantErr != "" { require.EqualError(t, err, tc.wantErr) } else { require.NoError(t, err) actual, err := orm.GetJobProposal(ctx, jpID) require.NoError(t, err) assert.Equal(t, jpID, actual.ID) assert.Equal(t, tc.wantProposalStatus, actual.Status) assert.Equal(t, tc.wantProposalPendingUpdate, actual.PendingUpdate) } })` $DIR/core/services/feeds/orm_test.go: `t.Run(tc.name, func(t *testing.T) { ctx := testutils.Context(t) orm := setupORM(t) jpID, specID := tc.before(t, orm) err := orm.RevokeSpec(ctx, specID) if tc.wantErr != "" { require.EqualError(t, err, tc.wantErr) } else { require.NoError(t, err) actualJP, err := orm.GetJobProposal(ctx, jpID) require.NoError(t, err) assert.Equal(t, tc.wantProposalStatus, actualJP.Status) assert.False(t, actualJP.PendingUpdate) assert.Equal(t, jpID, actualJP.ID) assert.Equal(t, tc.wantProposalStatus, actualJP.Status) assert.Equal(t, tc.wantPendingUpdate, actualJP.PendingUpdate) } })` $DIR/core/services/feeds/orm_test.go: `createJobSpec(t, orm, jpID)` $DIR/core/services/feeds/orm_test.go: `exists, err = orm.ExistsSpecByJobProposalIDAndVersion(ctx, jpID, 2)` $DIR/core/services/feeds/orm_test.go: `err = orm.CancelSpec(ctx, specID)` $DIR/core/services/feeds/orm_test.go: `_, err = orm.GetApprovedSpec(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `_ = createJobSpec(t, orm, jpID)` $DIR/core/services/feeds/orm_test.go: `createJobSpec(t, orm, jp1ID)` $DIR/core/services/feeds/orm_test.go: `createJobSpec(t, orm, jp2ID)` $DIR/core/services/feeds/orm_test.go: `actual = specs[1]` $DIR/core/services/feeds/orm_test.go: `t.Run(tc.name, func(t *testing.T) { ctx := testutils.Context(t) orm := setupORM(t) jpID, specID := tc.before(t, orm) err := orm.RejectSpec(ctx, specID) if tc.wantErr != "" { require.EqualError(t, err, tc.wantErr) } else { require.NoError(t, err) actual, err := orm.GetSpec(ctx, specID) require.NoError(t, err) assert.Equal(t, specID, actual.ID) assert.Equal(t, tc.wantSpecStatus, actual.Status) actualJP, err := orm.GetJobProposal(ctx, jpID) require.NoError(t, err) assert.Equal(t, tc.wantProposalStatus, actualJP.Status) assert.False(t, actualJP.PendingUpdate) } })` $DIR/core/services/feeds/orm_test.go: `err = orm.UpdateSpecDefinition(ctx, specID, "updated spec")` $DIR/core/services/feeds/orm_test.go: `err = orm.UpdateSpecDefinition(ctx, -1, "updated spec")` $DIR/core/services/feeds/orm_test.go: `err = orm.ApproveSpec(ctx, specID, externalJobID.UUID)` $DIR/core/services/feeds/orm_test.go: `isManaged, err = orm.IsJobManaged(ctx, int64(j.ID))` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.CountManagers(ctx)` $DIR/core/services/feeds/orm_test.go: `.CreateManager(ctx, mgr)` $DIR/core/services/feeds/orm_test.go: `.CountManagers(ctx)` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.CreateManager(ctx, mgr)` $DIR/core/services/feeds/orm_test.go: `.GetManager(ctx, id)` $DIR/core/services/feeds/orm_test.go: `.GetManager(ctx, -1)` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.CreateManager(ctx, mgr)` $DIR/core/services/feeds/orm_test.go: `.ListManagers(ctx)` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.CreateManager(ctx, mgr)` $DIR/core/services/feeds/orm_test.go: `.ListManagersByIDs(ctx, []int64{id})` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.CreateManager(ctx, mgr)` $DIR/core/services/feeds/orm_test.go: `.PublicKey([]byte("22222222222222222222222222222222"))` $DIR/core/services/feeds/orm_test.go: `.UpdateManager(ctx, updatedMgr)` $DIR/core/services/feeds/orm_test.go: `.GetManager(ctx, id)` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.StringFrom("0x0002")` $DIR/core/services/feeds/orm_test.go: `.StringFrom("p2pkey")` $DIR/core/services/feeds/orm_test.go: `.StringFrom("ocrkey")` $DIR/core/services/feeds/orm_test.go: `.StringFrom("dns/4")` $DIR/core/services/feeds/orm_test.go: `.CreateChainConfig(ctx, cfg1)` $DIR/core/services/feeds/orm_test.go: `.GetChainConfig(ctx, id)` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.StringFrom("0x0002")` $DIR/core/services/feeds/orm_test.go: `.CreateBatchChainConfig(ctx, []feeds.ChainConfig{cfg1, cfg2})` $DIR/core/services/feeds/orm_test.go: `.GetChainConfig(ctx, ids[0])` $DIR/core/services/feeds/orm_test.go: `.GetChainConfig(ctx, ids[1])` $DIR/core/services/feeds/orm_test.go: `.CreateBatchChainConfig(ctx, []feeds.ChainConfig{})` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.CreateChainConfig(ctx, cfg1)` $DIR/core/services/feeds/orm_test.go: `.GetChainConfig(ctx, id)` $DIR/core/services/feeds/orm_test.go: `.DeleteChainConfig(ctx, id)` $DIR/core/services/feeds/orm_test.go: `.GetChainConfig(ctx, id)` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.StringFrom("0x0002")` $DIR/core/services/feeds/orm_test.go: `.StringFrom("p2pkey")` $DIR/core/services/feeds/orm_test.go: `.StringFrom("ocrkey")` $DIR/core/services/feeds/orm_test.go: `.StringFrom("dns/4")` $DIR/core/services/feeds/orm_test.go: `.CreateChainConfig(ctx, cfg1)` $DIR/core/services/feeds/orm_test.go: `.ListChainConfigsByManagerIDs(ctx, []int64{fmID})` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.NewString("", false)` $DIR/core/services/feeds/orm_test.go: `.StringFrom("0x0002")` $DIR/core/services/feeds/orm_test.go: `.StringFrom("p2pkey")` $DIR/core/services/feeds/orm_test.go: `.StringFrom("ocrkey")` $DIR/core/services/feeds/orm_test.go: `.StringFrom("dns/4")` $DIR/core/services/feeds/orm_test.go: `.CreateChainConfig(ctx, cfg1)` $DIR/core/services/feeds/orm_test.go: `.UpdateChainConfig(ctx, updateCfg)` $DIR/core/services/feeds/orm_test.go: `.GetChainConfig(ctx, id)` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.StringFrom("jp1")` $DIR/core/services/feeds/orm_test.go: `.New()` $DIR/core/services/feeds/orm_test.go: `.CountJobProposals(ctx)` $DIR/core/services/feeds/orm_test.go: `.CreateJobProposal(ctx, jp)` $DIR/core/services/feeds/orm_test.go: `.GetJobProposal(ctx, id)` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.New()` $DIR/core/services/feeds/orm_test.go: `.New()` $DIR/core/services/feeds/orm_test.go: `.StringFrom("jp1")` $DIR/core/services/feeds/orm_test.go: `.CreateJobProposal(ctx, jp)` $DIR/core/services/feeds/orm_test.go: `.CreateJobProposal(ctx, deletedJp)` $DIR/core/services/feeds/orm_test.go: `.Run("by id", func(t *testing.T) { actual, err := orm.GetJobProposal(ctx, id) require.NoError(t, err) assert.Equal(t, id, actual.ID) assertJobEquals(actual) _, err = orm.GetJobProposal(ctx, int64(0)) require.Error(t, err) })` $DIR/core/services/feeds/orm_test.go: `.GetJobProposal(ctx, id)` $DIR/core/services/feeds/orm_test.go: `.GetJobProposal(ctx, int64(0))` $DIR/core/services/feeds/orm_test.go: `.GetJobProposalByRemoteUUID(ctx, remoteUUID)` $DIR/core/services/feeds/orm_test.go: `.GetJobProposalByRemoteUUID(ctx, deletedUUID)` $DIR/core/services/feeds/orm_test.go: `.GetJobProposalByRemoteUUID(ctx, uuid.New())` $DIR/core/services/feeds/orm_test.go: `.New()` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.New()` $DIR/core/services/feeds/orm_test.go: `.StringFrom("jp1")` $DIR/core/services/feeds/orm_test.go: `.CreateJobProposal(ctx, jp)` $DIR/core/services/feeds/orm_test.go: `.ListJobProposals(ctx)` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.CountJobProposalsByStatus(ctx)` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.CountJobProposalsByStatus(ctx)` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.New()` $DIR/core/services/feeds/orm_test.go: `.CreateJobProposal(ctx, &feeds.JobProposal{ RemoteUUID: jUUID, Status: feeds.JobProposalStatusPending, FeedsManagerID: fmID, })` $DIR/core/services/feeds/orm_test.go: `.UpsertJobProposal(ctx, &feeds.JobProposal{ RemoteUUID: jUUID, Status: feeds.JobProposalStatusRejected, FeedsManagerID: fmID, })` $DIR/core/services/feeds/orm_test.go: `.GetJobProposal(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `.CountJobProposalsByStatus(ctx)` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.New()` $DIR/core/services/feeds/orm_test.go: `.ApproveSpec(ctx, specID, jUUID)` $DIR/core/services/feeds/orm_test.go: `.CountJobProposalsByStatus(ctx)` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.RevokeSpec(ctx, specID)` $DIR/core/services/feeds/orm_test.go: `.CountJobProposalsByStatus(ctx)` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.DeleteProposal(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `.CountJobProposalsByStatus(ctx)` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.New()` $DIR/core/services/feeds/orm_test.go: `.CreateJobProposal(ctx, &feeds.JobProposal{ RemoteUUID: jUUID, Status: feeds.JobProposalStatusPending, FeedsManagerID: fmID, PendingUpdate: true, })` $DIR/core/services/feeds/orm_test.go: `.ApproveSpec(ctx, specID, jUUID)` $DIR/core/services/feeds/orm_test.go: `.DeleteProposal(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `.CountJobProposalsByStatus(ctx)` $DIR/core/services/feeds/orm_test.go: `.Run(tc.name, func(t *testing.T) { orm := setupORM(t) counts := tc.before(t, orm) assert.Equal(t, tc.wantPending, counts.Pending) assert.Equal(t, tc.wantApproved, counts.Approved) assert.Equal(t, tc.wantRejected, counts.Rejected) assert.Equal(t, tc.wantCancelled, counts.Cancelled) assert.Equal(t, tc.wantDeleted, counts.Deleted) assert.Equal(t, tc.wantRevoked, counts.Revoked) })` $DIR/core/services/feeds/orm_test.go: `.before(t, orm)` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.New()` $DIR/core/services/feeds/orm_test.go: `.StringFrom("jp1")` $DIR/core/services/feeds/orm_test.go: `.CreateJobProposal(ctx, jp)` $DIR/core/services/feeds/orm_test.go: `.ListJobProposalsByManagersIDs(ctx, []int64{fmID})` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.GetJobProposal(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `.UpdateJobProposalStatus(ctx, jpID, feeds.JobProposalStatusRejected)` $DIR/core/services/feeds/orm_test.go: `.GetJobProposal(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.StringFrom("jp1")` $DIR/core/services/feeds/orm_test.go: `.New()` $DIR/core/services/feeds/orm_test.go: `.New()` $DIR/core/services/feeds/orm_test.go: `.CountJobProposals(ctx)` $DIR/core/services/feeds/orm_test.go: `.UpsertJobProposal(ctx, jp)` $DIR/core/services/feeds/orm_test.go: `.GetJobProposal(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `.CountJobProposals(ctx)` $DIR/core/services/feeds/orm_test.go: `.StringFrom("jp1_updated")` $DIR/core/services/feeds/orm_test.go: `.UpsertJobProposal(ctx, jp)` $DIR/core/services/feeds/orm_test.go: `.GetJobProposal(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `.ApproveSpec(ctx, specID, externalJobID.UUID)` $DIR/core/services/feeds/orm_test.go: `.GetJobProposal(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `.StringFrom("jp1_updated_again")` $DIR/core/services/feeds/orm_test.go: `.UpsertJobProposal(ctx, jp)` $DIR/core/services/feeds/orm_test.go: `.GetJobProposal(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `.DeleteProposal(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `.GetJobProposal(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `.UpsertJobProposal(ctx, jp)` $DIR/core/services/feeds/orm_test.go: `.GetJobProposal(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.New()` $DIR/core/services/feeds/orm_test.go: `.CreateJobProposal(ctx, &feeds.JobProposal{ RemoteUUID: uuid.New(), Status: feeds.JobProposalStatusPending, FeedsManagerID: fmID, PendingUpdate: true, })` $DIR/core/services/feeds/orm_test.go: `.New()` $DIR/core/services/feeds/orm_test.go: `.ApproveSpec(ctx, specID, externalJobID.UUID)` $DIR/core/services/feeds/orm_test.go: `.GetSpec(ctx, specID)` $DIR/core/services/feeds/orm_test.go: `.GetJobProposal(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `.Run(tc.name, func(t *testing.T) { ctx := testutils.Context(t) orm := setupORM(t) jpID, specID := tc.before(t, orm) err := orm.CancelSpec(ctx, specID) if tc.wantErr != "" { require.EqualError(t, err, tc.wantErr) } else { require.NoError(t, err) actual, err := orm.GetSpec(ctx, specID) require.NoError(t, err) assert.Equal(t, specID, actual.ID) assert.Equal(t, tc.wantSpecStatus, actual.Status) actualJP, err := orm.GetJobProposal(ctx, jpID) require.NoError(t, err) assert.Equal(t, tc.wantProposalStatus, actualJP.Status) assert.False(t, actualJP.PendingUpdate) } })` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.before(t, orm)` $DIR/core/services/feeds/orm_test.go: `.CancelSpec(ctx, specID)` $DIR/core/services/feeds/orm_test.go: `.GetSpec(ctx, specID)` $DIR/core/services/feeds/orm_test.go: `.GetJobProposal(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.New()` $DIR/core/services/feeds/orm_test.go: `.ApproveSpec(ctx, specID, externalJobID.UUID)` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.New()` $DIR/core/services/feeds/orm_test.go: `.ApproveSpec(ctx, specID, externalJobID.UUID)` $DIR/core/services/feeds/orm_test.go: `.GetJobProposal(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `.UpsertJobProposal(ctx, &feeds.JobProposal{ RemoteUUID: jp.RemoteUUID, Status: feeds.JobProposalStatusPending, FeedsManagerID: fmID, })` $DIR/core/services/feeds/orm_test.go: `.CreateSpec(ctx, feeds.JobProposalSpec{ Definition: "spec data", Version: 2, Status: feeds.SpecStatusPending, JobProposalID: jpID, })` $DIR/core/services/feeds/orm_test.go: `.Run(tc.name, func(t *testing.T) { ctx := testutils.Context(t) orm := setupORM(t) jpID := tc.before(t, orm) err := orm.DeleteProposal(ctx, jpID) if tc.wantErr != "" { require.EqualError(t, err, tc.wantErr) } else { require.NoError(t, err) actual, err := orm.GetJobProposal(ctx, jpID) require.NoError(t, err) assert.Equal(t, jpID, actual.ID) assert.Equal(t, tc.wantProposalStatus, actual.Status) assert.Equal(t, tc.wantProposalPendingUpdate, actual.PendingUpdate) } })` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.before(t, orm)` $DIR/core/services/feeds/orm_test.go: `.DeleteProposal(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `.GetJobProposal(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.New()` $DIR/core/services/feeds/orm_test.go: `.ApproveSpec(ctx, specID, externalJobID.UUID)` $DIR/core/services/feeds/orm_test.go: `.Run(tc.name, func(t *testing.T) { ctx := testutils.Context(t) orm := setupORM(t) jpID, specID := tc.before(t, orm) err := orm.RevokeSpec(ctx, specID) if tc.wantErr != "" { require.EqualError(t, err, tc.wantErr) } else { require.NoError(t, err) actualJP, err := orm.GetJobProposal(ctx, jpID) require.NoError(t, err) assert.Equal(t, tc.wantProposalStatus, actualJP.Status) assert.False(t, actualJP.PendingUpdate) assert.Equal(t, jpID, actualJP.ID) assert.Equal(t, tc.wantProposalStatus, actualJP.Status) assert.Equal(t, tc.wantPendingUpdate, actualJP.PendingUpdate) } })` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.before(t, orm)` $DIR/core/services/feeds/orm_test.go: `.RevokeSpec(ctx, specID)` $DIR/core/services/feeds/orm_test.go: `.GetJobProposal(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.ExistsSpecByJobProposalIDAndVersion(ctx, jpID, 1)` $DIR/core/services/feeds/orm_test.go: `.ExistsSpecByJobProposalIDAndVersion(ctx, jpID, 2)` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.GetSpec(ctx, specID)` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.New()` $DIR/core/services/feeds/orm_test.go: `.ApproveSpec(ctx, specID, externalJobID.UUID)` $DIR/core/services/feeds/orm_test.go: `.GetApprovedSpec(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `.CancelSpec(ctx, specID)` $DIR/core/services/feeds/orm_test.go: `.GetApprovedSpec(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.CreateSpec(ctx, feeds.JobProposalSpec{ Definition: "spec data", Version: 2, Status: feeds.SpecStatusPending, JobProposalID: jpID, })` $DIR/core/services/feeds/orm_test.go: `.GetSpec(ctx, spec2ID)` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.ListSpecsByJobProposalIDs(ctx, []int64{jp1ID, jp2ID})` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.New()` $DIR/core/services/feeds/orm_test.go: `.ApproveSpec(ctx, specID, externalJobID.UUID)` $DIR/core/services/feeds/orm_test.go: `.Run(tc.name, func(t *testing.T) { ctx := testutils.Context(t) orm := setupORM(t) jpID, specID := tc.before(t, orm) err := orm.RejectSpec(ctx, specID) if tc.wantErr != "" { require.EqualError(t, err, tc.wantErr) } else { require.NoError(t, err) actual, err := orm.GetSpec(ctx, specID) require.NoError(t, err) assert.Equal(t, specID, actual.ID) assert.Equal(t, tc.wantSpecStatus, actual.Status) actualJP, err := orm.GetJobProposal(ctx, jpID) require.NoError(t, err) assert.Equal(t, tc.wantProposalStatus, actualJP.Status) assert.False(t, actualJP.PendingUpdate) } })` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.before(t, orm)` $DIR/core/services/feeds/orm_test.go: `.RejectSpec(ctx, specID)` $DIR/core/services/feeds/orm_test.go: `.GetSpec(ctx, specID)` $DIR/core/services/feeds/orm_test.go: `.GetJobProposal(ctx, jpID)` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.GetSpec(ctx, specID)` $DIR/core/services/feeds/orm_test.go: `.UpdateSpecDefinition(ctx, specID, "updated spec")` $DIR/core/services/feeds/orm_test.go: `.GetSpec(ctx, specID)` $DIR/core/services/feeds/orm_test.go: `.UpdateSpecDefinition(ctx, -1, "updated spec")` $DIR/core/services/feeds/orm_test.go: `.Context(t)` $DIR/core/services/feeds/orm_test.go: `.New()` $DIR/core/services/feeds/orm_test.go: `.IsJobManaged(ctx, int64(j.ID))` $DIR/core/services/feeds/orm_test.go: `.ApproveSpec(ctx, specID, externalJobID.UUID)` $DIR/core/services/feeds/orm_test.go: `.IsJobManaged(ctx, int64(j.ID))` $DIR/core/services/feeds/rpc_handlers_test.go: `h.svc. On("ProposeJob", ctx, &feeds.ProposeJobArgs{ FeedsManagerID: h.feedsManagerID, RemoteUUID: jobID, Spec: spec, Version: int32(version), }). Return(int64(1), nil)` $DIR/core/services/feeds/rpc_handlers_test.go: `h.svc. On("DeleteJob", ctx, &feeds.DeleteJobArgs{ FeedsManagerID: h.feedsManagerID, RemoteUUID: jobID, }). Return(int64(1), nil)` $DIR/core/services/feeds/rpc_handlers_test.go: `h.svc. On("RevokeJob", ctx, &feeds.RevokeJobArgs{ FeedsManagerID: h.feedsManagerID, RemoteUUID: jobID, }). Return(int64(1), nil)` $DIR/core/services/feeds/rpc_handlers_test.go: `.Context(t)` $DIR/core/services/feeds/rpc_handlers_test.go: `.New()` $DIR/core/services/feeds/rpc_handlers_test.go: `.New()` $DIR/core/services/feeds/rpc_handlers_test.go: `.Sprintf(FluxMonitorTestSpecTemplate, nameAndExternalJobID, nameAndExternalJobID)` $DIR/core/services/feeds/rpc_handlers_test.go: `.svc. On("ProposeJob", ctx, &feeds.ProposeJobArgs{ FeedsManagerID: h.feedsManagerID, RemoteUUID: jobID, Spec: spec, Version: int32(version), })` $DIR/core/services/feeds/rpc_handlers_test.go: `. Return(int64(1), nil)` $DIR/core/services/feeds/rpc_handlers_test.go: `.ProposeJob(ctx, &pb.ProposeJobRequest{ Id: jobID.String(), Spec: spec, Version: version, })` $DIR/core/services/feeds/rpc_handlers_test.go: `.String()` $DIR/core/services/feeds/rpc_handlers_test.go: `.Context(t)` $DIR/core/services/feeds/rpc_handlers_test.go: `.New()` $DIR/core/services/feeds/rpc_handlers_test.go: `.svc. On("DeleteJob", ctx, &feeds.DeleteJobArgs{ FeedsManagerID: h.feedsManagerID, RemoteUUID: jobID, })` $DIR/core/services/feeds/rpc_handlers_test.go: `. Return(int64(1), nil)` $DIR/core/services/feeds/rpc_handlers_test.go: `.DeleteJob(ctx, &pb.DeleteJobRequest{ Id: jobID.String(), })` $DIR/core/services/feeds/rpc_handlers_test.go: `.String()` $DIR/core/services/feeds/rpc_handlers_test.go: `.Context(t)` $DIR/core/services/feeds/rpc_handlers_test.go: `.New()` $DIR/core/services/feeds/rpc_handlers_test.go: `.svc. On("RevokeJob", ctx, &feeds.RevokeJobArgs{ FeedsManagerID: h.feedsManagerID, RemoteUUID: jobID, })` $DIR/core/services/feeds/rpc_handlers_test.go: `. Return(int64(1), nil)` $DIR/core/services/feeds/rpc_handlers_test.go: `.RevokeJob(ctx, &pb.RevokeJobRequest{ Id: jobID.String(), })` $DIR/core/services/feeds/rpc_handlers_test.go: `.String()` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountManagers", mock.Anything).Return(int64(0), nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CreateManager", mock.Anything, &mgr, mock.Anything). Return(id, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CreateBatchChainConfig", mock.Anything, params.ChainConfigs, mock.Anything). Return([]int64{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.csaKeystore.On("GetAll").Return([]csakey.KeyV2{key}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ListManagers", testutils.Context(t)).Return([]feeds.FeedsManager{mgr}, nil).Maybe()` $DIR/core/services/feeds/service_test.go: `transactCall.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)}` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("Connect", mock.IsType(feeds.ConnectOpts{}))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ListManagers", mock.Anything).Return(mgrs, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("IsConnected", mgr.ID).Return(false)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetManager", mock.Anything, id). Return(&mgr, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("IsConnected", mgr.ID).Return(false)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("UpdateManager", mock.Anything, mgr, mock.Anything).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.csaKeystore.On("GetAll").Return([]csakey.KeyV2{key}, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("Disconnect", mgr.ID).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("Connect", mock.IsType(feeds.ConnectOpts{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ListManagersByIDs", mock.Anything, []int64{mgr.ID}). Return(mgrs, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("IsConnected", mgr.ID).Return(false)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountManagers", mock.Anything). Return(count, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CreateChainConfig", mock.Anything, cfg).Return(int64(1), nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetManager", mock.Anything, mgr.ID).Return(&mgr, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", mgr.ID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ListChainConfigsByManagerIDs", mock.Anything, []int64{mgr.ID}).Return([]feeds.ChainConfig{cfg}, nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("UpdateNode", mock.Anything, &proto.UpdateNodeRequest{ Version: nodeVersion.Version, ChainConfigs: []*proto.ChainConfig{ { Chain: &proto.Chain{ Id: cfg.ChainID, Type: proto.ChainType_CHAIN_TYPE_EVM, }, AccountAddress: cfg.AccountAddress, AccountAddressPublicKey: &cfg.AccountAddressPublicKey.String, AdminAddress: cfg.AdminAddress, FluxMonitorConfig: &proto.FluxMonitorConfig{Enabled: true}, Ocr1Config: &proto.OCR1Config{Enabled: false}, Ocr2Config: &proto.OCR2Config{Enabled: false}, }, }, }).Return(&proto.UpdateNodeResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetChainConfig", mock.Anything, cfg.ID).Return(&cfg, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("DeleteChainConfig", mock.Anything, cfg.ID).Return(cfg.ID, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetManager", mock.Anything, mgr.ID).Return(&mgr, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", mgr.ID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ListChainConfigsByManagerIDs", mock.Anything, []int64{mgr.ID}).Return([]feeds.ChainConfig{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("UpdateNode", mock.Anything, &proto.UpdateNodeRequest{ Version: nodeVersion.Version, ChainConfigs: []*proto.ChainConfig{}, }).Return(&proto.UpdateNodeResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ListChainConfigsByManagerIDs", mock.Anything, ids).Return([]feeds.ChainConfig{cfg}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("UpdateChainConfig", mock.Anything, cfg).Return(int64(1), nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetChainConfig", mock.Anything, cfg.ID).Return(&cfg, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", mgr.ID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ListChainConfigsByManagerIDs", mock.Anything, []int64{mgr.ID}).Return([]feeds.ChainConfig{cfg}, nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("UpdateNode", mock.Anything, &proto.UpdateNodeRequest{ Version: nodeVersion.Version, ChainConfigs: []*proto.ChainConfig{ { Chain: &proto.Chain{ Id: cfg.ChainID, Type: proto.ChainType_CHAIN_TYPE_EVM, }, AccountAddress: cfg.AccountAddress, AdminAddress: cfg.AdminAddress, AccountAddressPublicKey: &cfg.AccountAddressPublicKey.String, FluxMonitorConfig: &proto.FluxMonitorConfig{Enabled: false}, Ocr1Config: &proto.OCR1Config{Enabled: false}, Ocr2Config: &proto.OCR2Config{Enabled: false}, }, }, }).Return(&proto.UpdateNodeResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposalByRemoteUUID", mock.Anything, argsWF.RemoteUUID).Return(new(feeds.JobProposal), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("UpsertJobProposal", mock.Anything, &jpWF).Return(proposalIDWF, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CreateSpec", mock.Anything, proposalSpecWF).Return(jobProposalSpecIdWF, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `transactCall.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)}` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", argsWF.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetSpec(mock.Anything, jobProposalSpecIdWF).Return(&autoApprovableProposalSpecWF, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetJobProposal(mock.Anything, autoApprovableProposalSpecWF.JobProposalID).Return(&acceptedjpWF, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, mock.Anything).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobIDByWorkflow", mock.Anything, mock.Anything).Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.WorkflowSpec.WorkflowOwner == wfOwner }), ). Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 }). Return(nil)` $DIR/core/services/feeds/service_test.go: `(args.Get(2).(*job.Job)).ID = 1` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ApproveSpec", mock.Anything, jobProposalSpecIdWF, mock.IsType(uuid.UUID{}), ).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jpWF.RemoteUUID.String(), Version: int64(proposalSpecWF.Version), }, ).Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposalByRemoteUUID", mock.Anything, argsWF.RemoteUUID).Return(new(feeds.JobProposal), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("UpsertJobProposal", mock.Anything, &jpWF).Return(proposalIDWF, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CreateSpec", mock.Anything, proposalSpecWF).Return(jobProposalSpecIdWF, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `transactCall.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)}` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", argsWF.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetSpec(mock.Anything, jobProposalSpecIdWF).Return(&autoApprovableProposalSpecWF, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetJobProposal(mock.Anything, autoApprovableProposalSpecWF.JobProposalID).Return(&acceptedjpWF, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, mock.Anything).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobIDByWorkflow", mock.Anything, mock.Anything).Return(jobIDWF, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetApprovedSpec", mock.Anything, acceptedjpWF.ID).Return(&autoApprovableProposalSpecWF, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CancelSpec", mock.Anything, autoApprovableProposalSpecWF.ID).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.spawner.On("DeleteJob", mock.Anything, mock.Anything, jobIDWF).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.WorkflowSpec.WorkflowOwner == wfOwner }), ). Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 }). Return(nil)` $DIR/core/services/feeds/service_test.go: `(args.Get(2).(*job.Job)).ID = 1` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ApproveSpec", mock.Anything, jobProposalSpecIdWF, mock.IsType(uuid.UUID{}), ).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jpWF.RemoteUUID.String(), Version: int64(proposalSpecWF.Version), }, ).Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposalByRemoteUUID", mock.Anything, argsWF.RemoteUUID).Return(new(feeds.JobProposal), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("UpsertJobProposal", mock.Anything, &jpWF).Return(proposalIDWF, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CreateSpec", mock.Anything, proposalSpecWF).Return(jobProposalSpecIdWF, nil)` $DIR/core/services/feeds/service_test.go: `transactCall.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)}` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", argsWF.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetSpec(mock.Anything, jobProposalSpecIdWF).Return(&proposalSpecWF, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetJobProposal(mock.Anything, proposalSpecWF.JobProposalID).Return(&jpWF, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, mock.Anything).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobIDByWorkflow", mock.Anything, mock.Anything).Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.WorkflowSpec.WorkflowOwner == wfOwner }), ). Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 }). Return(fmt.Errorf("error creating job"))` $DIR/core/services/feeds/service_test.go: `(args.Get(2).(*job.Job)).ID = 1` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposalByRemoteUUID", mock.Anything, jpFluxMonitor.RemoteUUID).Return(new(feeds.JobProposal), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("UpsertJobProposal", mock.Anything, &jpFluxMonitor).Return(idFluxMonitor, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CreateSpec", mock.Anything, specFluxMonitor).Return(int64(100), nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `transactCall.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)}` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposalByRemoteUUID", mock.Anything, jpOCR1.RemoteUUID).Return(new(feeds.JobProposal), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("UpsertJobProposal", mock.Anything, &jpOCR1).Return(idOCR1, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CreateSpec", mock.Anything, specOCR1).Return(int64(100), nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `transactCall.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)}` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposalByRemoteUUID", mock.Anything, jpOCR2.RemoteUUID).Return(new(feeds.JobProposal), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("UpsertJobProposal", mock.Anything, &jpOCR2).Return(idOCR2, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CreateSpec", mock.Anything, specOCR2).Return(int64(100), nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `transactCall.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)}` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposalByRemoteUUID", mock.Anything, jpBootstrap.RemoteUUID).Return(new(feeds.JobProposal), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("UpsertJobProposal", mock.Anything, &jpBootstrap).Return(idBootstrap, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CreateSpec", mock.Anything, specBootstrap).Return(int64(102), nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `transactCall.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)}` $DIR/core/services/feeds/service_test.go: `svc.orm. On("GetJobProposalByRemoteUUID", mock.Anything, jpFluxMonitor.RemoteUUID). Return(&feeds.JobProposal{ FeedsManagerID: jpFluxMonitor.FeedsManagerID, RemoteUUID: jpFluxMonitor.RemoteUUID, Status: feeds.JobProposalStatusPending, }, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ExistsSpecByJobProposalIDAndVersion", mock.Anything, jpFluxMonitor.ID, argsFluxMonitor.Version).Return(false, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("UpsertJobProposal", mock.Anything, &jpFluxMonitor).Return(idFluxMonitor, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CreateSpec", mock.Anything, specFluxMonitor).Return(int64(100), nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `transactCall.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)}` $DIR/core/services/feeds/service_test.go: `svc.orm. On("GetJobProposalByRemoteUUID", mock.Anything, jpFluxMonitor.RemoteUUID). Return(&feeds.JobProposal{ FeedsManagerID: 2, RemoteUUID: jpFluxMonitor.RemoteUUID, }, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm. On("GetJobProposalByRemoteUUID", mock.Anything, jpFluxMonitor.RemoteUUID). Return(&feeds.JobProposal{ FeedsManagerID: jpFluxMonitor.FeedsManagerID, RemoteUUID: jpFluxMonitor.RemoteUUID, Status: feeds.JobProposalStatusPending, }, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ExistsSpecByJobProposalIDAndVersion", mock.Anything, jpFluxMonitor.ID, argsFluxMonitor.Version).Return(true, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposalByRemoteUUID", mock.Anything, jpFluxMonitor.RemoteUUID).Return(new(feeds.JobProposal), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("UpsertJobProposal", mock.Anything, &jpFluxMonitor).Return(int64(0), errors.New("orm error"))` $DIR/core/services/feeds/service_test.go: `transactCall.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)}` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposalByRemoteUUID", mock.Anything, jpFluxMonitor.RemoteUUID).Return(new(feeds.JobProposal), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("UpsertJobProposal", mock.Anything, &jpFluxMonitor).Return(idFluxMonitor, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CreateSpec", mock.Anything, specFluxMonitor).Return(int64(0), errors.New("orm error"))` $DIR/core/services/feeds/service_test.go: `transactCall.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)}` $DIR/core/services/feeds/service_test.go: `t.Run(tc.name, func(t *testing.T) { t.Parallel() svc := setupTestServiceCfg(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.JobPipeline.HTTPRequest.DefaultTimeout = &httpTimeout c.OCR.Enabled = testutils.Ptr(true) c.OCR2.Enabled = testutils.Ptr(true) }) if tc.before != nil { tc.before(svc) } actual, err := svc.ProposeJob(testutils.Context(t), tc.args) if tc.wantErr != "" { require.Error(t, err) assert.Contains(t, err.Error(), tc.wantErr) } else { require.NoError(t, err) assert.Equal(t, tc.wantID, actual) } })` $DIR/core/services/feeds/service_test.go: `c.JobPipeline.HTTPRequest.DefaultTimeout = &httpTimeout` $DIR/core/services/feeds/service_test.go: `c.OCR.Enabled = testutils.Ptr(true)` $DIR/core/services/feeds/service_test.go: `c.OCR2.Enabled = testutils.Ptr(true)` $DIR/core/services/feeds/service_test.go: `tc.before(svc)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposalByRemoteUUID", mock.Anything, approved.RemoteUUID).Return(&approved, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("DeleteProposal", mock.Anything, approved.ID).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm. On("GetJobProposalByRemoteUUID", mock.Anything, approved.RemoteUUID). Return(&feeds.JobProposal{ FeedsManagerID: 2, RemoteUUID: approved.RemoteUUID, Status: feeds.JobProposalStatusApproved, }, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposalByRemoteUUID", mock.Anything, approved.RemoteUUID).Return(nil, errors.New("orm error"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposalByRemoteUUID", mock.Anything, approved.RemoteUUID).Return(nil, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposalByRemoteUUID", mock.Anything, approved.RemoteUUID).Return(&approved, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("DeleteProposal", mock.Anything, approved.ID).Return(errors.New("orm error"))` $DIR/core/services/feeds/service_test.go: `t.Run(tc.name, func(t *testing.T) { t.Parallel() svc := setupTestServiceCfg(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.JobPipeline.HTTPRequest.DefaultTimeout = &httpTimeout }) if tc.before != nil { tc.before(svc) } _, err := svc.DeleteJob(testutils.Context(t), tc.args) if tc.wantErr != "" { require.Error(t, err) assert.Contains(t, err.Error(), tc.wantErr) } else { require.NoError(t, err) } })` $DIR/core/services/feeds/service_test.go: `c.JobPipeline.HTTPRequest.DefaultTimeout = &httpTimeout` $DIR/core/services/feeds/service_test.go: `tc.before(svc)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposalByRemoteUUID", mock.Anything, pendingProposal.RemoteUUID).Return(pendingProposal, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetLatestSpec", mock.Anything, pendingSpec.JobProposalID).Return(pendingSpec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("RevokeSpec", mock.Anything, pendingSpec.ID).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposalByRemoteUUID", mock.Anything, pendingProposal.RemoteUUID).Return(pendingProposal, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetLatestSpec", mock.Anything, pendingSpec.JobProposalID).Return(&feeds.JobProposalSpec{ ID: 20, Status: feeds.SpecStatusCancelled, JobProposalID: pendingProposal.ID, Version: 1, Definition: defn, }, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("RevokeSpec", mock.Anything, pendingSpec.ID).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm. On("GetJobProposalByRemoteUUID", mock.Anything, pendingProposal.RemoteUUID). Return(&feeds.JobProposal{ FeedsManagerID: 2, RemoteUUID: pendingProposal.RemoteUUID, Status: feeds.JobProposalStatusApproved, }, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposalByRemoteUUID", mock.Anything, pendingProposal.RemoteUUID).Return(nil, errors.New("orm error"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposalByRemoteUUID", mock.Anything, pendingProposal.RemoteUUID).Return(nil, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposalByRemoteUUID", mock.Anything, pendingProposal.RemoteUUID).Return(pendingProposal, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetLatestSpec", mock.Anything, pendingSpec.JobProposalID).Return(nil, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposalByRemoteUUID", mock.Anything, pendingProposal.RemoteUUID).Return(pendingProposal, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetLatestSpec", mock.Anything, pendingSpec.JobProposalID).Return(&feeds.JobProposalSpec{ ID: 20, Status: feeds.SpecStatusApproved, JobProposalID: pendingProposal.ID, Version: 1, Definition: defn, }, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposalByRemoteUUID", mock.Anything, pendingProposal.RemoteUUID).Return(pendingProposal, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetLatestSpec", mock.Anything, pendingSpec.JobProposalID).Return(&feeds.JobProposalSpec{ ID: 20, Status: feeds.SpecStatusRejected, JobProposalID: pendingProposal.ID, Version: 1, Definition: defn, }, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposalByRemoteUUID", mock.Anything, pendingProposal.RemoteUUID).Return(pendingProposal, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetLatestSpec", mock.Anything, pendingSpec.JobProposalID).Return(&feeds.JobProposalSpec{ ID: 20, Status: feeds.SpecStatusRevoked, JobProposalID: pendingProposal.ID, Version: 1, Definition: defn, }, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposalByRemoteUUID", mock.Anything, pendingProposal.RemoteUUID).Return(&feeds.JobProposal{ ID: 1, FeedsManagerID: 1, RemoteUUID: remoteUUID, Status: feeds.JobProposalStatusDeleted, }, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetLatestSpec", mock.Anything, pendingSpec.JobProposalID).Return(pendingSpec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposalByRemoteUUID", mock.Anything, pendingProposal.RemoteUUID).Return(pendingProposal, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetLatestSpec", mock.Anything, pendingSpec.JobProposalID).Return(pendingSpec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("RevokeSpec", mock.Anything, pendingSpec.ID).Return(errors.New("orm error"))` $DIR/core/services/feeds/service_test.go: `t.Run(tc.name, func(t *testing.T) { t.Parallel() svc := setupTestServiceCfg(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.OCR2.Enabled = testutils.Ptr(true) c.JobPipeline.HTTPRequest.DefaultTimeout = &httpTimeout }) if tc.before != nil { tc.before(svc) } _, err := svc.RevokeJob(testutils.Context(t), tc.args) if tc.wantErr != "" { require.Error(t, err) assert.Contains(t, err.Error(), tc.wantErr) } else { require.NoError(t, err) } })` $DIR/core/services/feeds/service_test.go: `c.OCR2.Enabled = testutils.Ptr(true)` $DIR/core/services/feeds/service_test.go: `c.JobPipeline.HTTPRequest.DefaultTimeout = &httpTimeout` $DIR/core/services/feeds/service_test.go: `tc.before(svc)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", mgr.ID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ListChainConfigsByManagerIDs", mock.Anything, []int64{mgr.ID}).Return(chainConfigs, nil)` $DIR/core/services/feeds/service_test.go: `svc.p2pKeystore.On("Get", p2pKey.PeerID()).Return(p2pKey, nil)` $DIR/core/services/feeds/service_test.go: `svc.ocr1Keystore.On("Get", ocrKey.GetID()).Return(ocrKey, nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("UpdateNode", mock.Anything, &proto.UpdateNodeRequest{ Version: nodeVersion.Version, ChainConfigs: []*proto.ChainConfig{ { Chain: &proto.Chain{ Id: ccfg.ChainID, Type: proto.ChainType_CHAIN_TYPE_EVM, }, AccountAddress: ccfg.AccountAddress, AdminAddress: ccfg.AdminAddress, FluxMonitorConfig: &proto.FluxMonitorConfig{Enabled: true}, Ocr1Config: &proto.OCR1Config{ Enabled: true, IsBootstrap: ccfg.OCR1Config.IsBootstrap, P2PKeyBundle: &proto.OCR1Config_P2PKeyBundle{ PeerId: p2pKey.PeerID().String(), PublicKey: p2pKey.PublicKeyHex(), }, OcrKeyBundle: &proto.OCR1Config_OCRKeyBundle{ BundleId: ocrKey.GetID(), ConfigPublicKey: ocrkey.ConfigPublicKey(ocrKey.PublicKeyConfig()).String(), OffchainPublicKey: ocrKey.OffChainSigning.PublicKey().String(), OnchainSigningAddress: ocrKey.OnChainSigning.Address().String(), }, }, Ocr2Config: &proto.OCR2Config{ Enabled: true, IsBootstrap: ccfg.OCR2Config.IsBootstrap, Multiaddr: multiaddr, ForwarderAddress: &forwarderAddr, Plugins: &proto.OCR2Config_Plugins{ Commit: ccfg.OCR2Config.Plugins.Commit, Execute: ccfg.OCR2Config.Plugins.Execute, Median: ccfg.OCR2Config.Plugins.Median, Mercury: ccfg.OCR2Config.Plugins.Mercury, Rebalancer: ccfg.OCR2Config.Plugins.Rebalancer, }, }, }, }, }).Return(&proto.UpdateNodeResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `err = svc.SyncNodeInfo(testutils.Context(t), mgr.ID)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("IsJobManaged", mock.Anything, jobID).Return(true, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ListJobProposals", mock.Anything). Return(jps, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ListJobProposalsByManagersIDs", mock.Anything, fmIDs). Return(jps, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, id). Return(&ms, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CancelSpec", mock.Anything, spec.ID).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(j, nil)` $DIR/core/services/feeds/service_test.go: `svc.spawner.On("DeleteJob", mock.Anything, mock.Anything, j.ID).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("CancelledJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.CancelledJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, ).Return(&proto.CancelledJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(&feeds.JobProposal{ ID: 1, RemoteUUID: externalJobID, FeedsManagerID: 100, }, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CancelSpec", mock.Anything, spec.ID).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("CancelledJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.CancelledJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, ).Return(&proto.CancelledJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CancelSpec", mock.Anything, spec.ID).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("CancelledJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.CancelledJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, ).Return(&proto.CancelledJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(nil, errors.New("Not Found"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, pspec.ID, mock.Anything).Return(pspec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(nil, errors.New("Not Found"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(nil, errors.New("Not Connected"))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CancelSpec", mock.Anything, spec.ID).Return(errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CancelSpec", mock.Anything, spec.ID).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CancelSpec", mock.Anything, spec.ID).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(j, nil)` $DIR/core/services/feeds/service_test.go: `svc.spawner.On("DeleteJob", mock.Anything, mock.Anything, j.ID).Return(errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CancelSpec", mock.Anything, spec.ID).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(j, nil)` $DIR/core/services/feeds/service_test.go: `svc.spawner.On("DeleteJob", mock.Anything, mock.Anything, j.ID).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("CancelledJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.CancelledJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, ).Return(nil, errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `t.Run(tc.name, func(t *testing.T) { t.Parallel() svc := setupTestService(t) if tc.before != nil { tc.before(svc) } err := svc.CancelSpec(testutils.Context(t), tc.specID) if tc.wantErr != "" { require.Error(t, err) assert.EqualError(t, err, tc.wantErr) return } require.NoError(t, err) })` $DIR/core/services/feeds/service_test.go: `tc.before(svc)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, id). Return(&spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ListSpecsByJobProposalIDs", mock.Anything, []int64{jpID}). Return(specs, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetSpec(mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetJobProposal(mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobIDByAddress", mock.Anything, address, evmChainID, mock.Anything).Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), ). Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 }). Return(nil)` $DIR/core/services/feeds/service_test.go: `(args.Get(2).(*job.Job)).ID = 1` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ApproveSpec", mock.Anything, spec.ID, mock.IsType(uuid.UUID{}), ).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, ).Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, cancelledSpec.ID).Return(cancelledSpec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetLatestSpec", mock.Anything, cancelledSpec.JobProposalID).Return(cancelledSpec, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobIDByAddress", mock.Anything, address, evmChainID, mock.Anything).Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), ). Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 }). Return(nil)` $DIR/core/services/feeds/service_test.go: `(args.Get(2).(*job.Job)).ID = 1` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ApproveSpec", mock.Anything, cancelledSpec.ID, externalJobID, ).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, ).Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetSpec(mock.Anything, spec.ID).Return(spec2, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetJobProposal(mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(&feeds.JobProposal{ ID: 1, Status: feeds.JobProposalStatusRevoked, }, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(&feeds.JobProposal{ ID: jp.ID, Status: feeds.JobProposalStatusDeleted, }, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, aspec.ID, mock.Anything).Return(aspec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, cancelledSpec.ID, mock.Anything).Return(rejectedSpec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, cancelledSpec.ID, mock.Anything).Return(cancelledSpec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetLatestSpec", mock.Anything, cancelledSpec.JobProposalID).Return(&feeds.JobProposalSpec{ ID: 21, Status: feeds.SpecStatusPending, JobProposalID: jp.ID, Version: 2, Definition: defn, }, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(j, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobIDByAddress", mock.Anything, address, evmChainID, mock.Anything).Return(j.ID, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetSpec(mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetJobProposal(mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(j, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetApprovedSpec(mock.Anything, jp.ID).Return(nil, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.spawner.On("DeleteJob", mock.Anything, mock.Anything, j.ID).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), ). Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 }). Return(nil)` $DIR/core/services/feeds/service_test.go: `(args.Get(2).(*job.Job)).ID = 1` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, ).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, ).Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetSpec(mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetJobProposal(mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobIDByAddress", mock.Anything, address, evmChainID, mock.Anything).Return(j.ID, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetApprovedSpec(mock.Anything, jp.ID).Return(nil, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.spawner.On("DeleteJob", mock.Anything, mock.Anything, j.ID).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), ). Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 }). Return(nil)` $DIR/core/services/feeds/service_test.go: `(args.Get(2).(*job.Job)).ID = 1` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, ).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, ).Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetSpec(mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetJobProposal(mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobIDByAddress", mock.Anything, address, evmChainID, mock.Anything).Return(j.ID, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetApprovedSpec(mock.Anything, jp.ID).Return(&feeds.JobProposalSpec{ID: 100}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().CancelSpec(mock.Anything, int64(100)).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.spawner.On("DeleteJob", mock.Anything, mock.Anything, j.ID).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), ). Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 }). Return(nil)` $DIR/core/services/feeds/service_test.go: `(args.Get(2).(*job.Job)).ID = 1` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, ).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, ).Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(nil, errors.New("Not Found"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(nil, errors.New("Not Found"))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(errors.New("bridges do not exist"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(nil, errors.New("Not Connected"))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetSpec(mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetJobProposal(mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(j, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetApprovedSpec(mock.Anything, jp.ID).Return(nil, errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetSpec(mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetJobProposal(mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobIDByAddress", mock.Anything, address, evmChainID, mock.Anything).Return(j.ID, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetApprovedSpec(mock.Anything, jp.ID).Return(nil, errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetSpec(mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetJobProposal(mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(j, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetApprovedSpec(mock.Anything, jp.ID).Return(&feeds.JobProposalSpec{ID: 100}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().CancelSpec(mock.Anything, int64(100)).Return(errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetSpec(mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetJobProposal(mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobIDByAddress", mock.Anything, address, evmChainID, mock.Anything).Return(j.ID, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetApprovedSpec(mock.Anything, jp.ID).Return(&feeds.JobProposalSpec{ID: 100}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().CancelSpec(mock.Anything, int64(100)).Return(errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobIDByAddress", mock.Anything, address, evmChainID, mock.Anything).Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), ). Return(errors.New("could not save"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobIDByAddress", mock.Anything, address, evmChainID, mock.Anything).Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), ). Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 }). Return(nil)` $DIR/core/services/feeds/service_test.go: `(args.Get(2).(*job.Job)).ID = 1` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, ).Return(errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobIDByAddress", mock.Anything, address, evmChainID, mock.Anything).Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), ). Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 }). Return(nil)` $DIR/core/services/feeds/service_test.go: `(args.Get(2).(*job.Job)).ID = 1` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, ).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, ).Return(nil, errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `t.Run(tc.name, func(t *testing.T) { svc := setupTestServiceCfg(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.OCR2.Enabled = testutils.Ptr(true) if tc.httpTimeout != nil { c.JobPipeline.HTTPRequest.DefaultTimeout = tc.httpTimeout } }) if tc.before != nil { tc.before(svc) } err := svc.ApproveSpec(ctx, tc.id, tc.force) if tc.wantErr != "" { require.Error(t, err) assert.EqualError(t, err, tc.wantErr) } else { require.NoError(t, err) } })` $DIR/core/services/feeds/service_test.go: `c.OCR2.Enabled = testutils.Ptr(true)` $DIR/core/services/feeds/service_test.go: `c.JobPipeline.HTTPRequest.DefaultTimeout = tc.httpTimeout` $DIR/core/services/feeds/service_test.go: `tc.before(svc)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil)).Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), ). Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 }). Return(nil)` $DIR/core/services/feeds/service_test.go: `(args.Get(2).(*job.Job)).ID = 1` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, ).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, ).Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, cancelledSpec.ID, mock.Anything).Return(cancelledSpec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetLatestSpec", mock.Anything, cancelledSpec.JobProposalID).Return(cancelledSpec, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil)).Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), ). Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 }). Return(nil)` $DIR/core/services/feeds/service_test.go: `(args.Get(2).(*job.Job)).ID = 1` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ApproveSpec", mock.Anything, cancelledSpec.ID, externalJobID, ).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, ).Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, cancelledSpec.ID, mock.Anything).Return(cancelledSpec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetLatestSpec", mock.Anything, cancelledSpec.JobProposalID).Return(&feeds.JobProposalSpec{ ID: 21, Status: feeds.SpecStatusPending, JobProposalID: jp.ID, Version: 2, Definition: defn, }, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, cancelledSpec.ID, mock.Anything).Return(rejectedSpec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil)).Return(j.ID, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetApprovedSpec(mock.Anything, jp.ID).Return(nil, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil)).Return(j.ID, nil)` $DIR/core/services/feeds/service_test.go: `svc.spawner.On("DeleteJob", mock.Anything, mock.Anything, j.ID).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), ). Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 }). Return(nil)` $DIR/core/services/feeds/service_test.go: `(args.Get(2).(*job.Job)).ID = 1` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, ).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, ).Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(&feeds.JobProposalSpec{ ID: 20, Status: feeds.SpecStatusPending, JobProposalID: jp.ID, Version: 1, Definition: fmt.Sprintf(defn2, externalJobID.String(), &feedID), }, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetApprovedSpec(mock.Anything, jp.ID).Return(nil, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, &feedID).Return(j.ID, nil)` $DIR/core/services/feeds/service_test.go: `svc.spawner.On("DeleteJob", mock.Anything, mock.Anything, j.ID).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), ). Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 }). Return(nil)` $DIR/core/services/feeds/service_test.go: `(args.Get(2).(*job.Job)).ID = 1` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, ).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, ).Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetApprovedSpec(mock.Anything, jp.ID).Return(&feeds.JobProposalSpec{ID: 100}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().CancelSpec(mock.Anything, int64(100)).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil)).Return(j.ID, nil)` $DIR/core/services/feeds/service_test.go: `svc.spawner.On("DeleteJob", mock.Anything, mock.Anything, j.ID).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), ). Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 }). Return(nil)` $DIR/core/services/feeds/service_test.go: `(args.Get(2).(*job.Job)).ID = 1` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, ).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, ).Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(nil, errors.New("Not Found"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(aspec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, rspec.ID, mock.Anything).Return(rspec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(nil, errors.New("Not Found"))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(errors.New("bridges do not exist"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(nil, errors.New("Not Connected"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil)).Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), ). Return(errors.New("could not save"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil)).Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), ). Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 }). Return(nil)` $DIR/core/services/feeds/service_test.go: `(args.Get(2).(*job.Job)).ID = 1` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, ).Return(errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil)).Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), ). Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 }). Return(nil)` $DIR/core/services/feeds/service_test.go: `(args.Get(2).(*job.Job)).ID = 1` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, ).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, ).Return(nil, errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `t.Run(tc.name, func(t *testing.T) { svc := setupTestServiceCfg(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.OCR2.Enabled = testutils.Ptr(true) if tc.httpTimeout != nil { c.JobPipeline.HTTPRequest.DefaultTimeout = tc.httpTimeout } }) if tc.before != nil { tc.before(svc) } err := svc.ApproveSpec(ctx, tc.id, tc.force) if tc.wantErr != "" { require.Error(t, err) assert.EqualError(t, err, tc.wantErr) } else { require.NoError(t, err) } })` $DIR/core/services/feeds/service_test.go: `c.OCR2.Enabled = testutils.Ptr(true)` $DIR/core/services/feeds/service_test.go: `c.JobPipeline.HTTPRequest.DefaultTimeout = tc.httpTimeout` $DIR/core/services/feeds/service_test.go: `tc.before(svc)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil)).Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), ). Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 }). Return(nil)` $DIR/core/services/feeds/service_test.go: `(args.Get(2).(*job.Job)).ID = 1` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, ).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, ).Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, cancelledSpec.ID, mock.Anything).Return(cancelledSpec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetLatestSpec", mock.Anything, cancelledSpec.JobProposalID).Return(cancelledSpec, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil)).Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), ). Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 }). Return(nil)` $DIR/core/services/feeds/service_test.go: `(args.Get(2).(*job.Job)).ID = 1` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ApproveSpec", mock.Anything, cancelledSpec.ID, externalJobID, ).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, ).Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, cancelledSpec.ID, mock.Anything).Return(cancelledSpec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetLatestSpec", mock.Anything, cancelledSpec.JobProposalID).Return(&feeds.JobProposalSpec{ ID: 21, Status: feeds.SpecStatusPending, JobProposalID: jp.ID, Version: 2, Definition: defn, }, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, cancelledSpec.ID, mock.Anything).Return(rejectedSpec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil)).Return(j.ID, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetApprovedSpec(mock.Anything, jp.ID).Return(nil, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil)).Return(j.ID, nil)` $DIR/core/services/feeds/service_test.go: `svc.spawner.On("DeleteJob", mock.Anything, mock.Anything, j.ID).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), ). Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 }). Return(nil)` $DIR/core/services/feeds/service_test.go: `(args.Get(2).(*job.Job)).ID = 1` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, ).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, ).Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(&feeds.JobProposalSpec{ ID: 20, Status: feeds.SpecStatusPending, JobProposalID: jp.ID, Version: 1, Definition: fmt.Sprintf(defn2, externalJobID.String(), feedID), }, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetApprovedSpec(mock.Anything, jp.ID).Return(nil, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, &feedID).Return(j.ID, nil)` $DIR/core/services/feeds/service_test.go: `svc.spawner.On("DeleteJob", mock.Anything, mock.Anything, j.ID).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), ). Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 }). Return(nil)` $DIR/core/services/feeds/service_test.go: `(args.Get(2).(*job.Job)).ID = 1` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, ).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, ).Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().GetApprovedSpec(mock.Anything, jp.ID).Return(&feeds.JobProposalSpec{ID: 100}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.EXPECT().CancelSpec(mock.Anything, int64(100)).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil)).Return(j.ID, nil)` $DIR/core/services/feeds/service_test.go: `svc.spawner.On("DeleteJob", mock.Anything, mock.Anything, j.ID).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), ). Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 }). Return(nil)` $DIR/core/services/feeds/service_test.go: `(args.Get(2).(*job.Job)).ID = 1` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, ).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, ).Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(nil, errors.New("Not Found"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(aspec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, rspec.ID).Return(rspec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(nil, errors.New("Not Found"))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(errors.New("bridges do not exist"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(nil, errors.New("Not Connected"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil)).Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), ). Return(errors.New("could not save"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil), mock.Anything).Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), ). Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 }). Return(nil)` $DIR/core/services/feeds/service_test.go: `(args.Get(2).(*job.Job)).ID = 1` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, ).Return(errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{})).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil)).Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), ). Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 }). Return(nil)` $DIR/core/services/feeds/service_test.go: `(args.Get(2).(*job.Job)).ID = 1` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, ).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, ).Return(nil, errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("WithDataSource", mock.Anything).Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `svc.jobORM.On("WithDataSource", mock.Anything).Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `t.Run(tc.name, func(t *testing.T) { svc := setupTestServiceCfg(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.OCR2.Enabled = testutils.Ptr(true) if tc.httpTimeout != nil { c.JobPipeline.HTTPRequest.DefaultTimeout = tc.httpTimeout } }) if tc.before != nil { tc.before(svc) } err := svc.ApproveSpec(ctx, tc.id, tc.force) if tc.wantErr != "" { require.Error(t, err) assert.EqualError(t, err, tc.wantErr) } else { require.NoError(t, err) } })` $DIR/core/services/feeds/service_test.go: `c.OCR2.Enabled = testutils.Ptr(true)` $DIR/core/services/feeds/service_test.go: `c.JobPipeline.HTTPRequest.DefaultTimeout = tc.httpTimeout` $DIR/core/services/feeds/service_test.go: `tc.before(svc)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("RejectSpec", mock.Anything, spec.ID, ).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient.On("RejectedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.RejectedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, ).Return(&proto.RejectedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `transactCall.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)}` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(nil, errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(&feeds.JobProposalSpec{ Status: feeds.SpecStatusRejected, }, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(nil, errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(nil, errors.New("disconnected"))` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("RejectSpec", mock.Anything, mock.Anything).Return(errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `transactCall.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)}` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("GetClient", jp.FeedsManagerID).Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("RejectSpec", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.fmsClient. On("RejectedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.RejectedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }). Return(nil, errors.New("rpc failure"))` $DIR/core/services/feeds/service_test.go: `transactCall.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)}` $DIR/core/services/feeds/service_test.go: `t.Run(tc.name, func(t *testing.T) { t.Parallel() svc := setupTestService(t) if tc.before != nil { tc.before(svc) } err := svc.RejectSpec(ctx, spec.ID) if tc.wantErr != "" { require.Error(t, err) assert.Contains(t, err.Error(), tc.wantErr) } else { require.NoError(t, err) } })` $DIR/core/services/feeds/service_test.go: `tc.before(svc)` $DIR/core/services/feeds/service_test.go: `svc.orm. On("GetSpec", mock.Anything, specID, mock.Anything). Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("UpdateSpecDefinition", mock.Anything, specID, updatedSpec, mock.Anything, ).Return(nil)` $DIR/core/services/feeds/service_test.go: `svc.orm. On("GetSpec", mock.Anything, specID, mock.Anything). Return(nil, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `svc.orm. On("GetSpec", mock.Anything, specID, mock.Anything). Return(nil, errors.New("other db error"))` $DIR/core/services/feeds/service_test.go: `svc.orm. On("GetSpec", mock.Anything, specID, mock.Anything). Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `t.Run(tc.name, func(t *testing.T) { t.Parallel() svc := setupTestService(t) if tc.before != nil { tc.before(svc) } err := svc.UpdateSpecDefinition(ctx, tc.specID, updatedSpec) if tc.wantErr != "" { assert.EqualError(t, err, tc.wantErr) } else { require.NoError(t, err) } })` $DIR/core/services/feeds/service_test.go: `tc.before(svc)` $DIR/core/services/feeds/service_test.go: `svc.csaKeystore.On("GetAll").Return([]csakey.KeyV2{key}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ListManagers", mock.Anything).Return([]feeds.FeedsManager{mgr}, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("IsConnected", mgr.ID).Return(false)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("Connect", mock.IsType(feeds.ConnectOpts{}))` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("Close")` $DIR/core/services/feeds/service_test.go: `svc.orm.On("CountJobProposalsByStatus", mock.Anything).Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.csaKeystore.On("GetAll").Return([]csakey.KeyV2{key}, nil)` $DIR/core/services/feeds/service_test.go: `svc.orm.On("ListManagers", mock.Anything).Return([]feeds.FeedsManager{}, nil)` $DIR/core/services/feeds/service_test.go: `svc.connMgr.On("Close")` $DIR/core/services/feeds/service_test.go: `t.Run(tt.name, func(t *testing.T) { t.Parallel() svc := setupTestService(t) if tt.beforeFunc != nil { tt.beforeFunc(svc) } servicetest.Run(t, svc) })` $DIR/core/services/feeds/service_test.go: `tt.beforeFunc(svc)` $DIR/core/services/feeds/service_test.go: `servicetest.Run(t, svc)` $DIR/core/services/feeds/service_test.go: `.Decode([]byte(pubKeyHex), pubKey)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountManagers", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(int64(0), nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CreateManager", mock.Anything, &mgr, mock.Anything)` $DIR/core/services/feeds/service_test.go: `. Return(id, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CreateBatchChainConfig", mock.Anything, params.ChainConfigs, mock.Anything)` $DIR/core/services/feeds/service_test.go: `. Return([]int64{}, nil)` $DIR/core/services/feeds/service_test.go: `.csaKeystore.On("GetAll")` $DIR/core/services/feeds/service_test.go: `.Return([]csakey.KeyV2{key}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ListManagers", testutils.Context(t))` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.Return([]feeds.FeedsManager{mgr}, nil)` $DIR/core/services/feeds/service_test.go: `.Maybe()` $DIR/core/services/feeds/service_test.go: `.orm.On("Transact", mock.Anything, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `.connMgr.On("Connect", mock.IsType(feeds.ConnectOpts{}))` $DIR/core/services/feeds/service_test.go: `.IsType(feeds.ConnectOpts{})` $DIR/core/services/feeds/service_test.go: `.RegisterManager(testutils.Context(t), params)` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.orm.On("ListManagers", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(mgrs, nil)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("IsConnected", mgr.ID)` $DIR/core/services/feeds/service_test.go: `.Return(false)` $DIR/core/services/feeds/service_test.go: `.ListManagers(ctx)` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetManager", mock.Anything, id)` $DIR/core/services/feeds/service_test.go: `. Return(&mgr, nil)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("IsConnected", mgr.ID)` $DIR/core/services/feeds/service_test.go: `.Return(false)` $DIR/core/services/feeds/service_test.go: `.GetManager(ctx, id)` $DIR/core/services/feeds/service_test.go: `.orm.On("UpdateManager", mock.Anything, mgr, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.csaKeystore.On("GetAll")` $DIR/core/services/feeds/service_test.go: `.Return([]csakey.KeyV2{key}, nil)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("Disconnect", mgr.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("Connect", mock.IsType(feeds.ConnectOpts{}))` $DIR/core/services/feeds/service_test.go: `.IsType(feeds.ConnectOpts{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.UpdateManager(testutils.Context(t), mgr)` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.orm.On("ListManagersByIDs", mock.Anything, []int64{mgr.ID})` $DIR/core/services/feeds/service_test.go: `. Return(mgrs, nil)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("IsConnected", mgr.ID)` $DIR/core/services/feeds/service_test.go: `.Return(false)` $DIR/core/services/feeds/service_test.go: `.ListManagersByIDs(ctx, []int64{mgr.ID})` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountManagers", mock.Anything)` $DIR/core/services/feeds/service_test.go: `. Return(count, nil)` $DIR/core/services/feeds/service_test.go: `.CountManagers(ctx)` $DIR/core/services/feeds/service_test.go: `.StringFrom("0x0000000000000000000000000000000000000002")` $DIR/core/services/feeds/service_test.go: `.orm.On("CreateChainConfig", mock.Anything, cfg)` $DIR/core/services/feeds/service_test.go: `.Return(int64(1), nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetManager", mock.Anything, mgr.ID)` $DIR/core/services/feeds/service_test.go: `.Return(&mgr, nil)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", mgr.ID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ListChainConfigsByManagerIDs", mock.Anything, []int64{mgr.ID})` $DIR/core/services/feeds/service_test.go: `.Return([]feeds.ChainConfig{cfg}, nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("UpdateNode", mock.Anything, &proto.UpdateNodeRequest{ Version: nodeVersion.Version, ChainConfigs: []*proto.ChainConfig{ { Chain: &proto.Chain{ Id: cfg.ChainID, Type: proto.ChainType_CHAIN_TYPE_EVM, }, AccountAddress: cfg.AccountAddress, AccountAddressPublicKey: &cfg.AccountAddressPublicKey.String, AdminAddress: cfg.AdminAddress, FluxMonitorConfig: &proto.FluxMonitorConfig{Enabled: true}, Ocr1Config: &proto.OCR1Config{Enabled: false}, Ocr2Config: &proto.OCR2Config{Enabled: false}, }, }, })` $DIR/core/services/feeds/service_test.go: `.Return(&proto.UpdateNodeResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `.CreateChainConfig(testutils.Context(t), cfg)` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.CreateChainConfig(testutils.Context(t), cfg)` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetChainConfig", mock.Anything, cfg.ID)` $DIR/core/services/feeds/service_test.go: `.Return(&cfg, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("DeleteChainConfig", mock.Anything, cfg.ID)` $DIR/core/services/feeds/service_test.go: `.Return(cfg.ID, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetManager", mock.Anything, mgr.ID)` $DIR/core/services/feeds/service_test.go: `.Return(&mgr, nil)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", mgr.ID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ListChainConfigsByManagerIDs", mock.Anything, []int64{mgr.ID})` $DIR/core/services/feeds/service_test.go: `.Return([]feeds.ChainConfig{}, nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("UpdateNode", mock.Anything, &proto.UpdateNodeRequest{ Version: nodeVersion.Version, ChainConfigs: []*proto.ChainConfig{}, })` $DIR/core/services/feeds/service_test.go: `.Return(&proto.UpdateNodeResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `.DeleteChainConfig(testutils.Context(t), cfg.ID)` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.orm.On("ListChainConfigsByManagerIDs", mock.Anything, ids)` $DIR/core/services/feeds/service_test.go: `.Return([]feeds.ChainConfig{cfg}, nil)` $DIR/core/services/feeds/service_test.go: `.ListChainConfigsByManagerIDs(ctx, ids)` $DIR/core/services/feeds/service_test.go: `.StringFrom("0x0000000000000000000000000000000000000002")` $DIR/core/services/feeds/service_test.go: `.orm.On("UpdateChainConfig", mock.Anything, cfg)` $DIR/core/services/feeds/service_test.go: `.Return(int64(1), nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetChainConfig", mock.Anything, cfg.ID)` $DIR/core/services/feeds/service_test.go: `.Return(&cfg, nil)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", mgr.ID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ListChainConfigsByManagerIDs", mock.Anything, []int64{mgr.ID})` $DIR/core/services/feeds/service_test.go: `.Return([]feeds.ChainConfig{cfg}, nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("UpdateNode", mock.Anything, &proto.UpdateNodeRequest{ Version: nodeVersion.Version, ChainConfigs: []*proto.ChainConfig{ { Chain: &proto.Chain{ Id: cfg.ChainID, Type: proto.ChainType_CHAIN_TYPE_EVM, }, AccountAddress: cfg.AccountAddress, AdminAddress: cfg.AdminAddress, AccountAddressPublicKey: &cfg.AccountAddressPublicKey.String, FluxMonitorConfig: &proto.FluxMonitorConfig{Enabled: false}, Ocr1Config: &proto.OCR1Config{Enabled: false}, Ocr2Config: &proto.OCR2Config{Enabled: false}, }, }, })` $DIR/core/services/feeds/service_test.go: `.Return(&proto.UpdateNodeResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `.UpdateChainConfig(testutils.Context(t), cfg)` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.UpdateChainConfig(testutils.Context(t), cfg)` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.New()` $DIR/core/services/feeds/service_test.go: `.New()` $DIR/core/services/feeds/service_test.go: `.Sprintf(FluxMonitorTestSpecTemplate, nameAndExternalJobID, nameAndExternalJobID)` $DIR/core/services/feeds/service_test.go: `.StringFrom(nameAndExternalJobID.String())` $DIR/core/services/feeds/service_test.go: `.String()` $DIR/core/services/feeds/service_test.go: `.New()` $DIR/core/services/feeds/service_test.go: `.New()` $DIR/core/services/feeds/service_test.go: `.Sprintf(OCR1TestSpecTemplate, ocr1NameAndExternalJobID, ocr1NameAndExternalJobID)` $DIR/core/services/feeds/service_test.go: `.StringFrom(ocr1NameAndExternalJobID.String())` $DIR/core/services/feeds/service_test.go: `.String()` $DIR/core/services/feeds/service_test.go: `.New()` $DIR/core/services/feeds/service_test.go: `.New()` $DIR/core/services/feeds/service_test.go: `.Sprintf(OCR2TestSpecTemplate, ocr2NameAndExternalJobID, ocr2NameAndExternalJobID)` $DIR/core/services/feeds/service_test.go: `.StringFrom(ocr2NameAndExternalJobID.String())` $DIR/core/services/feeds/service_test.go: `.String()` $DIR/core/services/feeds/service_test.go: `.New()` $DIR/core/services/feeds/service_test.go: `.New()` $DIR/core/services/feeds/service_test.go: `.Sprintf(BootstrapTestSpecTemplate, bootstrapName)` $DIR/core/services/feeds/service_test.go: `.StringFrom(bootstrapName.String())` $DIR/core/services/feeds/service_test.go: `.String()` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Second)` $DIR/core/services/feeds/service_test.go: `.GenerateWorkflowSpec(wfID, wfOwner, wfName, specYaml)` $DIR/core/services/feeds/service_test.go: `.Toml()` $DIR/core/services/feeds/service_test.go: `.New()` $DIR/core/services/feeds/service_test.go: `.StringFrom("test-spec")` $DIR/core/services/feeds/service_test.go: `.StringFrom("test-spec")` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposalByRemoteUUID", mock.Anything, argsWF.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `.Return(new(feeds.JobProposal), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.orm.On("UpsertJobProposal", mock.Anything, &jpWF)` $DIR/core/services/feeds/service_test.go: `.Return(proposalIDWF, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CreateSpec", mock.Anything, proposalSpecWF)` $DIR/core/services/feeds/service_test.go: `.Return(jobProposalSpecIdWF, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("Transact", mock.Anything, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", argsWF.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetSpec(mock.Anything, jobProposalSpecIdWF)` $DIR/core/services/feeds/service_test.go: `.Return(&autoApprovableProposalSpecWF, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetJobProposal(mock.Anything, autoApprovableProposalSpecWF.JobProposalID)` $DIR/core/services/feeds/service_test.go: `.Return(&acceptedjpWF, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobIDByWorkflow", mock.Anything, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.WorkflowSpec.WorkflowOwner == wfOwner }), )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(j *job.Job) bool { return j.WorkflowSpec.WorkflowOwner == wfOwner })` $DIR/core/services/feeds/service_test.go: `. Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 })` $DIR/core/services/feeds/service_test.go: `.Get(2)` $DIR/core/services/feeds/service_test.go: `. Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ApproveSpec", mock.Anything, jobProposalSpecIdWF, mock.IsType(uuid.UUID{}), )` $DIR/core/services/feeds/service_test.go: `.IsType(uuid.UUID{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jpWF.RemoteUUID.String(), Version: int64(proposalSpecWF.Version), }, )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(ctx context.Context) bool { return true })` $DIR/core/services/feeds/service_test.go: `.RemoteUUID.String()` $DIR/core/services/feeds/service_test.go: `.Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposalByRemoteUUID", mock.Anything, argsWF.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `.Return(new(feeds.JobProposal), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.orm.On("UpsertJobProposal", mock.Anything, &jpWF)` $DIR/core/services/feeds/service_test.go: `.Return(proposalIDWF, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CreateSpec", mock.Anything, proposalSpecWF)` $DIR/core/services/feeds/service_test.go: `.Return(jobProposalSpecIdWF, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("Transact", mock.Anything, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", argsWF.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetSpec(mock.Anything, jobProposalSpecIdWF)` $DIR/core/services/feeds/service_test.go: `.Return(&autoApprovableProposalSpecWF, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetJobProposal(mock.Anything, autoApprovableProposalSpecWF.JobProposalID)` $DIR/core/services/feeds/service_test.go: `.Return(&acceptedjpWF, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobIDByWorkflow", mock.Anything, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(jobIDWF, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetApprovedSpec", mock.Anything, acceptedjpWF.ID)` $DIR/core/services/feeds/service_test.go: `.Return(&autoApprovableProposalSpecWF, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CancelSpec", mock.Anything, autoApprovableProposalSpecWF.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.spawner.On("DeleteJob", mock.Anything, mock.Anything, jobIDWF)` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.WorkflowSpec.WorkflowOwner == wfOwner }), )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(j *job.Job) bool { return j.WorkflowSpec.WorkflowOwner == wfOwner })` $DIR/core/services/feeds/service_test.go: `. Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 })` $DIR/core/services/feeds/service_test.go: `.Get(2)` $DIR/core/services/feeds/service_test.go: `. Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ApproveSpec", mock.Anything, jobProposalSpecIdWF, mock.IsType(uuid.UUID{}), )` $DIR/core/services/feeds/service_test.go: `.IsType(uuid.UUID{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jpWF.RemoteUUID.String(), Version: int64(proposalSpecWF.Version), }, )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(ctx context.Context) bool { return true })` $DIR/core/services/feeds/service_test.go: `.RemoteUUID.String()` $DIR/core/services/feeds/service_test.go: `.Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposalByRemoteUUID", mock.Anything, argsWF.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `.Return(new(feeds.JobProposal), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.orm.On("UpsertJobProposal", mock.Anything, &jpWF)` $DIR/core/services/feeds/service_test.go: `.Return(proposalIDWF, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CreateSpec", mock.Anything, proposalSpecWF)` $DIR/core/services/feeds/service_test.go: `.Return(jobProposalSpecIdWF, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("Transact", mock.Anything, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", argsWF.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetSpec(mock.Anything, jobProposalSpecIdWF)` $DIR/core/services/feeds/service_test.go: `.Return(&proposalSpecWF, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetJobProposal(mock.Anything, proposalSpecWF.JobProposalID)` $DIR/core/services/feeds/service_test.go: `.Return(&jpWF, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobIDByWorkflow", mock.Anything, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.WorkflowSpec.WorkflowOwner == wfOwner }), )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(j *job.Job) bool { return j.WorkflowSpec.WorkflowOwner == wfOwner })` $DIR/core/services/feeds/service_test.go: `. Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 })` $DIR/core/services/feeds/service_test.go: `.Get(2)` $DIR/core/services/feeds/service_test.go: `. Return(fmt.Errorf("error creating job"))` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposalByRemoteUUID", mock.Anything, jpFluxMonitor.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `.Return(new(feeds.JobProposal), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.orm.On("UpsertJobProposal", mock.Anything, &jpFluxMonitor)` $DIR/core/services/feeds/service_test.go: `.Return(idFluxMonitor, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CreateSpec", mock.Anything, specFluxMonitor)` $DIR/core/services/feeds/service_test.go: `.Return(int64(100), nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("Transact", mock.Anything, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposalByRemoteUUID", mock.Anything, jpOCR1.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `.Return(new(feeds.JobProposal), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.orm.On("UpsertJobProposal", mock.Anything, &jpOCR1)` $DIR/core/services/feeds/service_test.go: `.Return(idOCR1, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CreateSpec", mock.Anything, specOCR1)` $DIR/core/services/feeds/service_test.go: `.Return(int64(100), nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("Transact", mock.Anything, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposalByRemoteUUID", mock.Anything, jpOCR2.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `.Return(new(feeds.JobProposal), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.orm.On("UpsertJobProposal", mock.Anything, &jpOCR2)` $DIR/core/services/feeds/service_test.go: `.Return(idOCR2, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CreateSpec", mock.Anything, specOCR2)` $DIR/core/services/feeds/service_test.go: `.Return(int64(100), nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("Transact", mock.Anything, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposalByRemoteUUID", mock.Anything, jpBootstrap.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `.Return(new(feeds.JobProposal), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.orm.On("UpsertJobProposal", mock.Anything, &jpBootstrap)` $DIR/core/services/feeds/service_test.go: `.Return(idBootstrap, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CreateSpec", mock.Anything, specBootstrap)` $DIR/core/services/feeds/service_test.go: `.Return(int64(102), nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("Transact", mock.Anything, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `.orm. On("GetJobProposalByRemoteUUID", mock.Anything, jpFluxMonitor.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `. Return(&feeds.JobProposal{ FeedsManagerID: jpFluxMonitor.FeedsManagerID, RemoteUUID: jpFluxMonitor.RemoteUUID, Status: feeds.JobProposalStatusPending, }, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ExistsSpecByJobProposalIDAndVersion", mock.Anything, jpFluxMonitor.ID, argsFluxMonitor.Version)` $DIR/core/services/feeds/service_test.go: `.Return(false, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("UpsertJobProposal", mock.Anything, &jpFluxMonitor)` $DIR/core/services/feeds/service_test.go: `.Return(idFluxMonitor, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CreateSpec", mock.Anything, specFluxMonitor)` $DIR/core/services/feeds/service_test.go: `.Return(int64(100), nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("Transact", mock.Anything, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `.orm. On("GetJobProposalByRemoteUUID", mock.Anything, jpFluxMonitor.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `. Return(&feeds.JobProposal{ FeedsManagerID: 2, RemoteUUID: jpFluxMonitor.RemoteUUID, }, nil)` $DIR/core/services/feeds/service_test.go: `.orm. On("GetJobProposalByRemoteUUID", mock.Anything, jpFluxMonitor.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `. Return(&feeds.JobProposal{ FeedsManagerID: jpFluxMonitor.FeedsManagerID, RemoteUUID: jpFluxMonitor.RemoteUUID, Status: feeds.JobProposalStatusPending, }, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ExistsSpecByJobProposalIDAndVersion", mock.Anything, jpFluxMonitor.ID, argsFluxMonitor.Version)` $DIR/core/services/feeds/service_test.go: `.Return(true, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposalByRemoteUUID", mock.Anything, jpFluxMonitor.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `.Return(new(feeds.JobProposal), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.orm.On("UpsertJobProposal", mock.Anything, &jpFluxMonitor)` $DIR/core/services/feeds/service_test.go: `.Return(int64(0), errors.New("orm error"))` $DIR/core/services/feeds/service_test.go: `.New("orm error")` $DIR/core/services/feeds/service_test.go: `.orm.On("Transact", mock.Anything, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposalByRemoteUUID", mock.Anything, jpFluxMonitor.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `.Return(new(feeds.JobProposal), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.orm.On("UpsertJobProposal", mock.Anything, &jpFluxMonitor)` $DIR/core/services/feeds/service_test.go: `.Return(idFluxMonitor, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CreateSpec", mock.Anything, specFluxMonitor)` $DIR/core/services/feeds/service_test.go: `.Return(int64(0), errors.New("orm error"))` $DIR/core/services/feeds/service_test.go: `.New("orm error")` $DIR/core/services/feeds/service_test.go: `.orm.On("Transact", mock.Anything, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `.Run(tc.name, func(t *testing.T) { t.Parallel() svc := setupTestServiceCfg(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.JobPipeline.HTTPRequest.DefaultTimeout = &httpTimeout c.OCR.Enabled = testutils.Ptr(true) c.OCR2.Enabled = testutils.Ptr(true) }) if tc.before != nil { tc.before(svc) } actual, err := svc.ProposeJob(testutils.Context(t), tc.args) if tc.wantErr != "" { require.Error(t, err) assert.Contains(t, err.Error(), tc.wantErr) } else { require.NoError(t, err) assert.Equal(t, tc.wantID, actual) } })` $DIR/core/services/feeds/service_test.go: `.Ptr(true)` $DIR/core/services/feeds/service_test.go: `.Ptr(true)` $DIR/core/services/feeds/service_test.go: `.before(svc)` $DIR/core/services/feeds/service_test.go: `.ProposeJob(testutils.Context(t), tc.args)` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.New()` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Second)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposalByRemoteUUID", mock.Anything, approved.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `.Return(&approved, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("DeleteProposal", mock.Anything, approved.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm. On("GetJobProposalByRemoteUUID", mock.Anything, approved.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `. Return(&feeds.JobProposal{ FeedsManagerID: 2, RemoteUUID: approved.RemoteUUID, Status: feeds.JobProposalStatusApproved, }, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposalByRemoteUUID", mock.Anything, approved.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, errors.New("orm error"))` $DIR/core/services/feeds/service_test.go: `.New("orm error")` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposalByRemoteUUID", mock.Anything, approved.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposalByRemoteUUID", mock.Anything, approved.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `.Return(&approved, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("DeleteProposal", mock.Anything, approved.ID)` $DIR/core/services/feeds/service_test.go: `.Return(errors.New("orm error"))` $DIR/core/services/feeds/service_test.go: `.New("orm error")` $DIR/core/services/feeds/service_test.go: `.Run(tc.name, func(t *testing.T) { t.Parallel() svc := setupTestServiceCfg(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.JobPipeline.HTTPRequest.DefaultTimeout = &httpTimeout }) if tc.before != nil { tc.before(svc) } _, err := svc.DeleteJob(testutils.Context(t), tc.args) if tc.wantErr != "" { require.Error(t, err) assert.Contains(t, err.Error(), tc.wantErr) } else { require.NoError(t, err) } })` $DIR/core/services/feeds/service_test.go: `.before(svc)` $DIR/core/services/feeds/service_test.go: `.DeleteJob(testutils.Context(t), tc.args)` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.New()` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Second)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposalByRemoteUUID", mock.Anything, pendingProposal.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `.Return(pendingProposal, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetLatestSpec", mock.Anything, pendingSpec.JobProposalID)` $DIR/core/services/feeds/service_test.go: `.Return(pendingSpec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("RevokeSpec", mock.Anything, pendingSpec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposalByRemoteUUID", mock.Anything, pendingProposal.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `.Return(pendingProposal, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetLatestSpec", mock.Anything, pendingSpec.JobProposalID)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalSpec{ ID: 20, Status: feeds.SpecStatusCancelled, JobProposalID: pendingProposal.ID, Version: 1, Definition: defn, }, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("RevokeSpec", mock.Anything, pendingSpec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm. On("GetJobProposalByRemoteUUID", mock.Anything, pendingProposal.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `. Return(&feeds.JobProposal{ FeedsManagerID: 2, RemoteUUID: pendingProposal.RemoteUUID, Status: feeds.JobProposalStatusApproved, }, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposalByRemoteUUID", mock.Anything, pendingProposal.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, errors.New("orm error"))` $DIR/core/services/feeds/service_test.go: `.New("orm error")` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposalByRemoteUUID", mock.Anything, pendingProposal.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposalByRemoteUUID", mock.Anything, pendingProposal.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `.Return(pendingProposal, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetLatestSpec", mock.Anything, pendingSpec.JobProposalID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposalByRemoteUUID", mock.Anything, pendingProposal.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `.Return(pendingProposal, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetLatestSpec", mock.Anything, pendingSpec.JobProposalID)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalSpec{ ID: 20, Status: feeds.SpecStatusApproved, JobProposalID: pendingProposal.ID, Version: 1, Definition: defn, }, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposalByRemoteUUID", mock.Anything, pendingProposal.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `.Return(pendingProposal, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetLatestSpec", mock.Anything, pendingSpec.JobProposalID)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalSpec{ ID: 20, Status: feeds.SpecStatusRejected, JobProposalID: pendingProposal.ID, Version: 1, Definition: defn, }, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposalByRemoteUUID", mock.Anything, pendingProposal.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `.Return(pendingProposal, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetLatestSpec", mock.Anything, pendingSpec.JobProposalID)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalSpec{ ID: 20, Status: feeds.SpecStatusRevoked, JobProposalID: pendingProposal.ID, Version: 1, Definition: defn, }, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposalByRemoteUUID", mock.Anything, pendingProposal.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposal{ ID: 1, FeedsManagerID: 1, RemoteUUID: remoteUUID, Status: feeds.JobProposalStatusDeleted, }, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetLatestSpec", mock.Anything, pendingSpec.JobProposalID)` $DIR/core/services/feeds/service_test.go: `.Return(pendingSpec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposalByRemoteUUID", mock.Anything, pendingProposal.RemoteUUID)` $DIR/core/services/feeds/service_test.go: `.Return(pendingProposal, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetLatestSpec", mock.Anything, pendingSpec.JobProposalID)` $DIR/core/services/feeds/service_test.go: `.Return(pendingSpec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("RevokeSpec", mock.Anything, pendingSpec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(errors.New("orm error"))` $DIR/core/services/feeds/service_test.go: `.New("orm error")` $DIR/core/services/feeds/service_test.go: `.Run(tc.name, func(t *testing.T) { t.Parallel() svc := setupTestServiceCfg(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.OCR2.Enabled = testutils.Ptr(true) c.JobPipeline.HTTPRequest.DefaultTimeout = &httpTimeout }) if tc.before != nil { tc.before(svc) } _, err := svc.RevokeJob(testutils.Context(t), tc.args) if tc.wantErr != "" { require.Error(t, err) assert.Contains(t, err.Error(), tc.wantErr) } else { require.NoError(t, err) } })` $DIR/core/services/feeds/service_test.go: `.Ptr(true)` $DIR/core/services/feeds/service_test.go: `.before(svc)` $DIR/core/services/feeds/service_test.go: `.RevokeJob(testutils.Context(t), tc.args)` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.NewP2PKeyV2(t)` $DIR/core/services/feeds/service_test.go: `.NewV2()` $DIR/core/services/feeds/service_test.go: `.StringFrom(p2pKey.PeerID().String())` $DIR/core/services/feeds/service_test.go: `.PeerID()` $DIR/core/services/feeds/service_test.go: `.String()` $DIR/core/services/feeds/service_test.go: `.StringFrom(ocrKey.GetID())` $DIR/core/services/feeds/service_test.go: `.GetID()` $DIR/core/services/feeds/service_test.go: `.StringFrom(multiaddr)` $DIR/core/services/feeds/service_test.go: `.StringFrom(forwarderAddr)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", mgr.ID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ListChainConfigsByManagerIDs", mock.Anything, []int64{mgr.ID})` $DIR/core/services/feeds/service_test.go: `.Return(chainConfigs, nil)` $DIR/core/services/feeds/service_test.go: `.p2pKeystore.On("Get", p2pKey.PeerID())` $DIR/core/services/feeds/service_test.go: `.PeerID()` $DIR/core/services/feeds/service_test.go: `.Return(p2pKey, nil)` $DIR/core/services/feeds/service_test.go: `.ocr1Keystore.On("Get", ocrKey.GetID())` $DIR/core/services/feeds/service_test.go: `.GetID()` $DIR/core/services/feeds/service_test.go: `.Return(ocrKey, nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("UpdateNode", mock.Anything, &proto.UpdateNodeRequest{ Version: nodeVersion.Version, ChainConfigs: []*proto.ChainConfig{ { Chain: &proto.Chain{ Id: ccfg.ChainID, Type: proto.ChainType_CHAIN_TYPE_EVM, }, AccountAddress: ccfg.AccountAddress, AdminAddress: ccfg.AdminAddress, FluxMonitorConfig: &proto.FluxMonitorConfig{Enabled: true}, Ocr1Config: &proto.OCR1Config{ Enabled: true, IsBootstrap: ccfg.OCR1Config.IsBootstrap, P2PKeyBundle: &proto.OCR1Config_P2PKeyBundle{ PeerId: p2pKey.PeerID().String(), PublicKey: p2pKey.PublicKeyHex(), }, OcrKeyBundle: &proto.OCR1Config_OCRKeyBundle{ BundleId: ocrKey.GetID(), ConfigPublicKey: ocrkey.ConfigPublicKey(ocrKey.PublicKeyConfig()).String(), OffchainPublicKey: ocrKey.OffChainSigning.PublicKey().String(), OnchainSigningAddress: ocrKey.OnChainSigning.Address().String(), }, }, Ocr2Config: &proto.OCR2Config{ Enabled: true, IsBootstrap: ccfg.OCR2Config.IsBootstrap, Multiaddr: multiaddr, ForwarderAddress: &forwarderAddr, Plugins: &proto.OCR2Config_Plugins{ Commit: ccfg.OCR2Config.Plugins.Commit, Execute: ccfg.OCR2Config.Plugins.Execute, Median: ccfg.OCR2Config.Plugins.Median, Mercury: ccfg.OCR2Config.Plugins.Mercury, Rebalancer: ccfg.OCR2Config.Plugins.Rebalancer, }, }, }, }, })` $DIR/core/services/feeds/service_test.go: `.PeerID()` $DIR/core/services/feeds/service_test.go: `.String()` $DIR/core/services/feeds/service_test.go: `.PublicKeyHex()` $DIR/core/services/feeds/service_test.go: `.GetID()` $DIR/core/services/feeds/service_test.go: `.ConfigPublicKey(ocrKey.PublicKeyConfig())` $DIR/core/services/feeds/service_test.go: `.PublicKeyConfig()` $DIR/core/services/feeds/service_test.go: `.String()` $DIR/core/services/feeds/service_test.go: `.OffChainSigning.PublicKey()` $DIR/core/services/feeds/service_test.go: `.String()` $DIR/core/services/feeds/service_test.go: `.OnChainSigning.Address()` $DIR/core/services/feeds/service_test.go: `.String()` $DIR/core/services/feeds/service_test.go: `.Return(&proto.UpdateNodeResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `.SyncNodeInfo(testutils.Context(t), mgr.ID)` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.orm.On("IsJobManaged", mock.Anything, jobID)` $DIR/core/services/feeds/service_test.go: `.Return(true, nil)` $DIR/core/services/feeds/service_test.go: `.IsJobManaged(ctx, jobID)` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.orm.On("ListJobProposals", mock.Anything)` $DIR/core/services/feeds/service_test.go: `. Return(jps, nil)` $DIR/core/services/feeds/service_test.go: `.ListJobProposals(ctx)` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.orm.On("ListJobProposalsByManagersIDs", mock.Anything, fmIDs)` $DIR/core/services/feeds/service_test.go: `. Return(jps, nil)` $DIR/core/services/feeds/service_test.go: `.ListJobProposalsByManagersIDs(ctx, fmIDs)` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, id)` $DIR/core/services/feeds/service_test.go: `. Return(&ms, nil)` $DIR/core/services/feeds/service_test.go: `.GetJobProposal(ctx, id)` $DIR/core/services/feeds/service_test.go: `.New()` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CancelSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(j, nil)` $DIR/core/services/feeds/service_test.go: `.spawner.On("DeleteJob", mock.Anything, mock.Anything, j.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("CancelledJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.CancelledJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(ctx context.Context) bool { return true })` $DIR/core/services/feeds/service_test.go: `.RemoteUUID.String()` $DIR/core/services/feeds/service_test.go: `.Return(&proto.CancelledJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposal{ ID: 1, RemoteUUID: externalJobID, FeedsManagerID: 100, }, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CancelSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("CancelledJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.CancelledJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(ctx context.Context) bool { return true })` $DIR/core/services/feeds/service_test.go: `.RemoteUUID.String()` $DIR/core/services/feeds/service_test.go: `.Return(&proto.CancelledJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CancelSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("CancelledJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.CancelledJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(ctx context.Context) bool { return true })` $DIR/core/services/feeds/service_test.go: `.RemoteUUID.String()` $DIR/core/services/feeds/service_test.go: `.Return(&proto.CancelledJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, errors.New("Not Found"))` $DIR/core/services/feeds/service_test.go: `.New("Not Found")` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, pspec.ID, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(pspec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, errors.New("Not Found"))` $DIR/core/services/feeds/service_test.go: `.New("Not Found")` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, errors.New("Not Connected"))` $DIR/core/services/feeds/service_test.go: `.New("Not Connected")` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CancelSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `.New("failure")` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CancelSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `.New("failure")` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CancelSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(j, nil)` $DIR/core/services/feeds/service_test.go: `.spawner.On("DeleteJob", mock.Anything, mock.Anything, j.ID)` $DIR/core/services/feeds/service_test.go: `.Return(errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `.New("failure")` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CancelSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(j, nil)` $DIR/core/services/feeds/service_test.go: `.spawner.On("DeleteJob", mock.Anything, mock.Anything, j.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("CancelledJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.CancelledJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(ctx context.Context) bool { return true })` $DIR/core/services/feeds/service_test.go: `.RemoteUUID.String()` $DIR/core/services/feeds/service_test.go: `.Return(nil, errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `.New("failure")` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.Run(tc.name, func(t *testing.T) { t.Parallel() svc := setupTestService(t) if tc.before != nil { tc.before(svc) } err := svc.CancelSpec(testutils.Context(t), tc.specID) if tc.wantErr != "" { require.Error(t, err) assert.EqualError(t, err, tc.wantErr) return } require.NoError(t, err) })` $DIR/core/services/feeds/service_test.go: `.before(svc)` $DIR/core/services/feeds/service_test.go: `.CancelSpec(testutils.Context(t), tc.specID)` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, id)` $DIR/core/services/feeds/service_test.go: `. Return(&spec, nil)` $DIR/core/services/feeds/service_test.go: `.GetSpec(ctx, id)` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.orm.On("ListSpecsByJobProposalIDs", mock.Anything, []int64{jpID})` $DIR/core/services/feeds/service_test.go: `. Return(specs, nil)` $DIR/core/services/feeds/service_test.go: `.ListSpecsByJobProposalIDs(ctx, []int64{jpID})` $DIR/core/services/feeds/service_test.go: `.EIP55AddressFromAddress(common.Address{})` $DIR/core/services/feeds/service_test.go: `.New()` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.Sprintf(defn, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Sprintf(defn, uuid.Nil)` $DIR/core/services/feeds/service_test.go: `.Sprintf(defn, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Sprintf(defn, externalJobID)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetSpec(mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetJobProposal(mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobIDByAddress", mock.Anything, address, evmChainID, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" })` $DIR/core/services/feeds/service_test.go: `. Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 })` $DIR/core/services/feeds/service_test.go: `.Get(2)` $DIR/core/services/feeds/service_test.go: `. Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ApproveSpec", mock.Anything, spec.ID, mock.IsType(uuid.UUID{}), )` $DIR/core/services/feeds/service_test.go: `.IsType(uuid.UUID{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(ctx context.Context) bool { return true })` $DIR/core/services/feeds/service_test.go: `.RemoteUUID.String()` $DIR/core/services/feeds/service_test.go: `.Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, cancelledSpec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(cancelledSpec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetLatestSpec", mock.Anything, cancelledSpec.JobProposalID)` $DIR/core/services/feeds/service_test.go: `.Return(cancelledSpec, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobIDByAddress", mock.Anything, address, evmChainID, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" })` $DIR/core/services/feeds/service_test.go: `. Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 })` $DIR/core/services/feeds/service_test.go: `.Get(2)` $DIR/core/services/feeds/service_test.go: `. Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ApproveSpec", mock.Anything, cancelledSpec.ID, externalJobID, )` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(ctx context.Context) bool { return true })` $DIR/core/services/feeds/service_test.go: `.RemoteUUID.String()` $DIR/core/services/feeds/service_test.go: `.Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetSpec(mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec2, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetJobProposal(mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposal{ ID: 1, Status: feeds.JobProposalStatusRevoked, }, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposal{ ID: jp.ID, Status: feeds.JobProposalStatusDeleted, }, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, aspec.ID, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(aspec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, cancelledSpec.ID, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(rejectedSpec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, cancelledSpec.ID, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(cancelledSpec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetLatestSpec", mock.Anything, cancelledSpec.JobProposalID)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalSpec{ ID: 21, Status: feeds.SpecStatusPending, JobProposalID: jp.ID, Version: 2, Definition: defn, }, nil)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(j, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobIDByAddress", mock.Anything, address, evmChainID, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(j.ID, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetSpec(mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetJobProposal(mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(j, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetApprovedSpec(mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.spawner.On("DeleteJob", mock.Anything, mock.Anything, j.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" })` $DIR/core/services/feeds/service_test.go: `. Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 })` $DIR/core/services/feeds/service_test.go: `.Get(2)` $DIR/core/services/feeds/service_test.go: `. Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, )` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(ctx context.Context) bool { return true })` $DIR/core/services/feeds/service_test.go: `.RemoteUUID.String()` $DIR/core/services/feeds/service_test.go: `.Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetSpec(mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetJobProposal(mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobIDByAddress", mock.Anything, address, evmChainID, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(j.ID, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetApprovedSpec(mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.spawner.On("DeleteJob", mock.Anything, mock.Anything, j.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" })` $DIR/core/services/feeds/service_test.go: `. Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 })` $DIR/core/services/feeds/service_test.go: `.Get(2)` $DIR/core/services/feeds/service_test.go: `. Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, )` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(ctx context.Context) bool { return true })` $DIR/core/services/feeds/service_test.go: `.RemoteUUID.String()` $DIR/core/services/feeds/service_test.go: `.Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetSpec(mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetJobProposal(mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobIDByAddress", mock.Anything, address, evmChainID, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(j.ID, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetApprovedSpec(mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalSpec{ID: 100}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.CancelSpec(mock.Anything, int64(100))` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.spawner.On("DeleteJob", mock.Anything, mock.Anything, j.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" })` $DIR/core/services/feeds/service_test.go: `. Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 })` $DIR/core/services/feeds/service_test.go: `.Get(2)` $DIR/core/services/feeds/service_test.go: `. Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, )` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(ctx context.Context) bool { return true })` $DIR/core/services/feeds/service_test.go: `.RemoteUUID.String()` $DIR/core/services/feeds/service_test.go: `.Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, errors.New("Not Found"))` $DIR/core/services/feeds/service_test.go: `.New("Not Found")` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, errors.New("Not Found"))` $DIR/core/services/feeds/service_test.go: `.New("Not Found")` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(errors.New("bridges do not exist"))` $DIR/core/services/feeds/service_test.go: `.New("bridges do not exist")` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, errors.New("Not Connected"))` $DIR/core/services/feeds/service_test.go: `.New("Not Connected")` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetSpec(mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetJobProposal(mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(j, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetApprovedSpec(mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `.New("failure")` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetSpec(mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetJobProposal(mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobIDByAddress", mock.Anything, address, evmChainID, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(j.ID, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetApprovedSpec(mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `.New("failure")` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetSpec(mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetJobProposal(mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(j, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetApprovedSpec(mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalSpec{ID: 100}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.CancelSpec(mock.Anything, int64(100))` $DIR/core/services/feeds/service_test.go: `.Return(errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `.New("failure")` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetSpec(mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetJobProposal(mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobIDByAddress", mock.Anything, address, evmChainID, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(j.ID, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetApprovedSpec(mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalSpec{ID: 100}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.CancelSpec(mock.Anything, int64(100))` $DIR/core/services/feeds/service_test.go: `.Return(errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `.New("failure")` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobIDByAddress", mock.Anything, address, evmChainID, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" })` $DIR/core/services/feeds/service_test.go: `. Return(errors.New("could not save"))` $DIR/core/services/feeds/service_test.go: `.New("could not save")` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobIDByAddress", mock.Anything, address, evmChainID, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" })` $DIR/core/services/feeds/service_test.go: `. Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 })` $DIR/core/services/feeds/service_test.go: `.Get(2)` $DIR/core/services/feeds/service_test.go: `. Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, )` $DIR/core/services/feeds/service_test.go: `.Return(errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `.New("failure")` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobIDByAddress", mock.Anything, address, evmChainID, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" })` $DIR/core/services/feeds/service_test.go: `. Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 })` $DIR/core/services/feeds/service_test.go: `.Get(2)` $DIR/core/services/feeds/service_test.go: `. Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, )` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(ctx context.Context) bool { return true })` $DIR/core/services/feeds/service_test.go: `.RemoteUUID.String()` $DIR/core/services/feeds/service_test.go: `.Return(nil, errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `.New("failure")` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.Run(tc.name, func(t *testing.T) { svc := setupTestServiceCfg(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.OCR2.Enabled = testutils.Ptr(true) if tc.httpTimeout != nil { c.JobPipeline.HTTPRequest.DefaultTimeout = tc.httpTimeout } }) if tc.before != nil { tc.before(svc) } err := svc.ApproveSpec(ctx, tc.id, tc.force) if tc.wantErr != "" { require.Error(t, err) assert.EqualError(t, err, tc.wantErr) } else { require.NoError(t, err) } })` $DIR/core/services/feeds/service_test.go: `.Ptr(true)` $DIR/core/services/feeds/service_test.go: `.before(svc)` $DIR/core/services/feeds/service_test.go: `.ApproveSpec(ctx, tc.id, tc.force)` $DIR/core/services/feeds/service_test.go: `.HexToHash(feedIDHex)` $DIR/core/services/feeds/service_test.go: `.New()` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.Sprintf(defn, externalJobID.String())` $DIR/core/services/feeds/service_test.go: `.String()` $DIR/core/services/feeds/service_test.go: `.Sprintf(defn, externalJobID.String())` $DIR/core/services/feeds/service_test.go: `.String()` $DIR/core/services/feeds/service_test.go: `.Sprintf(defn, externalJobID.String())` $DIR/core/services/feeds/service_test.go: `.String()` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil))` $DIR/core/services/feeds/service_test.go: `.Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" })` $DIR/core/services/feeds/service_test.go: `. Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 })` $DIR/core/services/feeds/service_test.go: `.Get(2)` $DIR/core/services/feeds/service_test.go: `. Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, )` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(ctx context.Context) bool { return true })` $DIR/core/services/feeds/service_test.go: `.RemoteUUID.String()` $DIR/core/services/feeds/service_test.go: `.Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, cancelledSpec.ID, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(cancelledSpec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetLatestSpec", mock.Anything, cancelledSpec.JobProposalID)` $DIR/core/services/feeds/service_test.go: `.Return(cancelledSpec, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil))` $DIR/core/services/feeds/service_test.go: `.Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" })` $DIR/core/services/feeds/service_test.go: `. Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 })` $DIR/core/services/feeds/service_test.go: `.Get(2)` $DIR/core/services/feeds/service_test.go: `. Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ApproveSpec", mock.Anything, cancelledSpec.ID, externalJobID, )` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(ctx context.Context) bool { return true })` $DIR/core/services/feeds/service_test.go: `.RemoteUUID.String()` $DIR/core/services/feeds/service_test.go: `.Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, cancelledSpec.ID, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(cancelledSpec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetLatestSpec", mock.Anything, cancelledSpec.JobProposalID)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalSpec{ ID: 21, Status: feeds.SpecStatusPending, JobProposalID: jp.ID, Version: 2, Definition: defn, }, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, cancelledSpec.ID, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(rejectedSpec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil))` $DIR/core/services/feeds/service_test.go: `.Return(j.ID, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetApprovedSpec(mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil))` $DIR/core/services/feeds/service_test.go: `.Return(j.ID, nil)` $DIR/core/services/feeds/service_test.go: `.spawner.On("DeleteJob", mock.Anything, mock.Anything, j.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" })` $DIR/core/services/feeds/service_test.go: `. Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 })` $DIR/core/services/feeds/service_test.go: `.Get(2)` $DIR/core/services/feeds/service_test.go: `. Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, )` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(ctx context.Context) bool { return true })` $DIR/core/services/feeds/service_test.go: `.RemoteUUID.String()` $DIR/core/services/feeds/service_test.go: `.Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalSpec{ ID: 20, Status: feeds.SpecStatusPending, JobProposalID: jp.ID, Version: 1, Definition: fmt.Sprintf(defn2, externalJobID.String(), &feedID), }, nil)` $DIR/core/services/feeds/service_test.go: `.Sprintf(defn2, externalJobID.String(), &feedID)` $DIR/core/services/feeds/service_test.go: `.String()` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetApprovedSpec(mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, &feedID)` $DIR/core/services/feeds/service_test.go: `.Return(j.ID, nil)` $DIR/core/services/feeds/service_test.go: `.spawner.On("DeleteJob", mock.Anything, mock.Anything, j.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" })` $DIR/core/services/feeds/service_test.go: `. Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 })` $DIR/core/services/feeds/service_test.go: `.Get(2)` $DIR/core/services/feeds/service_test.go: `. Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, )` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(ctx context.Context) bool { return true })` $DIR/core/services/feeds/service_test.go: `.RemoteUUID.String()` $DIR/core/services/feeds/service_test.go: `.Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetApprovedSpec(mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalSpec{ID: 100}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.CancelSpec(mock.Anything, int64(100))` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil))` $DIR/core/services/feeds/service_test.go: `.Return(j.ID, nil)` $DIR/core/services/feeds/service_test.go: `.spawner.On("DeleteJob", mock.Anything, mock.Anything, j.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" })` $DIR/core/services/feeds/service_test.go: `. Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 })` $DIR/core/services/feeds/service_test.go: `.Get(2)` $DIR/core/services/feeds/service_test.go: `. Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, )` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(ctx context.Context) bool { return true })` $DIR/core/services/feeds/service_test.go: `.RemoteUUID.String()` $DIR/core/services/feeds/service_test.go: `.Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, errors.New("Not Found"))` $DIR/core/services/feeds/service_test.go: `.New("Not Found")` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(aspec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, rspec.ID, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(rspec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, errors.New("Not Found"))` $DIR/core/services/feeds/service_test.go: `.New("Not Found")` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(errors.New("bridges do not exist"))` $DIR/core/services/feeds/service_test.go: `.New("bridges do not exist")` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, errors.New("Not Connected"))` $DIR/core/services/feeds/service_test.go: `.New("Not Connected")` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil))` $DIR/core/services/feeds/service_test.go: `.Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" })` $DIR/core/services/feeds/service_test.go: `. Return(errors.New("could not save"))` $DIR/core/services/feeds/service_test.go: `.New("could not save")` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil))` $DIR/core/services/feeds/service_test.go: `.Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" })` $DIR/core/services/feeds/service_test.go: `. Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 })` $DIR/core/services/feeds/service_test.go: `.Get(2)` $DIR/core/services/feeds/service_test.go: `. Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, )` $DIR/core/services/feeds/service_test.go: `.Return(errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `.New("failure")` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil))` $DIR/core/services/feeds/service_test.go: `.Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" })` $DIR/core/services/feeds/service_test.go: `. Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 })` $DIR/core/services/feeds/service_test.go: `.Get(2)` $DIR/core/services/feeds/service_test.go: `. Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, )` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(ctx context.Context) bool { return true })` $DIR/core/services/feeds/service_test.go: `.RemoteUUID.String()` $DIR/core/services/feeds/service_test.go: `.Return(nil, errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `.New("failure")` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.Run(tc.name, func(t *testing.T) { svc := setupTestServiceCfg(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.OCR2.Enabled = testutils.Ptr(true) if tc.httpTimeout != nil { c.JobPipeline.HTTPRequest.DefaultTimeout = tc.httpTimeout } }) if tc.before != nil { tc.before(svc) } err := svc.ApproveSpec(ctx, tc.id, tc.force) if tc.wantErr != "" { require.Error(t, err) assert.EqualError(t, err, tc.wantErr) } else { require.NoError(t, err) } })` $DIR/core/services/feeds/service_test.go: `.Ptr(true)` $DIR/core/services/feeds/service_test.go: `.before(svc)` $DIR/core/services/feeds/service_test.go: `.ApproveSpec(ctx, tc.id, tc.force)` $DIR/core/services/feeds/service_test.go: `.HexToHash(feedIDHex)` $DIR/core/services/feeds/service_test.go: `.New()` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.Sprintf(defn, externalJobID.String())` $DIR/core/services/feeds/service_test.go: `.String()` $DIR/core/services/feeds/service_test.go: `.Sprintf(defn, externalJobID.String())` $DIR/core/services/feeds/service_test.go: `.String()` $DIR/core/services/feeds/service_test.go: `.Sprintf(defn, externalJobID.String())` $DIR/core/services/feeds/service_test.go: `.String()` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil))` $DIR/core/services/feeds/service_test.go: `.Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" })` $DIR/core/services/feeds/service_test.go: `. Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 })` $DIR/core/services/feeds/service_test.go: `.Get(2)` $DIR/core/services/feeds/service_test.go: `. Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, )` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(ctx context.Context) bool { return true })` $DIR/core/services/feeds/service_test.go: `.RemoteUUID.String()` $DIR/core/services/feeds/service_test.go: `.Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, cancelledSpec.ID, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(cancelledSpec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetLatestSpec", mock.Anything, cancelledSpec.JobProposalID)` $DIR/core/services/feeds/service_test.go: `.Return(cancelledSpec, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil))` $DIR/core/services/feeds/service_test.go: `.Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" })` $DIR/core/services/feeds/service_test.go: `. Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 })` $DIR/core/services/feeds/service_test.go: `.Get(2)` $DIR/core/services/feeds/service_test.go: `. Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ApproveSpec", mock.Anything, cancelledSpec.ID, externalJobID, )` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(ctx context.Context) bool { return true })` $DIR/core/services/feeds/service_test.go: `.RemoteUUID.String()` $DIR/core/services/feeds/service_test.go: `.Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, cancelledSpec.ID, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(cancelledSpec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetLatestSpec", mock.Anything, cancelledSpec.JobProposalID)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalSpec{ ID: 21, Status: feeds.SpecStatusPending, JobProposalID: jp.ID, Version: 2, Definition: defn, }, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, cancelledSpec.ID, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(rejectedSpec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil))` $DIR/core/services/feeds/service_test.go: `.Return(j.ID, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetApprovedSpec(mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil))` $DIR/core/services/feeds/service_test.go: `.Return(j.ID, nil)` $DIR/core/services/feeds/service_test.go: `.spawner.On("DeleteJob", mock.Anything, mock.Anything, j.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" })` $DIR/core/services/feeds/service_test.go: `. Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 })` $DIR/core/services/feeds/service_test.go: `.Get(2)` $DIR/core/services/feeds/service_test.go: `. Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, )` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(ctx context.Context) bool { return true })` $DIR/core/services/feeds/service_test.go: `.RemoteUUID.String()` $DIR/core/services/feeds/service_test.go: `.Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalSpec{ ID: 20, Status: feeds.SpecStatusPending, JobProposalID: jp.ID, Version: 1, Definition: fmt.Sprintf(defn2, externalJobID.String(), feedID), }, nil)` $DIR/core/services/feeds/service_test.go: `.Sprintf(defn2, externalJobID.String(), feedID)` $DIR/core/services/feeds/service_test.go: `.String()` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetApprovedSpec(mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, &feedID)` $DIR/core/services/feeds/service_test.go: `.Return(j.ID, nil)` $DIR/core/services/feeds/service_test.go: `.spawner.On("DeleteJob", mock.Anything, mock.Anything, j.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" })` $DIR/core/services/feeds/service_test.go: `. Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 })` $DIR/core/services/feeds/service_test.go: `.Get(2)` $DIR/core/services/feeds/service_test.go: `. Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, )` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(ctx context.Context) bool { return true })` $DIR/core/services/feeds/service_test.go: `.RemoteUUID.String()` $DIR/core/services/feeds/service_test.go: `.Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.GetApprovedSpec(mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalSpec{ID: 100}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.EXPECT()` $DIR/core/services/feeds/service_test.go: `.CancelSpec(mock.Anything, int64(100))` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil))` $DIR/core/services/feeds/service_test.go: `.Return(j.ID, nil)` $DIR/core/services/feeds/service_test.go: `.spawner.On("DeleteJob", mock.Anything, mock.Anything, j.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" })` $DIR/core/services/feeds/service_test.go: `. Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 })` $DIR/core/services/feeds/service_test.go: `.Get(2)` $DIR/core/services/feeds/service_test.go: `. Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, )` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(ctx context.Context) bool { return true })` $DIR/core/services/feeds/service_test.go: `.RemoteUUID.String()` $DIR/core/services/feeds/service_test.go: `.Return(&proto.ApprovedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, errors.New("Not Found"))` $DIR/core/services/feeds/service_test.go: `.New("Not Found")` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(aspec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, rspec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(rspec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, errors.New("Not Found"))` $DIR/core/services/feeds/service_test.go: `.New("Not Found")` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(errors.New("bridges do not exist"))` $DIR/core/services/feeds/service_test.go: `.New("bridges do not exist")` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, errors.New("Not Connected"))` $DIR/core/services/feeds/service_test.go: `.New("Not Connected")` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil))` $DIR/core/services/feeds/service_test.go: `.Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" })` $DIR/core/services/feeds/service_test.go: `. Return(errors.New("could not save"))` $DIR/core/services/feeds/service_test.go: `.New("could not save")` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil), mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" })` $DIR/core/services/feeds/service_test.go: `. Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 })` $DIR/core/services/feeds/service_test.go: `.Get(2)` $DIR/core/services/feeds/service_test.go: `. Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, )` $DIR/core/services/feeds/service_test.go: `.Return(errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `.New("failure")` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("AssertBridgesExist", mock.Anything, mock.IsType(pipeline.Pipeline{}))` $DIR/core/services/feeds/service_test.go: `.IsType(pipeline.Pipeline{})` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindJobByExternalJobID", mock.Anything, externalJobID)` $DIR/core/services/feeds/service_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("FindOCR2JobIDByAddress", mock.Anything, address, (*common.Hash)(nil))` $DIR/core/services/feeds/service_test.go: `.Return(int32(0), sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.spawner. On("CreateJob", mock.Anything, mock.Anything, mock.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" }), )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(j *job.Job) bool { return j.Name.String == "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" })` $DIR/core/services/feeds/service_test.go: `. Run(func(args mock.Arguments) { (args.Get(2).(*job.Job)).ID = 1 })` $DIR/core/services/feeds/service_test.go: `.Get(2)` $DIR/core/services/feeds/service_test.go: `. Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ApproveSpec", mock.Anything, spec.ID, externalJobID, )` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("ApprovedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.ApprovedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(ctx context.Context) bool { return true })` $DIR/core/services/feeds/service_test.go: `.RemoteUUID.String()` $DIR/core/services/feeds/service_test.go: `.Return(nil, errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `.New("failure")` $DIR/core/services/feeds/service_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(feeds.ORM(svc.orm))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.orm)` $DIR/core/services/feeds/service_test.go: `.jobORM.On("WithDataSource", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(job.ORM(svc.jobORM))` $DIR/core/services/feeds/service_test.go: `.ORM(svc.jobORM)` $DIR/core/services/feeds/service_test.go: `.Run(tc.name, func(t *testing.T) { svc := setupTestServiceCfg(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.OCR2.Enabled = testutils.Ptr(true) if tc.httpTimeout != nil { c.JobPipeline.HTTPRequest.DefaultTimeout = tc.httpTimeout } }) if tc.before != nil { tc.before(svc) } err := svc.ApproveSpec(ctx, tc.id, tc.force) if tc.wantErr != "" { require.Error(t, err) assert.EqualError(t, err, tc.wantErr) } else { require.NoError(t, err) } })` $DIR/core/services/feeds/service_test.go: `.Ptr(true)` $DIR/core/services/feeds/service_test.go: `.before(svc)` $DIR/core/services/feeds/service_test.go: `.ApproveSpec(ctx, tc.id, tc.force)` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("RejectSpec", mock.Anything, spec.ID, )` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient.On("RejectedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.RejectedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), }, )` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(ctx context.Context) bool { return true })` $DIR/core/services/feeds/service_test.go: `.RemoteUUID.String()` $DIR/core/services/feeds/service_test.go: `.Return(&proto.RejectedJobResponse{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("Transact", mock.Anything, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `.New("failure")` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalSpec{ Status: feeds.SpecStatusRejected, }, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `.New("failure")` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(nil, errors.New("disconnected"))` $DIR/core/services/feeds/service_test.go: `.New("disconnected")` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("RejectSpec", mock.Anything, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(errors.New("failure"))` $DIR/core/services/feeds/service_test.go: `.New("failure")` $DIR/core/services/feeds/service_test.go: `.orm.On("Transact", mock.Anything, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `.orm.On("GetSpec", mock.Anything, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("GetJobProposal", mock.Anything, jp.ID)` $DIR/core/services/feeds/service_test.go: `.Return(jp, nil)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("GetClient", jp.FeedsManagerID)` $DIR/core/services/feeds/service_test.go: `.Return(svc.fmsClient, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("RejectSpec", mock.Anything, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.fmsClient. On("RejectedJob", mock.MatchedBy(func(ctx context.Context) bool { return true }), &proto.RejectedJobRequest{ Uuid: jp.RemoteUUID.String(), Version: int64(spec.Version), })` $DIR/core/services/feeds/service_test.go: `.MatchedBy(func(ctx context.Context) bool { return true })` $DIR/core/services/feeds/service_test.go: `.RemoteUUID.String()` $DIR/core/services/feeds/service_test.go: `. Return(nil, errors.New("rpc failure"))` $DIR/core/services/feeds/service_test.go: `.New("rpc failure")` $DIR/core/services/feeds/service_test.go: `.orm.On("Transact", mock.Anything, mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(svc.orm)} })` $DIR/core/services/feeds/service_test.go: `.Run(tc.name, func(t *testing.T) { t.Parallel() svc := setupTestService(t) if tc.before != nil { tc.before(svc) } err := svc.RejectSpec(ctx, spec.ID) if tc.wantErr != "" { require.Error(t, err) assert.Contains(t, err.Error(), tc.wantErr) } else { require.NoError(t, err) } })` $DIR/core/services/feeds/service_test.go: `.before(svc)` $DIR/core/services/feeds/service_test.go: `.RejectSpec(ctx, spec.ID)` $DIR/core/services/feeds/service_test.go: `.Context(t)` $DIR/core/services/feeds/service_test.go: `.orm. On("GetSpec", mock.Anything, specID, mock.Anything)` $DIR/core/services/feeds/service_test.go: `. Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("UpdateSpecDefinition", mock.Anything, specID, updatedSpec, mock.Anything, )` $DIR/core/services/feeds/service_test.go: `.Return(nil)` $DIR/core/services/feeds/service_test.go: `.orm. On("GetSpec", mock.Anything, specID, mock.Anything)` $DIR/core/services/feeds/service_test.go: `. Return(nil, sql.ErrNoRows)` $DIR/core/services/feeds/service_test.go: `.orm. On("GetSpec", mock.Anything, specID, mock.Anything)` $DIR/core/services/feeds/service_test.go: `. Return(nil, errors.New("other db error"))` $DIR/core/services/feeds/service_test.go: `.New("other db error")` $DIR/core/services/feeds/service_test.go: `.orm. On("GetSpec", mock.Anything, specID, mock.Anything)` $DIR/core/services/feeds/service_test.go: `. Return(spec, nil)` $DIR/core/services/feeds/service_test.go: `.Run(tc.name, func(t *testing.T) { t.Parallel() svc := setupTestService(t) if tc.before != nil { tc.before(svc) } err := svc.UpdateSpecDefinition(ctx, tc.specID, updatedSpec) if tc.wantErr != "" { assert.EqualError(t, err, tc.wantErr) } else { require.NoError(t, err) } })` $DIR/core/services/feeds/service_test.go: `.before(svc)` $DIR/core/services/feeds/service_test.go: `.UpdateSpecDefinition(ctx, tc.specID, updatedSpec)` $DIR/core/services/feeds/service_test.go: `.Decode([]byte(pubKeyHex), pubKey)` $DIR/core/services/feeds/service_test.go: `.csaKeystore.On("GetAll")` $DIR/core/services/feeds/service_test.go: `.Return([]csakey.KeyV2{key}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ListManagers", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return([]feeds.FeedsManager{mgr}, nil)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("IsConnected", mgr.ID)` $DIR/core/services/feeds/service_test.go: `.Return(false)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("Connect", mock.IsType(feeds.ConnectOpts{}))` $DIR/core/services/feeds/service_test.go: `.IsType(feeds.ConnectOpts{})` $DIR/core/services/feeds/service_test.go: `.connMgr.On("Close")` $DIR/core/services/feeds/service_test.go: `.orm.On("CountJobProposalsByStatus", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return(&feeds.JobProposalCounts{}, nil)` $DIR/core/services/feeds/service_test.go: `.csaKeystore.On("GetAll")` $DIR/core/services/feeds/service_test.go: `.Return([]csakey.KeyV2{key}, nil)` $DIR/core/services/feeds/service_test.go: `.orm.On("ListManagers", mock.Anything)` $DIR/core/services/feeds/service_test.go: `.Return([]feeds.FeedsManager{}, nil)` $DIR/core/services/feeds/service_test.go: `.connMgr.On("Close")` $DIR/core/services/feeds/service_test.go: `.Run(tt.name, func(t *testing.T) { t.Parallel() svc := setupTestService(t) if tt.beforeFunc != nil { tt.beforeFunc(svc) } servicetest.Run(t, svc) })` $DIR/core/services/feeds/service_test.go: `.beforeFunc(svc)` $DIR/core/services/feeds/service_test.go: `.Run(t, svc)` $DIR/core/services/fluxmonitorv2/contract_submitter_test.go: `keyStore.On("GetRoundRobinAddress", mock.Anything, testutils.FixtureChainID).Return(fromAddress, nil)` $DIR/core/services/fluxmonitorv2/contract_submitter_test.go: `fluxAggregator.On("Address").Return(toAddress)` $DIR/core/services/fluxmonitorv2/contract_submitter_test.go: `orm.On("CreateEthTransaction", mock.Anything, fromAddress, toAddress, payload, gasLimit, &idempotencyKey).Return(nil)` $DIR/core/services/fluxmonitorv2/contract_submitter_test.go: `err = submitter.Submit(testutils.Context(t), roundID, submission, &idempotencyKey)` $DIR/core/services/fluxmonitorv2/contract_submitter_test.go: `.NewFluxAggregator(t)` $DIR/core/services/fluxmonitorv2/contract_submitter_test.go: `.NewORM(t)` $DIR/core/services/fluxmonitorv2/contract_submitter_test.go: `.NewKeyStoreInterface(t)` $DIR/core/services/fluxmonitorv2/contract_submitter_test.go: `.NewFluxAggregatorContractSubmitter(fluxAggregator, orm, keyStore, gasLimit, forwardingAllowed, testutils.FixtureChainID)` $DIR/core/services/fluxmonitorv2/contract_submitter_test.go: `.NewAddress()` $DIR/core/services/fluxmonitorv2/contract_submitter_test.go: `.NewAddress()` $DIR/core/services/fluxmonitorv2/contract_submitter_test.go: `.NewInt(1)` $DIR/core/services/fluxmonitorv2/contract_submitter_test.go: `.NewInt(2)` $DIR/core/services/fluxmonitorv2/contract_submitter_test.go: `.FluxAggregatorABI.Pack("submit", roundID, submission)` $DIR/core/services/fluxmonitorv2/contract_submitter_test.go: `.On("GetRoundRobinAddress", mock.Anything, testutils.FixtureChainID)` $DIR/core/services/fluxmonitorv2/contract_submitter_test.go: `.Return(fromAddress, nil)` $DIR/core/services/fluxmonitorv2/contract_submitter_test.go: `.On("Address")` $DIR/core/services/fluxmonitorv2/contract_submitter_test.go: `.Return(toAddress)` $DIR/core/services/fluxmonitorv2/contract_submitter_test.go: `.New()` $DIR/core/services/fluxmonitorv2/contract_submitter_test.go: `.String()` $DIR/core/services/fluxmonitorv2/contract_submitter_test.go: `.On("CreateEthTransaction", mock.Anything, fromAddress, toAddress, payload, gasLimit, &idempotencyKey)` $DIR/core/services/fluxmonitorv2/contract_submitter_test.go: `.Return(nil)` $DIR/core/services/fluxmonitorv2/contract_submitter_test.go: `.Submit(testutils.Context(t), roundID, submission, &idempotencyKey)` $DIR/core/services/fluxmonitorv2/contract_submitter_test.go: `.Context(t)` $DIR/core/services/fluxmonitorv2/deviation_checker_test.go: `t.Run(tc.name, func(t *testing.T) { c(tc) })` $DIR/core/services/fluxmonitorv2/deviation_checker_test.go: `c(tc)` $DIR/core/services/fluxmonitorv2/deviation_checker_test.go: `test2.threshold = 0` $DIR/core/services/fluxmonitorv2/deviation_checker_test.go: `test2.expectation = test2.curPrice.Sub(tc.nextPrice).Abs().GreaterThan(i(0)) || test2.absoluteThreshold == 0` $DIR/core/services/fluxmonitorv2/deviation_checker_test.go: `t.Run(tc.name+" threshold zeroed", func(t *testing.T) { c(test2) })` $DIR/core/services/fluxmonitorv2/deviation_checker_test.go: `c(test2)` $DIR/core/services/fluxmonitorv2/deviation_checker_test.go: `test3.absoluteThreshold = 1e307` $DIR/core/services/fluxmonitorv2/deviation_checker_test.go: `test3.expectation = false` $DIR/core/services/fluxmonitorv2/deviation_checker_test.go: `t.Run(tc.name+" max absolute threshold", func(t *testing.T) { c(test3) })` $DIR/core/services/fluxmonitorv2/deviation_checker_test.go: `c(test3)` $DIR/core/services/fluxmonitorv2/deviation_checker_test.go: `.NewDeviationChecker(tc.threshold, tc.absoluteThreshold, logger.TestLogger(t))` $DIR/core/services/fluxmonitorv2/deviation_checker_test.go: `.TestLogger(t)` $DIR/core/services/fluxmonitorv2/deviation_checker_test.go: `.Run(tc.name, func(t *testing.T) { c(tc) })` $DIR/core/services/fluxmonitorv2/deviation_checker_test.go: `.curPrice.Sub(tc.nextPrice)` $DIR/core/services/fluxmonitorv2/deviation_checker_test.go: `.Abs()` $DIR/core/services/fluxmonitorv2/deviation_checker_test.go: `.GreaterThan(i(0))` $DIR/core/services/fluxmonitorv2/deviation_checker_test.go: `.Run(tc.name+" threshold zeroed", func(t *testing.T) { c(test2) })` $DIR/core/services/fluxmonitorv2/deviation_checker_test.go: `.Run(tc.name+" max absolute threshold", func(t *testing.T) { c(test3) })` $DIR/core/services/fluxmonitorv2/flags_test.go: `t.Run(tc.name, func(t *testing.T) { t.Parallel() var ( flagsContract = mocks.NewFlags(t) address = testutils.NewAddress() ) flags := fluxmonitorv2.ContractFlags{FlagsInterface: flagsContract} flagsContract.On("GetFlags", mock.Anything, mock.Anything). Run(func(args mock.Arguments) { require.Equal(t, []common.Address{ utils.ZeroAddress, address, }, args.Get(1).([]common.Address)) }). Return(tc.getFlagsResult, nil) result, err := flags.IsLowered(address) require.NoError(t, err) require.Equal(t, tc.expected, result) })` $DIR/core/services/fluxmonitorv2/flags_test.go: `flagsContract.On("GetFlags", mock.Anything, mock.Anything). Run(func(args mock.Arguments) { require.Equal(t, []common.Address{ utils.ZeroAddress, address, }, args.Get(1).([]common.Address)) }). Return(tc.getFlagsResult, nil)` $DIR/core/services/fluxmonitorv2/flags_test.go: `.Run(tc.name, func(t *testing.T) { t.Parallel() var ( flagsContract = mocks.NewFlags(t) address = testutils.NewAddress() ) flags := fluxmonitorv2.ContractFlags{FlagsInterface: flagsContract} flagsContract.On("GetFlags", mock.Anything, mock.Anything). Run(func(args mock.Arguments) { require.Equal(t, []common.Address{ utils.ZeroAddress, address, }, args.Get(1).([]common.Address)) }). Return(tc.getFlagsResult, nil) result, err := flags.IsLowered(address) require.NoError(t, err) require.Equal(t, tc.expected, result) })` $DIR/core/services/fluxmonitorv2/flags_test.go: `.NewFlags(t)` $DIR/core/services/fluxmonitorv2/flags_test.go: `.NewAddress()` $DIR/core/services/fluxmonitorv2/flags_test.go: `.On("GetFlags", mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flags_test.go: `. Run(func(args mock.Arguments) { require.Equal(t, []common.Address{ utils.ZeroAddress, address, }, args.Get(1).([]common.Address)) })` $DIR/core/services/fluxmonitorv2/flags_test.go: `. Return(tc.getFlagsResult, nil)` $DIR/core/services/fluxmonitorv2/flags_test.go: `.IsLowered(address)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `t.Run(tc.name, func(t *testing.T) { t.Parallel() fm, tm := setup(t, db) tm.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID).Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil).Once() tm.logBroadcaster.On("IsConnected").Return(tc.connected).Once() // Setup Answers answers := undeviatedAnswers if tc.answersDeviate { answers = deviatedAnswers } latestAnswer := answers.latestAnswer // Setup Run run := pipeline.Run{ ID: 1, PipelineSpecID: 1, } if tc.hasPreviousRun { switch tc.previousRunStatus { case pipeline.RunStatusCompleted: now := time.Now() run.FinishedAt = null.TimeFrom(now) case pipeline.RunStatusErrored: run.FatalErrors = []null.String{ null.StringFrom("Random: String, foo"), } default: } tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(reportableRoundID), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: reportableRoundID, PipelineRunID: corenull.Int64From(run.ID), NumSubmissions: 1, }, nil) tm.pipelineORM. On("FindRun", mock.Anything, run.ID). Return(run, nil) } else { if tc.connected { tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(reportableRoundID), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: reportableRoundID, }, nil) } } // Set up funds var availableFunds *big.Int var paymentAmount *big.Int minPayment := defaultMinimumContractPayment.ToInt() if tc.funded { availableFunds = big.NewInt(1).Mul(big.NewInt(10000), minPayment) paymentAmount = minPayment } else { availableFunds = big.NewInt(1) paymentAmount = minPayment } roundState := flux_aggregator_wrapper.OracleRoundState{ RoundId: reportableRoundID, EligibleToSubmit: tc.eligible, LatestSubmission: big.NewInt(latestAnswer), AvailableFunds: availableFunds, PaymentAmount: paymentAmount, OracleCount: oracleCount, } tm.fluxAggregator. On("OracleRoundState", nilOpts, nodeAddr, uint32(0)). Return(roundState, nil).Maybe() if tc.expectedToPoll { tm.fluxAggregator.On("LatestRoundData", nilOpts).Return(flux_aggregator_wrapper.LatestRoundData{ Answer: big.NewInt(10), UpdatedAt: big.NewInt(100), }, nil) tm.pipelineRunner. On("ExecuteRun", mock.Anything, pipelineSpec, pipeline.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "latestAnswer": float64(10), "updatedAt": float64(100), }, }, "jobSpec": map[string]interface{}{ "databaseID": int32(0), "externalJobID": uuid.UUID{}, "name": "", "evmChainID": testutils.FixtureChainID.String(), }, }, ), mock.Anything). Return(&run, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: decimal.NewFromInt(answers.polledAnswer), Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil) } if tc.expectedToSubmit { tm.pipelineRunner.On("InsertFinishedRun", mock.Anything, mock.Anything, mock.Anything, mock.Anything). Return(nil). Run(func(args mock.Arguments) { args.Get(2).(*pipeline.Run).ID = 1 }). Once() tm.contractSubmitter. On("Submit", mock.Anything, big.NewInt(reportableRoundID), big.NewInt(answers.polledAnswer), buildIdempotencyKey(run.ID)). Return(nil). Once() tm.orm. On("UpdateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(reportableRoundID), int64(1), mock.Anything, ). Return(nil) tm.orm.On("WithDataSource", mock.Anything).Return(fluxmonitorv2.ORM(tm.orm)) } oracles := []common.Address{nodeAddr, testutils.NewAddress()} tm.fluxAggregator.On("GetOracles", nilOpts).Return(oracles, nil) require.NoError(t, fm.SetOracleAddress()) fm.ExportedPollIfEligible(thresholds.rel, thresholds.abs) })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID).Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("IsConnected").Return(tc.connected).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `answers = deviatedAnswers` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `run.FinishedAt = null.TimeFrom(now)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `run.FatalErrors = []null.String{ null.StringFrom("Random: String, foo"), }` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(reportableRoundID), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: reportableRoundID, PipelineRunID: corenull.Int64From(run.ID), NumSubmissions: 1, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.pipelineORM. On("FindRun", mock.Anything, run.ID). Return(run, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(reportableRoundID), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: reportableRoundID, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `availableFunds = big.NewInt(1).Mul(big.NewInt(10000), minPayment)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `paymentAmount = minPayment` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `availableFunds = big.NewInt(1)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `paymentAmount = minPayment` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator. On("OracleRoundState", nilOpts, nodeAddr, uint32(0)). Return(roundState, nil).Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("LatestRoundData", nilOpts).Return(flux_aggregator_wrapper.LatestRoundData{ Answer: big.NewInt(10), UpdatedAt: big.NewInt(100), }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.pipelineRunner. On("ExecuteRun", mock.Anything, pipelineSpec, pipeline.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "latestAnswer": float64(10), "updatedAt": float64(100), }, }, "jobSpec": map[string]interface{}{ "databaseID": int32(0), "externalJobID": uuid.UUID{}, "name": "", "evmChainID": testutils.FixtureChainID.String(), }, }, ), mock.Anything). Return(&run, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: decimal.NewFromInt(answers.polledAnswer), Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.pipelineRunner.On("InsertFinishedRun", mock.Anything, mock.Anything, mock.Anything, mock.Anything). Return(nil). Run(func(args mock.Arguments) { args.Get(2).(*pipeline.Run).ID = 1 }). Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `args.Get(2).(*pipeline.Run).ID = 1` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.contractSubmitter. On("Submit", mock.Anything, big.NewInt(reportableRoundID), big.NewInt(answers.polledAnswer), buildIdempotencyKey(run.ID)). Return(nil). Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("UpdateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(reportableRoundID), int64(1), mock.Anything, ). Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm.On("WithDataSource", mock.Anything).Return(fluxmonitorv2.ORM(tm.orm))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("GetOracles", nilOpts).Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `fm.ExportedPollIfEligible(thresholds.rel, thresholds.abs)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID).Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("IsConnected").Return(true).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.jobORM. On("TryRecordError", mock.Anything, pipelineSpec.JobID, "Unable to call roundState method on provided contract. Check contract address.", ).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator. On("OracleRoundState", nilOpts, nodeAddr, mock.Anything). Return(roundState, errors.New("err")). Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("GetOracles", nilOpts).Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID).Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm.On("WithDataSource", mock.Anything).Return(fluxmonitorv2.ORM(tm.orm))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("Address").Return(common.Address{})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("LatestRoundData", nilOpts).Return(freshContractRoundDataResponse()).Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(1)). Return(makeRoundStateForRoundID(1), nil). Run(func(mock.Arguments) { readyToFillQueue.ItHappened() logsAwaiter.AwaitOrFail(t) }). Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `readyToFillQueue.ItHappened()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `logsAwaiter.AwaitOrFail(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(3)).Return(makeRoundStateForRoundID(3), nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(4)).Return(makeRoundStateForRoundID(4), nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("GetOracles", nilOpts).Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("Register", fm, mock.Anything).Return(func() {})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("IsConnected").Return(true).Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm.On("MostRecentFluxMonitorRoundID", mock.Anything, contractAddress).Return(uint32(1), nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm.On("MostRecentFluxMonitorRoundID", mock.Anything, contractAddress).Return(uint32(3), nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm.On("MostRecentFluxMonitorRoundID", mock.Anything, contractAddress).Return(uint32(4), nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(1), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: 1, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.pipelineRunner. On("ExecuteRun", mock.Anything, pipelineSpec, mock.Anything, mock.Anything). Return(run, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: decimal.NewFromInt(fetchedValue), Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.pipelineRunner. On("InsertFinishedRun", mock.Anything, mock.Anything, mock.Anything, mock.Anything). Return(nil). Run(func(args mock.Arguments) { args.Get(2).(*pipeline.Run).ID = 1 }).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `args.Get(2).(*pipeline.Run).ID = 1` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.contractSubmitter. On("Submit", mock.Anything, big.NewInt(1), big.NewInt(fetchedValue), buildIdempotencyKey(run.ID)). Return(nil). Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("UpdateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(1), mock.AnythingOfType("int64"), //int64(1), mock.Anything, ). Return(nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `run = &pipeline.Run{ID: 2}` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(3), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: 3, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.pipelineRunner. On("ExecuteRun", mock.Anything, pipelineSpec, mock.Anything, mock.Anything). Return(run, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: decimal.NewFromInt(fetchedValue), Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.pipelineRunner. On("InsertFinishedRun", mock.Anything, mock.Anything, mock.Anything, mock.Anything). Return(nil). Run(func(args mock.Arguments) { args.Get(2).(*pipeline.Run).ID = 2 }).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `args.Get(2).(*pipeline.Run).ID = 2` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.contractSubmitter. On("Submit", mock.Anything, big.NewInt(3), big.NewInt(fetchedValue), buildIdempotencyKey(run.ID)). Return(nil). Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("UpdateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(3), mock.AnythingOfType("int64"), //int64(2), mock.Anything, ). Return(nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `run = &pipeline.Run{ID: 3}` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(4), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: 3, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.pipelineRunner. On("ExecuteRun", mock.Anything, pipelineSpec, mock.Anything, mock.Anything). Return(run, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: decimal.NewFromInt(fetchedValue), Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.pipelineRunner. On("InsertFinishedRun", mock.Anything, mock.Anything, mock.Anything, mock.Anything). Return(nil). Run(func(args mock.Arguments) { args.Get(2).(*pipeline.Run).ID = 3 }).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `args.Get(2).(*pipeline.Run).ID = 3` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.contractSubmitter. On("Submit", mock.Anything, big.NewInt(4), big.NewInt(fetchedValue), buildIdempotencyKey(run.ID)). Return(nil). Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("UpdateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(4), mock.AnythingOfType("int64"), //int64(3), mock.Anything, ). Return(nil). Once(). Run(func(mock.Arguments) { readyToAssert.ItHappened() })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `readyToAssert.ItHappened()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `servicetest.Run(t, fm)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `logBroadcast.On("DecodedLog").Return(&flux_aggregator_wrapper.FluxAggregatorNewRound{RoundId: big.NewInt(int64(i)), StartedAt: big.NewInt(0)})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `logBroadcasts = append(logBroadcasts, logBroadcast)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `fm.HandleLog(ctx, logBroadcasts[0])` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `readyToFillQueue.AwaitOrFail(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `fm.HandleLog(ctx, logBroadcasts[1])` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `fm.HandleLog(ctx, logBroadcasts[2])` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `fm.HandleLog(ctx, logBroadcasts[3])` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `logsAwaiter.ItHappened()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `t.Run(tc.name, func(t *testing.T) { t.Parallel() var ( orm = newORM(t, db, nil) ) fm, tm := setup(t, db, disablePollTicker(true), disableIdleTimer(tc.idleTimerDisabled), setIdleTimerPeriod(tc.idleDuration), withORM(orm)) tm.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID).Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil).Once() const fetchedAnswer = 100 answerBigInt := big.NewInt(fetchedAnswer) tm.fluxAggregator.On("Address").Return(common.Address{}) tm.fluxAggregator.On("GetOracles", nilOpts).Return(oracles, nil) tm.logBroadcaster.On("Register", mock.Anything, mock.Anything).Return(func() {}) tm.logBroadcaster.On("IsConnected").Return(true).Maybe() idleDurationOccured := make(chan struct{}, 3) tm.fluxAggregator.On("LatestRoundData", nilOpts).Return(freshContractRoundDataResponse()).Once() if tc.expectedToSubmit { // performInitialPoll() roundState1 := flux_aggregator_wrapper.OracleRoundState{RoundId: 1, EligibleToSubmit: false, LatestSubmission: answerBigInt, StartedAt: now()} tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(roundState1, nil).Once() // idleDuration 1 roundState2 := flux_aggregator_wrapper.OracleRoundState{RoundId: 1, EligibleToSubmit: false, LatestSubmission: answerBigInt, StartedAt: now()} tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(roundState2, nil).Once().Run(func(args mock.Arguments) { idleDurationOccured <- struct{}{} }) } require.NoError(t, fm.Start(testutils.Context(t))) require.Len(t, idleDurationOccured, 0, "no Job Runs created") if tc.expectedToSubmit { g.Eventually(func() int { return len(idleDurationOccured) }, testutils.WaitTimeout(t)).Should(gomega.Equal(1)) chBlock := make(chan struct{}) // NewRound resets the idle timer roundState2 := flux_aggregator_wrapper.OracleRoundState{RoundId: 2, EligibleToSubmit: false, LatestSubmission: answerBigInt, StartedAt: now()} tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(2)).Return(roundState2, nil).Once().Run(func(args mock.Arguments) { close(chBlock) }) decodedLog := flux_aggregator_wrapper.FluxAggregatorNewRound{RoundId: big.NewInt(2), StartedAt: big.NewInt(0)} tm.logBroadcast.On("DecodedLog").Return(&decodedLog) tm.logBroadcast.On("String").Maybe().Return("") tm.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) tm.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) fm.HandleLog(testutils.Context(t), tm.logBroadcast) g.Eventually(chBlock).Should(gomega.BeClosed()) // idleDuration 2 roundState3 := flux_aggregator_wrapper.OracleRoundState{RoundId: 3, EligibleToSubmit: false, LatestSubmission: answerBigInt, StartedAt: now()} tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(roundState3, nil).Once().Run(func(args mock.Arguments) { idleDurationOccured <- struct{}{} }) g.Eventually(func() int { return len(idleDurationOccured) }, testutils.WaitTimeout(t)).Should(gomega.Equal(2)) } fm.Close() if !tc.expectedToSubmit { require.Len(t, idleDurationOccured, 0) } })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID).Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("Address").Return(common.Address{})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("GetOracles", nilOpts).Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("Register", mock.Anything, mock.Anything).Return(func() {})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("IsConnected").Return(true).Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("LatestRoundData", nilOpts).Return(freshContractRoundDataResponse()).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(roundState1, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(roundState2, nil).Once().Run(func(args mock.Arguments) { idleDurationOccured <- struct{}{} })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `idleDurationOccured <- struct{}{}` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `g.Eventually(func() int { return len(idleDurationOccured) }, testutils.WaitTimeout(t)).Should(gomega.Equal(1))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(2)).Return(roundState2, nil).Once().Run(func(args mock.Arguments) { close(chBlock) })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `close(chBlock)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcast.On("DecodedLog").Return(&decodedLog)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `fm.HandleLog(testutils.Context(t), tm.logBroadcast)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `g.Eventually(chBlock).Should(gomega.BeClosed())` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(roundState3, nil).Once().Run(func(args mock.Arguments) { idleDurationOccured <- struct{}{} })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `idleDurationOccured <- struct{}{}` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `g.Eventually(func() int { return len(idleDurationOccured) }, testutils.WaitTimeout(t)).Should(gomega.Equal(2))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID).Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("Address").Return(contractAddress)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("GetOracles", nilOpts).Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("Register", mock.Anything, mock.Anything).Return(func() {})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("IsConnected").Return(true)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("LatestRoundData", nilOpts).Return(freshContractRoundDataResponse()).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `t.Cleanup(func() { fm.Close() })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(roundState1, nil).Once().Run(func(args mock.Arguments) { pollOccured <- struct{}{} })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `pollOccured <- struct{}{}` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(1), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: 1, NumSubmissions: 0, }, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `g.Eventually(func() int { return len(pollOccured) }, testutils.WaitTimeout(t)).Should(gomega.Equal(1))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(roundState1Responded, nil).Once().Run(func(args mock.Arguments) { pollOccured <- struct{}{} })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `pollOccured <- struct{}{}` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(1), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ PipelineRunID: corenull.NewInt64(int64(1), true), Aggregator: contractAddress, RoundID: 1, NumSubmissions: 1, }, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.pipelineORM.On("FindRun", mock.Anything, int64(1)).Return(pipeline.Run{ FinishedAt: null.TimeFrom(finishedAt), }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `g.Eventually(func() int { return len(pollOccured) }, testutils.WaitTimeout(t)).Should(gomega.Equal(2))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(roundState2, nil).Once().Run(func(args mock.Arguments) { pollOccured <- struct{}{} })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `pollOccured <- struct{}{}` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(2), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: 2, NumSubmissions: 0, }, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `flags.On("ContractExists").Return(true)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `flags.On("Address").Return(common.Address{})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `flags.On("IsLowered", mock.Anything).Return(true, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID).Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("Address").Return(contractAddress)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("GetOracles", nilOpts).Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("Register", mock.Anything, mock.Anything).Return(func() {})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("IsConnected").Return(true)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("LatestRoundData", nilOpts).Return(freshContractRoundDataResponse()).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `t.Cleanup(func() { fm.Close() })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, roundZero).Return(roundState1, nil).Once().Run(func(args mock.Arguments) { pollOccured <- struct{}{} })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `pollOccured <- struct{}{}` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, roundOne, mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: 1, NumSubmissions: 0, }, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, roundZero).Return(roundState1Responded, nil).Once().Run(func(args mock.Arguments) { pollOccured <- struct{}{} })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `pollOccured <- struct{}{}` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, roundOne, mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ PipelineRunID: corenull.NewInt64(int64(1), true), Aggregator: contractAddress, RoundID: 1, NumSubmissions: 1, }, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.pipelineORM.On("FindRun", mock.Anything, int64(1)).Return(pipeline.Run{ FinishedAt: null.TimeFrom(finishedAt), FatalErrors: []null.String{null.StringFrom("an error to start retry ticker")}, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `flags.On("IsLowered", mock.Anything).Return(false, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `fm.ExportedRespondToFlagsRaisedLog()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, roundZero).Return(roundState2, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, roundTwo, mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: 2, NumSubmissions: 0, }, nil). Run(func(args mock.Arguments) { pollOccured <- struct{}{} }). Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `pollOccured <- struct{}{}` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID).Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("Address").Return(contractAddress)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("GetOracles", nilOpts).Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("Register", mock.Anything, mock.Anything).Return(func() {})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("IsConnected").Return(true)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("LatestRoundData", nilOpts).Return(freshContractRoundDataResponse()).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `servicetest.Run(t, fm)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(roundState1, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(1), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: 1, NumSubmissions: 0, }, nil).Once().Run(func(args mock.Arguments) { initialPollOccurred <- struct{}{} })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `initialPollOccurred <- struct{}{}` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `g.Eventually(func() int { return len(initialPollOccurred) }, testutils.WaitTimeout(t)).Should(gomega.Equal(1))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(roundState1Responded, nil).Once().Run(func(args mock.Arguments) { idleDurationOccured <- struct{}{} })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `idleDurationOccured <- struct{}{}` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(1), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ PipelineRunID: corenull.NewInt64(int64(1), true), Aggregator: contractAddress, RoundID: 1, NumSubmissions: 1, }, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.pipelineORM.On("FindRun", mock.Anything, int64(1)).Return(pipeline.Run{ FinishedAt: null.TimeFrom(finishedAt), }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `g.Eventually(func() int { return len(idleDurationOccured) }, testutils.WaitTimeout(t)).Should(gomega.Equal(1))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(roundState2, nil).Once().Run(func(args mock.Arguments) { idleDurationOccured <- struct{}{} })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `idleDurationOccured <- struct{}{}` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(2), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: 2, NumSubmissions: 0, }, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `g.Eventually(func() int { return len(idleDurationOccured) }, testutils.WaitTimeout(t)).Should(gomega.Equal(2))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(roundState3, nil).Twice().Run(func(args mock.Arguments) { idleDurationOccured <- struct{}{} })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `idleDurationOccured <- struct{}{}` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(3), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: 3, NumSubmissions: 0, }, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcast.On("DecodedLog").Return(&flux_aggregator_wrapper.FluxAggregatorAnswerUpdated{})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `fm.ExportedBacklog().Add(fluxmonitorv2.PriorityNewRoundLog, tm.logBroadcast)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `fm.ExportedProcessLogs()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.keyStore. On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID). Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil). Twice()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("Register", mock.Anything, mock.Anything).Return(func() {})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("LatestRoundData", nilOpts).Return(makeRoundDataForRoundID(1), nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(1)).Return(roundState0, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: 1, EligibleToSubmit: false, LatestSubmission: answerBigInt, StartedAt: 0, Timeout: 0, }, nil). Run(func(mock.Arguments) { close(ch) }). Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `close(ch)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("Address").Return(common.Address{})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("GetOracles", nilOpts).Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `fm.ExportedRoundState(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `servicetest.Run(t, fm)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `t.Run(test.name, func(t *testing.T) { t.Parallel() orm := newORM(t, db, nil) fm, tm := setup(t, db, disablePollTicker(true), disableIdleTimer(true), withORM(orm)) tm.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID).Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil).Once() tm.logBroadcaster.On("Register", mock.Anything, mock.Anything).Return(func() {}) tm.logBroadcaster.On("IsConnected").Return(true).Maybe() tm.fluxAggregator.On("Address").Return(common.Address{}) tm.fluxAggregator.On("GetOracles", nilOpts).Return(oracles, nil) tm.fluxAggregator.On("LatestRoundData", nilOpts).Return(makeRoundDataForRoundID(1), nil).Once() tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(1)).Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: 1, EligibleToSubmit: false, StartedAt: now(), Timeout: test.timeout, }, nil).Once() // 2nd roundstate call means round timer triggered chRoundState := make(chan struct{}) tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: 1, EligibleToSubmit: false, }, nil). Run(func(mock.Arguments) { close(chRoundState) }). Maybe() servicetest.Run(t, fm) if test.expectedToSubmit { g.Eventually(chRoundState).Should(gomega.BeClosed()) } else { g.Consistently(chRoundState).ShouldNot(gomega.BeClosed()) } })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID).Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("Register", mock.Anything, mock.Anything).Return(func() {})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("IsConnected").Return(true).Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("Address").Return(common.Address{})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("GetOracles", nilOpts).Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("LatestRoundData", nilOpts).Return(makeRoundDataForRoundID(1), nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(1)).Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: 1, EligibleToSubmit: false, StartedAt: now(), Timeout: test.timeout, }, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: 1, EligibleToSubmit: false, }, nil). Run(func(mock.Arguments) { close(chRoundState) }). Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `close(chRoundState)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `servicetest.Run(t, fm)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `g.Eventually(chRoundState).Should(gomega.BeClosed())` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `g.Consistently(chRoundState).ShouldNot(gomega.BeClosed())` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `t.Run(tc.name, func(t *testing.T) { orm := newORM(t, db, nil) fm, tm := setup(t, db, disablePollTicker(true), withORM(orm), ) initialPollOccurred := make(chan struct{}, 1) tm.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID).Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil).Once() tm.logBroadcaster.On("Register", mock.Anything, mock.Anything).Return(func() {}) tm.logBroadcaster.On("IsConnected").Return(true).Maybe() tm.fluxAggregator.On("Address").Return(common.Address{}) tm.fluxAggregator.On("GetOracles", nilOpts).Return(oracles, nil) tm.fluxAggregator.On("LatestRoundData", nilOpts).Return(makeRoundDataForRoundID(1), nil).Once() // first roundstate calling initialRoundState on fm.Start() tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(1)).Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: 1, EligibleToSubmit: false, StartedAt: tc.startedAt, Timeout: 10000, // round won't time out }, nil) // 2nd roundstate in initial poll roundState := flux_aggregator_wrapper.OracleRoundState{RoundId: 1, EligibleToSubmit: false} tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(roundState, nil). Once(). Run(func(args mock.Arguments) { initialPollOccurred <- struct{}{} }) // 3rd roundState call means idleTimer triggered chRoundState := make(chan struct{}) tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(roundState, nil). Run(func(mock.Arguments) { close(chRoundState) }). Maybe() servicetest.Run(t, fm) assert.Eventually(t, func() bool { return len(initialPollOccurred) == 1 }, 3*time.Second, 10*time.Millisecond) if tc.expectedToSubmit { g.Eventually(chRoundState).Should(gomega.BeClosed()) } else { g.Consistently(chRoundState).ShouldNot(gomega.BeClosed()) } })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID).Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("Register", mock.Anything, mock.Anything).Return(func() {})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("IsConnected").Return(true).Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("Address").Return(common.Address{})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("GetOracles", nilOpts).Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("LatestRoundData", nilOpts).Return(makeRoundDataForRoundID(1), nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(1)).Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: 1, EligibleToSubmit: false, StartedAt: tc.startedAt, Timeout: 10000, // round won't time out }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(roundState, nil). Once(). Run(func(args mock.Arguments) { initialPollOccurred <- struct{}{} })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `initialPollOccurred <- struct{}{}` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(roundState, nil). Run(func(mock.Arguments) { close(chRoundState) }). Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `close(chRoundState)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `servicetest.Run(t, fm)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `g.Eventually(chRoundState).Should(gomega.BeClosed())` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `g.Consistently(chRoundState).ShouldNot(gomega.BeClosed())` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID).Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("Register", mock.Anything, mock.Anything).Return(func() {})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("IsConnected").Return(true).Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("Address").Return(common.Address{})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("GetOracles", nilOpts).Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("LatestRoundData", nilOpts).Return(makeRoundDataForRoundID(1), nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(1)).Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: 1, EligibleToSubmit: false, LatestSubmission: answerBigInt, StartedAt: now(), Timeout: uint64(1000000), }, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: 1, EligibleToSubmit: false, LatestSubmission: answerBigInt, StartedAt: startedAt, PaymentAmount: big.NewInt(10), AvailableFunds: big.NewInt(100), Timeout: timeout, }, nil).Once(). Run(func(mock.Arguments) { close(chRoundState1) }). Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `close(chRoundState1)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: 1, EligibleToSubmit: false, LatestSubmission: answerBigInt, PaymentAmount: big.NewInt(10), AvailableFunds: big.NewInt(100), StartedAt: startedAt, Timeout: timeout, }, nil).Once(). Run(func(mock.Arguments) { close(chRoundState2) }). Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `close(chRoundState2)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `servicetest.Run(t, fm)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcast.On("DecodedLog").Return(&flux_aggregator_wrapper.FluxAggregatorNewRound{ RoundId: big.NewInt(0), StartedAt: big.NewInt(time.Now().UTC().Unix()), })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `fm.HandleLog(testutils.Context(t), tm.logBroadcast)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `g.Eventually(chRoundState1).Should(gomega.BeClosed())` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `g.Eventually(chRoundState2).Should(gomega.BeClosed())` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator. On("OracleRoundState", nilOpts, mock.Anything, mock.Anything). Return(flux_aggregator_wrapper.OracleRoundState{RoundId: 123}, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcast.On("DecodedLog").Return(&flux_aggregator_wrapper.FluxAggregatorAnswerUpdated{})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `fm.ExportedBacklog().Add(fluxmonitorv2.PriorityNewRoundLog, tm.logBroadcast)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `t.Run(tc.name, func(t *testing.T) { t.Parallel() fm, tm := setup(t, db) tm.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(tc.consumed, tc.err).Once() fm.ExportedBacklog().Add(fluxmonitorv2.PriorityNewRoundLog, tm.logBroadcast) fm.ExportedProcessLogs() })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(tc.consumed, tc.err).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `fm.ExportedBacklog().Add(fluxmonitorv2.PriorityNewRoundLog, tm.logBroadcast)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `fm.ExportedProcessLogs()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `t.Run("when NewRound log arrives, then poll ticker fires", func(t *testing.T) { db, nodeAddr := setupStoreWithKey(t) oracles := []common.Address{nodeAddr, testutils.NewAddress()} fm, tm := setup(t, db, disableIdleTimer(true), disablePollTicker(true), ) var ( paymentAmount = defaultMinimumContractPayment.ToInt() availableFunds = big.NewInt(1).Mul(paymentAmount, big.NewInt(1000)) ) const ( roundID = 3 answer = 100 ) run := &pipeline.Run{ID: 1} tm.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID).Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil).Once() tm.logBroadcaster.On("IsConnected").Return(true).Maybe() tm.orm.On("WithDataSource", mock.Anything).Return(fluxmonitorv2.ORM(tm.orm)) // Mocks initiated by the New Round log tm.orm.On("MostRecentFluxMonitorRoundID", mock.Anything, contractAddress).Return(uint32(roundID), nil).Once() tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: roundID, }, nil).Once() tm.pipelineRunner. On("ExecuteRun", mock.Anything, pipelineSpec, mock.Anything, mock.Anything). Return(run, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: decimal.NewFromInt(answer), Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil) tm.pipelineRunner. On("InsertFinishedRun", mock.Anything, mock.Anything, mock.Anything, mock.Anything). Return(nil). Run(func(args mock.Arguments) { args.Get(2).(*pipeline.Run).ID = 1 }) tm.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil).Once() tm.contractSubmitter.On("Submit", mock.Anything, big.NewInt(roundID), big.NewInt(answer), buildIdempotencyKey(run.ID)).Return(nil).Once() tm.orm. On("UpdateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), int64(1), uint(1), ). Return(nil) tm.fluxAggregator.On("GetOracles", nilOpts).Return(oracles, nil) require.NoError(t, fm.SetOracleAddress()) tm.fluxAggregator.On("LatestRoundData", nilOpts).Return(flux_aggregator_wrapper.LatestRoundData{ Answer: big.NewInt(10), UpdatedAt: big.NewInt(100), }, nil) // Fire off the NewRound log, which the node should respond to tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(roundID)). Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: roundID, LatestSubmission: big.NewInt(answer), EligibleToSubmit: true, AvailableFunds: availableFunds, PaymentAmount: paymentAmount, OracleCount: 1, }, nil). Once() fm.ExportedRespondToNewRoundLog(&flux_aggregator_wrapper.FluxAggregatorNewRound{ RoundId: big.NewInt(roundID), StartedAt: big.NewInt(0), }, log.NewLogBroadcast(types.Log{}, cltest.FixtureChainID, nil)) // Mocks initiated by polling // Now force the node to try to poll and ensure it does not respond this time tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)). Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: roundID, LatestSubmission: big.NewInt(answer), EligibleToSubmit: true, AvailableFunds: availableFunds, PaymentAmount: paymentAmount, OracleCount: 1, }, nil). Once() tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ PipelineRunID: corenull.NewInt64(int64(1), true), Aggregator: contractAddress, RoundID: roundID, NumSubmissions: 1, }, nil).Once() now := time.Now() tm.pipelineORM.On("FindRun", mock.Anything, int64(1)).Return(pipeline.Run{ FinishedAt: null.TimeFrom(now), }, nil) fm.ExportedPollIfEligible(0, 0) })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID).Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("IsConnected").Return(true).Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm.On("WithDataSource", mock.Anything).Return(fluxmonitorv2.ORM(tm.orm))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm.On("MostRecentFluxMonitorRoundID", mock.Anything, contractAddress).Return(uint32(roundID), nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: roundID, }, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.pipelineRunner. On("ExecuteRun", mock.Anything, pipelineSpec, mock.Anything, mock.Anything). Return(run, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: decimal.NewFromInt(answer), Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.pipelineRunner. On("InsertFinishedRun", mock.Anything, mock.Anything, mock.Anything, mock.Anything). Return(nil). Run(func(args mock.Arguments) { args.Get(2).(*pipeline.Run).ID = 1 })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `args.Get(2).(*pipeline.Run).ID = 1` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.contractSubmitter.On("Submit", mock.Anything, big.NewInt(roundID), big.NewInt(answer), buildIdempotencyKey(run.ID)).Return(nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("UpdateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), int64(1), uint(1), ). Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("GetOracles", nilOpts).Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("LatestRoundData", nilOpts).Return(flux_aggregator_wrapper.LatestRoundData{ Answer: big.NewInt(10), UpdatedAt: big.NewInt(100), }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(roundID)). Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: roundID, LatestSubmission: big.NewInt(answer), EligibleToSubmit: true, AvailableFunds: availableFunds, PaymentAmount: paymentAmount, OracleCount: 1, }, nil). Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `fm.ExportedRespondToNewRoundLog(&flux_aggregator_wrapper.FluxAggregatorNewRound{ RoundId: big.NewInt(roundID), StartedAt: big.NewInt(0), }, log.NewLogBroadcast(types.Log{}, cltest.FixtureChainID, nil))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)). Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: roundID, LatestSubmission: big.NewInt(answer), EligibleToSubmit: true, AvailableFunds: availableFunds, PaymentAmount: paymentAmount, OracleCount: 1, }, nil). Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ PipelineRunID: corenull.NewInt64(int64(1), true), Aggregator: contractAddress, RoundID: roundID, NumSubmissions: 1, }, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.pipelineORM.On("FindRun", mock.Anything, int64(1)).Return(pipeline.Run{ FinishedAt: null.TimeFrom(now), }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `fm.ExportedPollIfEligible(0, 0)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `t.Run("when poll ticker fires, then NewRound log arrives", func(t *testing.T) { db, nodeAddr := setupStoreWithKey(t) oracles := []common.Address{nodeAddr, testutils.NewAddress()} fm, tm := setup(t, db, disableIdleTimer(true), disablePollTicker(true), ) var ( paymentAmount = defaultMinimumContractPayment.ToInt() availableFunds = big.NewInt(1).Mul(paymentAmount, big.NewInt(1000)) ) const ( roundID = 3 answer = 100 ) run := &pipeline.Run{ID: 1} tm.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID).Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil).Once() tm.logBroadcaster.On("IsConnected").Return(true).Maybe() tm.orm.On("WithDataSource", mock.Anything).Return(fluxmonitorv2.ORM(tm.orm)) // First, force the node to try to poll, which should result in a submission tm.fluxAggregator.On("LatestRoundData", nilOpts).Return(flux_aggregator_wrapper.LatestRoundData{ Answer: big.NewInt(10), UpdatedAt: big.NewInt(100), }, nil) tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)). Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: roundID, LatestSubmission: big.NewInt(answer), EligibleToSubmit: true, AvailableFunds: availableFunds, PaymentAmount: paymentAmount, OracleCount: 1, }, nil). Once() tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: roundID, }, nil).Once() tm.pipelineRunner. On("ExecuteRun", mock.Anything, pipelineSpec, mock.Anything, mock.Anything). Return(run, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: decimal.NewFromInt(answer), Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil) tm.pipelineRunner. On("InsertFinishedRun", mock.Anything, mock.Anything, mock.Anything, mock.Anything). Return(nil). Run(func(args mock.Arguments) { args.Get(2).(*pipeline.Run).ID = 1 }) tm.contractSubmitter.On("Submit", mock.Anything, big.NewInt(roundID), big.NewInt(answer), buildIdempotencyKey(run.ID)).Return(nil).Once() tm.orm. On("UpdateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), int64(1), uint(0), ). Return(nil). Once() tm.fluxAggregator.On("GetOracles", nilOpts).Return(oracles, nil) require.NoError(t, fm.SetOracleAddress()) fm.ExportedPollIfEligible(0, 0) // Now fire off the NewRound log and ensure it does not respond this time tm.orm.On("MostRecentFluxMonitorRoundID", mock.Anything, contractAddress).Return(uint32(roundID), nil) tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ PipelineRunID: corenull.NewInt64(int64(1), true), Aggregator: contractAddress, RoundID: roundID, NumSubmissions: 1, }, nil).Once() tm.pipelineORM.On("FindRun", mock.Anything, int64(1)).Return(pipeline.Run{}, nil) tm.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) fm.ExportedRespondToNewRoundLog(&flux_aggregator_wrapper.FluxAggregatorNewRound{ RoundId: big.NewInt(roundID), StartedAt: big.NewInt(0), }, log.NewLogBroadcast(types.Log{}, cltest.FixtureChainID, nil)) })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID).Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("IsConnected").Return(true).Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm.On("WithDataSource", mock.Anything).Return(fluxmonitorv2.ORM(tm.orm))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("LatestRoundData", nilOpts).Return(flux_aggregator_wrapper.LatestRoundData{ Answer: big.NewInt(10), UpdatedAt: big.NewInt(100), }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)). Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: roundID, LatestSubmission: big.NewInt(answer), EligibleToSubmit: true, AvailableFunds: availableFunds, PaymentAmount: paymentAmount, OracleCount: 1, }, nil). Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: roundID, }, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.pipelineRunner. On("ExecuteRun", mock.Anything, pipelineSpec, mock.Anything, mock.Anything). Return(run, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: decimal.NewFromInt(answer), Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.pipelineRunner. On("InsertFinishedRun", mock.Anything, mock.Anything, mock.Anything, mock.Anything). Return(nil). Run(func(args mock.Arguments) { args.Get(2).(*pipeline.Run).ID = 1 })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `args.Get(2).(*pipeline.Run).ID = 1` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.contractSubmitter.On("Submit", mock.Anything, big.NewInt(roundID), big.NewInt(answer), buildIdempotencyKey(run.ID)).Return(nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("UpdateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), int64(1), uint(0), ). Return(nil). Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("GetOracles", nilOpts).Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `fm.ExportedPollIfEligible(0, 0)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm.On("MostRecentFluxMonitorRoundID", mock.Anything, contractAddress).Return(uint32(roundID), nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ PipelineRunID: corenull.NewInt64(int64(1), true), Aggregator: contractAddress, RoundID: roundID, NumSubmissions: 1, }, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.pipelineORM.On("FindRun", mock.Anything, int64(1)).Return(pipeline.Run{}, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `fm.ExportedRespondToNewRoundLog(&flux_aggregator_wrapper.FluxAggregatorNewRound{ RoundId: big.NewInt(roundID), StartedAt: big.NewInt(0), }, log.NewLogBroadcast(types.Log{}, cltest.FixtureChainID, nil))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID).Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("IsConnected").Return(true).Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm.On("WithDataSource", mock.Anything).Return(fluxmonitorv2.ORM(tm.orm))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("LatestRoundData", nilOpts).Return(flux_aggregator_wrapper.LatestRoundData{ Answer: big.NewInt(10), UpdatedAt: big.NewInt(100), }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)). Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: roundID, LatestSubmission: big.NewInt(answer), EligibleToSubmit: true, AvailableFunds: availableFunds, PaymentAmount: paymentAmount, OracleCount: 1, }, nil). Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: roundID, }, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.pipelineRunner. On("ExecuteRun", mock.Anything, pipelineSpec, mock.Anything, mock.Anything). Return(run, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: decimal.NewFromInt(answer), Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.pipelineRunner. On("InsertFinishedRun", mock.Anything, mock.Anything, mock.Anything, mock.Anything). Return(nil). Run(func(args mock.Arguments) { args.Get(2).(*pipeline.Run).ID = 1 })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `args.Get(2).(*pipeline.Run).ID = 1` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.contractSubmitter.On("Submit", mock.Anything, big.NewInt(roundID), big.NewInt(answer), buildIdempotencyKey(run.ID)).Return(nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("UpdateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), int64(1), uint(0), ). Return(nil). Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("GetOracles", nilOpts).Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `fm.ExportedPollIfEligible(0, 0)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm.On("MostRecentFluxMonitorRoundID", mock.Anything, contractAddress).Return(uint32(roundID), nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(olderRoundID), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ PipelineRunID: corenull.NewInt64(int64(1), true), Aggregator: contractAddress, RoundID: olderRoundID, NumSubmissions: 1, }, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.pipelineORM.On("FindRun", mock.Anything, int64(1)).Return(pipeline.Run{}, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `fm.ExportedRespondToNewRoundLog(&flux_aggregator_wrapper.FluxAggregatorNewRound{ RoundId: big.NewInt(olderRoundID), StartedAt: big.NewInt(0), }, log.NewLogBroadcast(types.Log{}, cltest.FixtureChainID, nil))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm.On("MostRecentFluxMonitorRoundID", mock.Anything, contractAddress).Return(uint32(roundID), nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(olderRoundID), uint(1)). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ PipelineRunID: corenull.NewInt64(int64(1), true), Aggregator: contractAddress, RoundID: olderRoundID, NumSubmissions: 1, NumNewRoundLogs: 1, }, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.pipelineORM.On("FindRun", mock.Anything, int64(1)).Return(pipeline.Run{}, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm.On("DeleteFluxMonitorRoundsBackThrough", mock.Anything, contractAddress, uint32(olderRoundID)).Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(olderRoundID), uint(1)). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ PipelineRunID: corenull.NewInt64(int64(1), true), Aggregator: contractAddress, RoundID: olderRoundID, NumSubmissions: 0, NumNewRoundLogs: 1, }, nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(olderRoundID)). Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: olderRoundID, LatestSubmission: big.NewInt(answer), EligibleToSubmit: true, AvailableFunds: availableFunds, PaymentAmount: paymentAmount, OracleCount: 1, }, nil). Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.contractSubmitter.On("Submit", mock.Anything, big.NewInt(olderRoundID), big.NewInt(answer), buildIdempotencyKey(run.ID)).Return(nil).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("UpdateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(olderRoundID), int64(1), uint(1), ). Return(nil). Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `fm.ExportedRespondToNewRoundLog(&flux_aggregator_wrapper.FluxAggregatorNewRound{ RoundId: big.NewInt(olderRoundID), StartedAt: big.NewInt(0), }, log.NewLogBroadcast(types.Log{}, cltest.FixtureChainID, nil))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `_, _ = setup(t, db, enableDrumbeatTicker("@every 10s", 0))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID).Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm.On("WithDataSource", mock.Anything).Return(fluxmonitorv2.ORM(tm.orm))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("Address").Return(common.Address{})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("GetOracles", nilOpts).Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("Register", mock.Anything, mock.Anything).Return(func() {})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.logBroadcaster.On("IsConnected").Return(true).Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("LatestRoundData", nilOpts).Return(freshContractRoundDataResponse()).Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)). Return(roundState, nil). Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, roundID). Return(roundState, nil). Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm.On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, roundID, mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{Aggregator: contractAddress, RoundID: roundID}, nil). Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator.On("LatestRoundData", nilOpts). Return(flux_aggregator_wrapper.LatestRoundData{ Answer: answerBigInt, UpdatedAt: big.NewInt(100), }, nil). Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.pipelineRunner. On("ExecuteRun", mock.Anything, pipelineSpec, pipeline.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "latestAnswer": float64(fetchedAnswer), "updatedAt": float64(100), }, }, "jobSpec": map[string]interface{}{ "databaseID": int32(0), "externalJobID": uuid.UUID{}, "name": "", "evmChainID": testutils.FixtureChainID.String(), }, }, ), mock.Anything). Return(&pipeline.Run{ID: runID}, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: decimal.NewFromInt(fetchedAnswer), Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil). Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.pipelineRunner.On("InsertFinishedRun", mock.Anything, mock.Anything, mock.Anything, mock.Anything). Return(nil). Run(func(args mock.Arguments) { args.Get(2).(*pipeline.Run).ID = runID }). Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `args.Get(2).(*pipeline.Run).ID = runID` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.contractSubmitter. On("Submit", mock.Anything, big.NewInt(int64(roundID)), answerBigInt, buildIdempotencyKey(runID)). Return(nil). Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.orm. On("UpdateFluxMonitorRoundStats", mock.Anything, contractAddress, roundID, runID, mock.Anything). Return(nil). Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `expectSubmission(2, 1)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `expectSubmission(3, 2)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `expectSubmission(4, 3)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `tm.fluxAggregator. On("OracleRoundState", nilOpts, nodeAddr, uint32(0)). Return(flux_aggregator_wrapper.OracleRoundState{RoundId: 4, EligibleToSubmit: false, LatestSubmission: answerBigInt, StartedAt: now()}, nil). Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `servicetest.Run(t, fm)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `cltest.EventuallyExpectationsMet(t, tm.logBroadcaster, waitTime, interval)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `cltest.EventuallyExpectationsMet(t, tm.fluxAggregator, waitTime, interval)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `cltest.EventuallyExpectationsMet(t, tm.orm, waitTime, interval)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `cltest.EventuallyExpectationsMet(t, tm.pipelineORM, waitTime, interval)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Run(tc.name, func(t *testing.T) { t.Parallel() fm, tm := setup(t, db) tm.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID).Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil).Once() tm.logBroadcaster.On("IsConnected").Return(tc.connected).Once() // Setup Answers answers := undeviatedAnswers if tc.answersDeviate { answers = deviatedAnswers } latestAnswer := answers.latestAnswer // Setup Run run := pipeline.Run{ ID: 1, PipelineSpecID: 1, } if tc.hasPreviousRun { switch tc.previousRunStatus { case pipeline.RunStatusCompleted: now := time.Now() run.FinishedAt = null.TimeFrom(now) case pipeline.RunStatusErrored: run.FatalErrors = []null.String{ null.StringFrom("Random: String, foo"), } default: } tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(reportableRoundID), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: reportableRoundID, PipelineRunID: corenull.Int64From(run.ID), NumSubmissions: 1, }, nil) tm.pipelineORM. On("FindRun", mock.Anything, run.ID). Return(run, nil) } else { if tc.connected { tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(reportableRoundID), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: reportableRoundID, }, nil) } } // Set up funds var availableFunds *big.Int var paymentAmount *big.Int minPayment := defaultMinimumContractPayment.ToInt() if tc.funded { availableFunds = big.NewInt(1).Mul(big.NewInt(10000), minPayment) paymentAmount = minPayment } else { availableFunds = big.NewInt(1) paymentAmount = minPayment } roundState := flux_aggregator_wrapper.OracleRoundState{ RoundId: reportableRoundID, EligibleToSubmit: tc.eligible, LatestSubmission: big.NewInt(latestAnswer), AvailableFunds: availableFunds, PaymentAmount: paymentAmount, OracleCount: oracleCount, } tm.fluxAggregator. On("OracleRoundState", nilOpts, nodeAddr, uint32(0)). Return(roundState, nil).Maybe() if tc.expectedToPoll { tm.fluxAggregator.On("LatestRoundData", nilOpts).Return(flux_aggregator_wrapper.LatestRoundData{ Answer: big.NewInt(10), UpdatedAt: big.NewInt(100), }, nil) tm.pipelineRunner. On("ExecuteRun", mock.Anything, pipelineSpec, pipeline.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "latestAnswer": float64(10), "updatedAt": float64(100), }, }, "jobSpec": map[string]interface{}{ "databaseID": int32(0), "externalJobID": uuid.UUID{}, "name": "", "evmChainID": testutils.FixtureChainID.String(), }, }, ), mock.Anything). Return(&run, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: decimal.NewFromInt(answers.polledAnswer), Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil) } if tc.expectedToSubmit { tm.pipelineRunner.On("InsertFinishedRun", mock.Anything, mock.Anything, mock.Anything, mock.Anything). Return(nil). Run(func(args mock.Arguments) { args.Get(2).(*pipeline.Run).ID = 1 }). Once() tm.contractSubmitter. On("Submit", mock.Anything, big.NewInt(reportableRoundID), big.NewInt(answers.polledAnswer), buildIdempotencyKey(run.ID)). Return(nil). Once() tm.orm. On("UpdateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(reportableRoundID), int64(1), mock.Anything, ). Return(nil) tm.orm.On("WithDataSource", mock.Anything).Return(fluxmonitorv2.ORM(tm.orm)) } oracles := []common.Address{nodeAddr, testutils.NewAddress()} tm.fluxAggregator.On("GetOracles", nilOpts).Return(oracles, nil) require.NoError(t, fm.SetOracleAddress()) fm.ExportedPollIfEligible(thresholds.rel, thresholds.abs) })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("IsConnected")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(tc.connected)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Now()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.TimeFrom(now)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.StringFrom("Random: String, foo")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(reportableRoundID), mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: reportableRoundID, PipelineRunID: corenull.Int64From(run.ID), NumSubmissions: 1, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Int64From(run.ID)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.pipelineORM. On("FindRun", mock.Anything, run.ID)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(run, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(reportableRoundID), mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: reportableRoundID, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ToInt()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(1)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Mul(big.NewInt(10000), minPayment)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(10000)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(1)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(latestAnswer)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator. On("OracleRoundState", nilOpts, nodeAddr, uint32(0))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(roundState, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("LatestRoundData", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(flux_aggregator_wrapper.LatestRoundData{ Answer: big.NewInt(10), UpdatedAt: big.NewInt(100), }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(10)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(100)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.pipelineRunner. On("ExecuteRun", mock.Anything, pipelineSpec, pipeline.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "latestAnswer": float64(10), "updatedAt": float64(100), }, }, "jobSpec": map[string]interface{}{ "databaseID": int32(0), "externalJobID": uuid.UUID{}, "name": "", "evmChainID": testutils.FixtureChainID.String(), }, }, ), mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "latestAnswer": float64(10), "updatedAt": float64(100), }, }, "jobSpec": map[string]interface{}{ "databaseID": int32(0), "externalJobID": uuid.UUID{}, "name": "", "evmChainID": testutils.FixtureChainID.String(), }, }, )` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.FixtureChainID.String()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(&run, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: decimal.NewFromInt(answers.polledAnswer), Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewFromInt(answers.polledAnswer)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.pipelineRunner.On("InsertFinishedRun", mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Run(func(args mock.Arguments) { args.Get(2).(*pipeline.Run).ID = 1 })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Get(2)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.contractSubmitter. On("Submit", mock.Anything, big.NewInt(reportableRoundID), big.NewInt(answers.polledAnswer), buildIdempotencyKey(run.ID))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(reportableRoundID)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(answers.polledAnswer)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("UpdateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(reportableRoundID), int64(1), mock.Anything, )` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(fluxmonitorv2.ORM(tm.orm))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ORM(tm.orm)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewAddress()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("GetOracles", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ExportedPollIfEligible(thresholds.rel, thresholds.abs)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewAddress()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("IsConnected")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(true)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.jobORM. On("TryRecordError", mock.Anything, pipelineSpec.JobID, "Unable to call roundState method on provided contract. Check contract address.", )` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator. On("OracleRoundState", nilOpts, nodeAddr, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(roundState, errors.New("err"))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.New("err")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("GetOracles", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewAddress()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(100)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ToInt()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ToInt()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewAwaiter()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewAwaiter()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewAwaiter()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(fluxmonitorv2.ORM(tm.orm))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ORM(tm.orm)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("Address")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(common.Address{})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("LatestRoundData", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(freshContractRoundDataResponse())` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(1))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(makeRoundStateForRoundID(1), nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Run(func(mock.Arguments) { readyToFillQueue.ItHappened() logsAwaiter.AwaitOrFail(t) })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ItHappened()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.AwaitOrFail(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(3))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(makeRoundStateForRoundID(3), nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(4))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(makeRoundStateForRoundID(4), nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("GetOracles", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("Register", fm, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(func() {})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("IsConnected")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(true)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm.On("MostRecentFluxMonitorRoundID", mock.Anything, contractAddress)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(uint32(1), nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm.On("MostRecentFluxMonitorRoundID", mock.Anything, contractAddress)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(uint32(3), nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm.On("MostRecentFluxMonitorRoundID", mock.Anything, contractAddress)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(uint32(4), nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(1), mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: 1, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.pipelineRunner. On("ExecuteRun", mock.Anything, pipelineSpec, mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(run, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: decimal.NewFromInt(fetchedValue), Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewFromInt(fetchedValue)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.pipelineRunner. On("InsertFinishedRun", mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Run(func(args mock.Arguments) { args.Get(2).(*pipeline.Run).ID = 1 })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Get(2)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.contractSubmitter. On("Submit", mock.Anything, big.NewInt(1), big.NewInt(fetchedValue), buildIdempotencyKey(run.ID))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(1)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(fetchedValue)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("UpdateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(1), mock.AnythingOfType("int64"), //int64(1), mock.Anything, )` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.AnythingOfType("int64")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(3), mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: 3, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.pipelineRunner. On("ExecuteRun", mock.Anything, pipelineSpec, mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(run, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: decimal.NewFromInt(fetchedValue), Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewFromInt(fetchedValue)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.pipelineRunner. On("InsertFinishedRun", mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Run(func(args mock.Arguments) { args.Get(2).(*pipeline.Run).ID = 2 })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Get(2)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.contractSubmitter. On("Submit", mock.Anything, big.NewInt(3), big.NewInt(fetchedValue), buildIdempotencyKey(run.ID))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(3)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(fetchedValue)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("UpdateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(3), mock.AnythingOfType("int64"), //int64(2), mock.Anything, )` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.AnythingOfType("int64")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(4), mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: 3, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.pipelineRunner. On("ExecuteRun", mock.Anything, pipelineSpec, mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(run, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: decimal.NewFromInt(fetchedValue), Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewFromInt(fetchedValue)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.pipelineRunner. On("InsertFinishedRun", mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Run(func(args mock.Arguments) { args.Get(2).(*pipeline.Run).ID = 3 })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Get(2)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.contractSubmitter. On("Submit", mock.Anything, big.NewInt(4), big.NewInt(fetchedValue), buildIdempotencyKey(run.ID))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(4)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(fetchedValue)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("UpdateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(4), mock.AnythingOfType("int64"), //int64(3), mock.Anything, )` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.AnythingOfType("int64")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Run(func(mock.Arguments) { readyToAssert.ItHappened() })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ItHappened()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Run(t, fm)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewBroadcast(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.On("DecodedLog")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(&flux_aggregator_wrapper.FluxAggregatorNewRound{RoundId: big.NewInt(int64(i)), StartedAt: big.NewInt(0)})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(int64(i))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(0)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.On("String")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return("")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(false, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Context(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.HandleLog(ctx, logBroadcasts[0])` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.AwaitOrFail(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.HandleLog(ctx, logBroadcasts[1])` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.HandleLog(ctx, logBroadcasts[2])` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.HandleLog(ctx, logBroadcasts[3])` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ItHappened()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewWithT(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewAddress()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Run(tc.name, func(t *testing.T) { t.Parallel() var ( orm = newORM(t, db, nil) ) fm, tm := setup(t, db, disablePollTicker(true), disableIdleTimer(tc.idleTimerDisabled), setIdleTimerPeriod(tc.idleDuration), withORM(orm)) tm.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID).Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil).Once() const fetchedAnswer = 100 answerBigInt := big.NewInt(fetchedAnswer) tm.fluxAggregator.On("Address").Return(common.Address{}) tm.fluxAggregator.On("GetOracles", nilOpts).Return(oracles, nil) tm.logBroadcaster.On("Register", mock.Anything, mock.Anything).Return(func() {}) tm.logBroadcaster.On("IsConnected").Return(true).Maybe() idleDurationOccured := make(chan struct{}, 3) tm.fluxAggregator.On("LatestRoundData", nilOpts).Return(freshContractRoundDataResponse()).Once() if tc.expectedToSubmit { // performInitialPoll() roundState1 := flux_aggregator_wrapper.OracleRoundState{RoundId: 1, EligibleToSubmit: false, LatestSubmission: answerBigInt, StartedAt: now()} tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(roundState1, nil).Once() // idleDuration 1 roundState2 := flux_aggregator_wrapper.OracleRoundState{RoundId: 1, EligibleToSubmit: false, LatestSubmission: answerBigInt, StartedAt: now()} tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(roundState2, nil).Once().Run(func(args mock.Arguments) { idleDurationOccured <- struct{}{} }) } require.NoError(t, fm.Start(testutils.Context(t))) require.Len(t, idleDurationOccured, 0, "no Job Runs created") if tc.expectedToSubmit { g.Eventually(func() int { return len(idleDurationOccured) }, testutils.WaitTimeout(t)).Should(gomega.Equal(1)) chBlock := make(chan struct{}) // NewRound resets the idle timer roundState2 := flux_aggregator_wrapper.OracleRoundState{RoundId: 2, EligibleToSubmit: false, LatestSubmission: answerBigInt, StartedAt: now()} tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(2)).Return(roundState2, nil).Once().Run(func(args mock.Arguments) { close(chBlock) }) decodedLog := flux_aggregator_wrapper.FluxAggregatorNewRound{RoundId: big.NewInt(2), StartedAt: big.NewInt(0)} tm.logBroadcast.On("DecodedLog").Return(&decodedLog) tm.logBroadcast.On("String").Maybe().Return("") tm.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) tm.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) fm.HandleLog(testutils.Context(t), tm.logBroadcast) g.Eventually(chBlock).Should(gomega.BeClosed()) // idleDuration 2 roundState3 := flux_aggregator_wrapper.OracleRoundState{RoundId: 3, EligibleToSubmit: false, LatestSubmission: answerBigInt, StartedAt: now()} tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(roundState3, nil).Once().Run(func(args mock.Arguments) { idleDurationOccured <- struct{}{} }) g.Eventually(func() int { return len(idleDurationOccured) }, testutils.WaitTimeout(t)).Should(gomega.Equal(2)) } fm.Close() if !tc.expectedToSubmit { require.Len(t, idleDurationOccured, 0) } })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(fetchedAnswer)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("Address")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(common.Address{})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("GetOracles", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("Register", mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(func() {})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("IsConnected")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(true)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("LatestRoundData", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(freshContractRoundDataResponse())` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(roundState1, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(roundState2, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Run(func(args mock.Arguments) { idleDurationOccured <- struct{}{} })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Eventually(func() int { return len(idleDurationOccured) }, testutils.WaitTimeout(t))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.WaitTimeout(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Should(gomega.Equal(1))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Equal(1)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(2))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(roundState2, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Run(func(args mock.Arguments) { close(chBlock) })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(2)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(0)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcast.On("DecodedLog")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(&decodedLog)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcast.On("String")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return("")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(false, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.HandleLog(testutils.Context(t), tm.logBroadcast)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Context(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Eventually(chBlock)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Should(gomega.BeClosed())` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.BeClosed()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(roundState3, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Run(func(args mock.Arguments) { idleDurationOccured <- struct{}{} })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Eventually(func() int { return len(idleDurationOccured) }, testutils.WaitTimeout(t))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.WaitTimeout(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Should(gomega.Equal(2))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Equal(2)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewWithT(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewAddress()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(fetchedAnswer)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("Address")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(contractAddress)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("GetOracles", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("Register", mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(func() {})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("IsConnected")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(true)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("LatestRoundData", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(freshContractRoundDataResponse())` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Start(testutils.Context(t))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Context(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Cleanup(func() { fm.Close() })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(roundState1, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Run(func(args mock.Arguments) { pollOccured <- struct{}{} })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(1), mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: 1, NumSubmissions: 0, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Eventually(func() int { return len(pollOccured) }, testutils.WaitTimeout(t))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.WaitTimeout(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Should(gomega.Equal(1))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Equal(1)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(roundState1Responded, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Run(func(args mock.Arguments) { pollOccured <- struct{}{} })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(1), mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ PipelineRunID: corenull.NewInt64(int64(1), true), Aggregator: contractAddress, RoundID: 1, NumSubmissions: 1, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt64(int64(1), true)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Now()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.pipelineORM.On("FindRun", mock.Anything, int64(1))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(pipeline.Run{ FinishedAt: null.TimeFrom(finishedAt), }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.TimeFrom(finishedAt)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Eventually(func() int { return len(pollOccured) }, testutils.WaitTimeout(t))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.WaitTimeout(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Should(gomega.Equal(2))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Equal(2)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(roundState2, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Run(func(args mock.Arguments) { pollOccured <- struct{}{} })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(2), mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: 2, NumSubmissions: 0, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Eventually(func() int { return len(pollOccured) }, testutils.WaitTimeout(t))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.WaitTimeout(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Equal(3)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewAddress()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewFlags(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.On("ContractExists")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(true)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.On("Address")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(common.Address{})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.On("IsLowered", mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(true, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(fetchedAnswer)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("Address")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(contractAddress)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("GetOracles", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("Register", mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(func() {})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("IsConnected")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(true)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("LatestRoundData", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(freshContractRoundDataResponse())` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Start(testutils.Context(t))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Context(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Cleanup(func() { fm.Close() })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(0)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, roundZero)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(roundState1, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Run(func(args mock.Arguments) { pollOccured <- struct{}{} })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, roundOne, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: 1, NumSubmissions: 0, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.After(testutils.WaitTimeout(t))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.WaitTimeout(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, roundZero)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(roundState1Responded, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Run(func(args mock.Arguments) { pollOccured <- struct{}{} })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, roundOne, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ PipelineRunID: corenull.NewInt64(int64(1), true), Aggregator: contractAddress, RoundID: 1, NumSubmissions: 1, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt64(int64(1), true)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Now()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.pipelineORM.On("FindRun", mock.Anything, int64(1))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(pipeline.Run{ FinishedAt: null.TimeFrom(finishedAt), FatalErrors: []null.String{null.StringFrom("an error to start retry ticker")}, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.TimeFrom(finishedAt)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.StringFrom("an error to start retry ticker")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.After(testutils.WaitTimeout(t))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.WaitTimeout(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.On("IsLowered", mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(false, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ExportedRespondToFlagsRaisedLog()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, roundZero)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(roundState2, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, roundTwo, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: 2, NumSubmissions: 0, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Run(func(args mock.Arguments) { pollOccured <- struct{}{} })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.After(2 * time.Second)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.After(testutils.WaitTimeout(t))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.WaitTimeout(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewWithT(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewAddress()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(fetchedAnswer)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("Address")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(contractAddress)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("GetOracles", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("Register", mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(func() {})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("IsConnected")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(true)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("LatestRoundData", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(freshContractRoundDataResponse())` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Run(t, fm)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(roundState1, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(1), mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: 1, NumSubmissions: 0, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Run(func(args mock.Arguments) { initialPollOccurred <- struct{}{} })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Eventually(func() int { return len(initialPollOccurred) }, testutils.WaitTimeout(t))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.WaitTimeout(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Should(gomega.Equal(1))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Equal(1)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(roundState1Responded, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Run(func(args mock.Arguments) { idleDurationOccured <- struct{}{} })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(1), mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ PipelineRunID: corenull.NewInt64(int64(1), true), Aggregator: contractAddress, RoundID: 1, NumSubmissions: 1, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt64(int64(1), true)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Now()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.pipelineORM.On("FindRun", mock.Anything, int64(1))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(pipeline.Run{ FinishedAt: null.TimeFrom(finishedAt), }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.TimeFrom(finishedAt)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Eventually(func() int { return len(idleDurationOccured) }, testutils.WaitTimeout(t))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.WaitTimeout(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Should(gomega.Equal(1))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Equal(1)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(roundState2, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Run(func(args mock.Arguments) { idleDurationOccured <- struct{}{} })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(2), mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: 2, NumSubmissions: 0, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Eventually(func() int { return len(idleDurationOccured) }, testutils.WaitTimeout(t))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.WaitTimeout(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Should(gomega.Equal(2))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Equal(2)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(roundState3, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Twice()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Run(func(args mock.Arguments) { idleDurationOccured <- struct{}{} })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(3), mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: 3, NumSubmissions: 0, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(false, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcast.On("DecodedLog")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(&flux_aggregator_wrapper.FluxAggregatorAnswerUpdated{})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcast.On("String")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return("")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ExportedBacklog()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Add(fluxmonitorv2.PriorityNewRoundLog, tm.logBroadcast)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ExportedProcessLogs()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Eventually(func() int { return len(idleDurationOccured) }, testutils.WaitTimeout(t))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.WaitTimeout(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Equal(4)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewWithT(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewAddress()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.keyStore. On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Twice()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(fetchedAnswer)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("Register", mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(func() {})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("LatestRoundData", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(makeRoundDataForRoundID(1), nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(1))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(roundState0, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: 1, EligibleToSubmit: false, LatestSubmission: answerBigInt, StartedAt: 0, Timeout: 0, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Run(func(mock.Arguments) { close(ch) })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("Address")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(common.Address{})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("GetOracles", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ExportedRoundState(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Run(t, fm)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Eventually(ch)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.BeClosed()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewWithT(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewAddress()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Run(test.name, func(t *testing.T) { t.Parallel() orm := newORM(t, db, nil) fm, tm := setup(t, db, disablePollTicker(true), disableIdleTimer(true), withORM(orm)) tm.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID).Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil).Once() tm.logBroadcaster.On("Register", mock.Anything, mock.Anything).Return(func() {}) tm.logBroadcaster.On("IsConnected").Return(true).Maybe() tm.fluxAggregator.On("Address").Return(common.Address{}) tm.fluxAggregator.On("GetOracles", nilOpts).Return(oracles, nil) tm.fluxAggregator.On("LatestRoundData", nilOpts).Return(makeRoundDataForRoundID(1), nil).Once() tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(1)).Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: 1, EligibleToSubmit: false, StartedAt: now(), Timeout: test.timeout, }, nil).Once() // 2nd roundstate call means round timer triggered chRoundState := make(chan struct{}) tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: 1, EligibleToSubmit: false, }, nil). Run(func(mock.Arguments) { close(chRoundState) }). Maybe() servicetest.Run(t, fm) if test.expectedToSubmit { g.Eventually(chRoundState).Should(gomega.BeClosed()) } else { g.Consistently(chRoundState).ShouldNot(gomega.BeClosed()) } })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("Register", mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(func() {})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("IsConnected")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(true)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("Address")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(common.Address{})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("GetOracles", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("LatestRoundData", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(makeRoundDataForRoundID(1), nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(1))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: 1, EligibleToSubmit: false, StartedAt: now(), Timeout: test.timeout, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: 1, EligibleToSubmit: false, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Run(func(mock.Arguments) { close(chRoundState) })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Run(t, fm)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Eventually(chRoundState)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Should(gomega.BeClosed())` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.BeClosed()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Consistently(chRoundState)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ShouldNot(gomega.BeClosed())` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.BeClosed()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewWithT(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewAddress()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Now()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Add(idleTimerPeriod * -1)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Add(2 * time.Second)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Unix()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Run(tc.name, func(t *testing.T) { orm := newORM(t, db, nil) fm, tm := setup(t, db, disablePollTicker(true), withORM(orm), ) initialPollOccurred := make(chan struct{}, 1) tm.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID).Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil).Once() tm.logBroadcaster.On("Register", mock.Anything, mock.Anything).Return(func() {}) tm.logBroadcaster.On("IsConnected").Return(true).Maybe() tm.fluxAggregator.On("Address").Return(common.Address{}) tm.fluxAggregator.On("GetOracles", nilOpts).Return(oracles, nil) tm.fluxAggregator.On("LatestRoundData", nilOpts).Return(makeRoundDataForRoundID(1), nil).Once() // first roundstate calling initialRoundState on fm.Start() tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(1)).Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: 1, EligibleToSubmit: false, StartedAt: tc.startedAt, Timeout: 10000, // round won't time out }, nil) // 2nd roundstate in initial poll roundState := flux_aggregator_wrapper.OracleRoundState{RoundId: 1, EligibleToSubmit: false} tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(roundState, nil). Once(). Run(func(args mock.Arguments) { initialPollOccurred <- struct{}{} }) // 3rd roundState call means idleTimer triggered chRoundState := make(chan struct{}) tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)).Return(roundState, nil). Run(func(mock.Arguments) { close(chRoundState) }). Maybe() servicetest.Run(t, fm) assert.Eventually(t, func() bool { return len(initialPollOccurred) == 1 }, 3*time.Second, 10*time.Millisecond) if tc.expectedToSubmit { g.Eventually(chRoundState).Should(gomega.BeClosed()) } else { g.Consistently(chRoundState).ShouldNot(gomega.BeClosed()) } })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("Register", mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(func() {})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("IsConnected")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(true)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("Address")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(common.Address{})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("GetOracles", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("LatestRoundData", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(makeRoundDataForRoundID(1), nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(1))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: 1, EligibleToSubmit: false, StartedAt: tc.startedAt, Timeout: 10000, // round won't time out }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(roundState, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Run(func(args mock.Arguments) { initialPollOccurred <- struct{}{} })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(roundState, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Run(func(mock.Arguments) { close(chRoundState) })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Run(t, fm)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Eventually(chRoundState)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Should(gomega.BeClosed())` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.BeClosed()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Consistently(chRoundState)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ShouldNot(gomega.BeClosed())` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.BeClosed()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewWithT(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewAddress()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(fetchedAnswer)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("Register", mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(func() {})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("IsConnected")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(true)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("Address")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(common.Address{})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("GetOracles", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("LatestRoundData", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(makeRoundDataForRoundID(1), nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(1))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: 1, EligibleToSubmit: false, LatestSubmission: answerBigInt, StartedAt: now(), Timeout: uint64(1000000), }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Now()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Unix()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: 1, EligibleToSubmit: false, LatestSubmission: answerBigInt, StartedAt: startedAt, PaymentAmount: big.NewInt(10), AvailableFunds: big.NewInt(100), Timeout: timeout, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(10)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(100)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Run(func(mock.Arguments) { close(chRoundState1) })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: 1, EligibleToSubmit: false, LatestSubmission: answerBigInt, PaymentAmount: big.NewInt(10), AvailableFunds: big.NewInt(100), StartedAt: startedAt, Timeout: timeout, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(10)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(100)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Run(func(mock.Arguments) { close(chRoundState2) })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Run(t, fm)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(false, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcast.On("DecodedLog")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(&flux_aggregator_wrapper.FluxAggregatorNewRound{ RoundId: big.NewInt(0), StartedAt: big.NewInt(time.Now().UTC().Unix()), })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(0)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(time.Now().UTC().Unix())` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Now()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.UTC()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Unix()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcast.On("String")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return("")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.HandleLog(testutils.Context(t), tm.logBroadcast)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Context(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Eventually(chRoundState1)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Should(gomega.BeClosed())` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.BeClosed()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Eventually(chRoundState2)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Should(gomega.BeClosed())` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.BeClosed()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Duration(2*timeout)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewSqlxDB(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator. On("OracleRoundState", nilOpts, mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(flux_aggregator_wrapper.OracleRoundState{RoundId: 123}, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(false, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcast.On("DecodedLog")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(&flux_aggregator_wrapper.FluxAggregatorAnswerUpdated{})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcast.On("String")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return("")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ExportedBacklog()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Add(fluxmonitorv2.PriorityNewRoundLog, tm.logBroadcast)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.New("err")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewSqlxDB(t)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Run(tc.name, func(t *testing.T) { t.Parallel() fm, tm := setup(t, db) tm.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(tc.consumed, tc.err).Once() fm.ExportedBacklog().Add(fluxmonitorv2.PriorityNewRoundLog, tm.logBroadcast) fm.ExportedProcessLogs() })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(tc.consumed, tc.err)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ExportedBacklog()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Add(fluxmonitorv2.PriorityNewRoundLog, tm.logBroadcast)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ExportedProcessLogs()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Run("when NewRound log arrives, then poll ticker fires", func(t *testing.T) { db, nodeAddr := setupStoreWithKey(t) oracles := []common.Address{nodeAddr, testutils.NewAddress()} fm, tm := setup(t, db, disableIdleTimer(true), disablePollTicker(true), ) var ( paymentAmount = defaultMinimumContractPayment.ToInt() availableFunds = big.NewInt(1).Mul(paymentAmount, big.NewInt(1000)) ) const ( roundID = 3 answer = 100 ) run := &pipeline.Run{ID: 1} tm.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID).Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil).Once() tm.logBroadcaster.On("IsConnected").Return(true).Maybe() tm.orm.On("WithDataSource", mock.Anything).Return(fluxmonitorv2.ORM(tm.orm)) // Mocks initiated by the New Round log tm.orm.On("MostRecentFluxMonitorRoundID", mock.Anything, contractAddress).Return(uint32(roundID), nil).Once() tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: roundID, }, nil).Once() tm.pipelineRunner. On("ExecuteRun", mock.Anything, pipelineSpec, mock.Anything, mock.Anything). Return(run, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: decimal.NewFromInt(answer), Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil) tm.pipelineRunner. On("InsertFinishedRun", mock.Anything, mock.Anything, mock.Anything, mock.Anything). Return(nil). Run(func(args mock.Arguments) { args.Get(2).(*pipeline.Run).ID = 1 }) tm.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil).Once() tm.contractSubmitter.On("Submit", mock.Anything, big.NewInt(roundID), big.NewInt(answer), buildIdempotencyKey(run.ID)).Return(nil).Once() tm.orm. On("UpdateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), int64(1), uint(1), ). Return(nil) tm.fluxAggregator.On("GetOracles", nilOpts).Return(oracles, nil) require.NoError(t, fm.SetOracleAddress()) tm.fluxAggregator.On("LatestRoundData", nilOpts).Return(flux_aggregator_wrapper.LatestRoundData{ Answer: big.NewInt(10), UpdatedAt: big.NewInt(100), }, nil) // Fire off the NewRound log, which the node should respond to tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(roundID)). Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: roundID, LatestSubmission: big.NewInt(answer), EligibleToSubmit: true, AvailableFunds: availableFunds, PaymentAmount: paymentAmount, OracleCount: 1, }, nil). Once() fm.ExportedRespondToNewRoundLog(&flux_aggregator_wrapper.FluxAggregatorNewRound{ RoundId: big.NewInt(roundID), StartedAt: big.NewInt(0), }, log.NewLogBroadcast(types.Log{}, cltest.FixtureChainID, nil)) // Mocks initiated by polling // Now force the node to try to poll and ensure it does not respond this time tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)). Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: roundID, LatestSubmission: big.NewInt(answer), EligibleToSubmit: true, AvailableFunds: availableFunds, PaymentAmount: paymentAmount, OracleCount: 1, }, nil). Once() tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ PipelineRunID: corenull.NewInt64(int64(1), true), Aggregator: contractAddress, RoundID: roundID, NumSubmissions: 1, }, nil).Once() now := time.Now() tm.pipelineORM.On("FindRun", mock.Anything, int64(1)).Return(pipeline.Run{ FinishedAt: null.TimeFrom(now), }, nil) fm.ExportedPollIfEligible(0, 0) })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewAddress()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ToInt()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(1)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Mul(paymentAmount, big.NewInt(1000))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(1000)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("IsConnected")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(true)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(fluxmonitorv2.ORM(tm.orm))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ORM(tm.orm)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm.On("MostRecentFluxMonitorRoundID", mock.Anything, contractAddress)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(uint32(roundID), nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: roundID, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.pipelineRunner. On("ExecuteRun", mock.Anything, pipelineSpec, mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(run, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: decimal.NewFromInt(answer), Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewFromInt(answer)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.pipelineRunner. On("InsertFinishedRun", mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Run(func(args mock.Arguments) { args.Get(2).(*pipeline.Run).ID = 1 })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Get(2)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.contractSubmitter.On("Submit", mock.Anything, big.NewInt(roundID), big.NewInt(answer), buildIdempotencyKey(run.ID))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(roundID)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(answer)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("UpdateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), int64(1), uint(1), )` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("GetOracles", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("LatestRoundData", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(flux_aggregator_wrapper.LatestRoundData{ Answer: big.NewInt(10), UpdatedAt: big.NewInt(100), }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(10)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(100)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(roundID))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: roundID, LatestSubmission: big.NewInt(answer), EligibleToSubmit: true, AvailableFunds: availableFunds, PaymentAmount: paymentAmount, OracleCount: 1, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(answer)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ExportedRespondToNewRoundLog(&flux_aggregator_wrapper.FluxAggregatorNewRound{ RoundId: big.NewInt(roundID), StartedAt: big.NewInt(0), }, log.NewLogBroadcast(types.Log{}, cltest.FixtureChainID, nil))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(roundID)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(0)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewLogBroadcast(types.Log{}, cltest.FixtureChainID, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: roundID, LatestSubmission: big.NewInt(answer), EligibleToSubmit: true, AvailableFunds: availableFunds, PaymentAmount: paymentAmount, OracleCount: 1, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(answer)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ PipelineRunID: corenull.NewInt64(int64(1), true), Aggregator: contractAddress, RoundID: roundID, NumSubmissions: 1, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt64(int64(1), true)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Now()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.pipelineORM.On("FindRun", mock.Anything, int64(1))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(pipeline.Run{ FinishedAt: null.TimeFrom(now), }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.TimeFrom(now)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ExportedPollIfEligible(0, 0)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Run("when poll ticker fires, then NewRound log arrives", func(t *testing.T) { db, nodeAddr := setupStoreWithKey(t) oracles := []common.Address{nodeAddr, testutils.NewAddress()} fm, tm := setup(t, db, disableIdleTimer(true), disablePollTicker(true), ) var ( paymentAmount = defaultMinimumContractPayment.ToInt() availableFunds = big.NewInt(1).Mul(paymentAmount, big.NewInt(1000)) ) const ( roundID = 3 answer = 100 ) run := &pipeline.Run{ID: 1} tm.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID).Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil).Once() tm.logBroadcaster.On("IsConnected").Return(true).Maybe() tm.orm.On("WithDataSource", mock.Anything).Return(fluxmonitorv2.ORM(tm.orm)) // First, force the node to try to poll, which should result in a submission tm.fluxAggregator.On("LatestRoundData", nilOpts).Return(flux_aggregator_wrapper.LatestRoundData{ Answer: big.NewInt(10), UpdatedAt: big.NewInt(100), }, nil) tm.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0)). Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: roundID, LatestSubmission: big.NewInt(answer), EligibleToSubmit: true, AvailableFunds: availableFunds, PaymentAmount: paymentAmount, OracleCount: 1, }, nil). Once() tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: roundID, }, nil).Once() tm.pipelineRunner. On("ExecuteRun", mock.Anything, pipelineSpec, mock.Anything, mock.Anything). Return(run, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: decimal.NewFromInt(answer), Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil) tm.pipelineRunner. On("InsertFinishedRun", mock.Anything, mock.Anything, mock.Anything, mock.Anything). Return(nil). Run(func(args mock.Arguments) { args.Get(2).(*pipeline.Run).ID = 1 }) tm.contractSubmitter.On("Submit", mock.Anything, big.NewInt(roundID), big.NewInt(answer), buildIdempotencyKey(run.ID)).Return(nil).Once() tm.orm. On("UpdateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), int64(1), uint(0), ). Return(nil). Once() tm.fluxAggregator.On("GetOracles", nilOpts).Return(oracles, nil) require.NoError(t, fm.SetOracleAddress()) fm.ExportedPollIfEligible(0, 0) // Now fire off the NewRound log and ensure it does not respond this time tm.orm.On("MostRecentFluxMonitorRoundID", mock.Anything, contractAddress).Return(uint32(roundID), nil) tm.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), mock.Anything). Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ PipelineRunID: corenull.NewInt64(int64(1), true), Aggregator: contractAddress, RoundID: roundID, NumSubmissions: 1, }, nil).Once() tm.pipelineORM.On("FindRun", mock.Anything, int64(1)).Return(pipeline.Run{}, nil) tm.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) fm.ExportedRespondToNewRoundLog(&flux_aggregator_wrapper.FluxAggregatorNewRound{ RoundId: big.NewInt(roundID), StartedAt: big.NewInt(0), }, log.NewLogBroadcast(types.Log{}, cltest.FixtureChainID, nil)) })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewAddress()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ToInt()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(1)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Mul(paymentAmount, big.NewInt(1000))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(1000)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("IsConnected")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(true)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(fluxmonitorv2.ORM(tm.orm))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ORM(tm.orm)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("LatestRoundData", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(flux_aggregator_wrapper.LatestRoundData{ Answer: big.NewInt(10), UpdatedAt: big.NewInt(100), }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(10)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(100)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: roundID, LatestSubmission: big.NewInt(answer), EligibleToSubmit: true, AvailableFunds: availableFunds, PaymentAmount: paymentAmount, OracleCount: 1, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(answer)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: roundID, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.pipelineRunner. On("ExecuteRun", mock.Anything, pipelineSpec, mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(run, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: decimal.NewFromInt(answer), Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewFromInt(answer)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.pipelineRunner. On("InsertFinishedRun", mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Run(func(args mock.Arguments) { args.Get(2).(*pipeline.Run).ID = 1 })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Get(2)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.contractSubmitter.On("Submit", mock.Anything, big.NewInt(roundID), big.NewInt(answer), buildIdempotencyKey(run.ID))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(roundID)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(answer)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("UpdateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), int64(1), uint(0), )` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("GetOracles", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ExportedPollIfEligible(0, 0)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm.On("MostRecentFluxMonitorRoundID", mock.Anything, contractAddress)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(uint32(roundID), nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ PipelineRunID: corenull.NewInt64(int64(1), true), Aggregator: contractAddress, RoundID: roundID, NumSubmissions: 1, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt64(int64(1), true)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.pipelineORM.On("FindRun", mock.Anything, int64(1))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(pipeline.Run{}, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ExportedRespondToNewRoundLog(&flux_aggregator_wrapper.FluxAggregatorNewRound{ RoundId: big.NewInt(roundID), StartedAt: big.NewInt(0), }, log.NewLogBroadcast(types.Log{}, cltest.FixtureChainID, nil))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(roundID)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(0)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewLogBroadcast(types.Log{}, cltest.FixtureChainID, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewAddress()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ToInt()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(1)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Mul(paymentAmount, big.NewInt(1000))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(1000)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("IsConnected")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(true)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(fluxmonitorv2.ORM(tm.orm))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ORM(tm.orm)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("LatestRoundData", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(flux_aggregator_wrapper.LatestRoundData{ Answer: big.NewInt(10), UpdatedAt: big.NewInt(100), }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(10)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(100)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: roundID, LatestSubmission: big.NewInt(answer), EligibleToSubmit: true, AvailableFunds: availableFunds, PaymentAmount: paymentAmount, OracleCount: 1, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(answer)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ Aggregator: contractAddress, RoundID: roundID, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.pipelineRunner. On("ExecuteRun", mock.Anything, pipelineSpec, mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(run, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: decimal.NewFromInt(answer), Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewFromInt(answer)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.pipelineRunner. On("InsertFinishedRun", mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Run(func(args mock.Arguments) { args.Get(2).(*pipeline.Run).ID = 1 })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Get(2)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.contractSubmitter.On("Submit", mock.Anything, big.NewInt(roundID), big.NewInt(answer), buildIdempotencyKey(run.ID))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(roundID)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(answer)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("UpdateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(roundID), int64(1), uint(0), )` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("GetOracles", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ExportedPollIfEligible(0, 0)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm.On("MostRecentFluxMonitorRoundID", mock.Anything, contractAddress)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(uint32(roundID), nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(olderRoundID), mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ PipelineRunID: corenull.NewInt64(int64(1), true), Aggregator: contractAddress, RoundID: olderRoundID, NumSubmissions: 1, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt64(int64(1), true)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.pipelineORM.On("FindRun", mock.Anything, int64(1))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(pipeline.Run{}, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ExportedRespondToNewRoundLog(&flux_aggregator_wrapper.FluxAggregatorNewRound{ RoundId: big.NewInt(olderRoundID), StartedAt: big.NewInt(0), }, log.NewLogBroadcast(types.Log{}, cltest.FixtureChainID, nil))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(olderRoundID)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(0)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewLogBroadcast(types.Log{}, cltest.FixtureChainID, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm.On("MostRecentFluxMonitorRoundID", mock.Anything, contractAddress)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(uint32(roundID), nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(olderRoundID), uint(1))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ PipelineRunID: corenull.NewInt64(int64(1), true), Aggregator: contractAddress, RoundID: olderRoundID, NumSubmissions: 1, NumNewRoundLogs: 1, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt64(int64(1), true)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.pipelineORM.On("FindRun", mock.Anything, int64(1))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(pipeline.Run{}, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm.On("DeleteFluxMonitorRoundsBackThrough", mock.Anything, contractAddress, uint32(olderRoundID))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(olderRoundID), uint(1))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(fluxmonitorv2.FluxMonitorRoundStatsV2{ PipelineRunID: corenull.NewInt64(int64(1), true), Aggregator: contractAddress, RoundID: olderRoundID, NumSubmissions: 0, NumNewRoundLogs: 1, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt64(int64(1), true)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(olderRoundID))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(flux_aggregator_wrapper.OracleRoundState{ RoundId: olderRoundID, LatestSubmission: big.NewInt(answer), EligibleToSubmit: true, AvailableFunds: availableFunds, PaymentAmount: paymentAmount, OracleCount: 1, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(answer)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.contractSubmitter.On("Submit", mock.Anything, big.NewInt(olderRoundID), big.NewInt(answer), buildIdempotencyKey(run.ID))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(olderRoundID)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(answer)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("UpdateFluxMonitorRoundStats", mock.Anything, contractAddress, uint32(olderRoundID), int64(1), uint(1), )` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ExportedRespondToNewRoundLog(&flux_aggregator_wrapper.FluxAggregatorNewRound{ RoundId: big.NewInt(olderRoundID), StartedAt: big.NewInt(0), }, log.NewLogBroadcast(types.Log{}, cltest.FixtureChainID, nil))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(olderRoundID)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(0)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewLogBroadcast(types.Log{}, cltest.FixtureChainID, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewAddress()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.keyStore.On("EnabledKeysForChain", mock.Anything, testutils.FixtureChainID)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return([]ethkey.KeyV2{{Address: nodeAddr}}, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm.On("WithDataSource", mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(fluxmonitorv2.ORM(tm.orm))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ORM(tm.orm)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(fetchedAnswer)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("Address")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(common.Address{})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("GetOracles", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(oracles, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("Register", mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(func() {})` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.logBroadcaster.On("IsConnected")` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(true)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("LatestRoundData", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Return(freshContractRoundDataResponse())` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(1)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Mul(big.NewInt(10000), defaultMinimumContractPayment.ToInt())` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(10000)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ToInt()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.ToInt()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, uint32(0))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(roundState, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("OracleRoundState", nilOpts, nodeAddr, roundID)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(roundState, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm.On("FindOrCreateFluxMonitorRoundStats", mock.Anything, contractAddress, roundID, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(fluxmonitorv2.FluxMonitorRoundStatsV2{Aggregator: contractAddress, RoundID: roundID}, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator.On("LatestRoundData", nilOpts)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(flux_aggregator_wrapper.LatestRoundData{ Answer: answerBigInt, UpdatedAt: big.NewInt(100), }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(100)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.pipelineRunner. On("ExecuteRun", mock.Anything, pipelineSpec, pipeline.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "latestAnswer": float64(fetchedAnswer), "updatedAt": float64(100), }, }, "jobSpec": map[string]interface{}{ "databaseID": int32(0), "externalJobID": uuid.UUID{}, "name": "", "evmChainID": testutils.FixtureChainID.String(), }, }, ), mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "latestAnswer": float64(fetchedAnswer), "updatedAt": float64(100), }, }, "jobSpec": map[string]interface{}{ "databaseID": int32(0), "externalJobID": uuid.UUID{}, "name": "", "evmChainID": testutils.FixtureChainID.String(), }, }, )` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.FixtureChainID.String()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(&pipeline.Run{ID: runID}, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: decimal.NewFromInt(fetchedAnswer), Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewFromInt(fetchedAnswer)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.pipelineRunner.On("InsertFinishedRun", mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Run(func(args mock.Arguments) { args.Get(2).(*pipeline.Run).ID = runID })` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Get(2)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.contractSubmitter. On("Submit", mock.Anything, big.NewInt(int64(roundID)), answerBigInt, buildIdempotencyKey(runID))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.NewInt(int64(roundID))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.orm. On("UpdateFluxMonitorRoundStats", mock.Anything, contractAddress, roundID, runID, mock.Anything)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Once()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.fluxAggregator. On("OracleRoundState", nilOpts, nodeAddr, uint32(0))` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Return(flux_aggregator_wrapper.OracleRoundState{RoundId: 4, EligibleToSubmit: false, LatestSubmission: answerBigInt, StartedAt: now()}, nil)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `. Maybe()` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.Run(t, fm)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.EventuallyExpectationsMet(t, tm.logBroadcaster, waitTime, interval)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.EventuallyExpectationsMet(t, tm.fluxAggregator, waitTime, interval)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.EventuallyExpectationsMet(t, tm.orm, waitTime, interval)` $DIR/core/services/fluxmonitorv2/flux_monitor_test.go: `.EventuallyExpectationsMet(t, tm.pipelineORM, waitTime, interval)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `t.Run(test.name, func(t *testing.T) { t.Parallel() g := gomega.NewWithT(t) fa := setupFluxAggregatorUniverse(t) // - add oracles oracleList := []common.Address{fa.nallory.From} _, err := fa.aggregatorContract.ChangeOracles(fa.sergey, emptyList, oracleList, oracleList, 1, 1, 0) assert.NoError(t, err, "failed to add oracles to aggregator") fa.backend.Commit() checkOraclesAdded(t, fa, oracleList) // Set up chainlink app app := startApplication(t, fa, func(c *chainlink.Config, s *chainlink.Secrets) { c.JobPipeline.HTTPRequest.DefaultTimeout = commonconfig.MustNewDuration(100 * time.Millisecond) c.Database.Listener.FallbackPollInterval = commonconfig.MustNewDuration(1 * time.Second) c.EVM[0].GasEstimator.EIP1559DynamicFees = &test.eip1559 }) type v struct { count int updatedAt int64 } expectedMeta := map[string]v{} var expMetaMu sync.Mutex var reportPrice atomic.Int64 reportPrice.Store(100) mockServer := cltest.NewHTTPMockServerWithAlterableResponseAndRequest(t, generatePriceResponseFn(reportPrice.Load), func(r *http.Request) { b, err1 := io.ReadAll(r.Body) require.NoError(t, err1) var m bridges.BridgeMetaDataJSON require.NoError(t, json.Unmarshal(b, &m)) if m.Meta.LatestAnswer != nil && m.Meta.UpdatedAt != nil { k := m.Meta.LatestAnswer.String() expMetaMu.Lock() curr := expectedMeta[k] assert.True(t, m.Meta.UpdatedAt.IsInt64()) // sanity check unix ts expectedMeta[k] = v{curr.count + 1, m.Meta.UpdatedAt.Int64()} expMetaMu.Unlock() } }, ) t.Cleanup(mockServer.Close) u, _ := url.Parse(mockServer.URL) require.NoError(t, app.BridgeORM().CreateBridgeType(testutils.Context(t), &bridges.BridgeType{ Name: "bridge", URL: models.WebURL(*u), })) // When event appears on submissionReceived, flux monitor job run is complete submissionReceived := fa.WatchSubmissionReceived(t, []common.Address{fa.nallory.From}, ) // Create the job s := ` type = "fluxmonitor" schemaVersion = 1 name = "integration test" contractAddress = "%s" threshold = 2.0 absoluteThreshold = 0.0 evmChainID = 1337 idleTimerPeriod = "10s" idleTimerDisabled = false pollTimerPeriod = "%s" pollTimerDisabled = false observationSource = """ ds1 [type=bridge name=bridge]; ds1_parse [type=jsonparse path="data,result"]; ds1 -> ds1_parse """ ` s = fmt.Sprintf(s, fa.aggregatorContractAddress, 2*time.Second) requestBody, err := json.Marshal(web.CreateJobRequest{ TOML: s, }) assert.NoError(t, err) initialBalance := currentBalance(t, &fa).Int64() jobResponse := cltest.CreateJobViaWeb2(t, app, string(requestBody)) i, err := strconv.ParseInt(jobResponse.ID, 10, 32) require.NoError(t, err) jobID := int32(i) // Waiting for flux monitor to finish Register process in log broadcaster // and then to have log broadcaster backfill logs after the debounceResubscribe period of ~ 1 sec g.Eventually(func() uint32 { lb := evmtest.MustGetDefaultChain(t, app.GetRelayers().LegacyEVMChains()).LogBroadcaster() return lb.(log.BroadcasterInTest).TrackedAddressesCount() }, testutils.WaitTimeout(t), 200*time.Millisecond).Should(gomega.BeNumerically(">=", 1)) // Initial Poll receiptBlock, answer := awaitSubmission(t, fa.backend, submissionReceived) lggr := logger.TestLogger(t) lggr.Infof("Detected submission: %v in block %v", answer, receiptBlock) assert.Equal(t, reportPrice.Load(), answer, "failed to report correct price to contract") checkSubmission(t, answerParams{ fa: &fa, roundId: 1, answer: int64(100), from: fa.nallory, isNewRound: true, completesAnswer: true, }, initialBalance, receiptBlock, ) assertPipelineRunCreated(t, app.GetDB(), 1, int64(100)) // Need to wait until NewRound log is consumed - otherwise there is a chance // it will arrive after the next answer is submitted, and cause // DeleteFluxMonitorRoundsBackThrough to delete previous stats checkLogWasConsumed(t, fa, app.GetDB(), jobID, receiptBlock) lggr.Info("Updating price to 103") // Change reported price to a value outside the deviation reportPrice.Store(103) receiptBlock, answer = awaitSubmission(t, fa.backend, submissionReceived) lggr.Infof("Detected submission: %v in block %v", answer, receiptBlock) assert.Equal(t, reportPrice.Load(), answer, "failed to report correct price to contract") checkSubmission(t, answerParams{ fa: &fa, roundId: 2, answer: int64(103), from: fa.nallory, isNewRound: true, completesAnswer: true, }, initialBalance-fee, receiptBlock, ) assertPipelineRunCreated(t, app.GetDB(), 2, int64(103)) // Need to wait until NewRound log is consumed - otherwise there is a chance // it will arrive after the next answer is submitted, and cause // DeleteFluxMonitorRoundsBackThrough to delete previous stats checkLogWasConsumed(t, fa, app.GetDB(), jobID, receiptBlock) // Should not received a submission as it is inside the deviation reportPrice.Store(104) assertNoSubmission(t, submissionReceived, 2*time.Second, "Should not receive a submission") expMetaMu.Lock() defer expMetaMu.Unlock() assert.Len(t, expectedMeta, 2, "expected metadata %v", expectedMeta) assert.Greater(t, expectedMeta["100"].count, 0, "Stored answer metadata does not contain 100 but contains: %v", expectedMeta) assert.Greater(t, expectedMeta["103"].count, 0, "Stored answer metadata does not contain 103 but contains: %v", expectedMeta) assert.Greater(t, expectedMeta["103"].updatedAt, expectedMeta["100"].updatedAt) })` $DIR/core/services/fluxmonitorv2/integrations_test.go: `fa.backend.Commit()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `checkOraclesAdded(t, fa, oracleList)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `c.JobPipeline.HTTPRequest.DefaultTimeout = commonconfig.MustNewDuration(100 * time.Millisecond)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `c.Database.Listener.FallbackPollInterval = commonconfig.MustNewDuration(1 * time.Second)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `c.EVM[0].GasEstimator.EIP1559DynamicFees = &test.eip1559` $DIR/core/services/fluxmonitorv2/integrations_test.go: `reportPrice.Store(100)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `expMetaMu.Lock()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `expectedMeta[k] = v{curr.count + 1, m.Meta.UpdatedAt.Int64()}` $DIR/core/services/fluxmonitorv2/integrations_test.go: `expMetaMu.Unlock()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `t.Cleanup(mockServer.Close)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `s = fmt.Sprintf(s, fa.aggregatorContractAddress, 2*time.Second)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `g.Eventually(func() uint32 { lb := evmtest.MustGetDefaultChain(t, app.GetRelayers().LegacyEVMChains()).LogBroadcaster() return lb.(log.BroadcasterInTest).TrackedAddressesCount() }, testutils.WaitTimeout(t), 200*time.Millisecond).Should(gomega.BeNumerically(">=", 1))` $DIR/core/services/fluxmonitorv2/integrations_test.go: `lggr.Infof("Detected submission: %v in block %v", answer, receiptBlock)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `checkSubmission(t, answerParams{ fa: &fa, roundId: 1, answer: int64(100), from: fa.nallory, isNewRound: true, completesAnswer: true, }, initialBalance, receiptBlock, )` $DIR/core/services/fluxmonitorv2/integrations_test.go: `assertPipelineRunCreated(t, app.GetDB(), 1, int64(100))` $DIR/core/services/fluxmonitorv2/integrations_test.go: `checkLogWasConsumed(t, fa, app.GetDB(), jobID, receiptBlock)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `lggr.Info("Updating price to 103")` $DIR/core/services/fluxmonitorv2/integrations_test.go: `reportPrice.Store(103)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `receiptBlock, answer = awaitSubmission(t, fa.backend, submissionReceived)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `lggr.Infof("Detected submission: %v in block %v", answer, receiptBlock)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `checkSubmission(t, answerParams{ fa: &fa, roundId: 2, answer: int64(103), from: fa.nallory, isNewRound: true, completesAnswer: true, }, initialBalance-fee, receiptBlock, )` $DIR/core/services/fluxmonitorv2/integrations_test.go: `assertPipelineRunCreated(t, app.GetDB(), 2, int64(103))` $DIR/core/services/fluxmonitorv2/integrations_test.go: `checkLogWasConsumed(t, fa, app.GetDB(), jobID, receiptBlock)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `reportPrice.Store(104)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `assertNoSubmission(t, submissionReceived, 2*time.Second, "Should not receive a submission")` $DIR/core/services/fluxmonitorv2/integrations_test.go: `expMetaMu.Lock()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `fa.backend.Commit()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `checkOraclesAdded(t, fa, oracleList)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `c.JobPipeline.HTTPRequest.DefaultTimeout = commonconfig.MustNewDuration(100 * time.Millisecond)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `c.Database.Listener.FallbackPollInterval = commonconfig.MustNewDuration(1 * time.Second)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `c.EVM[0].FlagsContractAddress = &flags` $DIR/core/services/fluxmonitorv2/integrations_test.go: `reportPrice.Store(1)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `t.Cleanup(mockServer.Close)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `s = fmt.Sprintf(s, fa.aggregatorContractAddress, testutils.SimulatedChainID.String(), pollTimerPeriod, mockServer.URL)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `_, err = fa.flagsContract.RaiseFlag(fa.sergey, evmutils.ZeroAddress)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `_, err = fa.flagsContract.RaiseFlag(fa.sergey, fa.aggregatorContractAddress)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `fa.backend.Commit()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `cltest.CreateJobViaWeb2(t, app, string(requestBody))` $DIR/core/services/fluxmonitorv2/integrations_test.go: `g.Eventually(func() uint32 { lb := evmtest.MustGetDefaultChain(t, app.GetRelayers().LegacyEVMChains()).LogBroadcaster() return lb.(log.BroadcasterInTest).TrackedAddressesCount() }, testutils.WaitTimeout(t), 200*time.Millisecond).Should(gomega.BeNumerically(">=", 2))` $DIR/core/services/fluxmonitorv2/integrations_test.go: `submitAnswer(t, answerParams{ fa: &fa, roundId: 1, answer: 2, from: fa.neil, isNewRound: true, completesAnswer: false, })` $DIR/core/services/fluxmonitorv2/integrations_test.go: `fa.backend.Commit()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `fa.backend.Commit()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `checkOraclesAdded(t, fa, oracleList)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `c.JobPipeline.HTTPRequest.DefaultTimeout = commonconfig.MustNewDuration(100 * time.Millisecond)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `c.Database.Listener.FallbackPollInterval = commonconfig.MustNewDuration(1 * time.Second)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `c.EVM[0].FlagsContractAddress = &flags` $DIR/core/services/fluxmonitorv2/integrations_test.go: `reportPrice.Store(1)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `t.Cleanup(mockServer.Close)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `s = fmt.Sprintf(s, fa.aggregatorContractAddress, testutils.SimulatedChainID.String(), "1000ms", mockServer.URL)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `_, err = fa.flagsContract.RaiseFlag(fa.sergey, evmutils.ZeroAddress)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `_, err = fa.flagsContract.RaiseFlag(fa.sergey, fa.aggregatorContractAddress)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `fa.backend.Commit()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `cltest.AssertPipelineRunsStays(t, j.PipelineSpec.ID, app.GetDB(), 0)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `_, err = fa.flagsContract.LowerFlags(fa.sergey, []common.Address{evmutils.ZeroAddress})` $DIR/core/services/fluxmonitorv2/integrations_test.go: `fa.backend.Commit()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `awaitSubmission(t, fa.backend, submissionReceived)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `reportPrice.Store(2)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `awaitSubmission(t, fa.backend, submissionReceived)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `_, err = fa.flagsContract.LowerFlags(fa.sergey, []common.Address{fa.aggregatorContractAddress})` $DIR/core/services/fluxmonitorv2/integrations_test.go: `fa.backend.Commit()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `assertNoSubmission(t, submissionReceived, 5*pollTimerPeriod, "should not trigger a new run because FM is already hibernating")` $DIR/core/services/fluxmonitorv2/integrations_test.go: `reportPrice.Store(4)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `awaitSubmission(t, fa.backend, submissionReceived)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `_, err = fa.flagsContract.RaiseFlag(fa.sergey, fa.aggregatorContractAddress)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `_, err = fa.flagsContract.RaiseFlag(fa.sergey, evmutils.ZeroAddress)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `fa.backend.Commit()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `g.Eventually(func() int { ilogs, err := fa.flagsContract.FilterFlagRaised(nil, []common.Address{}) require.NoError(t, err) logs := cltest.GetLogs(t, nil, ilogs) return len(logs) }, testutils.WaitTimeout(t), 100*time.Millisecond).Should(gomega.Equal(4))` $DIR/core/services/fluxmonitorv2/integrations_test.go: `reportPrice.Store(8)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `fa.backend.Commit()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `c.JobPipeline.HTTPRequest.DefaultTimeout = commonconfig.MustNewDuration(100 * time.Millisecond)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `c.Database.Listener.FallbackPollInterval = commonconfig.MustNewDuration(1 * time.Second)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `reportPrice.Store(10001)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `t.Cleanup(mockServer.Close)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `_, err = fa.flagsContract.RaiseFlag(fa.sergey, evmutils.ZeroAddress)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `_, err = fa.flagsContract.RaiseFlag(fa.sergey, fa.aggregatorContractAddress)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `fa.backend.Commit()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `fa.backend.Commit()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `checkOraclesAdded(t, fa, oracleList)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `c.JobPipeline.HTTPRequest.DefaultTimeout = commonconfig.MustNewDuration(100 * time.Millisecond)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `c.Database.Listener.FallbackPollInterval = commonconfig.MustNewDuration(1 * time.Second)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `submitAnswer(t, answerParams{ fa: &fa, roundId: roundId, answer: processedAnswer, from: fa.neil, isNewRound: true, completesAnswer: false, })` $DIR/core/services/fluxmonitorv2/integrations_test.go: `reportPrice.Store(answer)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `t.Cleanup(mockServer.Close)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `s = fmt.Sprintf(s, fa.aggregatorContractAddress, testutils.SimulatedChainID.String(), "200ms", mockServer.URL)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `cltest.CreateJobViaWeb2(t, app, string(requestBody))` $DIR/core/services/fluxmonitorv2/integrations_test.go: `checkSubmission(t, answerParams{ fa: &fa, roundId: roundId, answer: processedAnswer, from: fa.nallory, isNewRound: false, completesAnswer: true}, initialBalance, receiptBlock, )` $DIR/core/services/fluxmonitorv2/integrations_test.go: `reportPrice.Store(answer + 1)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `receiptBlock, _ = awaitSubmission(t, fa.backend, submissionReceived)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `processedAnswer = 100 * reportPrice.Load()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `checkSubmission(t, answerParams{ fa: &fa, roundId: newRound, answer: processedAnswer, from: fa.nallory, isNewRound: true, completesAnswer: false}, nextRoundBalance, receiptBlock, )` $DIR/core/services/fluxmonitorv2/integrations_test.go: `submitAnswer(t, answerParams{ fa: &fa, roundId: newRound, answer: processedAnswer, from: fa.neil, isNewRound: false, completesAnswer: true}, )` $DIR/core/services/fluxmonitorv2/integrations_test.go: `newRound = newRound + 1` $DIR/core/services/fluxmonitorv2/integrations_test.go: `processedAnswer = 100 * reportPrice.Load()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `submitMaliciousAnswer(t, answerParams{ fa: &fa, roundId: newRound, answer: processedAnswer, from: fa.nallory, isNewRound: true, completesAnswer: false}, )` $DIR/core/services/fluxmonitorv2/integrations_test.go: `assertNoSubmission(t, submissionReceived, 5*pollTimerPeriod, "FA allowed chainlink node to start a new round early")` $DIR/core/services/fluxmonitorv2/integrations_test.go: `_, err = fa.aggregatorContract.RequestNewRound(fa.nallory)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `submitAnswer(t, answerParams{fa: &fa, roundId: newRound, answer: processedAnswer, from: fa.ned, isNewRound: true, completesAnswer: false})` $DIR/core/services/fluxmonitorv2/integrations_test.go: `submitAnswer(t, answerParams{fa: &fa, roundId: newRound, answer: processedAnswer, from: fa.neil, isNewRound: false, completesAnswer: true})` $DIR/core/services/fluxmonitorv2/integrations_test.go: `reportPrice.Add(3)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Run(test.name, func(t *testing.T) { t.Parallel() g := gomega.NewWithT(t) fa := setupFluxAggregatorUniverse(t) // - add oracles oracleList := []common.Address{fa.nallory.From} _, err := fa.aggregatorContract.ChangeOracles(fa.sergey, emptyList, oracleList, oracleList, 1, 1, 0) assert.NoError(t, err, "failed to add oracles to aggregator") fa.backend.Commit() checkOraclesAdded(t, fa, oracleList) // Set up chainlink app app := startApplication(t, fa, func(c *chainlink.Config, s *chainlink.Secrets) { c.JobPipeline.HTTPRequest.DefaultTimeout = commonconfig.MustNewDuration(100 * time.Millisecond) c.Database.Listener.FallbackPollInterval = commonconfig.MustNewDuration(1 * time.Second) c.EVM[0].GasEstimator.EIP1559DynamicFees = &test.eip1559 }) type v struct { count int updatedAt int64 } expectedMeta := map[string]v{} var expMetaMu sync.Mutex var reportPrice atomic.Int64 reportPrice.Store(100) mockServer := cltest.NewHTTPMockServerWithAlterableResponseAndRequest(t, generatePriceResponseFn(reportPrice.Load), func(r *http.Request) { b, err1 := io.ReadAll(r.Body) require.NoError(t, err1) var m bridges.BridgeMetaDataJSON require.NoError(t, json.Unmarshal(b, &m)) if m.Meta.LatestAnswer != nil && m.Meta.UpdatedAt != nil { k := m.Meta.LatestAnswer.String() expMetaMu.Lock() curr := expectedMeta[k] assert.True(t, m.Meta.UpdatedAt.IsInt64()) // sanity check unix ts expectedMeta[k] = v{curr.count + 1, m.Meta.UpdatedAt.Int64()} expMetaMu.Unlock() } }, ) t.Cleanup(mockServer.Close) u, _ := url.Parse(mockServer.URL) require.NoError(t, app.BridgeORM().CreateBridgeType(testutils.Context(t), &bridges.BridgeType{ Name: "bridge", URL: models.WebURL(*u), })) // When event appears on submissionReceived, flux monitor job run is complete submissionReceived := fa.WatchSubmissionReceived(t, []common.Address{fa.nallory.From}, ) // Create the job s := ` type = "fluxmonitor" schemaVersion = 1 name = "integration test" contractAddress = "%s" threshold = 2.0 absoluteThreshold = 0.0 evmChainID = 1337 idleTimerPeriod = "10s" idleTimerDisabled = false pollTimerPeriod = "%s" pollTimerDisabled = false observationSource = """ ds1 [type=bridge name=bridge]; ds1_parse [type=jsonparse path="data,result"]; ds1 -> ds1_parse """ ` s = fmt.Sprintf(s, fa.aggregatorContractAddress, 2*time.Second) requestBody, err := json.Marshal(web.CreateJobRequest{ TOML: s, }) assert.NoError(t, err) initialBalance := currentBalance(t, &fa).Int64() jobResponse := cltest.CreateJobViaWeb2(t, app, string(requestBody)) i, err := strconv.ParseInt(jobResponse.ID, 10, 32) require.NoError(t, err) jobID := int32(i) // Waiting for flux monitor to finish Register process in log broadcaster // and then to have log broadcaster backfill logs after the debounceResubscribe period of ~ 1 sec g.Eventually(func() uint32 { lb := evmtest.MustGetDefaultChain(t, app.GetRelayers().LegacyEVMChains()).LogBroadcaster() return lb.(log.BroadcasterInTest).TrackedAddressesCount() }, testutils.WaitTimeout(t), 200*time.Millisecond).Should(gomega.BeNumerically(">=", 1)) // Initial Poll receiptBlock, answer := awaitSubmission(t, fa.backend, submissionReceived) lggr := logger.TestLogger(t) lggr.Infof("Detected submission: %v in block %v", answer, receiptBlock) assert.Equal(t, reportPrice.Load(), answer, "failed to report correct price to contract") checkSubmission(t, answerParams{ fa: &fa, roundId: 1, answer: int64(100), from: fa.nallory, isNewRound: true, completesAnswer: true, }, initialBalance, receiptBlock, ) assertPipelineRunCreated(t, app.GetDB(), 1, int64(100)) // Need to wait until NewRound log is consumed - otherwise there is a chance // it will arrive after the next answer is submitted, and cause // DeleteFluxMonitorRoundsBackThrough to delete previous stats checkLogWasConsumed(t, fa, app.GetDB(), jobID, receiptBlock) lggr.Info("Updating price to 103") // Change reported price to a value outside the deviation reportPrice.Store(103) receiptBlock, answer = awaitSubmission(t, fa.backend, submissionReceived) lggr.Infof("Detected submission: %v in block %v", answer, receiptBlock) assert.Equal(t, reportPrice.Load(), answer, "failed to report correct price to contract") checkSubmission(t, answerParams{ fa: &fa, roundId: 2, answer: int64(103), from: fa.nallory, isNewRound: true, completesAnswer: true, }, initialBalance-fee, receiptBlock, ) assertPipelineRunCreated(t, app.GetDB(), 2, int64(103)) // Need to wait until NewRound log is consumed - otherwise there is a chance // it will arrive after the next answer is submitted, and cause // DeleteFluxMonitorRoundsBackThrough to delete previous stats checkLogWasConsumed(t, fa, app.GetDB(), jobID, receiptBlock) // Should not received a submission as it is inside the deviation reportPrice.Store(104) assertNoSubmission(t, submissionReceived, 2*time.Second, "Should not receive a submission") expMetaMu.Lock() defer expMetaMu.Unlock() assert.Len(t, expectedMeta, 2, "expected metadata %v", expectedMeta) assert.Greater(t, expectedMeta["100"].count, 0, "Stored answer metadata does not contain 100 but contains: %v", expectedMeta) assert.Greater(t, expectedMeta["103"].count, 0, "Stored answer metadata does not contain 103 but contains: %v", expectedMeta) assert.Greater(t, expectedMeta["103"].updatedAt, expectedMeta["100"].updatedAt) })` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.NewWithT(t)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.aggregatorContract.ChangeOracles(fa.sergey, emptyList, oracleList, oracleList, 1, 1, 0)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.backend.Commit()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.MustNewDuration(100 * time.Millisecond)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.MustNewDuration(1 * time.Second)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Store(100)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.NewHTTPMockServerWithAlterableResponseAndRequest(t, generatePriceResponseFn(reportPrice.Load), func(r *http.Request) { b, err1 := io.ReadAll(r.Body) require.NoError(t, err1) var m bridges.BridgeMetaDataJSON require.NoError(t, json.Unmarshal(b, &m)) if m.Meta.LatestAnswer != nil && m.Meta.UpdatedAt != nil { k := m.Meta.LatestAnswer.String() expMetaMu.Lock() curr := expectedMeta[k] assert.True(t, m.Meta.UpdatedAt.IsInt64()) // sanity check unix ts expectedMeta[k] = v{curr.count + 1, m.Meta.UpdatedAt.Int64()} expMetaMu.Unlock() } }, )` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.ReadAll(r.Body)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Meta.LatestAnswer.String()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Lock()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Meta.UpdatedAt.Int64()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Unlock()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Cleanup(mockServer.Close)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Parse(mockServer.URL)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.WatchSubmissionReceived(t, []common.Address{fa.nallory.From}, )` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Sprintf(s, fa.aggregatorContractAddress, 2*time.Second)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Marshal(web.CreateJobRequest{ TOML: s, })` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Int64()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.CreateJobViaWeb2(t, app, string(requestBody))` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.ParseInt(jobResponse.ID, 10, 32)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Eventually(func() uint32 { lb := evmtest.MustGetDefaultChain(t, app.GetRelayers().LegacyEVMChains()).LogBroadcaster() return lb.(log.BroadcasterInTest).TrackedAddressesCount() }, testutils.WaitTimeout(t), 200*time.Millisecond)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.MustGetDefaultChain(t, app.GetRelayers().LegacyEVMChains())` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.GetRelayers()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.LegacyEVMChains()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.LogBroadcaster()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.TrackedAddressesCount()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.WaitTimeout(t)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Should(gomega.BeNumerically(">=", 1))` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.BeNumerically(">=", 1)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.TestLogger(t)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Infof("Detected submission: %v in block %v", answer, receiptBlock)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.GetDB()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.GetDB()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Info("Updating price to 103")` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Store(103)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Infof("Detected submission: %v in block %v", answer, receiptBlock)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.GetDB()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.GetDB()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Store(104)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Lock()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Unlock()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.NewWithT(t)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.aggregatorContract.ChangeOracles(fa.sergey, emptyList, oracleList, oracleList, 1, 2, 1)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.backend.Commit()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.MustNewDuration(100 * time.Millisecond)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.MustNewDuration(1 * time.Second)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.EIP55AddressFromAddress(fa.flagsContractAddress)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Int64()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Store(1)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.NewHTTPMockServerWithAlterableResponse(t, generatePriceResponseFn(reportPrice.Load), )` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Cleanup(mockServer.Close)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.WatchSubmissionReceived(t, []common.Address{fa.nallory.From}, )` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Sprintf(s, fa.aggregatorContractAddress, testutils.SimulatedChainID.String(), pollTimerPeriod, mockServer.URL)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.SimulatedChainID.String()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.flagsContract.RaiseFlag(fa.sergey, evmutils.ZeroAddress)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.flagsContract.RaiseFlag(fa.sergey, fa.aggregatorContractAddress)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.backend.Commit()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Marshal(web.CreateJobRequest{ TOML: s, })` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.CreateJobViaWeb2(t, app, string(requestBody))` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Eventually(func() uint32 { lb := evmtest.MustGetDefaultChain(t, app.GetRelayers().LegacyEVMChains()).LogBroadcaster() return lb.(log.BroadcasterInTest).TrackedAddressesCount() }, testutils.WaitTimeout(t), 200*time.Millisecond)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.MustGetDefaultChain(t, app.GetRelayers().LegacyEVMChains())` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.GetRelayers()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.LegacyEVMChains()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.LogBroadcaster()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.TrackedAddressesCount()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.WaitTimeout(t)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Should(gomega.BeNumerically(">=", 2))` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.BeNumerically(">=", 2)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.backend.Commit()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.NewWithT(t)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.aggregatorContract.ChangeOracles(fa.sergey, emptyList, oracleList, oracleList, 1, 1, 0)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.backend.Commit()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.MustNewDuration(100 * time.Millisecond)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.MustNewDuration(1 * time.Second)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.EIP55AddressFromAddress(fa.flagsContractAddress)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Store(1)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.NewHTTPMockServerWithAlterableResponse(t, generatePriceResponseFn(reportPrice.Load), )` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Cleanup(mockServer.Close)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.WatchSubmissionReceived(t, []common.Address{fa.nallory.From}, )` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Sprintf(s, fa.aggregatorContractAddress, testutils.SimulatedChainID.String(), "1000ms", mockServer.URL)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.SimulatedChainID.String()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.flagsContract.RaiseFlag(fa.sergey, evmutils.ZeroAddress)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.flagsContract.RaiseFlag(fa.sergey, fa.aggregatorContractAddress)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.backend.Commit()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Marshal(web.CreateJobRequest{ TOML: s, })` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.CreateJobViaWeb2(t, app, string(requestBody))` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.AssertPipelineRunsStays(t, j.PipelineSpec.ID, app.GetDB(), 0)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.GetDB()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.flagsContract.LowerFlags(fa.sergey, []common.Address{evmutils.ZeroAddress})` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.backend.Commit()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Store(2)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.flagsContract.LowerFlags(fa.sergey, []common.Address{fa.aggregatorContractAddress})` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.backend.Commit()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Store(4)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.flagsContract.RaiseFlag(fa.sergey, fa.aggregatorContractAddress)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.flagsContract.RaiseFlag(fa.sergey, evmutils.ZeroAddress)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.backend.Commit()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Eventually(func() int { ilogs, err := fa.flagsContract.FilterFlagRaised(nil, []common.Address{}) require.NoError(t, err) logs := cltest.GetLogs(t, nil, ilogs) return len(logs) }, testutils.WaitTimeout(t), 100*time.Millisecond)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.flagsContract.FilterFlagRaised(nil, []common.Address{})` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.GetLogs(t, nil, ilogs)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.WaitTimeout(t)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Should(gomega.Equal(4))` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Equal(4)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Store(8)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.NewInt(100000000)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.NewInt(1000000000000)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.aggregatorContract.ChangeOracles(fa.sergey, emptyList, oracleList, oracleList, 1, 3, 2)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.backend.Commit()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.MustNewDuration(100 * time.Millisecond)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.MustNewDuration(1 * time.Second)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Store(10001)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.NewHTTPMockServerWithAlterableResponse(t, generatePriceResponseFn(reportPrice.Load), )` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Cleanup(mockServer.Close)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Sprintf(toml, fa.aggregatorContractAddress, testutils.SimulatedChainID.String(), "100ms", mockServer.URL)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.SimulatedChainID.String()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.flagsContract.RaiseFlag(fa.sergey, evmutils.ZeroAddress)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.flagsContract.RaiseFlag(fa.sergey, fa.aggregatorContractAddress)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.backend.Commit()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Marshal(web.CreateJobRequest{ TOML: s, })` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.CreateJobViaWeb2(t, app, string(requestBody))` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Mine(fa.backend, 500*time.Millisecond)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.ParseInt(j.ID, 10, 32)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.WaitForSpecErrorV2(t, app.GetDB(), int32(jobID), 1)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.GetDB()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.aggregatorContract.ChangeOracles(fa.sergey, emptyList, oracleList, oracleList, 2, 3, 2)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.backend.Commit()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.MustNewDuration(100 * time.Millisecond)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.MustNewDuration(1 * time.Second)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Int64()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Store(answer)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Sprintf(`{"data":{"result": %d}}`, reportPrice.Load())` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Load()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.NewHTTPMockServerWithAlterableResponse(t, priceResponse)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Cleanup(mockServer.Close)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.WatchSubmissionReceived(t, []common.Address{fa.nallory.From}, )` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Sprintf(s, fa.aggregatorContractAddress, testutils.SimulatedChainID.String(), "200ms", mockServer.URL)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.SimulatedChainID.String()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Marshal(web.CreateJobRequest{ TOML: s, })` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.CreateJobViaWeb2(t, app, string(requestBody))` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Store(answer + 1)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Load()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Load()` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.aggregatorContract.RequestNewRound(fa.nallory)` $DIR/core/services/fluxmonitorv2/integrations_test.go: `.Add(3)` $DIR/core/services/fluxmonitorv2/key_store_test.go: `keys, err = ks.EnabledKeysForChain(ctx, testutils.SimulatedChainID)` $DIR/core/services/fluxmonitorv2/key_store_test.go: `.Context(t)` $DIR/core/services/fluxmonitorv2/key_store_test.go: `.NewSqlxDB(t)` $DIR/core/services/fluxmonitorv2/key_store_test.go: `.NewKeyStore(t, db)` $DIR/core/services/fluxmonitorv2/key_store_test.go: `.Eth()` $DIR/core/services/fluxmonitorv2/key_store_test.go: `.NewKeyStore(ethKeyStore)` $DIR/core/services/fluxmonitorv2/key_store_test.go: `.Create(ctx, testutils.FixtureChainID)` $DIR/core/services/fluxmonitorv2/key_store_test.go: `.Create(ctx, testutils.SimulatedChainID)` $DIR/core/services/fluxmonitorv2/key_store_test.go: `.EnabledKeysForChain(ctx, testutils.FixtureChainID)` $DIR/core/services/fluxmonitorv2/key_store_test.go: `.EnabledKeysForChain(ctx, testutils.SimulatedChainID)` $DIR/core/services/fluxmonitorv2/key_store_test.go: `.Context(t)` $DIR/core/services/fluxmonitorv2/key_store_test.go: `.NewSqlxDB(t)` $DIR/core/services/fluxmonitorv2/key_store_test.go: `.NewKeyStore(t, db)` $DIR/core/services/fluxmonitorv2/key_store_test.go: `.Eth()` $DIR/core/services/fluxmonitorv2/key_store_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/services/fluxmonitorv2/key_store_test.go: `.NewKeyStore(ethKeyStore)` $DIR/core/services/fluxmonitorv2/key_store_test.go: `.GetRoundRobinAddress(ctx, testutils.FixtureChainID)` $DIR/core/services/fluxmonitorv2/orm_test.go: `count, err = orm.CountFluxMonitorRoundStats(ctx)` $DIR/core/services/fluxmonitorv2/orm_test.go: `roundID, err = orm.MostRecentFluxMonitorRoundID(ctx, address)` $DIR/core/services/fluxmonitorv2/orm_test.go: `err = orm.DeleteFluxMonitorRoundsBackThrough(ctx, testutils.NewAddress(), 5)` $DIR/core/services/fluxmonitorv2/orm_test.go: `count, err = orm.CountFluxMonitorRoundStats(ctx)` $DIR/core/services/fluxmonitorv2/orm_test.go: `err = orm.DeleteFluxMonitorRoundsBackThrough(ctx, address, 5)` $DIR/core/services/fluxmonitorv2/orm_test.go: `count, err = orm.CountFluxMonitorRoundStats(ctx)` $DIR/core/services/fluxmonitorv2/orm_test.go: `err = orm.UpdateFluxMonitorRoundStats(ctx, address, roundID, run.ID, 0)` $DIR/core/services/fluxmonitorv2/orm_test.go: `txm.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ IdempotencyKey: &idempotencyKey, FromAddress: from, ToAddress: to, EncodedPayload: payload, FeeLimit: gasLimit, Meta: nil, Strategy: strategy, }).Return(txmgr.Tx{}, nil).Once()` $DIR/core/services/fluxmonitorv2/orm_test.go: `.Context(t)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.NewAddress()` $DIR/core/services/fluxmonitorv2/orm_test.go: `.FindOrCreateFluxMonitorRoundStats(ctx, address, round, 1)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.CountFluxMonitorRoundStats(ctx)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.FindOrCreateFluxMonitorRoundStats(ctx, address, uint32(0), 1)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.CountFluxMonitorRoundStats(ctx)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.MostRecentFluxMonitorRoundID(ctx, testutils.NewAddress())` $DIR/core/services/fluxmonitorv2/orm_test.go: `.NewAddress()` $DIR/core/services/fluxmonitorv2/orm_test.go: `.MostRecentFluxMonitorRoundID(ctx, address)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.DeleteFluxMonitorRoundsBackThrough(ctx, testutils.NewAddress(), 5)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.NewAddress()` $DIR/core/services/fluxmonitorv2/orm_test.go: `.CountFluxMonitorRoundStats(ctx)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.DeleteFluxMonitorRoundsBackThrough(ctx, address, 5)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.CountFluxMonitorRoundStats(ctx)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.Context(t)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.NewGeneralConfig(t, nil)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.TestLogger(t)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.NewORM(db, lggr, cfg.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/fluxmonitorv2/orm_test.go: `.JobPipeline()` $DIR/core/services/fluxmonitorv2/orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/fluxmonitorv2/orm_test.go: `.NewORM(db)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.NewORM(db, pipelineORM, bridgeORM, keyStore, lggr)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.NewAddress()` $DIR/core/services/fluxmonitorv2/orm_test.go: `.Now()` $DIR/core/services/fluxmonitorv2/orm_test.go: `.Now()` $DIR/core/services/fluxmonitorv2/orm_test.go: `.TimeFrom(f)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.New()` $DIR/core/services/fluxmonitorv2/orm_test.go: `.TimeFrom(f)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.InsertFinishedRun(ctx, run, true)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.UpdateFluxMonitorRoundStats(ctx, address, roundID, run.ID, 0)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.FindOrCreateFluxMonitorRoundStats(ctx, address, roundID, 0)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.Eth()` $DIR/core/services/fluxmonitorv2/orm_test.go: `.NewTxStrategy(t)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.NewMockEvmTxManager(t)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.NewORM(db, logger.TestLogger(t), txm, strategy, txmgr.TransmitCheckerSpec{})` $DIR/core/services/fluxmonitorv2/orm_test.go: `.TestLogger(t)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.NewAddress()` $DIR/core/services/fluxmonitorv2/orm_test.go: `.New()` $DIR/core/services/fluxmonitorv2/orm_test.go: `.String()` $DIR/core/services/fluxmonitorv2/orm_test.go: `.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ IdempotencyKey: &idempotencyKey, FromAddress: from, ToAddress: to, EncodedPayload: payload, FeeLimit: gasLimit, Meta: nil, Strategy: strategy, })` $DIR/core/services/fluxmonitorv2/orm_test.go: `.Return(txmgr.Tx{}, nil)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.Once()` $DIR/core/services/fluxmonitorv2/orm_test.go: `.CreateEthTransaction(testutils.Context(t), from, to, payload, gasLimit, &idempotencyKey)` $DIR/core/services/fluxmonitorv2/orm_test.go: `.Context(t)` $DIR/core/services/fluxmonitorv2/payment_checker_test.go: `t.Run(tc.name, func(t *testing.T) { t.Parallel() assert.Equal(t, tc.want, checker.SufficientFunds( big.NewInt(int64(tc.funds)), big.NewInt(int64(payment)), uint8(oracleCount), )) })` $DIR/core/services/fluxmonitorv2/payment_checker_test.go: `t.Run(tc.name, func(t *testing.T) { t.Parallel() var minJobPayment *assets.Link if tc.minJobPayment != nil { mjb := assets.Link(*big.NewInt(tc.minJobPayment.(int64))) minJobPayment = &mjb } checker := fluxmonitorv2.NewPaymentChecker(assets.NewLinkFromJuels(tc.minContractPayment), minJobPayment) assert.Equal(t, tc.want, checker.SufficientPayment(big.NewInt(payment))) })` $DIR/core/services/fluxmonitorv2/payment_checker_test.go: `minJobPayment = &mjb` $DIR/core/services/fluxmonitorv2/payment_checker_test.go: `.NewPaymentChecker(nil, nil)` $DIR/core/services/fluxmonitorv2/payment_checker_test.go: `.Run(tc.name, func(t *testing.T) { t.Parallel() assert.Equal(t, tc.want, checker.SufficientFunds( big.NewInt(int64(tc.funds)), big.NewInt(int64(payment)), uint8(oracleCount), )) })` $DIR/core/services/fluxmonitorv2/payment_checker_test.go: `.Run(tc.name, func(t *testing.T) { t.Parallel() var minJobPayment *assets.Link if tc.minJobPayment != nil { mjb := assets.Link(*big.NewInt(tc.minJobPayment.(int64))) minJobPayment = &mjb } checker := fluxmonitorv2.NewPaymentChecker(assets.NewLinkFromJuels(tc.minContractPayment), minJobPayment) assert.Equal(t, tc.want, checker.SufficientPayment(big.NewInt(payment))) })` $DIR/core/services/fluxmonitorv2/payment_checker_test.go: `.Link(*big.NewInt(tc.minJobPayment.(int64)))` $DIR/core/services/fluxmonitorv2/payment_checker_test.go: `.NewInt(tc.minJobPayment.(int64))` $DIR/core/services/fluxmonitorv2/payment_checker_test.go: `.NewPaymentChecker(assets.NewLinkFromJuels(tc.minContractPayment), minJobPayment)` $DIR/core/services/fluxmonitorv2/payment_checker_test.go: `.NewLinkFromJuels(tc.minContractPayment)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `pm.Start(false, flux_aggregator_wrapper.OracleRoundState{})` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `t.Cleanup(pm.Stop)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `pm.Start(false, flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()) - 10, // Even 10 seconds old the idle timer should tick })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `t.Cleanup(pm.Stop)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `pm.Start(false, flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()), Timeout: 1, // in seconds })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `t.Cleanup(pm.Stop)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `pm.Start(false, flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()), Timeout: 10000, // in seconds. Don't timeout the round })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `t.Cleanup(pm.Stop)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `pm.StartRetryTicker()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `pm.StopRetryTicker()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `ticks = watchTicks(t, pm, 2*time.Second)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `pm.Start(false, flux_aggregator_wrapper.OracleRoundState{})` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `pm.Start(true, flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()), Timeout: 1, // in seconds })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `t.Cleanup(pm.Stop)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `t.Cleanup(pm.Stop)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `pm.Start(true, flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()), Timeout: 1, // in seconds })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `pm.Awaken(flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()), Timeout: 1, })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `ticks = watchTicks(t, pm, 2*time.Second)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `pm.Start(false, flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()), Timeout: 1, })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `t.Cleanup(pm.Stop)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `pm.Hibernate()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `ticks = watchTicks(t, pm, 2*time.Second)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `t.Run(tc.name, func(t *testing.T) { t.Parallel() pm, err := fluxmonitorv2.NewPollManager(fluxmonitorv2.PollManagerConfig{ IsHibernating: tc.isHibernating, HibernationPollPeriod: 24 * time.Hour, PollTickerInterval: pollTickerDefaultDuration, PollTickerDisabled: tc.pollTickerDisabled, IdleTimerPeriod: idleTickerDefaultDuration, IdleTimerDisabled: tc.idleTimerDisabled, }, logger.TestLogger(t)) require.NoError(t, err) assert.Equal(t, tc.want, pm.ShouldPerformInitialPoll()) })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `pm.Start(false, flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()), Timeout: 1, })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `pm.Stop()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `ticks = watchTicks(t, pm, 2*time.Second)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `pm.Start(false, flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()), Timeout: 1, })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `t.Cleanup(pm.Stop)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `pm.ResetIdleTimer(uint64(time.Now().Unix()) + 1)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `ticks = watchTicks(t, pm, 2*time.Second)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `pm.Start(true, flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()), Timeout: 1, // in seconds })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `t.Cleanup(pm.Stop)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `pm.ResetIdleTimer(uint64(time.Now().Unix()))` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `ticks = watchTicks(t, pm, 2*time.Second)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `pm.Start(false, flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()), Timeout: 1, })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `t.Cleanup(pm.Stop)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `pm.Reset(flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()), Timeout: 1, })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `ticks = watchTicks(t, pm, 2*time.Second)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `pm.Start(true, flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()), Timeout: 1, // in seconds })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `t.Cleanup(pm.Stop)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `pm.Reset(flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()), Timeout: 1, // in seconds })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `ticks = watchTicks(t, pm, 2*time.Second)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.NewPollManager(fluxmonitorv2.PollManagerConfig{ PollTickerInterval: pollTickerDefaultDuration, PollTickerDisabled: false, IdleTimerPeriod: idleTickerDefaultDuration, IdleTimerDisabled: true, HibernationPollPeriod: 24 * time.Hour, }, logger.TestLogger(t))` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.TestLogger(t)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Start(false, flux_aggregator_wrapper.OracleRoundState{})` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Cleanup(pm.Stop)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.NewPollManager(fluxmonitorv2.PollManagerConfig{ PollTickerInterval: 100 * time.Millisecond, PollTickerDisabled: true, IdleTimerPeriod: idleTickerDefaultDuration, IdleTimerDisabled: false, HibernationPollPeriod: 24 * time.Hour, }, logger.TestLogger(t))` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.TestLogger(t)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Start(false, flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()) - 10, // Even 10 seconds old the idle timer should tick })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Now()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Unix()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Cleanup(pm.Stop)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.NewPollManager(fluxmonitorv2.PollManagerConfig{ PollTickerInterval: pollTickerDefaultDuration, PollTickerDisabled: true, IdleTimerPeriod: idleTickerDefaultDuration, IdleTimerDisabled: true, HibernationPollPeriod: 24 * time.Hour, }, logger.TestLogger(t))` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.TestLogger(t)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Start(false, flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()), Timeout: 1, // in seconds })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Now()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Unix()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Cleanup(pm.Stop)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.NewPollManager(fluxmonitorv2.PollManagerConfig{ PollTickerInterval: pollTickerDefaultDuration, PollTickerDisabled: true, IdleTimerPeriod: idleTickerDefaultDuration, IdleTimerDisabled: true, HibernationPollPeriod: 24 * time.Hour, MinRetryBackoffDuration: 200 * time.Microsecond, MaxRetryBackoffDuration: 1 * time.Minute, }, logger.TestLogger(t))` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.TestLogger(t)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Start(false, flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()), Timeout: 10000, // in seconds. Don't timeout the round })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Now()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Unix()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Cleanup(pm.Stop)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.StartRetryTicker()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.StopRetryTicker()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Start(false, flux_aggregator_wrapper.OracleRoundState{})` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.NewPollManager(fluxmonitorv2.PollManagerConfig{ PollTickerInterval: pollTickerDefaultDuration, PollTickerDisabled: true, IdleTimerPeriod: idleTickerDefaultDuration, IdleTimerDisabled: true, HibernationPollPeriod: 1 * time.Second, }, logger.TestLogger(t))` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.TestLogger(t)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Start(true, flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()), Timeout: 1, // in seconds })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Now()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Unix()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Cleanup(pm.Stop)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.NewPollManager(fluxmonitorv2.PollManagerConfig{ PollTickerInterval: pollTickerDefaultDuration, PollTickerDisabled: false, IdleTimerPeriod: idleTickerDefaultDuration, IdleTimerDisabled: false, HibernationPollPeriod: 24 * time.Hour, }, logger.TestLogger(t))` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.TestLogger(t)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Cleanup(pm.Stop)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Start(true, flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()), Timeout: 1, // in seconds })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Now()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Unix()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Awaken(flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()), Timeout: 1, })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Now()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Unix()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Start(false, flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()), Timeout: 1, })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Now()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Unix()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Cleanup(pm.Stop)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Hibernate()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Run(tc.name, func(t *testing.T) { t.Parallel() pm, err := fluxmonitorv2.NewPollManager(fluxmonitorv2.PollManagerConfig{ IsHibernating: tc.isHibernating, HibernationPollPeriod: 24 * time.Hour, PollTickerInterval: pollTickerDefaultDuration, PollTickerDisabled: tc.pollTickerDisabled, IdleTimerPeriod: idleTickerDefaultDuration, IdleTimerDisabled: tc.idleTimerDisabled, }, logger.TestLogger(t)) require.NoError(t, err) assert.Equal(t, tc.want, pm.ShouldPerformInitialPoll()) })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.NewPollManager(fluxmonitorv2.PollManagerConfig{ IsHibernating: tc.isHibernating, HibernationPollPeriod: 24 * time.Hour, PollTickerInterval: pollTickerDefaultDuration, PollTickerDisabled: tc.pollTickerDisabled, IdleTimerPeriod: idleTickerDefaultDuration, IdleTimerDisabled: tc.idleTimerDisabled, }, logger.TestLogger(t))` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.TestLogger(t)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Start(false, flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()), Timeout: 1, })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Now()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Unix()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Stop()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Start(false, flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()), Timeout: 1, })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Now()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Unix()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Cleanup(pm.Stop)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.ResetIdleTimer(uint64(time.Now().Unix()) + 1)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Now()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Unix()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Start(true, flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()), Timeout: 1, // in seconds })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Now()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Unix()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Cleanup(pm.Stop)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.ResetIdleTimer(uint64(time.Now().Unix()))` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Now()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Unix()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Start(false, flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()), Timeout: 1, })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Now()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Unix()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Cleanup(pm.Stop)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Reset(flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()), Timeout: 1, })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Now()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Unix()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Start(true, flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()), Timeout: 1, // in seconds })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Now()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Unix()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Cleanup(pm.Stop)` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Reset(flux_aggregator_wrapper.OracleRoundState{ StartedAt: uint64(time.Now().Unix()), Timeout: 1, // in seconds })` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Now()` $DIR/core/services/fluxmonitorv2/poll_manager_test.go: `.Unix()` $DIR/core/services/fluxmonitorv2/submission_checker_test.go: `t.Run(tc.name, func(t *testing.T) { t.Parallel() assert.Equal(t, tc.want, checker.IsValid(tc.answer)) })` $DIR/core/services/fluxmonitorv2/submission_checker_test.go: `.NewFromFloat(1)` $DIR/core/services/fluxmonitorv2/submission_checker_test.go: `.NewFromFloat(2)` $DIR/core/services/fluxmonitorv2/submission_checker_test.go: `.NewFromFloat(3)` $DIR/core/services/fluxmonitorv2/submission_checker_test.go: `.NewFromFloat(0)` $DIR/core/services/fluxmonitorv2/submission_checker_test.go: `.NewFromFloat(4)` $DIR/core/services/fluxmonitorv2/submission_checker_test.go: `.NewSubmissionChecker( big.NewInt(1), big.NewInt(3), )` $DIR/core/services/fluxmonitorv2/submission_checker_test.go: `.NewInt(1)` $DIR/core/services/fluxmonitorv2/submission_checker_test.go: `.NewInt(3)` $DIR/core/services/fluxmonitorv2/submission_checker_test.go: `.Run(tc.name, func(t *testing.T) { t.Parallel() assert.Equal(t, tc.want, checker.IsValid(tc.answer)) })` $DIR/core/services/fluxmonitorv2/validate_test.go: `t.Run(tc.name, func(t *testing.T) { s, err := ValidatedFluxMonitorSpec(testcfg{}, tc.toml) tc.assertion(t, s, err) })` $DIR/core/services/fluxmonitorv2/validate_test.go: `tc.assertion(t, s, err)` $DIR/core/services/fluxmonitorv2/validate_test.go: `.Run(tc.name, func(t *testing.T) { s, err := ValidatedFluxMonitorSpec(testcfg{}, tc.toml) tc.assertion(t, s, err) })` $DIR/core/services/fluxmonitorv2/validate_test.go: `.assertion(t, s, err)` $DIR/core/services/functions/connector_handler_test.go: `offchainTransmitter.On("ReportChannel", mock.Anything).Return(reportCh)` $DIR/core/services/functions/connector_handler_test.go: `allowlist.On("Start", mock.Anything).Return(nil)` $DIR/core/services/functions/connector_handler_test.go: `allowlist.On("Close", mock.Anything).Return(nil)` $DIR/core/services/functions/connector_handler_test.go: `subscriptions.On("Start", mock.Anything).Return(nil)` $DIR/core/services/functions/connector_handler_test.go: `subscriptions.On("Close", mock.Anything).Return(nil)` $DIR/core/services/functions/connector_handler_test.go: `handler.SetConnector(connector)` $DIR/core/services/functions/connector_handler_test.go: `err = handler.Start(testutils.Context(t))` $DIR/core/services/functions/connector_handler_test.go: `t.Cleanup(func() { assert.NoError(t, handler.Close()) })` $DIR/core/services/functions/connector_handler_test.go: `t.Run("Sign", func(t *testing.T) { signature, err := handler.Sign([]byte("test")) require.NoError(t, err) signer, err := common.ExtractSigner(signature, []byte("test")) require.NoError(t, err) require.Equal(t, addr.Bytes(), signer) })` $DIR/core/services/functions/connector_handler_test.go: `t.Run("HandleGatewayMessage", func(t *testing.T) { t.Run("secrets_list", func(t *testing.T) { msg := api.Message{ Body: api.MessageBody{ DonId: "fun4", MessageId: "1", Method: "secrets_list", Sender: addr.Hex(), }, } require.NoError(t, msg.Sign(privateKey)) ctx := testutils.Context(t) snapshot := []*s4.SnapshotRow{ {SlotId: 1, Version: 1, Expiration: 1}, {SlotId: 2, Version: 2, Expiration: 2}, } storage.On("List", ctx, addr).Return(snapshot, nil).Once() allowlist.On("Allow", addr).Return(true).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":true,"rows":[{"slot_id":1,"version":1,"expiration":1},{"slot_id":2,"version":2,"expiration":2}]}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) t.Run("orm error", func(t *testing.T) { storage.On("List", ctx, addr).Return(nil, errors.New("boom")).Once() allowlist.On("Allow", addr).Return(true).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Failed to list secrets: boom"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) }) t.Run("not allowed", func(t *testing.T) { allowlist.On("Allow", addr).Return(false).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) }) }) t.Run("secrets_set", func(t *testing.T) { ctx := testutils.Context(t) key := s4.Key{ Address: addr, SlotId: 3, Version: 4, } record := s4.Record{ Expiration: 5, Payload: []byte("test"), } signature, err := s4.NewEnvelopeFromRecord(&key, &record).Sign(privateKey) signatureB64 := base64.StdEncoding.EncodeToString(signature) require.NoError(t, err) msg := api.Message{ Body: api.MessageBody{ DonId: "fun4", MessageId: "1", Method: "secrets_set", Sender: addr.Hex(), Payload: json.RawMessage(`{"slot_id":3,"version":4,"expiration":5,"payload":"dGVzdA==","signature":"` + signatureB64 + `"}`), }, } require.NoError(t, msg.Sign(privateKey)) storage.On("Put", ctx, &key, &record, signature).Return(nil).Once() allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(100), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":true}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) t.Run("orm error", func(t *testing.T) { storage.On("Put", ctx, mock.Anything, mock.Anything, mock.Anything).Return(errors.New("boom")).Once() allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(100), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Failed to set secret: boom"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) }) t.Run("missing signature", func(t *testing.T) { msg.Body.Payload = json.RawMessage(`{"slot_id":3,"version":4,"expiration":5,"payload":"dGVzdA=="}`) require.NoError(t, msg.Sign(privateKey)) storage.On("Put", ctx, mock.Anything, mock.Anything, mock.Anything).Return(s4.ErrWrongSignature).Once() allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(100), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Failed to set secret: wrong signature"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) }) t.Run("malformed request", func(t *testing.T) { msg.Body.Payload = json.RawMessage(`{sdfgdfgoscsicosd:sdf:::sdf ::; xx}`) require.NoError(t, msg.Sign(privateKey)) allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(100), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Bad request to set secret: invalid character 's' looking for beginning of object key string"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) }) t.Run("insufficient balance", func(t *testing.T) { allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(0), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"user subscription has insufficient balance"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) }) }) t.Run("unsupported method", func(t *testing.T) { msg := api.Message{ Body: api.MessageBody{ DonId: "fun4", MessageId: "1", Method: "foobar", Sender: addr.Hex(), Payload: []byte("whatever"), }, } require.NoError(t, msg.Sign(privateKey)) allowlist.On("Allow", addr).Return(true).Once() handler.HandleGatewayMessage(testutils.Context(t), "gw1", &msg) }) })` $DIR/core/services/functions/connector_handler_test.go: `t.Run("secrets_list", func(t *testing.T) { msg := api.Message{ Body: api.MessageBody{ DonId: "fun4", MessageId: "1", Method: "secrets_list", Sender: addr.Hex(), }, } require.NoError(t, msg.Sign(privateKey)) ctx := testutils.Context(t) snapshot := []*s4.SnapshotRow{ {SlotId: 1, Version: 1, Expiration: 1}, {SlotId: 2, Version: 2, Expiration: 2}, } storage.On("List", ctx, addr).Return(snapshot, nil).Once() allowlist.On("Allow", addr).Return(true).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":true,"rows":[{"slot_id":1,"version":1,"expiration":1},{"slot_id":2,"version":2,"expiration":2}]}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) t.Run("orm error", func(t *testing.T) { storage.On("List", ctx, addr).Return(nil, errors.New("boom")).Once() allowlist.On("Allow", addr).Return(true).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Failed to list secrets: boom"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) }) t.Run("not allowed", func(t *testing.T) { allowlist.On("Allow", addr).Return(false).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) }) })` $DIR/core/services/functions/connector_handler_test.go: `storage.On("List", ctx, addr).Return(snapshot, nil).Once()` $DIR/core/services/functions/connector_handler_test.go: `allowlist.On("Allow", addr).Return(true).Once()` $DIR/core/services/functions/connector_handler_test.go: `connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":true,"rows":[{"slot_id":1,"version":1,"expiration":1},{"slot_id":2,"version":2,"expiration":2}]}`, string(msg.Body.Payload)) }).Return(nil).Once()` $DIR/core/services/functions/connector_handler_test.go: `handler.HandleGatewayMessage(ctx, "gw1", &msg)` $DIR/core/services/functions/connector_handler_test.go: `t.Run("orm error", func(t *testing.T) { storage.On("List", ctx, addr).Return(nil, errors.New("boom")).Once() allowlist.On("Allow", addr).Return(true).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Failed to list secrets: boom"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) })` $DIR/core/services/functions/connector_handler_test.go: `storage.On("List", ctx, addr).Return(nil, errors.New("boom")).Once()` $DIR/core/services/functions/connector_handler_test.go: `allowlist.On("Allow", addr).Return(true).Once()` $DIR/core/services/functions/connector_handler_test.go: `connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Failed to list secrets: boom"}`, string(msg.Body.Payload)) }).Return(nil).Once()` $DIR/core/services/functions/connector_handler_test.go: `handler.HandleGatewayMessage(ctx, "gw1", &msg)` $DIR/core/services/functions/connector_handler_test.go: `t.Run("not allowed", func(t *testing.T) { allowlist.On("Allow", addr).Return(false).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) })` $DIR/core/services/functions/connector_handler_test.go: `allowlist.On("Allow", addr).Return(false).Once()` $DIR/core/services/functions/connector_handler_test.go: `handler.HandleGatewayMessage(ctx, "gw1", &msg)` $DIR/core/services/functions/connector_handler_test.go: `t.Run("secrets_set", func(t *testing.T) { ctx := testutils.Context(t) key := s4.Key{ Address: addr, SlotId: 3, Version: 4, } record := s4.Record{ Expiration: 5, Payload: []byte("test"), } signature, err := s4.NewEnvelopeFromRecord(&key, &record).Sign(privateKey) signatureB64 := base64.StdEncoding.EncodeToString(signature) require.NoError(t, err) msg := api.Message{ Body: api.MessageBody{ DonId: "fun4", MessageId: "1", Method: "secrets_set", Sender: addr.Hex(), Payload: json.RawMessage(`{"slot_id":3,"version":4,"expiration":5,"payload":"dGVzdA==","signature":"` + signatureB64 + `"}`), }, } require.NoError(t, msg.Sign(privateKey)) storage.On("Put", ctx, &key, &record, signature).Return(nil).Once() allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(100), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":true}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) t.Run("orm error", func(t *testing.T) { storage.On("Put", ctx, mock.Anything, mock.Anything, mock.Anything).Return(errors.New("boom")).Once() allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(100), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Failed to set secret: boom"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) }) t.Run("missing signature", func(t *testing.T) { msg.Body.Payload = json.RawMessage(`{"slot_id":3,"version":4,"expiration":5,"payload":"dGVzdA=="}`) require.NoError(t, msg.Sign(privateKey)) storage.On("Put", ctx, mock.Anything, mock.Anything, mock.Anything).Return(s4.ErrWrongSignature).Once() allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(100), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Failed to set secret: wrong signature"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) }) t.Run("malformed request", func(t *testing.T) { msg.Body.Payload = json.RawMessage(`{sdfgdfgoscsicosd:sdf:::sdf ::; xx}`) require.NoError(t, msg.Sign(privateKey)) allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(100), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Bad request to set secret: invalid character 's' looking for beginning of object key string"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) }) t.Run("insufficient balance", func(t *testing.T) { allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(0), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"user subscription has insufficient balance"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) }) })` $DIR/core/services/functions/connector_handler_test.go: `storage.On("Put", ctx, &key, &record, signature).Return(nil).Once()` $DIR/core/services/functions/connector_handler_test.go: `allowlist.On("Allow", addr).Return(true).Once()` $DIR/core/services/functions/connector_handler_test.go: `subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(100), nil).Once()` $DIR/core/services/functions/connector_handler_test.go: `connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":true}`, string(msg.Body.Payload)) }).Return(nil).Once()` $DIR/core/services/functions/connector_handler_test.go: `handler.HandleGatewayMessage(ctx, "gw1", &msg)` $DIR/core/services/functions/connector_handler_test.go: `t.Run("orm error", func(t *testing.T) { storage.On("Put", ctx, mock.Anything, mock.Anything, mock.Anything).Return(errors.New("boom")).Once() allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(100), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Failed to set secret: boom"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) })` $DIR/core/services/functions/connector_handler_test.go: `storage.On("Put", ctx, mock.Anything, mock.Anything, mock.Anything).Return(errors.New("boom")).Once()` $DIR/core/services/functions/connector_handler_test.go: `allowlist.On("Allow", addr).Return(true).Once()` $DIR/core/services/functions/connector_handler_test.go: `subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(100), nil).Once()` $DIR/core/services/functions/connector_handler_test.go: `connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Failed to set secret: boom"}`, string(msg.Body.Payload)) }).Return(nil).Once()` $DIR/core/services/functions/connector_handler_test.go: `handler.HandleGatewayMessage(ctx, "gw1", &msg)` $DIR/core/services/functions/connector_handler_test.go: `t.Run("missing signature", func(t *testing.T) { msg.Body.Payload = json.RawMessage(`{"slot_id":3,"version":4,"expiration":5,"payload":"dGVzdA=="}`) require.NoError(t, msg.Sign(privateKey)) storage.On("Put", ctx, mock.Anything, mock.Anything, mock.Anything).Return(s4.ErrWrongSignature).Once() allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(100), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Failed to set secret: wrong signature"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) })` $DIR/core/services/functions/connector_handler_test.go: `msg.Body.Payload = json.RawMessage(`{"slot_id":3,"version":4,"expiration":5,"payload":"dGVzdA=="}`)` $DIR/core/services/functions/connector_handler_test.go: `storage.On("Put", ctx, mock.Anything, mock.Anything, mock.Anything).Return(s4.ErrWrongSignature).Once()` $DIR/core/services/functions/connector_handler_test.go: `allowlist.On("Allow", addr).Return(true).Once()` $DIR/core/services/functions/connector_handler_test.go: `subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(100), nil).Once()` $DIR/core/services/functions/connector_handler_test.go: `connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Failed to set secret: wrong signature"}`, string(msg.Body.Payload)) }).Return(nil).Once()` $DIR/core/services/functions/connector_handler_test.go: `handler.HandleGatewayMessage(ctx, "gw1", &msg)` $DIR/core/services/functions/connector_handler_test.go: `t.Run("malformed request", func(t *testing.T) { msg.Body.Payload = json.RawMessage(`{sdfgdfgoscsicosd:sdf:::sdf ::; xx}`) require.NoError(t, msg.Sign(privateKey)) allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(100), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Bad request to set secret: invalid character 's' looking for beginning of object key string"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) })` $DIR/core/services/functions/connector_handler_test.go: `msg.Body.Payload = json.RawMessage(`{sdfgdfgoscsicosd:sdf:::sdf ::; xx}`)` $DIR/core/services/functions/connector_handler_test.go: `allowlist.On("Allow", addr).Return(true).Once()` $DIR/core/services/functions/connector_handler_test.go: `subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(100), nil).Once()` $DIR/core/services/functions/connector_handler_test.go: `connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Bad request to set secret: invalid character 's' looking for beginning of object key string"}`, string(msg.Body.Payload)) }).Return(nil).Once()` $DIR/core/services/functions/connector_handler_test.go: `handler.HandleGatewayMessage(ctx, "gw1", &msg)` $DIR/core/services/functions/connector_handler_test.go: `t.Run("insufficient balance", func(t *testing.T) { allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(0), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"user subscription has insufficient balance"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) })` $DIR/core/services/functions/connector_handler_test.go: `allowlist.On("Allow", addr).Return(true).Once()` $DIR/core/services/functions/connector_handler_test.go: `subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(0), nil).Once()` $DIR/core/services/functions/connector_handler_test.go: `connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"user subscription has insufficient balance"}`, string(msg.Body.Payload)) }).Return(nil).Once()` $DIR/core/services/functions/connector_handler_test.go: `handler.HandleGatewayMessage(ctx, "gw1", &msg)` $DIR/core/services/functions/connector_handler_test.go: `t.Run("unsupported method", func(t *testing.T) { msg := api.Message{ Body: api.MessageBody{ DonId: "fun4", MessageId: "1", Method: "foobar", Sender: addr.Hex(), Payload: []byte("whatever"), }, } require.NoError(t, msg.Sign(privateKey)) allowlist.On("Allow", addr).Return(true).Once() handler.HandleGatewayMessage(testutils.Context(t), "gw1", &msg) })` $DIR/core/services/functions/connector_handler_test.go: `allowlist.On("Allow", addr).Return(true).Once()` $DIR/core/services/functions/connector_handler_test.go: `handler.HandleGatewayMessage(testutils.Context(t), "gw1", &msg)` $DIR/core/services/functions/connector_handler_test.go: `t.Run("heartbeat success", func(t *testing.T) { ctx := testutils.Context(t) msg, internalId := newOffchainRequest(t, addr.Bytes(), 0) require.NoError(t, msg.Sign(privateKey)) // first call to trigger the request var response functions.HeartbeatResponse allowlist.On("Allow", addr).Return(true).Once() listener.On("HandleOffchainRequest", mock.Anything, mock.Anything).Return(nil).Once() connector.On("SendToGateway", mock.Anything, "gw1", mock.Anything).Run(func(args mock.Arguments) { respMsg, ok := args[2].(*api.Message) require.True(t, ok) require.NoError(t, json.Unmarshal(respMsg.Body.Payload, &response)) require.Equal(t, functions.RequestStatePending, response.Status) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", msg) // async response computation reportCh <- &functions.OffchainResponse{ RequestId: internalId[:], Result: []byte("ok!"), } reportCh <- &functions.OffchainResponse{} // sending second item to make sure the first one got processed // second call to collect the response allowlist.On("Allow", addr).Return(true).Once() connector.On("SendToGateway", mock.Anything, "gw1", mock.Anything).Run(func(args mock.Arguments) { respMsg, ok := args[2].(*api.Message) require.True(t, ok) require.NoError(t, json.Unmarshal(respMsg.Body.Payload, &response)) require.Equal(t, functions.RequestStateComplete, response.Status) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", msg) })` $DIR/core/services/functions/connector_handler_test.go: `allowlist.On("Allow", addr).Return(true).Once()` $DIR/core/services/functions/connector_handler_test.go: `listener.On("HandleOffchainRequest", mock.Anything, mock.Anything).Return(nil).Once()` $DIR/core/services/functions/connector_handler_test.go: `connector.On("SendToGateway", mock.Anything, "gw1", mock.Anything).Run(func(args mock.Arguments) { respMsg, ok := args[2].(*api.Message) require.True(t, ok) require.NoError(t, json.Unmarshal(respMsg.Body.Payload, &response)) require.Equal(t, functions.RequestStatePending, response.Status) }).Return(nil).Once()` $DIR/core/services/functions/connector_handler_test.go: `handler.HandleGatewayMessage(ctx, "gw1", msg)` $DIR/core/services/functions/connector_handler_test.go: `reportCh <- &functions.OffchainResponse{ RequestId: internalId[:], Result: []byte("ok!"), }` $DIR/core/services/functions/connector_handler_test.go: `reportCh <- &functions.OffchainResponse{}` $DIR/core/services/functions/connector_handler_test.go: `allowlist.On("Allow", addr).Return(true).Once()` $DIR/core/services/functions/connector_handler_test.go: `connector.On("SendToGateway", mock.Anything, "gw1", mock.Anything).Run(func(args mock.Arguments) { respMsg, ok := args[2].(*api.Message) require.True(t, ok) require.NoError(t, json.Unmarshal(respMsg.Body.Payload, &response)) require.Equal(t, functions.RequestStateComplete, response.Status) }).Return(nil).Once()` $DIR/core/services/functions/connector_handler_test.go: `handler.HandleGatewayMessage(ctx, "gw1", msg)` $DIR/core/services/functions/connector_handler_test.go: `t.Run("heartbeat internal error", func(t *testing.T) { ctx := testutils.Context(t) msg, _ := newOffchainRequest(t, addr.Bytes(), 0) require.NoError(t, msg.Sign(privateKey)) // first call to trigger the request var response functions.HeartbeatResponse allowlist.On("Allow", addr).Return(true).Once() listener.On("HandleOffchainRequest", mock.Anything, mock.Anything).Return(errors.New("boom")).Once() connector.On("SendToGateway", mock.Anything, "gw1", mock.Anything).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", msg) // collect the response - should eventually result in an internal error gomega.NewGomegaWithT(t).Eventually(func() bool { returnedState := 0 allowlist.On("Allow", addr).Return(true).Once() connector.On("SendToGateway", mock.Anything, "gw1", mock.Anything).Run(func(args mock.Arguments) { respMsg, ok := args[2].(*api.Message) require.True(t, ok) require.NoError(t, json.Unmarshal(respMsg.Body.Payload, &response)) returnedState = response.Status }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", msg) return returnedState == functions.RequestStateInternalError }, testutils.WaitTimeout(t), 50*time.Millisecond).Should(gomega.BeTrue()) })` $DIR/core/services/functions/connector_handler_test.go: `allowlist.On("Allow", addr).Return(true).Once()` $DIR/core/services/functions/connector_handler_test.go: `listener.On("HandleOffchainRequest", mock.Anything, mock.Anything).Return(errors.New("boom")).Once()` $DIR/core/services/functions/connector_handler_test.go: `connector.On("SendToGateway", mock.Anything, "gw1", mock.Anything).Return(nil).Once()` $DIR/core/services/functions/connector_handler_test.go: `handler.HandleGatewayMessage(ctx, "gw1", msg)` $DIR/core/services/functions/connector_handler_test.go: `gomega.NewGomegaWithT(t).Eventually(func() bool { returnedState := 0 allowlist.On("Allow", addr).Return(true).Once() connector.On("SendToGateway", mock.Anything, "gw1", mock.Anything).Run(func(args mock.Arguments) { respMsg, ok := args[2].(*api.Message) require.True(t, ok) require.NoError(t, json.Unmarshal(respMsg.Body.Payload, &response)) returnedState = response.Status }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", msg) return returnedState == functions.RequestStateInternalError }, testutils.WaitTimeout(t), 50*time.Millisecond).Should(gomega.BeTrue())` $DIR/core/services/functions/connector_handler_test.go: `allowlist.On("Allow", addr).Return(true).Once()` $DIR/core/services/functions/connector_handler_test.go: `connector.On("SendToGateway", mock.Anything, "gw1", mock.Anything).Run(func(args mock.Arguments) { respMsg, ok := args[2].(*api.Message) require.True(t, ok) require.NoError(t, json.Unmarshal(respMsg.Body.Payload, &response)) returnedState = response.Status }).Return(nil).Once()` $DIR/core/services/functions/connector_handler_test.go: `returnedState = response.Status` $DIR/core/services/functions/connector_handler_test.go: `handler.HandleGatewayMessage(ctx, "gw1", msg)` $DIR/core/services/functions/connector_handler_test.go: `t.Run("heartbeat sender address doesn't match", func(t *testing.T) { ctx := testutils.Context(t) msg, _ := newOffchainRequest(t, geth_common.BytesToAddress([]byte("0x1234")).Bytes(), 0) require.NoError(t, msg.Sign(privateKey)) var response functions.HeartbeatResponse allowlist.On("Allow", addr).Return(true).Once() connector.On("SendToGateway", mock.Anything, "gw1", mock.Anything).Run(func(args mock.Arguments) { respMsg, ok := args[2].(*api.Message) require.True(t, ok) require.NoError(t, json.Unmarshal(respMsg.Body.Payload, &response)) require.Equal(t, functions.RequestStateInternalError, response.Status) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", msg) })` $DIR/core/services/functions/connector_handler_test.go: `allowlist.On("Allow", addr).Return(true).Once()` $DIR/core/services/functions/connector_handler_test.go: `connector.On("SendToGateway", mock.Anything, "gw1", mock.Anything).Run(func(args mock.Arguments) { respMsg, ok := args[2].(*api.Message) require.True(t, ok) require.NoError(t, json.Unmarshal(respMsg.Body.Payload, &response)) require.Equal(t, functions.RequestStateInternalError, response.Status) }).Return(nil).Once()` $DIR/core/services/functions/connector_handler_test.go: `handler.HandleGatewayMessage(ctx, "gw1", msg)` $DIR/core/services/functions/connector_handler_test.go: `allowlist.On("Allow", addr).Return(true).Once()` $DIR/core/services/functions/connector_handler_test.go: `connector.On("SendToGateway", mock.Anything, "gw1", mock.Anything).Run(func(args mock.Arguments) { respMsg, ok := args[2].(*api.Message) require.True(t, ok) require.NoError(t, json.Unmarshal(respMsg.Body.Payload, &response)) require.Equal(t, functions.RequestStateInternalError, response.Status) }).Return(nil).Once()` $DIR/core/services/functions/connector_handler_test.go: `handler.HandleGatewayMessage(ctx, "gw1", msg)` $DIR/core/services/functions/connector_handler_test.go: `.TestLogger(t)` $DIR/core/services/functions/connector_handler_test.go: `.NewPrivateKeyAndAddress(t)` $DIR/core/services/functions/connector_handler_test.go: `.NewStorage(t)` $DIR/core/services/functions/connector_handler_test.go: `.NewGatewayConnector(t)` $DIR/core/services/functions/connector_handler_test.go: `.NewOnchainAllowlist(t)` $DIR/core/services/functions/connector_handler_test.go: `.NewRateLimiter(hc.RateLimiterConfig{GlobalRPS: 100.0, GlobalBurst: 100, PerSenderRPS: 100.0, PerSenderBurst: 100})` $DIR/core/services/functions/connector_handler_test.go: `.NewOnchainSubscriptions(t)` $DIR/core/services/functions/connector_handler_test.go: `.NewOffchainTransmitter(t)` $DIR/core/services/functions/connector_handler_test.go: `.On("ReportChannel", mock.Anything)` $DIR/core/services/functions/connector_handler_test.go: `.Return(reportCh)` $DIR/core/services/functions/connector_handler_test.go: `.NewFunctionsListener(t)` $DIR/core/services/functions/connector_handler_test.go: `.On("Start", mock.Anything)` $DIR/core/services/functions/connector_handler_test.go: `.Return(nil)` $DIR/core/services/functions/connector_handler_test.go: `.On("Close", mock.Anything)` $DIR/core/services/functions/connector_handler_test.go: `.Return(nil)` $DIR/core/services/functions/connector_handler_test.go: `.On("Start", mock.Anything)` $DIR/core/services/functions/connector_handler_test.go: `.Return(nil)` $DIR/core/services/functions/connector_handler_test.go: `.On("Close", mock.Anything)` $DIR/core/services/functions/connector_handler_test.go: `.Return(nil)` $DIR/core/services/functions/connector_handler_test.go: `.Hex()` $DIR/core/services/functions/connector_handler_test.go: `.NewLinkFromJuels(100)` $DIR/core/services/functions/connector_handler_test.go: `.PubkeyToAddress(privateKey.PublicKey)` $DIR/core/services/functions/connector_handler_test.go: `.Hex()` $DIR/core/services/functions/connector_handler_test.go: `.NewFunctionsConnectorHandler(config, privateKey, storage, allowlist, rateLimiter, subscriptions, listener, offchainTransmitter, logger)` $DIR/core/services/functions/connector_handler_test.go: `.SetConnector(connector)` $DIR/core/services/functions/connector_handler_test.go: `.Start(testutils.Context(t))` $DIR/core/services/functions/connector_handler_test.go: `.Context(t)` $DIR/core/services/functions/connector_handler_test.go: `.Cleanup(func() { assert.NoError(t, handler.Close()) })` $DIR/core/services/functions/connector_handler_test.go: `.Run("Sign", func(t *testing.T) { signature, err := handler.Sign([]byte("test")) require.NoError(t, err) signer, err := common.ExtractSigner(signature, []byte("test")) require.NoError(t, err) require.Equal(t, addr.Bytes(), signer) })` $DIR/core/services/functions/connector_handler_test.go: `.Sign([]byte("test"))` $DIR/core/services/functions/connector_handler_test.go: `.ExtractSigner(signature, []byte("test"))` $DIR/core/services/functions/connector_handler_test.go: `.Run("HandleGatewayMessage", func(t *testing.T) { t.Run("secrets_list", func(t *testing.T) { msg := api.Message{ Body: api.MessageBody{ DonId: "fun4", MessageId: "1", Method: "secrets_list", Sender: addr.Hex(), }, } require.NoError(t, msg.Sign(privateKey)) ctx := testutils.Context(t) snapshot := []*s4.SnapshotRow{ {SlotId: 1, Version: 1, Expiration: 1}, {SlotId: 2, Version: 2, Expiration: 2}, } storage.On("List", ctx, addr).Return(snapshot, nil).Once() allowlist.On("Allow", addr).Return(true).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":true,"rows":[{"slot_id":1,"version":1,"expiration":1},{"slot_id":2,"version":2,"expiration":2}]}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) t.Run("orm error", func(t *testing.T) { storage.On("List", ctx, addr).Return(nil, errors.New("boom")).Once() allowlist.On("Allow", addr).Return(true).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Failed to list secrets: boom"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) }) t.Run("not allowed", func(t *testing.T) { allowlist.On("Allow", addr).Return(false).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) }) }) t.Run("secrets_set", func(t *testing.T) { ctx := testutils.Context(t) key := s4.Key{ Address: addr, SlotId: 3, Version: 4, } record := s4.Record{ Expiration: 5, Payload: []byte("test"), } signature, err := s4.NewEnvelopeFromRecord(&key, &record).Sign(privateKey) signatureB64 := base64.StdEncoding.EncodeToString(signature) require.NoError(t, err) msg := api.Message{ Body: api.MessageBody{ DonId: "fun4", MessageId: "1", Method: "secrets_set", Sender: addr.Hex(), Payload: json.RawMessage(`{"slot_id":3,"version":4,"expiration":5,"payload":"dGVzdA==","signature":"` + signatureB64 + `"}`), }, } require.NoError(t, msg.Sign(privateKey)) storage.On("Put", ctx, &key, &record, signature).Return(nil).Once() allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(100), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":true}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) t.Run("orm error", func(t *testing.T) { storage.On("Put", ctx, mock.Anything, mock.Anything, mock.Anything).Return(errors.New("boom")).Once() allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(100), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Failed to set secret: boom"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) }) t.Run("missing signature", func(t *testing.T) { msg.Body.Payload = json.RawMessage(`{"slot_id":3,"version":4,"expiration":5,"payload":"dGVzdA=="}`) require.NoError(t, msg.Sign(privateKey)) storage.On("Put", ctx, mock.Anything, mock.Anything, mock.Anything).Return(s4.ErrWrongSignature).Once() allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(100), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Failed to set secret: wrong signature"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) }) t.Run("malformed request", func(t *testing.T) { msg.Body.Payload = json.RawMessage(`{sdfgdfgoscsicosd:sdf:::sdf ::; xx}`) require.NoError(t, msg.Sign(privateKey)) allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(100), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Bad request to set secret: invalid character 's' looking for beginning of object key string"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) }) t.Run("insufficient balance", func(t *testing.T) { allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(0), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"user subscription has insufficient balance"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) }) }) t.Run("unsupported method", func(t *testing.T) { msg := api.Message{ Body: api.MessageBody{ DonId: "fun4", MessageId: "1", Method: "foobar", Sender: addr.Hex(), Payload: []byte("whatever"), }, } require.NoError(t, msg.Sign(privateKey)) allowlist.On("Allow", addr).Return(true).Once() handler.HandleGatewayMessage(testutils.Context(t), "gw1", &msg) }) })` $DIR/core/services/functions/connector_handler_test.go: `.Run("secrets_list", func(t *testing.T) { msg := api.Message{ Body: api.MessageBody{ DonId: "fun4", MessageId: "1", Method: "secrets_list", Sender: addr.Hex(), }, } require.NoError(t, msg.Sign(privateKey)) ctx := testutils.Context(t) snapshot := []*s4.SnapshotRow{ {SlotId: 1, Version: 1, Expiration: 1}, {SlotId: 2, Version: 2, Expiration: 2}, } storage.On("List", ctx, addr).Return(snapshot, nil).Once() allowlist.On("Allow", addr).Return(true).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":true,"rows":[{"slot_id":1,"version":1,"expiration":1},{"slot_id":2,"version":2,"expiration":2}]}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) t.Run("orm error", func(t *testing.T) { storage.On("List", ctx, addr).Return(nil, errors.New("boom")).Once() allowlist.On("Allow", addr).Return(true).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Failed to list secrets: boom"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) }) t.Run("not allowed", func(t *testing.T) { allowlist.On("Allow", addr).Return(false).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) }) })` $DIR/core/services/functions/connector_handler_test.go: `.Hex()` $DIR/core/services/functions/connector_handler_test.go: `.Context(t)` $DIR/core/services/functions/connector_handler_test.go: `.On("List", ctx, addr)` $DIR/core/services/functions/connector_handler_test.go: `.Return(snapshot, nil)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.On("Allow", addr)` $DIR/core/services/functions/connector_handler_test.go: `.Return(true)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.On("SendToGateway", ctx, "gw1", mock.Anything)` $DIR/core/services/functions/connector_handler_test.go: `.Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":true,"rows":[{"slot_id":1,"version":1,"expiration":1},{"slot_id":2,"version":2,"expiration":2}]}`, string(msg.Body.Payload)) })` $DIR/core/services/functions/connector_handler_test.go: `.Return(nil)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.HandleGatewayMessage(ctx, "gw1", &msg)` $DIR/core/services/functions/connector_handler_test.go: `.Run("orm error", func(t *testing.T) { storage.On("List", ctx, addr).Return(nil, errors.New("boom")).Once() allowlist.On("Allow", addr).Return(true).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Failed to list secrets: boom"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) })` $DIR/core/services/functions/connector_handler_test.go: `.On("List", ctx, addr)` $DIR/core/services/functions/connector_handler_test.go: `.Return(nil, errors.New("boom"))` $DIR/core/services/functions/connector_handler_test.go: `.New("boom")` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.On("Allow", addr)` $DIR/core/services/functions/connector_handler_test.go: `.Return(true)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.On("SendToGateway", ctx, "gw1", mock.Anything)` $DIR/core/services/functions/connector_handler_test.go: `.Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Failed to list secrets: boom"}`, string(msg.Body.Payload)) })` $DIR/core/services/functions/connector_handler_test.go: `.Return(nil)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.HandleGatewayMessage(ctx, "gw1", &msg)` $DIR/core/services/functions/connector_handler_test.go: `.Run("not allowed", func(t *testing.T) { allowlist.On("Allow", addr).Return(false).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) })` $DIR/core/services/functions/connector_handler_test.go: `.On("Allow", addr)` $DIR/core/services/functions/connector_handler_test.go: `.Return(false)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.HandleGatewayMessage(ctx, "gw1", &msg)` $DIR/core/services/functions/connector_handler_test.go: `.Run("secrets_set", func(t *testing.T) { ctx := testutils.Context(t) key := s4.Key{ Address: addr, SlotId: 3, Version: 4, } record := s4.Record{ Expiration: 5, Payload: []byte("test"), } signature, err := s4.NewEnvelopeFromRecord(&key, &record).Sign(privateKey) signatureB64 := base64.StdEncoding.EncodeToString(signature) require.NoError(t, err) msg := api.Message{ Body: api.MessageBody{ DonId: "fun4", MessageId: "1", Method: "secrets_set", Sender: addr.Hex(), Payload: json.RawMessage(`{"slot_id":3,"version":4,"expiration":5,"payload":"dGVzdA==","signature":"` + signatureB64 + `"}`), }, } require.NoError(t, msg.Sign(privateKey)) storage.On("Put", ctx, &key, &record, signature).Return(nil).Once() allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(100), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":true}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) t.Run("orm error", func(t *testing.T) { storage.On("Put", ctx, mock.Anything, mock.Anything, mock.Anything).Return(errors.New("boom")).Once() allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(100), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Failed to set secret: boom"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) }) t.Run("missing signature", func(t *testing.T) { msg.Body.Payload = json.RawMessage(`{"slot_id":3,"version":4,"expiration":5,"payload":"dGVzdA=="}`) require.NoError(t, msg.Sign(privateKey)) storage.On("Put", ctx, mock.Anything, mock.Anything, mock.Anything).Return(s4.ErrWrongSignature).Once() allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(100), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Failed to set secret: wrong signature"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) }) t.Run("malformed request", func(t *testing.T) { msg.Body.Payload = json.RawMessage(`{sdfgdfgoscsicosd:sdf:::sdf ::; xx}`) require.NoError(t, msg.Sign(privateKey)) allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(100), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Bad request to set secret: invalid character 's' looking for beginning of object key string"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) }) t.Run("insufficient balance", func(t *testing.T) { allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(0), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"user subscription has insufficient balance"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) }) })` $DIR/core/services/functions/connector_handler_test.go: `.Context(t)` $DIR/core/services/functions/connector_handler_test.go: `.NewEnvelopeFromRecord(&key, &record)` $DIR/core/services/functions/connector_handler_test.go: `.Sign(privateKey)` $DIR/core/services/functions/connector_handler_test.go: `.StdEncoding.EncodeToString(signature)` $DIR/core/services/functions/connector_handler_test.go: `.Hex()` $DIR/core/services/functions/connector_handler_test.go: `.RawMessage(`{"slot_id":3,"version":4,"expiration":5,"payload":"dGVzdA==","signature":"` + signatureB64 + `"}`)` $DIR/core/services/functions/connector_handler_test.go: `.On("Put", ctx, &key, &record, signature)` $DIR/core/services/functions/connector_handler_test.go: `.Return(nil)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.On("Allow", addr)` $DIR/core/services/functions/connector_handler_test.go: `.Return(true)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.On("GetMaxUserBalance", mock.Anything)` $DIR/core/services/functions/connector_handler_test.go: `.Return(big.NewInt(100), nil)` $DIR/core/services/functions/connector_handler_test.go: `.NewInt(100)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.On("SendToGateway", ctx, "gw1", mock.Anything)` $DIR/core/services/functions/connector_handler_test.go: `.Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":true}`, string(msg.Body.Payload)) })` $DIR/core/services/functions/connector_handler_test.go: `.Return(nil)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.HandleGatewayMessage(ctx, "gw1", &msg)` $DIR/core/services/functions/connector_handler_test.go: `.Run("orm error", func(t *testing.T) { storage.On("Put", ctx, mock.Anything, mock.Anything, mock.Anything).Return(errors.New("boom")).Once() allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(100), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Failed to set secret: boom"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) })` $DIR/core/services/functions/connector_handler_test.go: `.On("Put", ctx, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/functions/connector_handler_test.go: `.Return(errors.New("boom"))` $DIR/core/services/functions/connector_handler_test.go: `.New("boom")` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.On("Allow", addr)` $DIR/core/services/functions/connector_handler_test.go: `.Return(true)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.On("GetMaxUserBalance", mock.Anything)` $DIR/core/services/functions/connector_handler_test.go: `.Return(big.NewInt(100), nil)` $DIR/core/services/functions/connector_handler_test.go: `.NewInt(100)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.On("SendToGateway", ctx, "gw1", mock.Anything)` $DIR/core/services/functions/connector_handler_test.go: `.Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Failed to set secret: boom"}`, string(msg.Body.Payload)) })` $DIR/core/services/functions/connector_handler_test.go: `.Return(nil)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.HandleGatewayMessage(ctx, "gw1", &msg)` $DIR/core/services/functions/connector_handler_test.go: `.Run("missing signature", func(t *testing.T) { msg.Body.Payload = json.RawMessage(`{"slot_id":3,"version":4,"expiration":5,"payload":"dGVzdA=="}`) require.NoError(t, msg.Sign(privateKey)) storage.On("Put", ctx, mock.Anything, mock.Anything, mock.Anything).Return(s4.ErrWrongSignature).Once() allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(100), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Failed to set secret: wrong signature"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) })` $DIR/core/services/functions/connector_handler_test.go: `.RawMessage(`{"slot_id":3,"version":4,"expiration":5,"payload":"dGVzdA=="}`)` $DIR/core/services/functions/connector_handler_test.go: `.On("Put", ctx, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/functions/connector_handler_test.go: `.Return(s4.ErrWrongSignature)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.On("Allow", addr)` $DIR/core/services/functions/connector_handler_test.go: `.Return(true)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.On("GetMaxUserBalance", mock.Anything)` $DIR/core/services/functions/connector_handler_test.go: `.Return(big.NewInt(100), nil)` $DIR/core/services/functions/connector_handler_test.go: `.NewInt(100)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.On("SendToGateway", ctx, "gw1", mock.Anything)` $DIR/core/services/functions/connector_handler_test.go: `.Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Failed to set secret: wrong signature"}`, string(msg.Body.Payload)) })` $DIR/core/services/functions/connector_handler_test.go: `.Return(nil)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.HandleGatewayMessage(ctx, "gw1", &msg)` $DIR/core/services/functions/connector_handler_test.go: `.Run("malformed request", func(t *testing.T) { msg.Body.Payload = json.RawMessage(`{sdfgdfgoscsicosd:sdf:::sdf ::; xx}`) require.NoError(t, msg.Sign(privateKey)) allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(100), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Bad request to set secret: invalid character 's' looking for beginning of object key string"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) })` $DIR/core/services/functions/connector_handler_test.go: `.RawMessage(`{sdfgdfgoscsicosd:sdf:::sdf ::; xx}`)` $DIR/core/services/functions/connector_handler_test.go: `.On("Allow", addr)` $DIR/core/services/functions/connector_handler_test.go: `.Return(true)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.On("GetMaxUserBalance", mock.Anything)` $DIR/core/services/functions/connector_handler_test.go: `.Return(big.NewInt(100), nil)` $DIR/core/services/functions/connector_handler_test.go: `.NewInt(100)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.On("SendToGateway", ctx, "gw1", mock.Anything)` $DIR/core/services/functions/connector_handler_test.go: `.Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"Bad request to set secret: invalid character 's' looking for beginning of object key string"}`, string(msg.Body.Payload)) })` $DIR/core/services/functions/connector_handler_test.go: `.Return(nil)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.HandleGatewayMessage(ctx, "gw1", &msg)` $DIR/core/services/functions/connector_handler_test.go: `.Run("insufficient balance", func(t *testing.T) { allowlist.On("Allow", addr).Return(true).Once() subscriptions.On("GetMaxUserBalance", mock.Anything).Return(big.NewInt(0), nil).Once() connector.On("SendToGateway", ctx, "gw1", mock.Anything).Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"user subscription has insufficient balance"}`, string(msg.Body.Payload)) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", &msg) })` $DIR/core/services/functions/connector_handler_test.go: `.On("Allow", addr)` $DIR/core/services/functions/connector_handler_test.go: `.Return(true)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.On("GetMaxUserBalance", mock.Anything)` $DIR/core/services/functions/connector_handler_test.go: `.Return(big.NewInt(0), nil)` $DIR/core/services/functions/connector_handler_test.go: `.NewInt(0)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.On("SendToGateway", ctx, "gw1", mock.Anything)` $DIR/core/services/functions/connector_handler_test.go: `.Run(func(args mock.Arguments) { msg, ok := args[2].(*api.Message) require.True(t, ok) require.Equal(t, `{"success":false,"error_message":"user subscription has insufficient balance"}`, string(msg.Body.Payload)) })` $DIR/core/services/functions/connector_handler_test.go: `.Return(nil)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.HandleGatewayMessage(ctx, "gw1", &msg)` $DIR/core/services/functions/connector_handler_test.go: `.Run("unsupported method", func(t *testing.T) { msg := api.Message{ Body: api.MessageBody{ DonId: "fun4", MessageId: "1", Method: "foobar", Sender: addr.Hex(), Payload: []byte("whatever"), }, } require.NoError(t, msg.Sign(privateKey)) allowlist.On("Allow", addr).Return(true).Once() handler.HandleGatewayMessage(testutils.Context(t), "gw1", &msg) })` $DIR/core/services/functions/connector_handler_test.go: `.Hex()` $DIR/core/services/functions/connector_handler_test.go: `.On("Allow", addr)` $DIR/core/services/functions/connector_handler_test.go: `.Return(true)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.HandleGatewayMessage(testutils.Context(t), "gw1", &msg)` $DIR/core/services/functions/connector_handler_test.go: `.Context(t)` $DIR/core/services/functions/connector_handler_test.go: `.Run("heartbeat success", func(t *testing.T) { ctx := testutils.Context(t) msg, internalId := newOffchainRequest(t, addr.Bytes(), 0) require.NoError(t, msg.Sign(privateKey)) // first call to trigger the request var response functions.HeartbeatResponse allowlist.On("Allow", addr).Return(true).Once() listener.On("HandleOffchainRequest", mock.Anything, mock.Anything).Return(nil).Once() connector.On("SendToGateway", mock.Anything, "gw1", mock.Anything).Run(func(args mock.Arguments) { respMsg, ok := args[2].(*api.Message) require.True(t, ok) require.NoError(t, json.Unmarshal(respMsg.Body.Payload, &response)) require.Equal(t, functions.RequestStatePending, response.Status) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", msg) // async response computation reportCh <- &functions.OffchainResponse{ RequestId: internalId[:], Result: []byte("ok!"), } reportCh <- &functions.OffchainResponse{} // sending second item to make sure the first one got processed // second call to collect the response allowlist.On("Allow", addr).Return(true).Once() connector.On("SendToGateway", mock.Anything, "gw1", mock.Anything).Run(func(args mock.Arguments) { respMsg, ok := args[2].(*api.Message) require.True(t, ok) require.NoError(t, json.Unmarshal(respMsg.Body.Payload, &response)) require.Equal(t, functions.RequestStateComplete, response.Status) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", msg) })` $DIR/core/services/functions/connector_handler_test.go: `.Context(t)` $DIR/core/services/functions/connector_handler_test.go: `.Bytes()` $DIR/core/services/functions/connector_handler_test.go: `.On("Allow", addr)` $DIR/core/services/functions/connector_handler_test.go: `.Return(true)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.On("HandleOffchainRequest", mock.Anything, mock.Anything)` $DIR/core/services/functions/connector_handler_test.go: `.Return(nil)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.On("SendToGateway", mock.Anything, "gw1", mock.Anything)` $DIR/core/services/functions/connector_handler_test.go: `.Run(func(args mock.Arguments) { respMsg, ok := args[2].(*api.Message) require.True(t, ok) require.NoError(t, json.Unmarshal(respMsg.Body.Payload, &response)) require.Equal(t, functions.RequestStatePending, response.Status) })` $DIR/core/services/functions/connector_handler_test.go: `.Return(nil)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.HandleGatewayMessage(ctx, "gw1", msg)` $DIR/core/services/functions/connector_handler_test.go: `.On("Allow", addr)` $DIR/core/services/functions/connector_handler_test.go: `.Return(true)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.On("SendToGateway", mock.Anything, "gw1", mock.Anything)` $DIR/core/services/functions/connector_handler_test.go: `.Run(func(args mock.Arguments) { respMsg, ok := args[2].(*api.Message) require.True(t, ok) require.NoError(t, json.Unmarshal(respMsg.Body.Payload, &response)) require.Equal(t, functions.RequestStateComplete, response.Status) })` $DIR/core/services/functions/connector_handler_test.go: `.Return(nil)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.HandleGatewayMessage(ctx, "gw1", msg)` $DIR/core/services/functions/connector_handler_test.go: `.Run("heartbeat internal error", func(t *testing.T) { ctx := testutils.Context(t) msg, _ := newOffchainRequest(t, addr.Bytes(), 0) require.NoError(t, msg.Sign(privateKey)) // first call to trigger the request var response functions.HeartbeatResponse allowlist.On("Allow", addr).Return(true).Once() listener.On("HandleOffchainRequest", mock.Anything, mock.Anything).Return(errors.New("boom")).Once() connector.On("SendToGateway", mock.Anything, "gw1", mock.Anything).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", msg) // collect the response - should eventually result in an internal error gomega.NewGomegaWithT(t).Eventually(func() bool { returnedState := 0 allowlist.On("Allow", addr).Return(true).Once() connector.On("SendToGateway", mock.Anything, "gw1", mock.Anything).Run(func(args mock.Arguments) { respMsg, ok := args[2].(*api.Message) require.True(t, ok) require.NoError(t, json.Unmarshal(respMsg.Body.Payload, &response)) returnedState = response.Status }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", msg) return returnedState == functions.RequestStateInternalError }, testutils.WaitTimeout(t), 50*time.Millisecond).Should(gomega.BeTrue()) })` $DIR/core/services/functions/connector_handler_test.go: `.Context(t)` $DIR/core/services/functions/connector_handler_test.go: `.Bytes()` $DIR/core/services/functions/connector_handler_test.go: `.On("Allow", addr)` $DIR/core/services/functions/connector_handler_test.go: `.Return(true)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.On("HandleOffchainRequest", mock.Anything, mock.Anything)` $DIR/core/services/functions/connector_handler_test.go: `.Return(errors.New("boom"))` $DIR/core/services/functions/connector_handler_test.go: `.New("boom")` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.On("SendToGateway", mock.Anything, "gw1", mock.Anything)` $DIR/core/services/functions/connector_handler_test.go: `.Return(nil)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.HandleGatewayMessage(ctx, "gw1", msg)` $DIR/core/services/functions/connector_handler_test.go: `.NewGomegaWithT(t)` $DIR/core/services/functions/connector_handler_test.go: `.Eventually(func() bool { returnedState := 0 allowlist.On("Allow", addr).Return(true).Once() connector.On("SendToGateway", mock.Anything, "gw1", mock.Anything).Run(func(args mock.Arguments) { respMsg, ok := args[2].(*api.Message) require.True(t, ok) require.NoError(t, json.Unmarshal(respMsg.Body.Payload, &response)) returnedState = response.Status }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", msg) return returnedState == functions.RequestStateInternalError }, testutils.WaitTimeout(t), 50*time.Millisecond)` $DIR/core/services/functions/connector_handler_test.go: `.On("Allow", addr)` $DIR/core/services/functions/connector_handler_test.go: `.Return(true)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.On("SendToGateway", mock.Anything, "gw1", mock.Anything)` $DIR/core/services/functions/connector_handler_test.go: `.Run(func(args mock.Arguments) { respMsg, ok := args[2].(*api.Message) require.True(t, ok) require.NoError(t, json.Unmarshal(respMsg.Body.Payload, &response)) returnedState = response.Status })` $DIR/core/services/functions/connector_handler_test.go: `.Return(nil)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.HandleGatewayMessage(ctx, "gw1", msg)` $DIR/core/services/functions/connector_handler_test.go: `.WaitTimeout(t)` $DIR/core/services/functions/connector_handler_test.go: `.Should(gomega.BeTrue())` $DIR/core/services/functions/connector_handler_test.go: `.BeTrue()` $DIR/core/services/functions/connector_handler_test.go: `.Run("heartbeat sender address doesn't match", func(t *testing.T) { ctx := testutils.Context(t) msg, _ := newOffchainRequest(t, geth_common.BytesToAddress([]byte("0x1234")).Bytes(), 0) require.NoError(t, msg.Sign(privateKey)) var response functions.HeartbeatResponse allowlist.On("Allow", addr).Return(true).Once() connector.On("SendToGateway", mock.Anything, "gw1", mock.Anything).Run(func(args mock.Arguments) { respMsg, ok := args[2].(*api.Message) require.True(t, ok) require.NoError(t, json.Unmarshal(respMsg.Body.Payload, &response)) require.Equal(t, functions.RequestStateInternalError, response.Status) }).Return(nil).Once() handler.HandleGatewayMessage(ctx, "gw1", msg) })` $DIR/core/services/functions/connector_handler_test.go: `.Context(t)` $DIR/core/services/functions/connector_handler_test.go: `.BytesToAddress([]byte("0x1234"))` $DIR/core/services/functions/connector_handler_test.go: `.Bytes()` $DIR/core/services/functions/connector_handler_test.go: `.On("Allow", addr)` $DIR/core/services/functions/connector_handler_test.go: `.Return(true)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.On("SendToGateway", mock.Anything, "gw1", mock.Anything)` $DIR/core/services/functions/connector_handler_test.go: `.Run(func(args mock.Arguments) { respMsg, ok := args[2].(*api.Message) require.True(t, ok) require.NoError(t, json.Unmarshal(respMsg.Body.Payload, &response)) require.Equal(t, functions.RequestStateInternalError, response.Status) })` $DIR/core/services/functions/connector_handler_test.go: `.Return(nil)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.HandleGatewayMessage(ctx, "gw1", msg)` $DIR/core/services/functions/connector_handler_test.go: `.Context(t)` $DIR/core/services/functions/connector_handler_test.go: `.Bytes()` $DIR/core/services/functions/connector_handler_test.go: `.On("Allow", addr)` $DIR/core/services/functions/connector_handler_test.go: `.Return(true)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.On("SendToGateway", mock.Anything, "gw1", mock.Anything)` $DIR/core/services/functions/connector_handler_test.go: `.Run(func(args mock.Arguments) { respMsg, ok := args[2].(*api.Message) require.True(t, ok) require.NoError(t, json.Unmarshal(respMsg.Body.Payload, &response)) require.Equal(t, functions.RequestStateInternalError, response.Status) })` $DIR/core/services/functions/connector_handler_test.go: `.Return(nil)` $DIR/core/services/functions/connector_handler_test.go: `.Once()` $DIR/core/services/functions/connector_handler_test.go: `.HandleGatewayMessage(ctx, "gw1", msg)` $DIR/core/services/functions/external_adapter_client_test.go: `fmt.Fprintln(w, "}}invalidJSON")` $DIR/core/services/functions/external_adapter_client_test.go: `_, _, _, err = ea.RunComputation(testutils.Context(t), "requestID1234", "TestJob", "SubOwner", 1, functions.RequestFlags{}, "secRETS", reqData)` $DIR/core/services/functions/external_adapter_client_test.go: `w.WriteHeader(http.StatusInternalServerError)` $DIR/core/services/functions/external_adapter_client_test.go: `_, _, _, err = ea.RunComputation(testutils.Context(t), "requestID1234", "TestJob", "SubOwner", 1, functions.RequestFlags{}, "secRETS", &functions.RequestData{})` $DIR/core/services/functions/external_adapter_client_test.go: `<-done` $DIR/core/services/functions/external_adapter_client_test.go: `_, _, _, err = ea.RunComputation(ctx, "requestID1234", "TestJob", "SubOwner", 1, functions.RequestFlags{}, "secRETS", &functions.RequestData{})` $DIR/core/services/functions/external_adapter_client_test.go: `t.Run("OK-retry_succeeds_after_one_failure", func(t *testing.T) { counter := 0 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch counter { case 0: counter++ w.WriteHeader(http.StatusInternalServerError) return case 1: counter++ fmt.Fprintln(w, runComputationSuccessResponse) return default: t.Errorf("invalid amount of retries: %d", counter) t.FailNow() } })) defer ts.Close() adapterUrl, err := url.Parse(ts.URL) assert.NoError(t, err) ea := functions.NewExternalAdapterClient(*adapterUrl, 100_000, 1, 1*time.Nanosecond) _, _, _, err = ea.RunComputation(testutils.Context(t), "requestID1234", "TestJob", "SubOwner", 1, functions.RequestFlags{}, "secRETS", &functions.RequestData{}) assert.NoError(t, err) })` $DIR/core/services/functions/external_adapter_client_test.go: `counter++` $DIR/core/services/functions/external_adapter_client_test.go: `w.WriteHeader(http.StatusInternalServerError)` $DIR/core/services/functions/external_adapter_client_test.go: `counter++` $DIR/core/services/functions/external_adapter_client_test.go: `fmt.Fprintln(w, runComputationSuccessResponse)` $DIR/core/services/functions/external_adapter_client_test.go: `_, _, _, err = ea.RunComputation(testutils.Context(t), "requestID1234", "TestJob", "SubOwner", 1, functions.RequestFlags{}, "secRETS", &functions.RequestData{})` $DIR/core/services/functions/external_adapter_client_test.go: `t.Run("NOK-retry_fails_after_retrial", func(t *testing.T) { counter := 0 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch counter { case 0, 1: counter++ w.WriteHeader(http.StatusInternalServerError) return default: t.Errorf("invalid amount of retries: %d", counter) t.FailNow() } })) defer ts.Close() adapterUrl, err := url.Parse(ts.URL) assert.NoError(t, err) ea := functions.NewExternalAdapterClient(*adapterUrl, 100_000, 1, 1*time.Nanosecond) _, _, _, err = ea.RunComputation(testutils.Context(t), "requestID1234", "TestJob", "SubOwner", 1, functions.RequestFlags{}, "secRETS", &functions.RequestData{}) assert.Error(t, err) })` $DIR/core/services/functions/external_adapter_client_test.go: `counter++` $DIR/core/services/functions/external_adapter_client_test.go: `w.WriteHeader(http.StatusInternalServerError)` $DIR/core/services/functions/external_adapter_client_test.go: `_, _, _, err = ea.RunComputation(testutils.Context(t), "requestID1234", "TestJob", "SubOwner", 1, functions.RequestFlags{}, "secRETS", &functions.RequestData{})` $DIR/core/services/functions/external_adapter_client_test.go: `counter++` $DIR/core/services/functions/external_adapter_client_test.go: `w.WriteHeader(http.StatusBadRequest)` $DIR/core/services/functions/external_adapter_client_test.go: `_, _, _, err = ea.RunComputation(testutils.Context(t), "requestID1234", "TestJob", "SubOwner", 1, functions.RequestFlags{}, "secRETS", &functions.RequestData{})` $DIR/core/services/functions/external_adapter_client_test.go: `.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { body, err := io.ReadAll(r.Body) assert.NoError(t, err) expectedData := `{"source":"abcd","language":7,"codeLocation":42,"secretsLocation":88,"args":["arg1","arg2"]}` expectedBody := fmt.Sprintf(`{"endpoint":"lambda","requestId":"requestID1234","jobName":"TestJob","subscriptionOwner":"SubOwner","subscriptionId":1,"flags":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"nodeProvidedSecrets":"secRETS","data":%s}`, expectedData) assert.Equal(t, expectedBody, string(body)) fmt.Fprintln(w, "}}invalidJSON") }))` $DIR/core/services/functions/external_adapter_client_test.go: `.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { body, err := io.ReadAll(r.Body) assert.NoError(t, err) expectedData := `{"source":"abcd","language":7,"codeLocation":42,"secretsLocation":88,"args":["arg1","arg2"]}` expectedBody := fmt.Sprintf(`{"endpoint":"lambda","requestId":"requestID1234","jobName":"TestJob","subscriptionOwner":"SubOwner","subscriptionId":1,"flags":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"nodeProvidedSecrets":"secRETS","data":%s}`, expectedData) assert.Equal(t, expectedBody, string(body)) fmt.Fprintln(w, "}}invalidJSON") })` $DIR/core/services/functions/external_adapter_client_test.go: `.ReadAll(r.Body)` $DIR/core/services/functions/external_adapter_client_test.go: `.Sprintf(`{"endpoint":"lambda","requestId":"requestID1234","jobName":"TestJob","subscriptionOwner":"SubOwner","subscriptionId":1,"flags":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"nodeProvidedSecrets":"secRETS","data":%s}`, expectedData)` $DIR/core/services/functions/external_adapter_client_test.go: `.Fprintln(w, "}}invalidJSON")` $DIR/core/services/functions/external_adapter_client_test.go: `.Parse(ts.URL)` $DIR/core/services/functions/external_adapter_client_test.go: `.NewExternalAdapterClient(*adapterUrl, 100_000, 0, 0)` $DIR/core/services/functions/external_adapter_client_test.go: `.RunComputation(testutils.Context(t), "requestID1234", "TestJob", "SubOwner", 1, functions.RequestFlags{}, "secRETS", reqData)` $DIR/core/services/functions/external_adapter_client_test.go: `.Context(t)` $DIR/core/services/functions/external_adapter_client_test.go: `.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusInternalServerError) }))` $DIR/core/services/functions/external_adapter_client_test.go: `.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusInternalServerError) })` $DIR/core/services/functions/external_adapter_client_test.go: `.WriteHeader(http.StatusInternalServerError)` $DIR/core/services/functions/external_adapter_client_test.go: `.Parse(ts.URL)` $DIR/core/services/functions/external_adapter_client_test.go: `.NewExternalAdapterClient(*adapterUrl, 100_000, 0, 0)` $DIR/core/services/functions/external_adapter_client_test.go: `.RunComputation(testutils.Context(t), "requestID1234", "TestJob", "SubOwner", 1, functions.RequestFlags{}, "secRETS", &functions.RequestData{})` $DIR/core/services/functions/external_adapter_client_test.go: `.Context(t)` $DIR/core/services/functions/external_adapter_client_test.go: `.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { <-done }))` $DIR/core/services/functions/external_adapter_client_test.go: `.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { <-done })` $DIR/core/services/functions/external_adapter_client_test.go: `.Parse(ts.URL)` $DIR/core/services/functions/external_adapter_client_test.go: `.NewExternalAdapterClient(*adapterUrl, 100_000, 0, 0)` $DIR/core/services/functions/external_adapter_client_test.go: `.WithTimeout(testutils.Context(t), 10*time.Millisecond)` $DIR/core/services/functions/external_adapter_client_test.go: `.Context(t)` $DIR/core/services/functions/external_adapter_client_test.go: `.RunComputation(ctx, "requestID1234", "TestJob", "SubOwner", 1, functions.RequestFlags{}, "secRETS", &functions.RequestData{})` $DIR/core/services/functions/external_adapter_client_test.go: `.Run("OK-retry_succeeds_after_one_failure", func(t *testing.T) { counter := 0 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch counter { case 0: counter++ w.WriteHeader(http.StatusInternalServerError) return case 1: counter++ fmt.Fprintln(w, runComputationSuccessResponse) return default: t.Errorf("invalid amount of retries: %d", counter) t.FailNow() } })) defer ts.Close() adapterUrl, err := url.Parse(ts.URL) assert.NoError(t, err) ea := functions.NewExternalAdapterClient(*adapterUrl, 100_000, 1, 1*time.Nanosecond) _, _, _, err = ea.RunComputation(testutils.Context(t), "requestID1234", "TestJob", "SubOwner", 1, functions.RequestFlags{}, "secRETS", &functions.RequestData{}) assert.NoError(t, err) })` $DIR/core/services/functions/external_adapter_client_test.go: `.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch counter { case 0: counter++ w.WriteHeader(http.StatusInternalServerError) return case 1: counter++ fmt.Fprintln(w, runComputationSuccessResponse) return default: t.Errorf("invalid amount of retries: %d", counter) t.FailNow() } }))` $DIR/core/services/functions/external_adapter_client_test.go: `.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch counter { case 0: counter++ w.WriteHeader(http.StatusInternalServerError) return case 1: counter++ fmt.Fprintln(w, runComputationSuccessResponse) return default: t.Errorf("invalid amount of retries: %d", counter) t.FailNow() } })` $DIR/core/services/functions/external_adapter_client_test.go: `.WriteHeader(http.StatusInternalServerError)` $DIR/core/services/functions/external_adapter_client_test.go: `.Fprintln(w, runComputationSuccessResponse)` $DIR/core/services/functions/external_adapter_client_test.go: `.Parse(ts.URL)` $DIR/core/services/functions/external_adapter_client_test.go: `.NewExternalAdapterClient(*adapterUrl, 100_000, 1, 1*time.Nanosecond)` $DIR/core/services/functions/external_adapter_client_test.go: `.RunComputation(testutils.Context(t), "requestID1234", "TestJob", "SubOwner", 1, functions.RequestFlags{}, "secRETS", &functions.RequestData{})` $DIR/core/services/functions/external_adapter_client_test.go: `.Context(t)` $DIR/core/services/functions/external_adapter_client_test.go: `.Run("NOK-retry_fails_after_retrial", func(t *testing.T) { counter := 0 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch counter { case 0, 1: counter++ w.WriteHeader(http.StatusInternalServerError) return default: t.Errorf("invalid amount of retries: %d", counter) t.FailNow() } })) defer ts.Close() adapterUrl, err := url.Parse(ts.URL) assert.NoError(t, err) ea := functions.NewExternalAdapterClient(*adapterUrl, 100_000, 1, 1*time.Nanosecond) _, _, _, err = ea.RunComputation(testutils.Context(t), "requestID1234", "TestJob", "SubOwner", 1, functions.RequestFlags{}, "secRETS", &functions.RequestData{}) assert.Error(t, err) })` $DIR/core/services/functions/external_adapter_client_test.go: `.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch counter { case 0, 1: counter++ w.WriteHeader(http.StatusInternalServerError) return default: t.Errorf("invalid amount of retries: %d", counter) t.FailNow() } }))` $DIR/core/services/functions/external_adapter_client_test.go: `.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch counter { case 0, 1: counter++ w.WriteHeader(http.StatusInternalServerError) return default: t.Errorf("invalid amount of retries: %d", counter) t.FailNow() } })` $DIR/core/services/functions/external_adapter_client_test.go: `.WriteHeader(http.StatusInternalServerError)` $DIR/core/services/functions/external_adapter_client_test.go: `.Parse(ts.URL)` $DIR/core/services/functions/external_adapter_client_test.go: `.NewExternalAdapterClient(*adapterUrl, 100_000, 1, 1*time.Nanosecond)` $DIR/core/services/functions/external_adapter_client_test.go: `.RunComputation(testutils.Context(t), "requestID1234", "TestJob", "SubOwner", 1, functions.RequestFlags{}, "secRETS", &functions.RequestData{})` $DIR/core/services/functions/external_adapter_client_test.go: `.Context(t)` $DIR/core/services/functions/external_adapter_client_test.go: `.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch counter { case 0: counter++ w.WriteHeader(http.StatusBadRequest) return default: t.Errorf("invalid amount of retries: %d", counter) t.FailNow() } }))` $DIR/core/services/functions/external_adapter_client_test.go: `.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch counter { case 0: counter++ w.WriteHeader(http.StatusBadRequest) return default: t.Errorf("invalid amount of retries: %d", counter) t.FailNow() } })` $DIR/core/services/functions/external_adapter_client_test.go: `.WriteHeader(http.StatusBadRequest)` $DIR/core/services/functions/external_adapter_client_test.go: `.Parse(ts.URL)` $DIR/core/services/functions/external_adapter_client_test.go: `.NewExternalAdapterClient(*adapterUrl, 100_000, 1, 1*time.Nanosecond)` $DIR/core/services/functions/external_adapter_client_test.go: `.RunComputation(testutils.Context(t), "requestID1234", "TestJob", "SubOwner", 1, functions.RequestFlags{}, "secRETS", &functions.RequestData{})` $DIR/core/services/functions/external_adapter_client_test.go: `.Context(t)` $DIR/core/services/functions/listener_test.go: `testutils.SkipShortDB(t)` $DIR/core/services/functions/listener_test.go: `uni.logPollerWrapper.On("LatestEvents", mock.Anything).Return([]types.OracleRequest{request}, nil, nil).Once()` $DIR/core/services/functions/listener_test.go: `uni.logPollerWrapper.On("LatestEvents", mock.Anything).Return(nil, nil, nil)` $DIR/core/services/functions/listener_test.go: `uni.pluginORM.On("CreateRequest", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/functions/listener_test.go: `uni.bridgeAccessor.On("NewExternalAdapterClient", mock.Anything).Return(uni.eaClient, nil)` $DIR/core/services/functions/listener_test.go: `uni.eaClient.On("RunComputation", mock.Anything, RequestIDStr, mock.Anything, SubscriptionOwner.Hex(), SubscriptionID, mock.Anything, mock.Anything, mock.Anything).Return(ResultBytes, nil, nil, nil)` $DIR/core/services/functions/listener_test.go: `uni.pluginORM.On("SetResult", mock.Anything, RequestID, ResultBytes, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { close(doneCh) }).Return(nil)` $DIR/core/services/functions/listener_test.go: `close(doneCh)` $DIR/core/services/functions/listener_test.go: `servicetest.Run(t, uni.service)` $DIR/core/services/functions/listener_test.go: `testutils.SkipShortDB(t)` $DIR/core/services/functions/listener_test.go: `uni.pluginORM.On("CreateRequest", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/functions/listener_test.go: `uni.bridgeAccessor.On("NewExternalAdapterClient", mock.Anything).Return(uni.eaClient, nil)` $DIR/core/services/functions/listener_test.go: `uni.eaClient.On("RunComputation", mock.Anything, RequestIDStr, mock.Anything, SubscriptionOwner.Hex(), SubscriptionID, mock.Anything, mock.Anything, mock.Anything).Return(ResultBytes, nil, nil, nil)` $DIR/core/services/functions/listener_test.go: `uni.pluginORM.On("SetResult", mock.Anything, RequestID, ResultBytes, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/functions/listener_test.go: `testutils.SkipShortDB(t)` $DIR/core/services/functions/listener_test.go: `request.RequestInitiator = SubscriptionOwner.Bytes()` $DIR/core/services/functions/listener_test.go: `request.SubscriptionOwner = []byte("invalid_address")` $DIR/core/services/functions/listener_test.go: `request.SubscriptionOwner = SubscriptionOwner.Bytes()` $DIR/core/services/functions/listener_test.go: `request.Timestamp = 1` $DIR/core/services/functions/listener_test.go: `testutils.SkipShortDB(t)` $DIR/core/services/functions/listener_test.go: `uni.pluginORM.On("CreateRequest", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/functions/listener_test.go: `uni.bridgeAccessor.On("NewExternalAdapterClient", mock.Anything).Return(uni.eaClient, nil)` $DIR/core/services/functions/listener_test.go: `uni.eaClient.On("RunComputation", mock.Anything, RequestIDStr, mock.Anything, SubscriptionOwner.Hex(), SubscriptionID, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil, nil, errors.New("error"))` $DIR/core/services/functions/listener_test.go: `uni.pluginORM.On("SetError", mock.Anything, RequestID, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/functions/listener_test.go: `testutils.SkipShortDB(t)` $DIR/core/services/functions/listener_test.go: `uni.logPollerWrapper.On("LatestEvents", mock.Anything).Return([]types.OracleRequest{request}, nil, nil).Once()` $DIR/core/services/functions/listener_test.go: `uni.logPollerWrapper.On("LatestEvents", mock.Anything).Return(nil, nil, nil)` $DIR/core/services/functions/listener_test.go: `uni.pluginORM.On("CreateRequest", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/functions/listener_test.go: `uni.bridgeAccessor.On("NewExternalAdapterClient", mock.Anything).Return(uni.eaClient, nil)` $DIR/core/services/functions/listener_test.go: `uni.eaClient.On("RunComputation", mock.Anything, RequestIDStr, mock.Anything, SubscriptionOwner.Hex(), SubscriptionID, mock.Anything, mock.Anything, mock.Anything).Return(nil, ErrorBytes, nil, nil)` $DIR/core/services/functions/listener_test.go: `uni.pluginORM.On("SetError", mock.Anything, RequestID, mock.Anything, ErrorBytes, mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { close(doneCh) }).Return(nil)` $DIR/core/services/functions/listener_test.go: `close(doneCh)` $DIR/core/services/functions/listener_test.go: `servicetest.Run(t, uni.service)` $DIR/core/services/functions/listener_test.go: `testutils.SkipShortDB(t)` $DIR/core/services/functions/listener_test.go: `cborBytes = cborBytes[1:]` $DIR/core/services/functions/listener_test.go: `uni.logPollerWrapper.On("LatestEvents", mock.Anything).Return([]types.OracleRequest{request}, nil, nil).Once()` $DIR/core/services/functions/listener_test.go: `uni.logPollerWrapper.On("LatestEvents", mock.Anything).Return(nil, nil, nil)` $DIR/core/services/functions/listener_test.go: `uni.pluginORM.On("CreateRequest", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/functions/listener_test.go: `uni.bridgeAccessor.On("NewExternalAdapterClient", mock.Anything).Return(uni.eaClient, nil)` $DIR/core/services/functions/listener_test.go: `uni.eaClient.On("FetchEncryptedSecrets", mock.Anything, mock.Anything, RequestIDStr, mock.Anything, mock.Anything).Return(EncryptedSecrets, nil, nil)` $DIR/core/services/functions/listener_test.go: `uni.decryptor.On("Decrypt", mock.Anything, decryptionPlugin.CiphertextId(RequestID[:]), EncryptedSecrets).Return(DecryptedSecrets, nil)` $DIR/core/services/functions/listener_test.go: `uni.eaClient.On("RunComputation", mock.Anything, RequestIDStr, mock.Anything, SubscriptionOwner.Hex(), SubscriptionID, mock.Anything, mock.Anything, mock.Anything).Return(ResultBytes, nil, nil, nil)` $DIR/core/services/functions/listener_test.go: `uni.pluginORM.On("SetResult", mock.Anything, RequestID, ResultBytes, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { close(doneCh) }).Return(nil)` $DIR/core/services/functions/listener_test.go: `close(doneCh)` $DIR/core/services/functions/listener_test.go: `servicetest.Run(t, uni.service)` $DIR/core/services/functions/listener_test.go: `testutils.SkipShortDB(t)` $DIR/core/services/functions/listener_test.go: `uni.logPollerWrapper.On("LatestEvents", mock.Anything).Return([]types.OracleRequest{request}, nil, nil).Once()` $DIR/core/services/functions/listener_test.go: `uni.logPollerWrapper.On("LatestEvents", mock.Anything).Return(nil, nil, nil)` $DIR/core/services/functions/listener_test.go: `uni.pluginORM.On("CreateRequest", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/functions/listener_test.go: `uni.pluginORM.On("SetError", mock.Anything, RequestID, functions_service.USER_ERROR, []byte("request too big (max 10 bytes)"), mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { close(doneCh) }).Return(nil)` $DIR/core/services/functions/listener_test.go: `close(doneCh)` $DIR/core/services/functions/listener_test.go: `servicetest.Run(t, uni.service)` $DIR/core/services/functions/listener_test.go: `testutils.SkipShortDB(t)` $DIR/core/services/functions/listener_test.go: `uni.logPollerWrapper.On("LatestEvents", mock.Anything).Return([]types.OracleRequest{request}, nil, nil).Once()` $DIR/core/services/functions/listener_test.go: `uni.logPollerWrapper.On("LatestEvents", mock.Anything).Return(nil, nil, nil)` $DIR/core/services/functions/listener_test.go: `uni.pluginORM.On("CreateRequest", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/functions/listener_test.go: `uni.bridgeAccessor.On("NewExternalAdapterClient", mock.Anything).Return(uni.eaClient, nil)` $DIR/core/services/functions/listener_test.go: `uni.eaClient.On("RunComputation", mock.Anything, RequestIDStr, mock.Anything, SubscriptionOwner.Hex(), SubscriptionID, mock.Anything, mock.Anything, mock.Anything).Return(ResultBytes, nil, Domains, nil)` $DIR/core/services/functions/listener_test.go: `uni.pluginORM.On("SetResult", mock.Anything, RequestID, ResultBytes, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { close(doneCh) }).Return(nil)` $DIR/core/services/functions/listener_test.go: `close(doneCh)` $DIR/core/services/functions/listener_test.go: `uni.ingressClient.On("Send", mock.Anything, mock.AnythingOfType("[]uint8"), mock.AnythingOfType("string"), mock.AnythingOfType("TelemetryType")).Return().Run(func(args mock.Arguments) { sentMessage = args[1].([]byte) })` $DIR/core/services/functions/listener_test.go: `sentMessage = args[1].([]byte)` $DIR/core/services/functions/listener_test.go: `<-doneCh` $DIR/core/services/functions/listener_test.go: `testutils.SkipShortDB(t)` $DIR/core/services/functions/listener_test.go: `uni.logPollerWrapper.On("LatestEvents", mock.Anything).Return(nil, nil, nil)` $DIR/core/services/functions/listener_test.go: `uni.pluginORM.On("PruneOldestRequests", mock.Anything, functions_service.DefaultPruneMaxStoredRequests, functions_service.DefaultPruneBatchSize, mock.Anything).Return(uint32(0), uint32(0), nil).Run(func(args mock.Arguments) { doneCh <- true })` $DIR/core/services/functions/listener_test.go: `doneCh <- true` $DIR/core/services/functions/listener_test.go: `servicetest.Run(t, uni.service)` $DIR/core/services/functions/listener_test.go: `testutils.SkipShortDB(t)` $DIR/core/services/functions/listener_test.go: `uni.logPollerWrapper.On("LatestEvents", mock.Anything).Return(nil, nil, nil)` $DIR/core/services/functions/listener_test.go: `uni.pluginORM.On("TimeoutExpiredResults", mock.Anything, mock.Anything, uint32(1), mock.Anything).Return([]functions_service.RequestID{}, nil).Run(func(args mock.Arguments) { doneCh <- true })` $DIR/core/services/functions/listener_test.go: `doneCh <- true` $DIR/core/services/functions/listener_test.go: `servicetest.Run(t, uni.service)` $DIR/core/services/functions/listener_test.go: `testutils.SkipShortDB(t)` $DIR/core/services/functions/listener_test.go: `ormCallExited.Add(1)` $DIR/core/services/functions/listener_test.go: `uni.logPollerWrapper.On("LatestEvents", mock.Anything).Return([]types.OracleRequest{request}, nil, nil).Once()` $DIR/core/services/functions/listener_test.go: `uni.logPollerWrapper.On("LatestEvents", mock.Anything).Return(nil, nil, nil)` $DIR/core/services/functions/listener_test.go: `uni.pluginORM.On("CreateRequest", mock.Anything, mock.Anything).Run(func(args mock.Arguments) { <-args.Get(0).(context.Context).Done() ormCallExited.Done() }).Return(errors.New("timeout"))` $DIR/core/services/functions/listener_test.go: `<-args.Get(0).(context.Context).Done()` $DIR/core/services/functions/listener_test.go: `ormCallExited.Done()` $DIR/core/services/functions/listener_test.go: `servicetest.Run(t, uni.service)` $DIR/core/services/functions/listener_test.go: `.SkipShortDB(t)` $DIR/core/services/functions/listener_test.go: `.logPollerWrapper.On("LatestEvents", mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return([]types.OracleRequest{request}, nil, nil)` $DIR/core/services/functions/listener_test.go: `.Once()` $DIR/core/services/functions/listener_test.go: `.logPollerWrapper.On("LatestEvents", mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return(nil, nil, nil)` $DIR/core/services/functions/listener_test.go: `.pluginORM.On("CreateRequest", mock.Anything, mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return(nil)` $DIR/core/services/functions/listener_test.go: `.bridgeAccessor.On("NewExternalAdapterClient", mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return(uni.eaClient, nil)` $DIR/core/services/functions/listener_test.go: `.eaClient.On("RunComputation", mock.Anything, RequestIDStr, mock.Anything, SubscriptionOwner.Hex(), SubscriptionID, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Hex()` $DIR/core/services/functions/listener_test.go: `.Return(ResultBytes, nil, nil, nil)` $DIR/core/services/functions/listener_test.go: `.pluginORM.On("SetResult", mock.Anything, RequestID, ResultBytes, mock.Anything, mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Run(func(args mock.Arguments) { close(doneCh) })` $DIR/core/services/functions/listener_test.go: `.Return(nil)` $DIR/core/services/functions/listener_test.go: `.Run(t, uni.service)` $DIR/core/services/functions/listener_test.go: `.SkipShortDB(t)` $DIR/core/services/functions/listener_test.go: `.pluginORM.On("CreateRequest", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return(nil)` $DIR/core/services/functions/listener_test.go: `.bridgeAccessor.On("NewExternalAdapterClient", mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return(uni.eaClient, nil)` $DIR/core/services/functions/listener_test.go: `.eaClient.On("RunComputation", mock.Anything, RequestIDStr, mock.Anything, SubscriptionOwner.Hex(), SubscriptionID, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Hex()` $DIR/core/services/functions/listener_test.go: `.Return(ResultBytes, nil, nil, nil)` $DIR/core/services/functions/listener_test.go: `.pluginORM.On("SetResult", mock.Anything, RequestID, ResultBytes, mock.Anything, mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return(nil)` $DIR/core/services/functions/listener_test.go: `.Bytes()` $DIR/core/services/functions/listener_test.go: `.Bytes()` $DIR/core/services/functions/listener_test.go: `.Now()` $DIR/core/services/functions/listener_test.go: `.Unix()` $DIR/core/services/functions/listener_test.go: `.service.HandleOffchainRequest(testutils.Context(t), request)` $DIR/core/services/functions/listener_test.go: `.Context(t)` $DIR/core/services/functions/listener_test.go: `.SkipShortDB(t)` $DIR/core/services/functions/listener_test.go: `.Bytes()` $DIR/core/services/functions/listener_test.go: `.Now()` $DIR/core/services/functions/listener_test.go: `.Unix()` $DIR/core/services/functions/listener_test.go: `.Bytes()` $DIR/core/services/functions/listener_test.go: `.Bytes()` $DIR/core/services/functions/listener_test.go: `.service.HandleOffchainRequest(testutils.Context(t), request)` $DIR/core/services/functions/listener_test.go: `.Context(t)` $DIR/core/services/functions/listener_test.go: `.SkipShortDB(t)` $DIR/core/services/functions/listener_test.go: `.pluginORM.On("CreateRequest", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return(nil)` $DIR/core/services/functions/listener_test.go: `.bridgeAccessor.On("NewExternalAdapterClient", mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return(uni.eaClient, nil)` $DIR/core/services/functions/listener_test.go: `.eaClient.On("RunComputation", mock.Anything, RequestIDStr, mock.Anything, SubscriptionOwner.Hex(), SubscriptionID, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Hex()` $DIR/core/services/functions/listener_test.go: `.Return(nil, nil, nil, errors.New("error"))` $DIR/core/services/functions/listener_test.go: `.New("error")` $DIR/core/services/functions/listener_test.go: `.pluginORM.On("SetError", mock.Anything, RequestID, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return(nil)` $DIR/core/services/functions/listener_test.go: `.Bytes()` $DIR/core/services/functions/listener_test.go: `.Bytes()` $DIR/core/services/functions/listener_test.go: `.Now()` $DIR/core/services/functions/listener_test.go: `.Unix()` $DIR/core/services/functions/listener_test.go: `.service.HandleOffchainRequest(testutils.Context(t), request)` $DIR/core/services/functions/listener_test.go: `.Context(t)` $DIR/core/services/functions/listener_test.go: `.SkipShortDB(t)` $DIR/core/services/functions/listener_test.go: `.logPollerWrapper.On("LatestEvents", mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return([]types.OracleRequest{request}, nil, nil)` $DIR/core/services/functions/listener_test.go: `.Once()` $DIR/core/services/functions/listener_test.go: `.logPollerWrapper.On("LatestEvents", mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return(nil, nil, nil)` $DIR/core/services/functions/listener_test.go: `.pluginORM.On("CreateRequest", mock.Anything, mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return(nil)` $DIR/core/services/functions/listener_test.go: `.bridgeAccessor.On("NewExternalAdapterClient", mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return(uni.eaClient, nil)` $DIR/core/services/functions/listener_test.go: `.eaClient.On("RunComputation", mock.Anything, RequestIDStr, mock.Anything, SubscriptionOwner.Hex(), SubscriptionID, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Hex()` $DIR/core/services/functions/listener_test.go: `.Return(nil, ErrorBytes, nil, nil)` $DIR/core/services/functions/listener_test.go: `.pluginORM.On("SetError", mock.Anything, RequestID, mock.Anything, ErrorBytes, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Run(func(args mock.Arguments) { close(doneCh) })` $DIR/core/services/functions/listener_test.go: `.Return(nil)` $DIR/core/services/functions/listener_test.go: `.Run(t, uni.service)` $DIR/core/services/functions/listener_test.go: `.SkipShortDB(t)` $DIR/core/services/functions/listener_test.go: `.Marshal(reqData)` $DIR/core/services/functions/listener_test.go: `.logPollerWrapper.On("LatestEvents", mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return([]types.OracleRequest{request}, nil, nil)` $DIR/core/services/functions/listener_test.go: `.Once()` $DIR/core/services/functions/listener_test.go: `.logPollerWrapper.On("LatestEvents", mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return(nil, nil, nil)` $DIR/core/services/functions/listener_test.go: `.pluginORM.On("CreateRequest", mock.Anything, mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return(nil)` $DIR/core/services/functions/listener_test.go: `.bridgeAccessor.On("NewExternalAdapterClient", mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return(uni.eaClient, nil)` $DIR/core/services/functions/listener_test.go: `.eaClient.On("FetchEncryptedSecrets", mock.Anything, mock.Anything, RequestIDStr, mock.Anything, mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return(EncryptedSecrets, nil, nil)` $DIR/core/services/functions/listener_test.go: `.decryptor.On("Decrypt", mock.Anything, decryptionPlugin.CiphertextId(RequestID[:]), EncryptedSecrets)` $DIR/core/services/functions/listener_test.go: `.CiphertextId(RequestID[:])` $DIR/core/services/functions/listener_test.go: `.Return(DecryptedSecrets, nil)` $DIR/core/services/functions/listener_test.go: `.eaClient.On("RunComputation", mock.Anything, RequestIDStr, mock.Anything, SubscriptionOwner.Hex(), SubscriptionID, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Hex()` $DIR/core/services/functions/listener_test.go: `.Return(ResultBytes, nil, nil, nil)` $DIR/core/services/functions/listener_test.go: `.pluginORM.On("SetResult", mock.Anything, RequestID, ResultBytes, mock.Anything, mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Run(func(args mock.Arguments) { close(doneCh) })` $DIR/core/services/functions/listener_test.go: `.Return(nil)` $DIR/core/services/functions/listener_test.go: `.Run(t, uni.service)` $DIR/core/services/functions/listener_test.go: `.SkipShortDB(t)` $DIR/core/services/functions/listener_test.go: `.logPollerWrapper.On("LatestEvents", mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return([]types.OracleRequest{request}, nil, nil)` $DIR/core/services/functions/listener_test.go: `.Once()` $DIR/core/services/functions/listener_test.go: `.logPollerWrapper.On("LatestEvents", mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return(nil, nil, nil)` $DIR/core/services/functions/listener_test.go: `.pluginORM.On("CreateRequest", mock.Anything, mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return(nil)` $DIR/core/services/functions/listener_test.go: `.pluginORM.On("SetError", mock.Anything, RequestID, functions_service.USER_ERROR, []byte("request too big (max 10 bytes)"), mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Run(func(args mock.Arguments) { close(doneCh) })` $DIR/core/services/functions/listener_test.go: `.Return(nil)` $DIR/core/services/functions/listener_test.go: `.Run(t, uni.service)` $DIR/core/services/functions/listener_test.go: `.SkipShortDB(t)` $DIR/core/services/functions/listener_test.go: `.logPollerWrapper.On("LatestEvents", mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return([]types.OracleRequest{request}, nil, nil)` $DIR/core/services/functions/listener_test.go: `.Once()` $DIR/core/services/functions/listener_test.go: `.logPollerWrapper.On("LatestEvents", mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return(nil, nil, nil)` $DIR/core/services/functions/listener_test.go: `.pluginORM.On("CreateRequest", mock.Anything, mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return(nil)` $DIR/core/services/functions/listener_test.go: `.bridgeAccessor.On("NewExternalAdapterClient", mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return(uni.eaClient, nil)` $DIR/core/services/functions/listener_test.go: `.eaClient.On("RunComputation", mock.Anything, RequestIDStr, mock.Anything, SubscriptionOwner.Hex(), SubscriptionID, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Hex()` $DIR/core/services/functions/listener_test.go: `.Return(ResultBytes, nil, Domains, nil)` $DIR/core/services/functions/listener_test.go: `.pluginORM.On("SetResult", mock.Anything, RequestID, ResultBytes, mock.Anything, mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Run(func(args mock.Arguments) { close(doneCh) })` $DIR/core/services/functions/listener_test.go: `.Return(nil)` $DIR/core/services/functions/listener_test.go: `.ingressClient.On("Send", mock.Anything, mock.AnythingOfType("[]uint8"), mock.AnythingOfType("string"), mock.AnythingOfType("TelemetryType"))` $DIR/core/services/functions/listener_test.go: `.AnythingOfType("[]uint8")` $DIR/core/services/functions/listener_test.go: `.AnythingOfType("string")` $DIR/core/services/functions/listener_test.go: `.AnythingOfType("TelemetryType")` $DIR/core/services/functions/listener_test.go: `.Return()` $DIR/core/services/functions/listener_test.go: `.Run(func(args mock.Arguments) { sentMessage = args[1].([]byte) })` $DIR/core/services/functions/listener_test.go: `.Unmarshal(sentMessage, &req)` $DIR/core/services/functions/listener_test.go: `.SkipShortDB(t)` $DIR/core/services/functions/listener_test.go: `.logPollerWrapper.On("LatestEvents", mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return(nil, nil, nil)` $DIR/core/services/functions/listener_test.go: `.pluginORM.On("PruneOldestRequests", mock.Anything, functions_service.DefaultPruneMaxStoredRequests, functions_service.DefaultPruneBatchSize, mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return(uint32(0), uint32(0), nil)` $DIR/core/services/functions/listener_test.go: `.Run(func(args mock.Arguments) { doneCh <- true })` $DIR/core/services/functions/listener_test.go: `.Run(t, uni.service)` $DIR/core/services/functions/listener_test.go: `.SkipShortDB(t)` $DIR/core/services/functions/listener_test.go: `.logPollerWrapper.On("LatestEvents", mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return(nil, nil, nil)` $DIR/core/services/functions/listener_test.go: `.pluginORM.On("TimeoutExpiredResults", mock.Anything, mock.Anything, uint32(1), mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return([]functions_service.RequestID{}, nil)` $DIR/core/services/functions/listener_test.go: `.Run(func(args mock.Arguments) { doneCh <- true })` $DIR/core/services/functions/listener_test.go: `.Run(t, uni.service)` $DIR/core/services/functions/listener_test.go: `.SkipShortDB(t)` $DIR/core/services/functions/listener_test.go: `.Add(1)` $DIR/core/services/functions/listener_test.go: `.logPollerWrapper.On("LatestEvents", mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return([]types.OracleRequest{request}, nil, nil)` $DIR/core/services/functions/listener_test.go: `.Once()` $DIR/core/services/functions/listener_test.go: `.logPollerWrapper.On("LatestEvents", mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Return(nil, nil, nil)` $DIR/core/services/functions/listener_test.go: `.pluginORM.On("CreateRequest", mock.Anything, mock.Anything)` $DIR/core/services/functions/listener_test.go: `.Run(func(args mock.Arguments) { <-args.Get(0).(context.Context).Done() ormCallExited.Done() })` $DIR/core/services/functions/listener_test.go: `.Get(0)` $DIR/core/services/functions/listener_test.go: `.Done()` $DIR/core/services/functions/listener_test.go: `.Done()` $DIR/core/services/functions/listener_test.go: `.Return(errors.New("timeout"))` $DIR/core/services/functions/listener_test.go: `.New("timeout")` $DIR/core/services/functions/listener_test.go: `.Run(t, uni.service)` $DIR/core/services/functions/offchain_transmitter_test.go: `.NewOffchainTransmitter(1)` $DIR/core/services/functions/offchain_transmitter_test.go: `.ReportChannel()` $DIR/core/services/functions/offchain_transmitter_test.go: `.Context(t)` $DIR/core/services/functions/offchain_transmitter_test.go: `.WithTimeout(ctx, time.Millisecond*20)` $DIR/core/services/functions/offchain_transmitter_test.go: `.TransmitReport(ctxTimeout, report)` $DIR/core/services/functions/orm_test.go: `t.Run("missing ID", func(t *testing.T) { req, err := orm.FindById(testutils.Context(t), newRequestID()) require.Error(t, err) require.Nil(t, req) })` $DIR/core/services/functions/orm_test.go: `err = orm.SetResult(ctx, id, []byte{}, now)` $DIR/core/services/functions/orm_test.go: `req, err = orm.FindById(ctx, id)` $DIR/core/services/functions/orm_test.go: `_, err = orm.TimeoutExpiredResults(ctx, now.Add(time.Minute), 1)` $DIR/core/services/functions/orm_test.go: `req, err = orm.FindById(ctx, id)` $DIR/core/services/functions/orm_test.go: `err = orm.SetFinalized(ctx, id, nil, nil)` $DIR/core/services/functions/orm_test.go: `req, err = orm.FindById(ctx, id)` $DIR/core/services/functions/orm_test.go: `err = orm.SetConfirmed(ctx, id)` $DIR/core/services/functions/orm_test.go: `req, err = orm.FindById(ctx, id)` $DIR/core/services/functions/orm_test.go: `createRequestWithTimestamp(t, orm, now.Add(3*time.Minute))` $DIR/core/services/functions/orm_test.go: `t.Run("with limit", func(t *testing.T) { ctx := testutils.Context(t) result, err := orm.FindOldestEntriesByState(ctx, functions.IN_PROGRESS, 2) require.NoError(t, err) require.Equal(t, 2, len(result), "incorrect results length") require.Equal(t, id1, result[0].RequestID, "incorrect results order") require.Equal(t, id2, result[1].RequestID, "incorrect results order") require.Equal(t, defaultFlags, result[0].Flags) require.Equal(t, defaultAggregationMethod, *result[0].AggregationMethod) require.Equal(t, defaultGasLimit, *result[0].CallbackGasLimit) require.Equal(t, defaultCoordinatorContract, *result[0].CoordinatorContractAddress) require.Equal(t, defaultMetadata, result[0].OnchainMetadata) })` $DIR/core/services/functions/orm_test.go: `t.Run("with no limit", func(t *testing.T) { ctx := testutils.Context(t) result, err := orm.FindOldestEntriesByState(ctx, functions.IN_PROGRESS, 20) require.NoError(t, err) require.Equal(t, 3, len(result), "incorrect results length") })` $DIR/core/services/functions/orm_test.go: `ids = append(ids, id)` $DIR/core/services/functions/orm_test.go: `err = orm.SetFinalized(ctx, ids[1], []byte("result"), []byte(""))` $DIR/core/services/functions/orm_test.go: `err = orm.SetConfirmed(ctx, ids[2])` $DIR/core/services/functions/orm_test.go: `results, err = orm.TimeoutExpiredResults(ctx, now.Add(-15*time.Minute), 10)` $DIR/core/services/functions/orm_test.go: `results, err = orm.TimeoutExpiredResults(ctx, now.Add(-15*time.Minute), 10)` $DIR/core/services/functions/orm_test.go: `ids = append(ids, id)` $DIR/core/services/functions/orm_test.go: `total, pruned, err = orm.PruneOldestRequests(ctx, 1, 2)` $DIR/core/services/functions/orm_test.go: `total, pruned, err = orm.PruneOldestRequests(ctx, 1, 20)` $DIR/core/services/functions/orm_test.go: `total, pruned, err = orm.PruneOldestRequests(ctx, 1, 20)` $DIR/core/services/functions/orm_test.go: `_, _ = createRequestWithTimestamp(t, orm, now.Add(time.Duration(offset)*time.Minute))` $DIR/core/services/functions/orm_test.go: `.Context(t)` $DIR/core/services/functions/orm_test.go: `.FindById(ctx, id1)` $DIR/core/services/functions/orm_test.go: `.FindById(ctx, id2)` $DIR/core/services/functions/orm_test.go: `.Run("missing ID", func(t *testing.T) { req, err := orm.FindById(testutils.Context(t), newRequestID()) require.Error(t, err) require.Nil(t, req) })` $DIR/core/services/functions/orm_test.go: `.FindById(testutils.Context(t), newRequestID())` $DIR/core/services/functions/orm_test.go: `.Context(t)` $DIR/core/services/functions/orm_test.go: `.CreateRequest(testutils.Context(t), newReq)` $DIR/core/services/functions/orm_test.go: `.Context(t)` $DIR/core/services/functions/orm_test.go: `.Context(t)` $DIR/core/services/functions/orm_test.go: `.Now()` $DIR/core/services/functions/orm_test.go: `.Round(time.Second)` $DIR/core/services/functions/orm_test.go: `.SetResult(ctx, id, []byte("result"), rdts)` $DIR/core/services/functions/orm_test.go: `.FindById(ctx, id)` $DIR/core/services/functions/orm_test.go: `.Context(t)` $DIR/core/services/functions/orm_test.go: `.Now()` $DIR/core/services/functions/orm_test.go: `.Round(time.Second)` $DIR/core/services/functions/orm_test.go: `.SetError(ctx, id, functions.USER_ERROR, []byte("error"), rdts, true)` $DIR/core/services/functions/orm_test.go: `.FindById(ctx, id)` $DIR/core/services/functions/orm_test.go: `.Context(t)` $DIR/core/services/functions/orm_test.go: `.Now()` $DIR/core/services/functions/orm_test.go: `.Round(time.Second)` $DIR/core/services/functions/orm_test.go: `.SetError(ctx, id, functions.INTERNAL_ERROR, []byte("error"), rdts, false)` $DIR/core/services/functions/orm_test.go: `.FindById(ctx, id)` $DIR/core/services/functions/orm_test.go: `.Context(t)` $DIR/core/services/functions/orm_test.go: `.SetFinalized(ctx, id, []byte("result"), []byte("error"))` $DIR/core/services/functions/orm_test.go: `.FindById(ctx, id)` $DIR/core/services/functions/orm_test.go: `.Context(t)` $DIR/core/services/functions/orm_test.go: `.SetConfirmed(ctx, id)` $DIR/core/services/functions/orm_test.go: `.FindById(ctx, id)` $DIR/core/services/functions/orm_test.go: `.Context(t)` $DIR/core/services/functions/orm_test.go: `.Now()` $DIR/core/services/functions/orm_test.go: `.FindById(ctx, id)` $DIR/core/services/functions/orm_test.go: `.SetResult(ctx, id, []byte{}, now)` $DIR/core/services/functions/orm_test.go: `.FindById(ctx, id)` $DIR/core/services/functions/orm_test.go: `.TimeoutExpiredResults(ctx, now.Add(time.Minute), 1)` $DIR/core/services/functions/orm_test.go: `.Add(time.Minute)` $DIR/core/services/functions/orm_test.go: `.FindById(ctx, id)` $DIR/core/services/functions/orm_test.go: `.SetFinalized(ctx, id, nil, nil)` $DIR/core/services/functions/orm_test.go: `.FindById(ctx, id)` $DIR/core/services/functions/orm_test.go: `.SetConfirmed(ctx, id)` $DIR/core/services/functions/orm_test.go: `.FindById(ctx, id)` $DIR/core/services/functions/orm_test.go: `.Now()` $DIR/core/services/functions/orm_test.go: `.Add(2*time.Minute)` $DIR/core/services/functions/orm_test.go: `.Add(3*time.Minute)` $DIR/core/services/functions/orm_test.go: `.Add(1*time.Minute)` $DIR/core/services/functions/orm_test.go: `.Run("with limit", func(t *testing.T) { ctx := testutils.Context(t) result, err := orm.FindOldestEntriesByState(ctx, functions.IN_PROGRESS, 2) require.NoError(t, err) require.Equal(t, 2, len(result), "incorrect results length") require.Equal(t, id1, result[0].RequestID, "incorrect results order") require.Equal(t, id2, result[1].RequestID, "incorrect results order") require.Equal(t, defaultFlags, result[0].Flags) require.Equal(t, defaultAggregationMethod, *result[0].AggregationMethod) require.Equal(t, defaultGasLimit, *result[0].CallbackGasLimit) require.Equal(t, defaultCoordinatorContract, *result[0].CoordinatorContractAddress) require.Equal(t, defaultMetadata, result[0].OnchainMetadata) })` $DIR/core/services/functions/orm_test.go: `.Context(t)` $DIR/core/services/functions/orm_test.go: `.FindOldestEntriesByState(ctx, functions.IN_PROGRESS, 2)` $DIR/core/services/functions/orm_test.go: `.Run("with no limit", func(t *testing.T) { ctx := testutils.Context(t) result, err := orm.FindOldestEntriesByState(ctx, functions.IN_PROGRESS, 20) require.NoError(t, err) require.Equal(t, 3, len(result), "incorrect results length") })` $DIR/core/services/functions/orm_test.go: `.Context(t)` $DIR/core/services/functions/orm_test.go: `.FindOldestEntriesByState(ctx, functions.IN_PROGRESS, 20)` $DIR/core/services/functions/orm_test.go: `.Context(t)` $DIR/core/services/functions/orm_test.go: `.FindOldestEntriesByState(ctx, functions.RESULT_READY, 10)` $DIR/core/services/functions/orm_test.go: `.Context(t)` $DIR/core/services/functions/orm_test.go: `.Now()` $DIR/core/services/functions/orm_test.go: `.Add(time.Duration(offset)*time.Minute)` $DIR/core/services/functions/orm_test.go: `.Duration(offset)` $DIR/core/services/functions/orm_test.go: `.SetResult(ctx, ids[0], []byte("result"), now)` $DIR/core/services/functions/orm_test.go: `.SetFinalized(ctx, ids[1], []byte("result"), []byte(""))` $DIR/core/services/functions/orm_test.go: `.SetConfirmed(ctx, ids[2])` $DIR/core/services/functions/orm_test.go: `.TimeoutExpiredResults(ctx, now.Add(-35*time.Minute), 1)` $DIR/core/services/functions/orm_test.go: `.Add(-35*time.Minute)` $DIR/core/services/functions/orm_test.go: `.TimeoutExpiredResults(ctx, now.Add(-15*time.Minute), 10)` $DIR/core/services/functions/orm_test.go: `.Add(-15*time.Minute)` $DIR/core/services/functions/orm_test.go: `.TimeoutExpiredResults(ctx, now.Add(-15*time.Minute), 10)` $DIR/core/services/functions/orm_test.go: `.Add(-15*time.Minute)` $DIR/core/services/functions/orm_test.go: `.FindById(ctx, ids[i])` $DIR/core/services/functions/orm_test.go: `.Context(t)` $DIR/core/services/functions/orm_test.go: `.Now()` $DIR/core/services/functions/orm_test.go: `.Add(time.Duration(offset)*time.Minute)` $DIR/core/services/functions/orm_test.go: `.Duration(offset)` $DIR/core/services/functions/orm_test.go: `.PruneOldestRequests(ctx, 6, 3)` $DIR/core/services/functions/orm_test.go: `.PruneOldestRequests(ctx, 1, 2)` $DIR/core/services/functions/orm_test.go: `.PruneOldestRequests(ctx, 1, 20)` $DIR/core/services/functions/orm_test.go: `.PruneOldestRequests(ctx, 1, 20)` $DIR/core/services/functions/orm_test.go: `.FindOldestEntriesByState(ctx, functions.IN_PROGRESS, 20)` $DIR/core/services/functions/orm_test.go: `.Context(t)` $DIR/core/services/functions/orm_test.go: `.Now()` $DIR/core/services/functions/orm_test.go: `.Add(time.Duration(offset)*time.Minute)` $DIR/core/services/functions/orm_test.go: `.Duration(offset)` $DIR/core/services/functions/orm_test.go: `.PruneOldestRequests(ctx, 100, 1000)` $DIR/core/services/functions/orm_test.go: `.FindOldestEntriesByState(ctx, functions.IN_PROGRESS, 200)` $DIR/core/services/gateway/api/jsonrpccodec_test.go: `msg.Body = api.MessageBody{ MessageId: "aA-bB", Receiver: "0x1234", Method: "upload", }` $DIR/core/services/gateway/api/jsonrpccodec_test.go: `msg.Body = api.MessageBody{ MessageId: "aA-bB", Receiver: "0x1234", Method: "upload", }` $DIR/core/services/gateway/api/jsonrpccodec_test.go: `.DecodeRequest(input)` $DIR/core/services/gateway/api/jsonrpccodec_test.go: `.DecodeRequest([]byte(input))` $DIR/core/services/gateway/api/jsonrpccodec_test.go: `.EncodeRequest(&msg)` $DIR/core/services/gateway/api/jsonrpccodec_test.go: `.DecodeRequest(bytes)` $DIR/core/services/gateway/api/jsonrpccodec_test.go: `.DecodeResponse(input)` $DIR/core/services/gateway/api/jsonrpccodec_test.go: `.EncodeResponse(&msg)` $DIR/core/services/gateway/api/jsonrpccodec_test.go: `.DecodeResponse(bytes)` $DIR/core/services/gateway/api/message_test.go: `err = msg.Sign(privateKey)` $DIR/core/services/gateway/api/message_test.go: `msg.Body.MessageId = ""` $DIR/core/services/gateway/api/message_test.go: `msg.Body.MessageId = "myid\x00\x00"` $DIR/core/services/gateway/api/message_test.go: `msg.Body.MessageId = "abcd"` $DIR/core/services/gateway/api/message_test.go: `msg.Body.DonId = ""` $DIR/core/services/gateway/api/message_test.go: `msg.Body.DonId = "mydon\x00\x00"` $DIR/core/services/gateway/api/message_test.go: `msg.Body.DonId = "donA"` $DIR/core/services/gateway/api/message_test.go: `msg.Body.Method = string(bytes.Repeat([]byte("a"), api.MessageMethodMaxLen+1))` $DIR/core/services/gateway/api/message_test.go: `msg.Body.Method = ""` $DIR/core/services/gateway/api/message_test.go: `msg.Body.Method = "method\x00"` $DIR/core/services/gateway/api/message_test.go: `msg.Body.Method = "request"` $DIR/core/services/gateway/api/message_test.go: `msg.Body.Receiver = "blah"` $DIR/core/services/gateway/api/message_test.go: `msg.Body.Receiver = "0x0000000000000000000000000000000000000000"` $DIR/core/services/gateway/api/message_test.go: `msg.Signature = "0x00"` $DIR/core/services/gateway/api/message_test.go: `err = msg.Sign(privateKey)` $DIR/core/services/gateway/api/message_test.go: `msg.Body.MessageId = "dbca"` $DIR/core/services/gateway/api/message_test.go: `signer, err = msg.ExtractSigner()` $DIR/core/services/gateway/api/message_test.go: `.GenerateKey()` $DIR/core/services/gateway/api/message_test.go: `.Sign(privateKey)` $DIR/core/services/gateway/api/message_test.go: `.Repeat([]byte("a"), api.MessageMethodMaxLen+1)` $DIR/core/services/gateway/api/message_test.go: `.Validate()` $DIR/core/services/gateway/api/message_test.go: `.GenerateKey()` $DIR/core/services/gateway/api/message_test.go: `.PubkeyToAddress(privateKey.PublicKey)` $DIR/core/services/gateway/api/message_test.go: `.Bytes()` $DIR/core/services/gateway/api/message_test.go: `.Sign(privateKey)` $DIR/core/services/gateway/api/message_test.go: `.ExtractSigner()` $DIR/core/services/gateway/api/message_test.go: `.ExtractSigner()` $DIR/core/services/gateway/api/message_test.go: `.Equal(address, signer)` $DIR/core/services/gateway/common/utils_test.go: `val = "0123456789"` $DIR/core/services/gateway/common/utils_test.go: `data = common.StringToAlignedBytes(val, 10)` $DIR/core/services/gateway/common/utils_test.go: `val = "世界"` $DIR/core/services/gateway/common/utils_test.go: `data = common.StringToAlignedBytes(val, 40)` $DIR/core/services/gateway/common/utils_test.go: `signer, err = common.ExtractSigner(signature, incorrectData)` $DIR/core/services/gateway/common/utils_test.go: `_, err = common.ExtractSigner([]byte{0xaa, 0xbb}, data)` $DIR/core/services/gateway/common/utils_test.go: `.Now()` $DIR/core/services/gateway/common/utils_test.go: `.Unix()` $DIR/core/services/gateway/common/utils_test.go: `.Uint32ToBytes(val)` $DIR/core/services/gateway/common/utils_test.go: `.BytesToUint32(data)` $DIR/core/services/gateway/common/utils_test.go: `.StringToAlignedBytes(val, 40)` $DIR/core/services/gateway/common/utils_test.go: `.StringToAlignedBytes(val, 10)` $DIR/core/services/gateway/common/utils_test.go: `.StringToAlignedBytes(val, 40)` $DIR/core/services/gateway/common/utils_test.go: `.AlignedBytesToString(data)` $DIR/core/services/gateway/common/utils_test.go: `.GenerateKey()` $DIR/core/services/gateway/common/utils_test.go: `.PubkeyToAddress(privateKey.PublicKey)` $DIR/core/services/gateway/common/utils_test.go: `.Bytes()` $DIR/core/services/gateway/common/utils_test.go: `.SignData(privateKey, data)` $DIR/core/services/gateway/common/utils_test.go: `.ExtractSigner(signature, data)` $DIR/core/services/gateway/common/utils_test.go: `.ExtractSigner(signature, incorrectData)` $DIR/core/services/gateway/common/utils_test.go: `.ExtractSigner([]byte{0xaa, 0xbb}, data)` $DIR/core/services/gateway/connectionmanager_test.go: `t.Run(name, func(t *testing.T) { fullConfig := ` [nodeServerConfig] Path = "/node"` + config _, err := gateway.NewConnectionManager(parseTOMLConfig(t, fullConfig), clockwork.NewFakeClock(), logger.TestLogger(t)) require.Error(t, err) })` $DIR/core/services/gateway/connectionmanager_test.go: `_, _, err = mgr.StartHandshake(signAndPackAuthHeader(t, &authHeaderElems, nodes[0].PrivateKey))` $DIR/core/services/gateway/connectionmanager_test.go: `_, _, err = mgr.StartHandshake([]byte("ab"))` $DIR/core/services/gateway/connectionmanager_test.go: `badAuthHeaderElems.DonId = "my_don_2"` $DIR/core/services/gateway/connectionmanager_test.go: `_, _, err = mgr.StartHandshake(signAndPackAuthHeader(t, &badAuthHeaderElems, nodes[0].PrivateKey))` $DIR/core/services/gateway/connectionmanager_test.go: `badAuthHeaderElems = authHeaderElems` $DIR/core/services/gateway/connectionmanager_test.go: `badAuthHeaderElems.GatewayId = "www.example.com"` $DIR/core/services/gateway/connectionmanager_test.go: `_, _, err = mgr.StartHandshake(signAndPackAuthHeader(t, &badAuthHeaderElems, nodes[0].PrivateKey))` $DIR/core/services/gateway/connectionmanager_test.go: `badAuthHeaderElems = authHeaderElems` $DIR/core/services/gateway/connectionmanager_test.go: `_, _, err = mgr.StartHandshake(signAndPackAuthHeader(t, &badAuthHeaderElems, unrelatedNode.PrivateKey))` $DIR/core/services/gateway/connectionmanager_test.go: `badAuthHeaderElems = authHeaderElems` $DIR/core/services/gateway/connectionmanager_test.go: `copy(rawHeader[len(rawHeader)-65:], make([]byte, 65))` $DIR/core/services/gateway/connectionmanager_test.go: `_, _, err = mgr.StartHandshake(rawHeader)` $DIR/core/services/gateway/connectionmanager_test.go: `badAuthHeaderElems = authHeaderElems` $DIR/core/services/gateway/connectionmanager_test.go: `badAuthHeaderElems.Timestamp -= 10` $DIR/core/services/gateway/connectionmanager_test.go: `_, _, err = mgr.StartHandshake(signAndPackAuthHeader(t, &badAuthHeaderElems, nodes[0].PrivateKey))` $DIR/core/services/gateway/connectionmanager_test.go: `err = mgr.FinalizeHandshake("fake_attempt", response, nil)` $DIR/core/services/gateway/connectionmanager_test.go: `attemptId, challenge, err = mgr.StartHandshake(signAndPackAuthHeader(t, &authHeaderElems, nodes[0].PrivateKey))` $DIR/core/services/gateway/connectionmanager_test.go: `response, err = gc.SignData(nodes[1].PrivateKey, challenge)` $DIR/core/services/gateway/connectionmanager_test.go: `err = mgr.FinalizeHandshake(attemptId, response, nil)` $DIR/core/services/gateway/connectionmanager_test.go: `err = donMgr.SendToNode(testutils.Context(t), nodes[0].Address, nil)` $DIR/core/services/gateway/connectionmanager_test.go: `err = donMgr.SendToNode(testutils.Context(t), "some_other_node", message)` $DIR/core/services/gateway/connectionmanager_test.go: `config.ConnectionManagerConfig.HeartbeatIntervalSec = 1` $DIR/core/services/gateway/connectionmanager_test.go: `err = mgr.Start(testutils.Context(t))` $DIR/core/services/gateway/connectionmanager_test.go: `err = mgr.Close()` $DIR/core/services/gateway/connectionmanager_test.go: `.NewConnectionManager(tomlConfig, clockwork.NewFakeClock(), logger.TestLogger(t))` $DIR/core/services/gateway/connectionmanager_test.go: `.NewFakeClock()` $DIR/core/services/gateway/connectionmanager_test.go: `.TestLogger(t)` $DIR/core/services/gateway/connectionmanager_test.go: `.Run(name, func(t *testing.T) { fullConfig := ` [nodeServerConfig] Path = "/node"` + config _, err := gateway.NewConnectionManager(parseTOMLConfig(t, fullConfig), clockwork.NewFakeClock(), logger.TestLogger(t)) require.Error(t, err) })` $DIR/core/services/gateway/connectionmanager_test.go: `.NewConnectionManager(parseTOMLConfig(t, fullConfig), clockwork.NewFakeClock(), logger.TestLogger(t))` $DIR/core/services/gateway/connectionmanager_test.go: `.NewFakeClock()` $DIR/core/services/gateway/connectionmanager_test.go: `.TestLogger(t)` $DIR/core/services/gateway/connectionmanager_test.go: `.NewTestNodes(t, 1)` $DIR/core/services/gateway/connectionmanager_test.go: `.NewFakeClock()` $DIR/core/services/gateway/connectionmanager_test.go: `.NewConnectionManager(config, clock, logger.TestLogger(t))` $DIR/core/services/gateway/connectionmanager_test.go: `.TestLogger(t)` $DIR/core/services/gateway/connectionmanager_test.go: `.Now()` $DIR/core/services/gateway/connectionmanager_test.go: `.Unix()` $DIR/core/services/gateway/connectionmanager_test.go: `.StartHandshake(signAndPackAuthHeader(t, &authHeaderElems, nodes[0].PrivateKey))` $DIR/core/services/gateway/connectionmanager_test.go: `.StartHandshake([]byte("ab"))` $DIR/core/services/gateway/connectionmanager_test.go: `.StartHandshake(signAndPackAuthHeader(t, &badAuthHeaderElems, nodes[0].PrivateKey))` $DIR/core/services/gateway/connectionmanager_test.go: `.StartHandshake(signAndPackAuthHeader(t, &badAuthHeaderElems, nodes[0].PrivateKey))` $DIR/core/services/gateway/connectionmanager_test.go: `.StartHandshake(signAndPackAuthHeader(t, &badAuthHeaderElems, unrelatedNode.PrivateKey))` $DIR/core/services/gateway/connectionmanager_test.go: `.StartHandshake(rawHeader)` $DIR/core/services/gateway/connectionmanager_test.go: `.StartHandshake(signAndPackAuthHeader(t, &badAuthHeaderElems, nodes[0].PrivateKey))` $DIR/core/services/gateway/connectionmanager_test.go: `.NewFakeClock()` $DIR/core/services/gateway/connectionmanager_test.go: `.NewConnectionManager(config, clock, logger.TestLogger(t))` $DIR/core/services/gateway/connectionmanager_test.go: `.TestLogger(t)` $DIR/core/services/gateway/connectionmanager_test.go: `.Now()` $DIR/core/services/gateway/connectionmanager_test.go: `.Unix()` $DIR/core/services/gateway/connectionmanager_test.go: `.StartHandshake(signAndPackAuthHeader(t, &authHeaderElems, nodes[0].PrivateKey))` $DIR/core/services/gateway/connectionmanager_test.go: `.SignData(nodes[0].PrivateKey, challenge)` $DIR/core/services/gateway/connectionmanager_test.go: `.FinalizeHandshake("fake_attempt", response, nil)` $DIR/core/services/gateway/connectionmanager_test.go: `.StartHandshake(signAndPackAuthHeader(t, &authHeaderElems, nodes[0].PrivateKey))` $DIR/core/services/gateway/connectionmanager_test.go: `.SignData(nodes[1].PrivateKey, challenge)` $DIR/core/services/gateway/connectionmanager_test.go: `.FinalizeHandshake(attemptId, response, nil)` $DIR/core/services/gateway/connectionmanager_test.go: `.NewFakeClock()` $DIR/core/services/gateway/connectionmanager_test.go: `.NewConnectionManager(config, clock, logger.TestLogger(t))` $DIR/core/services/gateway/connectionmanager_test.go: `.TestLogger(t)` $DIR/core/services/gateway/connectionmanager_test.go: `.DONConnectionManager("my_don_1")` $DIR/core/services/gateway/connectionmanager_test.go: `.SendToNode(testutils.Context(t), nodes[0].Address, nil)` $DIR/core/services/gateway/connectionmanager_test.go: `.Context(t)` $DIR/core/services/gateway/connectionmanager_test.go: `.SendToNode(testutils.Context(t), "some_other_node", message)` $DIR/core/services/gateway/connectionmanager_test.go: `.Context(t)` $DIR/core/services/gateway/connectionmanager_test.go: `.NewFakeClock()` $DIR/core/services/gateway/connectionmanager_test.go: `.NewConnectionManager(config, clock, logger.TestLogger(t))` $DIR/core/services/gateway/connectionmanager_test.go: `.TestLogger(t)` $DIR/core/services/gateway/connectionmanager_test.go: `.Start(testutils.Context(t))` $DIR/core/services/gateway/connectionmanager_test.go: `.Context(t)` $DIR/core/services/gateway/connector/connector_test.go: `t.Run(name, func(t *testing.T) { _, err := connector.NewGatewayConnector(parseTOMLConfig(t, config), signer, handler, clock, logger.TestLogger(t)) require.Error(t, err) })` $DIR/core/services/gateway/connector/connector_test.go: `handler.On("Start", mock.Anything).Return(nil)` $DIR/core/services/gateway/connector/connector_test.go: `handler.On("Close").Return(nil)` $DIR/core/services/gateway/connector/connector_test.go: `signer.On("Sign", mock.Anything).Return(nil, errors.New("cannot sign"))` $DIR/core/services/gateway/connector/connector_test.go: `signer.On("Sign", mock.Anything).Return(nil, errors.New("cannot sign"))` $DIR/core/services/gateway/connector/connector_test.go: `_, err = connector.NewAuthHeader(url)` $DIR/core/services/gateway/connector/connector_test.go: `testSignature[1] = 0xfa` $DIR/core/services/gateway/connector/connector_test.go: `signer.On("Sign", mock.Anything).Return(testSignature, nil)` $DIR/core/services/gateway/connector/connector_test.go: `testSignature[1] = 0xfa` $DIR/core/services/gateway/connector/connector_test.go: `signer.On("Sign", mock.Anything).Return(testSignature, nil)` $DIR/core/services/gateway/connector/connector_test.go: `badChallenge.Timestamp += 100` $DIR/core/services/gateway/connector/connector_test.go: `_, err = connector.ChallengeResponse(url, network.PackChallenge(&badChallenge))` $DIR/core/services/gateway/connector/connector_test.go: `badChallenge = challenge` $DIR/core/services/gateway/connector/connector_test.go: `badChallenge.ChallengeBytes = []byte("aabb")` $DIR/core/services/gateway/connector/connector_test.go: `_, err = connector.ChallengeResponse(url, network.PackChallenge(&badChallenge))` $DIR/core/services/gateway/connector/connector_test.go: `badChallenge = challenge` $DIR/core/services/gateway/connector/connector_test.go: `badChallenge.GatewayId = "wrong"` $DIR/core/services/gateway/connector/connector_test.go: `_, err = connector.ChallengeResponse(url, network.PackChallenge(&badChallenge))` $DIR/core/services/gateway/connector/connector_test.go: `.Now()` $DIR/core/services/gateway/connector/connector_test.go: `.NewSigner(t)` $DIR/core/services/gateway/connector/connector_test.go: `.NewGatewayConnectorHandler(t)` $DIR/core/services/gateway/connector/connector_test.go: `.NewFakeClock()` $DIR/core/services/gateway/connector/connector_test.go: `.Run(name, func(t *testing.T) { _, err := connector.NewGatewayConnector(parseTOMLConfig(t, config), signer, handler, clock, logger.TestLogger(t)) require.Error(t, err) })` $DIR/core/services/gateway/connector/connector_test.go: `.NewGatewayConnector(parseTOMLConfig(t, config), signer, handler, clock, logger.TestLogger(t))` $DIR/core/services/gateway/connector/connector_test.go: `.TestLogger(t)` $DIR/core/services/gateway/connector/connector_test.go: `.Now()` $DIR/core/services/gateway/connector/connector_test.go: `.On("Start", mock.Anything)` $DIR/core/services/gateway/connector/connector_test.go: `.Return(nil)` $DIR/core/services/gateway/connector/connector_test.go: `.On("Close")` $DIR/core/services/gateway/connector/connector_test.go: `.Return(nil)` $DIR/core/services/gateway/connector/connector_test.go: `.On("Sign", mock.Anything)` $DIR/core/services/gateway/connector/connector_test.go: `.Return(nil, errors.New("cannot sign"))` $DIR/core/services/gateway/connector/connector_test.go: `.New("cannot sign")` $DIR/core/services/gateway/connector/connector_test.go: `.Now()` $DIR/core/services/gateway/connector/connector_test.go: `.On("Sign", mock.Anything)` $DIR/core/services/gateway/connector/connector_test.go: `.Return(nil, errors.New("cannot sign"))` $DIR/core/services/gateway/connector/connector_test.go: `.New("cannot sign")` $DIR/core/services/gateway/connector/connector_test.go: `.Parse("ws://localhost:8081/node")` $DIR/core/services/gateway/connector/connector_test.go: `.NewAuthHeader(url)` $DIR/core/services/gateway/connector/connector_test.go: `.Now()` $DIR/core/services/gateway/connector/connector_test.go: `.On("Sign", mock.Anything)` $DIR/core/services/gateway/connector/connector_test.go: `.Return(testSignature, nil)` $DIR/core/services/gateway/connector/connector_test.go: `.Parse("ws://localhost:8081/node")` $DIR/core/services/gateway/connector/connector_test.go: `.NewAuthHeader(url)` $DIR/core/services/gateway/connector/connector_test.go: `.Now()` $DIR/core/services/gateway/connector/connector_test.go: `.On("Sign", mock.Anything)` $DIR/core/services/gateway/connector/connector_test.go: `.Return(testSignature, nil)` $DIR/core/services/gateway/connector/connector_test.go: `.Parse("ws://localhost:8081/node")` $DIR/core/services/gateway/connector/connector_test.go: `.Unix()` $DIR/core/services/gateway/connector/connector_test.go: `.ChallengeResponse(url, network.PackChallenge(&challenge))` $DIR/core/services/gateway/connector/connector_test.go: `.PackChallenge(&challenge)` $DIR/core/services/gateway/connector/connector_test.go: `.ChallengeResponse(url, network.PackChallenge(&badChallenge))` $DIR/core/services/gateway/connector/connector_test.go: `.PackChallenge(&badChallenge)` $DIR/core/services/gateway/connector/connector_test.go: `.ChallengeResponse(url, network.PackChallenge(&badChallenge))` $DIR/core/services/gateway/connector/connector_test.go: `.PackChallenge(&badChallenge)` $DIR/core/services/gateway/connector/connector_test.go: `.ChallengeResponse(url, network.PackChallenge(&badChallenge))` $DIR/core/services/gateway/connector/connector_test.go: `.PackChallenge(&badChallenge)` $DIR/core/services/gateway/delegate_test.go: `t.Run(tc.name, func(t *testing.T) { _, err := gateway.ValidatedGatewaySpec(tc.toml) if tc.valid { require.NoError(t, err) } else { require.Error(t, err) } })` $DIR/core/services/gateway/delegate_test.go: `.Run(tc.name, func(t *testing.T) { _, err := gateway.ValidatedGatewaySpec(tc.toml) if tc.valid { require.NoError(t, err) } else { require.Error(t, err) } })` $DIR/core/services/gateway/delegate_test.go: `.ValidatedGatewaySpec(tc.toml)` $DIR/core/services/gateway/gateway_test.go: `requireJsonRPCError(t, response, "", -32700, "invalid character '{' looking for beginning of object key string")` $DIR/core/services/gateway/gateway_test.go: `requireJsonRPCError(t, response, "abc", -32700, "invalid DON ID length")` $DIR/core/services/gateway/gateway_test.go: `requireJsonRPCError(t, response, "abc", -32602, "unsupported DON ID")` $DIR/core/services/gateway/gateway_test.go: `handler.On("HandleUserMessage", mock.Anything, mock.Anything, mock.Anything).Return(nil).Run(func(args mock.Arguments) { msg := args.Get(1).(*api.Message) callbackCh := args.Get(2).(chan<- handlers.UserCallbackPayload) // echo back to sender with attached payload msg.Body.Payload = []byte(`{"result":"OK"}`) msg.Signature = "" callbackCh <- handlers.UserCallbackPayload{Msg: msg, ErrCode: api.NoError, ErrMsg: ""} })` $DIR/core/services/gateway/gateway_test.go: `msg.Body.Payload = []byte(`{"result":"OK"}`)` $DIR/core/services/gateway/gateway_test.go: `msg.Signature = ""` $DIR/core/services/gateway/gateway_test.go: `callbackCh <- handlers.UserCallbackPayload{Msg: msg, ErrCode: api.NoError, ErrMsg: ""}` $DIR/core/services/gateway/gateway_test.go: `requireJsonRPCResult(t, response, "abcd", `{"signature":"","body":{"message_id":"abcd","method":"request","don_id":"testDON","receiver":"","payload":{"result":"OK"}}}`)` $DIR/core/services/gateway/gateway_test.go: `handler.On("HandleUserMessage", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/gateway/gateway_test.go: `requireJsonRPCError(t, response, "abcd", -32000, "handler timeout")` $DIR/core/services/gateway/gateway_test.go: `handler.On("HandleUserMessage", mock.Anything, mock.Anything, mock.Anything).Return(errors.New("failure"))` $DIR/core/services/gateway/gateway_test.go: `requireJsonRPCError(t, response, "abcd", -32600, "failure")` $DIR/core/services/gateway/gateway_test.go: `.TestLogger(t)` $DIR/core/services/gateway/gateway_test.go: `.NewGatewayFromConfig(parseTOMLConfig(t, tomlConfig), gateway.NewHandlerFactory(nil, nil, lggr), lggr)` $DIR/core/services/gateway/gateway_test.go: `.NewHandlerFactory(nil, nil, lggr)` $DIR/core/services/gateway/gateway_test.go: `.TestLogger(t)` $DIR/core/services/gateway/gateway_test.go: `.NewGatewayFromConfig(parseTOMLConfig(t, tomlConfig), gateway.NewHandlerFactory(nil, nil, lggr), lggr)` $DIR/core/services/gateway/gateway_test.go: `.NewHandlerFactory(nil, nil, lggr)` $DIR/core/services/gateway/gateway_test.go: `.TestLogger(t)` $DIR/core/services/gateway/gateway_test.go: `.NewGatewayFromConfig(parseTOMLConfig(t, tomlConfig), gateway.NewHandlerFactory(nil, nil, lggr), lggr)` $DIR/core/services/gateway/gateway_test.go: `.NewHandlerFactory(nil, nil, lggr)` $DIR/core/services/gateway/gateway_test.go: `.TestLogger(t)` $DIR/core/services/gateway/gateway_test.go: `.NewGatewayFromConfig(parseTOMLConfig(t, tomlConfig), gateway.NewHandlerFactory(nil, nil, lggr), lggr)` $DIR/core/services/gateway/gateway_test.go: `.NewHandlerFactory(nil, nil, lggr)` $DIR/core/services/gateway/gateway_test.go: `.TestLogger(t)` $DIR/core/services/gateway/gateway_test.go: `.NewGatewayFromConfig(parseTOMLConfig(t, tomlConfig), gateway.NewHandlerFactory(nil, nil, lggr), lggr)` $DIR/core/services/gateway/gateway_test.go: `.NewHandlerFactory(nil, nil, lggr)` $DIR/core/services/gateway/gateway_test.go: `.TestLogger(t)` $DIR/core/services/gateway/gateway_test.go: `.NewGatewayFromConfig(parseTOMLConfig(t, buildConfig("")), gateway.NewHandlerFactory(nil, nil, lggr), lggr)` $DIR/core/services/gateway/gateway_test.go: `.NewHandlerFactory(nil, nil, lggr)` $DIR/core/services/gateway/gateway_test.go: `.ProcessRequest(testutils.Context(t), []byte("{{}"))` $DIR/core/services/gateway/gateway_test.go: `.Context(t)` $DIR/core/services/gateway/gateway_test.go: `.ProcessRequest(testutils.Context(t), req)` $DIR/core/services/gateway/gateway_test.go: `.Context(t)` $DIR/core/services/gateway/gateway_test.go: `.ProcessRequest(testutils.Context(t), req)` $DIR/core/services/gateway/gateway_test.go: `.Context(t)` $DIR/core/services/gateway/gateway_test.go: `.On("HandleUserMessage", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/gateway/gateway_test.go: `.Return(nil)` $DIR/core/services/gateway/gateway_test.go: `.Run(func(args mock.Arguments) { msg := args.Get(1).(*api.Message) callbackCh := args.Get(2).(chan<- handlers.UserCallbackPayload) // echo back to sender with attached payload msg.Body.Payload = []byte(`{"result":"OK"}`) msg.Signature = "" callbackCh <- handlers.UserCallbackPayload{Msg: msg, ErrCode: api.NoError, ErrMsg: ""} })` $DIR/core/services/gateway/gateway_test.go: `.Get(1)` $DIR/core/services/gateway/gateway_test.go: `.Get(2)` $DIR/core/services/gateway/gateway_test.go: `.ProcessRequest(testutils.Context(t), req)` $DIR/core/services/gateway/gateway_test.go: `.Context(t)` $DIR/core/services/gateway/gateway_test.go: `.On("HandleUserMessage", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/gateway/gateway_test.go: `.Return(nil)` $DIR/core/services/gateway/gateway_test.go: `.WithTimeout(testutils.Context(t), time.Millisecond*10)` $DIR/core/services/gateway/gateway_test.go: `.Context(t)` $DIR/core/services/gateway/gateway_test.go: `.ProcessRequest(timeoutCtx, req)` $DIR/core/services/gateway/gateway_test.go: `.On("HandleUserMessage", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/gateway/gateway_test.go: `.Return(errors.New("failure"))` $DIR/core/services/gateway/gateway_test.go: `.New("failure")` $DIR/core/services/gateway/gateway_test.go: `.ProcessRequest(testutils.Context(t), req)` $DIR/core/services/gateway/gateway_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/common/ratelimiter_test.go: `.NewRateLimiter(config)` $DIR/core/services/gateway/handlers/common/ratelimiter_test.go: `.Allow("user3")` $DIR/core/services/gateway/handlers/common/requestcache_test.go: `chans[i] = make(chan handlers.UserCallbackPayload)` $DIR/core/services/gateway/handlers/common/requestcache_test.go: `reqs[i] = &api.Message{Body: api.MessageBody{MessageId: "abcd", Sender: fmt.Sprintf("sender_%d", i)}}` $DIR/core/services/gateway/handlers/common/requestcache_test.go: `resp.Body.Receiver = reqs[i].Body.Sender` $DIR/core/services/gateway/handlers/common/requestcache_test.go: `time.Sleep(time.Duration(n) * time.Millisecond)` $DIR/core/services/gateway/handlers/common/requestcache_test.go: `req.Body.MessageId = "bb"` $DIR/core/services/gateway/handlers/common/requestcache_test.go: `req.Body.MessageId = "cc"` $DIR/core/services/gateway/handlers/common/requestcache_test.go: `.NewRequestCache[requestState](time.Hour, 1000)` $DIR/core/services/gateway/handlers/common/requestcache_test.go: `.NewRequestCache[requestState](time.Hour, 1000)` $DIR/core/services/gateway/handlers/common/requestcache_test.go: `.Sprintf("sender_%d", i)` $DIR/core/services/gateway/handlers/common/requestcache_test.go: `.Intn(maxDelayMillis)` $DIR/core/services/gateway/handlers/common/requestcache_test.go: `.Sleep(time.Duration(n) * time.Millisecond)` $DIR/core/services/gateway/handlers/common/requestcache_test.go: `.Duration(n)` $DIR/core/services/gateway/handlers/common/requestcache_test.go: `.NewRequestCache[requestState](time.Millisecond*10, 1000)` $DIR/core/services/gateway/handlers/common/requestcache_test.go: `.NewRequestCache[requestState](time.Hour, 2)` $DIR/core/services/gateway/handlers/common/requestcache_test.go: `.NewRequest(req, callbackCh, initialState)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `t.Run("OK-simple_update_in_batches", func(t *testing.T) { ctx := context.Background() config := OnchainAllowlistConfig{ ContractAddress: testutils.NewAddress(), ContractVersion: 1, BlockConfirmations: 1, UpdateFrequencySec: 2, UpdateTimeoutSec: 1, StoredAllowlistBatchSize: 2, OnchainAllowlistBatchSize: 10, FetchingDelayInRangeSec: 1, } // allowlistSize defines how big the mocked allowlist will be allowlistSize := 53 // allowlist represents the actual allowlist the tos contract will return allowlist := make([]common.Address, 0, allowlistSize) // expectedAllowlist will be used to compare the actual status with what we actually want expectedAllowlist := make(map[common.Address]struct{}, 0) // we load both the expectedAllowlist and the allowlist the contract will return with some new addresses for i := 0; i < allowlistSize; i++ { addr := testutils.NewAddress() allowlist = append(allowlist, addr) expectedAllowlist[addr] = struct{}{} } tosContract := NewTosContractMock(allowlist) // with the orm mock we can validate the actual order in which the allowlist is fetched giving priority to newest addresses orm := amocks.NewORM(t) firstCall := orm.On("CreateAllowedSenders", context.Background(), allowlist[43:53]).Times(1).Return(nil) secondCall := orm.On("CreateAllowedSenders", context.Background(), allowlist[33:43]).Times(1).Return(nil).NotBefore(firstCall) thirdCall := orm.On("CreateAllowedSenders", context.Background(), allowlist[23:33]).Times(1).Return(nil).NotBefore(secondCall) forthCall := orm.On("CreateAllowedSenders", context.Background(), allowlist[13:23]).Times(1).Return(nil).NotBefore(thirdCall) fifthCall := orm.On("CreateAllowedSenders", context.Background(), allowlist[3:13]).Times(1).Return(nil).NotBefore(forthCall) orm.On("CreateAllowedSenders", context.Background(), allowlist[0:3]).Times(1).Return(nil).NotBefore(fifthCall) onchainAllowlist := &onchainAllowlist{ config: config, orm: orm, blockConfirmations: big.NewInt(int64(config.BlockConfirmations)), lggr: logger.TestLogger(t).Named("OnchainAllowlist"), stopCh: make(services.StopChan), } // we set the onchain allowlist to an empty state before updating it in batches emptyMap := make(map[common.Address]struct{}) onchainAllowlist.allowlist.Store(&emptyMap) err := onchainAllowlist.updateAllowedSendersInBatches(ctx, tosContract, big.NewInt(0)) require.NoError(t, err) currentAllowlist := onchainAllowlist.allowlist.Load() require.Equal(t, &expectedAllowlist, currentAllowlist) })` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `allowlist = append(allowlist, addr)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `expectedAllowlist[addr] = struct{}{}` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `orm.On("CreateAllowedSenders", context.Background(), allowlist[0:3]).Times(1).Return(nil).NotBefore(fifthCall)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `onchainAllowlist.allowlist.Store(&emptyMap)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `t.Run("OK-new_address_added_while_updating_in_batches", func(t *testing.T) { ctx := context.Background() config := OnchainAllowlistConfig{ ContractAddress: testutils.NewAddress(), ContractVersion: 1, BlockConfirmations: 1, UpdateFrequencySec: 2, UpdateTimeoutSec: 1, StoredAllowlistBatchSize: 2, OnchainAllowlistBatchSize: 10, FetchingDelayInRangeSec: 1, } // allowlistSize defines how big the initial mocked allowlist will be allowlistSize := 50 // allowlist represents the actual allowlist the tos contract will return allowlist := make([]common.Address, 0) // expectedAllowlist will be used to compare the actual status with what we actually want expectedAllowlist := make(map[common.Address]struct{}, 0) // we load both the expectedAllowlist and the allowlist the contract will return with some new addresses for i := 0; i < allowlistSize; i++ { addr := testutils.NewAddress() allowlist = append(allowlist, addr) expectedAllowlist[addr] = struct{}{} } tosContract := NewTosContractMock(allowlist) // with the orm mock we can validate the actual order in which the allowlist is fetched giving priority to newest addresses orm := amocks.NewORM(t) firstCall := orm.On("CreateAllowedSenders", context.Background(), allowlist[40:50]).Times(1).Run(func(args mock.Arguments) { // after the first call we update the tosContract by adding a new address addr := testutils.NewAddress() allowlist = append(allowlist, addr) expectedAllowlist[addr] = struct{}{} *tosContract = *NewTosContractMock(allowlist) }).Return(nil) // this is the extra step that will fetch the new address we want to validate extraStepCall := orm.On("CreateAllowedSenders", context.Background(), allowlist[50:51]).Times(1).Return(nil).NotBefore(firstCall) secondCall := orm.On("CreateAllowedSenders", context.Background(), allowlist[30:40]).Times(1).Return(nil).NotBefore(extraStepCall) thirdCall := orm.On("CreateAllowedSenders", context.Background(), allowlist[20:30]).Times(1).Return(nil).NotBefore(secondCall) forthCall := orm.On("CreateAllowedSenders", context.Background(), allowlist[10:20]).Times(1).Return(nil).NotBefore(thirdCall) orm.On("CreateAllowedSenders", context.Background(), allowlist[0:10]).Times(1).Return(nil).NotBefore(forthCall) onchainAllowlist := &onchainAllowlist{ config: config, orm: orm, blockConfirmations: big.NewInt(int64(config.BlockConfirmations)), lggr: logger.TestLogger(t).Named("OnchainAllowlist"), stopCh: make(services.StopChan), } // we set the onchain allowlist to an empty state before updating it in batches emptyMap := make(map[common.Address]struct{}) onchainAllowlist.allowlist.Store(&emptyMap) err := onchainAllowlist.updateAllowedSendersInBatches(ctx, tosContract, big.NewInt(0)) require.NoError(t, err) currentAllowlist := onchainAllowlist.allowlist.Load() require.Equal(t, &expectedAllowlist, currentAllowlist) })` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `allowlist = append(allowlist, addr)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `expectedAllowlist[addr] = struct{}{}` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `allowlist = append(allowlist, addr)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `expectedAllowlist[addr] = struct{}{}` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `*tosContract = *NewTosContractMock(allowlist)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `orm.On("CreateAllowedSenders", context.Background(), allowlist[0:10]).Times(1).Return(nil).NotBefore(forthCall)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `onchainAllowlist.allowlist.Store(&emptyMap)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `allowlist = append(allowlist, addr)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `expectedAllowlist[addr] = struct{}{}` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `orm.On("CreateAllowedSenders", context.Background(), allowlist[0:50]).Times(1).Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `onchainAllowlist.allowlist.Store(&emptyMap)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Run("OK-simple_update_in_batches", func(t *testing.T) { ctx := context.Background() config := OnchainAllowlistConfig{ ContractAddress: testutils.NewAddress(), ContractVersion: 1, BlockConfirmations: 1, UpdateFrequencySec: 2, UpdateTimeoutSec: 1, StoredAllowlistBatchSize: 2, OnchainAllowlistBatchSize: 10, FetchingDelayInRangeSec: 1, } // allowlistSize defines how big the mocked allowlist will be allowlistSize := 53 // allowlist represents the actual allowlist the tos contract will return allowlist := make([]common.Address, 0, allowlistSize) // expectedAllowlist will be used to compare the actual status with what we actually want expectedAllowlist := make(map[common.Address]struct{}, 0) // we load both the expectedAllowlist and the allowlist the contract will return with some new addresses for i := 0; i < allowlistSize; i++ { addr := testutils.NewAddress() allowlist = append(allowlist, addr) expectedAllowlist[addr] = struct{}{} } tosContract := NewTosContractMock(allowlist) // with the orm mock we can validate the actual order in which the allowlist is fetched giving priority to newest addresses orm := amocks.NewORM(t) firstCall := orm.On("CreateAllowedSenders", context.Background(), allowlist[43:53]).Times(1).Return(nil) secondCall := orm.On("CreateAllowedSenders", context.Background(), allowlist[33:43]).Times(1).Return(nil).NotBefore(firstCall) thirdCall := orm.On("CreateAllowedSenders", context.Background(), allowlist[23:33]).Times(1).Return(nil).NotBefore(secondCall) forthCall := orm.On("CreateAllowedSenders", context.Background(), allowlist[13:23]).Times(1).Return(nil).NotBefore(thirdCall) fifthCall := orm.On("CreateAllowedSenders", context.Background(), allowlist[3:13]).Times(1).Return(nil).NotBefore(forthCall) orm.On("CreateAllowedSenders", context.Background(), allowlist[0:3]).Times(1).Return(nil).NotBefore(fifthCall) onchainAllowlist := &onchainAllowlist{ config: config, orm: orm, blockConfirmations: big.NewInt(int64(config.BlockConfirmations)), lggr: logger.TestLogger(t).Named("OnchainAllowlist"), stopCh: make(services.StopChan), } // we set the onchain allowlist to an empty state before updating it in batches emptyMap := make(map[common.Address]struct{}) onchainAllowlist.allowlist.Store(&emptyMap) err := onchainAllowlist.updateAllowedSendersInBatches(ctx, tosContract, big.NewInt(0)) require.NoError(t, err) currentAllowlist := onchainAllowlist.allowlist.Load() require.Equal(t, &expectedAllowlist, currentAllowlist) })` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Background()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.NewORM(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.On("CreateAllowedSenders", context.Background(), allowlist[43:53])` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Background()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Times(1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.On("CreateAllowedSenders", context.Background(), allowlist[33:43])` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Background()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Times(1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.NotBefore(firstCall)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.On("CreateAllowedSenders", context.Background(), allowlist[23:33])` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Background()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Times(1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.NotBefore(secondCall)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.On("CreateAllowedSenders", context.Background(), allowlist[13:23])` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Background()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Times(1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.NotBefore(thirdCall)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.On("CreateAllowedSenders", context.Background(), allowlist[3:13])` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Background()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Times(1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.NotBefore(forthCall)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.On("CreateAllowedSenders", context.Background(), allowlist[0:3])` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Background()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Times(1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.NotBefore(fifthCall)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.NewInt(int64(config.BlockConfirmations))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.TestLogger(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Named("OnchainAllowlist")` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.allowlist.Store(&emptyMap)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.updateAllowedSendersInBatches(ctx, tosContract, big.NewInt(0))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.NewInt(0)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.allowlist.Load()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Run("OK-new_address_added_while_updating_in_batches", func(t *testing.T) { ctx := context.Background() config := OnchainAllowlistConfig{ ContractAddress: testutils.NewAddress(), ContractVersion: 1, BlockConfirmations: 1, UpdateFrequencySec: 2, UpdateTimeoutSec: 1, StoredAllowlistBatchSize: 2, OnchainAllowlistBatchSize: 10, FetchingDelayInRangeSec: 1, } // allowlistSize defines how big the initial mocked allowlist will be allowlistSize := 50 // allowlist represents the actual allowlist the tos contract will return allowlist := make([]common.Address, 0) // expectedAllowlist will be used to compare the actual status with what we actually want expectedAllowlist := make(map[common.Address]struct{}, 0) // we load both the expectedAllowlist and the allowlist the contract will return with some new addresses for i := 0; i < allowlistSize; i++ { addr := testutils.NewAddress() allowlist = append(allowlist, addr) expectedAllowlist[addr] = struct{}{} } tosContract := NewTosContractMock(allowlist) // with the orm mock we can validate the actual order in which the allowlist is fetched giving priority to newest addresses orm := amocks.NewORM(t) firstCall := orm.On("CreateAllowedSenders", context.Background(), allowlist[40:50]).Times(1).Run(func(args mock.Arguments) { // after the first call we update the tosContract by adding a new address addr := testutils.NewAddress() allowlist = append(allowlist, addr) expectedAllowlist[addr] = struct{}{} *tosContract = *NewTosContractMock(allowlist) }).Return(nil) // this is the extra step that will fetch the new address we want to validate extraStepCall := orm.On("CreateAllowedSenders", context.Background(), allowlist[50:51]).Times(1).Return(nil).NotBefore(firstCall) secondCall := orm.On("CreateAllowedSenders", context.Background(), allowlist[30:40]).Times(1).Return(nil).NotBefore(extraStepCall) thirdCall := orm.On("CreateAllowedSenders", context.Background(), allowlist[20:30]).Times(1).Return(nil).NotBefore(secondCall) forthCall := orm.On("CreateAllowedSenders", context.Background(), allowlist[10:20]).Times(1).Return(nil).NotBefore(thirdCall) orm.On("CreateAllowedSenders", context.Background(), allowlist[0:10]).Times(1).Return(nil).NotBefore(forthCall) onchainAllowlist := &onchainAllowlist{ config: config, orm: orm, blockConfirmations: big.NewInt(int64(config.BlockConfirmations)), lggr: logger.TestLogger(t).Named("OnchainAllowlist"), stopCh: make(services.StopChan), } // we set the onchain allowlist to an empty state before updating it in batches emptyMap := make(map[common.Address]struct{}) onchainAllowlist.allowlist.Store(&emptyMap) err := onchainAllowlist.updateAllowedSendersInBatches(ctx, tosContract, big.NewInt(0)) require.NoError(t, err) currentAllowlist := onchainAllowlist.allowlist.Load() require.Equal(t, &expectedAllowlist, currentAllowlist) })` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Background()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.NewORM(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.On("CreateAllowedSenders", context.Background(), allowlist[40:50])` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Background()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Times(1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Run(func(args mock.Arguments) { // after the first call we update the tosContract by adding a new address addr := testutils.NewAddress() allowlist = append(allowlist, addr) expectedAllowlist[addr] = struct{}{} *tosContract = *NewTosContractMock(allowlist) })` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.On("CreateAllowedSenders", context.Background(), allowlist[50:51])` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Background()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Times(1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.NotBefore(firstCall)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.On("CreateAllowedSenders", context.Background(), allowlist[30:40])` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Background()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Times(1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.NotBefore(extraStepCall)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.On("CreateAllowedSenders", context.Background(), allowlist[20:30])` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Background()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Times(1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.NotBefore(secondCall)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.On("CreateAllowedSenders", context.Background(), allowlist[10:20])` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Background()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Times(1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.NotBefore(thirdCall)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.On("CreateAllowedSenders", context.Background(), allowlist[0:10])` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Background()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Times(1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.NotBefore(forthCall)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.NewInt(int64(config.BlockConfirmations))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.TestLogger(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Named("OnchainAllowlist")` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.allowlist.Store(&emptyMap)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.updateAllowedSendersInBatches(ctx, tosContract, big.NewInt(0))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.NewInt(0)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.allowlist.Load()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Background()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.NewORM(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.On("CreateAllowedSenders", context.Background(), allowlist[0:50])` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Background()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Times(1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.NewInt(int64(config.BlockConfirmations))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.TestLogger(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.Named("OnchainAllowlist")` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.allowlist.Store(&emptyMap)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.updateAllowedSendersInBatches(ctx, tosContract, big.NewInt(0))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.NewInt(0)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_internal_test.go: `.allowlist.Load()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `t.Run("OK-with_ToS_V1.0.0", func(t *testing.T) { client := mocks.NewClient(t) client.On("LatestBlockHeight", mock.Anything).Return(big.NewInt(42), nil) addr := common.HexToAddress("0x0000000000000000000000000000000000000020") typeAndVersionResponse, err := encodeTypeAndVersionResponse(ToSContractV100) require.NoError(t, err) client.On("CallContract", mock.Anything, ethereum.CallMsg{ // typeAndVersion To: &addr, Data: hexutil.MustDecode("0x181f5a77"), }, mock.Anything).Return(typeAndVersionResponse, nil) client.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(sampleEncodedAllowlist(t), nil) config := allowlist.OnchainAllowlistConfig{ ContractVersion: 1, ContractAddress: common.Address{}, BlockConfirmations: 1, } orm := amocks.NewORM(t) orm.On("PurgeAllowedSenders", mock.Anything).Times(1).Return(nil) orm.On("CreateAllowedSenders", mock.Anything, []common.Address{common.HexToAddress(addr1), common.HexToAddress(addr2)}).Times(1).Return(nil) allowlist, err := allowlist.NewOnchainAllowlist(client, config, orm, logger.TestLogger(t)) require.NoError(t, err) err = allowlist.Start(testutils.Context(t)) require.NoError(t, err) t.Cleanup(func() { assert.NoError(t, allowlist.Close()) }) require.NoError(t, allowlist.UpdateFromContract(testutils.Context(t))) require.False(t, allowlist.Allow(common.Address{})) require.True(t, allowlist.Allow(common.HexToAddress(addr1))) require.True(t, allowlist.Allow(common.HexToAddress(addr2))) require.False(t, allowlist.Allow(common.HexToAddress(addr3))) })` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `client.On("LatestBlockHeight", mock.Anything).Return(big.NewInt(42), nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `client.On("CallContract", mock.Anything, ethereum.CallMsg{ // typeAndVersion To: &addr, Data: hexutil.MustDecode("0x181f5a77"), }, mock.Anything).Return(typeAndVersionResponse, nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `client.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(sampleEncodedAllowlist(t), nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `orm.On("PurgeAllowedSenders", mock.Anything).Times(1).Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `orm.On("CreateAllowedSenders", mock.Anything, []common.Address{common.HexToAddress(addr1), common.HexToAddress(addr2)}).Times(1).Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `err = allowlist.Start(testutils.Context(t))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `t.Cleanup(func() { assert.NoError(t, allowlist.Close()) })` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `client.On("LatestBlockHeight", mock.Anything).Return(big.NewInt(42), nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `client.On("CallContract", mock.Anything, ethereum.CallMsg{ // typeAndVersion To: &addr, Data: hexutil.MustDecode("0x181f5a77"), }, mock.Anything).Return(typeAndVersionResponse, nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `client.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(sampleEncodedAllowlist(t), nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `orm.On("DeleteAllowedSenders", mock.Anything, []common.Address{common.HexToAddress(addr1), common.HexToAddress(addr2)}).Times(1).Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `orm.On("CreateAllowedSenders", mock.Anything, []common.Address{common.HexToAddress(addr1), common.HexToAddress(addr2)}).Times(1).Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `err = allowlist.Start(testutils.Context(t))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `t.Cleanup(func() { assert.NoError(t, allowlist.Close()) })` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `t.Run("OK-with_ToS_V1.0.0", func(t *testing.T) { ctx, cancel := context.WithCancel(testutils.Context(t)) client := mocks.NewClient(t) client.On("LatestBlockHeight", mock.Anything).Return(big.NewInt(42), nil) addr := common.HexToAddress("0x0000000000000000000000000000000000000020") typeAndVersionResponse, err := encodeTypeAndVersionResponse(ToSContractV100) require.NoError(t, err) client.On("CallContract", mock.Anything, ethereum.CallMsg{ // typeAndVersion To: &addr, Data: hexutil.MustDecode("0x181f5a77"), }, mock.Anything).Return(typeAndVersionResponse, nil) client.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { cancel() }).Return(sampleEncodedAllowlist(t), nil) config := allowlist.OnchainAllowlistConfig{ ContractAddress: common.Address{}, ContractVersion: 1, BlockConfirmations: 1, UpdateFrequencySec: 2, UpdateTimeoutSec: 1, } orm := amocks.NewORM(t) orm.On("PurgeAllowedSenders", mock.Anything).Times(1).Return(nil) orm.On("GetAllowedSenders", mock.Anything, uint(0), uint(1000)).Return([]common.Address{}, nil) orm.On("CreateAllowedSenders", mock.Anything, []common.Address{common.HexToAddress(addr1), common.HexToAddress(addr2)}).Times(1).Return(nil) allowlist, err := allowlist.NewOnchainAllowlist(client, config, orm, logger.TestLogger(t)) require.NoError(t, err) err = allowlist.Start(ctx) require.NoError(t, err) t.Cleanup(func() { assert.NoError(t, allowlist.Close()) }) gomega.NewGomegaWithT(t).Eventually(func() bool { return allowlist.Allow(common.HexToAddress(addr1)) && !allowlist.Allow(common.HexToAddress(addr3)) }, testutils.WaitTimeout(t), time.Second).Should(gomega.BeTrue()) })` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `client.On("LatestBlockHeight", mock.Anything).Return(big.NewInt(42), nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `client.On("CallContract", mock.Anything, ethereum.CallMsg{ // typeAndVersion To: &addr, Data: hexutil.MustDecode("0x181f5a77"), }, mock.Anything).Return(typeAndVersionResponse, nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `client.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { cancel() }).Return(sampleEncodedAllowlist(t), nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `cancel()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `orm.On("PurgeAllowedSenders", mock.Anything).Times(1).Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `orm.On("GetAllowedSenders", mock.Anything, uint(0), uint(1000)).Return([]common.Address{}, nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `orm.On("CreateAllowedSenders", mock.Anything, []common.Address{common.HexToAddress(addr1), common.HexToAddress(addr2)}).Times(1).Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `err = allowlist.Start(ctx)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `t.Cleanup(func() { assert.NoError(t, allowlist.Close()) })` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `gomega.NewGomegaWithT(t).Eventually(func() bool { return allowlist.Allow(common.HexToAddress(addr1)) && !allowlist.Allow(common.HexToAddress(addr3)) }, testutils.WaitTimeout(t), time.Second).Should(gomega.BeTrue())` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `client.On("LatestBlockHeight", mock.Anything).Return(big.NewInt(42), nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `client.On("CallContract", mock.Anything, ethereum.CallMsg{ // typeAndVersion To: &addr, Data: hexutil.MustDecode("0x181f5a77"), }, mock.Anything).Return(typeAndVersionResponse, nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `client.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { cancel() }).Return(sampleEncodedAllowlist(t), nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `cancel()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `orm.On("DeleteAllowedSenders", mock.Anything, []common.Address{common.HexToAddress(addr1), common.HexToAddress(addr2)}).Times(1).Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `orm.On("GetAllowedSenders", mock.Anything, uint(0), uint(1000)).Return([]common.Address{}, nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `orm.On("CreateAllowedSenders", mock.Anything, []common.Address{common.HexToAddress(addr1), common.HexToAddress(addr2)}).Times(1).Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `err = allowlist.Start(ctx)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `t.Cleanup(func() { assert.NoError(t, allowlist.Close()) })` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `gomega.NewGomegaWithT(t).Eventually(func() bool { return allowlist.Allow(common.HexToAddress(addr1)) && !allowlist.Allow(common.HexToAddress(addr3)) }, testutils.WaitTimeout(t), time.Second).Should(gomega.BeTrue())` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `t.Run("OK-fetch_complete_list_of_allowed_senders", func(t *testing.T) { ctx, cancel := context.WithCancel(testutils.Context(t)) client := mocks.NewClient(t) client.On("LatestBlockHeight", mock.Anything).Return(big.NewInt(42), nil) addr := common.HexToAddress("0x0000000000000000000000000000000000000020") typeAndVersionResponse, err := encodeTypeAndVersionResponse(ToSContractV100) require.NoError(t, err) client.On("CallContract", mock.Anything, ethereum.CallMsg{ // typeAndVersion To: &addr, Data: hexutil.MustDecode("0x181f5a77"), }, mock.Anything).Return(typeAndVersionResponse, nil) client.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { cancel() }).Return(sampleEncodedAllowlist(t), nil) config := allowlist.OnchainAllowlistConfig{ ContractAddress: common.HexToAddress(addr3), ContractVersion: 1, BlockConfirmations: 1, UpdateFrequencySec: 2, UpdateTimeoutSec: 1, StoredAllowlistBatchSize: 2, OnchainAllowlistBatchSize: 16, FetchingDelayInRangeSec: 0, } orm := amocks.NewORM(t) orm.On("PurgeAllowedSenders", mock.Anything).Times(1).Return(nil) orm.On("CreateAllowedSenders", mock.Anything, []common.Address{common.HexToAddress(addr1), common.HexToAddress(addr2)}).Times(1).Return(nil) allowlist, err := allowlist.NewOnchainAllowlist(client, config, orm, logger.TestLogger(t)) require.NoError(t, err) err = allowlist.UpdateFromContract(ctx) require.NoError(t, err) gomega.NewGomegaWithT(t).Eventually(func() bool { return allowlist.Allow(common.HexToAddress(addr1)) && !allowlist.Allow(common.HexToAddress(addr3)) }, testutils.WaitTimeout(t), time.Second).Should(gomega.BeTrue()) })` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `client.On("LatestBlockHeight", mock.Anything).Return(big.NewInt(42), nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `client.On("CallContract", mock.Anything, ethereum.CallMsg{ // typeAndVersion To: &addr, Data: hexutil.MustDecode("0x181f5a77"), }, mock.Anything).Return(typeAndVersionResponse, nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `client.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { cancel() }).Return(sampleEncodedAllowlist(t), nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `cancel()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `orm.On("PurgeAllowedSenders", mock.Anything).Times(1).Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `orm.On("CreateAllowedSenders", mock.Anything, []common.Address{common.HexToAddress(addr1), common.HexToAddress(addr2)}).Times(1).Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `err = allowlist.UpdateFromContract(ctx)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `gomega.NewGomegaWithT(t).Eventually(func() bool { return allowlist.Allow(common.HexToAddress(addr1)) && !allowlist.Allow(common.HexToAddress(addr3)) }, testutils.WaitTimeout(t), time.Second).Should(gomega.BeTrue())` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `client.On("LatestBlockHeight", mock.Anything).Return(big.NewInt(42), nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `client.On("CallContract", mock.Anything, ethereum.CallMsg{ // typeAndVersion To: &addr, Data: hexutil.MustDecode("0x181f5a77"), }, mock.Anything).Return(typeAndVersionResponse, nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `client.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { cancel() }).Return(sampleEncodedAllowlist(t), nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `cancel()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `orm.On("DeleteAllowedSenders", mock.Anything, []common.Address{common.HexToAddress(addr1), common.HexToAddress(addr2)}).Times(2).Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `orm.On("CreateAllowedSenders", mock.Anything, []common.Address{common.HexToAddress(addr1), common.HexToAddress(addr2)}).Times(2).Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `err = allowlist.UpdateFromContract(ctx)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `gomega.NewGomegaWithT(t).Eventually(func() bool { return allowlist.Allow(common.HexToAddress(addr1)) && !allowlist.Allow(common.HexToAddress(addr3)) }, testutils.WaitTimeout(t), time.Second).Should(gomega.BeTrue())` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `t.Run(tc.name, func(t *testing.T) { actualResult, actualError := allowlist.ExtractContractVersion(tc.versionStr) require.Equal(t, tc.expectedResult, actualResult) if tc.expectedError != nil { require.EqualError(t, actualError, *tc.expectedError) } else { require.NoError(t, actualError) } })` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Run("OK-with_ToS_V1.0.0", func(t *testing.T) { client := mocks.NewClient(t) client.On("LatestBlockHeight", mock.Anything).Return(big.NewInt(42), nil) addr := common.HexToAddress("0x0000000000000000000000000000000000000020") typeAndVersionResponse, err := encodeTypeAndVersionResponse(ToSContractV100) require.NoError(t, err) client.On("CallContract", mock.Anything, ethereum.CallMsg{ // typeAndVersion To: &addr, Data: hexutil.MustDecode("0x181f5a77"), }, mock.Anything).Return(typeAndVersionResponse, nil) client.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(sampleEncodedAllowlist(t), nil) config := allowlist.OnchainAllowlistConfig{ ContractVersion: 1, ContractAddress: common.Address{}, BlockConfirmations: 1, } orm := amocks.NewORM(t) orm.On("PurgeAllowedSenders", mock.Anything).Times(1).Return(nil) orm.On("CreateAllowedSenders", mock.Anything, []common.Address{common.HexToAddress(addr1), common.HexToAddress(addr2)}).Times(1).Return(nil) allowlist, err := allowlist.NewOnchainAllowlist(client, config, orm, logger.TestLogger(t)) require.NoError(t, err) err = allowlist.Start(testutils.Context(t)) require.NoError(t, err) t.Cleanup(func() { assert.NoError(t, allowlist.Close()) }) require.NoError(t, allowlist.UpdateFromContract(testutils.Context(t))) require.False(t, allowlist.Allow(common.Address{})) require.True(t, allowlist.Allow(common.HexToAddress(addr1))) require.True(t, allowlist.Allow(common.HexToAddress(addr2))) require.False(t, allowlist.Allow(common.HexToAddress(addr3))) })` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewClient(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("LatestBlockHeight", mock.Anything)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(big.NewInt(42), nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewInt(42)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress("0x0000000000000000000000000000000000000020")` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("CallContract", mock.Anything, ethereum.CallMsg{ // typeAndVersion To: &addr, Data: hexutil.MustDecode("0x181f5a77"), }, mock.Anything)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.MustDecode("0x181f5a77")` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(typeAndVersionResponse, nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("CallContract", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(sampleEncodedAllowlist(t), nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewORM(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("PurgeAllowedSenders", mock.Anything)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Times(1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("CreateAllowedSenders", mock.Anything, []common.Address{common.HexToAddress(addr1), common.HexToAddress(addr2)})` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr2)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Times(1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewOnchainAllowlist(client, config, orm, logger.TestLogger(t))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.TestLogger(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Start(testutils.Context(t))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Cleanup(func() { assert.NoError(t, allowlist.Close()) })` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewClient(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("LatestBlockHeight", mock.Anything)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(big.NewInt(42), nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewInt(42)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress("0x0000000000000000000000000000000000000020")` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("CallContract", mock.Anything, ethereum.CallMsg{ // typeAndVersion To: &addr, Data: hexutil.MustDecode("0x181f5a77"), }, mock.Anything)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.MustDecode("0x181f5a77")` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(typeAndVersionResponse, nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("CallContract", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(sampleEncodedAllowlist(t), nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewORM(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("DeleteAllowedSenders", mock.Anything, []common.Address{common.HexToAddress(addr1), common.HexToAddress(addr2)})` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr2)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Times(1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("CreateAllowedSenders", mock.Anything, []common.Address{common.HexToAddress(addr1), common.HexToAddress(addr2)})` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr2)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Times(1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewOnchainAllowlist(client, config, orm, logger.TestLogger(t))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.TestLogger(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Start(testutils.Context(t))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Cleanup(func() { assert.NoError(t, allowlist.Close()) })` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewClient(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewORM(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewOnchainAllowlist(client, config, orm, logger.TestLogger(t))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.TestLogger(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Run("OK-with_ToS_V1.0.0", func(t *testing.T) { ctx, cancel := context.WithCancel(testutils.Context(t)) client := mocks.NewClient(t) client.On("LatestBlockHeight", mock.Anything).Return(big.NewInt(42), nil) addr := common.HexToAddress("0x0000000000000000000000000000000000000020") typeAndVersionResponse, err := encodeTypeAndVersionResponse(ToSContractV100) require.NoError(t, err) client.On("CallContract", mock.Anything, ethereum.CallMsg{ // typeAndVersion To: &addr, Data: hexutil.MustDecode("0x181f5a77"), }, mock.Anything).Return(typeAndVersionResponse, nil) client.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { cancel() }).Return(sampleEncodedAllowlist(t), nil) config := allowlist.OnchainAllowlistConfig{ ContractAddress: common.Address{}, ContractVersion: 1, BlockConfirmations: 1, UpdateFrequencySec: 2, UpdateTimeoutSec: 1, } orm := amocks.NewORM(t) orm.On("PurgeAllowedSenders", mock.Anything).Times(1).Return(nil) orm.On("GetAllowedSenders", mock.Anything, uint(0), uint(1000)).Return([]common.Address{}, nil) orm.On("CreateAllowedSenders", mock.Anything, []common.Address{common.HexToAddress(addr1), common.HexToAddress(addr2)}).Times(1).Return(nil) allowlist, err := allowlist.NewOnchainAllowlist(client, config, orm, logger.TestLogger(t)) require.NoError(t, err) err = allowlist.Start(ctx) require.NoError(t, err) t.Cleanup(func() { assert.NoError(t, allowlist.Close()) }) gomega.NewGomegaWithT(t).Eventually(func() bool { return allowlist.Allow(common.HexToAddress(addr1)) && !allowlist.Allow(common.HexToAddress(addr3)) }, testutils.WaitTimeout(t), time.Second).Should(gomega.BeTrue()) })` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewClient(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("LatestBlockHeight", mock.Anything)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(big.NewInt(42), nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewInt(42)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress("0x0000000000000000000000000000000000000020")` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("CallContract", mock.Anything, ethereum.CallMsg{ // typeAndVersion To: &addr, Data: hexutil.MustDecode("0x181f5a77"), }, mock.Anything)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.MustDecode("0x181f5a77")` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(typeAndVersionResponse, nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("CallContract", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Run(func(args mock.Arguments) { cancel() })` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(sampleEncodedAllowlist(t), nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewORM(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("PurgeAllowedSenders", mock.Anything)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Times(1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("GetAllowedSenders", mock.Anything, uint(0), uint(1000))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return([]common.Address{}, nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("CreateAllowedSenders", mock.Anything, []common.Address{common.HexToAddress(addr1), common.HexToAddress(addr2)})` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr2)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Times(1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewOnchainAllowlist(client, config, orm, logger.TestLogger(t))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.TestLogger(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Start(ctx)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Cleanup(func() { assert.NoError(t, allowlist.Close()) })` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewGomegaWithT(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Eventually(func() bool { return allowlist.Allow(common.HexToAddress(addr1)) && !allowlist.Allow(common.HexToAddress(addr3)) }, testutils.WaitTimeout(t), time.Second)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Allow(common.HexToAddress(addr1))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Allow(common.HexToAddress(addr3))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr3)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.WaitTimeout(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Should(gomega.BeTrue())` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.BeTrue()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewClient(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("LatestBlockHeight", mock.Anything)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(big.NewInt(42), nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewInt(42)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress("0x0000000000000000000000000000000000000020")` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("CallContract", mock.Anything, ethereum.CallMsg{ // typeAndVersion To: &addr, Data: hexutil.MustDecode("0x181f5a77"), }, mock.Anything)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.MustDecode("0x181f5a77")` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(typeAndVersionResponse, nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("CallContract", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Run(func(args mock.Arguments) { cancel() })` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(sampleEncodedAllowlist(t), nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewORM(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("DeleteAllowedSenders", mock.Anything, []common.Address{common.HexToAddress(addr1), common.HexToAddress(addr2)})` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr2)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Times(1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("GetAllowedSenders", mock.Anything, uint(0), uint(1000))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return([]common.Address{}, nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("CreateAllowedSenders", mock.Anything, []common.Address{common.HexToAddress(addr1), common.HexToAddress(addr2)})` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr2)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Times(1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewOnchainAllowlist(client, config, orm, logger.TestLogger(t))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.TestLogger(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Start(ctx)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Cleanup(func() { assert.NoError(t, allowlist.Close()) })` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewGomegaWithT(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Eventually(func() bool { return allowlist.Allow(common.HexToAddress(addr1)) && !allowlist.Allow(common.HexToAddress(addr3)) }, testutils.WaitTimeout(t), time.Second)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Allow(common.HexToAddress(addr1))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Allow(common.HexToAddress(addr3))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr3)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.WaitTimeout(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Should(gomega.BeTrue())` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.BeTrue()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Run("OK-fetch_complete_list_of_allowed_senders", func(t *testing.T) { ctx, cancel := context.WithCancel(testutils.Context(t)) client := mocks.NewClient(t) client.On("LatestBlockHeight", mock.Anything).Return(big.NewInt(42), nil) addr := common.HexToAddress("0x0000000000000000000000000000000000000020") typeAndVersionResponse, err := encodeTypeAndVersionResponse(ToSContractV100) require.NoError(t, err) client.On("CallContract", mock.Anything, ethereum.CallMsg{ // typeAndVersion To: &addr, Data: hexutil.MustDecode("0x181f5a77"), }, mock.Anything).Return(typeAndVersionResponse, nil) client.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { cancel() }).Return(sampleEncodedAllowlist(t), nil) config := allowlist.OnchainAllowlistConfig{ ContractAddress: common.HexToAddress(addr3), ContractVersion: 1, BlockConfirmations: 1, UpdateFrequencySec: 2, UpdateTimeoutSec: 1, StoredAllowlistBatchSize: 2, OnchainAllowlistBatchSize: 16, FetchingDelayInRangeSec: 0, } orm := amocks.NewORM(t) orm.On("PurgeAllowedSenders", mock.Anything).Times(1).Return(nil) orm.On("CreateAllowedSenders", mock.Anything, []common.Address{common.HexToAddress(addr1), common.HexToAddress(addr2)}).Times(1).Return(nil) allowlist, err := allowlist.NewOnchainAllowlist(client, config, orm, logger.TestLogger(t)) require.NoError(t, err) err = allowlist.UpdateFromContract(ctx) require.NoError(t, err) gomega.NewGomegaWithT(t).Eventually(func() bool { return allowlist.Allow(common.HexToAddress(addr1)) && !allowlist.Allow(common.HexToAddress(addr3)) }, testutils.WaitTimeout(t), time.Second).Should(gomega.BeTrue()) })` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewClient(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("LatestBlockHeight", mock.Anything)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(big.NewInt(42), nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewInt(42)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress("0x0000000000000000000000000000000000000020")` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("CallContract", mock.Anything, ethereum.CallMsg{ // typeAndVersion To: &addr, Data: hexutil.MustDecode("0x181f5a77"), }, mock.Anything)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.MustDecode("0x181f5a77")` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(typeAndVersionResponse, nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("CallContract", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Run(func(args mock.Arguments) { cancel() })` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(sampleEncodedAllowlist(t), nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr3)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewORM(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("PurgeAllowedSenders", mock.Anything)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Times(1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("CreateAllowedSenders", mock.Anything, []common.Address{common.HexToAddress(addr1), common.HexToAddress(addr2)})` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr2)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Times(1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewOnchainAllowlist(client, config, orm, logger.TestLogger(t))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.TestLogger(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.UpdateFromContract(ctx)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewGomegaWithT(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Eventually(func() bool { return allowlist.Allow(common.HexToAddress(addr1)) && !allowlist.Allow(common.HexToAddress(addr3)) }, testutils.WaitTimeout(t), time.Second)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Allow(common.HexToAddress(addr1))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Allow(common.HexToAddress(addr3))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr3)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.WaitTimeout(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Should(gomega.BeTrue())` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.BeTrue()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewClient(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("LatestBlockHeight", mock.Anything)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(big.NewInt(42), nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewInt(42)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress("0x0000000000000000000000000000000000000020")` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("CallContract", mock.Anything, ethereum.CallMsg{ // typeAndVersion To: &addr, Data: hexutil.MustDecode("0x181f5a77"), }, mock.Anything)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.MustDecode("0x181f5a77")` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(typeAndVersionResponse, nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("CallContract", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Run(func(args mock.Arguments) { cancel() })` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(sampleEncodedAllowlist(t), nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr3)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewORM(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("DeleteAllowedSenders", mock.Anything, []common.Address{common.HexToAddress(addr1), common.HexToAddress(addr2)})` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr2)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Times(2)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.On("CreateAllowedSenders", mock.Anything, []common.Address{common.HexToAddress(addr1), common.HexToAddress(addr2)})` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr2)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Times(2)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewOnchainAllowlist(client, config, orm, logger.TestLogger(t))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.TestLogger(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.UpdateFromContract(ctx)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.NewGomegaWithT(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Eventually(func() bool { return allowlist.Allow(common.HexToAddress(addr1)) && !allowlist.Allow(common.HexToAddress(addr3)) }, testutils.WaitTimeout(t), time.Second)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Allow(common.HexToAddress(addr1))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr1)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Allow(common.HexToAddress(addr3))` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.HexToAddress(addr3)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.WaitTimeout(t)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Should(gomega.BeTrue())` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.BeTrue()` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Sprintf("version not found in string: %s", v)` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.Run(tc.name, func(t *testing.T) { actualResult, actualError := allowlist.ExtractContractVersion(tc.versionStr) require.Equal(t, tc.expectedResult, actualResult) if tc.expectedError != nil { require.EqualError(t, actualError, *tc.expectedError) } else { require.NoError(t, actualError) } })` $DIR/core/services/gateway/handlers/functions/allowlist/allowlist_test.go: `.ExtractContractVersion(tc.versionStr)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `t.Run("fetch first page", func(t *testing.T) { ctx := testutils.Context(t) orm, err := setupORM(t) require.NoError(t, err) storedAllowedSenders := seedAllowedSenders(t, orm, 2) results, err := orm.GetAllowedSenders(ctx, 0, 1) require.NoError(t, err) require.Equal(t, 1, len(results), "incorrect results length") require.Equal(t, storedAllowedSenders[0], results[0]) })` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `t.Run("OK-create_an_allowed_sender", func(t *testing.T) { ctx := testutils.Context(t) orm, err := setupORM(t) require.NoError(t, err) expected := testutils.NewAddress() err = orm.CreateAllowedSenders(ctx, []common.Address{expected}) require.NoError(t, err) results, err := orm.GetAllowedSenders(ctx, 0, 1) require.NoError(t, err) require.Equal(t, 1, len(results), "incorrect results length") require.Equal(t, expected, results[0]) })` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `err = orm.CreateAllowedSenders(ctx, []common.Address{expected})` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `t.Run("OK-create_an_existing_allowed_sender", func(t *testing.T) { ctx := testutils.Context(t) orm, err := setupORM(t) require.NoError(t, err) expected := testutils.NewAddress() err = orm.CreateAllowedSenders(ctx, []common.Address{expected}) require.NoError(t, err) err = orm.CreateAllowedSenders(ctx, []common.Address{expected}) require.NoError(t, err) results, err := orm.GetAllowedSenders(ctx, 0, 5) require.NoError(t, err) require.Equal(t, 1, len(results), "incorrect results length") require.Equal(t, expected, results[0]) })` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `err = orm.CreateAllowedSenders(ctx, []common.Address{expected})` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `err = orm.CreateAllowedSenders(ctx, []common.Address{expected})` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `t.Run("OK-create_multiple_allowed_senders_in_one_query", func(t *testing.T) { ctx := testutils.Context(t) orm, err := setupORM(t) require.NoError(t, err) expected := []common.Address{testutils.NewAddress(), testutils.NewAddress()} err = orm.CreateAllowedSenders(ctx, expected) require.NoError(t, err) results, err := orm.GetAllowedSenders(ctx, 0, 2) require.NoError(t, err) require.Equal(t, 2, len(results), "incorrect results length") require.Equal(t, expected[0], results[0]) require.Equal(t, expected[1], results[1]) })` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `err = orm.CreateAllowedSenders(ctx, expected)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `t.Run("OK-create_multiple_allowed_senders_with_duplicates", func(t *testing.T) { ctx := testutils.Context(t) orm, err := setupORM(t) require.NoError(t, err) addr1 := testutils.NewAddress() addr2 := testutils.NewAddress() expected := []common.Address{addr1, addr2} duplicatedAddressInput := []common.Address{addr1, addr1, addr1, addr2} err = orm.CreateAllowedSenders(ctx, duplicatedAddressInput) require.NoError(t, err) results, err := orm.GetAllowedSenders(ctx, 0, 10) require.NoError(t, err) require.Equal(t, 2, len(results), "incorrect results length") require.Equal(t, expected[0], results[0]) require.Equal(t, expected[1], results[1]) })` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `err = orm.CreateAllowedSenders(ctx, duplicatedAddressInput)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `err = orm.CreateAllowedSenders(ctx, []common.Address{})` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `t.Run("OK-delete_blocked_sender_from_allowed_list", func(t *testing.T) { ctx := testutils.Context(t) orm, err := setupORM(t) require.NoError(t, err) add1 := testutils.NewAddress() add2 := testutils.NewAddress() add3 := testutils.NewAddress() err = orm.CreateAllowedSenders(ctx, []common.Address{add1, add2, add3}) require.NoError(t, err) results, err := orm.GetAllowedSenders(ctx, 0, 10) require.NoError(t, err) require.Equal(t, 3, len(results), "incorrect results length") require.Equal(t, add1, results[0]) err = orm.DeleteAllowedSenders(ctx, []common.Address{add1, add3}) require.NoError(t, err) results, err = orm.GetAllowedSenders(ctx, 0, 10) require.NoError(t, err) require.Equal(t, 1, len(results), "incorrect results length") require.Equal(t, add2, results[0]) })` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `err = orm.CreateAllowedSenders(ctx, []common.Address{add1, add2, add3})` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `err = orm.DeleteAllowedSenders(ctx, []common.Address{add1, add3})` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `results, err = orm.GetAllowedSenders(ctx, 0, 10)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `err = orm.CreateAllowedSenders(ctx, []common.Address{add1, add2})` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `err = orm.DeleteAllowedSenders(ctx, []common.Address{add3})` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `results, err = orm.GetAllowedSenders(ctx, 0, 10)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `t.Run("OK-purge_allowed_list", func(t *testing.T) { ctx := testutils.Context(t) orm, err := setupORM(t) require.NoError(t, err) add1 := testutils.NewAddress() add2 := testutils.NewAddress() add3 := testutils.NewAddress() err = orm.CreateAllowedSenders(ctx, []common.Address{add1, add2, add3}) require.NoError(t, err) results, err := orm.GetAllowedSenders(ctx, 0, 10) require.NoError(t, err) require.Equal(t, 3, len(results), "incorrect results length") require.Equal(t, add1, results[0]) err = orm.PurgeAllowedSenders(ctx) require.NoError(t, err) results, err = orm.GetAllowedSenders(ctx, 0, 10) require.NoError(t, err) require.Equal(t, 0, len(results), "incorrect results length") })` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `err = orm.CreateAllowedSenders(ctx, []common.Address{add1, add2, add3})` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `err = orm.PurgeAllowedSenders(ctx)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `results, err = orm.GetAllowedSenders(ctx, 0, 10)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `err = orm1.CreateAllowedSenders(ctx, []common.Address{add1, add2})` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `err = orm2.CreateAllowedSenders(ctx, []common.Address{add3, add4})` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `results, err = orm2.GetAllowedSenders(ctx, 0, 10)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `err = orm2.PurgeAllowedSenders(ctx)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `results, err = orm2.GetAllowedSenders(ctx, 0, 10)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `results, err = orm1.GetAllowedSenders(ctx, 0, 10)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `t.Run("OK-create_ORM", func(t *testing.T) { _, err := allowlist.NewORM(pgtest.NewSqlxDB(t), logger.TestLogger(t), testutils.NewAddress()) require.NoError(t, err) })` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `t.Run("NOK-create_ORM_with_nil_fields", func(t *testing.T) { _, err := allowlist.NewORM(nil, nil, common.Address{}) require.Error(t, err) })` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.Run("fetch first page", func(t *testing.T) { ctx := testutils.Context(t) orm, err := setupORM(t) require.NoError(t, err) storedAllowedSenders := seedAllowedSenders(t, orm, 2) results, err := orm.GetAllowedSenders(ctx, 0, 1) require.NoError(t, err) require.Equal(t, 1, len(results), "incorrect results length") require.Equal(t, storedAllowedSenders[0], results[0]) })` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.GetAllowedSenders(ctx, 0, 1)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.GetAllowedSenders(ctx, 1, 5)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.Run("OK-create_an_allowed_sender", func(t *testing.T) { ctx := testutils.Context(t) orm, err := setupORM(t) require.NoError(t, err) expected := testutils.NewAddress() err = orm.CreateAllowedSenders(ctx, []common.Address{expected}) require.NoError(t, err) results, err := orm.GetAllowedSenders(ctx, 0, 1) require.NoError(t, err) require.Equal(t, 1, len(results), "incorrect results length") require.Equal(t, expected, results[0]) })` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.CreateAllowedSenders(ctx, []common.Address{expected})` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.GetAllowedSenders(ctx, 0, 1)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.Run("OK-create_an_existing_allowed_sender", func(t *testing.T) { ctx := testutils.Context(t) orm, err := setupORM(t) require.NoError(t, err) expected := testutils.NewAddress() err = orm.CreateAllowedSenders(ctx, []common.Address{expected}) require.NoError(t, err) err = orm.CreateAllowedSenders(ctx, []common.Address{expected}) require.NoError(t, err) results, err := orm.GetAllowedSenders(ctx, 0, 5) require.NoError(t, err) require.Equal(t, 1, len(results), "incorrect results length") require.Equal(t, expected, results[0]) })` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.CreateAllowedSenders(ctx, []common.Address{expected})` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.CreateAllowedSenders(ctx, []common.Address{expected})` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.GetAllowedSenders(ctx, 0, 5)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.Run("OK-create_multiple_allowed_senders_in_one_query", func(t *testing.T) { ctx := testutils.Context(t) orm, err := setupORM(t) require.NoError(t, err) expected := []common.Address{testutils.NewAddress(), testutils.NewAddress()} err = orm.CreateAllowedSenders(ctx, expected) require.NoError(t, err) results, err := orm.GetAllowedSenders(ctx, 0, 2) require.NoError(t, err) require.Equal(t, 2, len(results), "incorrect results length") require.Equal(t, expected[0], results[0]) require.Equal(t, expected[1], results[1]) })` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.CreateAllowedSenders(ctx, expected)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.GetAllowedSenders(ctx, 0, 2)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.Run("OK-create_multiple_allowed_senders_with_duplicates", func(t *testing.T) { ctx := testutils.Context(t) orm, err := setupORM(t) require.NoError(t, err) addr1 := testutils.NewAddress() addr2 := testutils.NewAddress() expected := []common.Address{addr1, addr2} duplicatedAddressInput := []common.Address{addr1, addr1, addr1, addr2} err = orm.CreateAllowedSenders(ctx, duplicatedAddressInput) require.NoError(t, err) results, err := orm.GetAllowedSenders(ctx, 0, 10) require.NoError(t, err) require.Equal(t, 2, len(results), "incorrect results length") require.Equal(t, expected[0], results[0]) require.Equal(t, expected[1], results[1]) })` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.CreateAllowedSenders(ctx, duplicatedAddressInput)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.GetAllowedSenders(ctx, 0, 10)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.CreateAllowedSenders(ctx, []common.Address{})` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.Run("OK-delete_blocked_sender_from_allowed_list", func(t *testing.T) { ctx := testutils.Context(t) orm, err := setupORM(t) require.NoError(t, err) add1 := testutils.NewAddress() add2 := testutils.NewAddress() add3 := testutils.NewAddress() err = orm.CreateAllowedSenders(ctx, []common.Address{add1, add2, add3}) require.NoError(t, err) results, err := orm.GetAllowedSenders(ctx, 0, 10) require.NoError(t, err) require.Equal(t, 3, len(results), "incorrect results length") require.Equal(t, add1, results[0]) err = orm.DeleteAllowedSenders(ctx, []common.Address{add1, add3}) require.NoError(t, err) results, err = orm.GetAllowedSenders(ctx, 0, 10) require.NoError(t, err) require.Equal(t, 1, len(results), "incorrect results length") require.Equal(t, add2, results[0]) })` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.CreateAllowedSenders(ctx, []common.Address{add1, add2, add3})` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.GetAllowedSenders(ctx, 0, 10)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.DeleteAllowedSenders(ctx, []common.Address{add1, add3})` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.GetAllowedSenders(ctx, 0, 10)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.CreateAllowedSenders(ctx, []common.Address{add1, add2})` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.GetAllowedSenders(ctx, 0, 10)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.DeleteAllowedSenders(ctx, []common.Address{add3})` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.GetAllowedSenders(ctx, 0, 10)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.Run("OK-purge_allowed_list", func(t *testing.T) { ctx := testutils.Context(t) orm, err := setupORM(t) require.NoError(t, err) add1 := testutils.NewAddress() add2 := testutils.NewAddress() add3 := testutils.NewAddress() err = orm.CreateAllowedSenders(ctx, []common.Address{add1, add2, add3}) require.NoError(t, err) results, err := orm.GetAllowedSenders(ctx, 0, 10) require.NoError(t, err) require.Equal(t, 3, len(results), "incorrect results length") require.Equal(t, add1, results[0]) err = orm.PurgeAllowedSenders(ctx) require.NoError(t, err) results, err = orm.GetAllowedSenders(ctx, 0, 10) require.NoError(t, err) require.Equal(t, 0, len(results), "incorrect results length") })` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.CreateAllowedSenders(ctx, []common.Address{add1, add2, add3})` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.GetAllowedSenders(ctx, 0, 10)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.PurgeAllowedSenders(ctx)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.GetAllowedSenders(ctx, 0, 10)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.CreateAllowedSenders(ctx, []common.Address{add1, add2})` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.GetAllowedSenders(ctx, 0, 10)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.CreateAllowedSenders(ctx, []common.Address{add3, add4})` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.GetAllowedSenders(ctx, 0, 10)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.PurgeAllowedSenders(ctx)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.GetAllowedSenders(ctx, 0, 10)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.GetAllowedSenders(ctx, 0, 10)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.Run("OK-create_ORM", func(t *testing.T) { _, err := allowlist.NewORM(pgtest.NewSqlxDB(t), logger.TestLogger(t), testutils.NewAddress()) require.NoError(t, err) })` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.NewORM(pgtest.NewSqlxDB(t), logger.TestLogger(t), testutils.NewAddress())` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.TestLogger(t)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.Run("NOK-create_ORM_with_nil_fields", func(t *testing.T) { _, err := allowlist.NewORM(nil, nil, common.Address{}) require.Error(t, err) })` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.NewORM(nil, nil, common.Address{})` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.NewORM(pgtest.NewSqlxDB(t), logger.TestLogger(t), common.Address{})` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/gateway/handlers/functions/allowlist/orm_test.go: `.TestLogger(t)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `err = handler.HandleUserMessage(testutils.Context(t), msg, nil)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `t.Run(test.name, func(t *testing.T) { nodes, user := gc.NewTestNodes(t, 4), gc.NewTestNodes(t, 1)[0] handler, don, allowlist, subscriptions := newFunctionsHandlerForATestDON(t, nodes, time.Hour*24, user.Address) userRequestMsg := newSignedMessage(t, "1234", "secrets_set", "don_id", user.PrivateKey) callbachCh := make(chan handlers.UserCallbackPayload) done := make(chan struct{}) go func() { defer close(done) // wait on a response from Gateway to the user response := <-callbachCh require.Equal(t, api.NoError, response.ErrCode) require.Equal(t, userRequestMsg.Body.MessageId, response.Msg.Body.MessageId) var payload functions.CombinedResponse require.NoError(t, json.Unmarshal(response.Msg.Body.Payload, &payload)) require.Equal(t, test.expectedGatewayResult, payload.Success) require.Equal(t, test.expectedNodeMessageCount, len(payload.NodeResponses)) }() allowlist.On("Allow", common.HexToAddress(user.Address)).Return(true, nil) subscriptions.On("GetMaxUserBalance", common.HexToAddress(user.Address)).Return(big.NewInt(1000), nil) don.On("SendToNode", mock.Anything, mock.Anything, mock.Anything).Return(nil) require.NoError(t, handler.HandleUserMessage(testutils.Context(t), &userRequestMsg, callbachCh)) sendNodeReponses(t, handler, userRequestMsg, nodes, test.nodeResults) <-done })` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `allowlist.On("Allow", common.HexToAddress(user.Address)).Return(true, nil)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `subscriptions.On("GetMaxUserBalance", common.HexToAddress(user.Address)).Return(big.NewInt(1000), nil)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `don.On("SendToNode", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `sendNodeReponses(t, handler, userRequestMsg, nodes, test.nodeResults)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `<-done` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `t.Run(test.name, func(t *testing.T) { nodes, user := gc.NewTestNodes(t, 4), gc.NewTestNodes(t, 1)[0] handler, don, allowlist, _ := newFunctionsHandlerForATestDON(t, nodes, time.Hour*24, user.Address) userRequestMsg := newSignedMessage(t, "1234", "heartbeat", "don_id", user.PrivateKey) callbachCh := make(chan handlers.UserCallbackPayload) done := make(chan struct{}) go func() { defer close(done) // wait on a response from Gateway to the user response := <-callbachCh require.Equal(t, api.NoError, response.ErrCode) require.Equal(t, userRequestMsg.Body.MessageId, response.Msg.Body.MessageId) var payload functions.CombinedResponse require.NoError(t, json.Unmarshal(response.Msg.Body.Payload, &payload)) require.Equal(t, test.expectedGatewayResult, payload.Success) require.Equal(t, test.expectedNodeMessageCount, len(payload.NodeResponses)) }() allowlist.On("Allow", common.HexToAddress(user.Address)).Return(true, nil) don.On("SendToNode", mock.Anything, mock.Anything, mock.Anything).Return(nil) require.NoError(t, handler.HandleUserMessage(testutils.Context(t), &userRequestMsg, callbachCh)) sendNodeReponses(t, handler, userRequestMsg, nodes, test.nodeResults) <-done })` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `allowlist.On("Allow", common.HexToAddress(user.Address)).Return(true, nil)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `don.On("SendToNode", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `sendNodeReponses(t, handler, userRequestMsg, nodes, test.nodeResults)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `<-done` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `allowlist.On("Allow", common.HexToAddress(user.Address)).Return(true, nil)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `allowlist.On("Allow", common.HexToAddress(user.Address)).Return(true, nil)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `subscriptions.On("GetMaxUserBalance", common.HexToAddress(user.Address)).Return(big.NewInt(1000), nil)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `don.On("SendToNode", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.NewFunctionsHandlerFromConfig(json.RawMessage("{}"), &config.DONConfig{}, nil, nil, nil, logger.TestLogger(t))` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.RawMessage("{}")` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.TestLogger(t)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.HandleUserMessage(testutils.Context(t), msg, nil)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.NewFunctionsHandlerFromConfig(json.RawMessage("{}"), &config.DONConfig{}, nil, nil, nil, logger.TestLogger(t))` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.RawMessage("{}")` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.TestLogger(t)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.Run(test.name, func(t *testing.T) { nodes, user := gc.NewTestNodes(t, 4), gc.NewTestNodes(t, 1)[0] handler, don, allowlist, subscriptions := newFunctionsHandlerForATestDON(t, nodes, time.Hour*24, user.Address) userRequestMsg := newSignedMessage(t, "1234", "secrets_set", "don_id", user.PrivateKey) callbachCh := make(chan handlers.UserCallbackPayload) done := make(chan struct{}) go func() { defer close(done) // wait on a response from Gateway to the user response := <-callbachCh require.Equal(t, api.NoError, response.ErrCode) require.Equal(t, userRequestMsg.Body.MessageId, response.Msg.Body.MessageId) var payload functions.CombinedResponse require.NoError(t, json.Unmarshal(response.Msg.Body.Payload, &payload)) require.Equal(t, test.expectedGatewayResult, payload.Success) require.Equal(t, test.expectedNodeMessageCount, len(payload.NodeResponses)) }() allowlist.On("Allow", common.HexToAddress(user.Address)).Return(true, nil) subscriptions.On("GetMaxUserBalance", common.HexToAddress(user.Address)).Return(big.NewInt(1000), nil) don.On("SendToNode", mock.Anything, mock.Anything, mock.Anything).Return(nil) require.NoError(t, handler.HandleUserMessage(testutils.Context(t), &userRequestMsg, callbachCh)) sendNodeReponses(t, handler, userRequestMsg, nodes, test.nodeResults) <-done })` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.NewTestNodes(t, 4)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.NewTestNodes(t, 1)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.On("Allow", common.HexToAddress(user.Address))` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.HexToAddress(user.Address)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.Return(true, nil)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.On("GetMaxUserBalance", common.HexToAddress(user.Address))` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.HexToAddress(user.Address)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.Return(big.NewInt(1000), nil)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.NewInt(1000)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.On("SendToNode", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.Run(test.name, func(t *testing.T) { nodes, user := gc.NewTestNodes(t, 4), gc.NewTestNodes(t, 1)[0] handler, don, allowlist, _ := newFunctionsHandlerForATestDON(t, nodes, time.Hour*24, user.Address) userRequestMsg := newSignedMessage(t, "1234", "heartbeat", "don_id", user.PrivateKey) callbachCh := make(chan handlers.UserCallbackPayload) done := make(chan struct{}) go func() { defer close(done) // wait on a response from Gateway to the user response := <-callbachCh require.Equal(t, api.NoError, response.ErrCode) require.Equal(t, userRequestMsg.Body.MessageId, response.Msg.Body.MessageId) var payload functions.CombinedResponse require.NoError(t, json.Unmarshal(response.Msg.Body.Payload, &payload)) require.Equal(t, test.expectedGatewayResult, payload.Success) require.Equal(t, test.expectedNodeMessageCount, len(payload.NodeResponses)) }() allowlist.On("Allow", common.HexToAddress(user.Address)).Return(true, nil) don.On("SendToNode", mock.Anything, mock.Anything, mock.Anything).Return(nil) require.NoError(t, handler.HandleUserMessage(testutils.Context(t), &userRequestMsg, callbachCh)) sendNodeReponses(t, handler, userRequestMsg, nodes, test.nodeResults) <-done })` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.NewTestNodes(t, 4)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.NewTestNodes(t, 1)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.On("Allow", common.HexToAddress(user.Address))` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.HexToAddress(user.Address)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.Return(true, nil)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.On("SendToNode", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.NewTestNodes(t, 4)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.NewTestNodes(t, 1)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.On("Allow", common.HexToAddress(user.Address))` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.HexToAddress(user.Address)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.Return(true, nil)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.HandleUserMessage(testutils.Context(t), &userRequestMsg, make(chan handlers.UserCallbackPayload))` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.NewTestNodes(t, 4)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.NewTestNodes(t, 1)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.On("Allow", common.HexToAddress(user.Address))` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.HexToAddress(user.Address)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.Return(true, nil)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.On("GetMaxUserBalance", common.HexToAddress(user.Address))` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.HexToAddress(user.Address)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.Return(big.NewInt(1000), nil)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.NewInt(1000)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.On("SendToNode", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/gateway/handlers/functions/handler.functions_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `t.Run("fetch first page", func(t *testing.T) { ctx := testutils.Context(t) orm, err := setupORM(t) require.NoError(t, err) storedSubscriptions := seedSubscriptions(t, orm, 2) results, err := orm.GetSubscriptions(ctx, 0, 1) require.NoError(t, err) require.Equal(t, 1, len(results), "incorrect results length") require.Equal(t, storedSubscriptions[1], results[0]) })` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `t.Run("create a subscription", func(t *testing.T) { ctx := testutils.Context(t) orm, err := setupORM(t) require.NoError(t, err) expected := subscriptions.StoredSubscription{ SubscriptionID: uint64(1), IFunctionsSubscriptionsSubscription: functions_router.IFunctionsSubscriptionsSubscription{ Balance: big.NewInt(10), Owner: testutils.NewAddress(), BlockedBalance: big.NewInt(20), ProposedOwner: common.Address{}, Consumers: []common.Address{testutils.NewAddress()}, Flags: defaultFlags, }, } err = orm.UpsertSubscription(ctx, expected) require.NoError(t, err) results, err := orm.GetSubscriptions(ctx, 0, 1) require.NoError(t, err) require.Equal(t, 1, len(results), "incorrect results length") require.Equal(t, expected, results[0]) })` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `err = orm.UpsertSubscription(ctx, expected)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `t.Run("update a subscription", func(t *testing.T) { ctx := testutils.Context(t) orm, err := setupORM(t) require.NoError(t, err) expectedUpdated := subscriptions.StoredSubscription{ SubscriptionID: uint64(1), IFunctionsSubscriptionsSubscription: functions_router.IFunctionsSubscriptionsSubscription{ Balance: big.NewInt(10), Owner: testutils.NewAddress(), BlockedBalance: big.NewInt(20), ProposedOwner: common.Address{}, Consumers: []common.Address{}, Flags: defaultFlags, }, } err = orm.UpsertSubscription(ctx, expectedUpdated) require.NoError(t, err) expectedNotUpdated := subscriptions.StoredSubscription{ SubscriptionID: uint64(2), IFunctionsSubscriptionsSubscription: functions_router.IFunctionsSubscriptionsSubscription{ Balance: big.NewInt(10), Owner: testutils.NewAddress(), BlockedBalance: big.NewInt(20), ProposedOwner: common.Address{}, Consumers: []common.Address{}, Flags: defaultFlags, }, } err = orm.UpsertSubscription(ctx, expectedNotUpdated) require.NoError(t, err) // update the balance value expectedUpdated.Balance = big.NewInt(20) err = orm.UpsertSubscription(ctx, expectedUpdated) require.NoError(t, err) results, err := orm.GetSubscriptions(ctx, 0, 5) require.NoError(t, err) require.Equal(t, 2, len(results), "incorrect results length") require.Equal(t, expectedNotUpdated, results[1]) require.Equal(t, expectedUpdated, results[0]) })` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `err = orm.UpsertSubscription(ctx, expectedUpdated)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `err = orm.UpsertSubscription(ctx, expectedNotUpdated)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `expectedUpdated.Balance = big.NewInt(20)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `err = orm.UpsertSubscription(ctx, expectedUpdated)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `t.Run("update a deleted subscription", func(t *testing.T) { ctx := testutils.Context(t) orm, err := setupORM(t) require.NoError(t, err) subscription := subscriptions.StoredSubscription{ SubscriptionID: uint64(1), IFunctionsSubscriptionsSubscription: functions_router.IFunctionsSubscriptionsSubscription{ Balance: big.NewInt(10), Owner: testutils.NewAddress(), BlockedBalance: big.NewInt(20), ProposedOwner: common.Address{}, Consumers: []common.Address{}, Flags: defaultFlags, }, } err = orm.UpsertSubscription(ctx, subscription) require.NoError(t, err) // empty subscription subscription.IFunctionsSubscriptionsSubscription = functions_router.IFunctionsSubscriptionsSubscription{ Balance: big.NewInt(0), Owner: common.Address{}, BlockedBalance: big.NewInt(0), ProposedOwner: common.Address{}, Consumers: []common.Address{}, Flags: [32]byte{}, } err = orm.UpsertSubscription(ctx, subscription) require.NoError(t, err) results, err := orm.GetSubscriptions(ctx, 0, 5) require.NoError(t, err) require.Equal(t, 1, len(results), "incorrect results length") require.Equal(t, subscription, results[0]) })` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `err = orm.UpsertSubscription(ctx, subscription)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `subscription.IFunctionsSubscriptionsSubscription = functions_router.IFunctionsSubscriptionsSubscription{ Balance: big.NewInt(0), Owner: common.Address{}, BlockedBalance: big.NewInt(0), ProposedOwner: common.Address{}, Consumers: []common.Address{}, Flags: [32]byte{}, }` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `err = orm.UpsertSubscription(ctx, subscription)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `err = orm1.UpsertSubscription(ctx, subscription)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `subscription.Balance = assets.Ether(12).ToInt()` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `err = orm1.UpsertSubscription(ctx, subscription)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `err = orm2.UpsertSubscription(ctx, subscription)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `results, err = orm1.GetSubscriptions(ctx, 0, 10)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `results, err = orm2.GetSubscriptions(ctx, 0, 10)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `t.Run("OK-create_ORM", func(t *testing.T) { _, err := subscriptions.NewORM(pgtest.NewSqlxDB(t), logger.TestLogger(t), testutils.NewAddress()) require.NoError(t, err) })` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `t.Run("NOK-create_ORM_with_nil_fields", func(t *testing.T) { _, err := subscriptions.NewORM(nil, nil, common.Address{}) require.Error(t, err) })` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.Run("fetch first page", func(t *testing.T) { ctx := testutils.Context(t) orm, err := setupORM(t) require.NoError(t, err) storedSubscriptions := seedSubscriptions(t, orm, 2) results, err := orm.GetSubscriptions(ctx, 0, 1) require.NoError(t, err) require.Equal(t, 1, len(results), "incorrect results length") require.Equal(t, storedSubscriptions[1], results[0]) })` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.GetSubscriptions(ctx, 0, 1)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.GetSubscriptions(ctx, 1, 5)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.Run("create a subscription", func(t *testing.T) { ctx := testutils.Context(t) orm, err := setupORM(t) require.NoError(t, err) expected := subscriptions.StoredSubscription{ SubscriptionID: uint64(1), IFunctionsSubscriptionsSubscription: functions_router.IFunctionsSubscriptionsSubscription{ Balance: big.NewInt(10), Owner: testutils.NewAddress(), BlockedBalance: big.NewInt(20), ProposedOwner: common.Address{}, Consumers: []common.Address{testutils.NewAddress()}, Flags: defaultFlags, }, } err = orm.UpsertSubscription(ctx, expected) require.NoError(t, err) results, err := orm.GetSubscriptions(ctx, 0, 1) require.NoError(t, err) require.Equal(t, 1, len(results), "incorrect results length") require.Equal(t, expected, results[0]) })` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewInt(10)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewInt(20)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.UpsertSubscription(ctx, expected)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.GetSubscriptions(ctx, 0, 1)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.Run("update a subscription", func(t *testing.T) { ctx := testutils.Context(t) orm, err := setupORM(t) require.NoError(t, err) expectedUpdated := subscriptions.StoredSubscription{ SubscriptionID: uint64(1), IFunctionsSubscriptionsSubscription: functions_router.IFunctionsSubscriptionsSubscription{ Balance: big.NewInt(10), Owner: testutils.NewAddress(), BlockedBalance: big.NewInt(20), ProposedOwner: common.Address{}, Consumers: []common.Address{}, Flags: defaultFlags, }, } err = orm.UpsertSubscription(ctx, expectedUpdated) require.NoError(t, err) expectedNotUpdated := subscriptions.StoredSubscription{ SubscriptionID: uint64(2), IFunctionsSubscriptionsSubscription: functions_router.IFunctionsSubscriptionsSubscription{ Balance: big.NewInt(10), Owner: testutils.NewAddress(), BlockedBalance: big.NewInt(20), ProposedOwner: common.Address{}, Consumers: []common.Address{}, Flags: defaultFlags, }, } err = orm.UpsertSubscription(ctx, expectedNotUpdated) require.NoError(t, err) // update the balance value expectedUpdated.Balance = big.NewInt(20) err = orm.UpsertSubscription(ctx, expectedUpdated) require.NoError(t, err) results, err := orm.GetSubscriptions(ctx, 0, 5) require.NoError(t, err) require.Equal(t, 2, len(results), "incorrect results length") require.Equal(t, expectedNotUpdated, results[1]) require.Equal(t, expectedUpdated, results[0]) })` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewInt(10)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewInt(20)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.UpsertSubscription(ctx, expectedUpdated)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewInt(10)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewInt(20)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.UpsertSubscription(ctx, expectedNotUpdated)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewInt(20)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.UpsertSubscription(ctx, expectedUpdated)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.GetSubscriptions(ctx, 0, 5)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.Run("update a deleted subscription", func(t *testing.T) { ctx := testutils.Context(t) orm, err := setupORM(t) require.NoError(t, err) subscription := subscriptions.StoredSubscription{ SubscriptionID: uint64(1), IFunctionsSubscriptionsSubscription: functions_router.IFunctionsSubscriptionsSubscription{ Balance: big.NewInt(10), Owner: testutils.NewAddress(), BlockedBalance: big.NewInt(20), ProposedOwner: common.Address{}, Consumers: []common.Address{}, Flags: defaultFlags, }, } err = orm.UpsertSubscription(ctx, subscription) require.NoError(t, err) // empty subscription subscription.IFunctionsSubscriptionsSubscription = functions_router.IFunctionsSubscriptionsSubscription{ Balance: big.NewInt(0), Owner: common.Address{}, BlockedBalance: big.NewInt(0), ProposedOwner: common.Address{}, Consumers: []common.Address{}, Flags: [32]byte{}, } err = orm.UpsertSubscription(ctx, subscription) require.NoError(t, err) results, err := orm.GetSubscriptions(ctx, 0, 5) require.NoError(t, err) require.Equal(t, 1, len(results), "incorrect results length") require.Equal(t, subscription, results[0]) })` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewInt(10)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewInt(20)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.UpsertSubscription(ctx, subscription)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewInt(0)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewInt(0)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.UpsertSubscription(ctx, subscription)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.GetSubscriptions(ctx, 0, 5)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.TestLogger(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewORM(db, lggr, testutils.NewAddress())` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewORM(db, lggr, testutils.NewAddress())` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.Ether(10)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.ToInt()` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.Ether(20)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.ToInt()` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.UpsertSubscription(ctx, subscription)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.Ether(12)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.ToInt()` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.UpsertSubscription(ctx, subscription)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.GetSubscriptions(ctx, 0, 10)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.UpsertSubscription(ctx, subscription)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.GetSubscriptions(ctx, 0, 10)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.GetSubscriptions(ctx, 0, 10)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.Run("OK-create_ORM", func(t *testing.T) { _, err := subscriptions.NewORM(pgtest.NewSqlxDB(t), logger.TestLogger(t), testutils.NewAddress()) require.NoError(t, err) })` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewORM(pgtest.NewSqlxDB(t), logger.TestLogger(t), testutils.NewAddress())` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.TestLogger(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewAddress()` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.Run("NOK-create_ORM_with_nil_fields", func(t *testing.T) { _, err := subscriptions.NewORM(nil, nil, common.Address{}) require.Error(t, err) })` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewORM(nil, nil, common.Address{})` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewORM(pgtest.NewSqlxDB(t), logger.TestLogger(t), common.Address{})` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/orm_test.go: `.TestLogger(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `client.On("LatestBlockHeight", mock.Anything).Return(big.NewInt(42), nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `client.On("CallContract", mock.Anything, ethereum.CallMsg{ // getSubscriptionCount To: &common.Address{}, Data: hexutil.MustDecode("0x66419970"), }, mock.Anything).Return(getSubscriptionCount, nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `client.On("CallContract", mock.Anything, ethereum.CallMsg{ // GetSubscriptionsInRange To: &common.Address{}, Data: hexutil.MustDecode("0xec2454e500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003"), }, mock.Anything).Return(getSubscriptionsInRange, nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `orm.On("GetSubscriptions", mock.Anything, uint(0), uint(100)).Return([]subscriptions.StoredSubscription{}, nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `orm.On("UpsertSubscription", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `err = subscriptions.Start(ctx)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `t.Cleanup(func() { assert.NoError(t, subscriptions.Close()) })` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `client.On("LatestBlockHeight", mock.Anything).Return(big.NewInt(42), nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `client.On("CallContract", mock.Anything, ethereum.CallMsg{ // getSubscriptionCount To: &common.Address{}, Data: hexutil.MustDecode("0x66419970"), }, mock.Anything).Run(func(args mock.Arguments) { currentCycle.Add(1) }).Return(getSubscriptionCount, nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `currentCycle.Add(1)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `client.On("CallContract", mock.Anything, ethereum.CallMsg{ // GetSubscriptionsInRange(1,3) To: &common.Address{}, Data: hexutil.MustDecode("0xec2454e500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003"), }, mock.Anything).Return(getSubscriptionsInRange, nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `client.On("CallContract", mock.Anything, ethereum.CallMsg{ // GetSubscriptionsInRange(4,6) To: &common.Address{}, Data: hexutil.MustDecode("0xec2454e500000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006"), }, mock.Anything).Return(getSubscriptionsInRange, nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `orm.On("GetSubscriptions", mock.Anything, uint(0), uint(100)).Return([]subscriptions.StoredSubscription{}, nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `orm.On("UpsertSubscription", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `err = subscriptions.Start(ctx)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `t.Cleanup(func() { assert.NoError(t, subscriptions.Close()) })` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `client.On("LatestBlockHeight", mock.Anything).Return(big.NewInt(42), nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `client.On("CallContract", mock.Anything, ethereum.CallMsg{ // getSubscriptionCount To: &common.Address{}, Data: hexutil.MustDecode("0x66419970"), }, mock.Anything).Return(getSubscriptionCount, nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `client.On("CallContract", mock.Anything, ethereum.CallMsg{ // GetSubscriptionsInRange To: &common.Address{}, Data: hexutil.MustDecode("0xec2454e500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003"), }, mock.Anything).Return(getSubscriptionsInRange, nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `orm.On("GetSubscriptions", mock.Anything, uint(0), uint(1)).Return([]subscriptions.StoredSubscription{ { SubscriptionID: 1, IFunctionsSubscriptionsSubscription: functions_router.IFunctionsSubscriptionsSubscription{ Balance: expectedBalance, Owner: common.HexToAddress(storedUser), BlockedBalance: big.NewInt(10), }, }, }, nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `orm.On("GetSubscriptions", mock.Anything, uint(1), uint(1)).Return([]subscriptions.StoredSubscription{}, nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `orm.On("UpsertSubscription", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `err = subscriptions.Start(ctx)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `t.Cleanup(func() { assert.NoError(t, subscriptions.Close()) })` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.MustDecode("0x0000000000000000000000000000000000000000000000000000000000000003")` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.MustDecode("0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000109e6e1b12098cc8f3a1e9719a817ec53ab9b35c000000000000000000000000000000000000000000000000000034e23f515cb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f5340f0968ee8b7dfd97e3327a6139273cc2c4fa000000000000000000000000000000000000000000000001158e460913d000000000000000000000000000009ed925d8206a4f88a2f643b28b3035b315753cd60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bc14b92364c75e20000000000000000000000009ed925d8206a4f88a2f643b28b3035b315753cd60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000005439e5881a529f3ccbffc0e82d49f9db3950aefe")` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.NewClient(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.On("LatestBlockHeight", mock.Anything)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Return(big.NewInt(42), nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.NewInt(42)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.On("CallContract", mock.Anything, ethereum.CallMsg{ // getSubscriptionCount To: &common.Address{}, Data: hexutil.MustDecode("0x66419970"), }, mock.Anything)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.MustDecode("0x66419970")` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Return(getSubscriptionCount, nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.On("CallContract", mock.Anything, ethereum.CallMsg{ // GetSubscriptionsInRange To: &common.Address{}, Data: hexutil.MustDecode("0xec2454e500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003"), }, mock.Anything)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.MustDecode("0xec2454e500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003")` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Return(getSubscriptionsInRange, nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.NewORM(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.On("GetSubscriptions", mock.Anything, uint(0), uint(100))` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Return([]subscriptions.StoredSubscription{}, nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.On("UpsertSubscription", mock.Anything, mock.Anything)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.NewOnchainSubscriptions(client, config, orm, logger.TestLogger(t))` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.TestLogger(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Start(ctx)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Cleanup(func() { assert.NoError(t, subscriptions.Close()) })` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.NewGomegaWithT(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Eventually(func() bool { expectedBalance := big.NewInt(0).SetBytes(hexutil.MustDecode("0x01158e460913d00000")) balance, err1 := subscriptions.GetMaxUserBalance(common.HexToAddress(validUser)) _, err2 := subscriptions.GetMaxUserBalance(common.HexToAddress(invalidUser)) return err1 == nil && err2 != nil && balance.Cmp(expectedBalance) == 0 }, testutils.WaitTimeout(t), time.Second)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.NewInt(0)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.SetBytes(hexutil.MustDecode("0x01158e460913d00000"))` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.MustDecode("0x01158e460913d00000")` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.GetMaxUserBalance(common.HexToAddress(validUser))` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.HexToAddress(validUser)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.GetMaxUserBalance(common.HexToAddress(invalidUser))` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.HexToAddress(invalidUser)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Cmp(expectedBalance)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.WaitTimeout(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.BeTrue()` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.MustDecode("0x0000000000000000000000000000000000000000000000000000000000000006")` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.MustDecode("0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000109e6e1b12098cc8f3a1e9719a817ec53ab9b35c000000000000000000000000000000000000000000000000000034e23f515cb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f5340f0968ee8b7dfd97e3327a6139273cc2c4fa000000000000000000000000000000000000000000000001158e460913d000000000000000000000000000009ed925d8206a4f88a2f643b28b3035b315753cd60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bc14b92364c75e20000000000000000000000009ed925d8206a4f88a2f643b28b3035b315753cd60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000005439e5881a529f3ccbffc0e82d49f9db3950aefe")` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.NewClient(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.On("LatestBlockHeight", mock.Anything)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Return(big.NewInt(42), nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.NewInt(42)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.On("CallContract", mock.Anything, ethereum.CallMsg{ // getSubscriptionCount To: &common.Address{}, Data: hexutil.MustDecode("0x66419970"), }, mock.Anything)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.MustDecode("0x66419970")` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Run(func(args mock.Arguments) { currentCycle.Add(1) })` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Add(1)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Return(getSubscriptionCount, nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.On("CallContract", mock.Anything, ethereum.CallMsg{ // GetSubscriptionsInRange(1,3) To: &common.Address{}, Data: hexutil.MustDecode("0xec2454e500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003"), }, mock.Anything)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.MustDecode("0xec2454e500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003")` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Return(getSubscriptionsInRange, nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.On("CallContract", mock.Anything, ethereum.CallMsg{ // GetSubscriptionsInRange(4,6) To: &common.Address{}, Data: hexutil.MustDecode("0xec2454e500000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006"), }, mock.Anything)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.MustDecode("0xec2454e500000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006")` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Return(getSubscriptionsInRange, nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.NewORM(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.On("GetSubscriptions", mock.Anything, uint(0), uint(100))` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Return([]subscriptions.StoredSubscription{}, nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.On("UpsertSubscription", mock.Anything, mock.Anything)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.NewOnchainSubscriptions(client, config, orm, logger.TestLogger(t))` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.TestLogger(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Start(ctx)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Cleanup(func() { assert.NoError(t, subscriptions.Close()) })` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.NewGomegaWithT(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Eventually(func() bool { return currentCycle.Load() == ncycles }, testutils.WaitTimeout(t), time.Second)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Load()` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.WaitTimeout(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.BeTrue()` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.MustDecode("0x0000000000000000000000000000000000000000000000000000000000000003")` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.MustDecode("0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000109e6e1b12098cc8f3a1e9719a817ec53ab9b35c000000000000000000000000000000000000000000000000000034e23f515cb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f5340f0968ee8b7dfd97e3327a6139273cc2c4fa000000000000000000000000000000000000000000000001158e460913d000000000000000000000000000009ed925d8206a4f88a2f643b28b3035b315753cd60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bc14b92364c75e20000000000000000000000009ed925d8206a4f88a2f643b28b3035b315753cd60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000005439e5881a529f3ccbffc0e82d49f9db3950aefe")` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Context(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.NewClient(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.On("LatestBlockHeight", mock.Anything)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Return(big.NewInt(42), nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.NewInt(42)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.On("CallContract", mock.Anything, ethereum.CallMsg{ // getSubscriptionCount To: &common.Address{}, Data: hexutil.MustDecode("0x66419970"), }, mock.Anything)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.MustDecode("0x66419970")` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Return(getSubscriptionCount, nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.On("CallContract", mock.Anything, ethereum.CallMsg{ // GetSubscriptionsInRange To: &common.Address{}, Data: hexutil.MustDecode("0xec2454e500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003"), }, mock.Anything)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.MustDecode("0xec2454e500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003")` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Return(getSubscriptionsInRange, nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.NewInt(5)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.NewORM(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.On("GetSubscriptions", mock.Anything, uint(0), uint(1))` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Return([]subscriptions.StoredSubscription{ { SubscriptionID: 1, IFunctionsSubscriptionsSubscription: functions_router.IFunctionsSubscriptionsSubscription{ Balance: expectedBalance, Owner: common.HexToAddress(storedUser), BlockedBalance: big.NewInt(10), }, }, }, nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.HexToAddress(storedUser)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.NewInt(10)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.On("GetSubscriptions", mock.Anything, uint(1), uint(1))` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Return([]subscriptions.StoredSubscription{}, nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.On("UpsertSubscription", mock.Anything, mock.Anything)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Return(nil)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.NewOnchainSubscriptions(client, config, orm, logger.TestLogger(t))` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.TestLogger(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Start(ctx)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Cleanup(func() { assert.NoError(t, subscriptions.Close()) })` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.NewGomegaWithT(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.Eventually(func() bool { actualBalance, err := subscriptions.GetMaxUserBalance(common.HexToAddress(storedUser)) return err == nil && assert.Equal(t, expectedBalance, actualBalance) }, testutils.WaitTimeout(t), time.Second)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.GetMaxUserBalance(common.HexToAddress(storedUser))` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.HexToAddress(storedUser)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.WaitTimeout(t)` $DIR/core/services/gateway/handlers/functions/subscriptions/subscriptions_test.go: `.BeTrue()` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `t.Run("GetMaxUserBalance for unknown user", func(t *testing.T) { _, err := us.GetMaxUserBalance(utils.RandomAddress()) assert.Error(t, err) })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `updated = us.UpdateSubscription(3, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: user2, Balance: user2Balance1, })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `updated = us.UpdateSubscription(10, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: user2, Balance: user2Balance2, })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `balance, err = us.GetMaxUserBalance(user2)` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `t.Run("update balance", func(t *testing.T) { us := subscriptions.NewUserSubscriptions() owner := utils.RandomAddress() updated := us.UpdateSubscription(1, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: owner, Balance: big.NewInt(10), }) assert.True(t, updated) updated = us.UpdateSubscription(1, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: owner, Balance: big.NewInt(100), }) assert.True(t, updated) })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `updated = us.UpdateSubscription(1, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: owner, Balance: big.NewInt(100), })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `t.Run("updated proposed owner", func(t *testing.T) { us := subscriptions.NewUserSubscriptions() owner := utils.RandomAddress() updated := us.UpdateSubscription(1, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: owner, Balance: big.NewInt(10), }) assert.True(t, updated) updated = us.UpdateSubscription(1, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: owner, Balance: big.NewInt(10), ProposedOwner: utils.RandomAddress(), }) assert.True(t, updated) })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `updated = us.UpdateSubscription(1, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: owner, Balance: big.NewInt(10), ProposedOwner: utils.RandomAddress(), })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `t.Run("remove subscriptions", func(t *testing.T) { us := subscriptions.NewUserSubscriptions() user2 := utils.RandomAddress() user2Balance1 := big.NewInt(50) user2Balance2 := big.NewInt(70) updated := us.UpdateSubscription(3, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: user2, Balance: user2Balance1, }) assert.True(t, updated) updated = us.UpdateSubscription(10, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: user2, Balance: user2Balance2, }) assert.True(t, updated) updated = us.UpdateSubscription(3, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: utils.ZeroAddress, }) assert.True(t, updated) updated = us.UpdateSubscription(10, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: utils.ZeroAddress, }) assert.True(t, updated) _, err := us.GetMaxUserBalance(user2) assert.Error(t, err) })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `updated = us.UpdateSubscription(10, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: user2, Balance: user2Balance2, })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `updated = us.UpdateSubscription(3, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: utils.ZeroAddress, })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `updated = us.UpdateSubscription(10, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: utils.ZeroAddress, })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `t.Run("remove a non existing subscription", func(t *testing.T) { us := subscriptions.NewUserSubscriptions() updated := us.UpdateSubscription(3, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: utils.ZeroAddress, }) assert.False(t, updated) })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `updated = us.UpdateSubscription(5, &identicalSubscription)` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.NewUserSubscriptions()` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.Run("GetMaxUserBalance for unknown user", func(t *testing.T) { _, err := us.GetMaxUserBalance(utils.RandomAddress()) assert.Error(t, err) })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.GetMaxUserBalance(utils.RandomAddress())` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.RandomAddress()` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.RandomAddress()` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.NewInt(10)` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.RandomAddress()` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.NewInt(50)` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.NewInt(70)` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.UpdateSubscription(5, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: user1, Balance: user1Balance, })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.UpdateSubscription(3, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: user2, Balance: user2Balance1, })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.UpdateSubscription(10, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: user2, Balance: user2Balance2, })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.GetMaxUserBalance(user1)` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.GetMaxUserBalance(user2)` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.Run("update balance", func(t *testing.T) { us := subscriptions.NewUserSubscriptions() owner := utils.RandomAddress() updated := us.UpdateSubscription(1, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: owner, Balance: big.NewInt(10), }) assert.True(t, updated) updated = us.UpdateSubscription(1, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: owner, Balance: big.NewInt(100), }) assert.True(t, updated) })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.NewUserSubscriptions()` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.RandomAddress()` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.UpdateSubscription(1, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: owner, Balance: big.NewInt(10), })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.NewInt(10)` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.UpdateSubscription(1, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: owner, Balance: big.NewInt(100), })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.NewInt(100)` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.Run("updated proposed owner", func(t *testing.T) { us := subscriptions.NewUserSubscriptions() owner := utils.RandomAddress() updated := us.UpdateSubscription(1, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: owner, Balance: big.NewInt(10), }) assert.True(t, updated) updated = us.UpdateSubscription(1, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: owner, Balance: big.NewInt(10), ProposedOwner: utils.RandomAddress(), }) assert.True(t, updated) })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.NewUserSubscriptions()` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.RandomAddress()` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.UpdateSubscription(1, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: owner, Balance: big.NewInt(10), })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.NewInt(10)` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.UpdateSubscription(1, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: owner, Balance: big.NewInt(10), ProposedOwner: utils.RandomAddress(), })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.NewInt(10)` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.RandomAddress()` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.Run("remove subscriptions", func(t *testing.T) { us := subscriptions.NewUserSubscriptions() user2 := utils.RandomAddress() user2Balance1 := big.NewInt(50) user2Balance2 := big.NewInt(70) updated := us.UpdateSubscription(3, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: user2, Balance: user2Balance1, }) assert.True(t, updated) updated = us.UpdateSubscription(10, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: user2, Balance: user2Balance2, }) assert.True(t, updated) updated = us.UpdateSubscription(3, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: utils.ZeroAddress, }) assert.True(t, updated) updated = us.UpdateSubscription(10, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: utils.ZeroAddress, }) assert.True(t, updated) _, err := us.GetMaxUserBalance(user2) assert.Error(t, err) })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.NewUserSubscriptions()` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.RandomAddress()` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.NewInt(50)` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.NewInt(70)` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.UpdateSubscription(3, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: user2, Balance: user2Balance1, })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.UpdateSubscription(10, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: user2, Balance: user2Balance2, })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.UpdateSubscription(3, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: utils.ZeroAddress, })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.UpdateSubscription(10, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: utils.ZeroAddress, })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.GetMaxUserBalance(user2)` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.Run("remove a non existing subscription", func(t *testing.T) { us := subscriptions.NewUserSubscriptions() updated := us.UpdateSubscription(3, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: utils.ZeroAddress, }) assert.False(t, updated) })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.NewUserSubscriptions()` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.UpdateSubscription(3, &functions_router.IFunctionsSubscriptionsSubscription{ Owner: utils.ZeroAddress, })` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.NewUserSubscriptions()` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.RandomAddress()` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.NewInt(25)` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.NewInt(25)` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.UpdateSubscription(5, &subscription)` $DIR/core/services/gateway/handlers/functions/subscriptions/user_subscriptions_test.go: `.UpdateSubscription(5, &identicalSubscription)` $DIR/core/services/gateway/handlers/handler.dummy_test.go: `connMgr.SetHandler(handler)` $DIR/core/services/gateway/handlers/handler.dummy_test.go: `.NewDummyHandler(&config, &connMgr, logger.TestLogger(t))` $DIR/core/services/gateway/handlers/handler.dummy_test.go: `.TestLogger(t)` $DIR/core/services/gateway/handlers/handler.dummy_test.go: `.SetHandler(handler)` $DIR/core/services/gateway/handlers/handler.dummy_test.go: `.Context(t)` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `nodeKeys.Address = strings.ToUpper(nodeKeys.Address)` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `servicetest.Run(t, gateway)` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `client.connector = connector` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `servicetest.Run(t, connector)` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `gomega.NewGomegaWithT(t).Eventually(func() bool { req := newHttpRequestObject(t, messageId1, userUrl, userKeys.PrivateKey) httpClient := &http.Client{} _, _ = httpClient.Do(req) // could initially return error if Gateway is not fully initialized yet return client.done.Load() }, testutils.WaitTimeout(t), testutils.TestInterval).Should(gomega.Equal(true))` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `_, _ = httpClient.Do(req)` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `.NewTestNodes(t, 2)` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `.ToUpper(nodeKeys.Address)` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `.TestLogger(t)` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `.Sprintf(gatewayConfigTemplate, nodeKeys.Address)` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `.NewGatewayFromConfig(parseGatewayConfig(t, gatewayConfig), gateway.NewHandlerFactory(nil, nil, lggr), lggr)` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `.NewHandlerFactory(nil, nil, lggr)` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `.Run(t, gateway)` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `.GetUserPort()` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `.GetNodePort()` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `.Sprintf("http://localhost:%d/user", userPort)` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `.Sprintf("ws://localhost:%d/node", nodePort)` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `.NewGatewayConnector(parseConnectorConfig(t, nodeConfigTemplate, nodeKeys.Address, nodeUrl), client, client, clockwork.NewRealClock(), lggr)` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `.NewRealClock()` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `.Run(t, connector)` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `.NewGomegaWithT(t)` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `.Eventually(func() bool { req := newHttpRequestObject(t, messageId1, userUrl, userKeys.PrivateKey) httpClient := &http.Client{} _, _ = httpClient.Do(req) // could initially return error if Gateway is not fully initialized yet return client.done.Load() }, testutils.WaitTimeout(t), testutils.TestInterval)` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `.Do(req)` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `.done.Load()` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `.WaitTimeout(t)` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `.Should(gomega.Equal(true))` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `.Equal(true)` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `.Do(req)` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `.ReadAll(resp.Body)` $DIR/core/services/gateway/integration_tests/gateway_integration_test.go: `.DecodeResponse(rawResp)` $DIR/core/services/gateway/network/httpserver_test.go: `handler.On("ProcessRequest", mock.Anything, mock.Anything).Return([]byte("response"), 200)` $DIR/core/services/gateway/network/httpserver_test.go: `url = strings.Replace(url, HTTPTestPath, network.HealthCheckPath, 1)` $DIR/core/services/gateway/network/httpserver_test.go: `.On("ProcessRequest", mock.Anything, mock.Anything)` $DIR/core/services/gateway/network/httpserver_test.go: `.Return([]byte("response"), 200)` $DIR/core/services/gateway/network/httpserver_test.go: `.ReadAll(resp.Body)` $DIR/core/services/gateway/network/httpserver_test.go: `.Replace(url, HTTPTestPath, network.HealthCheckPath, 1)` $DIR/core/services/gateway/network/httpserver_test.go: `.ReadAll(resp.Body)` $DIR/core/services/gateway/network/wsconnection_test.go: `servicetest.Run(t, ssl.connWrapper)` $DIR/core/services/gateway/network/wsconnection_test.go: `servicetest.Run(t, clientConnWrapper)` $DIR/core/services/gateway/network/wsconnection_test.go: `clientConnWrapper.Reset(conn)` $DIR/core/services/gateway/network/wsconnection_test.go: `<-ssl.connWrapper.ReadChannel()` $DIR/core/services/gateway/network/wsconnection_test.go: `writeErr = clientConnWrapper.Write(testutils.Context(t), websocket.TextMessage, []byte("failed send"))` $DIR/core/services/gateway/network/wsconnection_test.go: `conn, _, err = websocket.DefaultDialer.Dial(serverURL, nil)` $DIR/core/services/gateway/network/wsconnection_test.go: `clientConnWrapper.Reset(conn)` $DIR/core/services/gateway/network/wsconnection_test.go: `writeErr = clientConnWrapper.Write(testutils.Context(t), websocket.TextMessage, []byte("hello again"))` $DIR/core/services/gateway/network/wsconnection_test.go: `<-ssl.connWrapper.ReadChannel()` $DIR/core/services/gateway/network/wsconnection_test.go: `.TestLogger(t)` $DIR/core/services/gateway/network/wsconnection_test.go: `.NewWSConnectionWrapper(lggr)` $DIR/core/services/gateway/network/wsconnection_test.go: `.Run(t, ssl.connWrapper)` $DIR/core/services/gateway/network/wsconnection_test.go: `.NewServer(http.HandlerFunc(ssl.wsHandler))` $DIR/core/services/gateway/network/wsconnection_test.go: `.HandlerFunc(ssl.wsHandler)` $DIR/core/services/gateway/network/wsconnection_test.go: `.TrimPrefix(s.URL, "http")` $DIR/core/services/gateway/network/wsconnection_test.go: `.NewWSConnectionWrapper(lggr)` $DIR/core/services/gateway/network/wsconnection_test.go: `.Run(t, clientConnWrapper)` $DIR/core/services/gateway/network/wsconnection_test.go: `.DefaultDialer.Dial(serverURL, nil)` $DIR/core/services/gateway/network/wsconnection_test.go: `.Reset(conn)` $DIR/core/services/gateway/network/wsconnection_test.go: `.Write(testutils.Context(t), websocket.TextMessage, []byte("hello"))` $DIR/core/services/gateway/network/wsconnection_test.go: `.Context(t)` $DIR/core/services/gateway/network/wsconnection_test.go: `.connWrapper.ReadChannel()` $DIR/core/services/gateway/network/wsconnection_test.go: `.Write(testutils.Context(t), websocket.TextMessage, []byte("failed send"))` $DIR/core/services/gateway/network/wsconnection_test.go: `.Context(t)` $DIR/core/services/gateway/network/wsconnection_test.go: `.DefaultDialer.Dial(serverURL, nil)` $DIR/core/services/gateway/network/wsconnection_test.go: `.Reset(conn)` $DIR/core/services/gateway/network/wsconnection_test.go: `.Write(testutils.Context(t), websocket.TextMessage, []byte("hello again"))` $DIR/core/services/gateway/network/wsconnection_test.go: `.Context(t)` $DIR/core/services/gateway/network/wsconnection_test.go: `.connWrapper.ReadChannel()` $DIR/core/services/gateway/network/wsserver_test.go: `longString += longString` $DIR/core/services/gateway/network/wsserver_test.go: `acceptor.On("StartHandshake", mock.Anything).Return("", []byte{}, errors.New("invalid auth header"))` $DIR/core/services/gateway/network/wsserver_test.go: `.StdEncoding.EncodeToString([]byte(longString))` $DIR/core/services/gateway/network/wsserver_test.go: `.On("StartHandshake", mock.Anything)` $DIR/core/services/gateway/network/wsserver_test.go: `.Return("", []byte{}, errors.New("invalid auth header"))` $DIR/core/services/gateway/network/wsserver_test.go: `.New("invalid auth header")` $DIR/core/services/gateway/network/wsserver_test.go: `.StdEncoding.EncodeToString([]byte("abcd"))` $DIR/core/services/health_test.go: `ibhr.Start()` $DIR/core/services/health_test.go: `ibhr.Stop()` $DIR/core/services/health_test.go: `.TestLoggerObserved(t, zapcore.InfoLevel)` $DIR/core/services/health_test.go: `.NewInBackupHealthReport(1234, lggr)` $DIR/core/services/health_test.go: `.Start()` $DIR/core/services/health_test.go: `.NewRequestWithContext(tests.Context(t), "GET", "http://localhost:1234/health", nil)` $DIR/core/services/health_test.go: `.Context(t)` $DIR/core/services/health_test.go: `.DefaultClient.Do(req)` $DIR/core/services/health_test.go: `.Stop()` $DIR/core/services/health_test.go: `.TakeAll()` $DIR/core/services/job/job_orm_test.go: `func() { ctx := testutils.Context(t) require.NoError(t, keyStore.OCR().Add(ctx, cltest.DefaultOCRKey)) require.NoError(t, keyStore.P2P().Add(ctx, cltest.DefaultP2PKey)) }()` $DIR/core/services/job/job_orm_test.go: `t.Run("it creates job specs", func(t *testing.T) { err := orm.CreateJob(testutils.Context(t), jb) require.NoError(t, err) var returnedSpec job.Job var OCROracleSpec job.OCROracleSpec err = db.Get(&returnedSpec, "SELECT * FROM jobs WHERE jobs.id = $1", jb.ID) require.NoError(t, err) err = db.Get(&OCROracleSpec, "SELECT * FROM ocr_oracle_specs WHERE ocr_oracle_specs.id = $1", jb.OCROracleSpecID) require.NoError(t, err) returnedSpec.OCROracleSpec = &OCROracleSpec compareOCRJobSpecs(t, *jb, returnedSpec) })` $DIR/core/services/job/job_orm_test.go: `err = db.Get(&returnedSpec, "SELECT * FROM jobs WHERE jobs.id = $1", jb.ID)` $DIR/core/services/job/job_orm_test.go: `err = db.Get(&OCROracleSpec, "SELECT * FROM ocr_oracle_specs WHERE ocr_oracle_specs.id = $1", jb.OCROracleSpecID)` $DIR/core/services/job/job_orm_test.go: `returnedSpec.OCROracleSpec = &OCROracleSpec` $DIR/core/services/job/job_orm_test.go: `compareOCRJobSpecs(t, *jb, returnedSpec)` $DIR/core/services/job/job_orm_test.go: `t.Run("it correctly mark job_pipeline_specs as primary when creating a job", func(t *testing.T) { ctx := testutils.Context(t) jb2 := makeOCRJobSpec(t, address, bridge.Name.String(), bridge2.Name.String()) err := orm.CreateJob(ctx, jb2) require.NoError(t, err) var pipelineSpec pipeline.Spec err = db.Get(&pipelineSpec, "SELECT pipeline_specs.* FROM pipeline_specs JOIN job_pipeline_specs ON (pipeline_specs.id = job_pipeline_specs.pipeline_spec_id) WHERE job_pipeline_specs.job_id = $1", jb2.ID) require.NoError(t, err) var jobPipelineSpec job.PipelineSpec err = db.Get(&jobPipelineSpec, "SELECT * FROM job_pipeline_specs WHERE job_id = $1 AND pipeline_spec_id = $2", jb2.ID, pipelineSpec.ID) require.NoError(t, err) // `jb2.PipelineSpecID` gets loaded when calling `orm.CreateJob()` so we can compare it directly assert.Equal(t, jb2.PipelineSpecID, pipelineSpec.ID) assert.True(t, jobPipelineSpec.IsPrimary) })` $DIR/core/services/job/job_orm_test.go: `err = db.Get(&pipelineSpec, "SELECT pipeline_specs.* FROM pipeline_specs JOIN job_pipeline_specs ON (pipeline_specs.id = job_pipeline_specs.pipeline_spec_id) WHERE job_pipeline_specs.job_id = $1", jb2.ID)` $DIR/core/services/job/job_orm_test.go: `err = db.Get(&jobPipelineSpec, "SELECT * FROM job_pipeline_specs WHERE job_id = $1 AND pipeline_spec_id = $2", jb2.ID, pipelineSpec.ID)` $DIR/core/services/job/job_orm_test.go: `t.Run("autogenerates external job ID if missing", func(t *testing.T) { jb2 := makeOCRJobSpec(t, address, bridge.Name.String(), bridge2.Name.String()) jb2.ExternalJobID = uuid.UUID{} err := orm.CreateJob(testutils.Context(t), jb2) require.NoError(t, err) var returnedSpec job.Job err = db.Get(&returnedSpec, "SELECT * FROM jobs WHERE jobs.id = $1", jb.ID) require.NoError(t, err) assert.NotEqual(t, uuid.UUID{}, returnedSpec.ExternalJobID) })` $DIR/core/services/job/job_orm_test.go: `jb2.ExternalJobID = uuid.UUID{}` $DIR/core/services/job/job_orm_test.go: `err = db.Get(&returnedSpec, "SELECT * FROM jobs WHERE jobs.id = $1", jb.ID)` $DIR/core/services/job/job_orm_test.go: `t.Run("it deletes jobs from the DB", func(t *testing.T) { var dbSpecs []job.Job err := db.Select(&dbSpecs, "SELECT * FROM jobs") require.NoError(t, err) require.Len(t, dbSpecs, 3) err = orm.DeleteJob(testutils.Context(t), jb.ID) require.NoError(t, err) dbSpecs = []job.Job{} err = db.Select(&dbSpecs, "SELECT * FROM jobs") require.NoError(t, err) require.Len(t, dbSpecs, 2) })` $DIR/core/services/job/job_orm_test.go: `err = orm.DeleteJob(testutils.Context(t), jb.ID)` $DIR/core/services/job/job_orm_test.go: `dbSpecs = []job.Job{}` $DIR/core/services/job/job_orm_test.go: `err = db.Select(&dbSpecs, "SELECT * FROM jobs")` $DIR/core/services/job/job_orm_test.go: `t.Run("increase job spec error occurrence", func(t *testing.T) { ctx := testutils.Context(t) jb3 := makeOCRJobSpec(t, address, bridge.Name.String(), bridge2.Name.String()) err := orm.CreateJob(ctx, jb3) require.NoError(t, err) var jobSpec job.Job err = db.Get(&jobSpec, "SELECT * FROM jobs") require.NoError(t, err) ocrSpecError1 := "ocr spec 1 errored" ocrSpecError2 := "ocr spec 2 errored" require.NoError(t, orm.RecordError(ctx, jobSpec.ID, ocrSpecError1)) require.NoError(t, orm.RecordError(ctx, jobSpec.ID, ocrSpecError1)) require.NoError(t, orm.RecordError(ctx, jobSpec.ID, ocrSpecError2)) var specErrors []job.SpecError err = db.Select(&specErrors, "SELECT * FROM job_spec_errors") require.NoError(t, err) require.Len(t, specErrors, 2) assert.Equal(t, specErrors[0].Occurrences, uint(2)) assert.Equal(t, specErrors[1].Occurrences, uint(1)) assert.True(t, specErrors[0].CreatedAt.Before(specErrors[0].UpdatedAt), "expected created_at (%s) to be before updated_at (%s)", specErrors[0].CreatedAt, specErrors[0].UpdatedAt) assert.Equal(t, specErrors[0].Description, ocrSpecError1) assert.Equal(t, specErrors[1].Description, ocrSpecError2) assert.True(t, specErrors[1].CreatedAt.After(specErrors[0].UpdatedAt)) var j2 job.Job var OCROracleSpec job.OCROracleSpec var jobSpecErrors []job.SpecError err = db.Get(&j2, "SELECT * FROM jobs WHERE jobs.id = $1", jobSpec.ID) require.NoError(t, err) err = db.Get(&OCROracleSpec, "SELECT * FROM ocr_oracle_specs WHERE ocr_oracle_specs.id = $1", j2.OCROracleSpecID) require.NoError(t, err) err = db.Select(&jobSpecErrors, "SELECT * FROM job_spec_errors WHERE job_spec_errors.job_id = $1", j2.ID) require.NoError(t, err) require.Len(t, jobSpecErrors, 2) })` $DIR/core/services/job/job_orm_test.go: `err = db.Get(&jobSpec, "SELECT * FROM jobs")` $DIR/core/services/job/job_orm_test.go: `err = db.Select(&specErrors, "SELECT * FROM job_spec_errors")` $DIR/core/services/job/job_orm_test.go: `err = db.Get(&j2, "SELECT * FROM jobs WHERE jobs.id = $1", jobSpec.ID)` $DIR/core/services/job/job_orm_test.go: `err = db.Get(&OCROracleSpec, "SELECT * FROM ocr_oracle_specs WHERE ocr_oracle_specs.id = $1", j2.OCROracleSpecID)` $DIR/core/services/job/job_orm_test.go: `err = db.Select(&jobSpecErrors, "SELECT * FROM job_spec_errors WHERE job_spec_errors.job_id = $1", j2.ID)` $DIR/core/services/job/job_orm_test.go: `t.Run("finds job spec error by ID", func(t *testing.T) { ctx := testutils.Context(t) jb3 := makeOCRJobSpec(t, address, bridge.Name.String(), bridge2.Name.String()) err := orm.CreateJob(ctx, jb3) require.NoError(t, err) var jobSpec job.Job err = db.Get(&jobSpec, "SELECT * FROM jobs") require.NoError(t, err) var specErrors []job.SpecError err = db.Select(&specErrors, "SELECT * FROM job_spec_errors") require.NoError(t, err) require.Len(t, specErrors, 2) ocrSpecError1 := "ocr spec 3 errored" ocrSpecError2 := "ocr spec 4 errored" require.NoError(t, orm.RecordError(ctx, jobSpec.ID, ocrSpecError1)) require.NoError(t, orm.RecordError(ctx, jobSpec.ID, ocrSpecError2)) var updatedSpecError []job.SpecError err = db.Select(&updatedSpecError, "SELECT * FROM job_spec_errors ORDER BY id ASC") require.NoError(t, err) require.Len(t, updatedSpecError, 4) assert.Equal(t, uint(1), updatedSpecError[2].Occurrences) assert.Equal(t, uint(1), updatedSpecError[3].Occurrences) assert.Equal(t, ocrSpecError1, updatedSpecError[2].Description) assert.Equal(t, ocrSpecError2, updatedSpecError[3].Description) dbSpecErr1, err := orm.FindSpecError(ctx, updatedSpecError[2].ID) require.NoError(t, err) dbSpecErr2, err := orm.FindSpecError(ctx, updatedSpecError[3].ID) require.NoError(t, err) assert.Equal(t, uint(1), dbSpecErr1.Occurrences) assert.Equal(t, uint(1), dbSpecErr2.Occurrences) assert.Equal(t, ocrSpecError1, dbSpecErr1.Description) assert.Equal(t, ocrSpecError2, dbSpecErr2.Description) })` $DIR/core/services/job/job_orm_test.go: `err = db.Get(&jobSpec, "SELECT * FROM jobs")` $DIR/core/services/job/job_orm_test.go: `err = db.Select(&specErrors, "SELECT * FROM job_spec_errors")` $DIR/core/services/job/job_orm_test.go: `err = db.Select(&updatedSpecError, "SELECT * FROM job_spec_errors ORDER BY id ASC")` $DIR/core/services/job/job_orm_test.go: `t.Run("creates a job with a direct request spec", func(t *testing.T) { drSpec := fmt.Sprintf(` type = "directrequest" schemaVersion = 1 evmChainID = "0" name = "example eth request event spec" contractAddress = "0x613a38AC1659769640aaE063C651F48E0250454C" externalJobID = "%s" observationSource = """ ds1 [type=http method=GET url="http://example.com" allowunrestrictednetworkaccess="true"]; ds1_merge [type=merge left="{}"] ds1_parse [type=jsonparse path="USD"]; ds1_multiply [type=multiply times=100]; ds1 -> ds1_parse -> ds1_multiply; """ `, uuid.New()) drJob, err := directrequest.ValidatedDirectRequestSpec(drSpec) require.NoError(t, err) err = orm.CreateJob(testutils.Context(t), &drJob) require.NoError(t, err) })` $DIR/core/services/job/job_orm_test.go: `err = orm.CreateJob(testutils.Context(t), &drJob)` $DIR/core/services/job/job_orm_test.go: `t.Run("creates webhook specs along with external_initiator_webhook_specs", func(t *testing.T) { ctx := testutils.Context(t) eiFoo := cltest.MustInsertExternalInitiator(t, borm) eiBar := cltest.MustInsertExternalInitiator(t, borm) eiWS := []webhook.TOMLWebhookSpecExternalInitiator{ {Name: eiFoo.Name, Spec: cltest.JSONFromString(t, `{}`)}, {Name: eiBar.Name, Spec: cltest.JSONFromString(t, `{"bar": 1}`)}, } eim := webhook.NewExternalInitiatorManager(db, nil) jb, err := webhook.ValidatedWebhookSpec(ctx, testspecs.GenerateWebhookSpec(testspecs.WebhookSpecParams{ExternalInitiators: eiWS}).Toml(), eim) require.NoError(t, err) err = orm.CreateJob(testutils.Context(t), &jb) require.NoError(t, err) cltest.AssertCount(t, db, "external_initiator_webhook_specs", 2) })` $DIR/core/services/job/job_orm_test.go: `err = orm.CreateJob(testutils.Context(t), &jb)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "external_initiator_webhook_specs", 2)` $DIR/core/services/job/job_orm_test.go: `t.Run("it creates and deletes records for blockhash store jobs", func(t *testing.T) { ctx := testutils.Context(t) bhsJob, err := blockhashstore.ValidatedSpec( testspecs.GenerateBlockhashStoreSpec(testspecs.BlockhashStoreSpecParams{}).Toml()) require.NoError(t, err) err = orm.CreateJob(ctx, &bhsJob) require.NoError(t, err) savedJob, err := orm.FindJob(testutils.Context(t), bhsJob.ID) require.NoError(t, err) require.Equal(t, bhsJob.ID, savedJob.ID) require.Equal(t, bhsJob.Type, savedJob.Type) require.Equal(t, bhsJob.BlockhashStoreSpec.ID, savedJob.BlockhashStoreSpec.ID) require.Equal(t, bhsJob.BlockhashStoreSpec.CoordinatorV1Address, savedJob.BlockhashStoreSpec.CoordinatorV1Address) require.Equal(t, bhsJob.BlockhashStoreSpec.CoordinatorV2Address, savedJob.BlockhashStoreSpec.CoordinatorV2Address) require.Equal(t, bhsJob.BlockhashStoreSpec.CoordinatorV2PlusAddress, savedJob.BlockhashStoreSpec.CoordinatorV2PlusAddress) require.Equal(t, bhsJob.BlockhashStoreSpec.WaitBlocks, savedJob.BlockhashStoreSpec.WaitBlocks) require.Equal(t, bhsJob.BlockhashStoreSpec.LookbackBlocks, savedJob.BlockhashStoreSpec.LookbackBlocks) require.Equal(t, bhsJob.BlockhashStoreSpec.HeartbeatPeriod, savedJob.BlockhashStoreSpec.HeartbeatPeriod) require.Equal(t, bhsJob.BlockhashStoreSpec.BlockhashStoreAddress, savedJob.BlockhashStoreSpec.BlockhashStoreAddress) require.Equal(t, bhsJob.BlockhashStoreSpec.TrustedBlockhashStoreAddress, savedJob.BlockhashStoreSpec.TrustedBlockhashStoreAddress) require.Equal(t, bhsJob.BlockhashStoreSpec.TrustedBlockhashStoreBatchSize, savedJob.BlockhashStoreSpec.TrustedBlockhashStoreBatchSize) require.Equal(t, bhsJob.BlockhashStoreSpec.PollPeriod, savedJob.BlockhashStoreSpec.PollPeriod) require.Equal(t, bhsJob.BlockhashStoreSpec.RunTimeout, savedJob.BlockhashStoreSpec.RunTimeout) require.Equal(t, bhsJob.BlockhashStoreSpec.EVMChainID, savedJob.BlockhashStoreSpec.EVMChainID) require.Equal(t, bhsJob.BlockhashStoreSpec.FromAddresses, savedJob.BlockhashStoreSpec.FromAddresses) err = orm.DeleteJob(ctx, bhsJob.ID) require.NoError(t, err) _, err = orm.FindJob(testutils.Context(t), bhsJob.ID) require.Error(t, err) })` $DIR/core/services/job/job_orm_test.go: `err = orm.CreateJob(ctx, &bhsJob)` $DIR/core/services/job/job_orm_test.go: `err = orm.DeleteJob(ctx, bhsJob.ID)` $DIR/core/services/job/job_orm_test.go: `_, err = orm.FindJob(testutils.Context(t), bhsJob.ID)` $DIR/core/services/job/job_orm_test.go: `err = orm.CreateJob(ctx, &bhsJob)` $DIR/core/services/job/job_orm_test.go: `err = orm.DeleteJob(ctx, bhsJob.ID)` $DIR/core/services/job/job_orm_test.go: `_, err = orm.FindJob(testutils.Context(t), bhsJob.ID)` $DIR/core/services/job/job_orm_test.go: `t.Run("it deletes records for offchainreporting jobs", func(t *testing.T) { ctx := testutils.Context(t) _, bridge := cltest.MustCreateBridge(t, db, cltest.BridgeOpts{}) _, bridge2 := cltest.MustCreateBridge(t, db, cltest.BridgeOpts{}) _, address := cltest.MustInsertRandomKey(t, keyStore.Eth()) relayExtenders := evmtest.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, GeneralConfig: config, KeyStore: keyStore.Eth()}) legacyChains := evmrelay.NewLegacyChainsFromRelayerExtenders(relayExtenders) jb, err := ocr.ValidatedOracleSpecToml(config, legacyChains, testspecs.GenerateOCRSpec(testspecs.OCRSpecParams{ TransmitterAddress: address.Hex(), DS1BridgeName: bridge.Name.String(), DS2BridgeName: bridge2.Name.String(), }).Toml()) require.NoError(t, err) err = jobORM.CreateJob(ctx, &jb) require.NoError(t, err) cltest.AssertCount(t, db, "ocr_oracle_specs", 1) cltest.AssertCount(t, db, "pipeline_specs", 1) err = jobORM.DeleteJob(ctx, jb.ID) require.NoError(t, err) cltest.AssertCount(t, db, "ocr_oracle_specs", 0) cltest.AssertCount(t, db, "pipeline_specs", 0) cltest.AssertCount(t, db, "jobs", 0) })` $DIR/core/services/job/job_orm_test.go: `err = jobORM.CreateJob(ctx, &jb)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "ocr_oracle_specs", 1)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "pipeline_specs", 1)` $DIR/core/services/job/job_orm_test.go: `err = jobORM.DeleteJob(ctx, jb.ID)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "ocr_oracle_specs", 0)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "pipeline_specs", 0)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "jobs", 0)` $DIR/core/services/job/job_orm_test.go: `t.Run("it deletes records for keeper jobs", func(t *testing.T) { ctx := testutils.Context(t) registry, keeperJob := cltest.MustInsertKeeperRegistry(t, db, korm, keyStore.Eth(), 0, 1, 20) cltest.MustInsertUpkeepForRegistry(t, db, registry) cltest.AssertCount(t, db, "keeper_specs", 1) cltest.AssertCount(t, db, "keeper_registries", 1) cltest.AssertCount(t, db, "upkeep_registrations", 1) err := jobORM.DeleteJob(ctx, keeperJob.ID) require.NoError(t, err) cltest.AssertCount(t, db, "keeper_specs", 0) cltest.AssertCount(t, db, "keeper_registries", 0) cltest.AssertCount(t, db, "upkeep_registrations", 0) cltest.AssertCount(t, db, "jobs", 0) })` $DIR/core/services/job/job_orm_test.go: `cltest.MustInsertUpkeepForRegistry(t, db, registry)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "keeper_specs", 1)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "keeper_registries", 1)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "keeper_specs", 0)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "keeper_registries", 0)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "upkeep_registrations", 0)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "jobs", 0)` $DIR/core/services/job/job_orm_test.go: `t.Run("it creates and deletes records for vrf jobs", func(t *testing.T) { ctx := testutils.Context(t) key, err := keyStore.VRF().Create(ctx) require.NoError(t, err) pk := key.PublicKey jb, err := vrfcommon.ValidatedVRFSpec(testspecs.GenerateVRFSpec(testspecs.VRFSpecParams{PublicKey: pk.String()}).Toml()) require.NoError(t, err) err = jobORM.CreateJob(ctx, &jb) require.NoError(t, err) cltest.AssertCount(t, db, "vrf_specs", 1) cltest.AssertCount(t, db, "jobs", 1) err = jobORM.DeleteJob(ctx, jb.ID) require.NoError(t, err) cltest.AssertCount(t, db, "vrf_specs", 0) cltest.AssertCount(t, db, "jobs", 0) })` $DIR/core/services/job/job_orm_test.go: `err = jobORM.CreateJob(ctx, &jb)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "vrf_specs", 1)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "jobs", 1)` $DIR/core/services/job/job_orm_test.go: `err = jobORM.DeleteJob(ctx, jb.ID)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "vrf_specs", 0)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "jobs", 0)` $DIR/core/services/job/job_orm_test.go: `t.Run("it deletes records for webhook jobs", func(t *testing.T) { ctx := testutils.Context(t) ei := cltest.MustInsertExternalInitiator(t, bridges.NewORM(db)) jb, webhookSpec := cltest.MustInsertWebhookSpec(t, db) _, err := db.Exec(`INSERT INTO external_initiator_webhook_specs (external_initiator_id, webhook_spec_id, spec) VALUES ($1,$2,$3)`, ei.ID, webhookSpec.ID, `{"ei": "foo", "name": "webhookSpecTwoEIs"}`) require.NoError(t, err) err = jobORM.DeleteJob(ctx, jb.ID) require.NoError(t, err) cltest.AssertCount(t, db, "webhook_specs", 0) cltest.AssertCount(t, db, "external_initiator_webhook_specs", 0) cltest.AssertCount(t, db, "jobs", 0) })` $DIR/core/services/job/job_orm_test.go: `err = jobORM.DeleteJob(ctx, jb.ID)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "webhook_specs", 0)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "external_initiator_webhook_specs", 0)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "jobs", 0)` $DIR/core/services/job/job_orm_test.go: `_, err = db.Exec(`DELETE FROM external_initiators`)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "vrf_specs", 1)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "jobs", 1)` $DIR/core/services/job/job_orm_test.go: `actual = append(actual, common.BytesToAddress(b).String())` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "vrf_specs", 0)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "jobs", 0)` $DIR/core/services/job/job_orm_test.go: `jb, err = vrfcommon.ValidatedVRFSpec(testspecs.GenerateVRFSpec(testspecs.VRFSpecParams{RequestTimeout: 1 * time.Hour}).Toml())` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "vrf_specs", 1)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "jobs", 1)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "vrf_specs", 0)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "vrf_specs", 1)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "jobs", 1)` $DIR/core/services/job/job_orm_test.go: `actual = append(actual, common.BytesToAddress(b).String())` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "vrf_specs", 0)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "jobs", 0)` $DIR/core/services/job/job_orm_test.go: `jb, err = vrfcommon.ValidatedVRFSpec(testspecs.GenerateVRFSpec(testspecs.VRFSpecParams{ VRFVersion: vrfcommon.V2Plus, RequestTimeout: 1 * time.Hour, FromAddresses: fromAddresses, }).Toml())` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "vrf_specs", 1)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "jobs", 1)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "vrf_specs", 0)` $DIR/core/services/job/job_orm_test.go: `err = jobORM.CreateJob(ctx, &jb)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "bootstrap_specs", 1)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "jobs", 1)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "bootstrap_specs", 0)` $DIR/core/services/job/job_orm_test.go: `t.Run("evm chain id validation for ocr works", func(t *testing.T) { jb := job.Job{ Type: job.OffchainReporting, OCROracleSpec: &job.OCROracleSpec{}, } assert.Equal(t, "CreateJobFailed: evm chain id must be defined", jobORM.CreateJob(testutils.Context(t), &jb).Error()) })` $DIR/core/services/job/job_orm_test.go: `t.Run("evm chain id validation for direct request works", func(t *testing.T) { jb := job.Job{ Type: job.DirectRequest, DirectRequestSpec: &job.DirectRequestSpec{}, } assert.Equal(t, "CreateJobFailed: evm chain id must be defined", jobORM.CreateJob(testutils.Context(t), &jb).Error()) })` $DIR/core/services/job/job_orm_test.go: `t.Run("evm chain id validation for flux monitor works", func(t *testing.T) { jb := job.Job{ Type: job.FluxMonitor, FluxMonitorSpec: &job.FluxMonitorSpec{}, } assert.Equal(t, "CreateJobFailed: evm chain id must be defined", jobORM.CreateJob(testutils.Context(t), &jb).Error()) })` $DIR/core/services/job/job_orm_test.go: `t.Run("evm chain id validation for keepers works", func(t *testing.T) { jb := job.Job{ Type: job.Keeper, KeeperSpec: &job.KeeperSpec{}, } assert.Equal(t, "CreateJobFailed: evm chain id must be defined", jobORM.CreateJob(testutils.Context(t), &jb).Error()) })` $DIR/core/services/job/job_orm_test.go: `t.Run("evm chain id validation for vrf works", func(t *testing.T) { jb := job.Job{ Type: job.VRF, VRFSpec: &job.VRFSpec{}, } assert.Equal(t, "CreateJobFailed: evm chain id must be defined", jobORM.CreateJob(testutils.Context(t), &jb).Error()) })` $DIR/core/services/job/job_orm_test.go: `t.Run("evm chain id validation for block hash store works", func(t *testing.T) { jb := job.Job{ Type: job.BlockhashStore, BlockhashStoreSpec: &job.BlockhashStoreSpec{}, } assert.Equal(t, "CreateJobFailed: evm chain id must be defined", jobORM.CreateJob(testutils.Context(t), &jb).Error()) })` $DIR/core/services/job/job_orm_test.go: `t.Run("evm chain id validation for block header feeder works", func(t *testing.T) { jb := job.Job{ Type: job.BlockHeaderFeeder, BlockHeaderFeederSpec: &job.BlockHeaderFeederSpec{}, } assert.Equal(t, "CreateJobFailed: evm chain id must be defined", jobORM.CreateJob(testutils.Context(t), &jb).Error()) })` $DIR/core/services/job/job_orm_test.go: `t.Run("evm chain id validation for legacy gas station server spec works", func(t *testing.T) { jb := job.Job{ Type: job.LegacyGasStationServer, LegacyGasStationServerSpec: &job.LegacyGasStationServerSpec{}, } assert.Equal(t, "CreateJobFailed: evm chain id must be defined", jobORM.CreateJob(testutils.Context(t), &jb).Error()) })` $DIR/core/services/job/job_orm_test.go: `c.EVM = append(c.EVM, &evmcfg.EVMConfig{ ChainID: customChainID, Chain: evmcfg.Defaults(customChainID), Enabled: &enabled, Nodes: evmcfg.EVMNodes{{}}, })` $DIR/core/services/job/job_orm_test.go: `err = jobORM.CreateJob(ctx, &jb)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "ocr_oracle_specs", 1)` $DIR/core/services/job/job_orm_test.go: `cltest.AssertCount(t, db, "jobs", 1)` $DIR/core/services/job/job_orm_test.go: `externalJobID = uuid.NullUUID{UUID: uuid.New(), Valid: true}` $DIR/core/services/job/job_orm_test.go: `spec.JobID = externalJobID.UUID.String()` $DIR/core/services/job/job_orm_test.go: `err = jobORM.CreateJob(ctx, &jba)` $DIR/core/services/job/job_orm_test.go: `externalJobID = uuid.NullUUID{UUID: uuid.New(), Valid: true}` $DIR/core/services/job/job_orm_test.go: `spec.JobID = externalJobID.UUID.String()` $DIR/core/services/job/job_orm_test.go: `err = jobORM.CreateJob(ctx, &jb2)` $DIR/core/services/job/job_orm_test.go: `c.EVM = append(c.EVM, &evmcfg.EVMConfig{ ChainID: customChainID, Chain: evmcfg.Defaults(customChainID), Enabled: &enabled, Nodes: evmcfg.EVMNodes{{}}, })` $DIR/core/services/job/job_orm_test.go: `jb.Name = null.StringFrom("Job 1")` $DIR/core/services/job/job_orm_test.go: `jb.OCR2OracleSpec.TransmitterID = null.StringFrom(address.String())` $DIR/core/services/job/job_orm_test.go: `jb.OCR2OracleSpec.PluginConfig["juelsPerFeeCoinSource"] = juelsPerFeeCoinSource` $DIR/core/services/job/job_orm_test.go: `err = jobORM.CreateJob(ctx, &jb)` $DIR/core/services/job/job_orm_test.go: `jb2.Name = null.StringFrom("Job with same chain id & contract address")` $DIR/core/services/job/job_orm_test.go: `jb2.OCR2OracleSpec.TransmitterID = null.StringFrom(address.String())` $DIR/core/services/job/job_orm_test.go: `jb.OCR2OracleSpec.PluginConfig["juelsPerFeeCoinSource"] = juelsPerFeeCoinSource` $DIR/core/services/job/job_orm_test.go: `err = jobORM.CreateJob(ctx, &jb2)` $DIR/core/services/job/job_orm_test.go: `jb3.Name = null.StringFrom("Job with different chain id & same contract address")` $DIR/core/services/job/job_orm_test.go: `jb3.OCR2OracleSpec.TransmitterID = null.StringFrom(address.String())` $DIR/core/services/job/job_orm_test.go: `jb3.OCR2OracleSpec.RelayConfig["chainID"] = customChainID.Int64()` $DIR/core/services/job/job_orm_test.go: `jb.OCR2OracleSpec.PluginConfig["juelsPerFeeCoinSource"] = juelsPerFeeCoinSource` $DIR/core/services/job/job_orm_test.go: `err = jobORM.CreateJob(ctx, &jb3)` $DIR/core/services/job/job_orm_test.go: `c.EVM = append(c.EVM, &evmcfg.EVMConfig{ ChainID: customChainID, Chain: evmcfg.Defaults(customChainID), Enabled: &enabled, Nodes: evmcfg.EVMNodes{{}}, })` $DIR/core/services/job/job_orm_test.go: `t.Run("sending keys or transmitterID must be defined", func(t *testing.T) { ctx := testutils.Context(t) jb.OCR2OracleSpec.TransmitterID = null.String{} assert.Equal(t, "CreateJobFailed: neither sending keys nor transmitter ID is defined", jobORM.CreateJob(ctx, &jb).Error()) })` $DIR/core/services/job/job_orm_test.go: `jb.OCR2OracleSpec.TransmitterID = null.String{}` $DIR/core/services/job/job_orm_test.go: `t.Run("sending keys validation works properly", func(t *testing.T) { ctx := testutils.Context(t) jb.OCR2OracleSpec.TransmitterID = null.String{} _, address2 := cltest.MustInsertRandomKey(t, keyStore.Eth()) jb.OCR2OracleSpec.RelayConfig["sendingKeys"] = interface{}([]any{address.String(), address2.String(), common.HexToAddress("0X0").String()}) assert.Equal(t, "CreateJobFailed: no EVM key matching: \"0x0000000000000000000000000000000000000000\": no such sending key exists", jobORM.CreateJob(ctx, &jb).Error()) jb.OCR2OracleSpec.RelayConfig["sendingKeys"] = interface{}([]any{1, 2, 3}) assert.Equal(t, "CreateJobFailed: sending keys are of wrong type", jobORM.CreateJob(ctx, &jb).Error()) })` $DIR/core/services/job/job_orm_test.go: `jb.OCR2OracleSpec.TransmitterID = null.String{}` $DIR/core/services/job/job_orm_test.go: `jb.OCR2OracleSpec.RelayConfig["sendingKeys"] = interface{}([]any{address.String(), address2.String(), common.HexToAddress("0X0").String()})` $DIR/core/services/job/job_orm_test.go: `jb.OCR2OracleSpec.RelayConfig["sendingKeys"] = interface{}([]any{1, 2, 3})` $DIR/core/services/job/job_orm_test.go: `t.Run("sending keys and transmitter ID can't both be defined", func(t *testing.T) { ctx := testutils.Context(t) jb.OCR2OracleSpec.TransmitterID = null.StringFrom(address.String()) jb.OCR2OracleSpec.RelayConfig["sendingKeys"] = interface{}([]any{address.String()}) assert.Equal(t, "CreateJobFailed: sending keys and transmitter ID can't both be defined", jobORM.CreateJob(ctx, &jb).Error()) })` $DIR/core/services/job/job_orm_test.go: `jb.OCR2OracleSpec.TransmitterID = null.StringFrom(address.String())` $DIR/core/services/job/job_orm_test.go: `jb.OCR2OracleSpec.RelayConfig["sendingKeys"] = interface{}([]any{address.String()})` $DIR/core/services/job/job_orm_test.go: `jb.OCR2OracleSpec.TransmitterID = null.StringFrom("transmitterID that doesn't have a match in key store")` $DIR/core/services/job/job_orm_test.go: `jb.OCR2OracleSpec.RelayConfig["sendingKeys"] = nil` $DIR/core/services/job/job_orm_test.go: `jb, err = ocr2validate.ValidatedOracleSpecToml(testutils.Context(t), config.OCR2(), config.Insecure(), testspecs.GetOCR2EVMSpecMinimal(), nil)` $DIR/core/services/job/job_orm_test.go: `t.Run("test ETH key validation", func(t *testing.T) { ctx := testutils.Context(t) jb.OCR2OracleSpec.Relay = types.NetworkEVM err := job.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, "bad key") require.EqualError(t, err, "no EVM key matching: \"bad key\"") _, evmKey := cltest.MustInsertRandomKey(t, keyStore.Eth()) err = job.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, evmKey.String()) require.NoError(t, err) })` $DIR/core/services/job/job_orm_test.go: `jb.OCR2OracleSpec.Relay = types.NetworkEVM` $DIR/core/services/job/job_orm_test.go: `err = job.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, evmKey.String())` $DIR/core/services/job/job_orm_test.go: `t.Run("test Cosmos key validation", func(t *testing.T) { ctx := testutils.Context(t) jb.OCR2OracleSpec.Relay = types.NetworkCosmos err := job.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, "bad key") require.EqualError(t, err, "no Cosmos key matching: \"bad key\"") cosmosKey, err := keyStore.Cosmos().Create(ctx) require.NoError(t, err) err = job.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, cosmosKey.ID()) require.NoError(t, err) })` $DIR/core/services/job/job_orm_test.go: `jb.OCR2OracleSpec.Relay = types.NetworkCosmos` $DIR/core/services/job/job_orm_test.go: `err = job.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, cosmosKey.ID())` $DIR/core/services/job/job_orm_test.go: `t.Run("test Solana key validation", func(t *testing.T) { ctx := testutils.Context(t) jb.OCR2OracleSpec.Relay = types.NetworkSolana err := job.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, "bad key") require.EqualError(t, err, "no Solana key matching: \"bad key\"") solanaKey, err := keyStore.Solana().Create(ctx) require.NoError(t, err) err = job.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, solanaKey.ID()) require.NoError(t, err) })` $DIR/core/services/job/job_orm_test.go: `jb.OCR2OracleSpec.Relay = types.NetworkSolana` $DIR/core/services/job/job_orm_test.go: `err = job.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, solanaKey.ID())` $DIR/core/services/job/job_orm_test.go: `t.Run("test Starknet key validation", func(t *testing.T) { ctx := testutils.Context(t) jb.OCR2OracleSpec.Relay = types.NetworkStarkNet err := job.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, "bad key") require.EqualError(t, err, "no Starknet key matching: \"bad key\"") starkNetKey, err := keyStore.StarkNet().Create(ctx) require.NoError(t, err) err = job.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, starkNetKey.ID()) require.NoError(t, err) })` $DIR/core/services/job/job_orm_test.go: `jb.OCR2OracleSpec.Relay = types.NetworkStarkNet` $DIR/core/services/job/job_orm_test.go: `err = job.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, starkNetKey.ID())` $DIR/core/services/job/job_orm_test.go: `jb.OCR2OracleSpec.PluginType = types.Mercury` $DIR/core/services/job/job_orm_test.go: `err = job.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, csaKey.ID())` $DIR/core/services/job/job_orm_test.go: `err = orm.CreateJob(ctx, &jb1)` $DIR/core/services/job/job_orm_test.go: `err = orm.CreateJob(ctx, &jb2)` $DIR/core/services/job/job_orm_test.go: `t.Run("jobs are ordered by latest first", func(t *testing.T) { jobs, count, err2 := orm.FindJobs(testutils.Context(t), 0, 2) require.NoError(t, err2) require.Len(t, jobs, 2) assert.Equal(t, count, 2) expectedJobs := []job.Job{jb2, jb1} for i, exp := range expectedJobs { assert.Equal(t, exp.ID, jobs[i].ID) } })` $DIR/core/services/job/job_orm_test.go: `c.EVM = append(c.EVM, &evmcfg.EVMConfig{ ChainID: chainID, Chain: evmcfg.Defaults(chainID), Enabled: &enabled, Nodes: evmcfg.EVMNodes{{}}, })` $DIR/core/services/job/job_orm_test.go: `jobOCR2.OCR2OracleSpec.TransmitterID = null.StringFrom(address.String())` $DIR/core/services/job/job_orm_test.go: `jobOCR2.OCR2OracleSpec.PluginConfig["juelsPerFeeCoinSource"] = juelsPerFeeCoinSource` $DIR/core/services/job/job_orm_test.go: `jobOCR2WithFeedID2.ExternalJobID = uuid.New()` $DIR/core/services/job/job_orm_test.go: `jobOCR2WithFeedID2.Name = null.StringFrom("new name")` $DIR/core/services/job/job_orm_test.go: `err = orm.CreateJob(ctx, &job)` $DIR/core/services/job/job_orm_test.go: `err = orm.CreateJob(ctx, &jobSameAddress)` $DIR/core/services/job/job_orm_test.go: `err = orm.CreateJob(ctx, &jobOCR2)` $DIR/core/services/job/job_orm_test.go: `err = orm.CreateJob(ctx, &jobOCR2WithFeedID1)` $DIR/core/services/job/job_orm_test.go: `err = orm.CreateJob(ctx, &jobOCR2WithFeedID2)` $DIR/core/services/job/job_orm_test.go: `t.Run("by id", func(t *testing.T) { ctx, cancel := context.WithTimeout(testutils.Context(t), 5*time.Second) defer cancel() jb, err2 := orm.FindJob(ctx, job.ID) require.NoError(t, err2) assert.Equal(t, jb.ID, job.ID) assert.Equal(t, jb.Name, job.Name) require.Greater(t, jb.PipelineSpecID, int32(0)) require.NotNil(t, jb.PipelineSpec) require.NotNil(t, jb.OCROracleSpecID) require.NotNil(t, jb.OCROracleSpec) })` $DIR/core/services/job/job_orm_test.go: `t.Run("by external job id", func(t *testing.T) { ctx := testutils.Context(t) jb, err2 := orm.FindJobByExternalJobID(ctx, externalJobID) require.NoError(t, err2) assert.Equal(t, jb.ID, job.ID) assert.Equal(t, jb.Name, job.Name) require.Greater(t, jb.PipelineSpecID, int32(0)) require.NotNil(t, jb.PipelineSpec) require.NotNil(t, jb.OCROracleSpecID) require.NotNil(t, jb.OCROracleSpec) })` $DIR/core/services/job/job_orm_test.go: `t.Run("by address", func(t *testing.T) { ctx := testutils.Context(t) jbID, err2 := orm.FindJobIDByAddress(ctx, job.OCROracleSpec.ContractAddress, job.OCROracleSpec.EVMChainID) require.NoError(t, err2) assert.Equal(t, job.ID, jbID) _, err2 = orm.FindJobIDByAddress(ctx, "not-existing", big.NewI(0)) require.Error(t, err2) require.ErrorIs(t, err2, sql.ErrNoRows) })` $DIR/core/services/job/job_orm_test.go: `_, err2 = orm.FindJobIDByAddress(ctx, "not-existing", big.NewI(0))` $DIR/core/services/job/job_orm_test.go: `t.Run("by address yet chain scoped", func(t *testing.T) { ctx := testutils.Context(t) commonAddr := jobSameAddress.OCROracleSpec.ContractAddress // Find job ID for job on chain 1337 with common address. jbID, err2 := orm.FindJobIDByAddress(ctx, commonAddr, jobSameAddress.OCROracleSpec.EVMChainID) require.NoError(t, err2) assert.Equal(t, jobSameAddress.ID, jbID) // Find job ID for job on default evm chain with common address. jbID, err2 = orm.FindJobIDByAddress(ctx, commonAddr, job.OCROracleSpec.EVMChainID) require.NoError(t, err2) assert.Equal(t, job.ID, jbID) })` $DIR/core/services/job/job_orm_test.go: `jbID, err2 = orm.FindJobIDByAddress(ctx, commonAddr, job.OCROracleSpec.EVMChainID)` $DIR/core/services/job/job_orm_test.go: `t.Run("by contract id without feed id", func(t *testing.T) { ctx := testutils.Context(t) contractID := "0x613a38AC1659769640aaE063C651F48E0250454C" // Find job ID for ocr2 job without feedID. jbID, err2 := orm.FindOCR2JobIDByAddress(ctx, contractID, nil) require.NoError(t, err2) assert.Equal(t, jobOCR2.ID, jbID) })` $DIR/core/services/job/job_orm_test.go: `t.Run("by contract id with valid feed id", func(t *testing.T) { ctx := testutils.Context(t) contractID := "0x0000000000000000000000000000000000000006" feedID := common.HexToHash(ocr2WithFeedID1) // Find job ID for ocr2 job with feed ID jbID, err2 := orm.FindOCR2JobIDByAddress(ctx, contractID, &feedID) require.NoError(t, err2) assert.Equal(t, jobOCR2WithFeedID1.ID, jbID) })` $DIR/core/services/job/job_orm_test.go: `jb.DirectRequestSpec.EVMChainID = big.NewI(0)` $DIR/core/services/job/job_orm_test.go: `err = orm.CreateJob(testutils.Context(t), &jb)` $DIR/core/services/job/job_orm_test.go: `t.Run("with jobs", func(t *testing.T) { ctx := testutils.Context(t) jbs, err2 := orm.FindJobsByPipelineSpecIDs(ctx, []int32{jb.PipelineSpecID}) require.NoError(t, err2) assert.Len(t, jbs, 1) assert.Equal(t, jb.ID, jbs[0].ID) assert.Equal(t, jb.Name, jbs[0].Name) require.Greater(t, jbs[0].PipelineSpecID, int32(0)) require.Equal(t, jb.PipelineSpecID, jbs[0].PipelineSpecID) require.NotNil(t, jbs[0].PipelineSpec) })` $DIR/core/services/job/job_orm_test.go: `t.Run("without jobs", func(t *testing.T) { ctx := testutils.Context(t) jbs, err2 := orm.FindJobsByPipelineSpecIDs(ctx, []int32{-1}) require.NoError(t, err2) assert.Len(t, jbs, 0) })` $DIR/core/services/job/job_orm_test.go: `err = orm.CreateJob(testutils.Context(t), &jb)` $DIR/core/services/job/job_orm_test.go: `t.Run("with no pipeline runs", func(t *testing.T) { ctx := testutils.Context(t) runs, count, err2 := orm.PipelineRuns(ctx, nil, 0, 10) require.NoError(t, err2) assert.Equal(t, count, 0) assert.Empty(t, runs) })` $DIR/core/services/job/job_orm_test.go: `err = orm.CreateJob(testutils.Context(t), &jb)` $DIR/core/services/job/job_orm_test.go: `t.Run("with no pipeline runs", func(t *testing.T) { ctx := testutils.Context(t) runs, count, err2 := orm.PipelineRuns(ctx, &jb.ID, 0, 10) require.NoError(t, err2) assert.Equal(t, count, 0) assert.Empty(t, runs) })` $DIR/core/services/job/job_orm_test.go: `jb, err = ocr.ValidatedOracleSpecToml(config, legacyChains, testspecs.GenerateOCRSpec(testspecs.OCRSpecParams{ JobID: jobID, Name: fmt.Sprintf("Job #%v", jobID), DS1BridgeName: bridge.Name.String(), DS2BridgeName: bridge2.Name.String(), TransmitterAddress: address.Hex(), ContractAddress: key.Address.String(), }).Toml())` $DIR/core/services/job/job_orm_test.go: `err = orm.CreateJob(testutils.Context(t), &jb)` $DIR/core/services/job/job_orm_test.go: `jobs[j] = jb` $DIR/core/services/job/job_orm_test.go: `mustInsertPipelineRun(t, pipelineORM, jobs[j])` $DIR/core/services/job/job_orm_test.go: `j++` $DIR/core/services/job/job_orm_test.go: `j = 0` $DIR/core/services/job/job_orm_test.go: `t.Run("with no pipeline runs", func(t *testing.T) { ctx := testutils.Context(t) runIDs, err := orm.FindPipelineRunIDsByJobID(ctx, jb.ID, 0, 10) require.NoError(t, err) assert.Empty(t, runIDs) })` $DIR/core/services/job/job_orm_test.go: `t.Run("with a pipeline run", func(t *testing.T) { ctx := testutils.Context(t) run := mustInsertPipelineRun(t, pipelineORM, jb) runIDs, err := orm.FindPipelineRunIDsByJobID(ctx, jb.ID, 0, 10) require.NoError(t, err) require.Len(t, runIDs, 1) assert.Equal(t, run.ID, runIDs[0]) })` $DIR/core/services/job/job_orm_test.go: `t.Run("with batch concatenation limit 10", func(t *testing.T) { ctx := testutils.Context(t) runIDs, err := orm.FindPipelineRunIDsByJobID(ctx, jobs[3].ID, 95, 10) require.NoError(t, err) require.Len(t, runIDs, 10) assert.Equal(t, int64(4*(len(jobs)-1)), runIDs[3]-runIDs[7]) })` $DIR/core/services/job/job_orm_test.go: `t.Run("with batch concatenation limit 100", func(t *testing.T) { ctx := testutils.Context(t) runIDs, err := orm.FindPipelineRunIDsByJobID(ctx, jobs[3].ID, 95, 100) require.NoError(t, err) require.Len(t, runIDs, 100) assert.Equal(t, int64(67*(len(jobs)-1)), runIDs[12]-runIDs[79]) })` $DIR/core/services/job/job_orm_test.go: `mustInsertPipelineRun(t, pipelineORM, jb)` $DIR/core/services/job/job_orm_test.go: `t.Run("with first batch empty, over limit", func(t *testing.T) { ctx := testutils.Context(t) runIDs, err := orm.FindPipelineRunIDsByJobID(ctx, jobs[3].ID, 0, 25) require.NoError(t, err) require.Len(t, runIDs, 25) assert.Equal(t, int64(16*(len(jobs)-1)), runIDs[7]-runIDs[23]) })` $DIR/core/services/job/job_orm_test.go: `err = orm.CreateJob(testutils.Context(t), &jb)` $DIR/core/services/job/job_orm_test.go: `t.Run("with no pipeline runs", func(t *testing.T) { ctx := testutils.Context(t) runs, err2 := orm.FindPipelineRunsByIDs(ctx, []int64{-1}) require.NoError(t, err2) assert.Empty(t, runs) })` $DIR/core/services/job/job_orm_test.go: `err = orm.CreateJob(testutils.Context(t), &jb)` $DIR/core/services/job/job_orm_test.go: `t.Run("with no pipeline run", func(t *testing.T) { ctx := testutils.Context(t) run, err2 := orm.FindPipelineRunByID(ctx, -1) assert.Equal(t, run, pipeline.Run{}) require.ErrorIs(t, err2, sql.ErrNoRows) })` $DIR/core/services/job/job_orm_test.go: `err = orm.CreateJob(ctx, &jb)` $DIR/core/services/job/job_orm_test.go: `err = db.Get(&jobSpec, "SELECT * FROM jobs")` $DIR/core/services/job/job_orm_test.go: `jb, err = orm.FindJobWithoutSpecErrors(ctx, jobSpec.ID)` $DIR/core/services/job/job_orm_test.go: `err = orm.CreateJob(ctx, &jb)` $DIR/core/services/job/job_orm_test.go: `err = db.Get(&jobSpec, "SELECT * FROM jobs")` $DIR/core/services/job/job_orm_test.go: `err = orm.CreateJob(testutils.Context(t), &jb)` $DIR/core/services/job/job_orm_test.go: `t.Run("with no pipeline runs", func(t *testing.T) { ctx := testutils.Context(t) count, err2 := orm.CountPipelineRunsByJobID(ctx, jb.ID) require.NoError(t, err2) assert.Equal(t, int32(0), count) })` $DIR/core/services/job/job_orm_test.go: `mustInsertPipelineRun(t, pipelineORM, jb)` $DIR/core/services/job/job_orm_test.go: `s.WorkflowName = "notmyworkflow"` $DIR/core/services/job/job_orm_test.go: `s.WorkflowOwner = "not me"` $DIR/core/services/job/job_orm_test.go: `t.Run(tt.name, func(t *testing.T) { ks := cltest.NewKeyStore(t, tt.fields.ds) pipelineORM := pipeline.NewORM(tt.fields.ds, logger.TestLogger(t), configtest.NewTestGeneralConfig(t).JobPipeline().MaxSuccessfulRuns()) bridgesORM := bridges.NewORM(tt.fields.ds) o := NewTestORM(t, tt.fields.ds, pipelineORM, bridgesORM, ks) var wantJobID int32 if tt.args.before != nil { wantJobID = tt.args.before(t, o, tt.args.spec) } ctx := testutils.Context(t) gotJ, err := o.FindJobIDByWorkflow(ctx, tt.args.spec) if (err != nil) != tt.wantErr { t.Errorf("orm.FindJobByWorkflow() error = %v, wantErr %v", err, tt.wantErr) return } if err == nil { assert.Equal(t, wantJobID, gotJ, "mismatch job id") } })` $DIR/core/services/job/job_orm_test.go: `wantJobID = tt.args.before(t, o, tt.args.spec)` $DIR/core/services/job/job_orm_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/job/job_orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/job_orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/job/job_orm_test.go: `.Eth()` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.NewORM(db, logger.TestLogger(t), config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/job_orm_test.go: `.TestLogger(t)` $DIR/core/services/job/job_orm_test.go: `.JobPipeline()` $DIR/core/services/job/job_orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/job_orm_test.go: `.NewORM(db)` $DIR/core/services/job/job_orm_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{})` $DIR/core/services/job/job_orm_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{})` $DIR/core/services/job/job_orm_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.Run("it creates job specs", func(t *testing.T) { err := orm.CreateJob(testutils.Context(t), jb) require.NoError(t, err) var returnedSpec job.Job var OCROracleSpec job.OCROracleSpec err = db.Get(&returnedSpec, "SELECT * FROM jobs WHERE jobs.id = $1", jb.ID) require.NoError(t, err) err = db.Get(&OCROracleSpec, "SELECT * FROM ocr_oracle_specs WHERE ocr_oracle_specs.id = $1", jb.OCROracleSpecID) require.NoError(t, err) returnedSpec.OCROracleSpec = &OCROracleSpec compareOCRJobSpecs(t, *jb, returnedSpec) })` $DIR/core/services/job/job_orm_test.go: `.CreateJob(testutils.Context(t), jb)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.Get(&returnedSpec, "SELECT * FROM jobs WHERE jobs.id = $1", jb.ID)` $DIR/core/services/job/job_orm_test.go: `.Get(&OCROracleSpec, "SELECT * FROM ocr_oracle_specs WHERE ocr_oracle_specs.id = $1", jb.OCROracleSpecID)` $DIR/core/services/job/job_orm_test.go: `.Run("it correctly mark job_pipeline_specs as primary when creating a job", func(t *testing.T) { ctx := testutils.Context(t) jb2 := makeOCRJobSpec(t, address, bridge.Name.String(), bridge2.Name.String()) err := orm.CreateJob(ctx, jb2) require.NoError(t, err) var pipelineSpec pipeline.Spec err = db.Get(&pipelineSpec, "SELECT pipeline_specs.* FROM pipeline_specs JOIN job_pipeline_specs ON (pipeline_specs.id = job_pipeline_specs.pipeline_spec_id) WHERE job_pipeline_specs.job_id = $1", jb2.ID) require.NoError(t, err) var jobPipelineSpec job.PipelineSpec err = db.Get(&jobPipelineSpec, "SELECT * FROM job_pipeline_specs WHERE job_id = $1 AND pipeline_spec_id = $2", jb2.ID, pipelineSpec.ID) require.NoError(t, err) // `jb2.PipelineSpecID` gets loaded when calling `orm.CreateJob()` so we can compare it directly assert.Equal(t, jb2.PipelineSpecID, pipelineSpec.ID) assert.True(t, jobPipelineSpec.IsPrimary) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.CreateJob(ctx, jb2)` $DIR/core/services/job/job_orm_test.go: `.Get(&pipelineSpec, "SELECT pipeline_specs.* FROM pipeline_specs JOIN job_pipeline_specs ON (pipeline_specs.id = job_pipeline_specs.pipeline_spec_id) WHERE job_pipeline_specs.job_id = $1", jb2.ID)` $DIR/core/services/job/job_orm_test.go: `.Get(&jobPipelineSpec, "SELECT * FROM job_pipeline_specs WHERE job_id = $1 AND pipeline_spec_id = $2", jb2.ID, pipelineSpec.ID)` $DIR/core/services/job/job_orm_test.go: `.Run("autogenerates external job ID if missing", func(t *testing.T) { jb2 := makeOCRJobSpec(t, address, bridge.Name.String(), bridge2.Name.String()) jb2.ExternalJobID = uuid.UUID{} err := orm.CreateJob(testutils.Context(t), jb2) require.NoError(t, err) var returnedSpec job.Job err = db.Get(&returnedSpec, "SELECT * FROM jobs WHERE jobs.id = $1", jb.ID) require.NoError(t, err) assert.NotEqual(t, uuid.UUID{}, returnedSpec.ExternalJobID) })` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.CreateJob(testutils.Context(t), jb2)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.Get(&returnedSpec, "SELECT * FROM jobs WHERE jobs.id = $1", jb.ID)` $DIR/core/services/job/job_orm_test.go: `.Run("it deletes jobs from the DB", func(t *testing.T) { var dbSpecs []job.Job err := db.Select(&dbSpecs, "SELECT * FROM jobs") require.NoError(t, err) require.Len(t, dbSpecs, 3) err = orm.DeleteJob(testutils.Context(t), jb.ID) require.NoError(t, err) dbSpecs = []job.Job{} err = db.Select(&dbSpecs, "SELECT * FROM jobs") require.NoError(t, err) require.Len(t, dbSpecs, 2) })` $DIR/core/services/job/job_orm_test.go: `.Select(&dbSpecs, "SELECT * FROM jobs")` $DIR/core/services/job/job_orm_test.go: `.DeleteJob(testutils.Context(t), jb.ID)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.Select(&dbSpecs, "SELECT * FROM jobs")` $DIR/core/services/job/job_orm_test.go: `.Run("increase job spec error occurrence", func(t *testing.T) { ctx := testutils.Context(t) jb3 := makeOCRJobSpec(t, address, bridge.Name.String(), bridge2.Name.String()) err := orm.CreateJob(ctx, jb3) require.NoError(t, err) var jobSpec job.Job err = db.Get(&jobSpec, "SELECT * FROM jobs") require.NoError(t, err) ocrSpecError1 := "ocr spec 1 errored" ocrSpecError2 := "ocr spec 2 errored" require.NoError(t, orm.RecordError(ctx, jobSpec.ID, ocrSpecError1)) require.NoError(t, orm.RecordError(ctx, jobSpec.ID, ocrSpecError1)) require.NoError(t, orm.RecordError(ctx, jobSpec.ID, ocrSpecError2)) var specErrors []job.SpecError err = db.Select(&specErrors, "SELECT * FROM job_spec_errors") require.NoError(t, err) require.Len(t, specErrors, 2) assert.Equal(t, specErrors[0].Occurrences, uint(2)) assert.Equal(t, specErrors[1].Occurrences, uint(1)) assert.True(t, specErrors[0].CreatedAt.Before(specErrors[0].UpdatedAt), "expected created_at (%s) to be before updated_at (%s)", specErrors[0].CreatedAt, specErrors[0].UpdatedAt) assert.Equal(t, specErrors[0].Description, ocrSpecError1) assert.Equal(t, specErrors[1].Description, ocrSpecError2) assert.True(t, specErrors[1].CreatedAt.After(specErrors[0].UpdatedAt)) var j2 job.Job var OCROracleSpec job.OCROracleSpec var jobSpecErrors []job.SpecError err = db.Get(&j2, "SELECT * FROM jobs WHERE jobs.id = $1", jobSpec.ID) require.NoError(t, err) err = db.Get(&OCROracleSpec, "SELECT * FROM ocr_oracle_specs WHERE ocr_oracle_specs.id = $1", j2.OCROracleSpecID) require.NoError(t, err) err = db.Select(&jobSpecErrors, "SELECT * FROM job_spec_errors WHERE job_spec_errors.job_id = $1", j2.ID) require.NoError(t, err) require.Len(t, jobSpecErrors, 2) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.CreateJob(ctx, jb3)` $DIR/core/services/job/job_orm_test.go: `.Get(&jobSpec, "SELECT * FROM jobs")` $DIR/core/services/job/job_orm_test.go: `.Select(&specErrors, "SELECT * FROM job_spec_errors")` $DIR/core/services/job/job_orm_test.go: `.Get(&j2, "SELECT * FROM jobs WHERE jobs.id = $1", jobSpec.ID)` $DIR/core/services/job/job_orm_test.go: `.Get(&OCROracleSpec, "SELECT * FROM ocr_oracle_specs WHERE ocr_oracle_specs.id = $1", j2.OCROracleSpecID)` $DIR/core/services/job/job_orm_test.go: `.Select(&jobSpecErrors, "SELECT * FROM job_spec_errors WHERE job_spec_errors.job_id = $1", j2.ID)` $DIR/core/services/job/job_orm_test.go: `.Run("finds job spec error by ID", func(t *testing.T) { ctx := testutils.Context(t) jb3 := makeOCRJobSpec(t, address, bridge.Name.String(), bridge2.Name.String()) err := orm.CreateJob(ctx, jb3) require.NoError(t, err) var jobSpec job.Job err = db.Get(&jobSpec, "SELECT * FROM jobs") require.NoError(t, err) var specErrors []job.SpecError err = db.Select(&specErrors, "SELECT * FROM job_spec_errors") require.NoError(t, err) require.Len(t, specErrors, 2) ocrSpecError1 := "ocr spec 3 errored" ocrSpecError2 := "ocr spec 4 errored" require.NoError(t, orm.RecordError(ctx, jobSpec.ID, ocrSpecError1)) require.NoError(t, orm.RecordError(ctx, jobSpec.ID, ocrSpecError2)) var updatedSpecError []job.SpecError err = db.Select(&updatedSpecError, "SELECT * FROM job_spec_errors ORDER BY id ASC") require.NoError(t, err) require.Len(t, updatedSpecError, 4) assert.Equal(t, uint(1), updatedSpecError[2].Occurrences) assert.Equal(t, uint(1), updatedSpecError[3].Occurrences) assert.Equal(t, ocrSpecError1, updatedSpecError[2].Description) assert.Equal(t, ocrSpecError2, updatedSpecError[3].Description) dbSpecErr1, err := orm.FindSpecError(ctx, updatedSpecError[2].ID) require.NoError(t, err) dbSpecErr2, err := orm.FindSpecError(ctx, updatedSpecError[3].ID) require.NoError(t, err) assert.Equal(t, uint(1), dbSpecErr1.Occurrences) assert.Equal(t, uint(1), dbSpecErr2.Occurrences) assert.Equal(t, ocrSpecError1, dbSpecErr1.Description) assert.Equal(t, ocrSpecError2, dbSpecErr2.Description) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.CreateJob(ctx, jb3)` $DIR/core/services/job/job_orm_test.go: `.Get(&jobSpec, "SELECT * FROM jobs")` $DIR/core/services/job/job_orm_test.go: `.Select(&specErrors, "SELECT * FROM job_spec_errors")` $DIR/core/services/job/job_orm_test.go: `.Select(&updatedSpecError, "SELECT * FROM job_spec_errors ORDER BY id ASC")` $DIR/core/services/job/job_orm_test.go: `.FindSpecError(ctx, updatedSpecError[2].ID)` $DIR/core/services/job/job_orm_test.go: `.FindSpecError(ctx, updatedSpecError[3].ID)` $DIR/core/services/job/job_orm_test.go: `.Run("creates a job with a direct request spec", func(t *testing.T) { drSpec := fmt.Sprintf(` type = "directrequest" schemaVersion = 1 evmChainID = "0" name = "example eth request event spec" contractAddress = "0x613a38AC1659769640aaE063C651F48E0250454C" externalJobID = "%s" observationSource = """ ds1 [type=http method=GET url="http://example.com" allowunrestrictednetworkaccess="true"]; ds1_merge [type=merge left="{}"] ds1_parse [type=jsonparse path="USD"]; ds1_multiply [type=multiply times=100]; ds1 -> ds1_parse -> ds1_multiply; """ `, uuid.New()) drJob, err := directrequest.ValidatedDirectRequestSpec(drSpec) require.NoError(t, err) err = orm.CreateJob(testutils.Context(t), &drJob) require.NoError(t, err) })` $DIR/core/services/job/job_orm_test.go: `.Sprintf(` type = "directrequest" schemaVersion = 1 evmChainID = "0" name = "example eth request event spec" contractAddress = "0x613a38AC1659769640aaE063C651F48E0250454C" externalJobID = "%s" observationSource = """ ds1 [type=http method=GET url="http://example.com" allowunrestrictednetworkaccess="true"]; ds1_merge [type=merge left="{}"] ds1_parse [type=jsonparse path="USD"]; ds1_multiply [type=multiply times=100]; ds1 -> ds1_parse -> ds1_multiply; """ `, uuid.New())` $DIR/core/services/job/job_orm_test.go: `.New()` $DIR/core/services/job/job_orm_test.go: `.ValidatedDirectRequestSpec(drSpec)` $DIR/core/services/job/job_orm_test.go: `.CreateJob(testutils.Context(t), &drJob)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.Run("creates webhook specs along with external_initiator_webhook_specs", func(t *testing.T) { ctx := testutils.Context(t) eiFoo := cltest.MustInsertExternalInitiator(t, borm) eiBar := cltest.MustInsertExternalInitiator(t, borm) eiWS := []webhook.TOMLWebhookSpecExternalInitiator{ {Name: eiFoo.Name, Spec: cltest.JSONFromString(t, `{}`)}, {Name: eiBar.Name, Spec: cltest.JSONFromString(t, `{"bar": 1}`)}, } eim := webhook.NewExternalInitiatorManager(db, nil) jb, err := webhook.ValidatedWebhookSpec(ctx, testspecs.GenerateWebhookSpec(testspecs.WebhookSpecParams{ExternalInitiators: eiWS}).Toml(), eim) require.NoError(t, err) err = orm.CreateJob(testutils.Context(t), &jb) require.NoError(t, err) cltest.AssertCount(t, db, "external_initiator_webhook_specs", 2) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.MustInsertExternalInitiator(t, borm)` $DIR/core/services/job/job_orm_test.go: `.MustInsertExternalInitiator(t, borm)` $DIR/core/services/job/job_orm_test.go: `.JSONFromString(t, `{}`)` $DIR/core/services/job/job_orm_test.go: `.JSONFromString(t, `{"bar": 1}`)` $DIR/core/services/job/job_orm_test.go: `.NewExternalInitiatorManager(db, nil)` $DIR/core/services/job/job_orm_test.go: `.ValidatedWebhookSpec(ctx, testspecs.GenerateWebhookSpec(testspecs.WebhookSpecParams{ExternalInitiators: eiWS}).Toml(), eim)` $DIR/core/services/job/job_orm_test.go: `.GenerateWebhookSpec(testspecs.WebhookSpecParams{ExternalInitiators: eiWS})` $DIR/core/services/job/job_orm_test.go: `.Toml()` $DIR/core/services/job/job_orm_test.go: `.CreateJob(testutils.Context(t), &jb)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "external_initiator_webhook_specs", 2)` $DIR/core/services/job/job_orm_test.go: `.Run("it creates and deletes records for blockhash store jobs", func(t *testing.T) { ctx := testutils.Context(t) bhsJob, err := blockhashstore.ValidatedSpec( testspecs.GenerateBlockhashStoreSpec(testspecs.BlockhashStoreSpecParams{}).Toml()) require.NoError(t, err) err = orm.CreateJob(ctx, &bhsJob) require.NoError(t, err) savedJob, err := orm.FindJob(testutils.Context(t), bhsJob.ID) require.NoError(t, err) require.Equal(t, bhsJob.ID, savedJob.ID) require.Equal(t, bhsJob.Type, savedJob.Type) require.Equal(t, bhsJob.BlockhashStoreSpec.ID, savedJob.BlockhashStoreSpec.ID) require.Equal(t, bhsJob.BlockhashStoreSpec.CoordinatorV1Address, savedJob.BlockhashStoreSpec.CoordinatorV1Address) require.Equal(t, bhsJob.BlockhashStoreSpec.CoordinatorV2Address, savedJob.BlockhashStoreSpec.CoordinatorV2Address) require.Equal(t, bhsJob.BlockhashStoreSpec.CoordinatorV2PlusAddress, savedJob.BlockhashStoreSpec.CoordinatorV2PlusAddress) require.Equal(t, bhsJob.BlockhashStoreSpec.WaitBlocks, savedJob.BlockhashStoreSpec.WaitBlocks) require.Equal(t, bhsJob.BlockhashStoreSpec.LookbackBlocks, savedJob.BlockhashStoreSpec.LookbackBlocks) require.Equal(t, bhsJob.BlockhashStoreSpec.HeartbeatPeriod, savedJob.BlockhashStoreSpec.HeartbeatPeriod) require.Equal(t, bhsJob.BlockhashStoreSpec.BlockhashStoreAddress, savedJob.BlockhashStoreSpec.BlockhashStoreAddress) require.Equal(t, bhsJob.BlockhashStoreSpec.TrustedBlockhashStoreAddress, savedJob.BlockhashStoreSpec.TrustedBlockhashStoreAddress) require.Equal(t, bhsJob.BlockhashStoreSpec.TrustedBlockhashStoreBatchSize, savedJob.BlockhashStoreSpec.TrustedBlockhashStoreBatchSize) require.Equal(t, bhsJob.BlockhashStoreSpec.PollPeriod, savedJob.BlockhashStoreSpec.PollPeriod) require.Equal(t, bhsJob.BlockhashStoreSpec.RunTimeout, savedJob.BlockhashStoreSpec.RunTimeout) require.Equal(t, bhsJob.BlockhashStoreSpec.EVMChainID, savedJob.BlockhashStoreSpec.EVMChainID) require.Equal(t, bhsJob.BlockhashStoreSpec.FromAddresses, savedJob.BlockhashStoreSpec.FromAddresses) err = orm.DeleteJob(ctx, bhsJob.ID) require.NoError(t, err) _, err = orm.FindJob(testutils.Context(t), bhsJob.ID) require.Error(t, err) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.ValidatedSpec( testspecs.GenerateBlockhashStoreSpec(testspecs.BlockhashStoreSpecParams{}).Toml())` $DIR/core/services/job/job_orm_test.go: `.GenerateBlockhashStoreSpec(testspecs.BlockhashStoreSpecParams{})` $DIR/core/services/job/job_orm_test.go: `.Toml()` $DIR/core/services/job/job_orm_test.go: `.CreateJob(ctx, &bhsJob)` $DIR/core/services/job/job_orm_test.go: `.FindJob(testutils.Context(t), bhsJob.ID)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.DeleteJob(ctx, bhsJob.ID)` $DIR/core/services/job/job_orm_test.go: `.FindJob(testutils.Context(t), bhsJob.ID)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.ValidatedSpec( testspecs.GenerateBlockHeaderFeederSpec(testspecs.BlockHeaderFeederSpecParams{}).Toml())` $DIR/core/services/job/job_orm_test.go: `.GenerateBlockHeaderFeederSpec(testspecs.BlockHeaderFeederSpecParams{})` $DIR/core/services/job/job_orm_test.go: `.Toml()` $DIR/core/services/job/job_orm_test.go: `.CreateJob(ctx, &bhsJob)` $DIR/core/services/job/job_orm_test.go: `.FindJob(testutils.Context(t), bhsJob.ID)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.DeleteJob(ctx, bhsJob.ID)` $DIR/core/services/job/job_orm_test.go: `.FindJob(testutils.Context(t), bhsJob.ID)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.NewGeneralConfig(t, nil)` $DIR/core/services/job/job_orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/job_orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/job/job_orm_test.go: `.TestLogger(t)` $DIR/core/services/job/job_orm_test.go: `.NewORM(db, lggr, config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/job_orm_test.go: `.JobPipeline()` $DIR/core/services/job/job_orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/job_orm_test.go: `.NewORM(db)` $DIR/core/services/job/job_orm_test.go: `.NewORM(db, logger.TestLogger(t))` $DIR/core/services/job/job_orm_test.go: `.TestLogger(t)` $DIR/core/services/job/job_orm_test.go: `.Run("it deletes records for offchainreporting jobs", func(t *testing.T) { ctx := testutils.Context(t) _, bridge := cltest.MustCreateBridge(t, db, cltest.BridgeOpts{}) _, bridge2 := cltest.MustCreateBridge(t, db, cltest.BridgeOpts{}) _, address := cltest.MustInsertRandomKey(t, keyStore.Eth()) relayExtenders := evmtest.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, GeneralConfig: config, KeyStore: keyStore.Eth()}) legacyChains := evmrelay.NewLegacyChainsFromRelayerExtenders(relayExtenders) jb, err := ocr.ValidatedOracleSpecToml(config, legacyChains, testspecs.GenerateOCRSpec(testspecs.OCRSpecParams{ TransmitterAddress: address.Hex(), DS1BridgeName: bridge.Name.String(), DS2BridgeName: bridge2.Name.String(), }).Toml()) require.NoError(t, err) err = jobORM.CreateJob(ctx, &jb) require.NoError(t, err) cltest.AssertCount(t, db, "ocr_oracle_specs", 1) cltest.AssertCount(t, db, "pipeline_specs", 1) err = jobORM.DeleteJob(ctx, jb.ID) require.NoError(t, err) cltest.AssertCount(t, db, "ocr_oracle_specs", 0) cltest.AssertCount(t, db, "pipeline_specs", 0) cltest.AssertCount(t, db, "jobs", 0) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{})` $DIR/core/services/job/job_orm_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{})` $DIR/core/services/job/job_orm_test.go: `.MustInsertRandomKey(t, keyStore.Eth())` $DIR/core/services/job/job_orm_test.go: `.Eth()` $DIR/core/services/job/job_orm_test.go: `.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, GeneralConfig: config, KeyStore: keyStore.Eth()})` $DIR/core/services/job/job_orm_test.go: `.Eth()` $DIR/core/services/job/job_orm_test.go: `.NewLegacyChainsFromRelayerExtenders(relayExtenders)` $DIR/core/services/job/job_orm_test.go: `.ValidatedOracleSpecToml(config, legacyChains, testspecs.GenerateOCRSpec(testspecs.OCRSpecParams{ TransmitterAddress: address.Hex(), DS1BridgeName: bridge.Name.String(), DS2BridgeName: bridge2.Name.String(), }).Toml())` $DIR/core/services/job/job_orm_test.go: `.GenerateOCRSpec(testspecs.OCRSpecParams{ TransmitterAddress: address.Hex(), DS1BridgeName: bridge.Name.String(), DS2BridgeName: bridge2.Name.String(), })` $DIR/core/services/job/job_orm_test.go: `.Hex()` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.Toml()` $DIR/core/services/job/job_orm_test.go: `.CreateJob(ctx, &jb)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "ocr_oracle_specs", 1)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "pipeline_specs", 1)` $DIR/core/services/job/job_orm_test.go: `.DeleteJob(ctx, jb.ID)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "ocr_oracle_specs", 0)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "pipeline_specs", 0)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "jobs", 0)` $DIR/core/services/job/job_orm_test.go: `.Run("it deletes records for keeper jobs", func(t *testing.T) { ctx := testutils.Context(t) registry, keeperJob := cltest.MustInsertKeeperRegistry(t, db, korm, keyStore.Eth(), 0, 1, 20) cltest.MustInsertUpkeepForRegistry(t, db, registry) cltest.AssertCount(t, db, "keeper_specs", 1) cltest.AssertCount(t, db, "keeper_registries", 1) cltest.AssertCount(t, db, "upkeep_registrations", 1) err := jobORM.DeleteJob(ctx, keeperJob.ID) require.NoError(t, err) cltest.AssertCount(t, db, "keeper_specs", 0) cltest.AssertCount(t, db, "keeper_registries", 0) cltest.AssertCount(t, db, "upkeep_registrations", 0) cltest.AssertCount(t, db, "jobs", 0) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.MustInsertKeeperRegistry(t, db, korm, keyStore.Eth(), 0, 1, 20)` $DIR/core/services/job/job_orm_test.go: `.Eth()` $DIR/core/services/job/job_orm_test.go: `.MustInsertUpkeepForRegistry(t, db, registry)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "keeper_specs", 1)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "keeper_registries", 1)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/job/job_orm_test.go: `.DeleteJob(ctx, keeperJob.ID)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "keeper_specs", 0)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "keeper_registries", 0)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "upkeep_registrations", 0)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "jobs", 0)` $DIR/core/services/job/job_orm_test.go: `.Run("it creates and deletes records for vrf jobs", func(t *testing.T) { ctx := testutils.Context(t) key, err := keyStore.VRF().Create(ctx) require.NoError(t, err) pk := key.PublicKey jb, err := vrfcommon.ValidatedVRFSpec(testspecs.GenerateVRFSpec(testspecs.VRFSpecParams{PublicKey: pk.String()}).Toml()) require.NoError(t, err) err = jobORM.CreateJob(ctx, &jb) require.NoError(t, err) cltest.AssertCount(t, db, "vrf_specs", 1) cltest.AssertCount(t, db, "jobs", 1) err = jobORM.DeleteJob(ctx, jb.ID) require.NoError(t, err) cltest.AssertCount(t, db, "vrf_specs", 0) cltest.AssertCount(t, db, "jobs", 0) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.VRF()` $DIR/core/services/job/job_orm_test.go: `.Create(ctx)` $DIR/core/services/job/job_orm_test.go: `.ValidatedVRFSpec(testspecs.GenerateVRFSpec(testspecs.VRFSpecParams{PublicKey: pk.String()}).Toml())` $DIR/core/services/job/job_orm_test.go: `.GenerateVRFSpec(testspecs.VRFSpecParams{PublicKey: pk.String()})` $DIR/core/services/job/job_orm_test.go: `.String()` $DIR/core/services/job/job_orm_test.go: `.Toml()` $DIR/core/services/job/job_orm_test.go: `.CreateJob(ctx, &jb)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "vrf_specs", 1)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "jobs", 1)` $DIR/core/services/job/job_orm_test.go: `.DeleteJob(ctx, jb.ID)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "vrf_specs", 0)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "jobs", 0)` $DIR/core/services/job/job_orm_test.go: `.Run("it deletes records for webhook jobs", func(t *testing.T) { ctx := testutils.Context(t) ei := cltest.MustInsertExternalInitiator(t, bridges.NewORM(db)) jb, webhookSpec := cltest.MustInsertWebhookSpec(t, db) _, err := db.Exec(`INSERT INTO external_initiator_webhook_specs (external_initiator_id, webhook_spec_id, spec) VALUES ($1,$2,$3)`, ei.ID, webhookSpec.ID, `{"ei": "foo", "name": "webhookSpecTwoEIs"}`) require.NoError(t, err) err = jobORM.DeleteJob(ctx, jb.ID) require.NoError(t, err) cltest.AssertCount(t, db, "webhook_specs", 0) cltest.AssertCount(t, db, "external_initiator_webhook_specs", 0) cltest.AssertCount(t, db, "jobs", 0) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.MustInsertExternalInitiator(t, bridges.NewORM(db))` $DIR/core/services/job/job_orm_test.go: `.NewORM(db)` $DIR/core/services/job/job_orm_test.go: `.MustInsertWebhookSpec(t, db)` $DIR/core/services/job/job_orm_test.go: `.Exec(`INSERT INTO external_initiator_webhook_specs (external_initiator_id, webhook_spec_id, spec) VALUES ($1,$2,$3)`, ei.ID, webhookSpec.ID, `{"ei": "foo", "name": "webhookSpecTwoEIs"}`)` $DIR/core/services/job/job_orm_test.go: `.DeleteJob(ctx, jb.ID)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "webhook_specs", 0)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "external_initiator_webhook_specs", 0)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "jobs", 0)` $DIR/core/services/job/job_orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/job_orm_test.go: `.MustInsertExternalInitiator(t, bridges.NewORM(db))` $DIR/core/services/job/job_orm_test.go: `.NewORM(db)` $DIR/core/services/job/job_orm_test.go: `.MustInsertWebhookSpec(t, db)` $DIR/core/services/job/job_orm_test.go: `.Exec(`INSERT INTO external_initiator_webhook_specs (external_initiator_id, webhook_spec_id, spec) VALUES ($1,$2,$3)`, ei.ID, webhookSpec.ID, `{"ei": "foo", "name": "webhookSpecTwoEIs"}`)` $DIR/core/services/job/job_orm_test.go: `.Exec(`DELETE FROM external_initiators`)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/job/job_orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/job_orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/job/job_orm_test.go: `.TestLogger(t)` $DIR/core/services/job/job_orm_test.go: `.NewORM(db, lggr, config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/job_orm_test.go: `.JobPipeline()` $DIR/core/services/job/job_orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/job_orm_test.go: `.NewORM(db)` $DIR/core/services/job/job_orm_test.go: `.NewEIP55Address()` $DIR/core/services/job/job_orm_test.go: `.String()` $DIR/core/services/job/job_orm_test.go: `.NewEIP55Address()` $DIR/core/services/job/job_orm_test.go: `.String()` $DIR/core/services/job/job_orm_test.go: `.ValidatedVRFSpec(testspecs.GenerateVRFSpec( testspecs.VRFSpecParams{ RequestedConfsDelay: 10, FromAddresses: fromAddresses, ChunkSize: 25, BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(100), VRFOwnerAddress: "0x32891BD79647DC9136Fc0a59AAB48c7825eb624c", }). Toml())` $DIR/core/services/job/job_orm_test.go: `.GenerateVRFSpec( testspecs.VRFSpecParams{ RequestedConfsDelay: 10, FromAddresses: fromAddresses, ChunkSize: 25, BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(100), VRFOwnerAddress: "0x32891BD79647DC9136Fc0a59AAB48c7825eb624c", })` $DIR/core/services/job/job_orm_test.go: `.GWei(100)` $DIR/core/services/job/job_orm_test.go: `. Toml()` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "vrf_specs", 1)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "jobs", 1)` $DIR/core/services/job/job_orm_test.go: `.BytesToAddress(b)` $DIR/core/services/job/job_orm_test.go: `.String()` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "vrf_specs", 0)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "jobs", 0)` $DIR/core/services/job/job_orm_test.go: `.ValidatedVRFSpec(testspecs.GenerateVRFSpec(testspecs.VRFSpecParams{RequestTimeout: 1 * time.Hour}).Toml())` $DIR/core/services/job/job_orm_test.go: `.GenerateVRFSpec(testspecs.VRFSpecParams{RequestTimeout: 1 * time.Hour})` $DIR/core/services/job/job_orm_test.go: `.Toml()` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "vrf_specs", 1)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "jobs", 1)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "vrf_specs", 0)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/job/job_orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/job_orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/job/job_orm_test.go: `.TestLogger(t)` $DIR/core/services/job/job_orm_test.go: `.NewORM(db, lggr, config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/job_orm_test.go: `.JobPipeline()` $DIR/core/services/job/job_orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/job_orm_test.go: `.NewORM(db)` $DIR/core/services/job/job_orm_test.go: `.NewEIP55Address()` $DIR/core/services/job/job_orm_test.go: `.String()` $DIR/core/services/job/job_orm_test.go: `.NewEIP55Address()` $DIR/core/services/job/job_orm_test.go: `.String()` $DIR/core/services/job/job_orm_test.go: `.ValidatedVRFSpec(testspecs.GenerateVRFSpec( testspecs.VRFSpecParams{ VRFVersion: vrfcommon.V2Plus, RequestedConfsDelay: 10, FromAddresses: fromAddresses, ChunkSize: 25, BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(100), CustomRevertsPipelineEnabled: true, }). Toml())` $DIR/core/services/job/job_orm_test.go: `.GenerateVRFSpec( testspecs.VRFSpecParams{ VRFVersion: vrfcommon.V2Plus, RequestedConfsDelay: 10, FromAddresses: fromAddresses, ChunkSize: 25, BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(100), CustomRevertsPipelineEnabled: true, })` $DIR/core/services/job/job_orm_test.go: `.GWei(100)` $DIR/core/services/job/job_orm_test.go: `. Toml()` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "vrf_specs", 1)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "jobs", 1)` $DIR/core/services/job/job_orm_test.go: `.BytesToAddress(b)` $DIR/core/services/job/job_orm_test.go: `.String()` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "vrf_specs", 0)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "jobs", 0)` $DIR/core/services/job/job_orm_test.go: `.ValidatedVRFSpec(testspecs.GenerateVRFSpec(testspecs.VRFSpecParams{ VRFVersion: vrfcommon.V2Plus, RequestTimeout: 1 * time.Hour, FromAddresses: fromAddresses, }).Toml())` $DIR/core/services/job/job_orm_test.go: `.GenerateVRFSpec(testspecs.VRFSpecParams{ VRFVersion: vrfcommon.V2Plus, RequestTimeout: 1 * time.Hour, FromAddresses: fromAddresses, })` $DIR/core/services/job/job_orm_test.go: `.Toml()` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "vrf_specs", 1)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "jobs", 1)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "vrf_specs", 0)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/job/job_orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/job_orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/job/job_orm_test.go: `.TestLogger(t)` $DIR/core/services/job/job_orm_test.go: `.NewORM(db, lggr, config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/job_orm_test.go: `.JobPipeline()` $DIR/core/services/job/job_orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/job_orm_test.go: `.NewORM(db)` $DIR/core/services/job/job_orm_test.go: `.ValidatedBootstrapSpecToml(testspecs.GetOCRBootstrapSpec())` $DIR/core/services/job/job_orm_test.go: `.GetOCRBootstrapSpec()` $DIR/core/services/job/job_orm_test.go: `.CreateJob(ctx, &jb)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "bootstrap_specs", 1)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "jobs", 1)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "bootstrap_specs", 0)` $DIR/core/services/job/job_orm_test.go: `.NewGeneralConfig(t, nil)` $DIR/core/services/job/job_orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/job_orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/job/job_orm_test.go: `.TestLogger(t)` $DIR/core/services/job/job_orm_test.go: `.NewORM(db, lggr, config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/job_orm_test.go: `.JobPipeline()` $DIR/core/services/job/job_orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/job_orm_test.go: `.NewORM(db)` $DIR/core/services/job/job_orm_test.go: `.Run("evm chain id validation for ocr works", func(t *testing.T) { jb := job.Job{ Type: job.OffchainReporting, OCROracleSpec: &job.OCROracleSpec{}, } assert.Equal(t, "CreateJobFailed: evm chain id must be defined", jobORM.CreateJob(testutils.Context(t), &jb).Error()) })` $DIR/core/services/job/job_orm_test.go: `.Run("evm chain id validation for direct request works", func(t *testing.T) { jb := job.Job{ Type: job.DirectRequest, DirectRequestSpec: &job.DirectRequestSpec{}, } assert.Equal(t, "CreateJobFailed: evm chain id must be defined", jobORM.CreateJob(testutils.Context(t), &jb).Error()) })` $DIR/core/services/job/job_orm_test.go: `.Run("evm chain id validation for flux monitor works", func(t *testing.T) { jb := job.Job{ Type: job.FluxMonitor, FluxMonitorSpec: &job.FluxMonitorSpec{}, } assert.Equal(t, "CreateJobFailed: evm chain id must be defined", jobORM.CreateJob(testutils.Context(t), &jb).Error()) })` $DIR/core/services/job/job_orm_test.go: `.Run("evm chain id validation for keepers works", func(t *testing.T) { jb := job.Job{ Type: job.Keeper, KeeperSpec: &job.KeeperSpec{}, } assert.Equal(t, "CreateJobFailed: evm chain id must be defined", jobORM.CreateJob(testutils.Context(t), &jb).Error()) })` $DIR/core/services/job/job_orm_test.go: `.Run("evm chain id validation for vrf works", func(t *testing.T) { jb := job.Job{ Type: job.VRF, VRFSpec: &job.VRFSpec{}, } assert.Equal(t, "CreateJobFailed: evm chain id must be defined", jobORM.CreateJob(testutils.Context(t), &jb).Error()) })` $DIR/core/services/job/job_orm_test.go: `.Run("evm chain id validation for block hash store works", func(t *testing.T) { jb := job.Job{ Type: job.BlockhashStore, BlockhashStoreSpec: &job.BlockhashStoreSpec{}, } assert.Equal(t, "CreateJobFailed: evm chain id must be defined", jobORM.CreateJob(testutils.Context(t), &jb).Error()) })` $DIR/core/services/job/job_orm_test.go: `.Run("evm chain id validation for block header feeder works", func(t *testing.T) { jb := job.Job{ Type: job.BlockHeaderFeeder, BlockHeaderFeederSpec: &job.BlockHeaderFeederSpec{}, } assert.Equal(t, "CreateJobFailed: evm chain id must be defined", jobORM.CreateJob(testutils.Context(t), &jb).Error()) })` $DIR/core/services/job/job_orm_test.go: `.Run("evm chain id validation for legacy gas station server spec works", func(t *testing.T) { jb := job.Job{ Type: job.LegacyGasStationServer, LegacyGasStationServerSpec: &job.LegacyGasStationServerSpec{}, } assert.Equal(t, "CreateJobFailed: evm chain id must be defined", jobORM.CreateJob(testutils.Context(t), &jb).Error()) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.New(testutils.NewRandomEVMChainID())` $DIR/core/services/job/job_orm_test.go: `.NewRandomEVMChainID()` $DIR/core/services/job/job_orm_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { enabled := true c.EVM = append(c.EVM, &evmcfg.EVMConfig{ ChainID: customChainID, Chain: evmcfg.Defaults(customChainID), Enabled: &enabled, Nodes: evmcfg.EVMNodes{{}}, }) })` $DIR/core/services/job/job_orm_test.go: `.Defaults(customChainID)` $DIR/core/services/job/job_orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/job_orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/job/job_orm_test.go: `.TestLogger(t)` $DIR/core/services/job/job_orm_test.go: `.NewORM(db, lggr, config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/job_orm_test.go: `.JobPipeline()` $DIR/core/services/job/job_orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/job_orm_test.go: `.NewORM(db)` $DIR/core/services/job/job_orm_test.go: `.MustInsertRandomKey(t, keyStore.Eth())` $DIR/core/services/job/job_orm_test.go: `.Eth()` $DIR/core/services/job/job_orm_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{})` $DIR/core/services/job/job_orm_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{})` $DIR/core/services/job/job_orm_test.go: `.New()` $DIR/core/services/job/job_orm_test.go: `.GenerateOCRSpec(testspecs.OCRSpecParams{ Name: "job3", EVMChainID: customChainID.String(), DS1BridgeName: bridge.Name.String(), DS2BridgeName: bridge2.Name.String(), TransmitterAddress: address.Hex(), JobID: externalJobID.UUID.String(), })` $DIR/core/services/job/job_orm_test.go: `.String()` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.Hex()` $DIR/core/services/job/job_orm_test.go: `.UUID.String()` $DIR/core/services/job/job_orm_test.go: `.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, GeneralConfig: config, KeyStore: keyStore.Eth()})` $DIR/core/services/job/job_orm_test.go: `.Eth()` $DIR/core/services/job/job_orm_test.go: `.NewLegacyChainsFromRelayerExtenders(relayExtenders)` $DIR/core/services/job/job_orm_test.go: `.ValidatedOracleSpecToml(config, legacyChains, spec.Toml())` $DIR/core/services/job/job_orm_test.go: `.Toml()` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.CreateJob(ctx, &jb)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "ocr_oracle_specs", 1)` $DIR/core/services/job/job_orm_test.go: `.AssertCount(t, db, "jobs", 1)` $DIR/core/services/job/job_orm_test.go: `.New()` $DIR/core/services/job/job_orm_test.go: `.UUID.String()` $DIR/core/services/job/job_orm_test.go: `.ValidatedOracleSpecToml(config, legacyChains, spec.Toml())` $DIR/core/services/job/job_orm_test.go: `.Toml()` $DIR/core/services/job/job_orm_test.go: `.CreateJob(ctx, &jba)` $DIR/core/services/job/job_orm_test.go: `.New()` $DIR/core/services/job/job_orm_test.go: `.UUID.String()` $DIR/core/services/job/job_orm_test.go: `.ValidatedOracleSpecToml(config, legacyChains, spec.Toml())` $DIR/core/services/job/job_orm_test.go: `.Toml()` $DIR/core/services/job/job_orm_test.go: `.CreateJob(ctx, &jb2)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.New(testutils.NewRandomEVMChainID())` $DIR/core/services/job/job_orm_test.go: `.NewRandomEVMChainID()` $DIR/core/services/job/job_orm_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { enabled := true c.EVM = append(c.EVM, &evmcfg.EVMConfig{ ChainID: customChainID, Chain: evmcfg.Defaults(customChainID), Enabled: &enabled, Nodes: evmcfg.EVMNodes{{}}, }) })` $DIR/core/services/job/job_orm_test.go: `.Defaults(customChainID)` $DIR/core/services/job/job_orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/job_orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/job/job_orm_test.go: `.TestLogger(t)` $DIR/core/services/job/job_orm_test.go: `.NewORM(db, lggr, config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/job_orm_test.go: `.JobPipeline()` $DIR/core/services/job/job_orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/job_orm_test.go: `.NewORM(db)` $DIR/core/services/job/job_orm_test.go: `.MustInsertRandomKey(t, keyStore.Eth())` $DIR/core/services/job/job_orm_test.go: `.Eth()` $DIR/core/services/job/job_orm_test.go: `.ValidatedOracleSpecToml(testutils.Context(t), config.OCR2(), config.Insecure(), testspecs.GetOCR2EVMSpecMinimal(), nil)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.OCR2()` $DIR/core/services/job/job_orm_test.go: `.Insecure()` $DIR/core/services/job/job_orm_test.go: `.GetOCR2EVMSpecMinimal()` $DIR/core/services/job/job_orm_test.go: `.StringFrom("Job 1")` $DIR/core/services/job/job_orm_test.go: `.StringFrom(address.String())` $DIR/core/services/job/job_orm_test.go: `.String()` $DIR/core/services/job/job_orm_test.go: `.CreateJob(ctx, &jb)` $DIR/core/services/job/job_orm_test.go: `.ValidatedOracleSpecToml(testutils.Context(t), config.OCR2(), config.Insecure(), testspecs.GetOCR2EVMSpecMinimal(), nil)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.OCR2()` $DIR/core/services/job/job_orm_test.go: `.Insecure()` $DIR/core/services/job/job_orm_test.go: `.GetOCR2EVMSpecMinimal()` $DIR/core/services/job/job_orm_test.go: `.StringFrom("Job with same chain id & contract address")` $DIR/core/services/job/job_orm_test.go: `.StringFrom(address.String())` $DIR/core/services/job/job_orm_test.go: `.String()` $DIR/core/services/job/job_orm_test.go: `.CreateJob(ctx, &jb2)` $DIR/core/services/job/job_orm_test.go: `.ValidatedOracleSpecToml(testutils.Context(t), config.OCR2(), config.Insecure(), testspecs.GetOCR2EVMSpecMinimal(), nil)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.OCR2()` $DIR/core/services/job/job_orm_test.go: `.Insecure()` $DIR/core/services/job/job_orm_test.go: `.GetOCR2EVMSpecMinimal()` $DIR/core/services/job/job_orm_test.go: `.StringFrom("Job with different chain id & same contract address")` $DIR/core/services/job/job_orm_test.go: `.StringFrom(address.String())` $DIR/core/services/job/job_orm_test.go: `.String()` $DIR/core/services/job/job_orm_test.go: `.Int64()` $DIR/core/services/job/job_orm_test.go: `.CreateJob(ctx, &jb3)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.New(testutils.NewRandomEVMChainID())` $DIR/core/services/job/job_orm_test.go: `.NewRandomEVMChainID()` $DIR/core/services/job/job_orm_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { enabled := true c.EVM = append(c.EVM, &evmcfg.EVMConfig{ ChainID: customChainID, Chain: evmcfg.Defaults(customChainID), Enabled: &enabled, Nodes: evmcfg.EVMNodes{{}}, }) })` $DIR/core/services/job/job_orm_test.go: `.Defaults(customChainID)` $DIR/core/services/job/job_orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/job_orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/job/job_orm_test.go: `.TestLogger(t)` $DIR/core/services/job/job_orm_test.go: `.NewORM(db, lggr, config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/job_orm_test.go: `.JobPipeline()` $DIR/core/services/job/job_orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/job_orm_test.go: `.NewORM(db)` $DIR/core/services/job/job_orm_test.go: `.ValidatedOracleSpecToml(testutils.Context(t), config.OCR2(), config.Insecure(), testspecs.GetOCR2EVMSpecMinimal(), nil)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.OCR2()` $DIR/core/services/job/job_orm_test.go: `.Insecure()` $DIR/core/services/job/job_orm_test.go: `.GetOCR2EVMSpecMinimal()` $DIR/core/services/job/job_orm_test.go: `.Run("sending keys or transmitterID must be defined", func(t *testing.T) { ctx := testutils.Context(t) jb.OCR2OracleSpec.TransmitterID = null.String{} assert.Equal(t, "CreateJobFailed: neither sending keys nor transmitter ID is defined", jobORM.CreateJob(ctx, &jb).Error()) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.MustInsertRandomKey(t, keyStore.Eth())` $DIR/core/services/job/job_orm_test.go: `.Eth()` $DIR/core/services/job/job_orm_test.go: `.Run("sending keys validation works properly", func(t *testing.T) { ctx := testutils.Context(t) jb.OCR2OracleSpec.TransmitterID = null.String{} _, address2 := cltest.MustInsertRandomKey(t, keyStore.Eth()) jb.OCR2OracleSpec.RelayConfig["sendingKeys"] = interface{}([]any{address.String(), address2.String(), common.HexToAddress("0X0").String()}) assert.Equal(t, "CreateJobFailed: no EVM key matching: \"0x0000000000000000000000000000000000000000\": no such sending key exists", jobORM.CreateJob(ctx, &jb).Error()) jb.OCR2OracleSpec.RelayConfig["sendingKeys"] = interface{}([]any{1, 2, 3}) assert.Equal(t, "CreateJobFailed: sending keys are of wrong type", jobORM.CreateJob(ctx, &jb).Error()) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.MustInsertRandomKey(t, keyStore.Eth())` $DIR/core/services/job/job_orm_test.go: `.Eth()` $DIR/core/services/job/job_orm_test.go: `.String()` $DIR/core/services/job/job_orm_test.go: `.String()` $DIR/core/services/job/job_orm_test.go: `.HexToAddress("0X0")` $DIR/core/services/job/job_orm_test.go: `.String()` $DIR/core/services/job/job_orm_test.go: `.Run("sending keys and transmitter ID can't both be defined", func(t *testing.T) { ctx := testutils.Context(t) jb.OCR2OracleSpec.TransmitterID = null.StringFrom(address.String()) jb.OCR2OracleSpec.RelayConfig["sendingKeys"] = interface{}([]any{address.String()}) assert.Equal(t, "CreateJobFailed: sending keys and transmitter ID can't both be defined", jobORM.CreateJob(ctx, &jb).Error()) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.StringFrom(address.String())` $DIR/core/services/job/job_orm_test.go: `.String()` $DIR/core/services/job/job_orm_test.go: `.String()` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.StringFrom("transmitterID that doesn't have a match in key store")` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) {})` $DIR/core/services/job/job_orm_test.go: `.NewKeyStore(t, pgtest.NewSqlxDB(t))` $DIR/core/services/job/job_orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/job_orm_test.go: `.ValidatedOracleSpecToml(testutils.Context(t), config.OCR2(), config.Insecure(), testspecs.GetOCR2EVMSpecMinimal(), nil)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.OCR2()` $DIR/core/services/job/job_orm_test.go: `.Insecure()` $DIR/core/services/job/job_orm_test.go: `.GetOCR2EVMSpecMinimal()` $DIR/core/services/job/job_orm_test.go: `.Run("test ETH key validation", func(t *testing.T) { ctx := testutils.Context(t) jb.OCR2OracleSpec.Relay = types.NetworkEVM err := job.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, "bad key") require.EqualError(t, err, "no EVM key matching: \"bad key\"") _, evmKey := cltest.MustInsertRandomKey(t, keyStore.Eth()) err = job.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, evmKey.String()) require.NoError(t, err) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, "bad key")` $DIR/core/services/job/job_orm_test.go: `.MustInsertRandomKey(t, keyStore.Eth())` $DIR/core/services/job/job_orm_test.go: `.Eth()` $DIR/core/services/job/job_orm_test.go: `.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, evmKey.String())` $DIR/core/services/job/job_orm_test.go: `.String()` $DIR/core/services/job/job_orm_test.go: `.Run("test Cosmos key validation", func(t *testing.T) { ctx := testutils.Context(t) jb.OCR2OracleSpec.Relay = types.NetworkCosmos err := job.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, "bad key") require.EqualError(t, err, "no Cosmos key matching: \"bad key\"") cosmosKey, err := keyStore.Cosmos().Create(ctx) require.NoError(t, err) err = job.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, cosmosKey.ID()) require.NoError(t, err) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, "bad key")` $DIR/core/services/job/job_orm_test.go: `.Cosmos()` $DIR/core/services/job/job_orm_test.go: `.Create(ctx)` $DIR/core/services/job/job_orm_test.go: `.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, cosmosKey.ID())` $DIR/core/services/job/job_orm_test.go: `.ID()` $DIR/core/services/job/job_orm_test.go: `.Run("test Solana key validation", func(t *testing.T) { ctx := testutils.Context(t) jb.OCR2OracleSpec.Relay = types.NetworkSolana err := job.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, "bad key") require.EqualError(t, err, "no Solana key matching: \"bad key\"") solanaKey, err := keyStore.Solana().Create(ctx) require.NoError(t, err) err = job.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, solanaKey.ID()) require.NoError(t, err) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, "bad key")` $DIR/core/services/job/job_orm_test.go: `.Solana()` $DIR/core/services/job/job_orm_test.go: `.Create(ctx)` $DIR/core/services/job/job_orm_test.go: `.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, solanaKey.ID())` $DIR/core/services/job/job_orm_test.go: `.ID()` $DIR/core/services/job/job_orm_test.go: `.Run("test Starknet key validation", func(t *testing.T) { ctx := testutils.Context(t) jb.OCR2OracleSpec.Relay = types.NetworkStarkNet err := job.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, "bad key") require.EqualError(t, err, "no Starknet key matching: \"bad key\"") starkNetKey, err := keyStore.StarkNet().Create(ctx) require.NoError(t, err) err = job.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, starkNetKey.ID()) require.NoError(t, err) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, "bad key")` $DIR/core/services/job/job_orm_test.go: `.StarkNet()` $DIR/core/services/job/job_orm_test.go: `.Create(ctx)` $DIR/core/services/job/job_orm_test.go: `.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, starkNetKey.ID())` $DIR/core/services/job/job_orm_test.go: `.ID()` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, "bad key")` $DIR/core/services/job/job_orm_test.go: `.CSA()` $DIR/core/services/job/job_orm_test.go: `.Create(ctx)` $DIR/core/services/job/job_orm_test.go: `.ValidateKeyStoreMatch(ctx, jb.OCR2OracleSpec, keyStore, csaKey.ID())` $DIR/core/services/job/job_orm_test.go: `.ID()` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/job/job_orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/job_orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/job/job_orm_test.go: `.NewORM(db, logger.TestLogger(t), config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/job_orm_test.go: `.TestLogger(t)` $DIR/core/services/job/job_orm_test.go: `.JobPipeline()` $DIR/core/services/job/job_orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/job_orm_test.go: `.NewORM(db)` $DIR/core/services/job/job_orm_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{})` $DIR/core/services/job/job_orm_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{})` $DIR/core/services/job/job_orm_test.go: `.MustInsertRandomKey(t, keyStore.Eth())` $DIR/core/services/job/job_orm_test.go: `.Eth()` $DIR/core/services/job/job_orm_test.go: `.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, GeneralConfig: config, KeyStore: keyStore.Eth()})` $DIR/core/services/job/job_orm_test.go: `.Eth()` $DIR/core/services/job/job_orm_test.go: `.NewLegacyChainsFromRelayerExtenders(relayExtenders)` $DIR/core/services/job/job_orm_test.go: `.ValidatedOracleSpecToml(config, legacyChains, testspecs.GenerateOCRSpec(testspecs.OCRSpecParams{ JobID: uuid.New().String(), TransmitterAddress: address.Hex(), DS1BridgeName: bridge.Name.String(), DS2BridgeName: bridge2.Name.String(), }).Toml(), )` $DIR/core/services/job/job_orm_test.go: `.GenerateOCRSpec(testspecs.OCRSpecParams{ JobID: uuid.New().String(), TransmitterAddress: address.Hex(), DS1BridgeName: bridge.Name.String(), DS2BridgeName: bridge2.Name.String(), })` $DIR/core/services/job/job_orm_test.go: `.New()` $DIR/core/services/job/job_orm_test.go: `.String()` $DIR/core/services/job/job_orm_test.go: `.Hex()` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.Toml()` $DIR/core/services/job/job_orm_test.go: `.CreateJob(ctx, &jb1)` $DIR/core/services/job/job_orm_test.go: `.ValidatedDirectRequestSpec( testspecs.GetDirectRequestSpec(), )` $DIR/core/services/job/job_orm_test.go: `.GetDirectRequestSpec()` $DIR/core/services/job/job_orm_test.go: `.CreateJob(ctx, &jb2)` $DIR/core/services/job/job_orm_test.go: `.Run("jobs are ordered by latest first", func(t *testing.T) { jobs, count, err2 := orm.FindJobs(testutils.Context(t), 0, 2) require.NoError(t, err2) require.Len(t, jobs, 2) assert.Equal(t, count, 2) expectedJobs := []job.Job{jb2, jb1} for i, exp := range expectedJobs { assert.Equal(t, exp.ID, jobs[i].ID) } })` $DIR/core/services/job/job_orm_test.go: `.FindJobs(testutils.Context(t), 0, 2)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.FindJobs(testutils.Context(t), 0, 1)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { chainID := big.NewI(1337) enabled := true c.EVM = append(c.EVM, &evmcfg.EVMConfig{ ChainID: chainID, Chain: evmcfg.Defaults(chainID), Enabled: &enabled, Nodes: evmcfg.EVMNodes{{}}, }) })` $DIR/core/services/job/job_orm_test.go: `.NewI(1337)` $DIR/core/services/job/job_orm_test.go: `.Defaults(chainID)` $DIR/core/services/job/job_orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/job_orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/job/job_orm_test.go: `.NewORM(db, logger.TestLogger(t), config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/job_orm_test.go: `.TestLogger(t)` $DIR/core/services/job/job_orm_test.go: `.JobPipeline()` $DIR/core/services/job/job_orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/job_orm_test.go: `.NewORM(db)` $DIR/core/services/job/job_orm_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{})` $DIR/core/services/job/job_orm_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{})` $DIR/core/services/job/job_orm_test.go: `.New()` $DIR/core/services/job/job_orm_test.go: `.MustInsertRandomKey(t, keyStore.Eth())` $DIR/core/services/job/job_orm_test.go: `.Eth()` $DIR/core/services/job/job_orm_test.go: `.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, GeneralConfig: config, KeyStore: keyStore.Eth()})` $DIR/core/services/job/job_orm_test.go: `.Eth()` $DIR/core/services/job/job_orm_test.go: `.NewLegacyChainsFromRelayerExtenders(relayExtenders)` $DIR/core/services/job/job_orm_test.go: `.ValidatedOracleSpecToml(config, legacyChains, testspecs.GenerateOCRSpec(testspecs.OCRSpecParams{ JobID: externalJobID.String(), Name: "orig ocr spec", TransmitterAddress: address.Hex(), DS1BridgeName: bridge.Name.String(), DS2BridgeName: bridge2.Name.String(), }).Toml(), )` $DIR/core/services/job/job_orm_test.go: `.GenerateOCRSpec(testspecs.OCRSpecParams{ JobID: externalJobID.String(), Name: "orig ocr spec", TransmitterAddress: address.Hex(), DS1BridgeName: bridge.Name.String(), DS2BridgeName: bridge2.Name.String(), })` $DIR/core/services/job/job_orm_test.go: `.String()` $DIR/core/services/job/job_orm_test.go: `.Hex()` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.Toml()` $DIR/core/services/job/job_orm_test.go: `.ValidatedOracleSpecToml(config, legacyChains, testspecs.GenerateOCRSpec(testspecs.OCRSpecParams{ JobID: uuid.New().String(), TransmitterAddress: address.Hex(), Name: "ocr spec dup addr", EVMChainID: "1337", DS1BridgeName: bridge.Name.String(), DS2BridgeName: bridge2.Name.String(), }).Toml(), )` $DIR/core/services/job/job_orm_test.go: `.GenerateOCRSpec(testspecs.OCRSpecParams{ JobID: uuid.New().String(), TransmitterAddress: address.Hex(), Name: "ocr spec dup addr", EVMChainID: "1337", DS1BridgeName: bridge.Name.String(), DS2BridgeName: bridge2.Name.String(), })` $DIR/core/services/job/job_orm_test.go: `.New()` $DIR/core/services/job/job_orm_test.go: `.String()` $DIR/core/services/job/job_orm_test.go: `.Hex()` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.Toml()` $DIR/core/services/job/job_orm_test.go: `.ValidatedOracleSpecToml(testutils.Context(t), config.OCR2(), config.Insecure(), testspecs.GetOCR2EVMSpecMinimal(), nil)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.OCR2()` $DIR/core/services/job/job_orm_test.go: `.Insecure()` $DIR/core/services/job/job_orm_test.go: `.GetOCR2EVMSpecMinimal()` $DIR/core/services/job/job_orm_test.go: `.StringFrom(address.String())` $DIR/core/services/job/job_orm_test.go: `.String()` $DIR/core/services/job/job_orm_test.go: `.ValidatedOracleSpecToml( testutils.Context(t), config.OCR2(), config.Insecure(), fmt.Sprintf(mercuryOracleTOML, cltest.DefaultCSAKey.PublicKeyString(), ocr2WithFeedID1), nil, )` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.OCR2()` $DIR/core/services/job/job_orm_test.go: `.Insecure()` $DIR/core/services/job/job_orm_test.go: `.Sprintf(mercuryOracleTOML, cltest.DefaultCSAKey.PublicKeyString(), ocr2WithFeedID1)` $DIR/core/services/job/job_orm_test.go: `.DefaultCSAKey.PublicKeyString()` $DIR/core/services/job/job_orm_test.go: `.ValidatedOracleSpecToml( testutils.Context(t), config.OCR2(), config.Insecure(), fmt.Sprintf(mercuryOracleTOML, cltest.DefaultCSAKey.PublicKeyString(), ocr2WithFeedID2), nil, )` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.OCR2()` $DIR/core/services/job/job_orm_test.go: `.Insecure()` $DIR/core/services/job/job_orm_test.go: `.Sprintf(mercuryOracleTOML, cltest.DefaultCSAKey.PublicKeyString(), ocr2WithFeedID2)` $DIR/core/services/job/job_orm_test.go: `.DefaultCSAKey.PublicKeyString()` $DIR/core/services/job/job_orm_test.go: `.New()` $DIR/core/services/job/job_orm_test.go: `.StringFrom("new name")` $DIR/core/services/job/job_orm_test.go: `.CreateJob(ctx, &job)` $DIR/core/services/job/job_orm_test.go: `.CreateJob(ctx, &jobSameAddress)` $DIR/core/services/job/job_orm_test.go: `.CreateJob(ctx, &jobOCR2)` $DIR/core/services/job/job_orm_test.go: `.CreateJob(ctx, &jobOCR2WithFeedID1)` $DIR/core/services/job/job_orm_test.go: `.CreateJob(ctx, &jobOCR2WithFeedID2)` $DIR/core/services/job/job_orm_test.go: `.Run("by id", func(t *testing.T) { ctx, cancel := context.WithTimeout(testutils.Context(t), 5*time.Second) defer cancel() jb, err2 := orm.FindJob(ctx, job.ID) require.NoError(t, err2) assert.Equal(t, jb.ID, job.ID) assert.Equal(t, jb.Name, job.Name) require.Greater(t, jb.PipelineSpecID, int32(0)) require.NotNil(t, jb.PipelineSpec) require.NotNil(t, jb.OCROracleSpecID) require.NotNil(t, jb.OCROracleSpec) })` $DIR/core/services/job/job_orm_test.go: `.WithTimeout(testutils.Context(t), 5*time.Second)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.FindJob(ctx, job.ID)` $DIR/core/services/job/job_orm_test.go: `.Run("by external job id", func(t *testing.T) { ctx := testutils.Context(t) jb, err2 := orm.FindJobByExternalJobID(ctx, externalJobID) require.NoError(t, err2) assert.Equal(t, jb.ID, job.ID) assert.Equal(t, jb.Name, job.Name) require.Greater(t, jb.PipelineSpecID, int32(0)) require.NotNil(t, jb.PipelineSpec) require.NotNil(t, jb.OCROracleSpecID) require.NotNil(t, jb.OCROracleSpec) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.FindJobByExternalJobID(ctx, externalJobID)` $DIR/core/services/job/job_orm_test.go: `.Run("by address", func(t *testing.T) { ctx := testutils.Context(t) jbID, err2 := orm.FindJobIDByAddress(ctx, job.OCROracleSpec.ContractAddress, job.OCROracleSpec.EVMChainID) require.NoError(t, err2) assert.Equal(t, job.ID, jbID) _, err2 = orm.FindJobIDByAddress(ctx, "not-existing", big.NewI(0)) require.Error(t, err2) require.ErrorIs(t, err2, sql.ErrNoRows) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.FindJobIDByAddress(ctx, job.OCROracleSpec.ContractAddress, job.OCROracleSpec.EVMChainID)` $DIR/core/services/job/job_orm_test.go: `.FindJobIDByAddress(ctx, "not-existing", big.NewI(0))` $DIR/core/services/job/job_orm_test.go: `.NewI(0)` $DIR/core/services/job/job_orm_test.go: `.Run("by address yet chain scoped", func(t *testing.T) { ctx := testutils.Context(t) commonAddr := jobSameAddress.OCROracleSpec.ContractAddress // Find job ID for job on chain 1337 with common address. jbID, err2 := orm.FindJobIDByAddress(ctx, commonAddr, jobSameAddress.OCROracleSpec.EVMChainID) require.NoError(t, err2) assert.Equal(t, jobSameAddress.ID, jbID) // Find job ID for job on default evm chain with common address. jbID, err2 = orm.FindJobIDByAddress(ctx, commonAddr, job.OCROracleSpec.EVMChainID) require.NoError(t, err2) assert.Equal(t, job.ID, jbID) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.FindJobIDByAddress(ctx, commonAddr, jobSameAddress.OCROracleSpec.EVMChainID)` $DIR/core/services/job/job_orm_test.go: `.FindJobIDByAddress(ctx, commonAddr, job.OCROracleSpec.EVMChainID)` $DIR/core/services/job/job_orm_test.go: `.Run("by contract id without feed id", func(t *testing.T) { ctx := testutils.Context(t) contractID := "0x613a38AC1659769640aaE063C651F48E0250454C" // Find job ID for ocr2 job without feedID. jbID, err2 := orm.FindOCR2JobIDByAddress(ctx, contractID, nil) require.NoError(t, err2) assert.Equal(t, jobOCR2.ID, jbID) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.FindOCR2JobIDByAddress(ctx, contractID, nil)` $DIR/core/services/job/job_orm_test.go: `.Run("by contract id with valid feed id", func(t *testing.T) { ctx := testutils.Context(t) contractID := "0x0000000000000000000000000000000000000006" feedID := common.HexToHash(ocr2WithFeedID1) // Find job ID for ocr2 job with feed ID jbID, err2 := orm.FindOCR2JobIDByAddress(ctx, contractID, &feedID) require.NoError(t, err2) assert.Equal(t, jobOCR2WithFeedID1.ID, jbID) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.HexToHash(ocr2WithFeedID1)` $DIR/core/services/job/job_orm_test.go: `.FindOCR2JobIDByAddress(ctx, contractID, &feedID)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.HexToHash(ocr2WithFeedID2)` $DIR/core/services/job/job_orm_test.go: `.FindOCR2JobIDByAddress(ctx, contractID, &feedID)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/job/job_orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/job_orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/job/job_orm_test.go: `.NewORM(db, logger.TestLogger(t), config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/job_orm_test.go: `.TestLogger(t)` $DIR/core/services/job/job_orm_test.go: `.JobPipeline()` $DIR/core/services/job/job_orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/job_orm_test.go: `.NewORM(db)` $DIR/core/services/job/job_orm_test.go: `.ValidatedDirectRequestSpec(testspecs.GetDirectRequestSpec())` $DIR/core/services/job/job_orm_test.go: `.GetDirectRequestSpec()` $DIR/core/services/job/job_orm_test.go: `.NewI(0)` $DIR/core/services/job/job_orm_test.go: `.CreateJob(testutils.Context(t), &jb)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.Run("with jobs", func(t *testing.T) { ctx := testutils.Context(t) jbs, err2 := orm.FindJobsByPipelineSpecIDs(ctx, []int32{jb.PipelineSpecID}) require.NoError(t, err2) assert.Len(t, jbs, 1) assert.Equal(t, jb.ID, jbs[0].ID) assert.Equal(t, jb.Name, jbs[0].Name) require.Greater(t, jbs[0].PipelineSpecID, int32(0)) require.Equal(t, jb.PipelineSpecID, jbs[0].PipelineSpecID) require.NotNil(t, jbs[0].PipelineSpec) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.FindJobsByPipelineSpecIDs(ctx, []int32{jb.PipelineSpecID})` $DIR/core/services/job/job_orm_test.go: `.Run("without jobs", func(t *testing.T) { ctx := testutils.Context(t) jbs, err2 := orm.FindJobsByPipelineSpecIDs(ctx, []int32{-1}) require.NoError(t, err2) assert.Len(t, jbs, 0) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.FindJobsByPipelineSpecIDs(ctx, []int32{-1})` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.FindJobsByPipelineSpecIDs(ctx, []int32{jb.PipelineSpecID})` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/job/job_orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/job_orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/job/job_orm_test.go: `.NewORM(db, logger.TestLogger(t), config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/job_orm_test.go: `.TestLogger(t)` $DIR/core/services/job/job_orm_test.go: `.JobPipeline()` $DIR/core/services/job/job_orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/job_orm_test.go: `.NewORM(db)` $DIR/core/services/job/job_orm_test.go: `.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, GeneralConfig: config, KeyStore: keyStore.Eth()})` $DIR/core/services/job/job_orm_test.go: `.Eth()` $DIR/core/services/job/job_orm_test.go: `.NewLegacyChainsFromRelayerExtenders(relayExtenders)` $DIR/core/services/job/job_orm_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{})` $DIR/core/services/job/job_orm_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{})` $DIR/core/services/job/job_orm_test.go: `.New()` $DIR/core/services/job/job_orm_test.go: `.MustInsertRandomKey(t, keyStore.Eth())` $DIR/core/services/job/job_orm_test.go: `.Eth()` $DIR/core/services/job/job_orm_test.go: `.ValidatedOracleSpecToml(config, legacyChains, testspecs.GenerateOCRSpec(testspecs.OCRSpecParams{ JobID: externalJobID.String(), TransmitterAddress: address.Hex(), DS1BridgeName: bridge.Name.String(), DS2BridgeName: bridge2.Name.String(), }).Toml(), )` $DIR/core/services/job/job_orm_test.go: `.GenerateOCRSpec(testspecs.OCRSpecParams{ JobID: externalJobID.String(), TransmitterAddress: address.Hex(), DS1BridgeName: bridge.Name.String(), DS2BridgeName: bridge2.Name.String(), })` $DIR/core/services/job/job_orm_test.go: `.String()` $DIR/core/services/job/job_orm_test.go: `.Hex()` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.Toml()` $DIR/core/services/job/job_orm_test.go: `.CreateJob(testutils.Context(t), &jb)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.Run("with no pipeline runs", func(t *testing.T) { ctx := testutils.Context(t) runs, count, err2 := orm.PipelineRuns(ctx, nil, 0, 10) require.NoError(t, err2) assert.Equal(t, count, 0) assert.Empty(t, runs) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.PipelineRuns(ctx, nil, 0, 10)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.PipelineRuns(ctx, nil, 0, 10)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/job/job_orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/job_orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/job/job_orm_test.go: `.NewORM(db, logger.TestLogger(t), config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/job_orm_test.go: `.TestLogger(t)` $DIR/core/services/job/job_orm_test.go: `.JobPipeline()` $DIR/core/services/job/job_orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/job_orm_test.go: `.NewORM(db)` $DIR/core/services/job/job_orm_test.go: `.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, GeneralConfig: config, KeyStore: keyStore.Eth()})` $DIR/core/services/job/job_orm_test.go: `.Eth()` $DIR/core/services/job/job_orm_test.go: `.NewLegacyChainsFromRelayerExtenders(relayExtenders)` $DIR/core/services/job/job_orm_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{})` $DIR/core/services/job/job_orm_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{})` $DIR/core/services/job/job_orm_test.go: `.New()` $DIR/core/services/job/job_orm_test.go: `.MustInsertRandomKey(t, keyStore.Eth())` $DIR/core/services/job/job_orm_test.go: `.Eth()` $DIR/core/services/job/job_orm_test.go: `.ValidatedOracleSpecToml(config, legacyChains, testspecs.GenerateOCRSpec(testspecs.OCRSpecParams{ JobID: externalJobID.String(), TransmitterAddress: address.Hex(), DS1BridgeName: bridge.Name.String(), DS2BridgeName: bridge2.Name.String(), }).Toml(), )` $DIR/core/services/job/job_orm_test.go: `.GenerateOCRSpec(testspecs.OCRSpecParams{ JobID: externalJobID.String(), TransmitterAddress: address.Hex(), DS1BridgeName: bridge.Name.String(), DS2BridgeName: bridge2.Name.String(), })` $DIR/core/services/job/job_orm_test.go: `.String()` $DIR/core/services/job/job_orm_test.go: `.Hex()` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.Toml()` $DIR/core/services/job/job_orm_test.go: `.CreateJob(testutils.Context(t), &jb)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.Run("with no pipeline runs", func(t *testing.T) { ctx := testutils.Context(t) runs, count, err2 := orm.PipelineRuns(ctx, &jb.ID, 0, 10) require.NoError(t, err2) assert.Equal(t, count, 0) assert.Empty(t, runs) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.PipelineRuns(ctx, &jb.ID, 0, 10)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.PipelineRuns(ctx, &jb.ID, 0, 10)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/job/job_orm_test.go: `.FullTestDBV2(t, nil)` $DIR/core/services/job/job_orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/job/job_orm_test.go: `.NewORM(db, logger.TestLogger(t), config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/job_orm_test.go: `.TestLogger(t)` $DIR/core/services/job/job_orm_test.go: `.JobPipeline()` $DIR/core/services/job/job_orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/job_orm_test.go: `.NewORM(db)` $DIR/core/services/job/job_orm_test.go: `.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, GeneralConfig: config, KeyStore: keyStore.Eth()})` $DIR/core/services/job/job_orm_test.go: `.Eth()` $DIR/core/services/job/job_orm_test.go: `.NewLegacyChainsFromRelayerExtenders(relayExtenders)` $DIR/core/services/job/job_orm_test.go: `.MustInsertRandomKey(t, keyStore.Eth())` $DIR/core/services/job/job_orm_test.go: `.Eth()` $DIR/core/services/job/job_orm_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{})` $DIR/core/services/job/job_orm_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{})` $DIR/core/services/job/job_orm_test.go: `.New()` $DIR/core/services/job/job_orm_test.go: `.String()` $DIR/core/services/job/job_orm_test.go: `.NewV2()` $DIR/core/services/job/job_orm_test.go: `.ValidatedOracleSpecToml(config, legacyChains, testspecs.GenerateOCRSpec(testspecs.OCRSpecParams{ JobID: jobID, Name: fmt.Sprintf("Job #%v", jobID), DS1BridgeName: bridge.Name.String(), DS2BridgeName: bridge2.Name.String(), TransmitterAddress: address.Hex(), ContractAddress: key.Address.String(), }).Toml())` $DIR/core/services/job/job_orm_test.go: `.GenerateOCRSpec(testspecs.OCRSpecParams{ JobID: jobID, Name: fmt.Sprintf("Job #%v", jobID), DS1BridgeName: bridge.Name.String(), DS2BridgeName: bridge2.Name.String(), TransmitterAddress: address.Hex(), ContractAddress: key.Address.String(), })` $DIR/core/services/job/job_orm_test.go: `.Sprintf("Job #%v", jobID)` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.Hex()` $DIR/core/services/job/job_orm_test.go: `.Address.String()` $DIR/core/services/job/job_orm_test.go: `.Toml()` $DIR/core/services/job/job_orm_test.go: `.CreateJob(testutils.Context(t), &jb)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.Run("with no pipeline runs", func(t *testing.T) { ctx := testutils.Context(t) runIDs, err := orm.FindPipelineRunIDsByJobID(ctx, jb.ID, 0, 10) require.NoError(t, err) assert.Empty(t, runIDs) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.FindPipelineRunIDsByJobID(ctx, jb.ID, 0, 10)` $DIR/core/services/job/job_orm_test.go: `.Run("with a pipeline run", func(t *testing.T) { ctx := testutils.Context(t) run := mustInsertPipelineRun(t, pipelineORM, jb) runIDs, err := orm.FindPipelineRunIDsByJobID(ctx, jb.ID, 0, 10) require.NoError(t, err) require.Len(t, runIDs, 1) assert.Equal(t, run.ID, runIDs[0]) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.FindPipelineRunIDsByJobID(ctx, jb.ID, 0, 10)` $DIR/core/services/job/job_orm_test.go: `.Run("with batch concatenation limit 10", func(t *testing.T) { ctx := testutils.Context(t) runIDs, err := orm.FindPipelineRunIDsByJobID(ctx, jobs[3].ID, 95, 10) require.NoError(t, err) require.Len(t, runIDs, 10) assert.Equal(t, int64(4*(len(jobs)-1)), runIDs[3]-runIDs[7]) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.FindPipelineRunIDsByJobID(ctx, jobs[3].ID, 95, 10)` $DIR/core/services/job/job_orm_test.go: `.Run("with batch concatenation limit 100", func(t *testing.T) { ctx := testutils.Context(t) runIDs, err := orm.FindPipelineRunIDsByJobID(ctx, jobs[3].ID, 95, 100) require.NoError(t, err) require.Len(t, runIDs, 100) assert.Equal(t, int64(67*(len(jobs)-1)), runIDs[12]-runIDs[79]) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.FindPipelineRunIDsByJobID(ctx, jobs[3].ID, 95, 100)` $DIR/core/services/job/job_orm_test.go: `.Run("with first batch empty, over limit", func(t *testing.T) { ctx := testutils.Context(t) runIDs, err := orm.FindPipelineRunIDsByJobID(ctx, jobs[3].ID, 0, 25) require.NoError(t, err) require.Len(t, runIDs, 25) assert.Equal(t, int64(16*(len(jobs)-1)), runIDs[7]-runIDs[23]) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.FindPipelineRunIDsByJobID(ctx, jobs[3].ID, 0, 25)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.FindPipelineRunIDsByJobID(ctx, jobs[3].ID, 143, 190)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/job/job_orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/job_orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/job/job_orm_test.go: `.NewORM(db, logger.TestLogger(t), config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/job_orm_test.go: `.TestLogger(t)` $DIR/core/services/job/job_orm_test.go: `.JobPipeline()` $DIR/core/services/job/job_orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/job_orm_test.go: `.NewORM(db)` $DIR/core/services/job/job_orm_test.go: `.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, GeneralConfig: config, KeyStore: keyStore.Eth()})` $DIR/core/services/job/job_orm_test.go: `.Eth()` $DIR/core/services/job/job_orm_test.go: `.NewLegacyChainsFromRelayerExtenders(relayExtenders)` $DIR/core/services/job/job_orm_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{})` $DIR/core/services/job/job_orm_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{})` $DIR/core/services/job/job_orm_test.go: `.New()` $DIR/core/services/job/job_orm_test.go: `.MustInsertRandomKey(t, keyStore.Eth())` $DIR/core/services/job/job_orm_test.go: `.Eth()` $DIR/core/services/job/job_orm_test.go: `.ValidatedOracleSpecToml(config, legacyChains, testspecs.GenerateOCRSpec(testspecs.OCRSpecParams{ JobID: externalJobID.String(), TransmitterAddress: address.Hex(), DS1BridgeName: bridge.Name.String(), DS2BridgeName: bridge2.Name.String(), }).Toml(), )` $DIR/core/services/job/job_orm_test.go: `.GenerateOCRSpec(testspecs.OCRSpecParams{ JobID: externalJobID.String(), TransmitterAddress: address.Hex(), DS1BridgeName: bridge.Name.String(), DS2BridgeName: bridge2.Name.String(), })` $DIR/core/services/job/job_orm_test.go: `.String()` $DIR/core/services/job/job_orm_test.go: `.Hex()` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.Toml()` $DIR/core/services/job/job_orm_test.go: `.CreateJob(testutils.Context(t), &jb)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.Run("with no pipeline runs", func(t *testing.T) { ctx := testutils.Context(t) runs, err2 := orm.FindPipelineRunsByIDs(ctx, []int64{-1}) require.NoError(t, err2) assert.Empty(t, runs) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.FindPipelineRunsByIDs(ctx, []int64{-1})` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.FindPipelineRunsByIDs(ctx, []int64{run.ID})` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/job/job_orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/job_orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/job/job_orm_test.go: `.OCR()` $DIR/core/services/job/job_orm_test.go: `.Add(ctx, cltest.DefaultOCRKey)` $DIR/core/services/job/job_orm_test.go: `.NewORM(db, logger.TestLogger(t), config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/job_orm_test.go: `.TestLogger(t)` $DIR/core/services/job/job_orm_test.go: `.JobPipeline()` $DIR/core/services/job/job_orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/job_orm_test.go: `.NewORM(db)` $DIR/core/services/job/job_orm_test.go: `.ValidatedDirectRequestSpec(testspecs.GetDirectRequestSpec())` $DIR/core/services/job/job_orm_test.go: `.GetDirectRequestSpec()` $DIR/core/services/job/job_orm_test.go: `.CreateJob(testutils.Context(t), &jb)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.Run("with no pipeline run", func(t *testing.T) { ctx := testutils.Context(t) run, err2 := orm.FindPipelineRunByID(ctx, -1) assert.Equal(t, run, pipeline.Run{}) require.ErrorIs(t, err2, sql.ErrNoRows) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.FindPipelineRunByID(ctx, -1)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.FindPipelineRunByID(ctx, run.ID)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/job/job_orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/job_orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/job/job_orm_test.go: `.OCR()` $DIR/core/services/job/job_orm_test.go: `.Add(ctx, cltest.DefaultOCRKey)` $DIR/core/services/job/job_orm_test.go: `.NewORM(db, logger.TestLogger(t), config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/job_orm_test.go: `.TestLogger(t)` $DIR/core/services/job/job_orm_test.go: `.JobPipeline()` $DIR/core/services/job/job_orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/job_orm_test.go: `.NewORM(db)` $DIR/core/services/job/job_orm_test.go: `.ValidatedDirectRequestSpec(testspecs.GetDirectRequestSpec())` $DIR/core/services/job/job_orm_test.go: `.GetDirectRequestSpec()` $DIR/core/services/job/job_orm_test.go: `.CreateJob(ctx, &jb)` $DIR/core/services/job/job_orm_test.go: `.Get(&jobSpec, "SELECT * FROM jobs")` $DIR/core/services/job/job_orm_test.go: `.FindJobWithoutSpecErrors(ctx, jobSpec.ID)` $DIR/core/services/job/job_orm_test.go: `.FindJobTx(testutils.Context(t), jobSpec.ID)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/job/job_orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/job_orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/job/job_orm_test.go: `.OCR()` $DIR/core/services/job/job_orm_test.go: `.Add(ctx, cltest.DefaultOCRKey)` $DIR/core/services/job/job_orm_test.go: `.NewORM(db, logger.TestLogger(t), config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/job_orm_test.go: `.TestLogger(t)` $DIR/core/services/job/job_orm_test.go: `.JobPipeline()` $DIR/core/services/job/job_orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/job_orm_test.go: `.NewORM(db)` $DIR/core/services/job/job_orm_test.go: `.ValidatedDirectRequestSpec(testspecs.GetDirectRequestSpec())` $DIR/core/services/job/job_orm_test.go: `.GetDirectRequestSpec()` $DIR/core/services/job/job_orm_test.go: `.CreateJob(ctx, &jb)` $DIR/core/services/job/job_orm_test.go: `.Get(&jobSpec, "SELECT * FROM jobs")` $DIR/core/services/job/job_orm_test.go: `.FindSpecErrorsByJobIDs(ctx, []int32{jobSpec.ID})` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/job/job_orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/job_orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/job/job_orm_test.go: `.NewORM(db, logger.TestLogger(t), config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/job_orm_test.go: `.TestLogger(t)` $DIR/core/services/job/job_orm_test.go: `.JobPipeline()` $DIR/core/services/job/job_orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/job_orm_test.go: `.NewORM(db)` $DIR/core/services/job/job_orm_test.go: `.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, GeneralConfig: config, KeyStore: keyStore.Eth()})` $DIR/core/services/job/job_orm_test.go: `.Eth()` $DIR/core/services/job/job_orm_test.go: `.NewLegacyChainsFromRelayerExtenders(relayExtenders)` $DIR/core/services/job/job_orm_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{})` $DIR/core/services/job/job_orm_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{})` $DIR/core/services/job/job_orm_test.go: `.New()` $DIR/core/services/job/job_orm_test.go: `.MustInsertRandomKey(t, keyStore.Eth())` $DIR/core/services/job/job_orm_test.go: `.Eth()` $DIR/core/services/job/job_orm_test.go: `.ValidatedOracleSpecToml(config, legacyChains, testspecs.GenerateOCRSpec(testspecs.OCRSpecParams{ JobID: externalJobID.String(), TransmitterAddress: address.Hex(), DS1BridgeName: bridge.Name.String(), DS2BridgeName: bridge2.Name.String(), }).Toml(), )` $DIR/core/services/job/job_orm_test.go: `.GenerateOCRSpec(testspecs.OCRSpecParams{ JobID: externalJobID.String(), TransmitterAddress: address.Hex(), DS1BridgeName: bridge.Name.String(), DS2BridgeName: bridge2.Name.String(), })` $DIR/core/services/job/job_orm_test.go: `.String()` $DIR/core/services/job/job_orm_test.go: `.Hex()` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.Name.String()` $DIR/core/services/job/job_orm_test.go: `.Toml()` $DIR/core/services/job/job_orm_test.go: `.CreateJob(testutils.Context(t), &jb)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.Run("with no pipeline runs", func(t *testing.T) { ctx := testutils.Context(t) count, err2 := orm.CountPipelineRunsByJobID(ctx, jb.ID) require.NoError(t, err2) assert.Equal(t, int32(0), count) })` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.CountPipelineRunsByJobID(ctx, jb.ID)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.CountPipelineRunsByJobID(ctx, jb.ID)` $DIR/core/services/job/job_orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/job_orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/job_orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/job_orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/job_orm_test.go: `.Run(tt.name, func(t *testing.T) { ks := cltest.NewKeyStore(t, tt.fields.ds) pipelineORM := pipeline.NewORM(tt.fields.ds, logger.TestLogger(t), configtest.NewTestGeneralConfig(t).JobPipeline().MaxSuccessfulRuns()) bridgesORM := bridges.NewORM(tt.fields.ds) o := NewTestORM(t, tt.fields.ds, pipelineORM, bridgesORM, ks) var wantJobID int32 if tt.args.before != nil { wantJobID = tt.args.before(t, o, tt.args.spec) } ctx := testutils.Context(t) gotJ, err := o.FindJobIDByWorkflow(ctx, tt.args.spec) if (err != nil) != tt.wantErr { t.Errorf("orm.FindJobByWorkflow() error = %v, wantErr %v", err, tt.wantErr) return } if err == nil { assert.Equal(t, wantJobID, gotJ, "mismatch job id") } })` $DIR/core/services/job/job_orm_test.go: `.NewKeyStore(t, tt.fields.ds)` $DIR/core/services/job/job_orm_test.go: `.NewORM(tt.fields.ds, logger.TestLogger(t), configtest.NewTestGeneralConfig(t).JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/job_orm_test.go: `.TestLogger(t)` $DIR/core/services/job/job_orm_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/job/job_orm_test.go: `.JobPipeline()` $DIR/core/services/job/job_orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/job_orm_test.go: `.NewORM(tt.fields.ds)` $DIR/core/services/job/job_orm_test.go: `.args.before(t, o, tt.args.spec)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.FindJobIDByWorkflow(ctx, tt.args.spec)` $DIR/core/services/job/job_orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/job_orm_test.go: `.NewORM(db, logger.TestLogger(t), configtest.NewTestGeneralConfig(t).JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/job_orm_test.go: `.TestLogger(t)` $DIR/core/services/job/job_orm_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/job/job_orm_test.go: `.JobPipeline()` $DIR/core/services/job/job_orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/job_orm_test.go: `.NewORM(db)` $DIR/core/services/job/job_orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/job/job_orm_test.go: `.Context(t)` $DIR/core/services/job/job_orm_test.go: `.FindJobIDByWorkflow(ctx, s)` $DIR/core/services/job/job_orm_test.go: `.FindJob(ctx, expectedIDs[i])` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `c.JobPipeline.HTTPRequest.DefaultTimeout = commonconfig.MustNewDuration(30 * time.Millisecond)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `answer1.BaseTask = pipeline.NewBaseTask( 6, "answer1", []pipeline.TaskDependency{ {PropagateResult: true, InputTask: pipeline.Task(ds1_multiply)}, {PropagateResult: true, InputTask: pipeline.Task(ds2_multiply)}}, nil, 0)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `answer2.BaseTask = pipeline.NewBaseTask(7, "answer2", nil, nil, 1)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `ds1_multiply.BaseTask = pipeline.NewBaseTask( 2, "ds1_multiply", []pipeline.TaskDependency{{PropagateResult: true, InputTask: pipeline.Task(ds1_parse)}}, []pipeline.Task{answer1}, 0)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `ds2_multiply.BaseTask = pipeline.NewBaseTask( 5, "ds2_multiply", []pipeline.TaskDependency{{PropagateResult: true, InputTask: pipeline.Task(ds2_parse)}}, []pipeline.Task{answer1}, 0)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `ds1_parse.BaseTask = pipeline.NewBaseTask( 1, "ds1_parse", []pipeline.TaskDependency{{PropagateResult: true, InputTask: pipeline.Task(ds1)}}, []pipeline.Task{ds1_multiply}, 0)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `ds2_parse.BaseTask = pipeline.NewBaseTask( 4, "ds2_parse", []pipeline.TaskDependency{{PropagateResult: true, InputTask: pipeline.Task(ds2)}}, []pipeline.Task{ds2_multiply}, 0)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `ds1.BaseTask = pipeline.NewBaseTask(0, "ds1", nil, []pipeline.Task{ds1_parse}, 0)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `ds2.BaseTask = pipeline.NewBaseTask(3, "ds2", nil, []pipeline.Task{ds2_parse}, 0)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `t.Run("creates task DAGs", func(t *testing.T) { ctx := testutils.Context(t) clearJobsDb(t, db) orm := pipeline.NewORM(db, logger.TestLogger(t), config.JobPipeline().MaxSuccessfulRuns()) p, err := pipeline.Parse(DotStr) require.NoError(t, err) specID, err = orm.CreateSpec(ctx, *p, models.Interval(0)) require.NoError(t, err) var pipelineSpecs []pipeline.Spec sql := `SELECT * FROM pipeline_specs;` err = db.Select(&pipelineSpecs, sql) require.NoError(t, err) require.Len(t, pipelineSpecs, 1) require.Equal(t, specID, pipelineSpecs[0].ID) require.Equal(t, DotStr, pipelineSpecs[0].DotDagSource) _, err = db.Exec(`DELETE FROM pipeline_specs`) require.NoError(t, err) })` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `clearJobsDb(t, db)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `specID, err = orm.CreateSpec(ctx, *p, models.Interval(0))` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `err = db.Select(&pipelineSpecs, sql)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `_, err = db.Exec(`DELETE FROM pipeline_specs`)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `clearJobsDb(t, db)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `sql = `SELECT * FROM pipeline_runs WHERE id = $1;`` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `err = db.Select(&pipelineRuns, sql, runID)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `sql = `SELECT * FROM pipeline_task_runs WHERE pipeline_run_id = $1;`` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `err = db.Select(&taskRuns, sql, runID)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.Context(t)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.JobPipeline.HTTPRequest.DefaultTimeout = commonconfig.MustNewDuration(30 * time.Millisecond) })` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.MustNewDuration(30 * time.Millisecond)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.NewKeyStore(t, db)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.Eth()` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.NewBaseTask( 6, "answer1", []pipeline.TaskDependency{ {PropagateResult: true, InputTask: pipeline.Task(ds1_multiply)}, {PropagateResult: true, InputTask: pipeline.Task(ds2_multiply)}}, nil, 0)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.Task(ds1_multiply)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.Task(ds2_multiply)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.NewBaseTask(7, "answer2", nil, nil, 1)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.NewBaseTask( 2, "ds1_multiply", []pipeline.TaskDependency{{PropagateResult: true, InputTask: pipeline.Task(ds1_parse)}}, []pipeline.Task{answer1}, 0)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.Task(ds1_parse)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.NewBaseTask( 5, "ds2_multiply", []pipeline.TaskDependency{{PropagateResult: true, InputTask: pipeline.Task(ds2_parse)}}, []pipeline.Task{answer1}, 0)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.Task(ds2_parse)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.NewBaseTask( 1, "ds1_parse", []pipeline.TaskDependency{{PropagateResult: true, InputTask: pipeline.Task(ds1)}}, []pipeline.Task{ds1_multiply}, 0)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.Task(ds1)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.NewBaseTask( 4, "ds2_parse", []pipeline.TaskDependency{{PropagateResult: true, InputTask: pipeline.Task(ds2)}}, []pipeline.Task{ds2_multiply}, 0)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.Task(ds2)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.NewBaseTask(0, "ds1", nil, []pipeline.Task{ds1_parse}, 0)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.NewBaseTask(3, "ds2", nil, []pipeline.Task{ds2_parse}, 0)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{})` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{})` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.Run("creates task DAGs", func(t *testing.T) { ctx := testutils.Context(t) clearJobsDb(t, db) orm := pipeline.NewORM(db, logger.TestLogger(t), config.JobPipeline().MaxSuccessfulRuns()) p, err := pipeline.Parse(DotStr) require.NoError(t, err) specID, err = orm.CreateSpec(ctx, *p, models.Interval(0)) require.NoError(t, err) var pipelineSpecs []pipeline.Spec sql := `SELECT * FROM pipeline_specs;` err = db.Select(&pipelineSpecs, sql) require.NoError(t, err) require.Len(t, pipelineSpecs, 1) require.Equal(t, specID, pipelineSpecs[0].ID) require.Equal(t, DotStr, pipelineSpecs[0].DotDagSource) _, err = db.Exec(`DELETE FROM pipeline_specs`) require.NoError(t, err) })` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.Context(t)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.NewORM(db, logger.TestLogger(t), config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.JobPipeline()` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.Parse(DotStr)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.CreateSpec(ctx, *p, models.Interval(0))` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.Interval(0)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.Select(&pipelineSpecs, sql)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.Exec(`DELETE FROM pipeline_specs`)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.JobPipeline()` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.NewORM(db)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.NewChainRelayExtenders(t, evmtest.TestChainOpts{Client: evmtest.NewEthClientMockWithDefaultChain(t), DB: db, GeneralConfig: config, KeyStore: ethKeyStore})` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.NewLegacyChainsFromRelayerExtenders(relayExtenders)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.NewRunner(orm, btORM, config.JobPipeline(), cfg.WebServer(), legacyChains, nil, nil, lggr, nil, nil)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.JobPipeline()` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.WebServer()` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.Name.String()` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.Name.String()` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.ExecuteAndInsertFinishedRun(testutils.Context(t), pipelineSpecs[0], pipeline.NewVarsFrom(nil), lggr, true)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.Context(t)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.NewVarsFrom(nil)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.Select(&pipelineRuns, sql, runID)` $DIR/core/services/job/job_pipeline_orm_integration_test.go: `.Select(&taskRuns, sql, runID)` $DIR/core/services/job/kv_orm_test.go: `jb.ID = jobID` $DIR/core/services/job/kv_orm_test.go: `readBytes, err = kvStore.Get(ctx, testKey)` $DIR/core/services/job/kv_orm_test.go: `fetchedBytes, err = kvStore.Get(ctx, key)` $DIR/core/services/job/kv_orm_test.go: `.WithCancel(context.Background())` $DIR/core/services/job/kv_orm_test.go: `.Background()` $DIR/core/services/job/kv_orm_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/job/kv_orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/kv_orm_test.go: `.TestLogger(t)` $DIR/core/services/job/kv_orm_test.go: `.NewORM(db, logger.TestLogger(t), config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/kv_orm_test.go: `.TestLogger(t)` $DIR/core/services/job/kv_orm_test.go: `.JobPipeline()` $DIR/core/services/job/kv_orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/kv_orm_test.go: `.NewORM(db)` $DIR/core/services/job/kv_orm_test.go: `.NewKVStore(jobID, db, lggr)` $DIR/core/services/job/kv_orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/job/kv_orm_test.go: `.ValidatedDirectRequestSpec(testspecs.GetDirectRequestSpec())` $DIR/core/services/job/kv_orm_test.go: `.GetDirectRequestSpec()` $DIR/core/services/job/kv_orm_test.go: `.Sprint(i)` $DIR/core/services/job/kv_orm_test.go: `.Get(ctx, testKey)` $DIR/core/services/job/kv_orm_test.go: `.Get(ctx, key)` $DIR/core/services/job/kv_orm_test.go: `.Get(ctx, key)` $DIR/core/services/job/kv_orm_test.go: `.DeleteJob(ctx, jobID)` $DIR/core/services/job/models_test.go: `t.Run(tt.name, func(t *testing.T) { t.Parallel() s := &OCR2OracleSpec{ Relay: tt.fields.Relay, ChainID: tt.fields.ChainID, RelayConfig: tt.fields.RelayConfig, } got, err := s.RelayID() if (err != nil) != tt.wantErr { t.Errorf("OCR2OracleSpec.RelayIdentifier() error = %v, wantErr %v", err, tt.wantErr) return } if !reflect.DeepEqual(got, tt.want) { t.Errorf("OCR2OracleSpec.RelayIdentifier() = %v, want %v", got, tt.want) } })` $DIR/core/services/job/models_test.go: `t.Run("marshal", func(t *testing.T) { gotB, err := toml.Marshal(val) require.NoError(t, err) t.Log("marshaled:", string(gotB)) require.Equal(t, compact, string(gotB)) })` $DIR/core/services/job/models_test.go: `t.Run("pretty", func(t *testing.T) { var gotVal OCR2OracleSpec require.NoError(t, toml.Unmarshal([]byte(pretty), &gotVal)) gotB, err := toml.Marshal(gotVal) require.NoError(t, err) t.Log("marshaled compact:", string(gotB)) require.Equal(t, compact, string(gotB)) })` $DIR/core/services/job/models_test.go: `t.Run(tt.name, func(t *testing.T) { w := &WorkflowSpec{ ID: tt.fields.ID, WorkflowID: tt.fields.WorkflowID, Workflow: tt.fields.Workflow, WorkflowOwner: tt.fields.WorkflowOwner, WorkflowName: tt.fields.WorkflowName, CreatedAt: tt.fields.CreatedAt, UpdatedAt: tt.fields.UpdatedAt, } err := w.Validate() assert.ErrorIs(t, err, tt.expectedErr) })` $DIR/core/services/job/models_test.go: `.Run(tt.name, func(t *testing.T) { t.Parallel() s := &OCR2OracleSpec{ Relay: tt.fields.Relay, ChainID: tt.fields.ChainID, RelayConfig: tt.fields.RelayConfig, } got, err := s.RelayID() if (err != nil) != tt.wantErr { t.Errorf("OCR2OracleSpec.RelayIdentifier() error = %v, wantErr %v", err, tt.wantErr) return } if !reflect.DeepEqual(got, tt.want) { t.Errorf("OCR2OracleSpec.RelayIdentifier() = %v, want %v", got, tt.want) } })` $DIR/core/services/job/models_test.go: `.RelayID()` $DIR/core/services/job/models_test.go: `.DeepEqual(got, tt.want)` $DIR/core/services/job/models_test.go: `.StringFrom("bar")` $DIR/core/services/job/models_test.go: `.StringFrom("baz")` $DIR/core/services/job/models_test.go: `.NewInterval(time.Second)` $DIR/core/services/job/models_test.go: `.Run("marshal", func(t *testing.T) { gotB, err := toml.Marshal(val) require.NoError(t, err) t.Log("marshaled:", string(gotB)) require.Equal(t, compact, string(gotB)) })` $DIR/core/services/job/models_test.go: `.Marshal(val)` $DIR/core/services/job/models_test.go: `.Marshal(gotVal)` $DIR/core/services/job/models_test.go: `.Run("pretty", func(t *testing.T) { var gotVal OCR2OracleSpec require.NoError(t, toml.Unmarshal([]byte(pretty), &gotVal)) gotB, err := toml.Marshal(gotVal) require.NoError(t, err) t.Log("marshaled compact:", string(gotB)) require.Equal(t, compact, string(gotB)) })` $DIR/core/services/job/models_test.go: `.Marshal(gotVal)` $DIR/core/services/job/models_test.go: `.Run(tt.name, func(t *testing.T) { w := &WorkflowSpec{ ID: tt.fields.ID, WorkflowID: tt.fields.WorkflowID, Workflow: tt.fields.Workflow, WorkflowOwner: tt.fields.WorkflowOwner, WorkflowName: tt.fields.WorkflowName, CreatedAt: tt.fields.CreatedAt, UpdatedAt: tt.fields.UpdatedAt, } err := w.Validate() assert.ErrorIs(t, err, tt.expectedErr) })` $DIR/core/services/job/models_test.go: `.Validate()` $DIR/core/services/job/orm_test.go: `jobSpec = job.LoadConfigVarsLocalOCR(chainConfig.EVM().OCR(), *jobSpec, config.OCR())` $DIR/core/services/job/orm_test.go: `c.EVM[0].MinIncomingConfirmations = &hundred` $DIR/core/services/job/orm_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/job/orm_test.go: `.NewChainScopedConfig(t, config)` $DIR/core/services/job/orm_test.go: `.LoadConfigVarsLocalOCR(chainConfig.EVM().OCR(), *jobSpec, config.OCR())` $DIR/core/services/job/orm_test.go: `.EVM()` $DIR/core/services/job/orm_test.go: `.OCR()` $DIR/core/services/job/orm_test.go: `.OCR()` $DIR/core/services/job/orm_test.go: `.Interval(chainConfig.EVM().OCR().ContractTransmitterTransmitTimeout())` $DIR/core/services/job/orm_test.go: `.EVM()` $DIR/core/services/job/orm_test.go: `.OCR()` $DIR/core/services/job/orm_test.go: `.ContractTransmitterTransmitTimeout()` $DIR/core/services/job/orm_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { hundred := uint32(100) c.EVM[0].MinIncomingConfirmations = &hundred })` $DIR/core/services/job/orm_test.go: `.NewChainScopedConfig(t, config)` $DIR/core/services/job/orm_test.go: `.Uint32From(10)` $DIR/core/services/job/orm_test.go: `.SetDRMinIncomingConfirmations(chainConfig.EVM().MinIncomingConfirmations(), jobSpec10)` $DIR/core/services/job/orm_test.go: `.EVM()` $DIR/core/services/job/orm_test.go: `.MinIncomingConfirmations()` $DIR/core/services/job/orm_test.go: `.Uint32From(200)` $DIR/core/services/job/orm_test.go: `.SetDRMinIncomingConfirmations(chainConfig.EVM().MinIncomingConfirmations(), jobSpec200)` $DIR/core/services/job/orm_test.go: `.EVM()` $DIR/core/services/job/orm_test.go: `.MinIncomingConfirmations()` $DIR/core/services/job/runner_integration_test.go: `c.P2P.V2.Enabled = ptr(true)` $DIR/core/services/job/runner_integration_test.go: `c.P2P.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", freeport.GetOne(t))}` $DIR/core/services/job/runner_integration_test.go: `c.OCR.KeyBundleID = &kbid` $DIR/core/services/job/runner_integration_test.go: `c.OCR.TransmitterAddress = &taddress` $DIR/core/services/job/runner_integration_test.go: `c.OCR2.DatabaseTimeout = commonconfig.MustNewDuration(time.Second)` $DIR/core/services/job/runner_integration_test.go: `c.OCR2.ContractTransmitterTransmitTimeout = commonconfig.MustNewDuration(time.Second)` $DIR/core/services/job/runner_integration_test.go: `c.Insecure.OCRDevelopmentMode = ptr(true)` $DIR/core/services/job/runner_integration_test.go: `ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(cltest.Head(10), nil)` $DIR/core/services/job/runner_integration_test.go: `ethClient.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Maybe().Return(nil, nil)` $DIR/core/services/job/runner_integration_test.go: `t.Cleanup(func() { assert.NoError(t, pipelineORM.Close()) })` $DIR/core/services/job/runner_integration_test.go: `t.Cleanup(func() { assert.NoError(t, jobORM.Close()) })` $DIR/core/services/job/runner_integration_test.go: `servicetest.Run(t, runner)` $DIR/core/services/job/runner_integration_test.go: `t.Run("gets the election result winner", func(t *testing.T) { var httpURL string mockElectionWinner := cltest.NewHTTPMockServer(t, http.StatusOK, "POST", `Hal Finney`, func(header http.Header, s string) { var md bridges.BridgeMetaDataJSON require.NoError(t, json.Unmarshal([]byte(s), &md)) assert.Equal(t, big.NewInt(10), md.Meta.LatestAnswer) assert.Equal(t, big.NewInt(100), md.Meta.UpdatedAt) }) mockVoterTurnout := cltest.NewHTTPMockServer(t, http.StatusOK, "POST", `{"data": {"result": 62.57}}`, func(header http.Header, s string) { var md bridges.BridgeMetaDataJSON require.NoError(t, json.Unmarshal([]byte(s), &md)) assert.Equal(t, big.NewInt(10), md.Meta.LatestAnswer) assert.Equal(t, big.NewInt(100), md.Meta.UpdatedAt) }, ) mockHTTP := cltest.NewHTTPMockServer(t, http.StatusOK, "POST", `{"turnout": 61.942}`) httpURL = mockHTTP.URL _, bridgeER := cltest.MustCreateBridge(t, db, cltest.BridgeOpts{URL: mockElectionWinner.URL}) _, bridgeVT := cltest.MustCreateBridge(t, db, cltest.BridgeOpts{URL: mockVoterTurnout.URL}) // Need a job in order to create a run jb := MakeVoterTurnoutOCRJobSpecWithHTTPURL(t, transmitterAddress, httpURL, bridgeVT.Name.String(), bridgeER.Name.String()) require.NoError(t, jobORM.CreateJob(testutils.Context(t), jb)) require.NotNil(t, jb.PipelineSpec) require.NotZero(t, jb.PipelineSpec.JobID) m, err := bridges.MarshalBridgeMetaData(big.NewInt(10), big.NewInt(100)) require.NoError(t, err) runID, taskResults, err := runner.ExecuteAndInsertFinishedRun(testutils.Context(t), *jb.PipelineSpec, pipeline.NewVarsFrom(map[string]interface{}{"jobRun": map[string]interface{}{"meta": m}}), logger.TestLogger(t), true) require.NoError(t, err) results := taskResults.FinalResult(logger.TestLogger(t)) require.Len(t, results.Values, 2) require.GreaterOrEqual(t, len(results.FatalErrors), 2) assert.Nil(t, results.FatalErrors[0]) assert.Nil(t, results.FatalErrors[1]) require.GreaterOrEqual(t, len(results.AllErrors), 2) assert.Equal(t, "6225.6", results.Values[0].(decimal.Decimal).String()) assert.Equal(t, "Hal Finney", results.Values[1].(string)) // Verify individual task results var runs []pipeline.TaskRun sql := `SELECT * FROM pipeline_task_runs WHERE pipeline_run_id = $1` err = db.Select(&runs, sql, runID) assert.NoError(t, err) assert.Len(t, runs, 8) for _, run := range runs { if run.GetDotID() == "answer2" { assert.Equal(t, "Hal Finney", run.Output.Val) } else if run.GetDotID() == "ds2" { assert.Equal(t, `{"turnout": 61.942}`, run.Output.Val) } else if run.GetDotID() == "ds2_parse" { assert.Equal(t, float64(61.942), run.Output.Val) } else if run.GetDotID() == "ds2_multiply" { assert.Equal(t, "6194.2", run.Output.Val) } else if run.GetDotID() == "ds1" { assert.Equal(t, `{"data": {"result": 62.57}}`, run.Output.Val) } else if run.GetDotID() == "ds1_parse" { assert.Equal(t, float64(62.57), run.Output.Val) } else if run.GetDotID() == "ds1_multiply" { assert.Equal(t, "6257", run.Output.Val) } else if run.GetDotID() == "answer1" { assert.Equal(t, "6225.6", run.Output.Val) } else { t.Fatalf("unknown task '%v'", run.GetDotID()) } } })` $DIR/core/services/job/runner_integration_test.go: `httpURL = mockHTTP.URL` $DIR/core/services/job/runner_integration_test.go: `err = db.Select(&runs, sql, runID)` $DIR/core/services/job/runner_integration_test.go: `t.Run("must delete job before deleting bridge", func(t *testing.T) { ctx := testutils.Context(t) _, bridge := cltest.MustCreateBridge(t, db, cltest.BridgeOpts{}) jb := makeOCRJobSpecFromToml(t, fmt.Sprintf(` type = "offchainreporting" schemaVersion = 1 evmChainID = "0" observationSource = """ ds1 [type=bridge name="%s"]; """ `, bridge.Name.String())) require.NoError(t, jobORM.CreateJob(ctx, jb)) // Should not be able to delete a bridge in use. jids, err := jobORM.FindJobIDsWithBridge(ctx, bridge.Name.String()) require.NoError(t, err) require.Equal(t, 1, len(jids)) // But if we delete the job, then we can. require.NoError(t, jobORM.DeleteJob(ctx, jb.ID)) jids, err = jobORM.FindJobIDsWithBridge(ctx, bridge.Name.String()) require.NoError(t, err) require.Equal(t, 0, len(jids)) })` $DIR/core/services/job/runner_integration_test.go: `jids, err = jobORM.FindJobIDsWithBridge(ctx, bridge.Name.String())` $DIR/core/services/job/runner_integration_test.go: `t.Run("referencing a non-existent bridge should error", func(t *testing.T) { ctx := testutils.Context(t) // Create a random bridge name _, b := cltest.MustCreateBridge(t, db, cltest.BridgeOpts{}) // Reference a different one legacyChains := cltest.NewLegacyChainsWithMockChain(t, nil, config) jb, err := ocr.ValidatedOracleSpecToml(config, legacyChains, fmt.Sprintf(` type = "offchainreporting" schemaVersion = 1 evmChainID = 0 transmitterID = "%s" contractAddress = "0x613a38AC1659769640aaE063C651F48E0250454C" isBootstrapPeer = false blockchainTimeout = "1s" observationTimeout = "10s" databaseTimeout = "2s" contractConfigTrackerPollInterval="15s" contractConfigConfirmations=1 observationGracePeriod = "2s" contractTransmitterTransmitTimeout = "5s" contractConfigTrackerSubscribeInterval="1m" observationSource = """ ds1 [type=bridge name=blah]; ds1_parse [type=jsonparse path="one,two"]; ds1_multiply [type=multiply times=1.23]; ds1 -> ds1_parse -> ds1_multiply -> answer1; answer1 [type=median index=0]; """ `, placeHolderAddress.String())) require.NoError(t, err) // Should error creating it err = jobORM.CreateJob(ctx, &jb) require.Error(t, err) assert.Contains(t, err.Error(), "not all bridges exist") // Same for ocr2 jb2, err := validate.ValidatedOracleSpecToml(testutils.Context(t), config.OCR2(), config.Insecure(), fmt.Sprintf(` type = "offchainreporting2" pluginType = "median" schemaVersion = 1 relay = "evm" contractID = "0x613a38AC1659769640aaE063C651F48E0250454C" transmitterID = "%s" blockchainTimeout = "1s" contractConfigTrackerPollInterval = "15s" contractConfigConfirmations = 1 observationSource = """ ds1 [type=bridge name="%s"]; ds1_parse [type=jsonparse path="one,two"]; ds1_multiply [type=multiply times=1.23]; ds1 -> ds1_parse -> ds1_multiply -> answer1; answer1 [type=median index=0]; """ [relayConfig] chainID = 1337 [pluginConfig] juelsPerFeeCoinSource = """ ds1 [type=bridge name=blah]; ds1_parse [type=jsonparse path="one,two"]; ds1_multiply [type=multiply times=1.23]; ds1 -> ds1_parse -> ds1_multiply -> answer1; answer1 [type=median index=0]; """ `, placeHolderAddress.String(), b.Name.String()), nil) require.NoError(t, err) // Should error creating it because of the juels per fee coin non-existent bridge err = jobORM.CreateJob(ctx, &jb2) require.Error(t, err) assert.Contains(t, err.Error(), "not all bridges exist") // Duplicate bridge names that exist is ok jb3, err := validate.ValidatedOracleSpecToml(testutils.Context(t), config.OCR2(), config.Insecure(), fmt.Sprintf(` type = "offchainreporting2" pluginType = "median" schemaVersion = 1 relay = "evm" contractID = "0x613a38AC1659769640aaE063C651F48E0250454C" transmitterID = "%s" blockchainTimeout = "1s" contractConfigTrackerPollInterval = "15s" contractConfigConfirmations = 1 observationSource = """ ds1 [type=bridge name="%s"]; ds1_parse [type=jsonparse path="one,two"]; ds1_multiply [type=multiply times=1.23]; ds1 -> ds1_parse -> ds1_multiply -> answer1; answer1 [type=median index=0]; """ [relayConfig] chainID = 1337 [pluginConfig] juelsPerFeeCoinSource = """ ds1 [type=bridge name="%s"]; ds1_parse [type=jsonparse path="one,two"]; ds1_multiply [type=multiply times=1.23]; ds1 -> ds1_parse -> ds1_multiply -> answer1; ds2 [type=bridge name="%s"]; ds2_parse [type=jsonparse path="one,two"]; ds2_multiply [type=multiply times=1.23]; ds2 -> ds2_parse -> ds2_multiply -> answer1; answer1 [type=median index=0]; """ `, placeHolderAddress, b.Name.String(), b.Name.String(), b.Name.String()), nil) require.NoError(t, err) // Should not error with duplicate bridges err = jobORM.CreateJob(ctx, &jb3) require.NoError(t, err) })` $DIR/core/services/job/runner_integration_test.go: `err = jobORM.CreateJob(ctx, &jb)` $DIR/core/services/job/runner_integration_test.go: `err = jobORM.CreateJob(ctx, &jb2)` $DIR/core/services/job/runner_integration_test.go: `err = jobORM.CreateJob(ctx, &jb3)` $DIR/core/services/job/runner_integration_test.go: `t.Run("handles the case where the parsed value is literally null", func(t *testing.T) { ctx := testutils.Context(t) var httpURL string resp := `{"USD": null}` { mockHTTP := cltest.NewHTTPMockServer(t, http.StatusOK, "GET", resp) httpURL = mockHTTP.URL } // Need a job in order to create a run jb := makeSimpleFetchOCRJobSpecWithHTTPURL(t, transmitterAddress, httpURL, false) err := jobORM.CreateJob(ctx, jb) require.NoError(t, err) runID, taskResults, err := runner.ExecuteAndInsertFinishedRun(testutils.Context(t), *jb.PipelineSpec, pipeline.NewVarsFrom(nil), logger.TestLogger(t), true) require.NoError(t, err) results := taskResults.FinalResult(logger.TestLogger(t)) assert.Len(t, results.FatalErrors, 1) assert.Len(t, results.Values, 1) assert.Contains(t, results.FatalErrors[0].Error(), "type cannot be converted to decimal.Decimal") assert.Nil(t, results.Values[0]) // Verify individual task results var runs []pipeline.TaskRun sql := `SELECT * FROM pipeline_task_runs WHERE pipeline_run_id = $1` err = db.Select(&runs, sql, runID) assert.NoError(t, err) require.Len(t, runs, 3) for _, run := range runs { if run.GetDotID() == "ds1" { assert.True(t, run.Error.IsZero()) require.NotNil(t, resp, run.Output) assert.Equal(t, resp, run.Output.Val) } else if run.GetDotID() == "ds1_parse" { assert.True(t, run.Error.IsZero()) assert.False(t, run.Output.Valid) } else if run.GetDotID() == "ds1_multiply" { assert.Contains(t, run.Error.ValueOrZero(), "type cannot be converted to decimal.Decimal") assert.False(t, run.Output.Valid) } else { t.Fatalf("unknown task '%v'", run.GetDotID()) } } })` $DIR/core/services/job/runner_integration_test.go: `httpURL = mockHTTP.URL` $DIR/core/services/job/runner_integration_test.go: `err = db.Select(&runs, sql, runID)` $DIR/core/services/job/runner_integration_test.go: `t.Run("handles the case where the jsonparse lookup path is missing from the http response", func(t *testing.T) { var httpURL string resp := "{\"Response\":\"Error\",\"Message\":\"You are over your rate limit please upgrade your account!\",\"HasWarning\":false,\"Type\":99,\"RateLimit\":{\"calls_made\":{\"second\":5,\"minute\":5,\"hour\":955,\"day\":10004,\"month\":15146,\"total_calls\":15152},\"max_calls\":{\"second\":20,\"minute\":300,\"hour\":3000,\"day\":10000,\"month\":75000}},\"Data\":{}}" { mockHTTP := cltest.NewHTTPMockServer(t, http.StatusOK, "GET", resp) httpURL = mockHTTP.URL } // Need a job in order to create a run jb := makeSimpleFetchOCRJobSpecWithHTTPURL(t, transmitterAddress, httpURL, false) err := jobORM.CreateJob(testutils.Context(t), jb) require.NoError(t, err) runID, taskResults, err := runner.ExecuteAndInsertFinishedRun(testutils.Context(t), *jb.PipelineSpec, pipeline.NewVarsFrom(nil), logger.TestLogger(t), true) require.NoError(t, err) results := taskResults.FinalResult(logger.TestLogger(t)) assert.Len(t, results.Values, 1) assert.Len(t, results.FatalErrors, 1) assert.Contains(t, results.FatalErrors[0].Error(), pipeline.ErrTooManyErrors.Error()) assert.Nil(t, results.Values[0]) // Verify individual task results var runs []pipeline.TaskRun sql := `SELECT * FROM pipeline_task_runs WHERE pipeline_run_id = $1` err = db.Select(&runs, sql, runID) assert.NoError(t, err) require.Len(t, runs, 3) for _, run := range runs { if run.GetDotID() == "ds1" { assert.True(t, run.Error.IsZero()) assert.Equal(t, resp, run.Output.Val) } else if run.GetDotID() == "ds1_parse" { assert.Contains(t, run.Error.ValueOrZero(), "could not resolve path [\"USD\"] in {\"Response\":\"Error\",\"Message\":\"You are over your rate limit please upgrade your account!\",\"HasWarning\":false,\"Type\":99,\"RateLimit\":{\"calls_made\":{\"second\":5,\"minute\":5,\"hour\":955,\"day\":10004,\"month\":15146,\"total_calls\":15152},\"max_calls\":{\"second\":20,\"minute\":300,\"hour\":3000,\"day\":10000,\"month\":75000}},\"Data\":{}}") assert.False(t, run.Output.Valid) } else if run.GetDotID() == "ds1_multiply" { assert.Contains(t, run.Error.ValueOrZero(), pipeline.ErrTooManyErrors.Error()) assert.False(t, run.Output.Valid) } else { t.Fatalf("unknown task '%v'", run.GetDotID()) } } })` $DIR/core/services/job/runner_integration_test.go: `httpURL = mockHTTP.URL` $DIR/core/services/job/runner_integration_test.go: `err = db.Select(&runs, sql, runID)` $DIR/core/services/job/runner_integration_test.go: `t.Run("handles the case where the jsonparse lookup path is missing from the http response and lax is enabled", func(t *testing.T) { var httpURL string resp := "{\"Response\":\"Error\",\"Message\":\"You are over your rate limit please upgrade your account!\",\"HasWarning\":false,\"Type\":99,\"RateLimit\":{\"calls_made\":{\"second\":5,\"minute\":5,\"hour\":955,\"day\":10004,\"month\":15146,\"total_calls\":15152},\"max_calls\":{\"second\":20,\"minute\":300,\"hour\":3000,\"day\":10000,\"month\":75000}},\"Data\":{}}" { mockHTTP := cltest.NewHTTPMockServer(t, http.StatusOK, "GET", resp) httpURL = mockHTTP.URL } // Need a job in order to create a run jb := makeSimpleFetchOCRJobSpecWithHTTPURL(t, transmitterAddress, httpURL, true) err := jobORM.CreateJob(testutils.Context(t), jb) require.NoError(t, err) runID, taskResults, err := runner.ExecuteAndInsertFinishedRun(testutils.Context(t), *jb.PipelineSpec, pipeline.NewVarsFrom(nil), logger.TestLogger(t), true) require.NoError(t, err) results := taskResults.FinalResult(logger.TestLogger(t)) assert.Len(t, results.Values, 1) assert.Contains(t, results.FatalErrors[0].Error(), "type cannot be converted to decimal.Decimal") assert.Nil(t, results.Values[0]) // Verify individual task results var runs []pipeline.TaskRun sql := `SELECT * FROM pipeline_task_runs WHERE pipeline_run_id = $1` err = db.Select(&runs, sql, runID) assert.NoError(t, err) require.Len(t, runs, 3) for _, run := range runs { if run.GetDotID() == "ds1" { assert.True(t, run.Error.IsZero()) assert.Equal(t, resp, run.Output.Val) } else if run.GetDotID() == "ds1_parse" { assert.True(t, run.Error.IsZero()) assert.False(t, run.Output.Valid) } else if run.GetDotID() == "ds1_multiply" { assert.Contains(t, run.Error.ValueOrZero(), "type cannot be converted to decimal.Decimal") assert.False(t, run.Output.Valid) } else { t.Fatalf("unknown task '%v'", run.GetDotID()) } } })` $DIR/core/services/job/runner_integration_test.go: `httpURL = mockHTTP.URL` $DIR/core/services/job/runner_integration_test.go: `err = db.Select(&runs, sql, runID)` $DIR/core/services/job/runner_integration_test.go: `t.Run("minimal bootstrap", func(t *testing.T) { ctx := testutils.Context(t) s := ` type = "offchainreporting" schemaVersion = 1 contractAddress = "%s" isBootstrapPeer = true evmChainID = "0" ` s = fmt.Sprintf(s, cltest.NewEIP55Address()) jb, err := ocr.ValidatedOracleSpecToml(config, legacyChains, s) require.NoError(t, err) err = toml.Unmarshal([]byte(s), &jb) require.NoError(t, err) jb.MaxTaskDuration = models.Interval(cltest.MustParseDuration(t, "1s")) err = jobORM.CreateJob(testutils.Context(t), &jb) require.NoError(t, err) lggr := logger.TestLogger(t) _, err = keyStore.P2P().Create(ctx) assert.NoError(t, err) pw := ocrcommon.NewSingletonPeerWrapper(keyStore, config.P2P(), config.OCR(), db, lggr) servicetest.Run(t, pw) sd := ocr.NewDelegate( db, jobORM, keyStore, nil, pw, monitoringEndpoint, legacyChains, lggr, config, servicetest.Run(t, mailboxtest.NewMonitor(t)), ) _, err = sd.ServicesForSpec(testutils.Context(t), jb) require.NoError(t, err) })` $DIR/core/services/job/runner_integration_test.go: `s = fmt.Sprintf(s, cltest.NewEIP55Address())` $DIR/core/services/job/runner_integration_test.go: `err = toml.Unmarshal([]byte(s), &jb)` $DIR/core/services/job/runner_integration_test.go: `jb.MaxTaskDuration = models.Interval(cltest.MustParseDuration(t, "1s"))` $DIR/core/services/job/runner_integration_test.go: `err = jobORM.CreateJob(testutils.Context(t), &jb)` $DIR/core/services/job/runner_integration_test.go: `_, err = keyStore.P2P().Create(ctx)` $DIR/core/services/job/runner_integration_test.go: `servicetest.Run(t, pw)` $DIR/core/services/job/runner_integration_test.go: `_, err = sd.ServicesForSpec(testutils.Context(t), jb)` $DIR/core/services/job/runner_integration_test.go: `t.Run("test min non-bootstrap", func(t *testing.T) { ctx := testutils.Context(t) kb, err := keyStore.OCR().Create(ctx) require.NoError(t, err) s := fmt.Sprintf(minimalNonBootstrapTemplate, cltest.NewEIP55Address(), transmitterAddress.Hex(), kb.ID(), "http://blah.com", "") jb, err := ocr.ValidatedOracleSpecToml(config, legacyChains, s) require.NoError(t, err) err = toml.Unmarshal([]byte(s), &jb) require.NoError(t, err) jb.MaxTaskDuration = models.Interval(cltest.MustParseDuration(t, "1s")) err = jobORM.CreateJob(testutils.Context(t), &jb) require.NoError(t, err) assert.Equal(t, jb.MaxTaskDuration, models.Interval(cltest.MustParseDuration(t, "1s"))) lggr := logger.TestLogger(t) pw := ocrcommon.NewSingletonPeerWrapper(keyStore, config.P2P(), config.OCR(), db, lggr) servicetest.Run(t, pw) sd := ocr.NewDelegate( db, jobORM, keyStore, nil, pw, monitoringEndpoint, legacyChains, lggr, config, servicetest.Run(t, mailboxtest.NewMonitor(t)), ) _, err = sd.ServicesForSpec(testutils.Context(t), jb) require.NoError(t, err) })` $DIR/core/services/job/runner_integration_test.go: `err = toml.Unmarshal([]byte(s), &jb)` $DIR/core/services/job/runner_integration_test.go: `jb.MaxTaskDuration = models.Interval(cltest.MustParseDuration(t, "1s"))` $DIR/core/services/job/runner_integration_test.go: `err = jobORM.CreateJob(testutils.Context(t), &jb)` $DIR/core/services/job/runner_integration_test.go: `servicetest.Run(t, pw)` $DIR/core/services/job/runner_integration_test.go: `_, err = sd.ServicesForSpec(testutils.Context(t), jb)` $DIR/core/services/job/runner_integration_test.go: `t.Run("test min bootstrap", func(t *testing.T) { s := fmt.Sprintf(minimalBootstrapTemplate, cltest.NewEIP55Address()) jb, err := ocr.ValidatedOracleSpecToml(config, legacyChains, s) require.NoError(t, err) err = toml.Unmarshal([]byte(s), &jb) require.NoError(t, err) err = jobORM.CreateJob(testutils.Context(t), &jb) require.NoError(t, err) lggr := logger.TestLogger(t) pw := ocrcommon.NewSingletonPeerWrapper(keyStore, config.P2P(), config.OCR(), db, lggr) servicetest.Run(t, pw) sd := ocr.NewDelegate( db, jobORM, keyStore, nil, pw, monitoringEndpoint, legacyChains, lggr, config, servicetest.Run(t, mailboxtest.NewMonitor(t)), ) _, err = sd.ServicesForSpec(testutils.Context(t), jb) require.NoError(t, err) })` $DIR/core/services/job/runner_integration_test.go: `err = toml.Unmarshal([]byte(s), &jb)` $DIR/core/services/job/runner_integration_test.go: `err = jobORM.CreateJob(testutils.Context(t), &jb)` $DIR/core/services/job/runner_integration_test.go: `servicetest.Run(t, pw)` $DIR/core/services/job/runner_integration_test.go: `_, err = sd.ServicesForSpec(testutils.Context(t), jb)` $DIR/core/services/job/runner_integration_test.go: `t.Run("test enhanced telemetry service creation", func(t *testing.T) { ctx := testutils.Context(t) testCases := []struct { jbCaptureEATelemetry bool specCaptureEATelemetry bool expected bool }{{false, false, false}, {true, false, false}, {false, true, true}, {true, true, true}, } for _, tc := range testCases { config = configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.P2P.V2.Enabled = ptr(true) c.P2P.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", freeport.GetOne(t))} c.OCR.CaptureEATelemetry = ptr(tc.specCaptureEATelemetry) }) relayExtenders = evmtest.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, Client: ethClient, GeneralConfig: config, KeyStore: ethKeyStore}) legacyChains = evmrelay.NewLegacyChainsFromRelayerExtenders(relayExtenders) kb, err := keyStore.OCR().Create(ctx) require.NoError(t, err) s := fmt.Sprintf(minimalNonBootstrapTemplate, cltest.NewEIP55Address(), transmitterAddress.Hex(), kb.ID(), "http://blah.com", "") jb, err := ocr.ValidatedOracleSpecToml(config, legacyChains, s) require.NoError(t, err) err = toml.Unmarshal([]byte(s), &jb) require.NoError(t, err) jb.MaxTaskDuration = models.Interval(cltest.MustParseDuration(t, "1s")) err = jobORM.CreateJob(testutils.Context(t), &jb) require.NoError(t, err) assert.Equal(t, jb.MaxTaskDuration, models.Interval(cltest.MustParseDuration(t, "1s"))) lggr := logger.TestLogger(t) pw := ocrcommon.NewSingletonPeerWrapper(keyStore, config.P2P(), config.OCR(), db, lggr) servicetest.Run(t, pw) sd := ocr.NewDelegate( db, jobORM, keyStore, nil, pw, monitoringEndpoint, legacyChains, lggr, config, servicetest.Run(t, mailboxtest.NewMonitor(t)), ) jb.OCROracleSpec.CaptureEATelemetry = tc.jbCaptureEATelemetry services, err := sd.ServicesForSpec(testutils.Context(t), jb) require.NoError(t, err) enhancedTelemetryServiceCreated := false for _, service := range services { _, ok := service.(*ocrcommon.EnhancedTelemetryService[ocrcommon.EnhancedTelemetryData]) enhancedTelemetryServiceCreated = ok if enhancedTelemetryServiceCreated { break } } require.Equal(t, tc.expected, enhancedTelemetryServiceCreated) } })` $DIR/core/services/job/runner_integration_test.go: `c.P2P.V2.Enabled = ptr(true)` $DIR/core/services/job/runner_integration_test.go: `c.P2P.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", freeport.GetOne(t))}` $DIR/core/services/job/runner_integration_test.go: `c.OCR.CaptureEATelemetry = ptr(tc.specCaptureEATelemetry)` $DIR/core/services/job/runner_integration_test.go: `relayExtenders = evmtest.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, Client: ethClient, GeneralConfig: config, KeyStore: ethKeyStore})` $DIR/core/services/job/runner_integration_test.go: `legacyChains = evmrelay.NewLegacyChainsFromRelayerExtenders(relayExtenders)` $DIR/core/services/job/runner_integration_test.go: `err = toml.Unmarshal([]byte(s), &jb)` $DIR/core/services/job/runner_integration_test.go: `jb.MaxTaskDuration = models.Interval(cltest.MustParseDuration(t, "1s"))` $DIR/core/services/job/runner_integration_test.go: `err = jobORM.CreateJob(testutils.Context(t), &jb)` $DIR/core/services/job/runner_integration_test.go: `servicetest.Run(t, pw)` $DIR/core/services/job/runner_integration_test.go: `jb.OCROracleSpec.CaptureEATelemetry = tc.jbCaptureEATelemetry` $DIR/core/services/job/runner_integration_test.go: `enhancedTelemetryServiceCreated = ok` $DIR/core/services/job/runner_integration_test.go: `t.Run("test job spec error is created", func(t *testing.T) { ctx := testutils.Context(t) // Create a keystore with an ocr key bundle and p2p key. kb, err := keyStore.OCR().Create(ctx) require.NoError(t, err) spec := fmt.Sprintf(ocrJobSpecTemplate, testutils.NewAddress().Hex(), kb.ID(), transmitterAddress.Hex(), fmt.Sprintf(simpleFetchDataSourceTemplate, "blah", true)) jb := makeOCRJobSpecFromToml(t, spec) // Create an OCR job err = jobORM.CreateJob(ctx, jb) require.NoError(t, err) lggr := logger.TestLogger(t) pw := ocrcommon.NewSingletonPeerWrapper(keyStore, config.P2P(), config.OCR(), db, lggr) servicetest.Run(t, pw) sd := ocr.NewDelegate( db, jobORM, keyStore, nil, pw, monitoringEndpoint, legacyChains, lggr, config, servicetest.Run(t, mailboxtest.NewMonitor(t)), ) services, err := sd.ServicesForSpec(testutils.Context(t), *jb) require.NoError(t, err) // Return an error getting the contract code. ethClient.On("CodeAt", mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("no such code")) for _, s := range services { err = s.Start(ctx) require.NoError(t, err) } var se []job.SpecError require.Eventually(t, func() bool { err = db.Select(&se, `SELECT * FROM job_spec_errors`) require.NoError(t, err) return len(se) == 1 }, time.Second, 100*time.Millisecond) require.Len(t, se, 1) assert.Equal(t, uint(1), se[0].Occurrences) for _, s := range services { err = s.Close() require.NoError(t, err) } // Ensure we can delete an errored err = jobORM.DeleteJob(ctx, jb.ID) require.NoError(t, err) se = []job.SpecError{} err = db.Select(&se, `SELECT * FROM job_spec_errors`) require.NoError(t, err) require.Len(t, se, 0) // TODO: This breaks the txdb connection, failing subsequent tests. Resolve in the future // Noop once the job is gone. // jobORM.RecordError(testutils.Context(t), jb.ID, "test") // err = db.Find(&se).Error // require.NoError(t, err) // require.Len(t, se, 0) })` $DIR/core/services/job/runner_integration_test.go: `err = jobORM.CreateJob(ctx, jb)` $DIR/core/services/job/runner_integration_test.go: `servicetest.Run(t, pw)` $DIR/core/services/job/runner_integration_test.go: `ethClient.On("CodeAt", mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("no such code"))` $DIR/core/services/job/runner_integration_test.go: `err = s.Start(ctx)` $DIR/core/services/job/runner_integration_test.go: `err = s.Close()` $DIR/core/services/job/runner_integration_test.go: `err = jobORM.DeleteJob(ctx, jb.ID)` $DIR/core/services/job/runner_integration_test.go: `se = []job.SpecError{}` $DIR/core/services/job/runner_integration_test.go: `err = db.Select(&se, `SELECT * FROM job_spec_errors`)` $DIR/core/services/job/runner_integration_test.go: `t.Run("timeouts", func(t *testing.T) { ctx := testutils.Context(t) // There are 4 timeouts: // - ObservationTimeout = how long the whole OCR time needs to run, or it fails (default 10 seconds) // - config.JobPipelineMaxTaskDuration() = node level maximum time for a pipeline task (default 10 minutes) // - config.transmitterAddress, http specific timeouts (default 15s * 5 retries = 75s) // - "d1 [.... timeout="2s"]" = per task level timeout (should override the global config) serv := httptest.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { time.Sleep(1 * time.Millisecond) res.WriteHeader(http.StatusOK) _, err := res.Write([]byte(`{"USD":10.1}`)) require.NoError(t, err) })) defer serv.Close() jb := makeMinimalHTTPOracleSpec(t, db, config, cltest.NewEIP55Address().String(), transmitterAddress.Hex(), cltest.DefaultOCRKeyBundleID, serv.URL, `timeout="1ns"`) err := jobORM.CreateJob(ctx, jb) require.NoError(t, err) _, taskResults, err := runner.ExecuteAndInsertFinishedRun(testutils.Context(t), *jb.PipelineSpec, pipeline.NewVarsFrom(nil), logger.TestLogger(t), true) require.NoError(t, err) results := taskResults.FinalResult(logger.TestLogger(t)) assert.Nil(t, results.Values[0]) // No task timeout should succeed. jb = makeMinimalHTTPOracleSpec(t, db, config, cltest.NewEIP55Address().String(), transmitterAddress.Hex(), cltest.DefaultOCRKeyBundleID, serv.URL, "") jb.Name = null.NewString("a job 2", true) err = jobORM.CreateJob(ctx, jb) require.NoError(t, err) _, taskResults, err = runner.ExecuteAndInsertFinishedRun(testutils.Context(t), *jb.PipelineSpec, pipeline.NewVarsFrom(nil), logger.TestLogger(t), true) require.NoError(t, err) results = taskResults.FinalResult(logger.TestLogger(t)) assert.Equal(t, 10.1, results.Values[0]) assert.Nil(t, results.FatalErrors[0]) // Job specified task timeout should fail. jb = makeMinimalHTTPOracleSpec(t, db, config, cltest.NewEIP55Address().String(), transmitterAddress.Hex(), cltest.DefaultOCRKeyBundleID, serv.URL, "") jb.MaxTaskDuration = models.Interval(time.Duration(1)) jb.Name = null.NewString("a job 3", true) err = jobORM.CreateJob(ctx, jb) require.NoError(t, err) _, taskResults, err = runner.ExecuteAndInsertFinishedRun(testutils.Context(t), *jb.PipelineSpec, pipeline.NewVarsFrom(nil), logger.TestLogger(t), true) require.NoError(t, err) resultsNoFatalErrs := taskResults.FinalResult(logger.TestLogger(t)) assert.NotNil(t, resultsNoFatalErrs.FatalErrors[0]) })` $DIR/core/services/job/runner_integration_test.go: `time.Sleep(1 * time.Millisecond)` $DIR/core/services/job/runner_integration_test.go: `res.WriteHeader(http.StatusOK)` $DIR/core/services/job/runner_integration_test.go: `jb = makeMinimalHTTPOracleSpec(t, db, config, cltest.NewEIP55Address().String(), transmitterAddress.Hex(), cltest.DefaultOCRKeyBundleID, serv.URL, "")` $DIR/core/services/job/runner_integration_test.go: `jb.Name = null.NewString("a job 2", true)` $DIR/core/services/job/runner_integration_test.go: `err = jobORM.CreateJob(ctx, jb)` $DIR/core/services/job/runner_integration_test.go: `_, taskResults, err = runner.ExecuteAndInsertFinishedRun(testutils.Context(t), *jb.PipelineSpec, pipeline.NewVarsFrom(nil), logger.TestLogger(t), true)` $DIR/core/services/job/runner_integration_test.go: `results = taskResults.FinalResult(logger.TestLogger(t))` $DIR/core/services/job/runner_integration_test.go: `jb = makeMinimalHTTPOracleSpec(t, db, config, cltest.NewEIP55Address().String(), transmitterAddress.Hex(), cltest.DefaultOCRKeyBundleID, serv.URL, "")` $DIR/core/services/job/runner_integration_test.go: `jb.MaxTaskDuration = models.Interval(time.Duration(1))` $DIR/core/services/job/runner_integration_test.go: `jb.Name = null.NewString("a job 3", true)` $DIR/core/services/job/runner_integration_test.go: `err = jobORM.CreateJob(ctx, jb)` $DIR/core/services/job/runner_integration_test.go: `_, taskResults, err = runner.ExecuteAndInsertFinishedRun(testutils.Context(t), *jb.PipelineSpec, pipeline.NewVarsFrom(nil), logger.TestLogger(t), true)` $DIR/core/services/job/runner_integration_test.go: `httpURL = mockHTTP.URL` $DIR/core/services/job/runner_integration_test.go: `err = jobORM.DeleteJob(ctx, jb.ID)` $DIR/core/services/job/runner_integration_test.go: `_, _, err = runner.ExecuteAndInsertFinishedRun(testutils.Context(t), *jb.PipelineSpec, pipeline.NewVarsFrom(nil), logger.TestLogger(t), true)` $DIR/core/services/job/runner_integration_test.go: `c.JobPipeline.ExternalInitiatorsEnabled = &t` $DIR/core/services/job/runner_integration_test.go: `c.Database.Listener.FallbackPollInterval = commonconfig.MustNewDuration(10 * time.Millisecond)` $DIR/core/services/job/runner_integration_test.go: `eiNotifiedOfCreate = true` $DIR/core/services/job/runner_integration_test.go: `w.WriteHeader(http.StatusOK)` $DIR/core/services/job/runner_integration_test.go: `eiNotifiedOfDelete = true` $DIR/core/services/job/runner_integration_test.go: `eiURL = mockEI.URL` $DIR/core/services/job/runner_integration_test.go: `eia = &auth.Token{ AccessKey: eip.AccessKey, Secret: eip.Secret, }` $DIR/core/services/job/runner_integration_test.go: `responseURL = bridgeRequest["responseURL"].(string)` $DIR/core/services/job/runner_integration_test.go: `w.WriteHeader(http.StatusOK)` $DIR/core/services/job/runner_integration_test.go: `_, err = io.WriteString(w, `{"pending": true}`)` $DIR/core/services/job/runner_integration_test.go: `bridgeCalled <- struct{}{}` $DIR/core/services/job/runner_integration_test.go: `bridgeName = bridge.Name.String()` $DIR/core/services/job/runner_integration_test.go: `jobID = job.ID` $DIR/core/services/job/runner_integration_test.go: `t.Run("simulate request from EI -> Core node with successful callback", func(t *testing.T) { cltest.AwaitJobActive(t, app.JobSpawner(), jobID, 3*time.Second) _ = cltest.CreateJobRunViaExternalInitiatorV2(t, app, jobUUID, *eia, cltest.MustJSONMarshal(t, eiRequest)) pipelineORM := pipeline.NewORM(app.GetDB(), logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns()) bridgesORM := bridges.NewORM(app.GetDB()) jobORM := NewTestORM(t, app.GetDB(), pipelineORM, bridgesORM, app.KeyStore) // Trigger v2/resume select { case <-bridgeCalled: case <-time.After(time.Second): t.Fatal("expected bridge server to be called") } // Make the request { url, err := url.Parse(responseURL) require.NoError(t, err) client := app.NewHTTPClient(nil) body := strings.NewReader(`{"value": {"data":{"result":"123.45"}}}`) response, cleanup := client.Patch(url.Path, body) defer cleanup() cltest.AssertServerResponse(t, response, http.StatusOK) } runs := cltest.WaitForPipelineComplete(t, 0, jobID, 1, 4, jobORM, 5*time.Second, 300*time.Millisecond) require.Len(t, runs, 1) run := runs[0] require.Len(t, run.PipelineTaskRuns, 4) require.Empty(t, run.PipelineTaskRuns[0].Error) require.Empty(t, run.PipelineTaskRuns[1].Error) require.Empty(t, run.PipelineTaskRuns[2].Error) require.Empty(t, run.PipelineTaskRuns[3].Error) require.Equal(t, jsonserializable.JSONSerializable{Val: []interface{}{"123450000000000000000"}, Valid: true}, run.Outputs) require.Equal(t, pipeline.RunErrors{null.String{NullString: sql.NullString{String: "", Valid: false}}}, run.FatalErrors) })` $DIR/core/services/job/runner_integration_test.go: `cltest.AwaitJobActive(t, app.JobSpawner(), jobID, 3*time.Second)` $DIR/core/services/job/runner_integration_test.go: `_ = cltest.CreateJobRunViaExternalInitiatorV2(t, app, jobUUID, *eia, cltest.MustJSONMarshal(t, eiRequest))` $DIR/core/services/job/runner_integration_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/services/job/runner_integration_test.go: `cltest.DeleteJobViaWeb(t, app, jobID)` $DIR/core/services/job/runner_integration_test.go: `c.JobPipeline.ExternalInitiatorsEnabled = &t` $DIR/core/services/job/runner_integration_test.go: `c.Database.Listener.FallbackPollInterval = commonconfig.MustNewDuration(10 * time.Millisecond)` $DIR/core/services/job/runner_integration_test.go: `eiNotifiedOfCreate = true` $DIR/core/services/job/runner_integration_test.go: `w.WriteHeader(http.StatusOK)` $DIR/core/services/job/runner_integration_test.go: `eiNotifiedOfDelete = true` $DIR/core/services/job/runner_integration_test.go: `eiURL = mockEI.URL` $DIR/core/services/job/runner_integration_test.go: `eia = &auth.Token{ AccessKey: eip.AccessKey, Secret: eip.Secret, }` $DIR/core/services/job/runner_integration_test.go: `responseURL = bridgeRequest["responseURL"].(string)` $DIR/core/services/job/runner_integration_test.go: `w.WriteHeader(http.StatusOK)` $DIR/core/services/job/runner_integration_test.go: `_, err = io.WriteString(w, `{"pending": true}`)` $DIR/core/services/job/runner_integration_test.go: `bridgeCalled <- struct{}{}` $DIR/core/services/job/runner_integration_test.go: `bridgeName = bridge.Name.String()` $DIR/core/services/job/runner_integration_test.go: `jobID = job.ID` $DIR/core/services/job/runner_integration_test.go: `t.Run("simulate request from EI -> Core node with erroring callback", func(t *testing.T) { _ = cltest.CreateJobRunViaExternalInitiatorV2(t, app, jobUUID, *eia, cltest.MustJSONMarshal(t, eiRequest)) pipelineORM := pipeline.NewORM(app.GetDB(), logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns()) bridgesORM := bridges.NewORM(app.GetDB()) jobORM := NewTestORM(t, app.GetDB(), pipelineORM, bridgesORM, app.KeyStore) // Trigger v2/resume select { case <-bridgeCalled: case <-time.After(time.Second): t.Fatal("expected bridge server to be called") } // Make the request { url, err := url.Parse(responseURL) require.NoError(t, err) client := app.NewHTTPClient(nil) body := strings.NewReader(`{"error": "something exploded in EA"}`) response, cleanup := client.Patch(url.Path, body) defer cleanup() cltest.AssertServerResponse(t, response, http.StatusOK) } runs := cltest.WaitForPipelineError(t, 0, jobID, 1, 4, jobORM, 5*time.Second, 300*time.Millisecond) require.Len(t, runs, 1) run := runs[0] require.Len(t, run.PipelineTaskRuns, 4) require.Empty(t, run.PipelineTaskRuns[0].Error) assert.True(t, run.PipelineTaskRuns[1].Error.Valid) assert.Equal(t, "something exploded in EA", run.PipelineTaskRuns[1].Error.String) assert.True(t, run.PipelineTaskRuns[2].Error.Valid) assert.True(t, run.PipelineTaskRuns[3].Error.Valid) require.Equal(t, jsonserializable.JSONSerializable{Val: []interface{}{interface{}(nil)}, Valid: true}, run.Outputs) require.Equal(t, pipeline.RunErrors{null.String{NullString: sql.NullString{String: "task inputs: too many errors", Valid: true}}}, run.FatalErrors) })` $DIR/core/services/job/runner_integration_test.go: `_ = cltest.CreateJobRunViaExternalInitiatorV2(t, app, jobUUID, *eia, cltest.MustJSONMarshal(t, eiRequest))` $DIR/core/services/job/runner_integration_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/services/job/runner_integration_test.go: `cltest.DeleteJobViaWeb(t, app, jobID)` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/runner_integration_test.go: `.NewKeyStore(t, db)` $DIR/core/services/job/runner_integration_test.go: `.Eth()` $DIR/core/services/job/runner_integration_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/services/job/runner_integration_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.P2P.V2.Enabled = ptr(true) c.P2P.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", freeport.GetOne(t))} kb, err := keyStore.OCR().Create(ctx) require.NoError(t, err) kbid := models.MustSha256HashFromHex(kb.ID()) c.OCR.KeyBundleID = &kbid taddress := types.EIP55AddressFromAddress(transmitterAddress) c.OCR.TransmitterAddress = &taddress c.OCR2.DatabaseTimeout = commonconfig.MustNewDuration(time.Second) c.OCR2.ContractTransmitterTransmitTimeout = commonconfig.MustNewDuration(time.Second) c.Insecure.OCRDevelopmentMode = ptr(true) })` $DIR/core/services/job/runner_integration_test.go: `.Sprintf("127.0.0.1:%d", freeport.GetOne(t))` $DIR/core/services/job/runner_integration_test.go: `.GetOne(t)` $DIR/core/services/job/runner_integration_test.go: `.OCR()` $DIR/core/services/job/runner_integration_test.go: `.Create(ctx)` $DIR/core/services/job/runner_integration_test.go: `.MustSha256HashFromHex(kb.ID())` $DIR/core/services/job/runner_integration_test.go: `.ID()` $DIR/core/services/job/runner_integration_test.go: `.EIP55AddressFromAddress(transmitterAddress)` $DIR/core/services/job/runner_integration_test.go: `.MustNewDuration(time.Second)` $DIR/core/services/job/runner_integration_test.go: `.MustNewDuration(time.Second)` $DIR/core/services/job/runner_integration_test.go: `.NewEthMocksWithDefaultChain(t)` $DIR/core/services/job/runner_integration_test.go: `.On("HeadByNumber", mock.Anything, (*big.Int)(nil))` $DIR/core/services/job/runner_integration_test.go: `.Return(cltest.Head(10), nil)` $DIR/core/services/job/runner_integration_test.go: `.Head(10)` $DIR/core/services/job/runner_integration_test.go: `.On("CallContract", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/job/runner_integration_test.go: `.Maybe()` $DIR/core/services/job/runner_integration_test.go: `.Return(nil, nil)` $DIR/core/services/job/runner_integration_test.go: `.NewORM(db, logger.TestLogger(t), config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/runner_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/runner_integration_test.go: `.JobPipeline()` $DIR/core/services/job/runner_integration_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/runner_integration_test.go: `.Cleanup(func() { assert.NoError(t, pipelineORM.Close()) })` $DIR/core/services/job/runner_integration_test.go: `.NewORM(db)` $DIR/core/services/job/runner_integration_test.go: `.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, Client: ethClient, GeneralConfig: config, KeyStore: ethKeyStore})` $DIR/core/services/job/runner_integration_test.go: `.NewLegacyChainsFromRelayerExtenders(relayExtenders)` $DIR/core/services/job/runner_integration_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/services/job/runner_integration_test.go: `.NewRunner(pipelineORM, btORM, config.JobPipeline(), config.WebServer(), legacyChains, nil, nil, logger.TestLogger(t), c, c)` $DIR/core/services/job/runner_integration_test.go: `.JobPipeline()` $DIR/core/services/job/runner_integration_test.go: `.WebServer()` $DIR/core/services/job/runner_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/runner_integration_test.go: `.Cleanup(func() { assert.NoError(t, jobORM.Close()) })` $DIR/core/services/job/runner_integration_test.go: `.MustInsertRandomKey(t, keyStore.Eth())` $DIR/core/services/job/runner_integration_test.go: `.Eth()` $DIR/core/services/job/runner_integration_test.go: `.Run(t, runner)` $DIR/core/services/job/runner_integration_test.go: `.Run("gets the election result winner", func(t *testing.T) { var httpURL string mockElectionWinner := cltest.NewHTTPMockServer(t, http.StatusOK, "POST", `Hal Finney`, func(header http.Header, s string) { var md bridges.BridgeMetaDataJSON require.NoError(t, json.Unmarshal([]byte(s), &md)) assert.Equal(t, big.NewInt(10), md.Meta.LatestAnswer) assert.Equal(t, big.NewInt(100), md.Meta.UpdatedAt) }) mockVoterTurnout := cltest.NewHTTPMockServer(t, http.StatusOK, "POST", `{"data": {"result": 62.57}}`, func(header http.Header, s string) { var md bridges.BridgeMetaDataJSON require.NoError(t, json.Unmarshal([]byte(s), &md)) assert.Equal(t, big.NewInt(10), md.Meta.LatestAnswer) assert.Equal(t, big.NewInt(100), md.Meta.UpdatedAt) }, ) mockHTTP := cltest.NewHTTPMockServer(t, http.StatusOK, "POST", `{"turnout": 61.942}`) httpURL = mockHTTP.URL _, bridgeER := cltest.MustCreateBridge(t, db, cltest.BridgeOpts{URL: mockElectionWinner.URL}) _, bridgeVT := cltest.MustCreateBridge(t, db, cltest.BridgeOpts{URL: mockVoterTurnout.URL}) // Need a job in order to create a run jb := MakeVoterTurnoutOCRJobSpecWithHTTPURL(t, transmitterAddress, httpURL, bridgeVT.Name.String(), bridgeER.Name.String()) require.NoError(t, jobORM.CreateJob(testutils.Context(t), jb)) require.NotNil(t, jb.PipelineSpec) require.NotZero(t, jb.PipelineSpec.JobID) m, err := bridges.MarshalBridgeMetaData(big.NewInt(10), big.NewInt(100)) require.NoError(t, err) runID, taskResults, err := runner.ExecuteAndInsertFinishedRun(testutils.Context(t), *jb.PipelineSpec, pipeline.NewVarsFrom(map[string]interface{}{"jobRun": map[string]interface{}{"meta": m}}), logger.TestLogger(t), true) require.NoError(t, err) results := taskResults.FinalResult(logger.TestLogger(t)) require.Len(t, results.Values, 2) require.GreaterOrEqual(t, len(results.FatalErrors), 2) assert.Nil(t, results.FatalErrors[0]) assert.Nil(t, results.FatalErrors[1]) require.GreaterOrEqual(t, len(results.AllErrors), 2) assert.Equal(t, "6225.6", results.Values[0].(decimal.Decimal).String()) assert.Equal(t, "Hal Finney", results.Values[1].(string)) // Verify individual task results var runs []pipeline.TaskRun sql := `SELECT * FROM pipeline_task_runs WHERE pipeline_run_id = $1` err = db.Select(&runs, sql, runID) assert.NoError(t, err) assert.Len(t, runs, 8) for _, run := range runs { if run.GetDotID() == "answer2" { assert.Equal(t, "Hal Finney", run.Output.Val) } else if run.GetDotID() == "ds2" { assert.Equal(t, `{"turnout": 61.942}`, run.Output.Val) } else if run.GetDotID() == "ds2_parse" { assert.Equal(t, float64(61.942), run.Output.Val) } else if run.GetDotID() == "ds2_multiply" { assert.Equal(t, "6194.2", run.Output.Val) } else if run.GetDotID() == "ds1" { assert.Equal(t, `{"data": {"result": 62.57}}`, run.Output.Val) } else if run.GetDotID() == "ds1_parse" { assert.Equal(t, float64(62.57), run.Output.Val) } else if run.GetDotID() == "ds1_multiply" { assert.Equal(t, "6257", run.Output.Val) } else if run.GetDotID() == "answer1" { assert.Equal(t, "6225.6", run.Output.Val) } else { t.Fatalf("unknown task '%v'", run.GetDotID()) } } })` $DIR/core/services/job/runner_integration_test.go: `.NewHTTPMockServer(t, http.StatusOK, "POST", `Hal Finney`, func(header http.Header, s string) { var md bridges.BridgeMetaDataJSON require.NoError(t, json.Unmarshal([]byte(s), &md)) assert.Equal(t, big.NewInt(10), md.Meta.LatestAnswer) assert.Equal(t, big.NewInt(100), md.Meta.UpdatedAt) })` $DIR/core/services/job/runner_integration_test.go: `.NewHTTPMockServer(t, http.StatusOK, "POST", `{"data": {"result": 62.57}}`, func(header http.Header, s string) { var md bridges.BridgeMetaDataJSON require.NoError(t, json.Unmarshal([]byte(s), &md)) assert.Equal(t, big.NewInt(10), md.Meta.LatestAnswer) assert.Equal(t, big.NewInt(100), md.Meta.UpdatedAt) }, )` $DIR/core/services/job/runner_integration_test.go: `.NewHTTPMockServer(t, http.StatusOK, "POST", `{"turnout": 61.942}`)` $DIR/core/services/job/runner_integration_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{URL: mockElectionWinner.URL})` $DIR/core/services/job/runner_integration_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{URL: mockVoterTurnout.URL})` $DIR/core/services/job/runner_integration_test.go: `.Name.String()` $DIR/core/services/job/runner_integration_test.go: `.Name.String()` $DIR/core/services/job/runner_integration_test.go: `.MarshalBridgeMetaData(big.NewInt(10), big.NewInt(100))` $DIR/core/services/job/runner_integration_test.go: `.NewInt(10)` $DIR/core/services/job/runner_integration_test.go: `.NewInt(100)` $DIR/core/services/job/runner_integration_test.go: `.ExecuteAndInsertFinishedRun(testutils.Context(t), *jb.PipelineSpec, pipeline.NewVarsFrom(map[string]interface{}{"jobRun": map[string]interface{}{"meta": m}}), logger.TestLogger(t), true)` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.NewVarsFrom(map[string]interface{}{"jobRun": map[string]interface{}{"meta": m}})` $DIR/core/services/job/runner_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/runner_integration_test.go: `.FinalResult(logger.TestLogger(t))` $DIR/core/services/job/runner_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/runner_integration_test.go: `.Select(&runs, sql, runID)` $DIR/core/services/job/runner_integration_test.go: `.GetDotID()` $DIR/core/services/job/runner_integration_test.go: `.GetDotID()` $DIR/core/services/job/runner_integration_test.go: `.GetDotID()` $DIR/core/services/job/runner_integration_test.go: `.GetDotID()` $DIR/core/services/job/runner_integration_test.go: `.GetDotID()` $DIR/core/services/job/runner_integration_test.go: `.GetDotID()` $DIR/core/services/job/runner_integration_test.go: `.GetDotID()` $DIR/core/services/job/runner_integration_test.go: `.GetDotID()` $DIR/core/services/job/runner_integration_test.go: `.Run("must delete job before deleting bridge", func(t *testing.T) { ctx := testutils.Context(t) _, bridge := cltest.MustCreateBridge(t, db, cltest.BridgeOpts{}) jb := makeOCRJobSpecFromToml(t, fmt.Sprintf(` type = "offchainreporting" schemaVersion = 1 evmChainID = "0" observationSource = """ ds1 [type=bridge name="%s"]; """ `, bridge.Name.String())) require.NoError(t, jobORM.CreateJob(ctx, jb)) // Should not be able to delete a bridge in use. jids, err := jobORM.FindJobIDsWithBridge(ctx, bridge.Name.String()) require.NoError(t, err) require.Equal(t, 1, len(jids)) // But if we delete the job, then we can. require.NoError(t, jobORM.DeleteJob(ctx, jb.ID)) jids, err = jobORM.FindJobIDsWithBridge(ctx, bridge.Name.String()) require.NoError(t, err) require.Equal(t, 0, len(jids)) })` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{})` $DIR/core/services/job/runner_integration_test.go: `.Sprintf(` type = "offchainreporting" schemaVersion = 1 evmChainID = "0" observationSource = """ ds1 [type=bridge name="%s"]; """ `, bridge.Name.String())` $DIR/core/services/job/runner_integration_test.go: `.Name.String()` $DIR/core/services/job/runner_integration_test.go: `.FindJobIDsWithBridge(ctx, bridge.Name.String())` $DIR/core/services/job/runner_integration_test.go: `.Name.String()` $DIR/core/services/job/runner_integration_test.go: `.FindJobIDsWithBridge(ctx, bridge.Name.String())` $DIR/core/services/job/runner_integration_test.go: `.Name.String()` $DIR/core/services/job/runner_integration_test.go: `.Run("referencing a non-existent bridge should error", func(t *testing.T) { ctx := testutils.Context(t) // Create a random bridge name _, b := cltest.MustCreateBridge(t, db, cltest.BridgeOpts{}) // Reference a different one legacyChains := cltest.NewLegacyChainsWithMockChain(t, nil, config) jb, err := ocr.ValidatedOracleSpecToml(config, legacyChains, fmt.Sprintf(` type = "offchainreporting" schemaVersion = 1 evmChainID = 0 transmitterID = "%s" contractAddress = "0x613a38AC1659769640aaE063C651F48E0250454C" isBootstrapPeer = false blockchainTimeout = "1s" observationTimeout = "10s" databaseTimeout = "2s" contractConfigTrackerPollInterval="15s" contractConfigConfirmations=1 observationGracePeriod = "2s" contractTransmitterTransmitTimeout = "5s" contractConfigTrackerSubscribeInterval="1m" observationSource = """ ds1 [type=bridge name=blah]; ds1_parse [type=jsonparse path="one,two"]; ds1_multiply [type=multiply times=1.23]; ds1 -> ds1_parse -> ds1_multiply -> answer1; answer1 [type=median index=0]; """ `, placeHolderAddress.String())) require.NoError(t, err) // Should error creating it err = jobORM.CreateJob(ctx, &jb) require.Error(t, err) assert.Contains(t, err.Error(), "not all bridges exist") // Same for ocr2 jb2, err := validate.ValidatedOracleSpecToml(testutils.Context(t), config.OCR2(), config.Insecure(), fmt.Sprintf(` type = "offchainreporting2" pluginType = "median" schemaVersion = 1 relay = "evm" contractID = "0x613a38AC1659769640aaE063C651F48E0250454C" transmitterID = "%s" blockchainTimeout = "1s" contractConfigTrackerPollInterval = "15s" contractConfigConfirmations = 1 observationSource = """ ds1 [type=bridge name="%s"]; ds1_parse [type=jsonparse path="one,two"]; ds1_multiply [type=multiply times=1.23]; ds1 -> ds1_parse -> ds1_multiply -> answer1; answer1 [type=median index=0]; """ [relayConfig] chainID = 1337 [pluginConfig] juelsPerFeeCoinSource = """ ds1 [type=bridge name=blah]; ds1_parse [type=jsonparse path="one,two"]; ds1_multiply [type=multiply times=1.23]; ds1 -> ds1_parse -> ds1_multiply -> answer1; answer1 [type=median index=0]; """ `, placeHolderAddress.String(), b.Name.String()), nil) require.NoError(t, err) // Should error creating it because of the juels per fee coin non-existent bridge err = jobORM.CreateJob(ctx, &jb2) require.Error(t, err) assert.Contains(t, err.Error(), "not all bridges exist") // Duplicate bridge names that exist is ok jb3, err := validate.ValidatedOracleSpecToml(testutils.Context(t), config.OCR2(), config.Insecure(), fmt.Sprintf(` type = "offchainreporting2" pluginType = "median" schemaVersion = 1 relay = "evm" contractID = "0x613a38AC1659769640aaE063C651F48E0250454C" transmitterID = "%s" blockchainTimeout = "1s" contractConfigTrackerPollInterval = "15s" contractConfigConfirmations = 1 observationSource = """ ds1 [type=bridge name="%s"]; ds1_parse [type=jsonparse path="one,two"]; ds1_multiply [type=multiply times=1.23]; ds1 -> ds1_parse -> ds1_multiply -> answer1; answer1 [type=median index=0]; """ [relayConfig] chainID = 1337 [pluginConfig] juelsPerFeeCoinSource = """ ds1 [type=bridge name="%s"]; ds1_parse [type=jsonparse path="one,two"]; ds1_multiply [type=multiply times=1.23]; ds1 -> ds1_parse -> ds1_multiply -> answer1; ds2 [type=bridge name="%s"]; ds2_parse [type=jsonparse path="one,two"]; ds2_multiply [type=multiply times=1.23]; ds2 -> ds2_parse -> ds2_multiply -> answer1; answer1 [type=median index=0]; """ `, placeHolderAddress, b.Name.String(), b.Name.String(), b.Name.String()), nil) require.NoError(t, err) // Should not error with duplicate bridges err = jobORM.CreateJob(ctx, &jb3) require.NoError(t, err) })` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{})` $DIR/core/services/job/runner_integration_test.go: `.NewLegacyChainsWithMockChain(t, nil, config)` $DIR/core/services/job/runner_integration_test.go: `.ValidatedOracleSpecToml(config, legacyChains, fmt.Sprintf(` type = "offchainreporting" schemaVersion = 1 evmChainID = 0 transmitterID = "%s" contractAddress = "0x613a38AC1659769640aaE063C651F48E0250454C" isBootstrapPeer = false blockchainTimeout = "1s" observationTimeout = "10s" databaseTimeout = "2s" contractConfigTrackerPollInterval="15s" contractConfigConfirmations=1 observationGracePeriod = "2s" contractTransmitterTransmitTimeout = "5s" contractConfigTrackerSubscribeInterval="1m" observationSource = """ ds1 [type=bridge name=blah]; ds1_parse [type=jsonparse path="one,two"]; ds1_multiply [type=multiply times=1.23]; ds1 -> ds1_parse -> ds1_multiply -> answer1; answer1 [type=median index=0]; """ `, placeHolderAddress.String()))` $DIR/core/services/job/runner_integration_test.go: `.Sprintf(` type = "offchainreporting" schemaVersion = 1 evmChainID = 0 transmitterID = "%s" contractAddress = "0x613a38AC1659769640aaE063C651F48E0250454C" isBootstrapPeer = false blockchainTimeout = "1s" observationTimeout = "10s" databaseTimeout = "2s" contractConfigTrackerPollInterval="15s" contractConfigConfirmations=1 observationGracePeriod = "2s" contractTransmitterTransmitTimeout = "5s" contractConfigTrackerSubscribeInterval="1m" observationSource = """ ds1 [type=bridge name=blah]; ds1_parse [type=jsonparse path="one,two"]; ds1_multiply [type=multiply times=1.23]; ds1 -> ds1_parse -> ds1_multiply -> answer1; answer1 [type=median index=0]; """ `, placeHolderAddress.String())` $DIR/core/services/job/runner_integration_test.go: `.String()` $DIR/core/services/job/runner_integration_test.go: `.CreateJob(ctx, &jb)` $DIR/core/services/job/runner_integration_test.go: `.ValidatedOracleSpecToml(testutils.Context(t), config.OCR2(), config.Insecure(), fmt.Sprintf(` type = "offchainreporting2" pluginType = "median" schemaVersion = 1 relay = "evm" contractID = "0x613a38AC1659769640aaE063C651F48E0250454C" transmitterID = "%s" blockchainTimeout = "1s" contractConfigTrackerPollInterval = "15s" contractConfigConfirmations = 1 observationSource = """ ds1 [type=bridge name="%s"]; ds1_parse [type=jsonparse path="one,two"]; ds1_multiply [type=multiply times=1.23]; ds1 -> ds1_parse -> ds1_multiply -> answer1; answer1 [type=median index=0]; """ [relayConfig] chainID = 1337 [pluginConfig] juelsPerFeeCoinSource = """ ds1 [type=bridge name=blah]; ds1_parse [type=jsonparse path="one,two"]; ds1_multiply [type=multiply times=1.23]; ds1 -> ds1_parse -> ds1_multiply -> answer1; answer1 [type=median index=0]; """ `, placeHolderAddress.String(), b.Name.String()), nil)` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.OCR2()` $DIR/core/services/job/runner_integration_test.go: `.Insecure()` $DIR/core/services/job/runner_integration_test.go: `.Sprintf(` type = "offchainreporting2" pluginType = "median" schemaVersion = 1 relay = "evm" contractID = "0x613a38AC1659769640aaE063C651F48E0250454C" transmitterID = "%s" blockchainTimeout = "1s" contractConfigTrackerPollInterval = "15s" contractConfigConfirmations = 1 observationSource = """ ds1 [type=bridge name="%s"]; ds1_parse [type=jsonparse path="one,two"]; ds1_multiply [type=multiply times=1.23]; ds1 -> ds1_parse -> ds1_multiply -> answer1; answer1 [type=median index=0]; """ [relayConfig] chainID = 1337 [pluginConfig] juelsPerFeeCoinSource = """ ds1 [type=bridge name=blah]; ds1_parse [type=jsonparse path="one,two"]; ds1_multiply [type=multiply times=1.23]; ds1 -> ds1_parse -> ds1_multiply -> answer1; answer1 [type=median index=0]; """ `, placeHolderAddress.String(), b.Name.String())` $DIR/core/services/job/runner_integration_test.go: `.String()` $DIR/core/services/job/runner_integration_test.go: `.Name.String()` $DIR/core/services/job/runner_integration_test.go: `.CreateJob(ctx, &jb2)` $DIR/core/services/job/runner_integration_test.go: `.ValidatedOracleSpecToml(testutils.Context(t), config.OCR2(), config.Insecure(), fmt.Sprintf(` type = "offchainreporting2" pluginType = "median" schemaVersion = 1 relay = "evm" contractID = "0x613a38AC1659769640aaE063C651F48E0250454C" transmitterID = "%s" blockchainTimeout = "1s" contractConfigTrackerPollInterval = "15s" contractConfigConfirmations = 1 observationSource = """ ds1 [type=bridge name="%s"]; ds1_parse [type=jsonparse path="one,two"]; ds1_multiply [type=multiply times=1.23]; ds1 -> ds1_parse -> ds1_multiply -> answer1; answer1 [type=median index=0]; """ [relayConfig] chainID = 1337 [pluginConfig] juelsPerFeeCoinSource = """ ds1 [type=bridge name="%s"]; ds1_parse [type=jsonparse path="one,two"]; ds1_multiply [type=multiply times=1.23]; ds1 -> ds1_parse -> ds1_multiply -> answer1; ds2 [type=bridge name="%s"]; ds2_parse [type=jsonparse path="one,two"]; ds2_multiply [type=multiply times=1.23]; ds2 -> ds2_parse -> ds2_multiply -> answer1; answer1 [type=median index=0]; """ `, placeHolderAddress, b.Name.String(), b.Name.String(), b.Name.String()), nil)` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.OCR2()` $DIR/core/services/job/runner_integration_test.go: `.Insecure()` $DIR/core/services/job/runner_integration_test.go: `.Sprintf(` type = "offchainreporting2" pluginType = "median" schemaVersion = 1 relay = "evm" contractID = "0x613a38AC1659769640aaE063C651F48E0250454C" transmitterID = "%s" blockchainTimeout = "1s" contractConfigTrackerPollInterval = "15s" contractConfigConfirmations = 1 observationSource = """ ds1 [type=bridge name="%s"]; ds1_parse [type=jsonparse path="one,two"]; ds1_multiply [type=multiply times=1.23]; ds1 -> ds1_parse -> ds1_multiply -> answer1; answer1 [type=median index=0]; """ [relayConfig] chainID = 1337 [pluginConfig] juelsPerFeeCoinSource = """ ds1 [type=bridge name="%s"]; ds1_parse [type=jsonparse path="one,two"]; ds1_multiply [type=multiply times=1.23]; ds1 -> ds1_parse -> ds1_multiply -> answer1; ds2 [type=bridge name="%s"]; ds2_parse [type=jsonparse path="one,two"]; ds2_multiply [type=multiply times=1.23]; ds2 -> ds2_parse -> ds2_multiply -> answer1; answer1 [type=median index=0]; """ `, placeHolderAddress, b.Name.String(), b.Name.String(), b.Name.String())` $DIR/core/services/job/runner_integration_test.go: `.Name.String()` $DIR/core/services/job/runner_integration_test.go: `.Name.String()` $DIR/core/services/job/runner_integration_test.go: `.Name.String()` $DIR/core/services/job/runner_integration_test.go: `.CreateJob(ctx, &jb3)` $DIR/core/services/job/runner_integration_test.go: `.Run("handles the case where the parsed value is literally null", func(t *testing.T) { ctx := testutils.Context(t) var httpURL string resp := `{"USD": null}` { mockHTTP := cltest.NewHTTPMockServer(t, http.StatusOK, "GET", resp) httpURL = mockHTTP.URL } // Need a job in order to create a run jb := makeSimpleFetchOCRJobSpecWithHTTPURL(t, transmitterAddress, httpURL, false) err := jobORM.CreateJob(ctx, jb) require.NoError(t, err) runID, taskResults, err := runner.ExecuteAndInsertFinishedRun(testutils.Context(t), *jb.PipelineSpec, pipeline.NewVarsFrom(nil), logger.TestLogger(t), true) require.NoError(t, err) results := taskResults.FinalResult(logger.TestLogger(t)) assert.Len(t, results.FatalErrors, 1) assert.Len(t, results.Values, 1) assert.Contains(t, results.FatalErrors[0].Error(), "type cannot be converted to decimal.Decimal") assert.Nil(t, results.Values[0]) // Verify individual task results var runs []pipeline.TaskRun sql := `SELECT * FROM pipeline_task_runs WHERE pipeline_run_id = $1` err = db.Select(&runs, sql, runID) assert.NoError(t, err) require.Len(t, runs, 3) for _, run := range runs { if run.GetDotID() == "ds1" { assert.True(t, run.Error.IsZero()) require.NotNil(t, resp, run.Output) assert.Equal(t, resp, run.Output.Val) } else if run.GetDotID() == "ds1_parse" { assert.True(t, run.Error.IsZero()) assert.False(t, run.Output.Valid) } else if run.GetDotID() == "ds1_multiply" { assert.Contains(t, run.Error.ValueOrZero(), "type cannot be converted to decimal.Decimal") assert.False(t, run.Output.Valid) } else { t.Fatalf("unknown task '%v'", run.GetDotID()) } } })` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.NewHTTPMockServer(t, http.StatusOK, "GET", resp)` $DIR/core/services/job/runner_integration_test.go: `.CreateJob(ctx, jb)` $DIR/core/services/job/runner_integration_test.go: `.ExecuteAndInsertFinishedRun(testutils.Context(t), *jb.PipelineSpec, pipeline.NewVarsFrom(nil), logger.TestLogger(t), true)` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.NewVarsFrom(nil)` $DIR/core/services/job/runner_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/runner_integration_test.go: `.FinalResult(logger.TestLogger(t))` $DIR/core/services/job/runner_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/runner_integration_test.go: `.Select(&runs, sql, runID)` $DIR/core/services/job/runner_integration_test.go: `.GetDotID()` $DIR/core/services/job/runner_integration_test.go: `.GetDotID()` $DIR/core/services/job/runner_integration_test.go: `.GetDotID()` $DIR/core/services/job/runner_integration_test.go: `.Run("handles the case where the jsonparse lookup path is missing from the http response", func(t *testing.T) { var httpURL string resp := "{\"Response\":\"Error\",\"Message\":\"You are over your rate limit please upgrade your account!\",\"HasWarning\":false,\"Type\":99,\"RateLimit\":{\"calls_made\":{\"second\":5,\"minute\":5,\"hour\":955,\"day\":10004,\"month\":15146,\"total_calls\":15152},\"max_calls\":{\"second\":20,\"minute\":300,\"hour\":3000,\"day\":10000,\"month\":75000}},\"Data\":{}}" { mockHTTP := cltest.NewHTTPMockServer(t, http.StatusOK, "GET", resp) httpURL = mockHTTP.URL } // Need a job in order to create a run jb := makeSimpleFetchOCRJobSpecWithHTTPURL(t, transmitterAddress, httpURL, false) err := jobORM.CreateJob(testutils.Context(t), jb) require.NoError(t, err) runID, taskResults, err := runner.ExecuteAndInsertFinishedRun(testutils.Context(t), *jb.PipelineSpec, pipeline.NewVarsFrom(nil), logger.TestLogger(t), true) require.NoError(t, err) results := taskResults.FinalResult(logger.TestLogger(t)) assert.Len(t, results.Values, 1) assert.Len(t, results.FatalErrors, 1) assert.Contains(t, results.FatalErrors[0].Error(), pipeline.ErrTooManyErrors.Error()) assert.Nil(t, results.Values[0]) // Verify individual task results var runs []pipeline.TaskRun sql := `SELECT * FROM pipeline_task_runs WHERE pipeline_run_id = $1` err = db.Select(&runs, sql, runID) assert.NoError(t, err) require.Len(t, runs, 3) for _, run := range runs { if run.GetDotID() == "ds1" { assert.True(t, run.Error.IsZero()) assert.Equal(t, resp, run.Output.Val) } else if run.GetDotID() == "ds1_parse" { assert.Contains(t, run.Error.ValueOrZero(), "could not resolve path [\"USD\"] in {\"Response\":\"Error\",\"Message\":\"You are over your rate limit please upgrade your account!\",\"HasWarning\":false,\"Type\":99,\"RateLimit\":{\"calls_made\":{\"second\":5,\"minute\":5,\"hour\":955,\"day\":10004,\"month\":15146,\"total_calls\":15152},\"max_calls\":{\"second\":20,\"minute\":300,\"hour\":3000,\"day\":10000,\"month\":75000}},\"Data\":{}}") assert.False(t, run.Output.Valid) } else if run.GetDotID() == "ds1_multiply" { assert.Contains(t, run.Error.ValueOrZero(), pipeline.ErrTooManyErrors.Error()) assert.False(t, run.Output.Valid) } else { t.Fatalf("unknown task '%v'", run.GetDotID()) } } })` $DIR/core/services/job/runner_integration_test.go: `.NewHTTPMockServer(t, http.StatusOK, "GET", resp)` $DIR/core/services/job/runner_integration_test.go: `.CreateJob(testutils.Context(t), jb)` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.ExecuteAndInsertFinishedRun(testutils.Context(t), *jb.PipelineSpec, pipeline.NewVarsFrom(nil), logger.TestLogger(t), true)` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.NewVarsFrom(nil)` $DIR/core/services/job/runner_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/runner_integration_test.go: `.FinalResult(logger.TestLogger(t))` $DIR/core/services/job/runner_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/runner_integration_test.go: `.Select(&runs, sql, runID)` $DIR/core/services/job/runner_integration_test.go: `.GetDotID()` $DIR/core/services/job/runner_integration_test.go: `.GetDotID()` $DIR/core/services/job/runner_integration_test.go: `.GetDotID()` $DIR/core/services/job/runner_integration_test.go: `.Run("handles the case where the jsonparse lookup path is missing from the http response and lax is enabled", func(t *testing.T) { var httpURL string resp := "{\"Response\":\"Error\",\"Message\":\"You are over your rate limit please upgrade your account!\",\"HasWarning\":false,\"Type\":99,\"RateLimit\":{\"calls_made\":{\"second\":5,\"minute\":5,\"hour\":955,\"day\":10004,\"month\":15146,\"total_calls\":15152},\"max_calls\":{\"second\":20,\"minute\":300,\"hour\":3000,\"day\":10000,\"month\":75000}},\"Data\":{}}" { mockHTTP := cltest.NewHTTPMockServer(t, http.StatusOK, "GET", resp) httpURL = mockHTTP.URL } // Need a job in order to create a run jb := makeSimpleFetchOCRJobSpecWithHTTPURL(t, transmitterAddress, httpURL, true) err := jobORM.CreateJob(testutils.Context(t), jb) require.NoError(t, err) runID, taskResults, err := runner.ExecuteAndInsertFinishedRun(testutils.Context(t), *jb.PipelineSpec, pipeline.NewVarsFrom(nil), logger.TestLogger(t), true) require.NoError(t, err) results := taskResults.FinalResult(logger.TestLogger(t)) assert.Len(t, results.Values, 1) assert.Contains(t, results.FatalErrors[0].Error(), "type cannot be converted to decimal.Decimal") assert.Nil(t, results.Values[0]) // Verify individual task results var runs []pipeline.TaskRun sql := `SELECT * FROM pipeline_task_runs WHERE pipeline_run_id = $1` err = db.Select(&runs, sql, runID) assert.NoError(t, err) require.Len(t, runs, 3) for _, run := range runs { if run.GetDotID() == "ds1" { assert.True(t, run.Error.IsZero()) assert.Equal(t, resp, run.Output.Val) } else if run.GetDotID() == "ds1_parse" { assert.True(t, run.Error.IsZero()) assert.False(t, run.Output.Valid) } else if run.GetDotID() == "ds1_multiply" { assert.Contains(t, run.Error.ValueOrZero(), "type cannot be converted to decimal.Decimal") assert.False(t, run.Output.Valid) } else { t.Fatalf("unknown task '%v'", run.GetDotID()) } } })` $DIR/core/services/job/runner_integration_test.go: `.NewHTTPMockServer(t, http.StatusOK, "GET", resp)` $DIR/core/services/job/runner_integration_test.go: `.CreateJob(testutils.Context(t), jb)` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.ExecuteAndInsertFinishedRun(testutils.Context(t), *jb.PipelineSpec, pipeline.NewVarsFrom(nil), logger.TestLogger(t), true)` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.NewVarsFrom(nil)` $DIR/core/services/job/runner_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/runner_integration_test.go: `.FinalResult(logger.TestLogger(t))` $DIR/core/services/job/runner_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/runner_integration_test.go: `.Select(&runs, sql, runID)` $DIR/core/services/job/runner_integration_test.go: `.GetDotID()` $DIR/core/services/job/runner_integration_test.go: `.GetDotID()` $DIR/core/services/job/runner_integration_test.go: `.GetDotID()` $DIR/core/services/job/runner_integration_test.go: `.Run("minimal bootstrap", func(t *testing.T) { ctx := testutils.Context(t) s := ` type = "offchainreporting" schemaVersion = 1 contractAddress = "%s" isBootstrapPeer = true evmChainID = "0" ` s = fmt.Sprintf(s, cltest.NewEIP55Address()) jb, err := ocr.ValidatedOracleSpecToml(config, legacyChains, s) require.NoError(t, err) err = toml.Unmarshal([]byte(s), &jb) require.NoError(t, err) jb.MaxTaskDuration = models.Interval(cltest.MustParseDuration(t, "1s")) err = jobORM.CreateJob(testutils.Context(t), &jb) require.NoError(t, err) lggr := logger.TestLogger(t) _, err = keyStore.P2P().Create(ctx) assert.NoError(t, err) pw := ocrcommon.NewSingletonPeerWrapper(keyStore, config.P2P(), config.OCR(), db, lggr) servicetest.Run(t, pw) sd := ocr.NewDelegate( db, jobORM, keyStore, nil, pw, monitoringEndpoint, legacyChains, lggr, config, servicetest.Run(t, mailboxtest.NewMonitor(t)), ) _, err = sd.ServicesForSpec(testutils.Context(t), jb) require.NoError(t, err) })` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.Sprintf(s, cltest.NewEIP55Address())` $DIR/core/services/job/runner_integration_test.go: `.NewEIP55Address()` $DIR/core/services/job/runner_integration_test.go: `.ValidatedOracleSpecToml(config, legacyChains, s)` $DIR/core/services/job/runner_integration_test.go: `.Unmarshal([]byte(s), &jb)` $DIR/core/services/job/runner_integration_test.go: `.Interval(cltest.MustParseDuration(t, "1s"))` $DIR/core/services/job/runner_integration_test.go: `.MustParseDuration(t, "1s")` $DIR/core/services/job/runner_integration_test.go: `.CreateJob(testutils.Context(t), &jb)` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/runner_integration_test.go: `.P2P()` $DIR/core/services/job/runner_integration_test.go: `.Create(ctx)` $DIR/core/services/job/runner_integration_test.go: `.NewSingletonPeerWrapper(keyStore, config.P2P(), config.OCR(), db, lggr)` $DIR/core/services/job/runner_integration_test.go: `.P2P()` $DIR/core/services/job/runner_integration_test.go: `.OCR()` $DIR/core/services/job/runner_integration_test.go: `.Run(t, pw)` $DIR/core/services/job/runner_integration_test.go: `.NewDelegate( db, jobORM, keyStore, nil, pw, monitoringEndpoint, legacyChains, lggr, config, servicetest.Run(t, mailboxtest.NewMonitor(t)), )` $DIR/core/services/job/runner_integration_test.go: `.Run(t, mailboxtest.NewMonitor(t))` $DIR/core/services/job/runner_integration_test.go: `.NewMonitor(t)` $DIR/core/services/job/runner_integration_test.go: `.ServicesForSpec(testutils.Context(t), jb)` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.Run("test min non-bootstrap", func(t *testing.T) { ctx := testutils.Context(t) kb, err := keyStore.OCR().Create(ctx) require.NoError(t, err) s := fmt.Sprintf(minimalNonBootstrapTemplate, cltest.NewEIP55Address(), transmitterAddress.Hex(), kb.ID(), "http://blah.com", "") jb, err := ocr.ValidatedOracleSpecToml(config, legacyChains, s) require.NoError(t, err) err = toml.Unmarshal([]byte(s), &jb) require.NoError(t, err) jb.MaxTaskDuration = models.Interval(cltest.MustParseDuration(t, "1s")) err = jobORM.CreateJob(testutils.Context(t), &jb) require.NoError(t, err) assert.Equal(t, jb.MaxTaskDuration, models.Interval(cltest.MustParseDuration(t, "1s"))) lggr := logger.TestLogger(t) pw := ocrcommon.NewSingletonPeerWrapper(keyStore, config.P2P(), config.OCR(), db, lggr) servicetest.Run(t, pw) sd := ocr.NewDelegate( db, jobORM, keyStore, nil, pw, monitoringEndpoint, legacyChains, lggr, config, servicetest.Run(t, mailboxtest.NewMonitor(t)), ) _, err = sd.ServicesForSpec(testutils.Context(t), jb) require.NoError(t, err) })` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.OCR()` $DIR/core/services/job/runner_integration_test.go: `.Create(ctx)` $DIR/core/services/job/runner_integration_test.go: `.Sprintf(minimalNonBootstrapTemplate, cltest.NewEIP55Address(), transmitterAddress.Hex(), kb.ID(), "http://blah.com", "")` $DIR/core/services/job/runner_integration_test.go: `.NewEIP55Address()` $DIR/core/services/job/runner_integration_test.go: `.Hex()` $DIR/core/services/job/runner_integration_test.go: `.ID()` $DIR/core/services/job/runner_integration_test.go: `.ValidatedOracleSpecToml(config, legacyChains, s)` $DIR/core/services/job/runner_integration_test.go: `.Unmarshal([]byte(s), &jb)` $DIR/core/services/job/runner_integration_test.go: `.Interval(cltest.MustParseDuration(t, "1s"))` $DIR/core/services/job/runner_integration_test.go: `.MustParseDuration(t, "1s")` $DIR/core/services/job/runner_integration_test.go: `.CreateJob(testutils.Context(t), &jb)` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/runner_integration_test.go: `.NewSingletonPeerWrapper(keyStore, config.P2P(), config.OCR(), db, lggr)` $DIR/core/services/job/runner_integration_test.go: `.P2P()` $DIR/core/services/job/runner_integration_test.go: `.OCR()` $DIR/core/services/job/runner_integration_test.go: `.Run(t, pw)` $DIR/core/services/job/runner_integration_test.go: `.NewDelegate( db, jobORM, keyStore, nil, pw, monitoringEndpoint, legacyChains, lggr, config, servicetest.Run(t, mailboxtest.NewMonitor(t)), )` $DIR/core/services/job/runner_integration_test.go: `.Run(t, mailboxtest.NewMonitor(t))` $DIR/core/services/job/runner_integration_test.go: `.NewMonitor(t)` $DIR/core/services/job/runner_integration_test.go: `.ServicesForSpec(testutils.Context(t), jb)` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.Run("test min bootstrap", func(t *testing.T) { s := fmt.Sprintf(minimalBootstrapTemplate, cltest.NewEIP55Address()) jb, err := ocr.ValidatedOracleSpecToml(config, legacyChains, s) require.NoError(t, err) err = toml.Unmarshal([]byte(s), &jb) require.NoError(t, err) err = jobORM.CreateJob(testutils.Context(t), &jb) require.NoError(t, err) lggr := logger.TestLogger(t) pw := ocrcommon.NewSingletonPeerWrapper(keyStore, config.P2P(), config.OCR(), db, lggr) servicetest.Run(t, pw) sd := ocr.NewDelegate( db, jobORM, keyStore, nil, pw, monitoringEndpoint, legacyChains, lggr, config, servicetest.Run(t, mailboxtest.NewMonitor(t)), ) _, err = sd.ServicesForSpec(testutils.Context(t), jb) require.NoError(t, err) })` $DIR/core/services/job/runner_integration_test.go: `.Sprintf(minimalBootstrapTemplate, cltest.NewEIP55Address())` $DIR/core/services/job/runner_integration_test.go: `.NewEIP55Address()` $DIR/core/services/job/runner_integration_test.go: `.ValidatedOracleSpecToml(config, legacyChains, s)` $DIR/core/services/job/runner_integration_test.go: `.Unmarshal([]byte(s), &jb)` $DIR/core/services/job/runner_integration_test.go: `.CreateJob(testutils.Context(t), &jb)` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/runner_integration_test.go: `.NewSingletonPeerWrapper(keyStore, config.P2P(), config.OCR(), db, lggr)` $DIR/core/services/job/runner_integration_test.go: `.P2P()` $DIR/core/services/job/runner_integration_test.go: `.OCR()` $DIR/core/services/job/runner_integration_test.go: `.Run(t, pw)` $DIR/core/services/job/runner_integration_test.go: `.NewDelegate( db, jobORM, keyStore, nil, pw, monitoringEndpoint, legacyChains, lggr, config, servicetest.Run(t, mailboxtest.NewMonitor(t)), )` $DIR/core/services/job/runner_integration_test.go: `.Run(t, mailboxtest.NewMonitor(t))` $DIR/core/services/job/runner_integration_test.go: `.NewMonitor(t)` $DIR/core/services/job/runner_integration_test.go: `.ServicesForSpec(testutils.Context(t), jb)` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.Run("test enhanced telemetry service creation", func(t *testing.T) { ctx := testutils.Context(t) testCases := []struct { jbCaptureEATelemetry bool specCaptureEATelemetry bool expected bool }{{false, false, false}, {true, false, false}, {false, true, true}, {true, true, true}, } for _, tc := range testCases { config = configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.P2P.V2.Enabled = ptr(true) c.P2P.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", freeport.GetOne(t))} c.OCR.CaptureEATelemetry = ptr(tc.specCaptureEATelemetry) }) relayExtenders = evmtest.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, Client: ethClient, GeneralConfig: config, KeyStore: ethKeyStore}) legacyChains = evmrelay.NewLegacyChainsFromRelayerExtenders(relayExtenders) kb, err := keyStore.OCR().Create(ctx) require.NoError(t, err) s := fmt.Sprintf(minimalNonBootstrapTemplate, cltest.NewEIP55Address(), transmitterAddress.Hex(), kb.ID(), "http://blah.com", "") jb, err := ocr.ValidatedOracleSpecToml(config, legacyChains, s) require.NoError(t, err) err = toml.Unmarshal([]byte(s), &jb) require.NoError(t, err) jb.MaxTaskDuration = models.Interval(cltest.MustParseDuration(t, "1s")) err = jobORM.CreateJob(testutils.Context(t), &jb) require.NoError(t, err) assert.Equal(t, jb.MaxTaskDuration, models.Interval(cltest.MustParseDuration(t, "1s"))) lggr := logger.TestLogger(t) pw := ocrcommon.NewSingletonPeerWrapper(keyStore, config.P2P(), config.OCR(), db, lggr) servicetest.Run(t, pw) sd := ocr.NewDelegate( db, jobORM, keyStore, nil, pw, monitoringEndpoint, legacyChains, lggr, config, servicetest.Run(t, mailboxtest.NewMonitor(t)), ) jb.OCROracleSpec.CaptureEATelemetry = tc.jbCaptureEATelemetry services, err := sd.ServicesForSpec(testutils.Context(t), jb) require.NoError(t, err) enhancedTelemetryServiceCreated := false for _, service := range services { _, ok := service.(*ocrcommon.EnhancedTelemetryService[ocrcommon.EnhancedTelemetryData]) enhancedTelemetryServiceCreated = ok if enhancedTelemetryServiceCreated { break } } require.Equal(t, tc.expected, enhancedTelemetryServiceCreated) } })` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.P2P.V2.Enabled = ptr(true) c.P2P.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", freeport.GetOne(t))} c.OCR.CaptureEATelemetry = ptr(tc.specCaptureEATelemetry) })` $DIR/core/services/job/runner_integration_test.go: `.Sprintf("127.0.0.1:%d", freeport.GetOne(t))` $DIR/core/services/job/runner_integration_test.go: `.GetOne(t)` $DIR/core/services/job/runner_integration_test.go: `.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, Client: ethClient, GeneralConfig: config, KeyStore: ethKeyStore})` $DIR/core/services/job/runner_integration_test.go: `.NewLegacyChainsFromRelayerExtenders(relayExtenders)` $DIR/core/services/job/runner_integration_test.go: `.OCR()` $DIR/core/services/job/runner_integration_test.go: `.Create(ctx)` $DIR/core/services/job/runner_integration_test.go: `.Sprintf(minimalNonBootstrapTemplate, cltest.NewEIP55Address(), transmitterAddress.Hex(), kb.ID(), "http://blah.com", "")` $DIR/core/services/job/runner_integration_test.go: `.NewEIP55Address()` $DIR/core/services/job/runner_integration_test.go: `.Hex()` $DIR/core/services/job/runner_integration_test.go: `.ID()` $DIR/core/services/job/runner_integration_test.go: `.ValidatedOracleSpecToml(config, legacyChains, s)` $DIR/core/services/job/runner_integration_test.go: `.Unmarshal([]byte(s), &jb)` $DIR/core/services/job/runner_integration_test.go: `.Interval(cltest.MustParseDuration(t, "1s"))` $DIR/core/services/job/runner_integration_test.go: `.MustParseDuration(t, "1s")` $DIR/core/services/job/runner_integration_test.go: `.CreateJob(testutils.Context(t), &jb)` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/runner_integration_test.go: `.NewSingletonPeerWrapper(keyStore, config.P2P(), config.OCR(), db, lggr)` $DIR/core/services/job/runner_integration_test.go: `.P2P()` $DIR/core/services/job/runner_integration_test.go: `.OCR()` $DIR/core/services/job/runner_integration_test.go: `.Run(t, pw)` $DIR/core/services/job/runner_integration_test.go: `.NewDelegate( db, jobORM, keyStore, nil, pw, monitoringEndpoint, legacyChains, lggr, config, servicetest.Run(t, mailboxtest.NewMonitor(t)), )` $DIR/core/services/job/runner_integration_test.go: `.Run(t, mailboxtest.NewMonitor(t))` $DIR/core/services/job/runner_integration_test.go: `.NewMonitor(t)` $DIR/core/services/job/runner_integration_test.go: `.ServicesForSpec(testutils.Context(t), jb)` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.Run("test job spec error is created", func(t *testing.T) { ctx := testutils.Context(t) // Create a keystore with an ocr key bundle and p2p key. kb, err := keyStore.OCR().Create(ctx) require.NoError(t, err) spec := fmt.Sprintf(ocrJobSpecTemplate, testutils.NewAddress().Hex(), kb.ID(), transmitterAddress.Hex(), fmt.Sprintf(simpleFetchDataSourceTemplate, "blah", true)) jb := makeOCRJobSpecFromToml(t, spec) // Create an OCR job err = jobORM.CreateJob(ctx, jb) require.NoError(t, err) lggr := logger.TestLogger(t) pw := ocrcommon.NewSingletonPeerWrapper(keyStore, config.P2P(), config.OCR(), db, lggr) servicetest.Run(t, pw) sd := ocr.NewDelegate( db, jobORM, keyStore, nil, pw, monitoringEndpoint, legacyChains, lggr, config, servicetest.Run(t, mailboxtest.NewMonitor(t)), ) services, err := sd.ServicesForSpec(testutils.Context(t), *jb) require.NoError(t, err) // Return an error getting the contract code. ethClient.On("CodeAt", mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("no such code")) for _, s := range services { err = s.Start(ctx) require.NoError(t, err) } var se []job.SpecError require.Eventually(t, func() bool { err = db.Select(&se, `SELECT * FROM job_spec_errors`) require.NoError(t, err) return len(se) == 1 }, time.Second, 100*time.Millisecond) require.Len(t, se, 1) assert.Equal(t, uint(1), se[0].Occurrences) for _, s := range services { err = s.Close() require.NoError(t, err) } // Ensure we can delete an errored err = jobORM.DeleteJob(ctx, jb.ID) require.NoError(t, err) se = []job.SpecError{} err = db.Select(&se, `SELECT * FROM job_spec_errors`) require.NoError(t, err) require.Len(t, se, 0) // TODO: This breaks the txdb connection, failing subsequent tests. Resolve in the future // Noop once the job is gone. // jobORM.RecordError(testutils.Context(t), jb.ID, "test") // err = db.Find(&se).Error // require.NoError(t, err) // require.Len(t, se, 0) })` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.OCR()` $DIR/core/services/job/runner_integration_test.go: `.Create(ctx)` $DIR/core/services/job/runner_integration_test.go: `.Sprintf(ocrJobSpecTemplate, testutils.NewAddress().Hex(), kb.ID(), transmitterAddress.Hex(), fmt.Sprintf(simpleFetchDataSourceTemplate, "blah", true))` $DIR/core/services/job/runner_integration_test.go: `.NewAddress()` $DIR/core/services/job/runner_integration_test.go: `.Hex()` $DIR/core/services/job/runner_integration_test.go: `.ID()` $DIR/core/services/job/runner_integration_test.go: `.Hex()` $DIR/core/services/job/runner_integration_test.go: `.Sprintf(simpleFetchDataSourceTemplate, "blah", true)` $DIR/core/services/job/runner_integration_test.go: `.CreateJob(ctx, jb)` $DIR/core/services/job/runner_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/runner_integration_test.go: `.NewSingletonPeerWrapper(keyStore, config.P2P(), config.OCR(), db, lggr)` $DIR/core/services/job/runner_integration_test.go: `.P2P()` $DIR/core/services/job/runner_integration_test.go: `.OCR()` $DIR/core/services/job/runner_integration_test.go: `.Run(t, pw)` $DIR/core/services/job/runner_integration_test.go: `.NewDelegate( db, jobORM, keyStore, nil, pw, monitoringEndpoint, legacyChains, lggr, config, servicetest.Run(t, mailboxtest.NewMonitor(t)), )` $DIR/core/services/job/runner_integration_test.go: `.Run(t, mailboxtest.NewMonitor(t))` $DIR/core/services/job/runner_integration_test.go: `.NewMonitor(t)` $DIR/core/services/job/runner_integration_test.go: `.ServicesForSpec(testutils.Context(t), *jb)` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.On("CodeAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/job/runner_integration_test.go: `.Return(nil, errors.New("no such code"))` $DIR/core/services/job/runner_integration_test.go: `.New("no such code")` $DIR/core/services/job/runner_integration_test.go: `.Start(ctx)` $DIR/core/services/job/runner_integration_test.go: `.DeleteJob(ctx, jb.ID)` $DIR/core/services/job/runner_integration_test.go: `.Select(&se, `SELECT * FROM job_spec_errors`)` $DIR/core/services/job/runner_integration_test.go: `.Run("timeouts", func(t *testing.T) { ctx := testutils.Context(t) // There are 4 timeouts: // - ObservationTimeout = how long the whole OCR time needs to run, or it fails (default 10 seconds) // - config.JobPipelineMaxTaskDuration() = node level maximum time for a pipeline task (default 10 minutes) // - config.transmitterAddress, http specific timeouts (default 15s * 5 retries = 75s) // - "d1 [.... timeout="2s"]" = per task level timeout (should override the global config) serv := httptest.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { time.Sleep(1 * time.Millisecond) res.WriteHeader(http.StatusOK) _, err := res.Write([]byte(`{"USD":10.1}`)) require.NoError(t, err) })) defer serv.Close() jb := makeMinimalHTTPOracleSpec(t, db, config, cltest.NewEIP55Address().String(), transmitterAddress.Hex(), cltest.DefaultOCRKeyBundleID, serv.URL, `timeout="1ns"`) err := jobORM.CreateJob(ctx, jb) require.NoError(t, err) _, taskResults, err := runner.ExecuteAndInsertFinishedRun(testutils.Context(t), *jb.PipelineSpec, pipeline.NewVarsFrom(nil), logger.TestLogger(t), true) require.NoError(t, err) results := taskResults.FinalResult(logger.TestLogger(t)) assert.Nil(t, results.Values[0]) // No task timeout should succeed. jb = makeMinimalHTTPOracleSpec(t, db, config, cltest.NewEIP55Address().String(), transmitterAddress.Hex(), cltest.DefaultOCRKeyBundleID, serv.URL, "") jb.Name = null.NewString("a job 2", true) err = jobORM.CreateJob(ctx, jb) require.NoError(t, err) _, taskResults, err = runner.ExecuteAndInsertFinishedRun(testutils.Context(t), *jb.PipelineSpec, pipeline.NewVarsFrom(nil), logger.TestLogger(t), true) require.NoError(t, err) results = taskResults.FinalResult(logger.TestLogger(t)) assert.Equal(t, 10.1, results.Values[0]) assert.Nil(t, results.FatalErrors[0]) // Job specified task timeout should fail. jb = makeMinimalHTTPOracleSpec(t, db, config, cltest.NewEIP55Address().String(), transmitterAddress.Hex(), cltest.DefaultOCRKeyBundleID, serv.URL, "") jb.MaxTaskDuration = models.Interval(time.Duration(1)) jb.Name = null.NewString("a job 3", true) err = jobORM.CreateJob(ctx, jb) require.NoError(t, err) _, taskResults, err = runner.ExecuteAndInsertFinishedRun(testutils.Context(t), *jb.PipelineSpec, pipeline.NewVarsFrom(nil), logger.TestLogger(t), true) require.NoError(t, err) resultsNoFatalErrs := taskResults.FinalResult(logger.TestLogger(t)) assert.NotNil(t, resultsNoFatalErrs.FatalErrors[0]) })` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { time.Sleep(1 * time.Millisecond) res.WriteHeader(http.StatusOK) _, err := res.Write([]byte(`{"USD":10.1}`)) require.NoError(t, err) }))` $DIR/core/services/job/runner_integration_test.go: `.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { time.Sleep(1 * time.Millisecond) res.WriteHeader(http.StatusOK) _, err := res.Write([]byte(`{"USD":10.1}`)) require.NoError(t, err) })` $DIR/core/services/job/runner_integration_test.go: `.Sleep(1 * time.Millisecond)` $DIR/core/services/job/runner_integration_test.go: `.WriteHeader(http.StatusOK)` $DIR/core/services/job/runner_integration_test.go: `.Write([]byte(`{"USD":10.1}`))` $DIR/core/services/job/runner_integration_test.go: `.NewEIP55Address()` $DIR/core/services/job/runner_integration_test.go: `.String()` $DIR/core/services/job/runner_integration_test.go: `.Hex()` $DIR/core/services/job/runner_integration_test.go: `.CreateJob(ctx, jb)` $DIR/core/services/job/runner_integration_test.go: `.ExecuteAndInsertFinishedRun(testutils.Context(t), *jb.PipelineSpec, pipeline.NewVarsFrom(nil), logger.TestLogger(t), true)` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.NewVarsFrom(nil)` $DIR/core/services/job/runner_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/runner_integration_test.go: `.FinalResult(logger.TestLogger(t))` $DIR/core/services/job/runner_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/runner_integration_test.go: `.NewEIP55Address()` $DIR/core/services/job/runner_integration_test.go: `.String()` $DIR/core/services/job/runner_integration_test.go: `.Hex()` $DIR/core/services/job/runner_integration_test.go: `.NewString("a job 2", true)` $DIR/core/services/job/runner_integration_test.go: `.CreateJob(ctx, jb)` $DIR/core/services/job/runner_integration_test.go: `.ExecuteAndInsertFinishedRun(testutils.Context(t), *jb.PipelineSpec, pipeline.NewVarsFrom(nil), logger.TestLogger(t), true)` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.NewVarsFrom(nil)` $DIR/core/services/job/runner_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/runner_integration_test.go: `.FinalResult(logger.TestLogger(t))` $DIR/core/services/job/runner_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/runner_integration_test.go: `.NewEIP55Address()` $DIR/core/services/job/runner_integration_test.go: `.String()` $DIR/core/services/job/runner_integration_test.go: `.Hex()` $DIR/core/services/job/runner_integration_test.go: `.Interval(time.Duration(1))` $DIR/core/services/job/runner_integration_test.go: `.Duration(1)` $DIR/core/services/job/runner_integration_test.go: `.NewString("a job 3", true)` $DIR/core/services/job/runner_integration_test.go: `.CreateJob(ctx, jb)` $DIR/core/services/job/runner_integration_test.go: `.ExecuteAndInsertFinishedRun(testutils.Context(t), *jb.PipelineSpec, pipeline.NewVarsFrom(nil), logger.TestLogger(t), true)` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.NewVarsFrom(nil)` $DIR/core/services/job/runner_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/runner_integration_test.go: `.FinalResult(logger.TestLogger(t))` $DIR/core/services/job/runner_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.NewHTTPMockServer(t, http.StatusOK, "GET", resp)` $DIR/core/services/job/runner_integration_test.go: `.CreateJob(ctx, jb)` $DIR/core/services/job/runner_integration_test.go: `.ExecuteAndInsertFinishedRun(testutils.Context(t), *jb.PipelineSpec, pipeline.NewVarsFrom(nil), logger.TestLogger(t), true)` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.NewVarsFrom(nil)` $DIR/core/services/job/runner_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/runner_integration_test.go: `.FinalResult(logger.TestLogger(t))` $DIR/core/services/job/runner_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/runner_integration_test.go: `.DeleteJob(ctx, jb.ID)` $DIR/core/services/job/runner_integration_test.go: `.ExecuteAndInsertFinishedRun(testutils.Context(t), *jb.PipelineSpec, pipeline.NewVarsFrom(nil), logger.TestLogger(t), true)` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.NewVarsFrom(nil)` $DIR/core/services/job/runner_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/runner_integration_test.go: `.NewEthMocksWithStartupAssertions(t)` $DIR/core/services/job/runner_integration_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { t := true c.JobPipeline.ExternalInitiatorsEnabled = &t c.Database.Listener.FallbackPollInterval = commonconfig.MustNewDuration(10 * time.Millisecond) })` $DIR/core/services/job/runner_integration_test.go: `.MustNewDuration(10 * time.Millisecond)` $DIR/core/services/job/runner_integration_test.go: `.NewApplicationWithConfig(t, cfg, ethClient, cltest.UseRealExternalInitiatorManager)` $DIR/core/services/job/runner_integration_test.go: `.MustParse("0EEC7E1D-D0D2-476C-A1A8-72DFB6633F46")` $DIR/core/services/job/runner_integration_test.go: `.String()` $DIR/core/services/job/runner_integration_test.go: `.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if !eiNotifiedOfCreate { require.Equal(t, http.MethodPost, r.Method) eiNotifiedOfCreate = true defer r.Body.Close() var gotCreateJobRequest map[string]interface{} err := json.NewDecoder(r.Body).Decode(&gotCreateJobRequest) require.NoError(t, err) require.Equal(t, expectedCreateJobRequest, gotCreateJobRequest) w.WriteHeader(http.StatusOK) } else { require.Equal(t, http.MethodDelete, r.Method) eiNotifiedOfDelete = true defer r.Body.Close() require.Equal(t, fmt.Sprintf("/%v", jobUUID.String()), r.URL.Path) } }))` $DIR/core/services/job/runner_integration_test.go: `.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if !eiNotifiedOfCreate { require.Equal(t, http.MethodPost, r.Method) eiNotifiedOfCreate = true defer r.Body.Close() var gotCreateJobRequest map[string]interface{} err := json.NewDecoder(r.Body).Decode(&gotCreateJobRequest) require.NoError(t, err) require.Equal(t, expectedCreateJobRequest, gotCreateJobRequest) w.WriteHeader(http.StatusOK) } else { require.Equal(t, http.MethodDelete, r.Method) eiNotifiedOfDelete = true defer r.Body.Close() require.Equal(t, fmt.Sprintf("/%v", jobUUID.String()), r.URL.Path) } })` $DIR/core/services/job/runner_integration_test.go: `.NewDecoder(r.Body)` $DIR/core/services/job/runner_integration_test.go: `.Decode(&gotCreateJobRequest)` $DIR/core/services/job/runner_integration_test.go: `.WriteHeader(http.StatusOK)` $DIR/core/services/job/runner_integration_test.go: `.Marshal(eiCreate)` $DIR/core/services/job/runner_integration_test.go: `.CreateExternalInitiatorViaWeb(t, app, string(eiCreateJSON))` $DIR/core/services/job/runner_integration_test.go: `.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { defer r.Body.Close() var bridgeRequest map[string]interface{} err := json.NewDecoder(r.Body).Decode(&bridgeRequest) require.NoError(t, err) require.Equal(t, float64(42), bridgeRequest["value"]) responseURL = bridgeRequest["responseURL"].(string) w.WriteHeader(http.StatusOK) require.NoError(t, err) _, err = io.WriteString(w, `{"pending": true}`) require.NoError(t, err) bridgeCalled <- struct{}{} }))` $DIR/core/services/job/runner_integration_test.go: `.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { defer r.Body.Close() var bridgeRequest map[string]interface{} err := json.NewDecoder(r.Body).Decode(&bridgeRequest) require.NoError(t, err) require.Equal(t, float64(42), bridgeRequest["value"]) responseURL = bridgeRequest["responseURL"].(string) w.WriteHeader(http.StatusOK) require.NoError(t, err) _, err = io.WriteString(w, `{"pending": true}`) require.NoError(t, err) bridgeCalled <- struct{}{} })` $DIR/core/services/job/runner_integration_test.go: `.NewDecoder(r.Body)` $DIR/core/services/job/runner_integration_test.go: `.Decode(&bridgeRequest)` $DIR/core/services/job/runner_integration_test.go: `.WriteHeader(http.StatusOK)` $DIR/core/services/job/runner_integration_test.go: `.WriteString(w, `{"pending": true}`)` $DIR/core/services/job/runner_integration_test.go: `.MustCreateBridge(t, app.GetDB(), cltest.BridgeOpts{URL: bridgeServer.URL})` $DIR/core/services/job/runner_integration_test.go: `.GetDB()` $DIR/core/services/job/runner_integration_test.go: `.Name.String()` $DIR/core/services/job/runner_integration_test.go: `.Sprintf(` type = "webhook" schemaVersion = 1 externalJobID = "%v" externalInitiators = [ { name = "%s", spec = """ %s """ } ] observationSource = """ parse [type=jsonparse path="result" data="$(jobRun.requestBody)"] ds1 [type=bridge async=true name="%s" timeout=0 requestData=<{"value": $(parse)}>] ds1_parse [type=jsonparse lax=false path="data,result"] ds1_multiply [type=multiply times=1000000000000000000 index=0] parse->ds1->ds1_parse->ds1_multiply; """ `, jobUUID, eiName, cltest.MustJSONMarshal(t, eiSpec), bridgeName)` $DIR/core/services/job/runner_integration_test.go: `.MustJSONMarshal(t, eiSpec)` $DIR/core/services/job/runner_integration_test.go: `.ValidatedWebhookSpec(testutils.Context(t), tomlSpec, app.GetExternalInitiatorManager())` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.GetExternalInitiatorManager()` $DIR/core/services/job/runner_integration_test.go: `.CreateJobViaWeb(t, app, []byte(cltest.MustJSONMarshal(t, web.CreateJobRequest{TOML: tomlSpec})))` $DIR/core/services/job/runner_integration_test.go: `.MustJSONMarshal(t, web.CreateJobRequest{TOML: tomlSpec})` $DIR/core/services/job/runner_integration_test.go: `.Run("simulate request from EI -> Core node with successful callback", func(t *testing.T) { cltest.AwaitJobActive(t, app.JobSpawner(), jobID, 3*time.Second) _ = cltest.CreateJobRunViaExternalInitiatorV2(t, app, jobUUID, *eia, cltest.MustJSONMarshal(t, eiRequest)) pipelineORM := pipeline.NewORM(app.GetDB(), logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns()) bridgesORM := bridges.NewORM(app.GetDB()) jobORM := NewTestORM(t, app.GetDB(), pipelineORM, bridgesORM, app.KeyStore) // Trigger v2/resume select { case <-bridgeCalled: case <-time.After(time.Second): t.Fatal("expected bridge server to be called") } // Make the request { url, err := url.Parse(responseURL) require.NoError(t, err) client := app.NewHTTPClient(nil) body := strings.NewReader(`{"value": {"data":{"result":"123.45"}}}`) response, cleanup := client.Patch(url.Path, body) defer cleanup() cltest.AssertServerResponse(t, response, http.StatusOK) } runs := cltest.WaitForPipelineComplete(t, 0, jobID, 1, 4, jobORM, 5*time.Second, 300*time.Millisecond) require.Len(t, runs, 1) run := runs[0] require.Len(t, run.PipelineTaskRuns, 4) require.Empty(t, run.PipelineTaskRuns[0].Error) require.Empty(t, run.PipelineTaskRuns[1].Error) require.Empty(t, run.PipelineTaskRuns[2].Error) require.Empty(t, run.PipelineTaskRuns[3].Error) require.Equal(t, jsonserializable.JSONSerializable{Val: []interface{}{"123450000000000000000"}, Valid: true}, run.Outputs) require.Equal(t, pipeline.RunErrors{null.String{NullString: sql.NullString{String: "", Valid: false}}}, run.FatalErrors) })` $DIR/core/services/job/runner_integration_test.go: `.AwaitJobActive(t, app.JobSpawner(), jobID, 3*time.Second)` $DIR/core/services/job/runner_integration_test.go: `.JobSpawner()` $DIR/core/services/job/runner_integration_test.go: `.CreateJobRunViaExternalInitiatorV2(t, app, jobUUID, *eia, cltest.MustJSONMarshal(t, eiRequest))` $DIR/core/services/job/runner_integration_test.go: `.MustJSONMarshal(t, eiRequest)` $DIR/core/services/job/runner_integration_test.go: `.NewORM(app.GetDB(), logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/runner_integration_test.go: `.GetDB()` $DIR/core/services/job/runner_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/runner_integration_test.go: `.JobPipeline()` $DIR/core/services/job/runner_integration_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/runner_integration_test.go: `.NewORM(app.GetDB())` $DIR/core/services/job/runner_integration_test.go: `.GetDB()` $DIR/core/services/job/runner_integration_test.go: `.GetDB()` $DIR/core/services/job/runner_integration_test.go: `.After(time.Second)` $DIR/core/services/job/runner_integration_test.go: `.Parse(responseURL)` $DIR/core/services/job/runner_integration_test.go: `.NewHTTPClient(nil)` $DIR/core/services/job/runner_integration_test.go: `.NewReader(`{"value": {"data":{"result":"123.45"}}}`)` $DIR/core/services/job/runner_integration_test.go: `.Patch(url.Path, body)` $DIR/core/services/job/runner_integration_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/services/job/runner_integration_test.go: `.WaitForPipelineComplete(t, 0, jobID, 1, 4, jobORM, 5*time.Second, 300*time.Millisecond)` $DIR/core/services/job/runner_integration_test.go: `.DeleteJobViaWeb(t, app, jobID)` $DIR/core/services/job/runner_integration_test.go: `.NewEthMocksWithStartupAssertions(t)` $DIR/core/services/job/runner_integration_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { t := true c.JobPipeline.ExternalInitiatorsEnabled = &t c.Database.Listener.FallbackPollInterval = commonconfig.MustNewDuration(10 * time.Millisecond) })` $DIR/core/services/job/runner_integration_test.go: `.MustNewDuration(10 * time.Millisecond)` $DIR/core/services/job/runner_integration_test.go: `.NewApplicationWithConfig(t, cfg, ethClient, cltest.UseRealExternalInitiatorManager)` $DIR/core/services/job/runner_integration_test.go: `.MustParse("0EEC7E1D-D0D2-476C-A1A8-72DFB6633F47")` $DIR/core/services/job/runner_integration_test.go: `.String()` $DIR/core/services/job/runner_integration_test.go: `.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if !eiNotifiedOfCreate { require.Equal(t, http.MethodPost, r.Method) eiNotifiedOfCreate = true defer r.Body.Close() var gotCreateJobRequest map[string]interface{} err := json.NewDecoder(r.Body).Decode(&gotCreateJobRequest) require.NoError(t, err) require.Equal(t, expectedCreateJobRequest, gotCreateJobRequest) w.WriteHeader(http.StatusOK) } else { require.Equal(t, http.MethodDelete, r.Method) eiNotifiedOfDelete = true defer r.Body.Close() require.Equal(t, fmt.Sprintf("/%v", jobUUID.String()), r.URL.Path) } }))` $DIR/core/services/job/runner_integration_test.go: `.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if !eiNotifiedOfCreate { require.Equal(t, http.MethodPost, r.Method) eiNotifiedOfCreate = true defer r.Body.Close() var gotCreateJobRequest map[string]interface{} err := json.NewDecoder(r.Body).Decode(&gotCreateJobRequest) require.NoError(t, err) require.Equal(t, expectedCreateJobRequest, gotCreateJobRequest) w.WriteHeader(http.StatusOK) } else { require.Equal(t, http.MethodDelete, r.Method) eiNotifiedOfDelete = true defer r.Body.Close() require.Equal(t, fmt.Sprintf("/%v", jobUUID.String()), r.URL.Path) } })` $DIR/core/services/job/runner_integration_test.go: `.NewDecoder(r.Body)` $DIR/core/services/job/runner_integration_test.go: `.Decode(&gotCreateJobRequest)` $DIR/core/services/job/runner_integration_test.go: `.WriteHeader(http.StatusOK)` $DIR/core/services/job/runner_integration_test.go: `.Marshal(eiCreate)` $DIR/core/services/job/runner_integration_test.go: `.CreateExternalInitiatorViaWeb(t, app, string(eiCreateJSON))` $DIR/core/services/job/runner_integration_test.go: `.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { defer r.Body.Close() var bridgeRequest map[string]interface{} err := json.NewDecoder(r.Body).Decode(&bridgeRequest) require.NoError(t, err) require.Equal(t, float64(42), bridgeRequest["value"]) responseURL = bridgeRequest["responseURL"].(string) w.WriteHeader(http.StatusOK) require.NoError(t, err) _, err = io.WriteString(w, `{"pending": true}`) require.NoError(t, err) bridgeCalled <- struct{}{} }))` $DIR/core/services/job/runner_integration_test.go: `.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { defer r.Body.Close() var bridgeRequest map[string]interface{} err := json.NewDecoder(r.Body).Decode(&bridgeRequest) require.NoError(t, err) require.Equal(t, float64(42), bridgeRequest["value"]) responseURL = bridgeRequest["responseURL"].(string) w.WriteHeader(http.StatusOK) require.NoError(t, err) _, err = io.WriteString(w, `{"pending": true}`) require.NoError(t, err) bridgeCalled <- struct{}{} })` $DIR/core/services/job/runner_integration_test.go: `.NewDecoder(r.Body)` $DIR/core/services/job/runner_integration_test.go: `.Decode(&bridgeRequest)` $DIR/core/services/job/runner_integration_test.go: `.WriteHeader(http.StatusOK)` $DIR/core/services/job/runner_integration_test.go: `.WriteString(w, `{"pending": true}`)` $DIR/core/services/job/runner_integration_test.go: `.MustCreateBridge(t, app.GetDB(), cltest.BridgeOpts{URL: bridgeServer.URL})` $DIR/core/services/job/runner_integration_test.go: `.GetDB()` $DIR/core/services/job/runner_integration_test.go: `.Name.String()` $DIR/core/services/job/runner_integration_test.go: `.Sprintf(` type = "webhook" schemaVersion = 1 externalJobID = "%v" externalInitiators = [ { name = "%s", spec = """ %s """ } ] observationSource = """ parse [type=jsonparse path="result" data="$(jobRun.requestBody)"] ds1 [type=bridge async=true name="%s" timeout=0 requestData=<{"value": $(parse)}>] ds1_parse [type=jsonparse lax=false path="data,result"] ds1_multiply [type=multiply times=1000000000000000000 index=0] parse->ds1->ds1_parse->ds1_multiply; """ `, jobUUID, eiName, cltest.MustJSONMarshal(t, eiSpec), bridgeName)` $DIR/core/services/job/runner_integration_test.go: `.MustJSONMarshal(t, eiSpec)` $DIR/core/services/job/runner_integration_test.go: `.ValidatedWebhookSpec(testutils.Context(t), tomlSpec, app.GetExternalInitiatorManager())` $DIR/core/services/job/runner_integration_test.go: `.Context(t)` $DIR/core/services/job/runner_integration_test.go: `.GetExternalInitiatorManager()` $DIR/core/services/job/runner_integration_test.go: `.CreateJobViaWeb(t, app, []byte(cltest.MustJSONMarshal(t, web.CreateJobRequest{TOML: tomlSpec})))` $DIR/core/services/job/runner_integration_test.go: `.MustJSONMarshal(t, web.CreateJobRequest{TOML: tomlSpec})` $DIR/core/services/job/runner_integration_test.go: `.Run("simulate request from EI -> Core node with erroring callback", func(t *testing.T) { _ = cltest.CreateJobRunViaExternalInitiatorV2(t, app, jobUUID, *eia, cltest.MustJSONMarshal(t, eiRequest)) pipelineORM := pipeline.NewORM(app.GetDB(), logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns()) bridgesORM := bridges.NewORM(app.GetDB()) jobORM := NewTestORM(t, app.GetDB(), pipelineORM, bridgesORM, app.KeyStore) // Trigger v2/resume select { case <-bridgeCalled: case <-time.After(time.Second): t.Fatal("expected bridge server to be called") } // Make the request { url, err := url.Parse(responseURL) require.NoError(t, err) client := app.NewHTTPClient(nil) body := strings.NewReader(`{"error": "something exploded in EA"}`) response, cleanup := client.Patch(url.Path, body) defer cleanup() cltest.AssertServerResponse(t, response, http.StatusOK) } runs := cltest.WaitForPipelineError(t, 0, jobID, 1, 4, jobORM, 5*time.Second, 300*time.Millisecond) require.Len(t, runs, 1) run := runs[0] require.Len(t, run.PipelineTaskRuns, 4) require.Empty(t, run.PipelineTaskRuns[0].Error) assert.True(t, run.PipelineTaskRuns[1].Error.Valid) assert.Equal(t, "something exploded in EA", run.PipelineTaskRuns[1].Error.String) assert.True(t, run.PipelineTaskRuns[2].Error.Valid) assert.True(t, run.PipelineTaskRuns[3].Error.Valid) require.Equal(t, jsonserializable.JSONSerializable{Val: []interface{}{interface{}(nil)}, Valid: true}, run.Outputs) require.Equal(t, pipeline.RunErrors{null.String{NullString: sql.NullString{String: "task inputs: too many errors", Valid: true}}}, run.FatalErrors) })` $DIR/core/services/job/runner_integration_test.go: `.CreateJobRunViaExternalInitiatorV2(t, app, jobUUID, *eia, cltest.MustJSONMarshal(t, eiRequest))` $DIR/core/services/job/runner_integration_test.go: `.MustJSONMarshal(t, eiRequest)` $DIR/core/services/job/runner_integration_test.go: `.NewORM(app.GetDB(), logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/runner_integration_test.go: `.GetDB()` $DIR/core/services/job/runner_integration_test.go: `.TestLogger(t)` $DIR/core/services/job/runner_integration_test.go: `.JobPipeline()` $DIR/core/services/job/runner_integration_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/runner_integration_test.go: `.NewORM(app.GetDB())` $DIR/core/services/job/runner_integration_test.go: `.GetDB()` $DIR/core/services/job/runner_integration_test.go: `.GetDB()` $DIR/core/services/job/runner_integration_test.go: `.After(time.Second)` $DIR/core/services/job/runner_integration_test.go: `.Parse(responseURL)` $DIR/core/services/job/runner_integration_test.go: `.NewHTTPClient(nil)` $DIR/core/services/job/runner_integration_test.go: `.NewReader(`{"error": "something exploded in EA"}`)` $DIR/core/services/job/runner_integration_test.go: `.Patch(url.Path, body)` $DIR/core/services/job/runner_integration_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/services/job/runner_integration_test.go: `.WaitForPipelineError(t, 0, jobID, 1, 4, jobORM, 5*time.Second, 300*time.Millisecond)` $DIR/core/services/job/runner_integration_test.go: `.DeleteJobViaWeb(t, app, jobID)` $DIR/core/services/job/spawner_test.go: `ethClient.On("CallContext", mock.Anything, mock.Anything, "eth_getBlockByNumber", mock.Anything, false). Run(func(args mock.Arguments) { head := args.Get(1).(**evmtypes.Head) *head = cltest.Head(10) }). Return(nil).Maybe()` $DIR/core/services/job/spawner_test.go: `*head = cltest.Head(10)` $DIR/core/services/job/spawner_test.go: `t.Run("should respect its dependents", func(t *testing.T) { lggr := logger.TestLogger(t) orm := NewTestORM(t, db, pipeline.NewORM(db, lggr, config.JobPipeline().MaxSuccessfulRuns()), bridges.NewORM(db), keyStore) a := utils.NewDependentAwaiter() a.AddDependents(1) spawner := job.NewSpawner(orm, config.Database(), noopChecker{}, map[job.Type]job.Delegate{}, lggr, []utils.DependentAwaiter{a}) // Starting the spawner should signal to the dependents result := make(chan bool) go func() { select { case <-a.AwaitDependents(): result <- true case <-time.After(2 * time.Second): result <- false } }() require.NoError(t, spawner.Start(testutils.Context(t))) assert.True(t, <-result, "failed to signal to dependents") })` $DIR/core/services/job/spawner_test.go: `a.AddDependents(1)` $DIR/core/services/job/spawner_test.go: `result <- true` $DIR/core/services/job/spawner_test.go: `result <- false` $DIR/core/services/job/spawner_test.go: `t.Run("starts and stops job services when jobs are added and removed", func(t *testing.T) { jobA := cltest.MakeDirectRequestJobSpec(t) jobB := makeOCRJobSpec(t, address, bridge.Name.String(), bridge2.Name.String()) lggr := logger.TestLogger(t) orm := NewTestORM(t, db, pipeline.NewORM(db, lggr, config.JobPipeline().MaxSuccessfulRuns()), bridges.NewORM(db), keyStore) eventuallyA := cltest.NewAwaiter() serviceA1 := mocks.NewServiceCtx(t) serviceA2 := mocks.NewServiceCtx(t) serviceA1.On("Start", mock.Anything).Return(nil).Once() serviceA2.On("Start", mock.Anything).Return(nil).Once().Run(func(mock.Arguments) { eventuallyA.ItHappened() }) mailMon := servicetest.Run(t, mailboxtest.NewMonitor(t)) dA := ocr.NewDelegate(nil, orm, nil, nil, nil, monitoringEndpoint, legacyChains, logger.TestLogger(t), config, mailMon) delegateA := &delegate{jobA.Type, []job.ServiceCtx{serviceA1, serviceA2}, 0, make(chan struct{}), dA} eventuallyB := cltest.NewAwaiter() serviceB1 := mocks.NewServiceCtx(t) serviceB2 := mocks.NewServiceCtx(t) serviceB1.On("Start", mock.Anything).Return(nil).Once() serviceB2.On("Start", mock.Anything).Return(nil).Once().Run(func(mock.Arguments) { eventuallyB.ItHappened() }) dB := ocr.NewDelegate(nil, orm, nil, nil, nil, monitoringEndpoint, legacyChains, logger.TestLogger(t), config, mailMon) delegateB := &delegate{jobB.Type, []job.ServiceCtx{serviceB1, serviceB2}, 0, make(chan struct{}), dB} spawner := job.NewSpawner(orm, config.Database(), noopChecker{}, map[job.Type]job.Delegate{ jobA.Type: delegateA, jobB.Type: delegateB, }, lggr, nil) ctx := testutils.Context(t) require.NoError(t, spawner.Start(ctx)) err := spawner.CreateJob(ctx, nil, jobA) require.NoError(t, err) jobSpecIDA := jobA.ID delegateA.jobID = jobSpecIDA close(delegateA.chContinueCreatingServices) eventuallyA.AwaitOrFail(t, 20*time.Second) err = spawner.CreateJob(ctx, nil, jobB) require.NoError(t, err) jobSpecIDB := jobB.ID delegateB.jobID = jobSpecIDB close(delegateB.chContinueCreatingServices) eventuallyB.AwaitOrFail(t, 20*time.Second) serviceA1.On("Close").Return(nil).Once() serviceA2.On("Close").Return(nil).Once() err = spawner.DeleteJob(ctx, nil, jobSpecIDA) require.NoError(t, err) serviceB1.On("Close").Return(nil).Once() serviceB2.On("Close").Return(nil).Once() err = spawner.DeleteJob(ctx, nil, jobSpecIDB) require.NoError(t, err) require.NoError(t, spawner.Close()) })` $DIR/core/services/job/spawner_test.go: `serviceA1.On("Start", mock.Anything).Return(nil).Once()` $DIR/core/services/job/spawner_test.go: `serviceA2.On("Start", mock.Anything).Return(nil).Once().Run(func(mock.Arguments) { eventuallyA.ItHappened() })` $DIR/core/services/job/spawner_test.go: `eventuallyA.ItHappened()` $DIR/core/services/job/spawner_test.go: `serviceB1.On("Start", mock.Anything).Return(nil).Once()` $DIR/core/services/job/spawner_test.go: `serviceB2.On("Start", mock.Anything).Return(nil).Once().Run(func(mock.Arguments) { eventuallyB.ItHappened() })` $DIR/core/services/job/spawner_test.go: `eventuallyB.ItHappened()` $DIR/core/services/job/spawner_test.go: `delegateA.jobID = jobSpecIDA` $DIR/core/services/job/spawner_test.go: `close(delegateA.chContinueCreatingServices)` $DIR/core/services/job/spawner_test.go: `eventuallyA.AwaitOrFail(t, 20*time.Second)` $DIR/core/services/job/spawner_test.go: `err = spawner.CreateJob(ctx, nil, jobB)` $DIR/core/services/job/spawner_test.go: `delegateB.jobID = jobSpecIDB` $DIR/core/services/job/spawner_test.go: `close(delegateB.chContinueCreatingServices)` $DIR/core/services/job/spawner_test.go: `eventuallyB.AwaitOrFail(t, 20*time.Second)` $DIR/core/services/job/spawner_test.go: `serviceA1.On("Close").Return(nil).Once()` $DIR/core/services/job/spawner_test.go: `serviceA2.On("Close").Return(nil).Once()` $DIR/core/services/job/spawner_test.go: `err = spawner.DeleteJob(ctx, nil, jobSpecIDA)` $DIR/core/services/job/spawner_test.go: `serviceB1.On("Close").Return(nil).Once()` $DIR/core/services/job/spawner_test.go: `serviceB2.On("Close").Return(nil).Once()` $DIR/core/services/job/spawner_test.go: `err = spawner.DeleteJob(ctx, nil, jobSpecIDB)` $DIR/core/services/job/spawner_test.go: `clearDB(t, db)` $DIR/core/services/job/spawner_test.go: `t.Run("starts and stops job services from the DB when .Start()/.Stop() is called", func(t *testing.T) { jobA := makeOCRJobSpec(t, address, bridge.Name.String(), bridge2.Name.String()) eventually := cltest.NewAwaiter() serviceA1 := mocks.NewServiceCtx(t) serviceA2 := mocks.NewServiceCtx(t) serviceA1.On("Start", mock.Anything).Return(nil).Once() serviceA2.On("Start", mock.Anything).Return(nil).Once().Run(func(mock.Arguments) { eventually.ItHappened() }) lggr := logger.TestLogger(t) orm := NewTestORM(t, db, pipeline.NewORM(db, lggr, config.JobPipeline().MaxSuccessfulRuns()), bridges.NewORM(db), keyStore) mailMon := servicetest.Run(t, mailboxtest.NewMonitor(t)) d := ocr.NewDelegate(nil, orm, nil, nil, nil, monitoringEndpoint, legacyChains, logger.TestLogger(t), config, mailMon) delegateA := &delegate{jobA.Type, []job.ServiceCtx{serviceA1, serviceA2}, 0, nil, d} spawner := job.NewSpawner(orm, config.Database(), noopChecker{}, map[job.Type]job.Delegate{ jobA.Type: delegateA, }, lggr, nil) ctx := testutils.Context(t) err := orm.CreateJob(ctx, jobA) require.NoError(t, err) delegateA.jobID = jobA.ID require.NoError(t, spawner.Start(ctx)) eventually.AwaitOrFail(t) serviceA1.On("Close").Return(nil).Once() serviceA2.On("Close").Return(nil).Once() require.NoError(t, spawner.Close()) })` $DIR/core/services/job/spawner_test.go: `serviceA1.On("Start", mock.Anything).Return(nil).Once()` $DIR/core/services/job/spawner_test.go: `serviceA2.On("Start", mock.Anything).Return(nil).Once().Run(func(mock.Arguments) { eventually.ItHappened() })` $DIR/core/services/job/spawner_test.go: `eventually.ItHappened()` $DIR/core/services/job/spawner_test.go: `delegateA.jobID = jobA.ID` $DIR/core/services/job/spawner_test.go: `eventually.AwaitOrFail(t)` $DIR/core/services/job/spawner_test.go: `serviceA1.On("Close").Return(nil).Once()` $DIR/core/services/job/spawner_test.go: `serviceA2.On("Close").Return(nil).Once()` $DIR/core/services/job/spawner_test.go: `clearDB(t, db)` $DIR/core/services/job/spawner_test.go: `t.Run("closes job services on 'DeleteJob()'", func(t *testing.T) { jobA := makeOCRJobSpec(t, address, bridge.Name.String(), bridge2.Name.String()) eventuallyStart := cltest.NewAwaiter() serviceA1 := mocks.NewServiceCtx(t) serviceA2 := mocks.NewServiceCtx(t) serviceA1.On("Start", mock.Anything).Return(nil).Once() serviceA2.On("Start", mock.Anything).Return(nil).Once().Run(func(mock.Arguments) { eventuallyStart.ItHappened() }) lggr := logger.TestLogger(t) orm := NewTestORM(t, db, pipeline.NewORM(db, lggr, config.JobPipeline().MaxSuccessfulRuns()), bridges.NewORM(db), keyStore) mailMon := servicetest.Run(t, mailboxtest.NewMonitor(t)) d := ocr.NewDelegate(nil, orm, nil, nil, nil, monitoringEndpoint, legacyChains, logger.TestLogger(t), config, mailMon) delegateA := &delegate{jobA.Type, []job.ServiceCtx{serviceA1, serviceA2}, 0, nil, d} spawner := job.NewSpawner(orm, config.Database(), noopChecker{}, map[job.Type]job.Delegate{ jobA.Type: delegateA, }, lggr, nil) ctx := testutils.Context(t) err := orm.CreateJob(ctx, jobA) require.NoError(t, err) jobSpecIDA := jobA.ID delegateA.jobID = jobSpecIDA require.NoError(t, spawner.Start(ctx)) defer func() { assert.NoError(t, spawner.Close()) }() eventuallyStart.AwaitOrFail(t) // Wait for the claim lock to be taken gomega.NewWithT(t).Eventually(func() bool { jobs := spawner.ActiveJobs() _, exists := jobs[jobSpecIDA] return exists }, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.Equal(true)) eventuallyClose := cltest.NewAwaiter() serviceA1.On("Close").Return(nil).Once() serviceA2.On("Close").Return(nil).Once().Run(func(mock.Arguments) { eventuallyClose.ItHappened() }) err = spawner.DeleteJob(ctx, nil, jobSpecIDA) require.NoError(t, err) eventuallyClose.AwaitOrFail(t) // Wait for the claim lock to be released gomega.NewWithT(t).Eventually(func() bool { jobs := spawner.ActiveJobs() _, exists := jobs[jobSpecIDA] return exists }, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.Equal(false)) clearDB(t, db) })` $DIR/core/services/job/spawner_test.go: `serviceA1.On("Start", mock.Anything).Return(nil).Once()` $DIR/core/services/job/spawner_test.go: `serviceA2.On("Start", mock.Anything).Return(nil).Once().Run(func(mock.Arguments) { eventuallyStart.ItHappened() })` $DIR/core/services/job/spawner_test.go: `eventuallyStart.ItHappened()` $DIR/core/services/job/spawner_test.go: `delegateA.jobID = jobSpecIDA` $DIR/core/services/job/spawner_test.go: `eventuallyStart.AwaitOrFail(t)` $DIR/core/services/job/spawner_test.go: `gomega.NewWithT(t).Eventually(func() bool { jobs := spawner.ActiveJobs() _, exists := jobs[jobSpecIDA] return exists }, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.Equal(true))` $DIR/core/services/job/spawner_test.go: `serviceA1.On("Close").Return(nil).Once()` $DIR/core/services/job/spawner_test.go: `serviceA2.On("Close").Return(nil).Once().Run(func(mock.Arguments) { eventuallyClose.ItHappened() })` $DIR/core/services/job/spawner_test.go: `eventuallyClose.ItHappened()` $DIR/core/services/job/spawner_test.go: `err = spawner.DeleteJob(ctx, nil, jobSpecIDA)` $DIR/core/services/job/spawner_test.go: `eventuallyClose.AwaitOrFail(t)` $DIR/core/services/job/spawner_test.go: `gomega.NewWithT(t).Eventually(func() bool { jobs := spawner.ActiveJobs() _, exists := jobs[jobSpecIDA] return exists }, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.Equal(false))` $DIR/core/services/job/spawner_test.go: `clearDB(t, db)` $DIR/core/services/job/spawner_test.go: `err = spawner.CreateJob(ctx, nil, jobOCR2Keeper)` $DIR/core/services/job/spawner_test.go: `delegateOCR2.jobID = jobOCR2Keeper.ID` $DIR/core/services/job/spawner_test.go: `lp.On("UnregisterFilter", mock.Anything, mock.Anything).Return(nil).Run(func(args mock.Arguments) { lggr.Debugf("UnregisterFilter called with args %v", args) })` $DIR/core/services/job/spawner_test.go: `lggr.Debugf("UnregisterFilter called with args %v", args)` $DIR/core/services/job/spawner_test.go: `err = spawner.DeleteJob(ctx, nil, jobSpecID)` $DIR/core/services/job/spawner_test.go: `lp.AssertNumberOfCalls(t, "UnregisterFilter", 6)` $DIR/core/services/job/spawner_test.go: `lp.On("Close").Return(nil).Once()` $DIR/core/services/job/spawner_test.go: `.Context(t)` $DIR/core/services/job/spawner_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/job/spawner_test.go: `.NewSqlxDB(t)` $DIR/core/services/job/spawner_test.go: `.NewKeyStore(t, db)` $DIR/core/services/job/spawner_test.go: `.Eth()` $DIR/core/services/job/spawner_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/services/job/spawner_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{})` $DIR/core/services/job/spawner_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{})` $DIR/core/services/job/spawner_test.go: `.NewEthMocksWithDefaultChain(t)` $DIR/core/services/job/spawner_test.go: `.On("CallContext", mock.Anything, mock.Anything, "eth_getBlockByNumber", mock.Anything, false)` $DIR/core/services/job/spawner_test.go: `. Run(func(args mock.Arguments) { head := args.Get(1).(**evmtypes.Head) *head = cltest.Head(10) })` $DIR/core/services/job/spawner_test.go: `.Get(1)` $DIR/core/services/job/spawner_test.go: `.Head(10)` $DIR/core/services/job/spawner_test.go: `. Return(nil)` $DIR/core/services/job/spawner_test.go: `.Maybe()` $DIR/core/services/job/spawner_test.go: `.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, Client: ethClient, GeneralConfig: config, KeyStore: ethKeyStore})` $DIR/core/services/job/spawner_test.go: `.NewLegacyChainsFromRelayerExtenders(relayExtenders)` $DIR/core/services/job/spawner_test.go: `.Run("should respect its dependents", func(t *testing.T) { lggr := logger.TestLogger(t) orm := NewTestORM(t, db, pipeline.NewORM(db, lggr, config.JobPipeline().MaxSuccessfulRuns()), bridges.NewORM(db), keyStore) a := utils.NewDependentAwaiter() a.AddDependents(1) spawner := job.NewSpawner(orm, config.Database(), noopChecker{}, map[job.Type]job.Delegate{}, lggr, []utils.DependentAwaiter{a}) // Starting the spawner should signal to the dependents result := make(chan bool) go func() { select { case <-a.AwaitDependents(): result <- true case <-time.After(2 * time.Second): result <- false } }() require.NoError(t, spawner.Start(testutils.Context(t))) assert.True(t, <-result, "failed to signal to dependents") })` $DIR/core/services/job/spawner_test.go: `.TestLogger(t)` $DIR/core/services/job/spawner_test.go: `.NewORM(db, lggr, config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/spawner_test.go: `.JobPipeline()` $DIR/core/services/job/spawner_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/spawner_test.go: `.NewORM(db)` $DIR/core/services/job/spawner_test.go: `.NewDependentAwaiter()` $DIR/core/services/job/spawner_test.go: `.AddDependents(1)` $DIR/core/services/job/spawner_test.go: `.NewSpawner(orm, config.Database(), noopChecker{}, map[job.Type]job.Delegate{}, lggr, []utils.DependentAwaiter{a})` $DIR/core/services/job/spawner_test.go: `.Database()` $DIR/core/services/job/spawner_test.go: `.AwaitDependents()` $DIR/core/services/job/spawner_test.go: `.After(2 * time.Second)` $DIR/core/services/job/spawner_test.go: `.Run("starts and stops job services when jobs are added and removed", func(t *testing.T) { jobA := cltest.MakeDirectRequestJobSpec(t) jobB := makeOCRJobSpec(t, address, bridge.Name.String(), bridge2.Name.String()) lggr := logger.TestLogger(t) orm := NewTestORM(t, db, pipeline.NewORM(db, lggr, config.JobPipeline().MaxSuccessfulRuns()), bridges.NewORM(db), keyStore) eventuallyA := cltest.NewAwaiter() serviceA1 := mocks.NewServiceCtx(t) serviceA2 := mocks.NewServiceCtx(t) serviceA1.On("Start", mock.Anything).Return(nil).Once() serviceA2.On("Start", mock.Anything).Return(nil).Once().Run(func(mock.Arguments) { eventuallyA.ItHappened() }) mailMon := servicetest.Run(t, mailboxtest.NewMonitor(t)) dA := ocr.NewDelegate(nil, orm, nil, nil, nil, monitoringEndpoint, legacyChains, logger.TestLogger(t), config, mailMon) delegateA := &delegate{jobA.Type, []job.ServiceCtx{serviceA1, serviceA2}, 0, make(chan struct{}), dA} eventuallyB := cltest.NewAwaiter() serviceB1 := mocks.NewServiceCtx(t) serviceB2 := mocks.NewServiceCtx(t) serviceB1.On("Start", mock.Anything).Return(nil).Once() serviceB2.On("Start", mock.Anything).Return(nil).Once().Run(func(mock.Arguments) { eventuallyB.ItHappened() }) dB := ocr.NewDelegate(nil, orm, nil, nil, nil, monitoringEndpoint, legacyChains, logger.TestLogger(t), config, mailMon) delegateB := &delegate{jobB.Type, []job.ServiceCtx{serviceB1, serviceB2}, 0, make(chan struct{}), dB} spawner := job.NewSpawner(orm, config.Database(), noopChecker{}, map[job.Type]job.Delegate{ jobA.Type: delegateA, jobB.Type: delegateB, }, lggr, nil) ctx := testutils.Context(t) require.NoError(t, spawner.Start(ctx)) err := spawner.CreateJob(ctx, nil, jobA) require.NoError(t, err) jobSpecIDA := jobA.ID delegateA.jobID = jobSpecIDA close(delegateA.chContinueCreatingServices) eventuallyA.AwaitOrFail(t, 20*time.Second) err = spawner.CreateJob(ctx, nil, jobB) require.NoError(t, err) jobSpecIDB := jobB.ID delegateB.jobID = jobSpecIDB close(delegateB.chContinueCreatingServices) eventuallyB.AwaitOrFail(t, 20*time.Second) serviceA1.On("Close").Return(nil).Once() serviceA2.On("Close").Return(nil).Once() err = spawner.DeleteJob(ctx, nil, jobSpecIDA) require.NoError(t, err) serviceB1.On("Close").Return(nil).Once() serviceB2.On("Close").Return(nil).Once() err = spawner.DeleteJob(ctx, nil, jobSpecIDB) require.NoError(t, err) require.NoError(t, spawner.Close()) })` $DIR/core/services/job/spawner_test.go: `.MakeDirectRequestJobSpec(t)` $DIR/core/services/job/spawner_test.go: `.Name.String()` $DIR/core/services/job/spawner_test.go: `.Name.String()` $DIR/core/services/job/spawner_test.go: `.TestLogger(t)` $DIR/core/services/job/spawner_test.go: `.NewORM(db, lggr, config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/spawner_test.go: `.JobPipeline()` $DIR/core/services/job/spawner_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/spawner_test.go: `.NewORM(db)` $DIR/core/services/job/spawner_test.go: `.NewAwaiter()` $DIR/core/services/job/spawner_test.go: `.NewServiceCtx(t)` $DIR/core/services/job/spawner_test.go: `.NewServiceCtx(t)` $DIR/core/services/job/spawner_test.go: `.On("Start", mock.Anything)` $DIR/core/services/job/spawner_test.go: `.Return(nil)` $DIR/core/services/job/spawner_test.go: `.Once()` $DIR/core/services/job/spawner_test.go: `.On("Start", mock.Anything)` $DIR/core/services/job/spawner_test.go: `.Return(nil)` $DIR/core/services/job/spawner_test.go: `.Once()` $DIR/core/services/job/spawner_test.go: `.Run(func(mock.Arguments) { eventuallyA.ItHappened() })` $DIR/core/services/job/spawner_test.go: `.ItHappened()` $DIR/core/services/job/spawner_test.go: `.Run(t, mailboxtest.NewMonitor(t))` $DIR/core/services/job/spawner_test.go: `.NewMonitor(t)` $DIR/core/services/job/spawner_test.go: `.NewDelegate(nil, orm, nil, nil, nil, monitoringEndpoint, legacyChains, logger.TestLogger(t), config, mailMon)` $DIR/core/services/job/spawner_test.go: `.TestLogger(t)` $DIR/core/services/job/spawner_test.go: `.NewAwaiter()` $DIR/core/services/job/spawner_test.go: `.NewServiceCtx(t)` $DIR/core/services/job/spawner_test.go: `.NewServiceCtx(t)` $DIR/core/services/job/spawner_test.go: `.On("Start", mock.Anything)` $DIR/core/services/job/spawner_test.go: `.Return(nil)` $DIR/core/services/job/spawner_test.go: `.Once()` $DIR/core/services/job/spawner_test.go: `.On("Start", mock.Anything)` $DIR/core/services/job/spawner_test.go: `.Return(nil)` $DIR/core/services/job/spawner_test.go: `.Once()` $DIR/core/services/job/spawner_test.go: `.Run(func(mock.Arguments) { eventuallyB.ItHappened() })` $DIR/core/services/job/spawner_test.go: `.ItHappened()` $DIR/core/services/job/spawner_test.go: `.NewDelegate(nil, orm, nil, nil, nil, monitoringEndpoint, legacyChains, logger.TestLogger(t), config, mailMon)` $DIR/core/services/job/spawner_test.go: `.TestLogger(t)` $DIR/core/services/job/spawner_test.go: `.NewSpawner(orm, config.Database(), noopChecker{}, map[job.Type]job.Delegate{ jobA.Type: delegateA, jobB.Type: delegateB, }, lggr, nil)` $DIR/core/services/job/spawner_test.go: `.Database()` $DIR/core/services/job/spawner_test.go: `.Context(t)` $DIR/core/services/job/spawner_test.go: `.CreateJob(ctx, nil, jobA)` $DIR/core/services/job/spawner_test.go: `.AwaitOrFail(t, 20*time.Second)` $DIR/core/services/job/spawner_test.go: `.CreateJob(ctx, nil, jobB)` $DIR/core/services/job/spawner_test.go: `.AwaitOrFail(t, 20*time.Second)` $DIR/core/services/job/spawner_test.go: `.On("Close")` $DIR/core/services/job/spawner_test.go: `.Return(nil)` $DIR/core/services/job/spawner_test.go: `.Once()` $DIR/core/services/job/spawner_test.go: `.On("Close")` $DIR/core/services/job/spawner_test.go: `.Return(nil)` $DIR/core/services/job/spawner_test.go: `.Once()` $DIR/core/services/job/spawner_test.go: `.DeleteJob(ctx, nil, jobSpecIDA)` $DIR/core/services/job/spawner_test.go: `.On("Close")` $DIR/core/services/job/spawner_test.go: `.Return(nil)` $DIR/core/services/job/spawner_test.go: `.Once()` $DIR/core/services/job/spawner_test.go: `.On("Close")` $DIR/core/services/job/spawner_test.go: `.Return(nil)` $DIR/core/services/job/spawner_test.go: `.Once()` $DIR/core/services/job/spawner_test.go: `.DeleteJob(ctx, nil, jobSpecIDB)` $DIR/core/services/job/spawner_test.go: `.Run("starts and stops job services from the DB when .Start()/.Stop() is called", func(t *testing.T) { jobA := makeOCRJobSpec(t, address, bridge.Name.String(), bridge2.Name.String()) eventually := cltest.NewAwaiter() serviceA1 := mocks.NewServiceCtx(t) serviceA2 := mocks.NewServiceCtx(t) serviceA1.On("Start", mock.Anything).Return(nil).Once() serviceA2.On("Start", mock.Anything).Return(nil).Once().Run(func(mock.Arguments) { eventually.ItHappened() }) lggr := logger.TestLogger(t) orm := NewTestORM(t, db, pipeline.NewORM(db, lggr, config.JobPipeline().MaxSuccessfulRuns()), bridges.NewORM(db), keyStore) mailMon := servicetest.Run(t, mailboxtest.NewMonitor(t)) d := ocr.NewDelegate(nil, orm, nil, nil, nil, monitoringEndpoint, legacyChains, logger.TestLogger(t), config, mailMon) delegateA := &delegate{jobA.Type, []job.ServiceCtx{serviceA1, serviceA2}, 0, nil, d} spawner := job.NewSpawner(orm, config.Database(), noopChecker{}, map[job.Type]job.Delegate{ jobA.Type: delegateA, }, lggr, nil) ctx := testutils.Context(t) err := orm.CreateJob(ctx, jobA) require.NoError(t, err) delegateA.jobID = jobA.ID require.NoError(t, spawner.Start(ctx)) eventually.AwaitOrFail(t) serviceA1.On("Close").Return(nil).Once() serviceA2.On("Close").Return(nil).Once() require.NoError(t, spawner.Close()) })` $DIR/core/services/job/spawner_test.go: `.Name.String()` $DIR/core/services/job/spawner_test.go: `.Name.String()` $DIR/core/services/job/spawner_test.go: `.NewAwaiter()` $DIR/core/services/job/spawner_test.go: `.NewServiceCtx(t)` $DIR/core/services/job/spawner_test.go: `.NewServiceCtx(t)` $DIR/core/services/job/spawner_test.go: `.On("Start", mock.Anything)` $DIR/core/services/job/spawner_test.go: `.Return(nil)` $DIR/core/services/job/spawner_test.go: `.Once()` $DIR/core/services/job/spawner_test.go: `.On("Start", mock.Anything)` $DIR/core/services/job/spawner_test.go: `.Return(nil)` $DIR/core/services/job/spawner_test.go: `.Once()` $DIR/core/services/job/spawner_test.go: `.Run(func(mock.Arguments) { eventually.ItHappened() })` $DIR/core/services/job/spawner_test.go: `.ItHappened()` $DIR/core/services/job/spawner_test.go: `.TestLogger(t)` $DIR/core/services/job/spawner_test.go: `.NewORM(db, lggr, config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/spawner_test.go: `.JobPipeline()` $DIR/core/services/job/spawner_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/spawner_test.go: `.NewORM(db)` $DIR/core/services/job/spawner_test.go: `.Run(t, mailboxtest.NewMonitor(t))` $DIR/core/services/job/spawner_test.go: `.NewMonitor(t)` $DIR/core/services/job/spawner_test.go: `.NewDelegate(nil, orm, nil, nil, nil, monitoringEndpoint, legacyChains, logger.TestLogger(t), config, mailMon)` $DIR/core/services/job/spawner_test.go: `.TestLogger(t)` $DIR/core/services/job/spawner_test.go: `.NewSpawner(orm, config.Database(), noopChecker{}, map[job.Type]job.Delegate{ jobA.Type: delegateA, }, lggr, nil)` $DIR/core/services/job/spawner_test.go: `.Database()` $DIR/core/services/job/spawner_test.go: `.Context(t)` $DIR/core/services/job/spawner_test.go: `.CreateJob(ctx, jobA)` $DIR/core/services/job/spawner_test.go: `.AwaitOrFail(t)` $DIR/core/services/job/spawner_test.go: `.On("Close")` $DIR/core/services/job/spawner_test.go: `.Return(nil)` $DIR/core/services/job/spawner_test.go: `.Once()` $DIR/core/services/job/spawner_test.go: `.On("Close")` $DIR/core/services/job/spawner_test.go: `.Return(nil)` $DIR/core/services/job/spawner_test.go: `.Once()` $DIR/core/services/job/spawner_test.go: `.Run("closes job services on 'DeleteJob()'", func(t *testing.T) { jobA := makeOCRJobSpec(t, address, bridge.Name.String(), bridge2.Name.String()) eventuallyStart := cltest.NewAwaiter() serviceA1 := mocks.NewServiceCtx(t) serviceA2 := mocks.NewServiceCtx(t) serviceA1.On("Start", mock.Anything).Return(nil).Once() serviceA2.On("Start", mock.Anything).Return(nil).Once().Run(func(mock.Arguments) { eventuallyStart.ItHappened() }) lggr := logger.TestLogger(t) orm := NewTestORM(t, db, pipeline.NewORM(db, lggr, config.JobPipeline().MaxSuccessfulRuns()), bridges.NewORM(db), keyStore) mailMon := servicetest.Run(t, mailboxtest.NewMonitor(t)) d := ocr.NewDelegate(nil, orm, nil, nil, nil, monitoringEndpoint, legacyChains, logger.TestLogger(t), config, mailMon) delegateA := &delegate{jobA.Type, []job.ServiceCtx{serviceA1, serviceA2}, 0, nil, d} spawner := job.NewSpawner(orm, config.Database(), noopChecker{}, map[job.Type]job.Delegate{ jobA.Type: delegateA, }, lggr, nil) ctx := testutils.Context(t) err := orm.CreateJob(ctx, jobA) require.NoError(t, err) jobSpecIDA := jobA.ID delegateA.jobID = jobSpecIDA require.NoError(t, spawner.Start(ctx)) defer func() { assert.NoError(t, spawner.Close()) }() eventuallyStart.AwaitOrFail(t) // Wait for the claim lock to be taken gomega.NewWithT(t).Eventually(func() bool { jobs := spawner.ActiveJobs() _, exists := jobs[jobSpecIDA] return exists }, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.Equal(true)) eventuallyClose := cltest.NewAwaiter() serviceA1.On("Close").Return(nil).Once() serviceA2.On("Close").Return(nil).Once().Run(func(mock.Arguments) { eventuallyClose.ItHappened() }) err = spawner.DeleteJob(ctx, nil, jobSpecIDA) require.NoError(t, err) eventuallyClose.AwaitOrFail(t) // Wait for the claim lock to be released gomega.NewWithT(t).Eventually(func() bool { jobs := spawner.ActiveJobs() _, exists := jobs[jobSpecIDA] return exists }, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.Equal(false)) clearDB(t, db) })` $DIR/core/services/job/spawner_test.go: `.Name.String()` $DIR/core/services/job/spawner_test.go: `.Name.String()` $DIR/core/services/job/spawner_test.go: `.NewAwaiter()` $DIR/core/services/job/spawner_test.go: `.NewServiceCtx(t)` $DIR/core/services/job/spawner_test.go: `.NewServiceCtx(t)` $DIR/core/services/job/spawner_test.go: `.On("Start", mock.Anything)` $DIR/core/services/job/spawner_test.go: `.Return(nil)` $DIR/core/services/job/spawner_test.go: `.Once()` $DIR/core/services/job/spawner_test.go: `.On("Start", mock.Anything)` $DIR/core/services/job/spawner_test.go: `.Return(nil)` $DIR/core/services/job/spawner_test.go: `.Once()` $DIR/core/services/job/spawner_test.go: `.Run(func(mock.Arguments) { eventuallyStart.ItHappened() })` $DIR/core/services/job/spawner_test.go: `.ItHappened()` $DIR/core/services/job/spawner_test.go: `.TestLogger(t)` $DIR/core/services/job/spawner_test.go: `.NewORM(db, lggr, config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/spawner_test.go: `.JobPipeline()` $DIR/core/services/job/spawner_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/spawner_test.go: `.NewORM(db)` $DIR/core/services/job/spawner_test.go: `.Run(t, mailboxtest.NewMonitor(t))` $DIR/core/services/job/spawner_test.go: `.NewMonitor(t)` $DIR/core/services/job/spawner_test.go: `.NewDelegate(nil, orm, nil, nil, nil, monitoringEndpoint, legacyChains, logger.TestLogger(t), config, mailMon)` $DIR/core/services/job/spawner_test.go: `.TestLogger(t)` $DIR/core/services/job/spawner_test.go: `.NewSpawner(orm, config.Database(), noopChecker{}, map[job.Type]job.Delegate{ jobA.Type: delegateA, }, lggr, nil)` $DIR/core/services/job/spawner_test.go: `.Database()` $DIR/core/services/job/spawner_test.go: `.Context(t)` $DIR/core/services/job/spawner_test.go: `.CreateJob(ctx, jobA)` $DIR/core/services/job/spawner_test.go: `.AwaitOrFail(t)` $DIR/core/services/job/spawner_test.go: `.NewWithT(t)` $DIR/core/services/job/spawner_test.go: `.Eventually(func() bool { jobs := spawner.ActiveJobs() _, exists := jobs[jobSpecIDA] return exists }, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/services/job/spawner_test.go: `.ActiveJobs()` $DIR/core/services/job/spawner_test.go: `.WaitTimeout(t)` $DIR/core/services/job/spawner_test.go: `.Should(gomega.Equal(true))` $DIR/core/services/job/spawner_test.go: `.Equal(true)` $DIR/core/services/job/spawner_test.go: `.NewAwaiter()` $DIR/core/services/job/spawner_test.go: `.On("Close")` $DIR/core/services/job/spawner_test.go: `.Return(nil)` $DIR/core/services/job/spawner_test.go: `.Once()` $DIR/core/services/job/spawner_test.go: `.On("Close")` $DIR/core/services/job/spawner_test.go: `.Return(nil)` $DIR/core/services/job/spawner_test.go: `.Once()` $DIR/core/services/job/spawner_test.go: `.Run(func(mock.Arguments) { eventuallyClose.ItHappened() })` $DIR/core/services/job/spawner_test.go: `.ItHappened()` $DIR/core/services/job/spawner_test.go: `.DeleteJob(ctx, nil, jobSpecIDA)` $DIR/core/services/job/spawner_test.go: `.AwaitOrFail(t)` $DIR/core/services/job/spawner_test.go: `.NewWithT(t)` $DIR/core/services/job/spawner_test.go: `.Eventually(func() bool { jobs := spawner.ActiveJobs() _, exists := jobs[jobSpecIDA] return exists }, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/services/job/spawner_test.go: `.ActiveJobs()` $DIR/core/services/job/spawner_test.go: `.WaitTimeout(t)` $DIR/core/services/job/spawner_test.go: `.Should(gomega.Equal(false))` $DIR/core/services/job/spawner_test.go: `.Equal(false)` $DIR/core/services/job/spawner_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Feature.LogPoller = func(b bool) *bool { return &b }(true) })` $DIR/core/services/job/spawner_test.go: `.TestLogger(t)` $DIR/core/services/job/spawner_test.go: `.NewChainRelayExtenders(t, testopts)` $DIR/core/services/job/spawner_test.go: `.NewLegacyChainsFromRelayerExtenders(relayExtenders)` $DIR/core/services/job/spawner_test.go: `.Get("0")` $DIR/core/services/job/spawner_test.go: `.NewRelayer(lggr, chain, evmrelayer.RelayerOpts{ DS: db, CSAETHKeystore: keyStore, CapabilitiesRegistry: capabilities.NewRegistry(lggr), })` $DIR/core/services/job/spawner_test.go: `.NewRegistry(lggr)` $DIR/core/services/job/spawner_test.go: `.Slice()` $DIR/core/services/job/spawner_test.go: `.ID()` $DIR/core/services/job/spawner_test.go: `.NewORM(db, lggr, config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/job/spawner_test.go: `.JobPipeline()` $DIR/core/services/job/spawner_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/job/spawner_test.go: `.NewORM(db)` $DIR/core/services/job/spawner_test.go: `.Run(t, mailboxtest.NewMonitor(t))` $DIR/core/services/job/spawner_test.go: `.NewMonitor(t)` $DIR/core/services/job/spawner_test.go: `.NewRegistrarConfig(loop.GRPCOpts{}, func(name string) (*plugins.RegisteredLoop, error) { return nil, nil }, func(loopId string) {})` $DIR/core/services/job/spawner_test.go: `.NewDelegateConfig(config.OCR2(), config.Mercury(), config.Threshold(), config.Insecure(), config.JobPipeline(), processConfig)` $DIR/core/services/job/spawner_test.go: `.OCR2()` $DIR/core/services/job/spawner_test.go: `.Mercury()` $DIR/core/services/job/spawner_test.go: `.Threshold()` $DIR/core/services/job/spawner_test.go: `.Insecure()` $DIR/core/services/job/spawner_test.go: `.JobPipeline()` $DIR/core/services/job/spawner_test.go: `.NewDelegate(nil, orm, nil, nil, nil, nil, nil, monitoringEndpoint, legacyChains, lggr, ocr2DelegateConfig, keyStore.OCR2(), keyStore.DKGSign(), keyStore.DKGEncrypt(), ethKeyStore, testRelayGetter, mailMon, capabilities.NewRegistry(lggr))` $DIR/core/services/job/spawner_test.go: `.OCR2()` $DIR/core/services/job/spawner_test.go: `.DKGSign()` $DIR/core/services/job/spawner_test.go: `.DKGEncrypt()` $DIR/core/services/job/spawner_test.go: `.NewRegistry(lggr)` $DIR/core/services/job/spawner_test.go: `.NewSpawner(orm, config.Database(), noopChecker{}, map[job.Type]job.Delegate{ jobOCR2Keeper.Type: delegateOCR2, }, lggr, nil)` $DIR/core/services/job/spawner_test.go: `.Database()` $DIR/core/services/job/spawner_test.go: `.Context(t)` $DIR/core/services/job/spawner_test.go: `.CreateJob(ctx, nil, jobOCR2Keeper)` $DIR/core/services/job/spawner_test.go: `.On("UnregisterFilter", mock.Anything, mock.Anything)` $DIR/core/services/job/spawner_test.go: `.Return(nil)` $DIR/core/services/job/spawner_test.go: `.Run(func(args mock.Arguments) { lggr.Debugf("UnregisterFilter called with args %v", args) })` $DIR/core/services/job/spawner_test.go: `.Debugf("UnregisterFilter called with args %v", args)` $DIR/core/services/job/spawner_test.go: `.DeleteJob(ctx, nil, jobSpecID)` $DIR/core/services/job/spawner_test.go: `.AssertNumberOfCalls(t, "UnregisterFilter", 6)` $DIR/core/services/job/spawner_test.go: `.On("Close")` $DIR/core/services/job/spawner_test.go: `.Return(nil)` $DIR/core/services/job/spawner_test.go: `.Once()` $DIR/core/services/job/validate_test.go: `t.Run(tc.name, func(t *testing.T) { _, err := ValidateSpec(tc.spec) tc.assertion(t, err) })` $DIR/core/services/job/validate_test.go: `tc.assertion(t, err)` $DIR/core/services/job/validate_test.go: `.Run(tc.name, func(t *testing.T) { _, err := ValidateSpec(tc.spec) tc.assertion(t, err) })` $DIR/core/services/job/validate_test.go: `.assertion(t, err)` $DIR/core/services/keeper/integration_test.go: `t.Run(test.name, func(t *testing.T) { t.Parallel() ctx := testutils.Context(t) g := gomega.NewWithT(t) // setup node key nodeKey := cltest.MustGenerateRandomKey(t) nodeAddress := nodeKey.Address nodeAddressEIP55 := evmtypes.EIP55AddressFromAddress(nodeAddress) // setup blockchain sergey := testutils.MustNewSimTransactor(t) // owns all the link steve := testutils.MustNewSimTransactor(t) // registry owner carrol := testutils.MustNewSimTransactor(t) // client nelly := testutils.MustNewSimTransactor(t) // other keeper operator 1 nick := testutils.MustNewSimTransactor(t) // other keeper operator 2 genesisData := core.GenesisAlloc{ sergey.From: {Balance: assets.Ether(1000).ToInt()}, steve.From: {Balance: assets.Ether(1000).ToInt()}, carrol.From: {Balance: assets.Ether(1000).ToInt()}, nelly.From: {Balance: assets.Ether(1000).ToInt()}, nick.From: {Balance: assets.Ether(1000).ToInt()}, nodeAddress: {Balance: assets.Ether(1000).ToInt()}, } gasLimit := uint32(ethconfig.Defaults.Miner.GasCeil * 2) b := cltest.NewSimulatedBackend(t, genesisData, gasLimit) backend := client.NewSimulatedBackendClient(t, b, testutils.SimulatedChainID) stopMining := cltest.Mine(backend.Backend(), 1*time.Second) // >> 2 seconds and the test gets slow, << 1 second and the app may miss heads defer stopMining() linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(sergey, backend) require.NoError(t, err) gasFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(60000000000)) require.NoError(t, err) linkFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(20000000000000000)) require.NoError(t, err) regAddr, registryWrapper := deployKeeperRegistry(t, test.registryVersion, steve, backend, linkAddr, linkFeedAddr, gasFeedAddr) upkeepAddr, _, upkeepContract, err := basic_upkeep_contract.DeployBasicUpkeepContract(carrol, backend) require.NoError(t, err) _, err = linkToken.Transfer(sergey, carrol.From, oneHunEth) require.NoError(t, err) _, err = linkToken.Approve(carrol, regAddr, oneHunEth) require.NoError(t, err) _, err = registryWrapper.SetKeepers(steve, []common.Address{nodeAddress, nelly.From}, []common.Address{nodeAddress, nelly.From}) require.NoError(t, err) registrationTx, err := registryWrapper.RegisterUpkeep(steve, upkeepAddr, 2_500_000, carrol.From, []byte{}) require.NoError(t, err) backend.Commit() upkeepID := getUpkeepIdFromTx(t, registryWrapper, registrationTx, backend) _, err = upkeepContract.SetBytesToSend(carrol, payload1) require.NoError(t, err) _, err = upkeepContract.SetShouldPerformUpkeep(carrol, true) require.NoError(t, err) _, err = registryWrapper.AddFunds(carrol, upkeepID, tenEth) require.NoError(t, err) backend.Commit() // setup app config, db := heavyweight.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.EIP1559DynamicFees = &test.eip1559 c.Keeper.MaxGracePeriod = ptr[int64](0) // avoid waiting to re-submit for upkeeps c.Keeper.Registry.SyncInterval = commonconfig.MustNewDuration(24 * time.Hour) // disable full sync ticker for test c.Keeper.TurnLookBack = ptr[int64](0) // testing doesn't need to do far look back c.EVM[0].BlockBackfillDepth = ptr[uint32](0) // backfill will trigger sync on startup c.EVM[0].MinIncomingConfirmations = ptr[uint32](1) // disable reorg protection for this test c.EVM[0].HeadTracker.MaxBufferSize = ptr[uint32](100) // helps prevent missed heads }) korm := keeper.NewORM(db, logger.TestLogger(t)) app := cltest.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, backend.Backend(), nodeKey) require.NoError(t, app.Start(ctx)) // create job regAddrEIP55 := evmtypes.EIP55AddressFromAddress(regAddr) job := cltest.MustInsertKeeperJob(t, db, korm, nodeAddressEIP55, regAddrEIP55) err = app.JobSpawner().StartService(ctx, job) require.NoError(t, err) // keeper job is triggered and payload is received receivedBytes := func() []byte { received, err2 := upkeepContract.ReceivedBytes(nil) require.NoError(t, err2) return received } g.Eventually(receivedBytes, 20*time.Second, cltest.DBPollingInterval).Should(gomega.Equal(payload1)) // submit from other keeper (because keepers must alternate) _, err = registryWrapper.PerformUpkeep(nelly, upkeepID, []byte{}) require.NoError(t, err) // change payload _, err = upkeepContract.SetBytesToSend(carrol, payload2) require.NoError(t, err) _, err = upkeepContract.SetShouldPerformUpkeep(carrol, true) require.NoError(t, err) // observe 2nd job run and received payload changes g.Eventually(receivedBytes, 20*time.Second, cltest.DBPollingInterval).Should(gomega.Equal(payload2)) // cancel upkeep _, err = registryWrapper.CancelUpkeep(carrol, upkeepID) require.NoError(t, err) backend.Commit() cltest.WaitForCount(t, app.GetDB(), "upkeep_registrations", 0) // add new upkeep (same target contract) registrationTx, err = registryWrapper.RegisterUpkeep(steve, upkeepAddr, 2_500_000, carrol.From, []byte{}) require.NoError(t, err) backend.Commit() upkeepID = getUpkeepIdFromTx(t, registryWrapper, registrationTx, backend) _, err = upkeepContract.SetBytesToSend(carrol, payload3) require.NoError(t, err) _, err = upkeepContract.SetShouldPerformUpkeep(carrol, true) require.NoError(t, err) _, err = registryWrapper.AddFunds(carrol, upkeepID, tenEth) require.NoError(t, err) backend.Commit() // observe update g.Eventually(receivedBytes, 20*time.Second, cltest.DBPollingInterval).Should(gomega.Equal(payload3)) // remove this node from keeper list _, err = registryWrapper.SetKeepers(steve, []common.Address{nick.From, nelly.From}, []common.Address{nick.From, nelly.From}) require.NoError(t, err) var registry keeper.Registry require.NoError(t, app.GetDB().GetContext(ctx, ®istry, `SELECT * FROM keeper_registries`)) cltest.AssertRecordEventually(t, app.GetDB(), ®istry, fmt.Sprintf("SELECT * FROM keeper_registries WHERE id = %d", registry.ID), func() bool { return registry.KeeperIndex == -1 }) runs, err := app.PipelineORM().GetAllRuns(ctx) require.NoError(t, err) // Since we set grace period to 0, we can have more than 1 pipeline run per perform // This happens in case we start a pipeline run before previous perform tx is committed to chain require.GreaterOrEqual(t, len(runs), 3) prr := webpresenters.NewPipelineRunResource(runs[0], logger.TestLogger(t)) require.Equal(t, 1, len(prr.Outputs)) require.Nil(t, prr.Outputs[0]) })` $DIR/core/services/keeper/integration_test.go: `_, err = linkToken.Transfer(sergey, carrol.From, oneHunEth)` $DIR/core/services/keeper/integration_test.go: `_, err = linkToken.Approve(carrol, regAddr, oneHunEth)` $DIR/core/services/keeper/integration_test.go: `_, err = registryWrapper.SetKeepers(steve, []common.Address{nodeAddress, nelly.From}, []common.Address{nodeAddress, nelly.From})` $DIR/core/services/keeper/integration_test.go: `backend.Commit()` $DIR/core/services/keeper/integration_test.go: `_, err = upkeepContract.SetBytesToSend(carrol, payload1)` $DIR/core/services/keeper/integration_test.go: `_, err = upkeepContract.SetShouldPerformUpkeep(carrol, true)` $DIR/core/services/keeper/integration_test.go: `_, err = registryWrapper.AddFunds(carrol, upkeepID, tenEth)` $DIR/core/services/keeper/integration_test.go: `backend.Commit()` $DIR/core/services/keeper/integration_test.go: `c.EVM[0].GasEstimator.EIP1559DynamicFees = &test.eip1559` $DIR/core/services/keeper/integration_test.go: `c.Keeper.MaxGracePeriod = ptr[int64](0)` $DIR/core/services/keeper/integration_test.go: `c.Keeper.Registry.SyncInterval = commonconfig.MustNewDuration(24 * time.Hour)` $DIR/core/services/keeper/integration_test.go: `c.Keeper.TurnLookBack = ptr[int64](0)` $DIR/core/services/keeper/integration_test.go: `c.EVM[0].BlockBackfillDepth = ptr[uint32](0)` $DIR/core/services/keeper/integration_test.go: `c.EVM[0].MinIncomingConfirmations = ptr[uint32](1)` $DIR/core/services/keeper/integration_test.go: `c.EVM[0].HeadTracker.MaxBufferSize = ptr[uint32](100)` $DIR/core/services/keeper/integration_test.go: `err = app.JobSpawner().StartService(ctx, job)` $DIR/core/services/keeper/integration_test.go: `g.Eventually(receivedBytes, 20*time.Second, cltest.DBPollingInterval).Should(gomega.Equal(payload1))` $DIR/core/services/keeper/integration_test.go: `_, err = registryWrapper.PerformUpkeep(nelly, upkeepID, []byte{})` $DIR/core/services/keeper/integration_test.go: `_, err = upkeepContract.SetBytesToSend(carrol, payload2)` $DIR/core/services/keeper/integration_test.go: `_, err = upkeepContract.SetShouldPerformUpkeep(carrol, true)` $DIR/core/services/keeper/integration_test.go: `g.Eventually(receivedBytes, 20*time.Second, cltest.DBPollingInterval).Should(gomega.Equal(payload2))` $DIR/core/services/keeper/integration_test.go: `_, err = registryWrapper.CancelUpkeep(carrol, upkeepID)` $DIR/core/services/keeper/integration_test.go: `backend.Commit()` $DIR/core/services/keeper/integration_test.go: `cltest.WaitForCount(t, app.GetDB(), "upkeep_registrations", 0)` $DIR/core/services/keeper/integration_test.go: `registrationTx, err = registryWrapper.RegisterUpkeep(steve, upkeepAddr, 2_500_000, carrol.From, []byte{})` $DIR/core/services/keeper/integration_test.go: `backend.Commit()` $DIR/core/services/keeper/integration_test.go: `upkeepID = getUpkeepIdFromTx(t, registryWrapper, registrationTx, backend)` $DIR/core/services/keeper/integration_test.go: `_, err = upkeepContract.SetBytesToSend(carrol, payload3)` $DIR/core/services/keeper/integration_test.go: `_, err = upkeepContract.SetShouldPerformUpkeep(carrol, true)` $DIR/core/services/keeper/integration_test.go: `_, err = registryWrapper.AddFunds(carrol, upkeepID, tenEth)` $DIR/core/services/keeper/integration_test.go: `backend.Commit()` $DIR/core/services/keeper/integration_test.go: `g.Eventually(receivedBytes, 20*time.Second, cltest.DBPollingInterval).Should(gomega.Equal(payload3))` $DIR/core/services/keeper/integration_test.go: `_, err = registryWrapper.SetKeepers(steve, []common.Address{nick.From, nelly.From}, []common.Address{nick.From, nelly.From})` $DIR/core/services/keeper/integration_test.go: `cltest.AssertRecordEventually(t, app.GetDB(), ®istry, fmt.Sprintf("SELECT * FROM keeper_registries WHERE id = %d", registry.ID), func() bool { return registry.KeeperIndex == -1 })` $DIR/core/services/keeper/integration_test.go: `_, err = authorizedForwarder.SetAuthorizedSenders(sergey, []common.Address{nodeAddress})` $DIR/core/services/keeper/integration_test.go: `_, err = linkToken.Transfer(sergey, carrol.From, oneHunEth)` $DIR/core/services/keeper/integration_test.go: `_, err = linkToken.Approve(carrol, regAddr, oneHunEth)` $DIR/core/services/keeper/integration_test.go: `_, err = registryWrapper.SetKeepers(steve, []common.Address{fwdrAddress, nelly.From}, []common.Address{nodeAddress, nelly.From})` $DIR/core/services/keeper/integration_test.go: `backend.Commit()` $DIR/core/services/keeper/integration_test.go: `_, err = upkeepContract.SetBytesToSend(carrol, payload1)` $DIR/core/services/keeper/integration_test.go: `_, err = upkeepContract.SetShouldPerformUpkeep(carrol, true)` $DIR/core/services/keeper/integration_test.go: `_, err = registryWrapper.AddFunds(carrol, upkeepID, tenEth)` $DIR/core/services/keeper/integration_test.go: `backend.Commit()` $DIR/core/services/keeper/integration_test.go: `c.Feature.LogPoller = ptr(true)` $DIR/core/services/keeper/integration_test.go: `c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(true)` $DIR/core/services/keeper/integration_test.go: `c.Keeper.MaxGracePeriod = ptr[int64](0)` $DIR/core/services/keeper/integration_test.go: `c.Keeper.Registry.SyncInterval = commonconfig.MustNewDuration(24 * time.Hour)` $DIR/core/services/keeper/integration_test.go: `c.Keeper.TurnLookBack = ptr[int64](0)` $DIR/core/services/keeper/integration_test.go: `c.EVM[0].BlockBackfillDepth = ptr[uint32](0)` $DIR/core/services/keeper/integration_test.go: `c.EVM[0].MinIncomingConfirmations = ptr[uint32](1)` $DIR/core/services/keeper/integration_test.go: `c.EVM[0].HeadTracker.MaxBufferSize = ptr[uint32](100)` $DIR/core/services/keeper/integration_test.go: `c.EVM[0].Transactions.ForwardersEnabled = ptr(true)` $DIR/core/services/keeper/integration_test.go: `c.EVM[0].ChainID = (*ubig.Big)(testutils.SimulatedChainID)` $DIR/core/services/keeper/integration_test.go: `_, err = forwarderORM.CreateForwarder(ctx, fwdrAddress, chainID)` $DIR/core/services/keeper/integration_test.go: `err = app.JobORM().CreateJob(testutils.Context(t), &jb)` $DIR/core/services/keeper/integration_test.go: `err = korm.UpsertRegistry(ctx, ®istry)` $DIR/core/services/keeper/integration_test.go: `err = app.JobSpawner().StartService(ctx, jb)` $DIR/core/services/keeper/integration_test.go: `g.Eventually(receivedBytes, 20*time.Second, cltest.DBPollingInterval).Should(gomega.Equal(payload1))` $DIR/core/services/keeper/integration_test.go: `g.Eventually(lastKeeper, 20*time.Second, cltest.DBPollingInterval).Should(gomega.Equal(fwdrAddress))` $DIR/core/services/keeper/integration_test.go: `_, err = linkToken.Transfer(sergey, carrol.From, oneHunEth)` $DIR/core/services/keeper/integration_test.go: `_, err = linkToken.Approve(carrol, regAddr, oneHunEth)` $DIR/core/services/keeper/integration_test.go: `_, err = registryWrapper.SetKeepers(steve, []common.Address{nodeAddress, nelly.From}, []common.Address{nodeAddress, nelly.From})` $DIR/core/services/keeper/integration_test.go: `backend.Commit()` $DIR/core/services/keeper/integration_test.go: `_, err = registryWrapper.AddFunds(carrol, upkeepID, tenEth)` $DIR/core/services/keeper/integration_test.go: `backend.Commit()` $DIR/core/services/keeper/integration_test.go: `c.Keeper.MaxGracePeriod = ptr[int64](0)` $DIR/core/services/keeper/integration_test.go: `c.Keeper.Registry.SyncInterval = commonconfig.MustNewDuration(24 * time.Hour)` $DIR/core/services/keeper/integration_test.go: `c.Keeper.Registry.MaxPerformDataSize = ptr(uint32(maxPerformDataSize))` $DIR/core/services/keeper/integration_test.go: `c.Keeper.TurnLookBack = ptr[int64](0)` $DIR/core/services/keeper/integration_test.go: `c.EVM[0].BlockBackfillDepth = ptr[uint32](0)` $DIR/core/services/keeper/integration_test.go: `c.EVM[0].MinIncomingConfirmations = ptr[uint32](1)` $DIR/core/services/keeper/integration_test.go: `c.EVM[0].HeadTracker.MaxBufferSize = ptr[uint32](100)` $DIR/core/services/keeper/integration_test.go: `err = app.JobSpawner().StartService(ctx, job)` $DIR/core/services/keeper/integration_test.go: `_, err = upkeepContract.SetBytesToSend(carrol, hugePayload)` $DIR/core/services/keeper/integration_test.go: `_, err = upkeepContract.SetShouldPerformUpkeep(carrol, true)` $DIR/core/services/keeper/integration_test.go: `g.Consistently(receivedBytes, 20*time.Second, cltest.DBPollingInterval).Should(gomega.Equal([]byte{}))` $DIR/core/services/keeper/integration_test.go: `_, err = upkeepContract.SetBytesToSend(carrol, smallPayload)` $DIR/core/services/keeper/integration_test.go: `g.Eventually(receivedBytes, 20*time.Second, cltest.DBPollingInterval).Should(gomega.Equal(smallPayload))` $DIR/core/services/keeper/integration_test.go: `.Run(test.name, func(t *testing.T) { t.Parallel() ctx := testutils.Context(t) g := gomega.NewWithT(t) // setup node key nodeKey := cltest.MustGenerateRandomKey(t) nodeAddress := nodeKey.Address nodeAddressEIP55 := evmtypes.EIP55AddressFromAddress(nodeAddress) // setup blockchain sergey := testutils.MustNewSimTransactor(t) // owns all the link steve := testutils.MustNewSimTransactor(t) // registry owner carrol := testutils.MustNewSimTransactor(t) // client nelly := testutils.MustNewSimTransactor(t) // other keeper operator 1 nick := testutils.MustNewSimTransactor(t) // other keeper operator 2 genesisData := core.GenesisAlloc{ sergey.From: {Balance: assets.Ether(1000).ToInt()}, steve.From: {Balance: assets.Ether(1000).ToInt()}, carrol.From: {Balance: assets.Ether(1000).ToInt()}, nelly.From: {Balance: assets.Ether(1000).ToInt()}, nick.From: {Balance: assets.Ether(1000).ToInt()}, nodeAddress: {Balance: assets.Ether(1000).ToInt()}, } gasLimit := uint32(ethconfig.Defaults.Miner.GasCeil * 2) b := cltest.NewSimulatedBackend(t, genesisData, gasLimit) backend := client.NewSimulatedBackendClient(t, b, testutils.SimulatedChainID) stopMining := cltest.Mine(backend.Backend(), 1*time.Second) // >> 2 seconds and the test gets slow, << 1 second and the app may miss heads defer stopMining() linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(sergey, backend) require.NoError(t, err) gasFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(60000000000)) require.NoError(t, err) linkFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(20000000000000000)) require.NoError(t, err) regAddr, registryWrapper := deployKeeperRegistry(t, test.registryVersion, steve, backend, linkAddr, linkFeedAddr, gasFeedAddr) upkeepAddr, _, upkeepContract, err := basic_upkeep_contract.DeployBasicUpkeepContract(carrol, backend) require.NoError(t, err) _, err = linkToken.Transfer(sergey, carrol.From, oneHunEth) require.NoError(t, err) _, err = linkToken.Approve(carrol, regAddr, oneHunEth) require.NoError(t, err) _, err = registryWrapper.SetKeepers(steve, []common.Address{nodeAddress, nelly.From}, []common.Address{nodeAddress, nelly.From}) require.NoError(t, err) registrationTx, err := registryWrapper.RegisterUpkeep(steve, upkeepAddr, 2_500_000, carrol.From, []byte{}) require.NoError(t, err) backend.Commit() upkeepID := getUpkeepIdFromTx(t, registryWrapper, registrationTx, backend) _, err = upkeepContract.SetBytesToSend(carrol, payload1) require.NoError(t, err) _, err = upkeepContract.SetShouldPerformUpkeep(carrol, true) require.NoError(t, err) _, err = registryWrapper.AddFunds(carrol, upkeepID, tenEth) require.NoError(t, err) backend.Commit() // setup app config, db := heavyweight.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.EIP1559DynamicFees = &test.eip1559 c.Keeper.MaxGracePeriod = ptr[int64](0) // avoid waiting to re-submit for upkeeps c.Keeper.Registry.SyncInterval = commonconfig.MustNewDuration(24 * time.Hour) // disable full sync ticker for test c.Keeper.TurnLookBack = ptr[int64](0) // testing doesn't need to do far look back c.EVM[0].BlockBackfillDepth = ptr[uint32](0) // backfill will trigger sync on startup c.EVM[0].MinIncomingConfirmations = ptr[uint32](1) // disable reorg protection for this test c.EVM[0].HeadTracker.MaxBufferSize = ptr[uint32](100) // helps prevent missed heads }) korm := keeper.NewORM(db, logger.TestLogger(t)) app := cltest.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, backend.Backend(), nodeKey) require.NoError(t, app.Start(ctx)) // create job regAddrEIP55 := evmtypes.EIP55AddressFromAddress(regAddr) job := cltest.MustInsertKeeperJob(t, db, korm, nodeAddressEIP55, regAddrEIP55) err = app.JobSpawner().StartService(ctx, job) require.NoError(t, err) // keeper job is triggered and payload is received receivedBytes := func() []byte { received, err2 := upkeepContract.ReceivedBytes(nil) require.NoError(t, err2) return received } g.Eventually(receivedBytes, 20*time.Second, cltest.DBPollingInterval).Should(gomega.Equal(payload1)) // submit from other keeper (because keepers must alternate) _, err = registryWrapper.PerformUpkeep(nelly, upkeepID, []byte{}) require.NoError(t, err) // change payload _, err = upkeepContract.SetBytesToSend(carrol, payload2) require.NoError(t, err) _, err = upkeepContract.SetShouldPerformUpkeep(carrol, true) require.NoError(t, err) // observe 2nd job run and received payload changes g.Eventually(receivedBytes, 20*time.Second, cltest.DBPollingInterval).Should(gomega.Equal(payload2)) // cancel upkeep _, err = registryWrapper.CancelUpkeep(carrol, upkeepID) require.NoError(t, err) backend.Commit() cltest.WaitForCount(t, app.GetDB(), "upkeep_registrations", 0) // add new upkeep (same target contract) registrationTx, err = registryWrapper.RegisterUpkeep(steve, upkeepAddr, 2_500_000, carrol.From, []byte{}) require.NoError(t, err) backend.Commit() upkeepID = getUpkeepIdFromTx(t, registryWrapper, registrationTx, backend) _, err = upkeepContract.SetBytesToSend(carrol, payload3) require.NoError(t, err) _, err = upkeepContract.SetShouldPerformUpkeep(carrol, true) require.NoError(t, err) _, err = registryWrapper.AddFunds(carrol, upkeepID, tenEth) require.NoError(t, err) backend.Commit() // observe update g.Eventually(receivedBytes, 20*time.Second, cltest.DBPollingInterval).Should(gomega.Equal(payload3)) // remove this node from keeper list _, err = registryWrapper.SetKeepers(steve, []common.Address{nick.From, nelly.From}, []common.Address{nick.From, nelly.From}) require.NoError(t, err) var registry keeper.Registry require.NoError(t, app.GetDB().GetContext(ctx, ®istry, `SELECT * FROM keeper_registries`)) cltest.AssertRecordEventually(t, app.GetDB(), ®istry, fmt.Sprintf("SELECT * FROM keeper_registries WHERE id = %d", registry.ID), func() bool { return registry.KeeperIndex == -1 }) runs, err := app.PipelineORM().GetAllRuns(ctx) require.NoError(t, err) // Since we set grace period to 0, we can have more than 1 pipeline run per perform // This happens in case we start a pipeline run before previous perform tx is committed to chain require.GreaterOrEqual(t, len(runs), 3) prr := webpresenters.NewPipelineRunResource(runs[0], logger.TestLogger(t)) require.Equal(t, 1, len(prr.Outputs)) require.Nil(t, prr.Outputs[0]) })` $DIR/core/services/keeper/integration_test.go: `.Context(t)` $DIR/core/services/keeper/integration_test.go: `.NewWithT(t)` $DIR/core/services/keeper/integration_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/keeper/integration_test.go: `.EIP55AddressFromAddress(nodeAddress)` $DIR/core/services/keeper/integration_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/keeper/integration_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/keeper/integration_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/keeper/integration_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/keeper/integration_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/keeper/integration_test.go: `.Ether(1000)` $DIR/core/services/keeper/integration_test.go: `.ToInt()` $DIR/core/services/keeper/integration_test.go: `.Ether(1000)` $DIR/core/services/keeper/integration_test.go: `.ToInt()` $DIR/core/services/keeper/integration_test.go: `.Ether(1000)` $DIR/core/services/keeper/integration_test.go: `.ToInt()` $DIR/core/services/keeper/integration_test.go: `.Ether(1000)` $DIR/core/services/keeper/integration_test.go: `.ToInt()` $DIR/core/services/keeper/integration_test.go: `.Ether(1000)` $DIR/core/services/keeper/integration_test.go: `.ToInt()` $DIR/core/services/keeper/integration_test.go: `.Ether(1000)` $DIR/core/services/keeper/integration_test.go: `.ToInt()` $DIR/core/services/keeper/integration_test.go: `.NewSimulatedBackend(t, genesisData, gasLimit)` $DIR/core/services/keeper/integration_test.go: `.NewSimulatedBackendClient(t, b, testutils.SimulatedChainID)` $DIR/core/services/keeper/integration_test.go: `.Mine(backend.Backend(), 1*time.Second)` $DIR/core/services/keeper/integration_test.go: `.Backend()` $DIR/core/services/keeper/integration_test.go: `.DeployLinkToken(sergey, backend)` $DIR/core/services/keeper/integration_test.go: `.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(60000000000))` $DIR/core/services/keeper/integration_test.go: `.NewInt(60000000000)` $DIR/core/services/keeper/integration_test.go: `.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(20000000000000000))` $DIR/core/services/keeper/integration_test.go: `.NewInt(20000000000000000)` $DIR/core/services/keeper/integration_test.go: `.DeployBasicUpkeepContract(carrol, backend)` $DIR/core/services/keeper/integration_test.go: `.Transfer(sergey, carrol.From, oneHunEth)` $DIR/core/services/keeper/integration_test.go: `.Approve(carrol, regAddr, oneHunEth)` $DIR/core/services/keeper/integration_test.go: `.SetKeepers(steve, []common.Address{nodeAddress, nelly.From}, []common.Address{nodeAddress, nelly.From})` $DIR/core/services/keeper/integration_test.go: `.RegisterUpkeep(steve, upkeepAddr, 2_500_000, carrol.From, []byte{})` $DIR/core/services/keeper/integration_test.go: `.Commit()` $DIR/core/services/keeper/integration_test.go: `.SetBytesToSend(carrol, payload1)` $DIR/core/services/keeper/integration_test.go: `.SetShouldPerformUpkeep(carrol, true)` $DIR/core/services/keeper/integration_test.go: `.AddFunds(carrol, upkeepID, tenEth)` $DIR/core/services/keeper/integration_test.go: `.Commit()` $DIR/core/services/keeper/integration_test.go: `.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.EIP1559DynamicFees = &test.eip1559 c.Keeper.MaxGracePeriod = ptr[int64](0) // avoid waiting to re-submit for upkeeps c.Keeper.Registry.SyncInterval = commonconfig.MustNewDuration(24 * time.Hour) // disable full sync ticker for test c.Keeper.TurnLookBack = ptr[int64](0) // testing doesn't need to do far look back c.EVM[0].BlockBackfillDepth = ptr[uint32](0) // backfill will trigger sync on startup c.EVM[0].MinIncomingConfirmations = ptr[uint32](1) // disable reorg protection for this test c.EVM[0].HeadTracker.MaxBufferSize = ptr[uint32](100) // helps prevent missed heads })` $DIR/core/services/keeper/integration_test.go: `.MustNewDuration(24 * time.Hour)` $DIR/core/services/keeper/integration_test.go: `.NewORM(db, logger.TestLogger(t))` $DIR/core/services/keeper/integration_test.go: `.TestLogger(t)` $DIR/core/services/keeper/integration_test.go: `.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, backend.Backend(), nodeKey)` $DIR/core/services/keeper/integration_test.go: `.Backend()` $DIR/core/services/keeper/integration_test.go: `.EIP55AddressFromAddress(regAddr)` $DIR/core/services/keeper/integration_test.go: `.MustInsertKeeperJob(t, db, korm, nodeAddressEIP55, regAddrEIP55)` $DIR/core/services/keeper/integration_test.go: `.JobSpawner()` $DIR/core/services/keeper/integration_test.go: `.StartService(ctx, job)` $DIR/core/services/keeper/integration_test.go: `.ReceivedBytes(nil)` $DIR/core/services/keeper/integration_test.go: `.Eventually(receivedBytes, 20*time.Second, cltest.DBPollingInterval)` $DIR/core/services/keeper/integration_test.go: `.Should(gomega.Equal(payload1))` $DIR/core/services/keeper/integration_test.go: `.Equal(payload1)` $DIR/core/services/keeper/integration_test.go: `.PerformUpkeep(nelly, upkeepID, []byte{})` $DIR/core/services/keeper/integration_test.go: `.SetBytesToSend(carrol, payload2)` $DIR/core/services/keeper/integration_test.go: `.SetShouldPerformUpkeep(carrol, true)` $DIR/core/services/keeper/integration_test.go: `.Eventually(receivedBytes, 20*time.Second, cltest.DBPollingInterval)` $DIR/core/services/keeper/integration_test.go: `.Should(gomega.Equal(payload2))` $DIR/core/services/keeper/integration_test.go: `.Equal(payload2)` $DIR/core/services/keeper/integration_test.go: `.CancelUpkeep(carrol, upkeepID)` $DIR/core/services/keeper/integration_test.go: `.Commit()` $DIR/core/services/keeper/integration_test.go: `.WaitForCount(t, app.GetDB(), "upkeep_registrations", 0)` $DIR/core/services/keeper/integration_test.go: `.GetDB()` $DIR/core/services/keeper/integration_test.go: `.RegisterUpkeep(steve, upkeepAddr, 2_500_000, carrol.From, []byte{})` $DIR/core/services/keeper/integration_test.go: `.Commit()` $DIR/core/services/keeper/integration_test.go: `.SetBytesToSend(carrol, payload3)` $DIR/core/services/keeper/integration_test.go: `.SetShouldPerformUpkeep(carrol, true)` $DIR/core/services/keeper/integration_test.go: `.AddFunds(carrol, upkeepID, tenEth)` $DIR/core/services/keeper/integration_test.go: `.Commit()` $DIR/core/services/keeper/integration_test.go: `.Eventually(receivedBytes, 20*time.Second, cltest.DBPollingInterval)` $DIR/core/services/keeper/integration_test.go: `.Should(gomega.Equal(payload3))` $DIR/core/services/keeper/integration_test.go: `.Equal(payload3)` $DIR/core/services/keeper/integration_test.go: `.SetKeepers(steve, []common.Address{nick.From, nelly.From}, []common.Address{nick.From, nelly.From})` $DIR/core/services/keeper/integration_test.go: `.AssertRecordEventually(t, app.GetDB(), ®istry, fmt.Sprintf("SELECT * FROM keeper_registries WHERE id = %d", registry.ID), func() bool { return registry.KeeperIndex == -1 })` $DIR/core/services/keeper/integration_test.go: `.GetDB()` $DIR/core/services/keeper/integration_test.go: `.Sprintf("SELECT * FROM keeper_registries WHERE id = %d", registry.ID)` $DIR/core/services/keeper/integration_test.go: `.PipelineORM()` $DIR/core/services/keeper/integration_test.go: `.GetAllRuns(ctx)` $DIR/core/services/keeper/integration_test.go: `.NewPipelineRunResource(runs[0], logger.TestLogger(t))` $DIR/core/services/keeper/integration_test.go: `.TestLogger(t)` $DIR/core/services/keeper/integration_test.go: `.Context(t)` $DIR/core/services/keeper/integration_test.go: `.NewWithT(t)` $DIR/core/services/keeper/integration_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/keeper/integration_test.go: `.EIP55AddressFromAddress(nodeAddress)` $DIR/core/services/keeper/integration_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/keeper/integration_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/keeper/integration_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/keeper/integration_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/keeper/integration_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/keeper/integration_test.go: `.Ether(1000)` $DIR/core/services/keeper/integration_test.go: `.ToInt()` $DIR/core/services/keeper/integration_test.go: `.Ether(1000)` $DIR/core/services/keeper/integration_test.go: `.ToInt()` $DIR/core/services/keeper/integration_test.go: `.Ether(1000)` $DIR/core/services/keeper/integration_test.go: `.ToInt()` $DIR/core/services/keeper/integration_test.go: `.Ether(1000)` $DIR/core/services/keeper/integration_test.go: `.ToInt()` $DIR/core/services/keeper/integration_test.go: `.Ether(1000)` $DIR/core/services/keeper/integration_test.go: `.ToInt()` $DIR/core/services/keeper/integration_test.go: `.Ether(1000)` $DIR/core/services/keeper/integration_test.go: `.ToInt()` $DIR/core/services/keeper/integration_test.go: `.NewSimulatedBackend(t, genesisData, gasLimit)` $DIR/core/services/keeper/integration_test.go: `.NewSimulatedBackendClient(t, b, testutils.SimulatedChainID)` $DIR/core/services/keeper/integration_test.go: `.Mine(backend.Backend(), 1*time.Second)` $DIR/core/services/keeper/integration_test.go: `.Backend()` $DIR/core/services/keeper/integration_test.go: `.DeployLinkToken(sergey, backend)` $DIR/core/services/keeper/integration_test.go: `.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(60000000000))` $DIR/core/services/keeper/integration_test.go: `.NewInt(60000000000)` $DIR/core/services/keeper/integration_test.go: `.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(20000000000000000))` $DIR/core/services/keeper/integration_test.go: `.NewInt(20000000000000000)` $DIR/core/services/keeper/integration_test.go: `.DeployAuthorizedForwarder(sergey, backend, linkAddr, sergey.From, steve.From, []byte{})` $DIR/core/services/keeper/integration_test.go: `.SetAuthorizedSenders(sergey, []common.Address{nodeAddress})` $DIR/core/services/keeper/integration_test.go: `.DeployBasicUpkeepContract(carrol, backend)` $DIR/core/services/keeper/integration_test.go: `.Transfer(sergey, carrol.From, oneHunEth)` $DIR/core/services/keeper/integration_test.go: `.Approve(carrol, regAddr, oneHunEth)` $DIR/core/services/keeper/integration_test.go: `.SetKeepers(steve, []common.Address{fwdrAddress, nelly.From}, []common.Address{nodeAddress, nelly.From})` $DIR/core/services/keeper/integration_test.go: `.RegisterUpkeep(steve, upkeepAddr, 2_500_000, carrol.From, []byte{})` $DIR/core/services/keeper/integration_test.go: `.Commit()` $DIR/core/services/keeper/integration_test.go: `.SetBytesToSend(carrol, payload1)` $DIR/core/services/keeper/integration_test.go: `.SetShouldPerformUpkeep(carrol, true)` $DIR/core/services/keeper/integration_test.go: `.AddFunds(carrol, upkeepID, tenEth)` $DIR/core/services/keeper/integration_test.go: `.Commit()` $DIR/core/services/keeper/integration_test.go: `.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Feature.LogPoller = ptr(true) c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(true) c.Keeper.MaxGracePeriod = ptr[int64](0) // avoid waiting to re-submit for upkeeps c.Keeper.Registry.SyncInterval = commonconfig.MustNewDuration(24 * time.Hour) // disable full sync ticker for test c.Keeper.TurnLookBack = ptr[int64](0) // testing doesn't need to do far look back c.EVM[0].BlockBackfillDepth = ptr[uint32](0) // backfill will trigger sync on startup c.EVM[0].MinIncomingConfirmations = ptr[uint32](1) // disable reorg protection for this test c.EVM[0].HeadTracker.MaxBufferSize = ptr[uint32](100) // helps prevent missed heads c.EVM[0].Transactions.ForwardersEnabled = ptr(true) // Enable Operator Forwarder flow c.EVM[0].ChainID = (*ubig.Big)(testutils.SimulatedChainID) })` $DIR/core/services/keeper/integration_test.go: `.MustNewDuration(24 * time.Hour)` $DIR/core/services/keeper/integration_test.go: `.NewORM(db, logger.TestLogger(t))` $DIR/core/services/keeper/integration_test.go: `.TestLogger(t)` $DIR/core/services/keeper/integration_test.go: `.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, backend.Backend(), nodeKey)` $DIR/core/services/keeper/integration_test.go: `.Backend()` $DIR/core/services/keeper/integration_test.go: `.NewORM(db)` $DIR/core/services/keeper/integration_test.go: `.Big(*backend.ConfiguredChainID())` $DIR/core/services/keeper/integration_test.go: `.ConfiguredChainID()` $DIR/core/services/keeper/integration_test.go: `.CreateForwarder(ctx, fwdrAddress, chainID)` $DIR/core/services/keeper/integration_test.go: `.GetRelayers()` $DIR/core/services/keeper/integration_test.go: `.LegacyEVMChains()` $DIR/core/services/keeper/integration_test.go: `.Slice()` $DIR/core/services/keeper/integration_test.go: `.TxManager()` $DIR/core/services/keeper/integration_test.go: `.GetForwarderForEOA(ctx, nodeAddress)` $DIR/core/services/keeper/integration_test.go: `.EIP55AddressFromAddress(regAddr)` $DIR/core/services/keeper/integration_test.go: `.JobORM()` $DIR/core/services/keeper/integration_test.go: `.CreateJob(testutils.Context(t), &jb)` $DIR/core/services/keeper/integration_test.go: `.Context(t)` $DIR/core/services/keeper/integration_test.go: `.EIP55AddressFromAddress(nelly.From)` $DIR/core/services/keeper/integration_test.go: `.UpsertRegistry(ctx, ®istry)` $DIR/core/services/keeper/integration_test.go: `.GetUpkeep(&callOpts, upkeepID)` $DIR/core/services/keeper/integration_test.go: `.JobSpawner()` $DIR/core/services/keeper/integration_test.go: `.StartService(ctx, jb)` $DIR/core/services/keeper/integration_test.go: `.ReceivedBytes(nil)` $DIR/core/services/keeper/integration_test.go: `.Eventually(receivedBytes, 20*time.Second, cltest.DBPollingInterval)` $DIR/core/services/keeper/integration_test.go: `.Should(gomega.Equal(payload1))` $DIR/core/services/keeper/integration_test.go: `.Equal(payload1)` $DIR/core/services/keeper/integration_test.go: `.Eventually(lastKeeper, 20*time.Second, cltest.DBPollingInterval)` $DIR/core/services/keeper/integration_test.go: `.Should(gomega.Equal(fwdrAddress))` $DIR/core/services/keeper/integration_test.go: `.Equal(fwdrAddress)` $DIR/core/services/keeper/integration_test.go: `.Context(t)` $DIR/core/services/keeper/integration_test.go: `.NewWithT(t)` $DIR/core/services/keeper/integration_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/keeper/integration_test.go: `.EIP55AddressFromAddress(nodeAddress)` $DIR/core/services/keeper/integration_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/keeper/integration_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/keeper/integration_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/keeper/integration_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/keeper/integration_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/keeper/integration_test.go: `.Ether(1000)` $DIR/core/services/keeper/integration_test.go: `.ToInt()` $DIR/core/services/keeper/integration_test.go: `.Ether(1000)` $DIR/core/services/keeper/integration_test.go: `.ToInt()` $DIR/core/services/keeper/integration_test.go: `.Ether(1000)` $DIR/core/services/keeper/integration_test.go: `.ToInt()` $DIR/core/services/keeper/integration_test.go: `.Ether(1000)` $DIR/core/services/keeper/integration_test.go: `.ToInt()` $DIR/core/services/keeper/integration_test.go: `.Ether(1000)` $DIR/core/services/keeper/integration_test.go: `.ToInt()` $DIR/core/services/keeper/integration_test.go: `.Ether(1000)` $DIR/core/services/keeper/integration_test.go: `.ToInt()` $DIR/core/services/keeper/integration_test.go: `.NewSimulatedBackend(t, genesisData, gasLimit)` $DIR/core/services/keeper/integration_test.go: `.NewSimulatedBackendClient(t, b, testutils.SimulatedChainID)` $DIR/core/services/keeper/integration_test.go: `.Mine(backend.Backend(), 1*time.Second)` $DIR/core/services/keeper/integration_test.go: `.Backend()` $DIR/core/services/keeper/integration_test.go: `.DeployLinkToken(sergey, backend)` $DIR/core/services/keeper/integration_test.go: `.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(60000000000))` $DIR/core/services/keeper/integration_test.go: `.NewInt(60000000000)` $DIR/core/services/keeper/integration_test.go: `.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(20000000000000000))` $DIR/core/services/keeper/integration_test.go: `.NewInt(20000000000000000)` $DIR/core/services/keeper/integration_test.go: `.DeployBasicUpkeepContract(carrol, backend)` $DIR/core/services/keeper/integration_test.go: `.Transfer(sergey, carrol.From, oneHunEth)` $DIR/core/services/keeper/integration_test.go: `.Approve(carrol, regAddr, oneHunEth)` $DIR/core/services/keeper/integration_test.go: `.SetKeepers(steve, []common.Address{nodeAddress, nelly.From}, []common.Address{nodeAddress, nelly.From})` $DIR/core/services/keeper/integration_test.go: `.RegisterUpkeep(steve, upkeepAddr, 2_500_000, carrol.From, []byte{})` $DIR/core/services/keeper/integration_test.go: `.Commit()` $DIR/core/services/keeper/integration_test.go: `.AddFunds(carrol, upkeepID, tenEth)` $DIR/core/services/keeper/integration_test.go: `.Commit()` $DIR/core/services/keeper/integration_test.go: `.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Keeper.MaxGracePeriod = ptr[int64](0) // avoid waiting to re-submit for upkeeps c.Keeper.Registry.SyncInterval = commonconfig.MustNewDuration(24 * time.Hour) // disable full sync ticker for test c.Keeper.Registry.MaxPerformDataSize = ptr(uint32(maxPerformDataSize)) // set the max perform data size c.Keeper.TurnLookBack = ptr[int64](0) // testing doesn't need to do far look back c.EVM[0].BlockBackfillDepth = ptr[uint32](0) // backfill will trigger sync on startup c.EVM[0].MinIncomingConfirmations = ptr[uint32](1) // disable reorg protection for this test c.EVM[0].HeadTracker.MaxBufferSize = ptr[uint32](100) // helps prevent missed heads })` $DIR/core/services/keeper/integration_test.go: `.MustNewDuration(24 * time.Hour)` $DIR/core/services/keeper/integration_test.go: `.NewORM(db, logger.TestLogger(t))` $DIR/core/services/keeper/integration_test.go: `.TestLogger(t)` $DIR/core/services/keeper/integration_test.go: `.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, backend.Backend(), nodeKey)` $DIR/core/services/keeper/integration_test.go: `.Backend()` $DIR/core/services/keeper/integration_test.go: `.EIP55AddressFromAddress(regAddr)` $DIR/core/services/keeper/integration_test.go: `.MustInsertKeeperJob(t, db, korm, nodeAddressEIP55, regAddrEIP55)` $DIR/core/services/keeper/integration_test.go: `.JobSpawner()` $DIR/core/services/keeper/integration_test.go: `.StartService(ctx, job)` $DIR/core/services/keeper/integration_test.go: `.ReceivedBytes(nil)` $DIR/core/services/keeper/integration_test.go: `.SetBytesToSend(carrol, hugePayload)` $DIR/core/services/keeper/integration_test.go: `.SetShouldPerformUpkeep(carrol, true)` $DIR/core/services/keeper/integration_test.go: `.Consistently(receivedBytes, 20*time.Second, cltest.DBPollingInterval)` $DIR/core/services/keeper/integration_test.go: `.Should(gomega.Equal([]byte{}))` $DIR/core/services/keeper/integration_test.go: `.Equal([]byte{})` $DIR/core/services/keeper/integration_test.go: `.SetBytesToSend(carrol, smallPayload)` $DIR/core/services/keeper/integration_test.go: `.Eventually(receivedBytes, 20*time.Second, cltest.DBPollingInterval)` $DIR/core/services/keeper/integration_test.go: `.Should(gomega.Equal(smallPayload))` $DIR/core/services/keeper/integration_test.go: `.Equal(smallPayload)` $DIR/core/services/keeper/models_test.go: `t.Run(test.name, func(t *testing.T) { o, ok := new(big.Int).SetString(test.id, 10) if !ok { t.Errorf("%s failed to parse test integer", test.name) return } result := NewUpkeepIdentifier(ubig.New(o)).String() require.Equal(t, test.hex, result) })` $DIR/core/services/keeper/models_test.go: `.Run(test.name, func(t *testing.T) { o, ok := new(big.Int).SetString(test.id, 10) if !ok { t.Errorf("%s failed to parse test integer", test.name) return } result := NewUpkeepIdentifier(ubig.New(o)).String() require.Equal(t, test.hex, result) })` $DIR/core/services/keeper/models_test.go: `.SetString(test.id, 10)` $DIR/core/services/keeper/models_test.go: `.New(o)` $DIR/core/services/keeper/models_test.go: `.String()` $DIR/core/services/keeper/orm_test.go: `cltest.MustInsertKeeperRegistry(t, db, orm, ethKeyStore, 0, 1, 20)` $DIR/core/services/keeper/orm_test.go: `cltest.MustInsertKeeperRegistry(t, db, orm, ethKeyStore, 0, 1, 20)` $DIR/core/services/keeper/orm_test.go: `cltest.MustInsertKeeperRegistry(t, db, orm, ethKeyStore, 0, 1, 20)` $DIR/core/services/keeper/orm_test.go: `cltest.AssertCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/orm_test.go: `upkeep.ExecuteGas = 20_000` $DIR/core/services/keeper/orm_test.go: `upkeep.CheckData = common.Hex2Bytes("8888")` $DIR/core/services/keeper/orm_test.go: `upkeep.LastRunBlockHeight = 2` $DIR/core/services/keeper/orm_test.go: `cltest.AssertCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/orm_test.go: `err = db.Get(&upkeepFromDB, `SELECT * FROM upkeep_registrations ORDER BY id LIMIT 1`)` $DIR/core/services/keeper/orm_test.go: `upkeepIDs = append(upkeepIDs, *upkeep.UpkeepID)` $DIR/core/services/keeper/orm_test.go: `cltest.AssertCount(t, db, "upkeep_registrations", 3)` $DIR/core/services/keeper/orm_test.go: `cltest.AssertCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/orm_test.go: `err = db.Get(&remainingUpkeep, `SELECT * FROM upkeep_registrations ORDER BY id LIMIT 1`)` $DIR/core/services/keeper/orm_test.go: `ordered[i] = int64(i)` $DIR/core/services/keeper/orm_test.go: `cltest.AssertCount(t, db, "upkeep_registrations", 100)` $DIR/core/services/keeper/orm_test.go: `shuffled[i] = eligibleUpkeeps[i].UpkeepID` $DIR/core/services/keeper/orm_test.go: `cltest.MustInsertUpkeepForRegistry(t, db, registry)` $DIR/core/services/keeper/orm_test.go: `cltest.AssertCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/orm_test.go: `cltest.AssertCount(t, db, "upkeep_registrations", 100)` $DIR/core/services/keeper/orm_test.go: `cltest.MustInsertUpkeepForRegistry(t, db, registry)` $DIR/core/services/keeper/orm_test.go: `cltest.AssertCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/orm_test.go: `cltest.AssertCount(t, db, "upkeep_registrations", 1000)` $DIR/core/services/keeper/orm_test.go: `sort.Slice(list1, func(i, j int) bool { return list1[i].UpkeepID.Cmp(list1[j].UpkeepID) == -1 })` $DIR/core/services/keeper/orm_test.go: `sort.Slice(list2, func(i, j int) bool { return list2[i].UpkeepID.Cmp(list2[j].UpkeepID) == -1 })` $DIR/core/services/keeper/orm_test.go: `sort.Slice(list3, func(i, j int) bool { return list3[i].UpkeepID.Cmp(list3[j].UpkeepID) == -1 })` $DIR/core/services/keeper/orm_test.go: `sort.Slice(list4, func(i, j int) bool { return list4[i].UpkeepID.Cmp(list4[j].UpkeepID) == -1 })` $DIR/core/services/keeper/orm_test.go: `cltest.MustInsertUpkeepForRegistry(t, db, registry)` $DIR/core/services/keeper/orm_test.go: `cltest.AssertCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/orm_test.go: `cltest.AssertCount(t, db, "upkeep_registrations", 100)` $DIR/core/services/keeper/orm_test.go: `cltest.MustInsertUpkeepForRegistry(t, db, registry)` $DIR/core/services/keeper/orm_test.go: `cltest.AssertCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/orm_test.go: `cltest.AssertCount(t, db, "upkeep_registrations", 100)` $DIR/core/services/keeper/orm_test.go: `cltest.MustInsertUpkeepForRegistry(t, db, registry)` $DIR/core/services/keeper/orm_test.go: `cltest.AssertCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/orm_test.go: `cltest.AssertCount(t, db, "upkeep_registrations", 100)` $DIR/core/services/keeper/orm_test.go: `cltest.MustInsertUpkeepForRegistry(t, db, registry1)` $DIR/core/services/keeper/orm_test.go: `cltest.MustInsertUpkeepForRegistry(t, db, registry2)` $DIR/core/services/keeper/orm_test.go: `cltest.AssertCount(t, db, "keeper_registries", 2)` $DIR/core/services/keeper/orm_test.go: `cltest.AssertCount(t, db, "upkeep_registrations", 2)` $DIR/core/services/keeper/orm_test.go: `err = orm.UpsertUpkeep(ctx, &upkeep)` $DIR/core/services/keeper/orm_test.go: `upkeep = newUpkeep(registry, 8)` $DIR/core/services/keeper/orm_test.go: `err = orm.UpsertUpkeep(ctx, &upkeep)` $DIR/core/services/keeper/orm_test.go: `upkeepIDs, err = orm.AllUpkeepIDsForRegistry(ctx, registry.ID)` $DIR/core/services/keeper/orm_test.go: `registry.NumKeepers = 2` $DIR/core/services/keeper/orm_test.go: `registry.KeeperIndexMap = map[types.EIP55Address]int32{ registry.FromAddress: 0, types.EIP55AddressFromAddress(evmutils.ZeroAddress): 1, }` $DIR/core/services/keeper/orm_test.go: `assertLastRunHeight(t, db, upkeep, 100, 0)` $DIR/core/services/keeper/orm_test.go: `rowsAffected, err = orm.SetLastRunInfoForUpkeepOnJob(ctx, j.ID, upkeep.UpkeepID, 0, registry.FromAddress)` $DIR/core/services/keeper/orm_test.go: `assertLastRunHeight(t, db, upkeep, 100, 0)` $DIR/core/services/keeper/orm_test.go: `rowsAffected, err = orm.SetLastRunInfoForUpkeepOnJob(ctx, j.ID, upkeep.UpkeepID, 100, types.EIP55AddressFromAddress(evmutils.ZeroAddress))` $DIR/core/services/keeper/orm_test.go: `assertLastRunHeight(t, db, upkeep, 100, 1)` $DIR/core/services/keeper/orm_test.go: `rowsAffected, err = orm.SetLastRunInfoForUpkeepOnJob(ctx, j.ID, upkeep.UpkeepID, 101, registry.FromAddress)` $DIR/core/services/keeper/orm_test.go: `t.Run(test.name, func(tt *testing.T) { var test = test var result string err := db.Get(&result, sql, inputBytes, test.inputLength) if test.expectedError { assert.Error(t, err) return } assert.NoError(t, err) assert.Equal(t, test.expectedOutput, result) })` $DIR/core/services/keeper/orm_test.go: `t.Run(test.name, func(tt *testing.T) { var test = test var result string err := db.Get(&result, sql, test.input.String()) if test.errorExpected { require.Error(t, err) return } require.NoError(t, err) expected := utils.LeftPadBitString(fmt.Sprintf("%b", test.input), 256) require.Equal(t, expected, result) })` $DIR/core/services/keeper/orm_test.go: `.Context(t)` $DIR/core/services/keeper/orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/keeper/orm_test.go: `.Eth()` $DIR/core/services/keeper/orm_test.go: `.MustInsertKeeperRegistry(t, db, orm, ethKeyStore, 0, 1, 20)` $DIR/core/services/keeper/orm_test.go: `.MustInsertKeeperRegistry(t, db, orm, ethKeyStore, 0, 1, 20)` $DIR/core/services/keeper/orm_test.go: `.Registries(ctx)` $DIR/core/services/keeper/orm_test.go: `.Context(t)` $DIR/core/services/keeper/orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/keeper/orm_test.go: `.Eth()` $DIR/core/services/keeper/orm_test.go: `.MustInsertKeeperRegistry(t, db, orm, ethKeyStore, 0, 1, 20)` $DIR/core/services/keeper/orm_test.go: `.MustInsertKeeperRegistry(t, db, orm, ethKeyStore, 0, 1, 20)` $DIR/core/services/keeper/orm_test.go: `.RegistryByContractAddress(ctx, registry.ContractAddress)` $DIR/core/services/keeper/orm_test.go: `.Context(t)` $DIR/core/services/keeper/orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/keeper/orm_test.go: `.Eth()` $DIR/core/services/keeper/orm_test.go: `.MustInsertKeeperRegistry(t, db, orm, ethKeyStore, 0, 1, 20)` $DIR/core/services/keeper/orm_test.go: `.NewI(0)` $DIR/core/services/keeper/orm_test.go: `.AssertCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/orm_test.go: `.Hex2Bytes("8888")` $DIR/core/services/keeper/orm_test.go: `.UpsertUpkeep(ctx, &upkeep)` $DIR/core/services/keeper/orm_test.go: `.AssertCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/orm_test.go: `.Get(&upkeepFromDB, `SELECT * FROM upkeep_registrations ORDER BY id LIMIT 1`)` $DIR/core/services/keeper/orm_test.go: `.Context(t)` $DIR/core/services/keeper/orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/keeper/orm_test.go: `.Eth()` $DIR/core/services/keeper/orm_test.go: `.MustInsertKeeperRegistry(t, db, orm, ethKeyStore, 0, 1, 20)` $DIR/core/services/keeper/orm_test.go: `.MustInsertUpkeepForRegistry(t, db, registry)` $DIR/core/services/keeper/orm_test.go: `.MustInsertUpkeepForRegistry(t, db, registry)` $DIR/core/services/keeper/orm_test.go: `.AssertCount(t, db, "upkeep_registrations", 3)` $DIR/core/services/keeper/orm_test.go: `.BatchDeleteUpkeepsForJob(ctx, job.ID, upkeepIDs)` $DIR/core/services/keeper/orm_test.go: `.AssertCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/orm_test.go: `.Get(&remainingUpkeep, `SELECT * FROM upkeep_registrations ORDER BY id LIMIT 1`)` $DIR/core/services/keeper/orm_test.go: `.Context(t)` $DIR/core/services/keeper/orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/keeper/orm_test.go: `.Eth()` $DIR/core/services/keeper/orm_test.go: `.MustInsertKeeperRegistry(t, db, orm, ethKeyStore, 0, 1, 20)` $DIR/core/services/keeper/orm_test.go: `.UpsertUpkeep(ctx, &k)` $DIR/core/services/keeper/orm_test.go: `.AssertCount(t, db, "upkeep_registrations", 100)` $DIR/core/services/keeper/orm_test.go: `.EligibleUpkeepsForRegistry(ctx, registry.ContractAddress, blockheight, gracePeriod, fmt.Sprintf("%b", evmutils.NewHash().Big()))` $DIR/core/services/keeper/orm_test.go: `.Sprintf("%b", evmutils.NewHash().Big())` $DIR/core/services/keeper/orm_test.go: `.NewHash()` $DIR/core/services/keeper/orm_test.go: `.Big()` $DIR/core/services/keeper/orm_test.go: `.Context(t)` $DIR/core/services/keeper/orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/keeper/orm_test.go: `.Eth()` $DIR/core/services/keeper/orm_test.go: `.MustInsertKeeperRegistry(t, db, orm, ethKeyStore, 0, 2, 20)` $DIR/core/services/keeper/orm_test.go: `.MustInsertUpkeepForRegistry(t, db, registry)` $DIR/core/services/keeper/orm_test.go: `.AssertCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/orm_test.go: `.AssertCount(t, db, "upkeep_registrations", 100)` $DIR/core/services/keeper/orm_test.go: `.EligibleUpkeepsForRegistry(ctx, registry.ContractAddress, 21, 100, fmt.Sprintf("%b", evmutils.NewHash().Big()))` $DIR/core/services/keeper/orm_test.go: `.Sprintf("%b", evmutils.NewHash().Big())` $DIR/core/services/keeper/orm_test.go: `.NewHash()` $DIR/core/services/keeper/orm_test.go: `.Big()` $DIR/core/services/keeper/orm_test.go: `.EligibleUpkeepsForRegistry(ctx, registry.ContractAddress, 121, 100, fmt.Sprintf("%b", evmutils.NewHash().Big()))` $DIR/core/services/keeper/orm_test.go: `.Sprintf("%b", evmutils.NewHash().Big())` $DIR/core/services/keeper/orm_test.go: `.NewHash()` $DIR/core/services/keeper/orm_test.go: `.Big()` $DIR/core/services/keeper/orm_test.go: `.Context(t)` $DIR/core/services/keeper/orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/keeper/orm_test.go: `.Eth()` $DIR/core/services/keeper/orm_test.go: `.MustInsertKeeperRegistry(t, db, orm, ethKeyStore, 0, 3, 10)` $DIR/core/services/keeper/orm_test.go: `.MustInsertUpkeepForRegistry(t, db, registry)` $DIR/core/services/keeper/orm_test.go: `.AssertCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/orm_test.go: `.AssertCount(t, db, "upkeep_registrations", 1000)` $DIR/core/services/keeper/orm_test.go: `.EligibleUpkeepsForRegistry(ctx, registry.ContractAddress, 20, 100, fmt.Sprintf("%b", evmutils.NewHash().Big()))` $DIR/core/services/keeper/orm_test.go: `.Sprintf("%b", evmutils.NewHash().Big())` $DIR/core/services/keeper/orm_test.go: `.NewHash()` $DIR/core/services/keeper/orm_test.go: `.Big()` $DIR/core/services/keeper/orm_test.go: `.EligibleUpkeepsForRegistry(ctx, registry.ContractAddress, 31, 100, fmt.Sprintf("%b", evmutils.NewHash().Big()))` $DIR/core/services/keeper/orm_test.go: `.Sprintf("%b", evmutils.NewHash().Big())` $DIR/core/services/keeper/orm_test.go: `.NewHash()` $DIR/core/services/keeper/orm_test.go: `.Big()` $DIR/core/services/keeper/orm_test.go: `.EligibleUpkeepsForRegistry(ctx, registry.ContractAddress, 42, 100, fmt.Sprintf("%b", evmutils.NewHash().Big()))` $DIR/core/services/keeper/orm_test.go: `.Sprintf("%b", evmutils.NewHash().Big())` $DIR/core/services/keeper/orm_test.go: `.NewHash()` $DIR/core/services/keeper/orm_test.go: `.Big()` $DIR/core/services/keeper/orm_test.go: `.EligibleUpkeepsForRegistry(ctx, registry.ContractAddress, 53, 100, fmt.Sprintf("%b", evmutils.NewHash().Big()))` $DIR/core/services/keeper/orm_test.go: `.Sprintf("%b", evmutils.NewHash().Big())` $DIR/core/services/keeper/orm_test.go: `.NewHash()` $DIR/core/services/keeper/orm_test.go: `.Big()` $DIR/core/services/keeper/orm_test.go: `.Slice(list1, func(i, j int) bool { return list1[i].UpkeepID.Cmp(list1[j].UpkeepID) == -1 })` $DIR/core/services/keeper/orm_test.go: `.UpkeepID.Cmp(list1[j].UpkeepID)` $DIR/core/services/keeper/orm_test.go: `.Slice(list2, func(i, j int) bool { return list2[i].UpkeepID.Cmp(list2[j].UpkeepID) == -1 })` $DIR/core/services/keeper/orm_test.go: `.UpkeepID.Cmp(list2[j].UpkeepID)` $DIR/core/services/keeper/orm_test.go: `.Slice(list3, func(i, j int) bool { return list3[i].UpkeepID.Cmp(list3[j].UpkeepID) == -1 })` $DIR/core/services/keeper/orm_test.go: `.UpkeepID.Cmp(list3[j].UpkeepID)` $DIR/core/services/keeper/orm_test.go: `.Slice(list4, func(i, j int) bool { return list4[i].UpkeepID.Cmp(list4[j].UpkeepID) == -1 })` $DIR/core/services/keeper/orm_test.go: `.UpkeepID.Cmp(list4[j].UpkeepID)` $DIR/core/services/keeper/orm_test.go: `.Context(t)` $DIR/core/services/keeper/orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/keeper/orm_test.go: `.Eth()` $DIR/core/services/keeper/orm_test.go: `.MustInsertKeeperRegistry(t, db, orm, ethKeyStore, 0, 2, 20)` $DIR/core/services/keeper/orm_test.go: `.MustInsertUpkeepForRegistry(t, db, registry)` $DIR/core/services/keeper/orm_test.go: `.AssertCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/orm_test.go: `.AssertCount(t, db, "upkeep_registrations", 100)` $DIR/core/services/keeper/orm_test.go: `.EligibleUpkeepsForRegistry(ctx, registry.ContractAddress, 21, 100, fmt.Sprintf("%b", evmutils.NewHash().Big()))` $DIR/core/services/keeper/orm_test.go: `.Sprintf("%b", evmutils.NewHash().Big())` $DIR/core/services/keeper/orm_test.go: `.NewHash()` $DIR/core/services/keeper/orm_test.go: `.Big()` $DIR/core/services/keeper/orm_test.go: `.Context(t)` $DIR/core/services/keeper/orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/keeper/orm_test.go: `.Eth()` $DIR/core/services/keeper/orm_test.go: `.MustInsertKeeperRegistry(t, db, orm, ethKeyStore, 1, 2, 20)` $DIR/core/services/keeper/orm_test.go: `.MustInsertUpkeepForRegistry(t, db, registry)` $DIR/core/services/keeper/orm_test.go: `.AssertCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/orm_test.go: `.AssertCount(t, db, "upkeep_registrations", 100)` $DIR/core/services/keeper/orm_test.go: `.Sprintf("%b", evmutils.NewHash().Big())` $DIR/core/services/keeper/orm_test.go: `.NewHash()` $DIR/core/services/keeper/orm_test.go: `.Big()` $DIR/core/services/keeper/orm_test.go: `.EligibleUpkeepsForRegistry(ctx, registry.ContractAddress, 21, 100, binaryHash)` $DIR/core/services/keeper/orm_test.go: `.EligibleUpkeepsForRegistry(ctx, registry.ContractAddress, 21, 100, binaryHash)` $DIR/core/services/keeper/orm_test.go: `.Context(t)` $DIR/core/services/keeper/orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/keeper/orm_test.go: `.Eth()` $DIR/core/services/keeper/orm_test.go: `.MustInsertKeeperRegistry(t, db, orm, ethKeyStore, 0, 2, 20)` $DIR/core/services/keeper/orm_test.go: `.MustInsertUpkeepForRegistry(t, db, registry)` $DIR/core/services/keeper/orm_test.go: `.AssertCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/orm_test.go: `.AssertCount(t, db, "upkeep_registrations", 100)` $DIR/core/services/keeper/orm_test.go: `.Sprintf("%b", evmutils.NewHash().Big())` $DIR/core/services/keeper/orm_test.go: `.NewHash()` $DIR/core/services/keeper/orm_test.go: `.Big()` $DIR/core/services/keeper/orm_test.go: `.EligibleUpkeepsForRegistry(ctx, registry.ContractAddress, 21, 100, binaryHash)` $DIR/core/services/keeper/orm_test.go: `.Context(t)` $DIR/core/services/keeper/orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/keeper/orm_test.go: `.Eth()` $DIR/core/services/keeper/orm_test.go: `.MustInsertKeeperRegistry(t, db, orm, ethKeyStore, 0, 1, 20)` $DIR/core/services/keeper/orm_test.go: `.MustInsertKeeperRegistry(t, db, orm, ethKeyStore, 0, 1, 20)` $DIR/core/services/keeper/orm_test.go: `.MustInsertUpkeepForRegistry(t, db, registry1)` $DIR/core/services/keeper/orm_test.go: `.MustInsertUpkeepForRegistry(t, db, registry2)` $DIR/core/services/keeper/orm_test.go: `.AssertCount(t, db, "keeper_registries", 2)` $DIR/core/services/keeper/orm_test.go: `.AssertCount(t, db, "upkeep_registrations", 2)` $DIR/core/services/keeper/orm_test.go: `.Sprintf("%b", evmutils.NewHash().Big())` $DIR/core/services/keeper/orm_test.go: `.NewHash()` $DIR/core/services/keeper/orm_test.go: `.Big()` $DIR/core/services/keeper/orm_test.go: `.EligibleUpkeepsForRegistry(ctx, registry1.ContractAddress, 20, 100, binaryHash)` $DIR/core/services/keeper/orm_test.go: `.EligibleUpkeepsForRegistry(ctx, registry2.ContractAddress, 20, 100, binaryHash)` $DIR/core/services/keeper/orm_test.go: `.Context(t)` $DIR/core/services/keeper/orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/keeper/orm_test.go: `.Eth()` $DIR/core/services/keeper/orm_test.go: `.MustInsertKeeperRegistry(t, db, orm, ethKeyStore, 0, 1, 20)` $DIR/core/services/keeper/orm_test.go: `.AllUpkeepIDsForRegistry(ctx, registry.ID)` $DIR/core/services/keeper/orm_test.go: `.UpsertUpkeep(ctx, &upkeep)` $DIR/core/services/keeper/orm_test.go: `.UpsertUpkeep(ctx, &upkeep)` $DIR/core/services/keeper/orm_test.go: `.AllUpkeepIDsForRegistry(ctx, registry.ID)` $DIR/core/services/keeper/orm_test.go: `.New(big.NewInt(8))` $DIR/core/services/keeper/orm_test.go: `.NewInt(8)` $DIR/core/services/keeper/orm_test.go: `.Context(t)` $DIR/core/services/keeper/orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/keeper/orm_test.go: `.Eth()` $DIR/core/services/keeper/orm_test.go: `.MustInsertKeeperRegistry(t, db, orm, ethKeyStore, 0, 1, 20)` $DIR/core/services/keeper/orm_test.go: `.MustInsertUpkeepForRegistry(t, db, registry)` $DIR/core/services/keeper/orm_test.go: `.Get(&upkeep, `SELECT * FROM upkeep_registrations WHERE upkeep_id = $1`, upkeep.UpkeepID)` $DIR/core/services/keeper/orm_test.go: `.Context(t)` $DIR/core/services/keeper/orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/keeper/orm_test.go: `.Eth()` $DIR/core/services/keeper/orm_test.go: `.MustInsertKeeperRegistry(t, db, orm, ethKeyStore, 0, 1, 20)` $DIR/core/services/keeper/orm_test.go: `.MustInsertUpkeepForRegistry(t, db, registry)` $DIR/core/services/keeper/orm_test.go: `.EIP55AddressFromAddress(evmutils.ZeroAddress)` $DIR/core/services/keeper/orm_test.go: `.UpsertRegistry(ctx, ®istry)` $DIR/core/services/keeper/orm_test.go: `.SetLastRunInfoForUpkeepOnJob(ctx, j.ID, upkeep.UpkeepID, 100, registry.FromAddress)` $DIR/core/services/keeper/orm_test.go: `.SetLastRunInfoForUpkeepOnJob(ctx, j.ID, upkeep.UpkeepID, 0, registry.FromAddress)` $DIR/core/services/keeper/orm_test.go: `.SetLastRunInfoForUpkeepOnJob(ctx, j.ID, upkeep.UpkeepID, 100, types.EIP55AddressFromAddress(evmutils.ZeroAddress))` $DIR/core/services/keeper/orm_test.go: `.EIP55AddressFromAddress(evmutils.ZeroAddress)` $DIR/core/services/keeper/orm_test.go: `.SetLastRunInfoForUpkeepOnJob(ctx, j.ID, upkeep.UpkeepID, 101, registry.FromAddress)` $DIR/core/services/keeper/orm_test.go: `.Run(test.name, func(tt *testing.T) { var test = test var result string err := db.Get(&result, sql, inputBytes, test.inputLength) if test.expectedError { assert.Error(t, err) return } assert.NoError(t, err) assert.Equal(t, test.expectedOutput, result) })` $DIR/core/services/keeper/orm_test.go: `.Get(&result, sql, inputBytes, test.inputLength)` $DIR/core/services/keeper/orm_test.go: `.NewInt(0)` $DIR/core/services/keeper/orm_test.go: `.RandUint256()` $DIR/core/services/keeper/orm_test.go: `.NewInt(1)` $DIR/core/services/keeper/orm_test.go: `.Add(evmutils.MaxUint256, big.NewInt(1))` $DIR/core/services/keeper/orm_test.go: `.NewInt(1)` $DIR/core/services/keeper/orm_test.go: `.Run(test.name, func(tt *testing.T) { var test = test var result string err := db.Get(&result, sql, test.input.String()) if test.errorExpected { require.Error(t, err) return } require.NoError(t, err) expected := utils.LeftPadBitString(fmt.Sprintf("%b", test.input), 256) require.Equal(t, expected, result) })` $DIR/core/services/keeper/orm_test.go: `.Get(&result, sql, test.input.String())` $DIR/core/services/keeper/orm_test.go: `.input.String()` $DIR/core/services/keeper/orm_test.go: `.LeftPadBitString(fmt.Sprintf("%b", test.input), 256)` $DIR/core/services/keeper/orm_test.go: `.Sprintf("%b", test.input)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `registryMock.MockResponse("typeAndVersion", "KeeperRegistry 1.1.0").Once()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `mockRegistry1_1( t, ethMock, contractAddress, registryConfig1_1, []common.Address{fromAddress}, []*big.Int{}, big.NewInt(0), upkeepConfig1_1, 0)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `cltest.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `err = synchronizer.Start(testutils.Context(t))` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `upkeepConfig.LastKeeper = fromAddress` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `mockRegistry1_1( t, ethMock, contractAddress, registryConfig1_1, []common.Address{fromAddress}, canceledUpkeeps, big.NewInt(3), upkeepConfig, 2)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `synchronizer.ExportedFullSync(ctx)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `cltest.AssertCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `cltest.AssertCount(t, db, "upkeep_registrations", 2)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `g.Eventually(func() bool { var upkeep keeper.UpkeepRegistration err := db.Get(&upkeep, `SELECT * FROM upkeep_registrations`) require.NoError(t, err) return upkeep.LastKeeperIndex.Valid }, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.Equal(true))` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `g.Eventually(func() int64 { var upkeep keeper.UpkeepRegistration err := db.Get(&upkeep, `SELECT * FROM upkeep_registrations`) require.NoError(t, err) return upkeep.LastKeeperIndex.Int64 }, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.Equal(int64(0)))` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `assertUpkeepIDs(t, db, []int64{0, 2})` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `canceledUpkeeps = []*big.Int{big.NewInt(0), big.NewInt(1), big.NewInt(3)}` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `mockRegistry1_1( t, ethMock, contractAddress, registryConfig1_1, []common.Address{fromAddress}, canceledUpkeeps, big.NewInt(5), upkeepConfig1_1, 2)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `synchronizer.ExportedFullSync(ctx)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `cltest.AssertCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `cltest.AssertCount(t, db, "upkeep_registrations", 2)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `mockRegistry1_1( t, ethMock, contractAddress, registryConfig1_1, []common.Address{fromAddress}, []*big.Int{}, big.NewInt(0), upkeepConfig1_1, 0)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `servicetest.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `cltest.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `newConfig.BlockCountPerTurn = big.NewInt(40)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `registryMock.MockResponse("getKeeperList", []common.Address{fromAddress}).Once()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `registryMock.MockResponse("getConfig", newConfig).Once()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `logBroadcast.On("DecodedLog").Return(&log)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `logBroadcast.On("RawLog").Return(rawLog)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `synchronizer.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `cltest.AssertRecordEventually(t, db, ®istry, fmt.Sprintf(`SELECT * FROM keeper_registries WHERE id = %d`, registry.ID), func() bool { return registry.BlockCountPerTurn == 40 })` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `mockRegistry1_1( t, ethMock, contractAddress, registryConfig1_1, []common.Address{fromAddress}, []*big.Int{}, big.NewInt(0), upkeepConfig1_1, 0)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `servicetest.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `cltest.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `registryMock.MockResponse("getConfig", registryConfig1_1).Once()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `registryMock.MockResponse("getKeeperList", addresses).Once()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `logBroadcast.On("DecodedLog").Return(&log)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `logBroadcast.On("RawLog").Return(rawLog)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `synchronizer.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `cltest.AssertRecordEventually(t, db, ®istry, fmt.Sprintf(`SELECT * FROM keeper_registries WHERE id = %d`, registry.ID), func() bool { return registry.NumKeepers == 2 })` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `mockRegistry1_1( t, ethMock, contractAddress, registryConfig1_1, []common.Address{fromAddress}, []*big.Int{}, big.NewInt(3), upkeepConfig1_1, 3)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `servicetest.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `cltest.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `cltest.WaitForCount(t, db, "upkeep_registrations", 3)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `logBroadcast.On("DecodedLog").Return(&log)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `logBroadcast.On("RawLog").Return(rawLog)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `synchronizer.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `mockRegistry1_1( t, ethMock, contractAddress, registryConfig1_1, []common.Address{fromAddress}, []*big.Int{}, big.NewInt(1), upkeepConfig1_1, 1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `servicetest.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `cltest.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `cltest.WaitForCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `registryMock.MockResponse("getUpkeep", upkeepConfig1_1).Once()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `logBroadcast.On("DecodedLog").Return(&log)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `logBroadcast.On("RawLog").Return(rawLog)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `synchronizer.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `mockRegistry1_1( t, ethMock, contractAddress, registryConfig1_1, []common.Address{fromAddress}, []*big.Int{}, big.NewInt(1), upkeepConfig1_1, 1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `servicetest.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `cltest.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `cltest.WaitForCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `pgtest.MustExec(t, db, `UPDATE upkeep_registrations SET last_run_block_height = 100`)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `logBroadcast.On("DecodedLog").Return(&log)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `logBroadcast.On("RawLog").Return(rawLog)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `synchronizer.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `g.Eventually(func() int64 { var upkeep keeper.UpkeepRegistration err := db.Get(&upkeep, `SELECT * FROM upkeep_registrations`) require.NoError(t, err) return upkeep.LastRunBlockHeight }, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.Equal(int64(200)))` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewSqlxDB(t)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewORM(db, logger.TestLogger(t))` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.TestLogger(t)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.MustInsertKeeperJob(t, db, korm, cltest.NewEIP55Address(), cltest.NewEIP55Address())` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewEIP55Address()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewEIP55Address()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewContractMockReceiver(t, ethClient, keeper.Registry1_1ABI, contractAddress)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.MockResponse("typeAndVersion", "KeeperRegistry 1.1.0")` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Once()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewRegistryWrapper(j.KeeperSpec.ContractAddress, ethClient)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.GetLogListenerOpts(1, nil)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Topic()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewInt(0)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Start(testutils.Context(t))` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Start(testutils.Context(t))` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.CalcPositioningConstant(ubig.NewI(upkeepID), cltest.NewEIP55Address())` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewI(upkeepID)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewEIP55Address()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewWithT(t)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewInt(1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.ExportedFullSync(ctx)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.AssertCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.AssertCount(t, db, "upkeep_registrations", 2)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Eventually(func() bool { var upkeep keeper.UpkeepRegistration err := db.Get(&upkeep, `SELECT * FROM upkeep_registrations`) require.NoError(t, err) return upkeep.LastKeeperIndex.Valid }, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Get(&upkeep, `SELECT * FROM upkeep_registrations`)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.WaitTimeout(t)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Should(gomega.Equal(true))` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Equal(true)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Eventually(func() int64 { var upkeep keeper.UpkeepRegistration err := db.Get(&upkeep, `SELECT * FROM upkeep_registrations`) require.NoError(t, err) return upkeep.LastKeeperIndex.Int64 }, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Get(&upkeep, `SELECT * FROM upkeep_registrations`)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.WaitTimeout(t)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Should(gomega.Equal(int64(0)))` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Equal(int64(0))` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewInt(0)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewInt(1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewInt(5)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.ExportedFullSync(ctx)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.AssertCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.AssertCount(t, db, "upkeep_registrations", 2)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewInt(0)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewContractMockReceiver(t, ethMock, keeper.Registry1_1ABI, contractAddress)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewInt(40)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.MockResponse("getKeeperList", []common.Address{fromAddress})` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Once()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.MockResponse("getConfig", newConfig)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Once()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.MustInsertHead(t, db, 1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewBroadcast(t)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.On("DecodedLog")` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Return(&log)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.On("RawLog")` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Return(rawLog)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.On("String")` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Maybe()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Return("")` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Return(nil)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Return(false, nil)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.AssertRecordEventually(t, db, ®istry, fmt.Sprintf(`SELECT * FROM keeper_registries WHERE id = %d`, registry.ID), func() bool { return registry.BlockCountPerTurn == 40 })` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Sprintf(`SELECT * FROM keeper_registries WHERE id = %d`, registry.ID)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewInt(0)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewAddress()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewContractMockReceiver(t, ethMock, keeper.Registry1_1ABI, contractAddress)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.MockResponse("getConfig", registryConfig1_1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Once()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.MockResponse("getKeeperList", addresses)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Once()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.MustInsertHead(t, db, 1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewBroadcast(t)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.On("DecodedLog")` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Return(&log)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.On("RawLog")` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Return(rawLog)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.On("String")` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Maybe()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Return("")` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Return(nil)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Return(false, nil)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.AssertRecordEventually(t, db, ®istry, fmt.Sprintf(`SELECT * FROM keeper_registries WHERE id = %d`, registry.ID), func() bool { return registry.NumKeepers == 2 })` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Sprintf(`SELECT * FROM keeper_registries WHERE id = %d`, registry.ID)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.WaitForCount(t, db, "upkeep_registrations", 3)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.MustInsertHead(t, db, 1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewInt(1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewBroadcast(t)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.On("DecodedLog")` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Return(&log)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.On("RawLog")` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Return(rawLog)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.On("String")` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Maybe()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Return("")` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Return(nil)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Return(false, nil)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewInt(1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.WaitForCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewContractMockReceiver(t, ethMock, keeper.Registry1_1ABI, contractAddress)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.MockResponse("getUpkeep", upkeepConfig1_1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Once()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.MustInsertHead(t, db, 1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewInt(1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewBroadcast(t)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.On("DecodedLog")` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Return(&log)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.On("RawLog")` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Return(rawLog)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.On("String")` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Maybe()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Return("")` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Return(nil)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Return(false, nil)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewWithT(t)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewInt(1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.WaitForCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.MustExec(t, db, `UPDATE upkeep_registrations SET last_run_block_height = 100`)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.MustInsertHead(t, db, 1)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewInt(0)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.NewBroadcast(t)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.On("DecodedLog")` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Return(&log)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.On("RawLog")` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Return(rawLog)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.On("String")` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Maybe()` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Return("")` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Return(nil)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Return(false, nil)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Eventually(func() int64 { var upkeep keeper.UpkeepRegistration err := db.Get(&upkeep, `SELECT * FROM upkeep_registrations`) require.NoError(t, err) return upkeep.LastRunBlockHeight }, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Get(&upkeep, `SELECT * FROM upkeep_registrations`)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.WaitTimeout(t)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Should(gomega.Equal(int64(200)))` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Equal(int64(200))` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Eventually(func() int64 { var upkeep keeper.UpkeepRegistration err := db.Get(&upkeep, `SELECT * FROM upkeep_registrations`) require.NoError(t, err) return upkeep.LastKeeperIndex.Int64 }, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Get(&upkeep, `SELECT * FROM upkeep_registrations`)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.WaitTimeout(t)` $DIR/core/services/keeper/registry1_1_synchronizer_test.go: `.Equal(int64(0))` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `registryMock.MockResponse("typeAndVersion", "KeeperRegistry 1.2.0").Once()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `mockRegistry1_2( t, ethMock, contractAddress, registryConfig1_2, []*big.Int{}, []common.Address{fromAddress}, upkeepConfig1_2, 0, 2, 0)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `cltest.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `err = synchronizer.Start(testutils.Context(t))` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `upkeepConfig.LastKeeper = fromAddress` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `mockRegistry1_2( t, ethMock, contractAddress, registryConfig1_2, []*big.Int{big.NewInt(3), big.NewInt(69), big.NewInt(420)}, // Upkeep IDs []common.Address{fromAddress}, upkeepConfig, 3, // sync all 3 2, 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `synchronizer.ExportedFullSync(ctx)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `cltest.AssertCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `cltest.AssertCount(t, db, "upkeep_registrations", 3)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `g.Eventually(func() bool { var upkeep keeper.UpkeepRegistration err := db.Get(&upkeep, `SELECT * FROM upkeep_registrations`) require.NoError(t, err) return upkeep.LastKeeperIndex.Valid }, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.Equal(true))` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `g.Eventually(func() int64 { var upkeep keeper.UpkeepRegistration err := db.Get(&upkeep, `SELECT * FROM upkeep_registrations`) require.NoError(t, err) return upkeep.LastKeeperIndex.Int64 }, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.Equal(int64(0)))` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `assertUpkeepIDs(t, db, []int64{3, 69, 420})` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `mockRegistry1_2( t, ethMock, contractAddress, registryConfig1_2, []*big.Int{big.NewInt(69), big.NewInt(420), big.NewInt(2022)}, // Upkeep IDs []common.Address{fromAddress}, upkeepConfig1_2, 3, // sync all 3 active upkeeps 2, 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `synchronizer.ExportedFullSync(ctx)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `cltest.AssertCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `cltest.AssertCount(t, db, "upkeep_registrations", 3)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `mockRegistry1_2( t, ethMock, contractAddress, registryConfig1_2, []*big.Int{}, // Upkeep IDs []common.Address{fromAddress}, upkeepConfig1_2, 0, 2, 0)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `servicetest.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `cltest.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `newConfig.BlockCountPerTurn = big.NewInt(40)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `registryMock.MockResponse("getState", registry1_2.GetState{ State: registryState1_2, Config: newConfig, Keepers: []common.Address{fromAddress}, }).Once()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `logBroadcast.On("DecodedLog").Return(&log)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `logBroadcast.On("RawLog").Return(rawLog)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `synchronizer.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `cltest.AssertRecordEventually(t, db, ®istry, fmt.Sprintf(`SELECT * FROM keeper_registries WHERE id = %d`, registry.ID), func() bool { return registry.BlockCountPerTurn == 40 })` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `mockRegistry1_2( t, ethMock, contractAddress, registryConfig1_2, []*big.Int{}, // Upkeep IDs []common.Address{fromAddress}, upkeepConfig1_2, 0, 2, 0)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `servicetest.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `cltest.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `registryMock.MockResponse("getState", registry1_2.GetState{ State: registryState1_2, Config: registryConfig1_2, Keepers: addresses, }).Once()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `logBroadcast.On("DecodedLog").Return(&log)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `logBroadcast.On("RawLog").Return(rawLog)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `synchronizer.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `cltest.AssertRecordEventually(t, db, ®istry, fmt.Sprintf(`SELECT * FROM keeper_registries WHERE id = %d`, registry.ID), func() bool { return registry.NumKeepers == 2 })` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `mockRegistry1_2( t, ethMock, contractAddress, registryConfig1_2, []*big.Int{big.NewInt(3), big.NewInt(69), big.NewInt(420)}, // Upkeep IDs []common.Address{fromAddress}, upkeepConfig1_2, 3, 2, 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `servicetest.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `cltest.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `cltest.WaitForCount(t, db, "upkeep_registrations", 3)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `logBroadcast.On("DecodedLog").Return(&log)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `logBroadcast.On("RawLog").Return(rawLog)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `synchronizer.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `mockRegistry1_2( t, ethMock, contractAddress, registryConfig1_2, []*big.Int{big.NewInt(3)}, // Upkeep IDs []common.Address{fromAddress}, upkeepConfig1_2, 1, 2, 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `servicetest.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `cltest.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `cltest.WaitForCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `registryMock.MockResponse("getUpkeep", upkeepConfig1_2).Once()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `logBroadcast.On("DecodedLog").Return(&log)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `logBroadcast.On("RawLog").Return(rawLog)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `synchronizer.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `mockRegistry1_2( t, ethMock, contractAddress, registryConfig1_2, []*big.Int{big.NewInt(3)}, // Upkeep IDs []common.Address{fromAddress}, upkeepConfig1_2, 1, 2, 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `servicetest.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `cltest.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `cltest.WaitForCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `pgtest.MustExec(t, db, `UPDATE upkeep_registrations SET last_run_block_height = 100`)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `logBroadcast.On("DecodedLog").Return(&log)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `logBroadcast.On("RawLog").Return(rawLog)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `synchronizer.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `g.Eventually(func() int64 { var upkeep keeper.UpkeepRegistration err := db.Get(&upkeep, `SELECT * FROM upkeep_registrations`) require.NoError(t, err) return upkeep.LastRunBlockHeight }, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.Equal(int64(200)))` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `mockRegistry1_2( t, ethMock, contractAddress, registryConfig1_2, []*big.Int{big.NewInt(3)}, // Upkeep IDs []common.Address{fromAddress}, upkeepConfig1_2, 1, 2, 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `servicetest.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `cltest.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `cltest.WaitForCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `g.Eventually(getExecuteGas, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.Equal(uint32(2_000_000)))` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `newConfig.ExecuteGas = 4_000_000` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `registryMock.MockResponse("getUpkeep", newConfig).Once()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `logBroadcast.On("DecodedLog").Return(&log)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `logBroadcast.On("RawLog").Return(rawLog)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `synchronizer.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `mockRegistry1_2( t, ethMock, contractAddress, registryConfig1_2, []*big.Int{big.NewInt(3)}, // Upkeep IDs []common.Address{fromAddress}, upkeepConfig1_2, 1, 2, 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `servicetest.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `cltest.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `cltest.WaitForCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `registryMock.MockResponse("getUpkeep", upkeepConfig1_2).Once()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `logBroadcast.On("DecodedLog").Return(&log)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `logBroadcast.On("RawLog").Return(rawLog)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `synchronizer.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `mockRegistry1_2( t, ethMock, contractAddress, registryConfig1_2, []*big.Int{big.NewInt(3), big.NewInt(69), big.NewInt(420)}, // Upkeep IDs []common.Address{fromAddress}, upkeepConfig1_2, 3, 2, 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `servicetest.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `cltest.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `cltest.WaitForCount(t, db, "upkeep_registrations", 3)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `logBroadcast.On("DecodedLog").Return(&log)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `logBroadcast.On("RawLog").Return(rawLog)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `synchronizer.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewSqlxDB(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewORM(db, logger.TestLogger(t))` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.TestLogger(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.MustInsertKeeperJob(t, db, korm, cltest.NewEIP55Address(), cltest.NewEIP55Address())` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewEIP55Address()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewEIP55Address()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewContractMockReceiver(t, ethClient, keeper.Registry1_1ABI, contractAddress)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.MockResponse("typeAndVersion", "KeeperRegistry 1.2.0")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Once()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewRegistryWrapper(j.KeeperSpec.ContractAddress, ethClient)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.GetLogListenerOpts(1, nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Topic()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Start(testutils.Context(t))` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Start(testutils.Context(t))` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewWithT(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewInt(69)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewInt(420)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.ExportedFullSync(ctx)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.AssertCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.AssertCount(t, db, "upkeep_registrations", 3)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Eventually(func() bool { var upkeep keeper.UpkeepRegistration err := db.Get(&upkeep, `SELECT * FROM upkeep_registrations`) require.NoError(t, err) return upkeep.LastKeeperIndex.Valid }, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Get(&upkeep, `SELECT * FROM upkeep_registrations`)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.WaitTimeout(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Should(gomega.Equal(true))` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Equal(true)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Eventually(func() int64 { var upkeep keeper.UpkeepRegistration err := db.Get(&upkeep, `SELECT * FROM upkeep_registrations`) require.NoError(t, err) return upkeep.LastKeeperIndex.Int64 }, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Get(&upkeep, `SELECT * FROM upkeep_registrations`)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.WaitTimeout(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Should(gomega.Equal(int64(0)))` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Equal(int64(0))` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewInt(69)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewInt(420)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewInt(2022)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.ExportedFullSync(ctx)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.AssertCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.AssertCount(t, db, "upkeep_registrations", 3)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewContractMockReceiver(t, ethMock, keeper.Registry1_2ABI, contractAddress)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewInt(40)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.MockResponse("getState", registry1_2.GetState{ State: registryState1_2, Config: newConfig, Keepers: []common.Address{fromAddress}, })` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Once()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.MustInsertHead(t, db, 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewBroadcast(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("DecodedLog")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(&log)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("RawLog")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(rawLog)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("String")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Maybe()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return("")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(false, nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.AssertRecordEventually(t, db, ®istry, fmt.Sprintf(`SELECT * FROM keeper_registries WHERE id = %d`, registry.ID), func() bool { return registry.BlockCountPerTurn == 40 })` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Sprintf(`SELECT * FROM keeper_registries WHERE id = %d`, registry.ID)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewAddress()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewContractMockReceiver(t, ethMock, keeper.Registry1_2ABI, contractAddress)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.MockResponse("getState", registry1_2.GetState{ State: registryState1_2, Config: registryConfig1_2, Keepers: addresses, })` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Once()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.MustInsertHead(t, db, 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewBroadcast(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("DecodedLog")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(&log)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("RawLog")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(rawLog)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("String")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Maybe()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return("")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(false, nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.AssertRecordEventually(t, db, ®istry, fmt.Sprintf(`SELECT * FROM keeper_registries WHERE id = %d`, registry.ID), func() bool { return registry.NumKeepers == 2 })` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Sprintf(`SELECT * FROM keeper_registries WHERE id = %d`, registry.ID)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewInt(69)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewInt(420)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.WaitForCount(t, db, "upkeep_registrations", 3)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.MustInsertHead(t, db, 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewBroadcast(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("DecodedLog")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(&log)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("RawLog")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(rawLog)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("String")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Maybe()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return("")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(false, nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.WaitForCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewContractMockReceiver(t, ethMock, keeper.Registry1_2ABI, contractAddress)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.MockResponse("getUpkeep", upkeepConfig1_2)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Once()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.MustInsertHead(t, db, 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewInt(420)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewBroadcast(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("DecodedLog")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(&log)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("RawLog")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(rawLog)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("String")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Maybe()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return("")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(false, nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewWithT(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.WaitForCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.MustExec(t, db, `UPDATE upkeep_registrations SET last_run_block_height = 100`)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.MustInsertHead(t, db, 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewBroadcast(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("DecodedLog")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(&log)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("RawLog")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(rawLog)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("String")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Maybe()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return("")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(false, nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Eventually(func() int64 { var upkeep keeper.UpkeepRegistration err := db.Get(&upkeep, `SELECT * FROM upkeep_registrations`) require.NoError(t, err) return upkeep.LastRunBlockHeight }, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Get(&upkeep, `SELECT * FROM upkeep_registrations`)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.WaitTimeout(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Should(gomega.Equal(int64(200)))` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Equal(int64(200))` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Eventually(func() int64 { var upkeep keeper.UpkeepRegistration err := db.Get(&upkeep, `SELECT * FROM upkeep_registrations`) require.NoError(t, err) return upkeep.LastKeeperIndex.Int64 }, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Get(&upkeep, `SELECT * FROM upkeep_registrations`)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.WaitTimeout(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Equal(int64(0))` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewWithT(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.WaitForCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Get(&upkeep, `SELECT * FROM upkeep_registrations`)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Eventually(getExecuteGas, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.WaitTimeout(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Should(gomega.Equal(uint32(2_000_000)))` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Equal(uint32(2_000_000))` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewContractMockReceiver(t, ethMock, keeper.Registry1_2ABI, contractAddress)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.MockResponse("getUpkeep", newConfig)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Once()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.MustInsertHead(t, db, 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewInt(4_000_000)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewBroadcast(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("DecodedLog")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(&log)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("RawLog")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(rawLog)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("String")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Maybe()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return("")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(false, nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Eventually(getExecuteGas, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.WaitTimeout(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Equal(uint32(4_000_000))` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.WaitForCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewContractMockReceiver(t, ethMock, keeper.Registry1_2ABI, contractAddress)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.MockResponse("getUpkeep", upkeepConfig1_2)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Once()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.MustInsertHead(t, db, 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewInt(420)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewBroadcast(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("DecodedLog")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(&log)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("RawLog")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(rawLog)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("String")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Maybe()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return("")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(false, nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewInt(69)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewInt(420)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.WaitForCount(t, db, "upkeep_registrations", 3)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.MustInsertHead(t, db, 1)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.NewBroadcast(t)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("DecodedLog")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(&log)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("RawLog")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(rawLog)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("String")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Maybe()` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return("")` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.Return(false, nil)` $DIR/core/services/keeper/registry1_2_synchronizer_test.go: `.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `registryMock.MockResponse("typeAndVersion", "KeeperRegistry 1.3.0").Once()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `mockRegistry1_3( t, ethMock, contractAddress, registryConfig1_3, []*big.Int{}, []common.Address{fromAddress}, upkeepConfig1_3, 0, 2, 0)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `cltest.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `err = synchronizer.Start(testutils.Context(t))` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `upkeepConfig.LastKeeper = fromAddress` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `mockRegistry1_3( t, ethMock, contractAddress, registryConfig1_3, []*big.Int{big.NewInt(3), big.NewInt(69), big.NewInt(420)}, // Upkeep IDs []common.Address{fromAddress}, upkeepConfig, 3, // sync all 3 2, 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `synchronizer.ExportedFullSync(ctx)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `cltest.AssertCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `cltest.AssertCount(t, db, "upkeep_registrations", 3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `g.Eventually(func() bool { var upkeep keeper.UpkeepRegistration err := db.Get(&upkeep, `SELECT * FROM upkeep_registrations`) require.NoError(t, err) return upkeep.LastKeeperIndex.Valid }, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.Equal(true))` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `g.Eventually(func() int64 { var upkeep keeper.UpkeepRegistration err := db.Get(&upkeep, `SELECT * FROM upkeep_registrations`) require.NoError(t, err) return upkeep.LastKeeperIndex.Int64 }, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.Equal(int64(0)))` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `assertUpkeepIDs(t, db, []int64{3, 69, 420})` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `mockRegistry1_3( t, ethMock, contractAddress, registryConfig1_3, []*big.Int{big.NewInt(69), big.NewInt(420), big.NewInt(2022)}, // Upkeep IDs []common.Address{fromAddress}, upkeepConfig1_3, 3, // sync all 3 upkeeps 2, 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `synchronizer.ExportedFullSync(ctx)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `cltest.AssertCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `cltest.AssertCount(t, db, "upkeep_registrations", 3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `mockRegistry1_3( t, ethMock, contractAddress, registryConfig1_3, []*big.Int{}, // Upkeep IDs []common.Address{fromAddress}, upkeepConfig1_3, 0, 2, 0)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `servicetest.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `cltest.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `newConfig.BlockCountPerTurn = big.NewInt(40)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `registryMock.MockResponse("getState", registry1_3.GetState{ State: registryState1_3, Config: newConfig, Keepers: []common.Address{fromAddress}, }).Once()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("DecodedLog").Return(&log)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("RawLog").Return(rawLog)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `synchronizer.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `cltest.AssertRecordEventually(t, db, ®istry, fmt.Sprintf(`SELECT * FROM keeper_registries WHERE id = %d`, registry.ID), func() bool { return registry.BlockCountPerTurn == 40 })` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `mockRegistry1_3( t, ethMock, contractAddress, registryConfig1_3, []*big.Int{}, // Upkeep IDs []common.Address{fromAddress}, upkeepConfig1_3, 0, 2, 0)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `servicetest.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `cltest.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `registryMock.MockResponse("getState", registry1_3.GetState{ State: registryState1_3, Config: registryConfig1_3, Keepers: addresses, }).Once()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("DecodedLog").Return(&log)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("RawLog").Return(rawLog)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `synchronizer.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `cltest.AssertRecordEventually(t, db, ®istry, fmt.Sprintf(`SELECT * FROM keeper_registries WHERE id = %d`, registry.ID), func() bool { return registry.NumKeepers == 2 })` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `mockRegistry1_3( t, ethMock, contractAddress, registryConfig1_3, []*big.Int{big.NewInt(3), big.NewInt(69), big.NewInt(420)}, // Upkeep IDs []common.Address{fromAddress}, upkeepConfig1_3, 3, 2, 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `servicetest.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `cltest.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `cltest.WaitForCount(t, db, "upkeep_registrations", 3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("DecodedLog").Return(&log)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("RawLog").Return(rawLog)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `synchronizer.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `mockRegistry1_3( t, ethMock, contractAddress, registryConfig1_3, []*big.Int{big.NewInt(3)}, // Upkeep IDs []common.Address{fromAddress}, upkeepConfig1_3, 1, 2, 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `servicetest.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `cltest.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `cltest.WaitForCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `registryMock.MockResponse("getUpkeep", upkeepConfig1_3).Once()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("DecodedLog").Return(&log)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("RawLog").Return(rawLog)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `synchronizer.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `mockRegistry1_3( t, ethMock, contractAddress, registryConfig1_3, []*big.Int{big.NewInt(3)}, // Upkeep IDs []common.Address{fromAddress}, upkeepConfig1_3, 1, 2, 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `servicetest.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `cltest.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `cltest.WaitForCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `pgtest.MustExec(t, db, `UPDATE upkeep_registrations SET last_run_block_height = 100`)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("DecodedLog").Return(&log)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("RawLog").Return(rawLog)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `synchronizer.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `g.Eventually(func() int64 { var upkeep keeper.UpkeepRegistration err := db.Get(&upkeep, `SELECT * FROM upkeep_registrations`) require.NoError(t, err) return upkeep.LastRunBlockHeight }, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.Equal(int64(200)))` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `mockRegistry1_3( t, ethMock, contractAddress, registryConfig1_3, []*big.Int{big.NewInt(3)}, // Upkeep IDs []common.Address{fromAddress}, upkeepConfig1_3, 1, 2, 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `servicetest.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `cltest.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `cltest.WaitForCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `g.Eventually(getExecuteGas, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.Equal(uint32(2_000_000)))` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `newConfig.ExecuteGas = 4_000_000` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `registryMock.MockResponse("getUpkeep", newConfig).Once()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("DecodedLog").Return(&log)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("RawLog").Return(rawLog)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `synchronizer.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `mockRegistry1_3( t, ethMock, contractAddress, registryConfig1_3, []*big.Int{big.NewInt(3)}, // Upkeep IDs []common.Address{fromAddress}, upkeepConfig1_3, 1, 2, 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `servicetest.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `cltest.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `cltest.WaitForCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `registryMock.MockResponse("getUpkeep", upkeepConfig1_3).Once()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("DecodedLog").Return(&log)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("RawLog").Return(rawLog)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `synchronizer.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `mockRegistry1_3( t, ethMock, contractAddress, registryConfig1_3, []*big.Int{big.NewInt(3), big.NewInt(69), big.NewInt(420)}, // Upkeep IDs []common.Address{fromAddress}, upkeepConfig1_3, 3, 2, 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `servicetest.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `cltest.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `cltest.WaitForCount(t, db, "upkeep_registrations", 3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("DecodedLog").Return(&log)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("RawLog").Return(rawLog)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `synchronizer.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `mockRegistry1_3( t, ethMock, contractAddress, registryConfig1_3, []*big.Int{big.NewInt(3), big.NewInt(69), big.NewInt(420)}, // Upkeep IDs []common.Address{fromAddress}, upkeepConfig1_3, 4, 2, 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `servicetest.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `cltest.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `cltest.WaitForCount(t, db, "upkeep_registrations", 3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("DecodedLog").Return(&log)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("RawLog").Return(rawLog)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `synchronizer.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `cltest.WaitForCount(t, db, "upkeep_registrations", 2)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `head = cltest.MustInsertHead(t, db, 2)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `rawLog = types.Log{BlockHash: head.Hash}` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast = logmocks.NewBroadcast(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("DecodedLog").Return(&unpausedlog)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("RawLog").Return(rawLog)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `synchronizer.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `cltest.WaitForCount(t, db, "upkeep_registrations", 3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `err = db.Get(®istryId, `SELECT id from keeper_registries WHERE job_id = $1`, job.ID)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `mockRegistry1_3( t, ethMock, contractAddress, registryConfig1_3, []*big.Int{upkeepId}, // Upkeep IDs []common.Address{fromAddress}, upkeepConfig1_3, 1, 2, 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `servicetest.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `cltest.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `cltest.WaitForCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `_ = logmocks.NewBroadcast(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `newConfig.CheckData = newCheckData` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `registryMock.MockResponse("getUpkeep", newConfig).Once()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("DecodedLog").Return(&updatedLog)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("RawLog").Return(rawLog)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `logBroadcast.On("String").Maybe().Return("")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `synchronizer.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewSqlxDB(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewORM(db, logger.TestLogger(t))` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.TestLogger(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.MustInsertKeeperJob(t, db, korm, cltest.NewEIP55Address(), cltest.NewEIP55Address())` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewEIP55Address()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewEIP55Address()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewContractMockReceiver(t, ethClient, keeper.Registry1_1ABI, contractAddress)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.MockResponse("typeAndVersion", "KeeperRegistry 1.3.0")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Once()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewRegistryWrapper(j.KeeperSpec.ContractAddress, ethClient)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.GetLogListenerOpts(1, nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Topic()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Start(testutils.Context(t))` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Start(testutils.Context(t))` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewWithT(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(69)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(420)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.ExportedFullSync(ctx)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.AssertCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.AssertCount(t, db, "upkeep_registrations", 3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Eventually(func() bool { var upkeep keeper.UpkeepRegistration err := db.Get(&upkeep, `SELECT * FROM upkeep_registrations`) require.NoError(t, err) return upkeep.LastKeeperIndex.Valid }, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Get(&upkeep, `SELECT * FROM upkeep_registrations`)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitTimeout(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Should(gomega.Equal(true))` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Equal(true)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Eventually(func() int64 { var upkeep keeper.UpkeepRegistration err := db.Get(&upkeep, `SELECT * FROM upkeep_registrations`) require.NoError(t, err) return upkeep.LastKeeperIndex.Int64 }, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Get(&upkeep, `SELECT * FROM upkeep_registrations`)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitTimeout(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Should(gomega.Equal(int64(0)))` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Equal(int64(0))` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(69)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(420)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(2022)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.ExportedFullSync(ctx)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.AssertCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.AssertCount(t, db, "upkeep_registrations", 3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewContractMockReceiver(t, ethMock, keeper.Registry1_3ABI, contractAddress)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(40)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.MockResponse("getState", registry1_3.GetState{ State: registryState1_3, Config: newConfig, Keepers: []common.Address{fromAddress}, })` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Once()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.MustInsertHead(t, db, 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewBroadcast(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("DecodedLog")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(&log)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("RawLog")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(rawLog)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("String")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Maybe()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return("")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(false, nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.AssertRecordEventually(t, db, ®istry, fmt.Sprintf(`SELECT * FROM keeper_registries WHERE id = %d`, registry.ID), func() bool { return registry.BlockCountPerTurn == 40 })` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Sprintf(`SELECT * FROM keeper_registries WHERE id = %d`, registry.ID)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewAddress()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewContractMockReceiver(t, ethMock, keeper.Registry1_3ABI, contractAddress)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.MockResponse("getState", registry1_3.GetState{ State: registryState1_3, Config: registryConfig1_3, Keepers: addresses, })` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Once()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.MustInsertHead(t, db, 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewBroadcast(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("DecodedLog")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(&log)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("RawLog")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(rawLog)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("String")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Maybe()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return("")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(false, nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.AssertRecordEventually(t, db, ®istry, fmt.Sprintf(`SELECT * FROM keeper_registries WHERE id = %d`, registry.ID), func() bool { return registry.NumKeepers == 2 })` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Sprintf(`SELECT * FROM keeper_registries WHERE id = %d`, registry.ID)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(69)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(420)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitForCount(t, db, "upkeep_registrations", 3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.MustInsertHead(t, db, 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewBroadcast(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("DecodedLog")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(&log)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("RawLog")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(rawLog)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("String")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Maybe()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return("")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(false, nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitForCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewContractMockReceiver(t, ethMock, keeper.Registry1_3ABI, contractAddress)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.MockResponse("getUpkeep", upkeepConfig1_3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Once()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.MustInsertHead(t, db, 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(420)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewBroadcast(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("DecodedLog")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(&log)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("RawLog")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(rawLog)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("String")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Maybe()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return("")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(false, nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewWithT(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitForCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.MustExec(t, db, `UPDATE upkeep_registrations SET last_run_block_height = 100`)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.MustInsertHead(t, db, 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewBroadcast(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("DecodedLog")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(&log)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("RawLog")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(rawLog)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("String")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Maybe()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return("")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(false, nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Eventually(func() int64 { var upkeep keeper.UpkeepRegistration err := db.Get(&upkeep, `SELECT * FROM upkeep_registrations`) require.NoError(t, err) return upkeep.LastRunBlockHeight }, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Get(&upkeep, `SELECT * FROM upkeep_registrations`)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitTimeout(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Should(gomega.Equal(int64(200)))` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Equal(int64(200))` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Eventually(func() int64 { var upkeep keeper.UpkeepRegistration err := db.Get(&upkeep, `SELECT * FROM upkeep_registrations`) require.NoError(t, err) return upkeep.LastKeeperIndex.Int64 }, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Get(&upkeep, `SELECT * FROM upkeep_registrations`)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitTimeout(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Equal(int64(0))` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewWithT(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitForCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Get(&upkeep, `SELECT * FROM upkeep_registrations`)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Eventually(getExecuteGas, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitTimeout(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Should(gomega.Equal(uint32(2_000_000)))` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Equal(uint32(2_000_000))` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewContractMockReceiver(t, ethMock, keeper.Registry1_3ABI, contractAddress)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.MockResponse("getUpkeep", newConfig)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Once()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.MustInsertHead(t, db, 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(4_000_000)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewBroadcast(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("DecodedLog")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(&log)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("RawLog")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(rawLog)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("String")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Maybe()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return("")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(false, nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Eventually(getExecuteGas, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitTimeout(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Equal(uint32(4_000_000))` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitForCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewContractMockReceiver(t, ethMock, keeper.Registry1_3ABI, contractAddress)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.MockResponse("getUpkeep", upkeepConfig1_3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Once()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.MustInsertHead(t, db, 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(420)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewBroadcast(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("DecodedLog")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(&log)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("RawLog")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(rawLog)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("String")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Maybe()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return("")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(false, nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(69)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(420)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitForCount(t, db, "upkeep_registrations", 3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.MustInsertHead(t, db, 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewBroadcast(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("DecodedLog")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(&log)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("RawLog")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(rawLog)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("String")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Maybe()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return("")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(false, nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(69)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(420)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitForCount(t, db, "upkeep_registrations", 3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.MustInsertHead(t, db, 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewBroadcast(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("DecodedLog")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(&log)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("RawLog")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(rawLog)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("String")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Maybe()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return("")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(false, nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitForCount(t, db, "upkeep_registrations", 2)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.MustInsertHead(t, db, 2)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewBroadcast(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("DecodedLog")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(&unpausedlog)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("RawLog")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(rawLog)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("String")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Maybe()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return("")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(false, nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitForCount(t, db, "upkeep_registrations", 3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Get(&upkeep, `SELECT * FROM upkeep_registrations WHERE upkeep_id = $1`, ubig.New(upkeepId))` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.New(upkeepId)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Get(®istryId, `SELECT id from keeper_registries WHERE job_id = $1`, job.ID)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Context(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewWithT(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.KeeperSpec.ContractAddress.Address()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewInt(3)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Run(t, synchronizer)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitForCount(t, db, "keeper_registries", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitForCount(t, db, "upkeep_registrations", 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.MustInsertHead(t, db, 1)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewBroadcast(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewContractMockReceiver(t, ethMock, keeper.Registry1_3ABI, contractAddress)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.MockResponse("getUpkeep", newConfig)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Once()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.NewBroadcast(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("DecodedLog")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(&updatedLog)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("RawLog")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(rawLog)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("String")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Maybe()` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return("")` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Return(false, nil)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.HandleLog(ctx, logBroadcast)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Eventually(func() []byte { var upkeep keeper.UpkeepRegistration err := db.Get(&upkeep, `SELECT * FROM upkeep_registrations WHERE upkeep_id = $1`, ubig.New(upkeepId)) require.NoError(t, err) return upkeep.CheckData }, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Get(&upkeep, `SELECT * FROM upkeep_registrations WHERE upkeep_id = $1`, ubig.New(upkeepId))` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.New(upkeepId)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.WaitTimeout(t)` $DIR/core/services/keeper/registry1_3_synchronizer_test.go: `.Equal(newCheckData)` $DIR/core/services/keeper/registry_synchronizer_sync_test.go: `count++` $DIR/core/services/keeper/registry_synchronizer_sync_test.go: `synchronizer.syncUpkeepWithCallback(ctx, getter, registry, id, doneFunc)` $DIR/core/services/keeper/registry_synchronizer_sync_test.go: `keys[field.Key] = true` $DIR/core/services/keeper/registry_synchronizer_sync_test.go: `.Context(t)` $DIR/core/services/keeper/registry_synchronizer_sync_test.go: `.TestLoggerObserved(t, zapcore.ErrorLevel)` $DIR/core/services/keeper/registry_synchronizer_sync_test.go: `.EIP55Address(testutils.NewAddress().Hex())` $DIR/core/services/keeper/registry_synchronizer_sync_test.go: `.NewAddress()` $DIR/core/services/keeper/registry_synchronizer_sync_test.go: `.Hex()` $DIR/core/services/keeper/registry_synchronizer_sync_test.go: `.SetString("5032485723458348569331745", 10)` $DIR/core/services/keeper/registry_synchronizer_sync_test.go: `.New(o)` $DIR/core/services/keeper/registry_synchronizer_sync_test.go: `.syncUpkeepWithCallback(ctx, getter, registry, id, doneFunc)` $DIR/core/services/keeper/registry_synchronizer_sync_test.go: `.All()` $DIR/core/services/keeper/upkeep_executer_test.go: `t.Run("runs upkeep on triggering block number", func(t *testing.T) { db, config, ethMock, executer, registry, upkeep, job, jpv2, txm, _, _, _ := setup(t, mockEstimator(t), func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].ChainID = (*ubig.Big)(testutils.SimulatedChainID) }) gasLimit := uint64(5_000_000 + config.Keeper().Registry().PerformGasOverhead()) ethTxCreated := cltest.NewAwaiter() txm.On("CreateTransaction", mock.Anything, mock.MatchedBy(func(txRequest txmgr.TxRequest) bool { return txRequest.FeeLimit == gasLimit }), ). Once(). Return(txmgr.Tx{ ID: 1, }, nil). Run(func(mock.Arguments) { ethTxCreated.ItHappened() }) registryMock := cltest.NewContractMockReceiver(t, ethMock, keeper.Registry1_1ABI, registry.ContractAddress.Address()) registryMock.MockMatchedResponse( "checkUpkeep", func(callArgs ethereum.CallMsg) bool { return callArgs.GasPrice == nil && callArgs.Gas == 0 }, checkUpkeepResponse, ) registryMock.MockMatchedResponse( "performUpkeep", func(callArgs ethereum.CallMsg) bool { return true }, checkPerformResponse, ) head := newHead() executer.OnNewLongestChain(testutils.Context(t), &head) ethTxCreated.AwaitOrFail(t) runs := cltest.WaitForPipelineComplete(t, 0, job.ID, 1, taskRuns, jpv2.Jrm, time.Second, 100*time.Millisecond) require.Len(t, runs, 1) assert.False(t, runs[0].HasErrors()) assert.False(t, runs[0].HasFatalErrors()) waitLastRunHeight(t, db, upkeep, 20) })` $DIR/core/services/keeper/upkeep_executer_test.go: `c.EVM[0].ChainID = (*ubig.Big)(testutils.SimulatedChainID)` $DIR/core/services/keeper/upkeep_executer_test.go: `txm.On("CreateTransaction", mock.Anything, mock.MatchedBy(func(txRequest txmgr.TxRequest) bool { return txRequest.FeeLimit == gasLimit }), ). Once(). Return(txmgr.Tx{ ID: 1, }, nil). Run(func(mock.Arguments) { ethTxCreated.ItHappened() })` $DIR/core/services/keeper/upkeep_executer_test.go: `ethTxCreated.ItHappened()` $DIR/core/services/keeper/upkeep_executer_test.go: `registryMock.MockMatchedResponse( "checkUpkeep", func(callArgs ethereum.CallMsg) bool { return callArgs.GasPrice == nil && callArgs.Gas == 0 }, checkUpkeepResponse, )` $DIR/core/services/keeper/upkeep_executer_test.go: `registryMock.MockMatchedResponse( "performUpkeep", func(callArgs ethereum.CallMsg) bool { return true }, checkPerformResponse, )` $DIR/core/services/keeper/upkeep_executer_test.go: `executer.OnNewLongestChain(testutils.Context(t), &head)` $DIR/core/services/keeper/upkeep_executer_test.go: `ethTxCreated.AwaitOrFail(t)` $DIR/core/services/keeper/upkeep_executer_test.go: `waitLastRunHeight(t, db, upkeep, 20)` $DIR/core/services/keeper/upkeep_executer_test.go: `t.Run("runs upkeep on triggering block number on EIP1559 and non-EIP1559 chains", func(t *testing.T) { runTest := func(t *testing.T, eip1559 bool) { db, config, ethMock, executer, registry, upkeep, job, jpv2, txm, _, _, _ := setup(t, mockEstimator(t), func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.EIP1559DynamicFees = &eip1559 c.EVM[0].ChainID = (*ubig.Big)(testutils.SimulatedChainID) }) gasLimit := uint64(5_000_000 + config.Keeper().Registry().PerformGasOverhead()) ethTxCreated := cltest.NewAwaiter() txm.On("CreateTransaction", mock.Anything, mock.MatchedBy(func(txRequest txmgr.TxRequest) bool { return txRequest.FeeLimit == gasLimit }), ). Once(). Return(txmgr.Tx{ ID: 1, }, nil). Run(func(mock.Arguments) { ethTxCreated.ItHappened() }) registryMock := cltest.NewContractMockReceiver(t, ethMock, keeper.Registry1_1ABI, registry.ContractAddress.Address()) registryMock.MockMatchedResponse( "checkUpkeep", func(callArgs ethereum.CallMsg) bool { return callArgs.GasPrice == nil && callArgs.Gas == 0 }, checkUpkeepResponse, ) registryMock.MockMatchedResponse( "performUpkeep", func(callArgs ethereum.CallMsg) bool { return true }, checkPerformResponse, ) head := newHead() executer.OnNewLongestChain(testutils.Context(t), &head) ethTxCreated.AwaitOrFail(t) runs := cltest.WaitForPipelineComplete(t, 0, job.ID, 1, taskRuns, jpv2.Jrm, time.Second, 100*time.Millisecond) require.Len(t, runs, 1) assert.False(t, runs[0].HasErrors()) assert.False(t, runs[0].HasFatalErrors()) waitLastRunHeight(t, db, upkeep, 20) } t.Run("EIP1559", func(t *testing.T) { runTest(t, true) }) t.Run("non-EIP1559", func(t *testing.T) { runTest(t, false) }) })` $DIR/core/services/keeper/upkeep_executer_test.go: `c.EVM[0].GasEstimator.EIP1559DynamicFees = &eip1559` $DIR/core/services/keeper/upkeep_executer_test.go: `c.EVM[0].ChainID = (*ubig.Big)(testutils.SimulatedChainID)` $DIR/core/services/keeper/upkeep_executer_test.go: `txm.On("CreateTransaction", mock.Anything, mock.MatchedBy(func(txRequest txmgr.TxRequest) bool { return txRequest.FeeLimit == gasLimit }), ). Once(). Return(txmgr.Tx{ ID: 1, }, nil). Run(func(mock.Arguments) { ethTxCreated.ItHappened() })` $DIR/core/services/keeper/upkeep_executer_test.go: `ethTxCreated.ItHappened()` $DIR/core/services/keeper/upkeep_executer_test.go: `registryMock.MockMatchedResponse( "checkUpkeep", func(callArgs ethereum.CallMsg) bool { return callArgs.GasPrice == nil && callArgs.Gas == 0 }, checkUpkeepResponse, )` $DIR/core/services/keeper/upkeep_executer_test.go: `registryMock.MockMatchedResponse( "performUpkeep", func(callArgs ethereum.CallMsg) bool { return true }, checkPerformResponse, )` $DIR/core/services/keeper/upkeep_executer_test.go: `executer.OnNewLongestChain(testutils.Context(t), &head)` $DIR/core/services/keeper/upkeep_executer_test.go: `ethTxCreated.AwaitOrFail(t)` $DIR/core/services/keeper/upkeep_executer_test.go: `waitLastRunHeight(t, db, upkeep, 20)` $DIR/core/services/keeper/upkeep_executer_test.go: `t.Run("EIP1559", func(t *testing.T) { runTest(t, true) })` $DIR/core/services/keeper/upkeep_executer_test.go: `runTest(t, true)` $DIR/core/services/keeper/upkeep_executer_test.go: `t.Run("non-EIP1559", func(t *testing.T) { runTest(t, false) })` $DIR/core/services/keeper/upkeep_executer_test.go: `runTest(t, false)` $DIR/core/services/keeper/upkeep_executer_test.go: `t.Run("errors if submission key not found", func(t *testing.T) { ctx := testutils.Context(t) _, _, ethMock, executer, registry, _, job, jpv2, _, keyStore, _, _ := setup(t, mockEstimator(t), func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].ChainID = (*ubig.Big)(testutils.SimulatedChainID) }) // replace expected key with random one _, err := keyStore.Eth().Create(ctx, testutils.SimulatedChainID) require.NoError(t, err) _, err = keyStore.Eth().Delete(ctx, job.KeeperSpec.FromAddress.Hex()) require.NoError(t, err) registryMock := cltest.NewContractMockReceiver(t, ethMock, keeper.Registry1_1ABI, registry.ContractAddress.Address()) registryMock.MockMatchedResponse( "checkUpkeep", func(callArgs ethereum.CallMsg) bool { return callArgs.GasPrice == nil && callArgs.Gas == 0 }, checkUpkeepResponse, ) registryMock.MockMatchedResponse( "performUpkeep", func(callArgs ethereum.CallMsg) bool { return true }, checkPerformResponse, ) head := newHead() executer.OnNewLongestChain(testutils.Context(t), &head) runs := cltest.WaitForPipelineError(t, 0, job.ID, 1, taskRuns, jpv2.Jrm, time.Second, 100*time.Millisecond) require.Len(t, runs, 1) assert.True(t, runs[0].HasErrors()) assert.True(t, runs[0].HasFatalErrors()) })` $DIR/core/services/keeper/upkeep_executer_test.go: `c.EVM[0].ChainID = (*ubig.Big)(testutils.SimulatedChainID)` $DIR/core/services/keeper/upkeep_executer_test.go: `_, err = keyStore.Eth().Delete(ctx, job.KeeperSpec.FromAddress.Hex())` $DIR/core/services/keeper/upkeep_executer_test.go: `registryMock.MockMatchedResponse( "checkUpkeep", func(callArgs ethereum.CallMsg) bool { return callArgs.GasPrice == nil && callArgs.Gas == 0 }, checkUpkeepResponse, )` $DIR/core/services/keeper/upkeep_executer_test.go: `registryMock.MockMatchedResponse( "performUpkeep", func(callArgs ethereum.CallMsg) bool { return true }, checkPerformResponse, )` $DIR/core/services/keeper/upkeep_executer_test.go: `executer.OnNewLongestChain(testutils.Context(t), &head)` $DIR/core/services/keeper/upkeep_executer_test.go: `t.Run("errors if submission chain not found", func(t *testing.T) { db, cfg, ethMock, _, _, _, _, jpv2, _, keyStore, ch, orm := setup(t, mockEstimator(t), nil) registry, jb := cltest.MustInsertKeeperRegistry(t, db, orm, keyStore.Eth(), 0, 1, 20) // change chain ID to non-configured chain jb.KeeperSpec.EVMChainID = (*ubig.Big)(big.NewInt(999)) cltest.MustInsertUpkeepForRegistry(t, db, registry) lggr := logger.TestLogger(t) executer := keeper.NewUpkeepExecuter(jb, orm, jpv2.Pr, ethMock, ch.HeadBroadcaster(), ch.GasEstimator(), lggr, cfg.Keeper(), jb.KeeperSpec.FromAddress.Address()) err := executer.Start(testutils.Context(t)) require.NoError(t, err) head := newHead() executer.OnNewLongestChain(testutils.Context(t), &head) // TODO we want to see an errored run result once this is completed // https://smartcontract-it.atlassian.net/browse/ARCHIVE-22186 cltest.AssertPipelineRunsStays(t, jb.PipelineSpecID, db, 0) })` $DIR/core/services/keeper/upkeep_executer_test.go: `jb.KeeperSpec.EVMChainID = (*ubig.Big)(big.NewInt(999))` $DIR/core/services/keeper/upkeep_executer_test.go: `cltest.MustInsertUpkeepForRegistry(t, db, registry)` $DIR/core/services/keeper/upkeep_executer_test.go: `executer.OnNewLongestChain(testutils.Context(t), &head)` $DIR/core/services/keeper/upkeep_executer_test.go: `cltest.AssertPipelineRunsStays(t, jb.PipelineSpecID, db, 0)` $DIR/core/services/keeper/upkeep_executer_test.go: `c.EVM[0].ChainID = (*ubig.Big)(testutils.SimulatedChainID)` $DIR/core/services/keeper/upkeep_executer_test.go: `txm.On("CreateTransaction", mock.Anything, mock.MatchedBy(func(txRequest txmgr.TxRequest) bool { return txRequest.FeeLimit == gasLimit }), ). Once(). Return(txmgr.Tx{}, nil). Run(func(mock.Arguments) { etxs[0].ItHappened() })` $DIR/core/services/keeper/upkeep_executer_test.go: `etxs[0].ItHappened()` $DIR/core/services/keeper/upkeep_executer_test.go: `registryMock.MockResponse("checkUpkeep", checkUpkeepResponse)` $DIR/core/services/keeper/upkeep_executer_test.go: `registryMock.MockMatchedResponse( "performUpkeep", func(callArgs ethereum.CallMsg) bool { return true }, checkPerformResponse, )` $DIR/core/services/keeper/upkeep_executer_test.go: `executer.OnNewLongestChain(testutils.Context(t), head)` $DIR/core/services/keeper/upkeep_executer_test.go: `etxs[0].AwaitOrFail(t)` $DIR/core/services/keeper/upkeep_executer_test.go: `waitLastRunHeight(t, db, upkeep, 36)` $DIR/core/services/keeper/upkeep_executer_test.go: `c.EVM[0].ChainID = (*ubig.Big)(testutils.SimulatedChainID)` $DIR/core/services/keeper/upkeep_executer_test.go: `registryMock.MockRevertResponse("checkUpkeep").Run(func(args mock.Arguments) { wasCalled.Store(true) })` $DIR/core/services/keeper/upkeep_executer_test.go: `wasCalled.Store(true)` $DIR/core/services/keeper/upkeep_executer_test.go: `executer.OnNewLongestChain(testutils.Context(t), &head)` $DIR/core/services/keeper/upkeep_executer_test.go: `g.Eventually(wasCalled.Load).Should(gomega.Equal(true))` $DIR/core/services/keeper/upkeep_executer_test.go: `.Start(testutils.Context(t))` $DIR/core/services/keeper/upkeep_executer_test.go: `.Context(t)` $DIR/core/services/keeper/upkeep_executer_test.go: `.Run("runs upkeep on triggering block number", func(t *testing.T) { db, config, ethMock, executer, registry, upkeep, job, jpv2, txm, _, _, _ := setup(t, mockEstimator(t), func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].ChainID = (*ubig.Big)(testutils.SimulatedChainID) }) gasLimit := uint64(5_000_000 + config.Keeper().Registry().PerformGasOverhead()) ethTxCreated := cltest.NewAwaiter() txm.On("CreateTransaction", mock.Anything, mock.MatchedBy(func(txRequest txmgr.TxRequest) bool { return txRequest.FeeLimit == gasLimit }), ). Once(). Return(txmgr.Tx{ ID: 1, }, nil). Run(func(mock.Arguments) { ethTxCreated.ItHappened() }) registryMock := cltest.NewContractMockReceiver(t, ethMock, keeper.Registry1_1ABI, registry.ContractAddress.Address()) registryMock.MockMatchedResponse( "checkUpkeep", func(callArgs ethereum.CallMsg) bool { return callArgs.GasPrice == nil && callArgs.Gas == 0 }, checkUpkeepResponse, ) registryMock.MockMatchedResponse( "performUpkeep", func(callArgs ethereum.CallMsg) bool { return true }, checkPerformResponse, ) head := newHead() executer.OnNewLongestChain(testutils.Context(t), &head) ethTxCreated.AwaitOrFail(t) runs := cltest.WaitForPipelineComplete(t, 0, job.ID, 1, taskRuns, jpv2.Jrm, time.Second, 100*time.Millisecond) require.Len(t, runs, 1) assert.False(t, runs[0].HasErrors()) assert.False(t, runs[0].HasFatalErrors()) waitLastRunHeight(t, db, upkeep, 20) })` $DIR/core/services/keeper/upkeep_executer_test.go: `.Keeper()` $DIR/core/services/keeper/upkeep_executer_test.go: `.Registry()` $DIR/core/services/keeper/upkeep_executer_test.go: `.PerformGasOverhead()` $DIR/core/services/keeper/upkeep_executer_test.go: `.NewAwaiter()` $DIR/core/services/keeper/upkeep_executer_test.go: `.On("CreateTransaction", mock.Anything, mock.MatchedBy(func(txRequest txmgr.TxRequest) bool { return txRequest.FeeLimit == gasLimit }), )` $DIR/core/services/keeper/upkeep_executer_test.go: `.MatchedBy(func(txRequest txmgr.TxRequest) bool { return txRequest.FeeLimit == gasLimit })` $DIR/core/services/keeper/upkeep_executer_test.go: `. Once()` $DIR/core/services/keeper/upkeep_executer_test.go: `. Return(txmgr.Tx{ ID: 1, }, nil)` $DIR/core/services/keeper/upkeep_executer_test.go: `. Run(func(mock.Arguments) { ethTxCreated.ItHappened() })` $DIR/core/services/keeper/upkeep_executer_test.go: `.ItHappened()` $DIR/core/services/keeper/upkeep_executer_test.go: `.NewContractMockReceiver(t, ethMock, keeper.Registry1_1ABI, registry.ContractAddress.Address())` $DIR/core/services/keeper/upkeep_executer_test.go: `.ContractAddress.Address()` $DIR/core/services/keeper/upkeep_executer_test.go: `.MockMatchedResponse( "checkUpkeep", func(callArgs ethereum.CallMsg) bool { return callArgs.GasPrice == nil && callArgs.Gas == 0 }, checkUpkeepResponse, )` $DIR/core/services/keeper/upkeep_executer_test.go: `.MockMatchedResponse( "performUpkeep", func(callArgs ethereum.CallMsg) bool { return true }, checkPerformResponse, )` $DIR/core/services/keeper/upkeep_executer_test.go: `.OnNewLongestChain(testutils.Context(t), &head)` $DIR/core/services/keeper/upkeep_executer_test.go: `.Context(t)` $DIR/core/services/keeper/upkeep_executer_test.go: `.AwaitOrFail(t)` $DIR/core/services/keeper/upkeep_executer_test.go: `.WaitForPipelineComplete(t, 0, job.ID, 1, taskRuns, jpv2.Jrm, time.Second, 100*time.Millisecond)` $DIR/core/services/keeper/upkeep_executer_test.go: `.Run("runs upkeep on triggering block number on EIP1559 and non-EIP1559 chains", func(t *testing.T) { runTest := func(t *testing.T, eip1559 bool) { db, config, ethMock, executer, registry, upkeep, job, jpv2, txm, _, _, _ := setup(t, mockEstimator(t), func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.EIP1559DynamicFees = &eip1559 c.EVM[0].ChainID = (*ubig.Big)(testutils.SimulatedChainID) }) gasLimit := uint64(5_000_000 + config.Keeper().Registry().PerformGasOverhead()) ethTxCreated := cltest.NewAwaiter() txm.On("CreateTransaction", mock.Anything, mock.MatchedBy(func(txRequest txmgr.TxRequest) bool { return txRequest.FeeLimit == gasLimit }), ). Once(). Return(txmgr.Tx{ ID: 1, }, nil). Run(func(mock.Arguments) { ethTxCreated.ItHappened() }) registryMock := cltest.NewContractMockReceiver(t, ethMock, keeper.Registry1_1ABI, registry.ContractAddress.Address()) registryMock.MockMatchedResponse( "checkUpkeep", func(callArgs ethereum.CallMsg) bool { return callArgs.GasPrice == nil && callArgs.Gas == 0 }, checkUpkeepResponse, ) registryMock.MockMatchedResponse( "performUpkeep", func(callArgs ethereum.CallMsg) bool { return true }, checkPerformResponse, ) head := newHead() executer.OnNewLongestChain(testutils.Context(t), &head) ethTxCreated.AwaitOrFail(t) runs := cltest.WaitForPipelineComplete(t, 0, job.ID, 1, taskRuns, jpv2.Jrm, time.Second, 100*time.Millisecond) require.Len(t, runs, 1) assert.False(t, runs[0].HasErrors()) assert.False(t, runs[0].HasFatalErrors()) waitLastRunHeight(t, db, upkeep, 20) } t.Run("EIP1559", func(t *testing.T) { runTest(t, true) }) t.Run("non-EIP1559", func(t *testing.T) { runTest(t, false) }) })` $DIR/core/services/keeper/upkeep_executer_test.go: `.Keeper()` $DIR/core/services/keeper/upkeep_executer_test.go: `.Registry()` $DIR/core/services/keeper/upkeep_executer_test.go: `.PerformGasOverhead()` $DIR/core/services/keeper/upkeep_executer_test.go: `.NewAwaiter()` $DIR/core/services/keeper/upkeep_executer_test.go: `.On("CreateTransaction", mock.Anything, mock.MatchedBy(func(txRequest txmgr.TxRequest) bool { return txRequest.FeeLimit == gasLimit }), )` $DIR/core/services/keeper/upkeep_executer_test.go: `.MatchedBy(func(txRequest txmgr.TxRequest) bool { return txRequest.FeeLimit == gasLimit })` $DIR/core/services/keeper/upkeep_executer_test.go: `. Once()` $DIR/core/services/keeper/upkeep_executer_test.go: `. Return(txmgr.Tx{ ID: 1, }, nil)` $DIR/core/services/keeper/upkeep_executer_test.go: `. Run(func(mock.Arguments) { ethTxCreated.ItHappened() })` $DIR/core/services/keeper/upkeep_executer_test.go: `.ItHappened()` $DIR/core/services/keeper/upkeep_executer_test.go: `.NewContractMockReceiver(t, ethMock, keeper.Registry1_1ABI, registry.ContractAddress.Address())` $DIR/core/services/keeper/upkeep_executer_test.go: `.ContractAddress.Address()` $DIR/core/services/keeper/upkeep_executer_test.go: `.MockMatchedResponse( "checkUpkeep", func(callArgs ethereum.CallMsg) bool { return callArgs.GasPrice == nil && callArgs.Gas == 0 }, checkUpkeepResponse, )` $DIR/core/services/keeper/upkeep_executer_test.go: `.MockMatchedResponse( "performUpkeep", func(callArgs ethereum.CallMsg) bool { return true }, checkPerformResponse, )` $DIR/core/services/keeper/upkeep_executer_test.go: `.OnNewLongestChain(testutils.Context(t), &head)` $DIR/core/services/keeper/upkeep_executer_test.go: `.Context(t)` $DIR/core/services/keeper/upkeep_executer_test.go: `.AwaitOrFail(t)` $DIR/core/services/keeper/upkeep_executer_test.go: `.WaitForPipelineComplete(t, 0, job.ID, 1, taskRuns, jpv2.Jrm, time.Second, 100*time.Millisecond)` $DIR/core/services/keeper/upkeep_executer_test.go: `.Run("EIP1559", func(t *testing.T) { runTest(t, true) })` $DIR/core/services/keeper/upkeep_executer_test.go: `.Run("non-EIP1559", func(t *testing.T) { runTest(t, false) })` $DIR/core/services/keeper/upkeep_executer_test.go: `.Run("errors if submission key not found", func(t *testing.T) { ctx := testutils.Context(t) _, _, ethMock, executer, registry, _, job, jpv2, _, keyStore, _, _ := setup(t, mockEstimator(t), func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].ChainID = (*ubig.Big)(testutils.SimulatedChainID) }) // replace expected key with random one _, err := keyStore.Eth().Create(ctx, testutils.SimulatedChainID) require.NoError(t, err) _, err = keyStore.Eth().Delete(ctx, job.KeeperSpec.FromAddress.Hex()) require.NoError(t, err) registryMock := cltest.NewContractMockReceiver(t, ethMock, keeper.Registry1_1ABI, registry.ContractAddress.Address()) registryMock.MockMatchedResponse( "checkUpkeep", func(callArgs ethereum.CallMsg) bool { return callArgs.GasPrice == nil && callArgs.Gas == 0 }, checkUpkeepResponse, ) registryMock.MockMatchedResponse( "performUpkeep", func(callArgs ethereum.CallMsg) bool { return true }, checkPerformResponse, ) head := newHead() executer.OnNewLongestChain(testutils.Context(t), &head) runs := cltest.WaitForPipelineError(t, 0, job.ID, 1, taskRuns, jpv2.Jrm, time.Second, 100*time.Millisecond) require.Len(t, runs, 1) assert.True(t, runs[0].HasErrors()) assert.True(t, runs[0].HasFatalErrors()) })` $DIR/core/services/keeper/upkeep_executer_test.go: `.Context(t)` $DIR/core/services/keeper/upkeep_executer_test.go: `.Eth()` $DIR/core/services/keeper/upkeep_executer_test.go: `.Create(ctx, testutils.SimulatedChainID)` $DIR/core/services/keeper/upkeep_executer_test.go: `.Eth()` $DIR/core/services/keeper/upkeep_executer_test.go: `.Delete(ctx, job.KeeperSpec.FromAddress.Hex())` $DIR/core/services/keeper/upkeep_executer_test.go: `.KeeperSpec.FromAddress.Hex()` $DIR/core/services/keeper/upkeep_executer_test.go: `.NewContractMockReceiver(t, ethMock, keeper.Registry1_1ABI, registry.ContractAddress.Address())` $DIR/core/services/keeper/upkeep_executer_test.go: `.ContractAddress.Address()` $DIR/core/services/keeper/upkeep_executer_test.go: `.MockMatchedResponse( "checkUpkeep", func(callArgs ethereum.CallMsg) bool { return callArgs.GasPrice == nil && callArgs.Gas == 0 }, checkUpkeepResponse, )` $DIR/core/services/keeper/upkeep_executer_test.go: `.MockMatchedResponse( "performUpkeep", func(callArgs ethereum.CallMsg) bool { return true }, checkPerformResponse, )` $DIR/core/services/keeper/upkeep_executer_test.go: `.OnNewLongestChain(testutils.Context(t), &head)` $DIR/core/services/keeper/upkeep_executer_test.go: `.Context(t)` $DIR/core/services/keeper/upkeep_executer_test.go: `.WaitForPipelineError(t, 0, job.ID, 1, taskRuns, jpv2.Jrm, time.Second, 100*time.Millisecond)` $DIR/core/services/keeper/upkeep_executer_test.go: `.Run("errors if submission chain not found", func(t *testing.T) { db, cfg, ethMock, _, _, _, _, jpv2, _, keyStore, ch, orm := setup(t, mockEstimator(t), nil) registry, jb := cltest.MustInsertKeeperRegistry(t, db, orm, keyStore.Eth(), 0, 1, 20) // change chain ID to non-configured chain jb.KeeperSpec.EVMChainID = (*ubig.Big)(big.NewInt(999)) cltest.MustInsertUpkeepForRegistry(t, db, registry) lggr := logger.TestLogger(t) executer := keeper.NewUpkeepExecuter(jb, orm, jpv2.Pr, ethMock, ch.HeadBroadcaster(), ch.GasEstimator(), lggr, cfg.Keeper(), jb.KeeperSpec.FromAddress.Address()) err := executer.Start(testutils.Context(t)) require.NoError(t, err) head := newHead() executer.OnNewLongestChain(testutils.Context(t), &head) // TODO we want to see an errored run result once this is completed // https://smartcontract-it.atlassian.net/browse/ARCHIVE-22186 cltest.AssertPipelineRunsStays(t, jb.PipelineSpecID, db, 0) })` $DIR/core/services/keeper/upkeep_executer_test.go: `.MustInsertKeeperRegistry(t, db, orm, keyStore.Eth(), 0, 1, 20)` $DIR/core/services/keeper/upkeep_executer_test.go: `.Eth()` $DIR/core/services/keeper/upkeep_executer_test.go: `.NewInt(999)` $DIR/core/services/keeper/upkeep_executer_test.go: `.MustInsertUpkeepForRegistry(t, db, registry)` $DIR/core/services/keeper/upkeep_executer_test.go: `.TestLogger(t)` $DIR/core/services/keeper/upkeep_executer_test.go: `.NewUpkeepExecuter(jb, orm, jpv2.Pr, ethMock, ch.HeadBroadcaster(), ch.GasEstimator(), lggr, cfg.Keeper(), jb.KeeperSpec.FromAddress.Address())` $DIR/core/services/keeper/upkeep_executer_test.go: `.HeadBroadcaster()` $DIR/core/services/keeper/upkeep_executer_test.go: `.GasEstimator()` $DIR/core/services/keeper/upkeep_executer_test.go: `.Keeper()` $DIR/core/services/keeper/upkeep_executer_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/upkeep_executer_test.go: `.Start(testutils.Context(t))` $DIR/core/services/keeper/upkeep_executer_test.go: `.Context(t)` $DIR/core/services/keeper/upkeep_executer_test.go: `.OnNewLongestChain(testutils.Context(t), &head)` $DIR/core/services/keeper/upkeep_executer_test.go: `.Context(t)` $DIR/core/services/keeper/upkeep_executer_test.go: `.AssertPipelineRunsStays(t, jb.PipelineSpecID, db, 0)` $DIR/core/services/keeper/upkeep_executer_test.go: `.NewAwaiter()` $DIR/core/services/keeper/upkeep_executer_test.go: `.NewAwaiter()` $DIR/core/services/keeper/upkeep_executer_test.go: `.Keeper()` $DIR/core/services/keeper/upkeep_executer_test.go: `.Registry()` $DIR/core/services/keeper/upkeep_executer_test.go: `.PerformGasOverhead()` $DIR/core/services/keeper/upkeep_executer_test.go: `.On("CreateTransaction", mock.Anything, mock.MatchedBy(func(txRequest txmgr.TxRequest) bool { return txRequest.FeeLimit == gasLimit }), )` $DIR/core/services/keeper/upkeep_executer_test.go: `.MatchedBy(func(txRequest txmgr.TxRequest) bool { return txRequest.FeeLimit == gasLimit })` $DIR/core/services/keeper/upkeep_executer_test.go: `. Once()` $DIR/core/services/keeper/upkeep_executer_test.go: `. Return(txmgr.Tx{}, nil)` $DIR/core/services/keeper/upkeep_executer_test.go: `. Run(func(mock.Arguments) { etxs[0].ItHappened() })` $DIR/core/services/keeper/upkeep_executer_test.go: `.ItHappened()` $DIR/core/services/keeper/upkeep_executer_test.go: `.NewContractMockReceiver(t, ethMock, keeper.Registry1_1ABI, registry.ContractAddress.Address())` $DIR/core/services/keeper/upkeep_executer_test.go: `.ContractAddress.Address()` $DIR/core/services/keeper/upkeep_executer_test.go: `.MockResponse("checkUpkeep", checkUpkeepResponse)` $DIR/core/services/keeper/upkeep_executer_test.go: `.MockMatchedResponse( "performUpkeep", func(callArgs ethereum.CallMsg) bool { return true }, checkPerformResponse, )` $DIR/core/services/keeper/upkeep_executer_test.go: `.Head(36)` $DIR/core/services/keeper/upkeep_executer_test.go: `.OnNewLongestChain(testutils.Context(t), head)` $DIR/core/services/keeper/upkeep_executer_test.go: `.Context(t)` $DIR/core/services/keeper/upkeep_executer_test.go: `.WaitForPipelineComplete(t, 0, job.ID, 1, taskRuns, jpv2.Jrm, time.Second, 100*time.Millisecond)` $DIR/core/services/keeper/upkeep_executer_test.go: `.AwaitOrFail(t)` $DIR/core/services/keeper/upkeep_executer_test.go: `.NewWithT(t)` $DIR/core/services/keeper/upkeep_executer_test.go: `.NewContractMockReceiver(t, ethMock, keeper.Registry1_1ABI, registry.ContractAddress.Address())` $DIR/core/services/keeper/upkeep_executer_test.go: `.ContractAddress.Address()` $DIR/core/services/keeper/upkeep_executer_test.go: `.MockRevertResponse("checkUpkeep")` $DIR/core/services/keeper/upkeep_executer_test.go: `.Run(func(args mock.Arguments) { wasCalled.Store(true) })` $DIR/core/services/keeper/upkeep_executer_test.go: `.Store(true)` $DIR/core/services/keeper/upkeep_executer_test.go: `.OnNewLongestChain(testutils.Context(t), &head)` $DIR/core/services/keeper/upkeep_executer_test.go: `.Context(t)` $DIR/core/services/keeper/upkeep_executer_test.go: `.Eventually(wasCalled.Load)` $DIR/core/services/keeper/upkeep_executer_test.go: `.Should(gomega.Equal(true))` $DIR/core/services/keeper/upkeep_executer_test.go: `.Equal(true)` $DIR/core/services/keeper/upkeep_executer_test.go: `.NewTxStore(db, logger.TestLogger(t))` $DIR/core/services/keeper/upkeep_executer_test.go: `.TestLogger(t)` $DIR/core/services/keeper/upkeep_executer_test.go: `.GetAllTxes(testutils.Context(t))` $DIR/core/services/keeper/upkeep_executer_test.go: `.Context(t)` $DIR/core/services/keeper/upkeep_executer_unit_test.go: `.EIP55Address(testutils.NewAddress().Hex())` $DIR/core/services/keeper/upkeep_executer_unit_test.go: `.NewAddress()` $DIR/core/services/keeper/upkeep_executer_unit_test.go: `.Hex()` $DIR/core/services/keeper/upkeep_executer_unit_test.go: `.EIP55Address(testutils.NewAddress().Hex())` $DIR/core/services/keeper/upkeep_executer_unit_test.go: `.NewAddress()` $DIR/core/services/keeper/upkeep_executer_unit_test.go: `.Hex()` $DIR/core/services/keeper/upkeep_executer_unit_test.go: `.NewI(4)` $DIR/core/services/keeper/upkeep_executer_unit_test.go: `.NewWeiI(24)` $DIR/core/services/keeper/upkeep_executer_unit_test.go: `.NewWeiI(48)` $DIR/core/services/keeper/upkeep_executer_unit_test.go: `.NewWeiI(72)` $DIR/core/services/keeper/upkeep_executer_unit_test.go: `.KeeperSpec.FromAddress.Address()` $DIR/core/services/keeper/upkeep_executer_unit_test.go: `.String()` $DIR/core/services/keeper/upkeep_executer_unit_test.go: `.KeeperSpec.FromAddress.String()` $DIR/core/services/keeper/upkeep_executer_unit_test.go: `.String()` $DIR/core/services/keeper/upkeep_executer_unit_test.go: `.Sprintf("UPx%064d", 4)` $DIR/core/services/keeper/upkeep_executer_unit_test.go: `.ToInt()` $DIR/core/services/keeper/upkeep_executer_unit_test.go: `.ToInt()` $DIR/core/services/keeper/upkeep_executer_unit_test.go: `.ToInt()` $DIR/core/services/keeper/validate_test.go: `t.Run(tt.name, func(t *testing.T) { got, err := ValidatedKeeperSpec(tt.args.tomlString) if tt.wantErr { require.Error(t, err) return } require.NoError(t, err) require.Equal(t, tt.want.id, got.ID) require.Equal(t, tt.want.contractAddr, got.KeeperSpec.ContractAddress.Hex()) require.Equal(t, tt.want.fromAddr, got.KeeperSpec.FromAddress.Hex()) require.Equal(t, tt.want.createdAt, got.KeeperSpec.CreatedAt) require.Equal(t, tt.want.updatedAt, got.KeeperSpec.UpdatedAt) })` $DIR/core/services/keeper/validate_test.go: `.Run(tt.name, func(t *testing.T) { got, err := ValidatedKeeperSpec(tt.args.tomlString) if tt.wantErr { require.Error(t, err) return } require.NoError(t, err) require.Equal(t, tt.want.id, got.ID) require.Equal(t, tt.want.contractAddr, got.KeeperSpec.ContractAddress.Hex()) require.Equal(t, tt.want.fromAddr, got.KeeperSpec.FromAddress.Hex()) require.Equal(t, tt.want.createdAt, got.KeeperSpec.CreatedAt) require.Equal(t, tt.want.updatedAt, got.KeeperSpec.UpdatedAt) })` $DIR/core/services/keystore/cosmos_test.go: `keyStore.ResetXXXTestOnly()` $DIR/core/services/keystore/cosmos_test.go: `t.Run("initializes with an empty state", func(t *testing.T) { defer reset() keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) })` $DIR/core/services/keystore/cosmos_test.go: `t.Run("errors when getting non-existent ID", func(t *testing.T) { defer reset() _, err := ks.Get("non-existent-id") require.Error(t, err) })` $DIR/core/services/keystore/cosmos_test.go: `t.Run("creates a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, key, retrievedKey) })` $DIR/core/services/keystore/cosmos_test.go: `t.Run("imports and exports a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) exportJSON, err := ks.Export(key.ID(), cltest.Password) require.NoError(t, err) _, err = ks.Export("non-existent", cltest.Password) assert.Error(t, err) _, err = ks.Delete(ctx, key.ID()) require.NoError(t, err) _, err = ks.Get(key.ID()) require.Error(t, err) importedKey, err := ks.Import(ctx, exportJSON, cltest.Password) require.NoError(t, err) _, err = ks.Import(ctx, exportJSON, cltest.Password) assert.Error(t, err) _, err = ks.Import(ctx, []byte(""), cltest.Password) assert.Error(t, err) require.Equal(t, key.ID(), importedKey.ID()) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, importedKey, retrievedKey) })` $DIR/core/services/keystore/cosmos_test.go: `_, err = ks.Export("non-existent", cltest.Password)` $DIR/core/services/keystore/cosmos_test.go: `_, err = ks.Delete(ctx, key.ID())` $DIR/core/services/keystore/cosmos_test.go: `_, err = ks.Get(key.ID())` $DIR/core/services/keystore/cosmos_test.go: `_, err = ks.Import(ctx, exportJSON, cltest.Password)` $DIR/core/services/keystore/cosmos_test.go: `_, err = ks.Import(ctx, []byte(""), cltest.Password)` $DIR/core/services/keystore/cosmos_test.go: `t.Run("adds an externally created key / deletes a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) newKey := cosmoskey.New() err := ks.Add(ctx, newKey) require.NoError(t, err) err = ks.Add(ctx, newKey) assert.Error(t, err) keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 1, len(keys)) _, err = ks.Delete(ctx, newKey.ID()) require.NoError(t, err) _, err = ks.Delete(ctx, newKey.ID()) assert.Error(t, err) keys, err = ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) _, err = ks.Get(newKey.ID()) require.Error(t, err) })` $DIR/core/services/keystore/cosmos_test.go: `err = ks.Add(ctx, newKey)` $DIR/core/services/keystore/cosmos_test.go: `_, err = ks.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/cosmos_test.go: `_, err = ks.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/cosmos_test.go: `keys, err = ks.GetAll()` $DIR/core/services/keystore/cosmos_test.go: `_, err = ks.Get(newKey.ID())` $DIR/core/services/keystore/cosmos_test.go: `err = ks.EnsureKey(ctx)` $DIR/core/services/keystore/cosmos_test.go: `.NewSqlxDB(t)` $DIR/core/services/keystore/cosmos_test.go: `.ExposedNewMaster(t, db)` $DIR/core/services/keystore/cosmos_test.go: `.Cosmos()` $DIR/core/services/keystore/cosmos_test.go: `.Background()` $DIR/core/services/keystore/cosmos_test.go: `.ResetXXXTestOnly()` $DIR/core/services/keystore/cosmos_test.go: `.Run("initializes with an empty state", func(t *testing.T) { defer reset() keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) })` $DIR/core/services/keystore/cosmos_test.go: `.GetAll()` $DIR/core/services/keystore/cosmos_test.go: `.Run("errors when getting non-existent ID", func(t *testing.T) { defer reset() _, err := ks.Get("non-existent-id") require.Error(t, err) })` $DIR/core/services/keystore/cosmos_test.go: `.Get("non-existent-id")` $DIR/core/services/keystore/cosmos_test.go: `.Run("creates a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, key, retrievedKey) })` $DIR/core/services/keystore/cosmos_test.go: `.Context(t)` $DIR/core/services/keystore/cosmos_test.go: `.Create(ctx)` $DIR/core/services/keystore/cosmos_test.go: `.Get(key.ID())` $DIR/core/services/keystore/cosmos_test.go: `.ID()` $DIR/core/services/keystore/cosmos_test.go: `.Run("imports and exports a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) exportJSON, err := ks.Export(key.ID(), cltest.Password) require.NoError(t, err) _, err = ks.Export("non-existent", cltest.Password) assert.Error(t, err) _, err = ks.Delete(ctx, key.ID()) require.NoError(t, err) _, err = ks.Get(key.ID()) require.Error(t, err) importedKey, err := ks.Import(ctx, exportJSON, cltest.Password) require.NoError(t, err) _, err = ks.Import(ctx, exportJSON, cltest.Password) assert.Error(t, err) _, err = ks.Import(ctx, []byte(""), cltest.Password) assert.Error(t, err) require.Equal(t, key.ID(), importedKey.ID()) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, importedKey, retrievedKey) })` $DIR/core/services/keystore/cosmos_test.go: `.Context(t)` $DIR/core/services/keystore/cosmos_test.go: `.Create(ctx)` $DIR/core/services/keystore/cosmos_test.go: `.Export(key.ID(), cltest.Password)` $DIR/core/services/keystore/cosmos_test.go: `.ID()` $DIR/core/services/keystore/cosmos_test.go: `.Export("non-existent", cltest.Password)` $DIR/core/services/keystore/cosmos_test.go: `.Delete(ctx, key.ID())` $DIR/core/services/keystore/cosmos_test.go: `.ID()` $DIR/core/services/keystore/cosmos_test.go: `.Get(key.ID())` $DIR/core/services/keystore/cosmos_test.go: `.ID()` $DIR/core/services/keystore/cosmos_test.go: `.Import(ctx, exportJSON, cltest.Password)` $DIR/core/services/keystore/cosmos_test.go: `.Import(ctx, exportJSON, cltest.Password)` $DIR/core/services/keystore/cosmos_test.go: `.Import(ctx, []byte(""), cltest.Password)` $DIR/core/services/keystore/cosmos_test.go: `.Get(key.ID())` $DIR/core/services/keystore/cosmos_test.go: `.ID()` $DIR/core/services/keystore/cosmos_test.go: `.Run("adds an externally created key / deletes a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) newKey := cosmoskey.New() err := ks.Add(ctx, newKey) require.NoError(t, err) err = ks.Add(ctx, newKey) assert.Error(t, err) keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 1, len(keys)) _, err = ks.Delete(ctx, newKey.ID()) require.NoError(t, err) _, err = ks.Delete(ctx, newKey.ID()) assert.Error(t, err) keys, err = ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) _, err = ks.Get(newKey.ID()) require.Error(t, err) })` $DIR/core/services/keystore/cosmos_test.go: `.Context(t)` $DIR/core/services/keystore/cosmos_test.go: `.New()` $DIR/core/services/keystore/cosmos_test.go: `.Add(ctx, newKey)` $DIR/core/services/keystore/cosmos_test.go: `.Add(ctx, newKey)` $DIR/core/services/keystore/cosmos_test.go: `.GetAll()` $DIR/core/services/keystore/cosmos_test.go: `.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/cosmos_test.go: `.ID()` $DIR/core/services/keystore/cosmos_test.go: `.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/cosmos_test.go: `.ID()` $DIR/core/services/keystore/cosmos_test.go: `.GetAll()` $DIR/core/services/keystore/cosmos_test.go: `.Get(newKey.ID())` $DIR/core/services/keystore/cosmos_test.go: `.ID()` $DIR/core/services/keystore/cosmos_test.go: `.Context(t)` $DIR/core/services/keystore/cosmos_test.go: `.EnsureKey(ctx)` $DIR/core/services/keystore/cosmos_test.go: `.EnsureKey(ctx)` $DIR/core/services/keystore/cosmos_test.go: `.GetAll()` $DIR/core/services/keystore/csa_test.go: `keyStore.ResetXXXTestOnly()` $DIR/core/services/keystore/csa_test.go: `t.Run("initializes with an empty state", func(t *testing.T) { defer reset() keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) })` $DIR/core/services/keystore/csa_test.go: `t.Run("errors when getting non-existent ID", func(t *testing.T) { defer reset() _, err := ks.Get("non-existent-id") require.Error(t, err) })` $DIR/core/services/keystore/csa_test.go: `t.Run("creates a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, key, retrievedKey) t.Run("prevents creating more than one key", func(t *testing.T) { ctx := testutils.Context(t) k, err2 := ks.Create(ctx) assert.Zero(t, k) assert.Error(t, err2) assert.True(t, errors.Is(err2, keystore.ErrCSAKeyExists)) }) })` $DIR/core/services/keystore/csa_test.go: `t.Run("prevents creating more than one key", func(t *testing.T) { ctx := testutils.Context(t) k, err2 := ks.Create(ctx) assert.Zero(t, k) assert.Error(t, err2) assert.True(t, errors.Is(err2, keystore.ErrCSAKeyExists)) })` $DIR/core/services/keystore/csa_test.go: `t.Run("imports and exports a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) exportJSON, err := ks.Export(key.ID(), cltest.Password) require.NoError(t, err) _, err = ks.Delete(ctx, key.ID()) require.NoError(t, err) _, err = ks.Get(key.ID()) require.Error(t, err) importedKey, err := ks.Import(ctx, exportJSON, cltest.Password) require.NoError(t, err) require.Equal(t, key.ID(), importedKey.ID()) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, importedKey, retrievedKey) t.Run("prevents importing more than one key", func(t *testing.T) { k, err2 := ks.Import(testutils.Context(t), exportJSON, cltest.Password) assert.Zero(t, k) assert.Error(t, err2) assert.Equal(t, fmt.Sprintf("key with ID %s already exists", key.ID()), err2.Error()) }) t.Run("fails to import malformed key", func(t *testing.T) { k, err2 := ks.Import(testutils.Context(t), []byte(""), cltest.Password) assert.Zero(t, k) assert.Error(t, err2) }) t.Run("fails to export non-existent key", func(t *testing.T) { exportJSON, err = ks.Export("non-existent", cltest.Password) assert.Error(t, err) assert.Empty(t, exportJSON) }) })` $DIR/core/services/keystore/csa_test.go: `_, err = ks.Delete(ctx, key.ID())` $DIR/core/services/keystore/csa_test.go: `_, err = ks.Get(key.ID())` $DIR/core/services/keystore/csa_test.go: `t.Run("prevents importing more than one key", func(t *testing.T) { k, err2 := ks.Import(testutils.Context(t), exportJSON, cltest.Password) assert.Zero(t, k) assert.Error(t, err2) assert.Equal(t, fmt.Sprintf("key with ID %s already exists", key.ID()), err2.Error()) })` $DIR/core/services/keystore/csa_test.go: `t.Run("fails to import malformed key", func(t *testing.T) { k, err2 := ks.Import(testutils.Context(t), []byte(""), cltest.Password) assert.Zero(t, k) assert.Error(t, err2) })` $DIR/core/services/keystore/csa_test.go: `t.Run("fails to export non-existent key", func(t *testing.T) { exportJSON, err = ks.Export("non-existent", cltest.Password) assert.Error(t, err) assert.Empty(t, exportJSON) })` $DIR/core/services/keystore/csa_test.go: `exportJSON, err = ks.Export("non-existent", cltest.Password)` $DIR/core/services/keystore/csa_test.go: `t.Run("adds an externally created key / deletes a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) newKey, err := csakey.NewV2() require.NoError(t, err) err = ks.Add(ctx, newKey) require.NoError(t, err) keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 1, len(keys)) _, err = ks.Delete(ctx, newKey.ID()) require.NoError(t, err) keys, err = ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) _, err = ks.Get(newKey.ID()) require.Error(t, err) t.Run("prevents adding more than one key", func(t *testing.T) { ctx := testutils.Context(t) err = ks.Add(ctx, newKey) require.NoError(t, err) err = ks.Add(ctx, newKey) assert.Error(t, err) assert.True(t, errors.Is(err, keystore.ErrCSAKeyExists)) }) t.Run("fails to delete non-existent key", func(t *testing.T) { k, err2 := ks.Delete(testutils.Context(t), "non-existent") assert.Zero(t, k) assert.Error(t, err2) }) })` $DIR/core/services/keystore/csa_test.go: `err = ks.Add(ctx, newKey)` $DIR/core/services/keystore/csa_test.go: `_, err = ks.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/csa_test.go: `keys, err = ks.GetAll()` $DIR/core/services/keystore/csa_test.go: `_, err = ks.Get(newKey.ID())` $DIR/core/services/keystore/csa_test.go: `t.Run("prevents adding more than one key", func(t *testing.T) { ctx := testutils.Context(t) err = ks.Add(ctx, newKey) require.NoError(t, err) err = ks.Add(ctx, newKey) assert.Error(t, err) assert.True(t, errors.Is(err, keystore.ErrCSAKeyExists)) })` $DIR/core/services/keystore/csa_test.go: `err = ks.Add(ctx, newKey)` $DIR/core/services/keystore/csa_test.go: `err = ks.Add(ctx, newKey)` $DIR/core/services/keystore/csa_test.go: `t.Run("fails to delete non-existent key", func(t *testing.T) { k, err2 := ks.Delete(testutils.Context(t), "non-existent") assert.Zero(t, k) assert.Error(t, err2) })` $DIR/core/services/keystore/csa_test.go: `t.Run("adds an externally created key/ensures it already exists", func(t *testing.T) { defer reset() ctx := testutils.Context(t) newKey, err := csakey.NewV2() assert.NoError(t, err) err = ks.Add(ctx, newKey) assert.NoError(t, err) err = keyStore.CSA().EnsureKey(ctx) assert.NoError(t, err) keys, err2 := ks.GetAll() assert.NoError(t, err2) require.Equal(t, 1, len(keys)) require.Equal(t, newKey.ID(), keys[0].ID()) require.Equal(t, newKey.Version, keys[0].Version) require.Equal(t, newKey.PublicKey, keys[0].PublicKey) })` $DIR/core/services/keystore/csa_test.go: `err = ks.Add(ctx, newKey)` $DIR/core/services/keystore/csa_test.go: `err = keyStore.CSA().EnsureKey(ctx)` $DIR/core/services/keystore/csa_test.go: `err = keyStore.CSA().EnsureKey(ctx)` $DIR/core/services/keystore/csa_test.go: `keys, err = ks.GetAll()` $DIR/core/services/keystore/csa_test.go: `.NewSqlxDB(t)` $DIR/core/services/keystore/csa_test.go: `.ExposedNewMaster(t, db)` $DIR/core/services/keystore/csa_test.go: `.CSA()` $DIR/core/services/keystore/csa_test.go: `.Background()` $DIR/core/services/keystore/csa_test.go: `.Exec("DELETE FROM encrypted_key_rings")` $DIR/core/services/keystore/csa_test.go: `.ResetXXXTestOnly()` $DIR/core/services/keystore/csa_test.go: `.Run("initializes with an empty state", func(t *testing.T) { defer reset() keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) })` $DIR/core/services/keystore/csa_test.go: `.GetAll()` $DIR/core/services/keystore/csa_test.go: `.Run("errors when getting non-existent ID", func(t *testing.T) { defer reset() _, err := ks.Get("non-existent-id") require.Error(t, err) })` $DIR/core/services/keystore/csa_test.go: `.Get("non-existent-id")` $DIR/core/services/keystore/csa_test.go: `.Run("creates a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, key, retrievedKey) t.Run("prevents creating more than one key", func(t *testing.T) { ctx := testutils.Context(t) k, err2 := ks.Create(ctx) assert.Zero(t, k) assert.Error(t, err2) assert.True(t, errors.Is(err2, keystore.ErrCSAKeyExists)) }) })` $DIR/core/services/keystore/csa_test.go: `.Context(t)` $DIR/core/services/keystore/csa_test.go: `.Create(ctx)` $DIR/core/services/keystore/csa_test.go: `.Get(key.ID())` $DIR/core/services/keystore/csa_test.go: `.ID()` $DIR/core/services/keystore/csa_test.go: `.Run("prevents creating more than one key", func(t *testing.T) { ctx := testutils.Context(t) k, err2 := ks.Create(ctx) assert.Zero(t, k) assert.Error(t, err2) assert.True(t, errors.Is(err2, keystore.ErrCSAKeyExists)) })` $DIR/core/services/keystore/csa_test.go: `.Context(t)` $DIR/core/services/keystore/csa_test.go: `.Create(ctx)` $DIR/core/services/keystore/csa_test.go: `.Run("imports and exports a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) exportJSON, err := ks.Export(key.ID(), cltest.Password) require.NoError(t, err) _, err = ks.Delete(ctx, key.ID()) require.NoError(t, err) _, err = ks.Get(key.ID()) require.Error(t, err) importedKey, err := ks.Import(ctx, exportJSON, cltest.Password) require.NoError(t, err) require.Equal(t, key.ID(), importedKey.ID()) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, importedKey, retrievedKey) t.Run("prevents importing more than one key", func(t *testing.T) { k, err2 := ks.Import(testutils.Context(t), exportJSON, cltest.Password) assert.Zero(t, k) assert.Error(t, err2) assert.Equal(t, fmt.Sprintf("key with ID %s already exists", key.ID()), err2.Error()) }) t.Run("fails to import malformed key", func(t *testing.T) { k, err2 := ks.Import(testutils.Context(t), []byte(""), cltest.Password) assert.Zero(t, k) assert.Error(t, err2) }) t.Run("fails to export non-existent key", func(t *testing.T) { exportJSON, err = ks.Export("non-existent", cltest.Password) assert.Error(t, err) assert.Empty(t, exportJSON) }) })` $DIR/core/services/keystore/csa_test.go: `.Context(t)` $DIR/core/services/keystore/csa_test.go: `.Create(ctx)` $DIR/core/services/keystore/csa_test.go: `.Export(key.ID(), cltest.Password)` $DIR/core/services/keystore/csa_test.go: `.ID()` $DIR/core/services/keystore/csa_test.go: `.Delete(ctx, key.ID())` $DIR/core/services/keystore/csa_test.go: `.ID()` $DIR/core/services/keystore/csa_test.go: `.Get(key.ID())` $DIR/core/services/keystore/csa_test.go: `.ID()` $DIR/core/services/keystore/csa_test.go: `.Import(ctx, exportJSON, cltest.Password)` $DIR/core/services/keystore/csa_test.go: `.Get(key.ID())` $DIR/core/services/keystore/csa_test.go: `.ID()` $DIR/core/services/keystore/csa_test.go: `.Run("prevents importing more than one key", func(t *testing.T) { k, err2 := ks.Import(testutils.Context(t), exportJSON, cltest.Password) assert.Zero(t, k) assert.Error(t, err2) assert.Equal(t, fmt.Sprintf("key with ID %s already exists", key.ID()), err2.Error()) })` $DIR/core/services/keystore/csa_test.go: `.Import(testutils.Context(t), exportJSON, cltest.Password)` $DIR/core/services/keystore/csa_test.go: `.Context(t)` $DIR/core/services/keystore/csa_test.go: `.Run("fails to import malformed key", func(t *testing.T) { k, err2 := ks.Import(testutils.Context(t), []byte(""), cltest.Password) assert.Zero(t, k) assert.Error(t, err2) })` $DIR/core/services/keystore/csa_test.go: `.Import(testutils.Context(t), []byte(""), cltest.Password)` $DIR/core/services/keystore/csa_test.go: `.Context(t)` $DIR/core/services/keystore/csa_test.go: `.Run("fails to export non-existent key", func(t *testing.T) { exportJSON, err = ks.Export("non-existent", cltest.Password) assert.Error(t, err) assert.Empty(t, exportJSON) })` $DIR/core/services/keystore/csa_test.go: `.Export("non-existent", cltest.Password)` $DIR/core/services/keystore/csa_test.go: `.Run("adds an externally created key / deletes a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) newKey, err := csakey.NewV2() require.NoError(t, err) err = ks.Add(ctx, newKey) require.NoError(t, err) keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 1, len(keys)) _, err = ks.Delete(ctx, newKey.ID()) require.NoError(t, err) keys, err = ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) _, err = ks.Get(newKey.ID()) require.Error(t, err) t.Run("prevents adding more than one key", func(t *testing.T) { ctx := testutils.Context(t) err = ks.Add(ctx, newKey) require.NoError(t, err) err = ks.Add(ctx, newKey) assert.Error(t, err) assert.True(t, errors.Is(err, keystore.ErrCSAKeyExists)) }) t.Run("fails to delete non-existent key", func(t *testing.T) { k, err2 := ks.Delete(testutils.Context(t), "non-existent") assert.Zero(t, k) assert.Error(t, err2) }) })` $DIR/core/services/keystore/csa_test.go: `.Context(t)` $DIR/core/services/keystore/csa_test.go: `.NewV2()` $DIR/core/services/keystore/csa_test.go: `.Add(ctx, newKey)` $DIR/core/services/keystore/csa_test.go: `.GetAll()` $DIR/core/services/keystore/csa_test.go: `.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/csa_test.go: `.ID()` $DIR/core/services/keystore/csa_test.go: `.GetAll()` $DIR/core/services/keystore/csa_test.go: `.Get(newKey.ID())` $DIR/core/services/keystore/csa_test.go: `.ID()` $DIR/core/services/keystore/csa_test.go: `.Run("prevents adding more than one key", func(t *testing.T) { ctx := testutils.Context(t) err = ks.Add(ctx, newKey) require.NoError(t, err) err = ks.Add(ctx, newKey) assert.Error(t, err) assert.True(t, errors.Is(err, keystore.ErrCSAKeyExists)) })` $DIR/core/services/keystore/csa_test.go: `.Context(t)` $DIR/core/services/keystore/csa_test.go: `.Add(ctx, newKey)` $DIR/core/services/keystore/csa_test.go: `.Add(ctx, newKey)` $DIR/core/services/keystore/csa_test.go: `.Run("fails to delete non-existent key", func(t *testing.T) { k, err2 := ks.Delete(testutils.Context(t), "non-existent") assert.Zero(t, k) assert.Error(t, err2) })` $DIR/core/services/keystore/csa_test.go: `.Delete(testutils.Context(t), "non-existent")` $DIR/core/services/keystore/csa_test.go: `.Context(t)` $DIR/core/services/keystore/csa_test.go: `.Run("adds an externally created key/ensures it already exists", func(t *testing.T) { defer reset() ctx := testutils.Context(t) newKey, err := csakey.NewV2() assert.NoError(t, err) err = ks.Add(ctx, newKey) assert.NoError(t, err) err = keyStore.CSA().EnsureKey(ctx) assert.NoError(t, err) keys, err2 := ks.GetAll() assert.NoError(t, err2) require.Equal(t, 1, len(keys)) require.Equal(t, newKey.ID(), keys[0].ID()) require.Equal(t, newKey.Version, keys[0].Version) require.Equal(t, newKey.PublicKey, keys[0].PublicKey) })` $DIR/core/services/keystore/csa_test.go: `.Context(t)` $DIR/core/services/keystore/csa_test.go: `.NewV2()` $DIR/core/services/keystore/csa_test.go: `.Add(ctx, newKey)` $DIR/core/services/keystore/csa_test.go: `.CSA()` $DIR/core/services/keystore/csa_test.go: `.EnsureKey(ctx)` $DIR/core/services/keystore/csa_test.go: `.GetAll()` $DIR/core/services/keystore/csa_test.go: `.Context(t)` $DIR/core/services/keystore/csa_test.go: `.GetAll()` $DIR/core/services/keystore/csa_test.go: `.CSA()` $DIR/core/services/keystore/csa_test.go: `.EnsureKey(ctx)` $DIR/core/services/keystore/csa_test.go: `.GetAll()` $DIR/core/services/keystore/dkgencrypt_test.go: `keyStore.ResetXXXTestOnly()` $DIR/core/services/keystore/dkgencrypt_test.go: `t.Run("initializes with an empty state", func(t *testing.T) { defer reset() keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) })` $DIR/core/services/keystore/dkgencrypt_test.go: `t.Run("errors when getting non-existent ID", func(t *testing.T) { defer reset() _, err := ks.Get("non-existent-id") require.Error(t, err) })` $DIR/core/services/keystore/dkgencrypt_test.go: `t.Run("creates a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, key, retrievedKey) })` $DIR/core/services/keystore/dkgencrypt_test.go: `t.Run("imports and exports a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) exportJSON, err := ks.Export(key.ID(), cltest.Password) require.NoError(t, err) _, err = ks.Delete(ctx, key.ID()) require.NoError(t, err) _, err = ks.Get(key.ID()) require.Error(t, err) importedKey, err := ks.Import(ctx, exportJSON, cltest.Password) require.NoError(t, err) require.Equal(t, key.ID(), importedKey.ID()) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, importedKey, retrievedKey) })` $DIR/core/services/keystore/dkgencrypt_test.go: `_, err = ks.Delete(ctx, key.ID())` $DIR/core/services/keystore/dkgencrypt_test.go: `_, err = ks.Get(key.ID())` $DIR/core/services/keystore/dkgencrypt_test.go: `t.Run("adds an externally created key / deletes a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) newKey, err := dkgencryptkey.New() require.NoError(t, err) err = ks.Add(ctx, newKey) require.NoError(t, err) keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 1, len(keys)) _, err = ks.Delete(ctx, newKey.ID()) require.NoError(t, err) keys, err = ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) _, err = ks.Get(newKey.ID()) require.Error(t, err) })` $DIR/core/services/keystore/dkgencrypt_test.go: `err = ks.Add(ctx, newKey)` $DIR/core/services/keystore/dkgencrypt_test.go: `_, err = ks.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/dkgencrypt_test.go: `keys, err = ks.GetAll()` $DIR/core/services/keystore/dkgencrypt_test.go: `_, err = ks.Get(newKey.ID())` $DIR/core/services/keystore/dkgencrypt_test.go: `t.Run("adds an externally created key/ensures it already exists", func(t *testing.T) { defer reset() ctx := testutils.Context(t) newKey, err := dkgencryptkey.New() assert.NoError(t, err) err = ks.Add(ctx, newKey) assert.NoError(t, err) err = keyStore.DKGEncrypt().EnsureKey(ctx) assert.NoError(t, err) keys, err2 := ks.GetAll() assert.NoError(t, err2) require.Equal(t, 1, len(keys)) require.Equal(t, newKey.ID(), keys[0].ID()) require.Equal(t, newKey.PublicKey, keys[0].PublicKey) })` $DIR/core/services/keystore/dkgencrypt_test.go: `err = ks.Add(ctx, newKey)` $DIR/core/services/keystore/dkgencrypt_test.go: `err = keyStore.DKGEncrypt().EnsureKey(ctx)` $DIR/core/services/keystore/dkgencrypt_test.go: `err = keyStore.DKGEncrypt().EnsureKey(ctx)` $DIR/core/services/keystore/dkgencrypt_test.go: `keys, err = ks.GetAll()` $DIR/core/services/keystore/dkgencrypt_test.go: `.NewSqlxDB(t)` $DIR/core/services/keystore/dkgencrypt_test.go: `.ExposedNewMaster(t, db)` $DIR/core/services/keystore/dkgencrypt_test.go: `.DKGEncrypt()` $DIR/core/services/keystore/dkgencrypt_test.go: `.Background()` $DIR/core/services/keystore/dkgencrypt_test.go: `.Exec("DELETE FROM encrypted_key_rings")` $DIR/core/services/keystore/dkgencrypt_test.go: `.ResetXXXTestOnly()` $DIR/core/services/keystore/dkgencrypt_test.go: `.Run("initializes with an empty state", func(t *testing.T) { defer reset() keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) })` $DIR/core/services/keystore/dkgencrypt_test.go: `.GetAll()` $DIR/core/services/keystore/dkgencrypt_test.go: `.Run("errors when getting non-existent ID", func(t *testing.T) { defer reset() _, err := ks.Get("non-existent-id") require.Error(t, err) })` $DIR/core/services/keystore/dkgencrypt_test.go: `.Get("non-existent-id")` $DIR/core/services/keystore/dkgencrypt_test.go: `.Run("creates a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, key, retrievedKey) })` $DIR/core/services/keystore/dkgencrypt_test.go: `.Context(t)` $DIR/core/services/keystore/dkgencrypt_test.go: `.Create(ctx)` $DIR/core/services/keystore/dkgencrypt_test.go: `.Get(key.ID())` $DIR/core/services/keystore/dkgencrypt_test.go: `.ID()` $DIR/core/services/keystore/dkgencrypt_test.go: `.Run("imports and exports a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) exportJSON, err := ks.Export(key.ID(), cltest.Password) require.NoError(t, err) _, err = ks.Delete(ctx, key.ID()) require.NoError(t, err) _, err = ks.Get(key.ID()) require.Error(t, err) importedKey, err := ks.Import(ctx, exportJSON, cltest.Password) require.NoError(t, err) require.Equal(t, key.ID(), importedKey.ID()) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, importedKey, retrievedKey) })` $DIR/core/services/keystore/dkgencrypt_test.go: `.Context(t)` $DIR/core/services/keystore/dkgencrypt_test.go: `.Create(ctx)` $DIR/core/services/keystore/dkgencrypt_test.go: `.Export(key.ID(), cltest.Password)` $DIR/core/services/keystore/dkgencrypt_test.go: `.ID()` $DIR/core/services/keystore/dkgencrypt_test.go: `.Delete(ctx, key.ID())` $DIR/core/services/keystore/dkgencrypt_test.go: `.ID()` $DIR/core/services/keystore/dkgencrypt_test.go: `.Get(key.ID())` $DIR/core/services/keystore/dkgencrypt_test.go: `.ID()` $DIR/core/services/keystore/dkgencrypt_test.go: `.Import(ctx, exportJSON, cltest.Password)` $DIR/core/services/keystore/dkgencrypt_test.go: `.Get(key.ID())` $DIR/core/services/keystore/dkgencrypt_test.go: `.ID()` $DIR/core/services/keystore/dkgencrypt_test.go: `.Run("adds an externally created key / deletes a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) newKey, err := dkgencryptkey.New() require.NoError(t, err) err = ks.Add(ctx, newKey) require.NoError(t, err) keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 1, len(keys)) _, err = ks.Delete(ctx, newKey.ID()) require.NoError(t, err) keys, err = ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) _, err = ks.Get(newKey.ID()) require.Error(t, err) })` $DIR/core/services/keystore/dkgencrypt_test.go: `.Context(t)` $DIR/core/services/keystore/dkgencrypt_test.go: `.New()` $DIR/core/services/keystore/dkgencrypt_test.go: `.Add(ctx, newKey)` $DIR/core/services/keystore/dkgencrypt_test.go: `.GetAll()` $DIR/core/services/keystore/dkgencrypt_test.go: `.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/dkgencrypt_test.go: `.ID()` $DIR/core/services/keystore/dkgencrypt_test.go: `.GetAll()` $DIR/core/services/keystore/dkgencrypt_test.go: `.Get(newKey.ID())` $DIR/core/services/keystore/dkgencrypt_test.go: `.ID()` $DIR/core/services/keystore/dkgencrypt_test.go: `.Run("adds an externally created key/ensures it already exists", func(t *testing.T) { defer reset() ctx := testutils.Context(t) newKey, err := dkgencryptkey.New() assert.NoError(t, err) err = ks.Add(ctx, newKey) assert.NoError(t, err) err = keyStore.DKGEncrypt().EnsureKey(ctx) assert.NoError(t, err) keys, err2 := ks.GetAll() assert.NoError(t, err2) require.Equal(t, 1, len(keys)) require.Equal(t, newKey.ID(), keys[0].ID()) require.Equal(t, newKey.PublicKey, keys[0].PublicKey) })` $DIR/core/services/keystore/dkgencrypt_test.go: `.Context(t)` $DIR/core/services/keystore/dkgencrypt_test.go: `.New()` $DIR/core/services/keystore/dkgencrypt_test.go: `.Add(ctx, newKey)` $DIR/core/services/keystore/dkgencrypt_test.go: `.DKGEncrypt()` $DIR/core/services/keystore/dkgencrypt_test.go: `.EnsureKey(ctx)` $DIR/core/services/keystore/dkgencrypt_test.go: `.GetAll()` $DIR/core/services/keystore/dkgencrypt_test.go: `.Context(t)` $DIR/core/services/keystore/dkgencrypt_test.go: `.GetAll()` $DIR/core/services/keystore/dkgencrypt_test.go: `.DKGEncrypt()` $DIR/core/services/keystore/dkgencrypt_test.go: `.EnsureKey(ctx)` $DIR/core/services/keystore/dkgencrypt_test.go: `.GetAll()` $DIR/core/services/keystore/dkgsign_test.go: `keyStore.ResetXXXTestOnly()` $DIR/core/services/keystore/dkgsign_test.go: `t.Run("initializes with an empty state", func(t *testing.T) { defer reset() keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) })` $DIR/core/services/keystore/dkgsign_test.go: `t.Run("errors when getting non-existent ID", func(t *testing.T) { defer reset() _, err := ks.Get("non-existent-id") require.Error(t, err) })` $DIR/core/services/keystore/dkgsign_test.go: `t.Run("creates a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, key, retrievedKey) })` $DIR/core/services/keystore/dkgsign_test.go: `t.Run("imports and exports a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) exportJSON, err := ks.Export(key.ID(), cltest.Password) require.NoError(t, err) _, err = ks.Delete(ctx, key.ID()) require.NoError(t, err) _, err = ks.Get(key.ID()) require.Error(t, err) importedKey, err := ks.Import(ctx, exportJSON, cltest.Password) require.NoError(t, err) require.Equal(t, key.ID(), importedKey.ID()) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, importedKey, retrievedKey) })` $DIR/core/services/keystore/dkgsign_test.go: `_, err = ks.Delete(ctx, key.ID())` $DIR/core/services/keystore/dkgsign_test.go: `_, err = ks.Get(key.ID())` $DIR/core/services/keystore/dkgsign_test.go: `t.Run("adds an externally created key / deletes a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) newKey, err := dkgsignkey.New() require.NoError(t, err) err = ks.Add(ctx, newKey) require.NoError(t, err) keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 1, len(keys)) _, err = ks.Delete(ctx, newKey.ID()) require.NoError(t, err) keys, err = ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) _, err = ks.Get(newKey.ID()) require.Error(t, err) })` $DIR/core/services/keystore/dkgsign_test.go: `err = ks.Add(ctx, newKey)` $DIR/core/services/keystore/dkgsign_test.go: `_, err = ks.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/dkgsign_test.go: `keys, err = ks.GetAll()` $DIR/core/services/keystore/dkgsign_test.go: `_, err = ks.Get(newKey.ID())` $DIR/core/services/keystore/dkgsign_test.go: `t.Run("adds an externally created key/ensures it already exists", func(t *testing.T) { defer reset() ctx := testutils.Context(t) newKey, err := dkgsignkey.New() assert.NoError(t, err) err = ks.Add(ctx, newKey) assert.NoError(t, err) err = keyStore.DKGSign().EnsureKey(ctx) assert.NoError(t, err) keys, err2 := ks.GetAll() assert.NoError(t, err2) require.Equal(t, 1, len(keys)) require.Equal(t, newKey.ID(), keys[0].ID()) require.Equal(t, newKey.PublicKey, keys[0].PublicKey) })` $DIR/core/services/keystore/dkgsign_test.go: `err = ks.Add(ctx, newKey)` $DIR/core/services/keystore/dkgsign_test.go: `err = keyStore.DKGSign().EnsureKey(ctx)` $DIR/core/services/keystore/dkgsign_test.go: `err = keyStore.DKGSign().EnsureKey(ctx)` $DIR/core/services/keystore/dkgsign_test.go: `keys, err = ks.GetAll()` $DIR/core/services/keystore/dkgsign_test.go: `.NewSqlxDB(t)` $DIR/core/services/keystore/dkgsign_test.go: `.ExposedNewMaster(t, db)` $DIR/core/services/keystore/dkgsign_test.go: `.DKGSign()` $DIR/core/services/keystore/dkgsign_test.go: `.Background()` $DIR/core/services/keystore/dkgsign_test.go: `.Exec("DELETE FROM encrypted_key_rings")` $DIR/core/services/keystore/dkgsign_test.go: `.ResetXXXTestOnly()` $DIR/core/services/keystore/dkgsign_test.go: `.Run("initializes with an empty state", func(t *testing.T) { defer reset() keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) })` $DIR/core/services/keystore/dkgsign_test.go: `.GetAll()` $DIR/core/services/keystore/dkgsign_test.go: `.Run("errors when getting non-existent ID", func(t *testing.T) { defer reset() _, err := ks.Get("non-existent-id") require.Error(t, err) })` $DIR/core/services/keystore/dkgsign_test.go: `.Get("non-existent-id")` $DIR/core/services/keystore/dkgsign_test.go: `.Run("creates a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, key, retrievedKey) })` $DIR/core/services/keystore/dkgsign_test.go: `.Context(t)` $DIR/core/services/keystore/dkgsign_test.go: `.Create(ctx)` $DIR/core/services/keystore/dkgsign_test.go: `.Get(key.ID())` $DIR/core/services/keystore/dkgsign_test.go: `.ID()` $DIR/core/services/keystore/dkgsign_test.go: `.Run("imports and exports a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) exportJSON, err := ks.Export(key.ID(), cltest.Password) require.NoError(t, err) _, err = ks.Delete(ctx, key.ID()) require.NoError(t, err) _, err = ks.Get(key.ID()) require.Error(t, err) importedKey, err := ks.Import(ctx, exportJSON, cltest.Password) require.NoError(t, err) require.Equal(t, key.ID(), importedKey.ID()) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, importedKey, retrievedKey) })` $DIR/core/services/keystore/dkgsign_test.go: `.Context(t)` $DIR/core/services/keystore/dkgsign_test.go: `.Create(ctx)` $DIR/core/services/keystore/dkgsign_test.go: `.Export(key.ID(), cltest.Password)` $DIR/core/services/keystore/dkgsign_test.go: `.ID()` $DIR/core/services/keystore/dkgsign_test.go: `.Delete(ctx, key.ID())` $DIR/core/services/keystore/dkgsign_test.go: `.ID()` $DIR/core/services/keystore/dkgsign_test.go: `.Get(key.ID())` $DIR/core/services/keystore/dkgsign_test.go: `.ID()` $DIR/core/services/keystore/dkgsign_test.go: `.Import(ctx, exportJSON, cltest.Password)` $DIR/core/services/keystore/dkgsign_test.go: `.Get(key.ID())` $DIR/core/services/keystore/dkgsign_test.go: `.ID()` $DIR/core/services/keystore/dkgsign_test.go: `.Run("adds an externally created key / deletes a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) newKey, err := dkgsignkey.New() require.NoError(t, err) err = ks.Add(ctx, newKey) require.NoError(t, err) keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 1, len(keys)) _, err = ks.Delete(ctx, newKey.ID()) require.NoError(t, err) keys, err = ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) _, err = ks.Get(newKey.ID()) require.Error(t, err) })` $DIR/core/services/keystore/dkgsign_test.go: `.Context(t)` $DIR/core/services/keystore/dkgsign_test.go: `.New()` $DIR/core/services/keystore/dkgsign_test.go: `.Add(ctx, newKey)` $DIR/core/services/keystore/dkgsign_test.go: `.GetAll()` $DIR/core/services/keystore/dkgsign_test.go: `.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/dkgsign_test.go: `.ID()` $DIR/core/services/keystore/dkgsign_test.go: `.GetAll()` $DIR/core/services/keystore/dkgsign_test.go: `.Get(newKey.ID())` $DIR/core/services/keystore/dkgsign_test.go: `.ID()` $DIR/core/services/keystore/dkgsign_test.go: `.Run("adds an externally created key/ensures it already exists", func(t *testing.T) { defer reset() ctx := testutils.Context(t) newKey, err := dkgsignkey.New() assert.NoError(t, err) err = ks.Add(ctx, newKey) assert.NoError(t, err) err = keyStore.DKGSign().EnsureKey(ctx) assert.NoError(t, err) keys, err2 := ks.GetAll() assert.NoError(t, err2) require.Equal(t, 1, len(keys)) require.Equal(t, newKey.ID(), keys[0].ID()) require.Equal(t, newKey.PublicKey, keys[0].PublicKey) })` $DIR/core/services/keystore/dkgsign_test.go: `.Context(t)` $DIR/core/services/keystore/dkgsign_test.go: `.New()` $DIR/core/services/keystore/dkgsign_test.go: `.Add(ctx, newKey)` $DIR/core/services/keystore/dkgsign_test.go: `.DKGSign()` $DIR/core/services/keystore/dkgsign_test.go: `.EnsureKey(ctx)` $DIR/core/services/keystore/dkgsign_test.go: `.GetAll()` $DIR/core/services/keystore/dkgsign_test.go: `.Context(t)` $DIR/core/services/keystore/dkgsign_test.go: `.GetAll()` $DIR/core/services/keystore/dkgsign_test.go: `.DKGSign()` $DIR/core/services/keystore/dkgsign_test.go: `.EnsureKey(ctx)` $DIR/core/services/keystore/dkgsign_test.go: `.GetAll()` $DIR/core/services/keystore/eth_test.go: `keyStore.ResetXXXTestOnly()` $DIR/core/services/keystore/eth_test.go: `t.Run("Create / GetAll / Get", func(t *testing.T) { ctx := testutils.Context(t) defer reset() key, err := ethKeyStore.Create(ctx, &cltest.FixtureChainID) require.NoError(t, err) retrievedKeys, err := ethKeyStore.GetAll(ctx) require.NoError(t, err) require.Equal(t, 1, len(retrievedKeys)) require.Equal(t, key.Address, retrievedKeys[0].Address) foundKey, err := ethKeyStore.Get(ctx, key.Address.Hex()) require.NoError(t, err) require.Equal(t, key, foundKey) // adds ethkey.State cltest.AssertCount(t, db, statesTableName, 1) var state ethkey.State sql := fmt.Sprintf(`SELECT address, disabled, evm_chain_id, created_at, updated_at from %s LIMIT 1`, statesTableName) require.NoError(t, db.GetContext(ctx, &state, sql)) require.Equal(t, state.Address.Address(), retrievedKeys[0].Address) // adds key to db keyStore.ResetXXXTestOnly() require.NoError(t, keyStore.Unlock(ctx, cltest.Password)) retrievedKeys, err = ethKeyStore.GetAll(ctx) require.NoError(t, err) require.Equal(t, 1, len(retrievedKeys)) require.Equal(t, key.Address, retrievedKeys[0].Address) // adds 2nd key _, err = ethKeyStore.Create(ctx, &cltest.FixtureChainID) require.NoError(t, err) retrievedKeys, err = ethKeyStore.GetAll(ctx) require.NoError(t, err) require.Equal(t, 2, len(retrievedKeys)) })` $DIR/core/services/keystore/eth_test.go: `cltest.AssertCount(t, db, statesTableName, 1)` $DIR/core/services/keystore/eth_test.go: `keyStore.ResetXXXTestOnly()` $DIR/core/services/keystore/eth_test.go: `retrievedKeys, err = ethKeyStore.GetAll(ctx)` $DIR/core/services/keystore/eth_test.go: `_, err = ethKeyStore.Create(ctx, &cltest.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `retrievedKeys, err = ethKeyStore.GetAll(ctx)` $DIR/core/services/keystore/eth_test.go: `t.Run("GetAll ordering", func(t *testing.T) { ctx := testutils.Context(t) defer reset() var keys []ethkey.KeyV2 for i := 0; i < 5; i++ { key, err := ethKeyStore.Create(ctx, &cltest.FixtureChainID) require.NoError(t, err) keys = append(keys, key) } retrievedKeys, err := ethKeyStore.GetAll(ctx) require.NoError(t, err) require.Equal(t, 5, len(retrievedKeys)) sort.Slice(keys, func(i, j int) bool { return keys[i].Cmp(keys[j]) < 0 }) assert.Equal(t, keys, retrievedKeys) })` $DIR/core/services/keystore/eth_test.go: `keys = append(keys, key)` $DIR/core/services/keystore/eth_test.go: `sort.Slice(keys, func(i, j int) bool { return keys[i].Cmp(keys[j]) < 0 })` $DIR/core/services/keystore/eth_test.go: `t.Run("RemoveKey", func(t *testing.T) { ctx := testutils.Context(t) defer reset() key, err := ethKeyStore.Create(ctx, &cltest.FixtureChainID) require.NoError(t, err) _, err = ethKeyStore.Delete(ctx, key.ID()) require.NoError(t, err) retrievedKeys, err := ethKeyStore.GetAll(ctx) require.NoError(t, err) require.Equal(t, 0, len(retrievedKeys)) cltest.AssertCount(t, db, statesTableName, 0) })` $DIR/core/services/keystore/eth_test.go: `_, err = ethKeyStore.Delete(ctx, key.ID())` $DIR/core/services/keystore/eth_test.go: `cltest.AssertCount(t, db, statesTableName, 0)` $DIR/core/services/keystore/eth_test.go: `t.Run("Delete removes key even if evm.txes are present", func(t *testing.T) { ctx := testutils.Context(t) defer reset() key, err := ethKeyStore.Create(ctx, &cltest.FixtureChainID) require.NoError(t, err) // ensure at least one state is present cltest.AssertCount(t, db, statesTableName, 1) // add one eth_tx txStore := cltest.NewTestTxStore(t, db) cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 0, 42, key.Address) _, err = ethKeyStore.Delete(ctx, key.ID()) require.NoError(t, err) retrievedKeys, err := ethKeyStore.GetAll(ctx) require.NoError(t, err) require.Equal(t, 0, len(retrievedKeys)) cltest.AssertCount(t, db, statesTableName, 0) })` $DIR/core/services/keystore/eth_test.go: `cltest.AssertCount(t, db, statesTableName, 1)` $DIR/core/services/keystore/eth_test.go: `cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 0, 42, key.Address)` $DIR/core/services/keystore/eth_test.go: `_, err = ethKeyStore.Delete(ctx, key.ID())` $DIR/core/services/keystore/eth_test.go: `cltest.AssertCount(t, db, statesTableName, 0)` $DIR/core/services/keystore/eth_test.go: `t.Run("EnsureKeys / EnabledKeysForChain", func(t *testing.T) { ctx := testutils.Context(t) defer reset() err := ethKeyStore.EnsureKeys(ctx, &cltest.FixtureChainID) assert.NoError(t, err) sendingKeys1, err := ethKeyStore.EnabledKeysForChain(ctx, testutils.FixtureChainID) assert.NoError(t, err) require.Equal(t, 1, len(sendingKeys1)) cltest.AssertCount(t, db, statesTableName, 1) err = ethKeyStore.EnsureKeys(ctx, &cltest.FixtureChainID) assert.NoError(t, err) sendingKeys2, err := ethKeyStore.EnabledKeysForChain(ctx, testutils.FixtureChainID) assert.NoError(t, err) require.Equal(t, 1, len(sendingKeys2)) require.Equal(t, sendingKeys1, sendingKeys2) })` $DIR/core/services/keystore/eth_test.go: `cltest.AssertCount(t, db, statesTableName, 1)` $DIR/core/services/keystore/eth_test.go: `err = ethKeyStore.EnsureKeys(ctx, &cltest.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `t.Run("EnabledKeysForChain with specified chain ID", func(t *testing.T) { ctx := testutils.Context(t) defer reset() key, err := ethKeyStore.Create(ctx, testutils.FixtureChainID) require.NoError(t, err) key2, err := ethKeyStore.Create(ctx, big.NewInt(1337)) require.NoError(t, err) keys, err := ethKeyStore.EnabledKeysForChain(ctx, testutils.FixtureChainID) require.NoError(t, err) require.Len(t, keys, 1) require.Equal(t, key, keys[0]) keys, err = ethKeyStore.EnabledKeysForChain(ctx, big.NewInt(1337)) require.NoError(t, err) require.Len(t, keys, 1) require.Equal(t, key2, keys[0]) _, err = ethKeyStore.EnabledKeysForChain(ctx, nil) assert.Error(t, err) assert.EqualError(t, err, "chainID must be non-nil") })` $DIR/core/services/keystore/eth_test.go: `keys, err = ethKeyStore.EnabledKeysForChain(ctx, big.NewInt(1337))` $DIR/core/services/keystore/eth_test.go: `_, err = ethKeyStore.EnabledKeysForChain(ctx, nil)` $DIR/core/services/keystore/eth_test.go: `testutils.AssertCount(t, db, "evm.key_states", 2)` $DIR/core/services/keystore/eth_test.go: `enabledAddresses, err = ethKeyStore.EnabledAddressesForChain(ctx, big.NewInt(1337))` $DIR/core/services/keystore/eth_test.go: `_, err = ethKeyStore.EnabledAddressesForChain(ctx, nil)` $DIR/core/services/keystore/eth_test.go: `err = ethKeyStore.Disable(ctx, key.Address, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `enabledAddresses, err = ethKeyStore.EnabledAddressesForChain(ctx, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `enabledAddresses, err = ethKeyStore.EnabledAddressesForChain(ctx, big.NewInt(1337))` $DIR/core/services/keystore/eth_test.go: `t.Run("should error when no addresses", func(t *testing.T) { ctx1 := testutils.Context(t) _, err := ethKeyStore.GetRoundRobinAddress(ctx1, testutils.FixtureChainID) require.Error(t, err) })` $DIR/core/services/keystore/eth_test.go: `t.Run("with no address filter, rotates between all enabled addresses", func(t *testing.T) { address1, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.FixtureChainID) require.NoError(t, err) address2, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.FixtureChainID) require.NoError(t, err) address3, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.FixtureChainID) require.NoError(t, err) address4, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.FixtureChainID) require.NoError(t, err) address5, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.FixtureChainID) require.NoError(t, err) address6, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.FixtureChainID) require.NoError(t, err) assert.NotEqual(t, address1, address2) assert.NotEqual(t, address2, address3) assert.NotEqual(t, address1, address3) assert.Equal(t, address1, address4) assert.Equal(t, address2, address5) assert.Equal(t, address3, address6) })` $DIR/core/services/keystore/eth_test.go: `t.Run("with address filter, rotates between given addresses that match sending keys", func(t *testing.T) { { // k3 is a disabled address for FixtureChainID so even though it's whitelisted, it will be ignored addresses := []common.Address{k4.Address, k3.Address, k1.Address, k2.Address, testutils.NewAddress()} address1, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.FixtureChainID, addresses...) require.NoError(t, err) address2, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.FixtureChainID, addresses...) require.NoError(t, err) address3, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.FixtureChainID, addresses...) require.NoError(t, err) address4, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.FixtureChainID, addresses...) require.NoError(t, err) assert.NotEqual(t, k3.Address, address1) assert.NotEqual(t, k3.Address, address2) assert.NotEqual(t, k3.Address, address3) assert.NotEqual(t, address1, address2) assert.NotEqual(t, address1, address3) assert.NotEqual(t, address2, address3) assert.Equal(t, address1, address4) } { // k2 and k4 are disabled address for SimulatedChainID so even though it's whitelisted, it will be ignored addresses := []common.Address{k4.Address, k3.Address, k1.Address, k2.Address, testutils.NewAddress()} address1, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.SimulatedChainID, addresses...) require.NoError(t, err) address2, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.SimulatedChainID, addresses...) require.NoError(t, err) address3, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.SimulatedChainID, addresses...) require.NoError(t, err) address4, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.SimulatedChainID, addresses...) require.NoError(t, err) assert.True(t, address1 == k1.Address || address1 == k3.Address) assert.True(t, address2 == k1.Address || address2 == k3.Address) assert.NotEqual(t, address1, address2) assert.Equal(t, address1, address3) assert.Equal(t, address2, address4) } })` $DIR/core/services/keystore/eth_test.go: `keyStore.ResetXXXTestOnly()` $DIR/core/services/keystore/eth_test.go: `t.Run("initializes with an empty state", func(t *testing.T) { ctx := testutils.Context(t) defer reset() keys, err := ks.GetAll(ctx) require.NoError(t, err) require.Equal(t, 0, len(keys)) })` $DIR/core/services/keystore/eth_test.go: `t.Run("errors when getting non-existent ID", func(t *testing.T) { ctx := testutils.Context(t) defer reset() _, err := ks.Get(ctx, "non-existent-id") require.Error(t, err) })` $DIR/core/services/keystore/eth_test.go: `t.Run("creates a key", func(t *testing.T) { ctx := testutils.Context(t) defer reset() key, err := ks.Create(ctx, &cltest.FixtureChainID) require.NoError(t, err) retrievedKey, err := ks.Get(ctx, key.ID()) require.NoError(t, err) require.Equal(t, key, retrievedKey) })` $DIR/core/services/keystore/eth_test.go: `t.Run("imports and exports a key", func(t *testing.T) { ctx := testutils.Context(t) defer reset() key, err := ks.Create(ctx, &cltest.FixtureChainID) require.NoError(t, err) exportJSON, err := ks.Export(ctx, key.ID(), cltest.Password) require.NoError(t, err) _, err = ks.Delete(ctx, key.ID()) require.NoError(t, err) _, err = ks.Get(ctx, key.ID()) require.Error(t, err) importedKey, err := ks.Import(ctx, exportJSON, cltest.Password, &cltest.FixtureChainID) require.NoError(t, err) require.Equal(t, key.ID(), importedKey.ID()) retrievedKey, err := ks.Get(ctx, key.ID()) require.NoError(t, err) require.Equal(t, importedKey, retrievedKey) })` $DIR/core/services/keystore/eth_test.go: `_, err = ks.Delete(ctx, key.ID())` $DIR/core/services/keystore/eth_test.go: `_, err = ks.Get(ctx, key.ID())` $DIR/core/services/keystore/eth_test.go: `t.Run("adds an externally created key / deletes a key", func(t *testing.T) { ctx := testutils.Context(t) defer reset() newKey, err := ethkey.NewV2() require.NoError(t, err) ks.XXXTestingOnlyAdd(ctx, newKey) keys, err := ks.GetAll(ctx) require.NoError(t, err) assert.Equal(t, 1, len(keys)) _, err = ks.Delete(ctx, newKey.ID()) require.NoError(t, err) keys, err = ks.GetAll(ctx) require.NoError(t, err) assert.Equal(t, 0, len(keys)) _, err = ks.Get(ctx, newKey.ID()) assert.Error(t, err) _, err = ks.Delete(ctx, newKey.ID()) assert.Error(t, err) })` $DIR/core/services/keystore/eth_test.go: `ks.XXXTestingOnlyAdd(ctx, newKey)` $DIR/core/services/keystore/eth_test.go: `_, err = ks.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/eth_test.go: `keys, err = ks.GetAll(ctx)` $DIR/core/services/keystore/eth_test.go: `_, err = ks.Get(ctx, newKey.ID())` $DIR/core/services/keystore/eth_test.go: `_, err = ks.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/eth_test.go: `t.Run("imports a key exported from a v1 keystore", func(t *testing.T) { ctx := testutils.Context(t) exportedKey := `{"address":"0dd359b4f22a30e44b2fd744b679971941865820","crypto":{"cipher":"aes-128-ctr","ciphertext":"b30af964a3b3f37894e599446b4cf2314bbfcd1062e6b35b620d3d20bd9965cc","cipherparams":{"iv":"58a8d75629cc1945da7cf8c24520d1dc"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"c352887e9d427d8a6a1869082619b73fac4566082a99f6e367d126f11b434f28"},"mac":"fd76a588210e0bf73d01332091e0e83a4584ee2df31eaec0e27f9a1b94f024b4"},"id":"a5ee0802-1d7b-45b6-aeb8-ea8a3351e715","version":3}` importedKey, err := ks.Import(ctx, []byte(exportedKey), "p4SsW0rD1!@#_", &cltest.FixtureChainID) require.NoError(t, err) assert.Equal(t, "0x0dd359b4f22a30E44b2fD744B679971941865820", importedKey.ID()) k, err := ks.Import(ctx, []byte(exportedKey), cltest.Password, &cltest.FixtureChainID) assert.Empty(t, k) assert.Error(t, err) })` $DIR/core/services/keystore/eth_test.go: `t.Run("fails to export a non-existent key", func(t *testing.T) { ctx := testutils.Context(t) k, err := ks.Export(ctx, "non-existent", cltest.Password) assert.Empty(t, k) assert.Error(t, err) })` $DIR/core/services/keystore/eth_test.go: `t.Run("returns states for keys", func(t *testing.T) { ctx := testutils.Context(t) k1, err := ethkey.NewV2() require.NoError(t, err) k2, err := ethkey.NewV2() require.NoError(t, err) ks.XXXTestingOnlyAdd(ctx, k1) ks.XXXTestingOnlyAdd(ctx, k2) require.NoError(t, ks.Add(ctx, k1.Address, testutils.FixtureChainID)) require.NoError(t, ks.Enable(ctx, k1.Address, testutils.FixtureChainID)) states, err := ks.GetStatesForKeys(ctx, []ethkey.KeyV2{k1, k2}) require.NoError(t, err) assert.Len(t, states, 1) chainStates, err := ks.GetStatesForChain(ctx, testutils.FixtureChainID) require.NoError(t, err) assert.Len(t, chainStates, 2) // one created here, one created above chainStates, err = ks.GetStatesForChain(ctx, testutils.SimulatedChainID) require.NoError(t, err) assert.Len(t, chainStates, 0) })` $DIR/core/services/keystore/eth_test.go: `ks.XXXTestingOnlyAdd(ctx, k1)` $DIR/core/services/keystore/eth_test.go: `ks.XXXTestingOnlyAdd(ctx, k2)` $DIR/core/services/keystore/eth_test.go: `chainStates, err = ks.GetStatesForChain(ctx, testutils.SimulatedChainID)` $DIR/core/services/keystore/eth_test.go: `close(chDone)` $DIR/core/services/keystore/eth_test.go: `count.Add(1)` $DIR/core/services/keystore/eth_test.go: `<-chSub` $DIR/core/services/keystore/eth_test.go: `count.Store(0)` $DIR/core/services/keystore/eth_test.go: `assertCountAtLeast(1)` $DIR/core/services/keystore/eth_test.go: `drainAndReset()` $DIR/core/services/keystore/eth_test.go: `assertCountAtLeast(1)` $DIR/core/services/keystore/eth_test.go: `drainAndReset()` $DIR/core/services/keystore/eth_test.go: `assertCountAtLeast(1)` $DIR/core/services/keystore/eth_test.go: `drainAndReset()` $DIR/core/services/keystore/eth_test.go: `t.Run("already existing disabled key gets enabled", func(t *testing.T) { ctx := testutils.Context(t) k, _ := cltest.MustInsertRandomKeyNoChains(t, ks) require.NoError(t, ks.Add(ctx, k.Address, testutils.SimulatedChainID)) require.NoError(t, ks.Disable(ctx, k.Address, testutils.SimulatedChainID)) require.NoError(t, ks.Enable(ctx, k.Address, testutils.SimulatedChainID)) key, err := ks.GetState(ctx, k.Address.Hex(), testutils.SimulatedChainID) require.NoError(t, err) require.Equal(t, key.Disabled, false) })` $DIR/core/services/keystore/eth_test.go: `t.Run("creates key, deletes it unsafely and then enable creates it again", func(t *testing.T) { ctx := testutils.Context(t) k, _ := cltest.MustInsertRandomKeyNoChains(t, ks) require.NoError(t, ks.Add(ctx, k.Address, testutils.SimulatedChainID)) _, err := db.Exec("DELETE FROM evm.key_states WHERE address = $1", k.Address) require.NoError(t, err) require.NoError(t, ks.Enable(ctx, k.Address, testutils.SimulatedChainID)) key, err := ks.GetState(ctx, k.Address.Hex(), testutils.SimulatedChainID) require.NoError(t, err) require.Equal(t, key.Disabled, false) })` $DIR/core/services/keystore/eth_test.go: `t.Run("creates key and enables it if it exists in the keystore, but is missing from key states db table", func(t *testing.T) { ctx := testutils.Context(t) k, _ := cltest.MustInsertRandomKeyNoChains(t, ks) require.NoError(t, ks.Enable(ctx, k.Address, testutils.SimulatedChainID)) key, err := ks.GetState(ctx, k.Address.Hex(), testutils.SimulatedChainID) require.NoError(t, err) require.Equal(t, key.Disabled, false) })` $DIR/core/services/keystore/eth_test.go: `t.Run("creates one unique key per chain if none exist", func(t *testing.T) { ctx := testutils.Context(t) db := pgtest.NewSqlxDB(t) keyStore := cltest.NewKeyStore(t, db) ks := keyStore.Eth() testutils.AssertCount(t, db, "evm.key_states", 0) err := ks.EnsureKeys(ctx, testutils.FixtureChainID, testutils.SimulatedChainID) require.NoError(t, err) testutils.AssertCount(t, db, "evm.key_states", 2) keys, err := ks.GetAll(ctx) require.NoError(t, err) assert.Len(t, keys, 2) })` $DIR/core/services/keystore/eth_test.go: `testutils.AssertCount(t, db, "evm.key_states", 0)` $DIR/core/services/keystore/eth_test.go: `testutils.AssertCount(t, db, "evm.key_states", 2)` $DIR/core/services/keystore/eth_test.go: `t.Run("does nothing if a key exists for a chain", func(t *testing.T) { ctx := testutils.Context(t) db := pgtest.NewSqlxDB(t) keyStore := cltest.NewKeyStore(t, db) ks := keyStore.Eth() // Add one enabled key _, err := ks.Create(ctx, testutils.FixtureChainID) require.NoError(t, err) testutils.AssertCount(t, db, "evm.key_states", 1) keys, err := ks.GetAll(ctx) require.NoError(t, err) assert.Len(t, keys, 1) // this adds one more key for the additional chain err = ks.EnsureKeys(ctx, testutils.FixtureChainID, testutils.SimulatedChainID) require.NoError(t, err) testutils.AssertCount(t, db, "evm.key_states", 2) keys, err = ks.GetAll(ctx) require.NoError(t, err) assert.Len(t, keys, 2) })` $DIR/core/services/keystore/eth_test.go: `testutils.AssertCount(t, db, "evm.key_states", 1)` $DIR/core/services/keystore/eth_test.go: `err = ks.EnsureKeys(ctx, testutils.FixtureChainID, testutils.SimulatedChainID)` $DIR/core/services/keystore/eth_test.go: `testutils.AssertCount(t, db, "evm.key_states", 2)` $DIR/core/services/keystore/eth_test.go: `keys, err = ks.GetAll(ctx)` $DIR/core/services/keystore/eth_test.go: `testutils.AssertCount(t, db, "evm.key_states", 1)` $DIR/core/services/keystore/eth_test.go: `err = ks.Disable(ctx, k.Address, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `err = ks.EnsureKeys(ctx, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `testutils.AssertCount(t, db, "evm.key_states", 1)` $DIR/core/services/keystore/eth_test.go: `keys, err = ks.GetAll(ctx)` $DIR/core/services/keystore/eth_test.go: `cltest.MustInsertRandomKey(t, ks, *ubig.New(testutils.SimulatedChainID))` $DIR/core/services/keystore/eth_test.go: `testutils.AssertCount(t, db, "evm.key_states", 4)` $DIR/core/services/keystore/eth_test.go: `_, err = ks.GetState(ctx, addr1.Hex(), testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `_, err = ks.GetState(ctx, addr1.Hex(), testutils.SimulatedChainID)` $DIR/core/services/keystore/eth_test.go: `testutils.AssertCount(t, db, "evm.key_states", 2)` $DIR/core/services/keystore/eth_test.go: `keys, err = ks.GetAll(ctx)` $DIR/core/services/keystore/eth_test.go: `_, err = ks.GetState(ctx, addr1.Hex(), testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `_, err = ks.GetState(ctx, addr1.Hex(), testutils.SimulatedChainID)` $DIR/core/services/keystore/eth_test.go: `_, err = ks.GetState(ctx, addr2.Hex(), testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `t.Run("enabling the same key multiple times does not create duplicate states", func(t *testing.T) { ctx2 := testutils.Context(t) require.NoError(t, ks.Enable(ctx2, k1.Address, testutils.FixtureChainID)) require.NoError(t, ks.Enable(ctx2, k1.Address, testutils.FixtureChainID)) require.NoError(t, ks.Enable(ctx2, k1.Address, testutils.FixtureChainID)) require.NoError(t, ks.Enable(ctx2, k1.Address, testutils.FixtureChainID)) states, err := ks.GetStatesForKeys(ctx2, []ethkey.KeyV2{k1}) require.NoError(t, err) assert.Len(t, states, 2) var cids []*big.Int for i := range states { cid := states[i].EVMChainID.ToInt() cids = append(cids, cid) } assert.Contains(t, cids, testutils.FixtureChainID) assert.Contains(t, cids, testutils.SimulatedChainID) for _, s := range states { assert.Equal(t, addr1, s.Address.Address()) } })` $DIR/core/services/keystore/eth_test.go: `cids = append(cids, cid)` $DIR/core/services/keystore/eth_test.go: `t.Run("returns nil when key is enabled for given chain", func(t *testing.T) { err := ks.CheckEnabled(ctx, addr1, testutils.FixtureChainID) assert.NoError(t, err) err = ks.CheckEnabled(ctx, addr1, testutils.SimulatedChainID) assert.NoError(t, err) })` $DIR/core/services/keystore/eth_test.go: `err = ks.CheckEnabled(ctx, addr1, testutils.SimulatedChainID)` $DIR/core/services/keystore/eth_test.go: `t.Run("returns error when key does not exist", func(t *testing.T) { addr := utils.RandomAddress() err := ks.CheckEnabled(ctx, addr, testutils.FixtureChainID) assert.Error(t, err) require.Contains(t, err.Error(), fmt.Sprintf("no eth key exists with address %s", addr.Hex())) })` $DIR/core/services/keystore/eth_test.go: `t.Run("returns error when key exists but has never been enabled (no state) for the given chain", func(t *testing.T) { err := ks.CheckEnabled(ctx, addr3, testutils.FixtureChainID) assert.Error(t, err) require.Contains(t, err.Error(), fmt.Sprintf("eth key with address %s exists but is has not been enabled for chain 0 (enabled only for chain IDs: 1337)", addr3.Hex())) })` $DIR/core/services/keystore/eth_test.go: `t.Run("creates key, deletes it unsafely and then enable creates it again", func(t *testing.T) { ctx := testutils.Context(t) k, _ := cltest.MustInsertRandomKeyNoChains(t, ks) require.NoError(t, ks.Add(ctx, k.Address, testutils.SimulatedChainID)) _, err := db.Exec("DELETE FROM evm.key_states WHERE address = $1", k.Address) require.NoError(t, err) require.NoError(t, ks.Disable(ctx, k.Address, testutils.SimulatedChainID)) key, err := ks.GetState(ctx, k.Address.Hex(), testutils.SimulatedChainID) require.NoError(t, err) require.Equal(t, key.Disabled, true) })` $DIR/core/services/keystore/eth_test.go: `t.Run("creates key and enables it if it exists in the keystore, but is missing from key states db table", func(t *testing.T) { ctx := testutils.Context(t) k, _ := cltest.MustInsertRandomKeyNoChains(t, ks) require.NoError(t, ks.Disable(ctx, k.Address, testutils.SimulatedChainID)) key, err := ks.GetState(ctx, k.Address.Hex(), testutils.SimulatedChainID) require.NoError(t, err) require.Equal(t, key.Disabled, true) })` $DIR/core/services/keystore/eth_test.go: `.NewSqlxDB(t)` $DIR/core/services/keystore/eth_test.go: `.ExposedNewMaster(t, db)` $DIR/core/services/keystore/eth_test.go: `.Unlock(testutils.Context(t), cltest.Password)` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.Eth()` $DIR/core/services/keystore/eth_test.go: `.Background()` $DIR/core/services/keystore/eth_test.go: `.ResetXXXTestOnly()` $DIR/core/services/keystore/eth_test.go: `.Run("Create / GetAll / Get", func(t *testing.T) { ctx := testutils.Context(t) defer reset() key, err := ethKeyStore.Create(ctx, &cltest.FixtureChainID) require.NoError(t, err) retrievedKeys, err := ethKeyStore.GetAll(ctx) require.NoError(t, err) require.Equal(t, 1, len(retrievedKeys)) require.Equal(t, key.Address, retrievedKeys[0].Address) foundKey, err := ethKeyStore.Get(ctx, key.Address.Hex()) require.NoError(t, err) require.Equal(t, key, foundKey) // adds ethkey.State cltest.AssertCount(t, db, statesTableName, 1) var state ethkey.State sql := fmt.Sprintf(`SELECT address, disabled, evm_chain_id, created_at, updated_at from %s LIMIT 1`, statesTableName) require.NoError(t, db.GetContext(ctx, &state, sql)) require.Equal(t, state.Address.Address(), retrievedKeys[0].Address) // adds key to db keyStore.ResetXXXTestOnly() require.NoError(t, keyStore.Unlock(ctx, cltest.Password)) retrievedKeys, err = ethKeyStore.GetAll(ctx) require.NoError(t, err) require.Equal(t, 1, len(retrievedKeys)) require.Equal(t, key.Address, retrievedKeys[0].Address) // adds 2nd key _, err = ethKeyStore.Create(ctx, &cltest.FixtureChainID) require.NoError(t, err) retrievedKeys, err = ethKeyStore.GetAll(ctx) require.NoError(t, err) require.Equal(t, 2, len(retrievedKeys)) })` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.Create(ctx, &cltest.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.GetAll(ctx)` $DIR/core/services/keystore/eth_test.go: `.Get(ctx, key.Address.Hex())` $DIR/core/services/keystore/eth_test.go: `.Address.Hex()` $DIR/core/services/keystore/eth_test.go: `.AssertCount(t, db, statesTableName, 1)` $DIR/core/services/keystore/eth_test.go: `.Sprintf(`SELECT address, disabled, evm_chain_id, created_at, updated_at from %s LIMIT 1`, statesTableName)` $DIR/core/services/keystore/eth_test.go: `.ResetXXXTestOnly()` $DIR/core/services/keystore/eth_test.go: `.GetAll(ctx)` $DIR/core/services/keystore/eth_test.go: `.Create(ctx, &cltest.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.GetAll(ctx)` $DIR/core/services/keystore/eth_test.go: `.Run("GetAll ordering", func(t *testing.T) { ctx := testutils.Context(t) defer reset() var keys []ethkey.KeyV2 for i := 0; i < 5; i++ { key, err := ethKeyStore.Create(ctx, &cltest.FixtureChainID) require.NoError(t, err) keys = append(keys, key) } retrievedKeys, err := ethKeyStore.GetAll(ctx) require.NoError(t, err) require.Equal(t, 5, len(retrievedKeys)) sort.Slice(keys, func(i, j int) bool { return keys[i].Cmp(keys[j]) < 0 }) assert.Equal(t, keys, retrievedKeys) })` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.Create(ctx, &cltest.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.GetAll(ctx)` $DIR/core/services/keystore/eth_test.go: `.Slice(keys, func(i, j int) bool { return keys[i].Cmp(keys[j]) < 0 })` $DIR/core/services/keystore/eth_test.go: `.Cmp(keys[j])` $DIR/core/services/keystore/eth_test.go: `.Run("RemoveKey", func(t *testing.T) { ctx := testutils.Context(t) defer reset() key, err := ethKeyStore.Create(ctx, &cltest.FixtureChainID) require.NoError(t, err) _, err = ethKeyStore.Delete(ctx, key.ID()) require.NoError(t, err) retrievedKeys, err := ethKeyStore.GetAll(ctx) require.NoError(t, err) require.Equal(t, 0, len(retrievedKeys)) cltest.AssertCount(t, db, statesTableName, 0) })` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.Create(ctx, &cltest.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.Delete(ctx, key.ID())` $DIR/core/services/keystore/eth_test.go: `.ID()` $DIR/core/services/keystore/eth_test.go: `.GetAll(ctx)` $DIR/core/services/keystore/eth_test.go: `.AssertCount(t, db, statesTableName, 0)` $DIR/core/services/keystore/eth_test.go: `.Run("Delete removes key even if evm.txes are present", func(t *testing.T) { ctx := testutils.Context(t) defer reset() key, err := ethKeyStore.Create(ctx, &cltest.FixtureChainID) require.NoError(t, err) // ensure at least one state is present cltest.AssertCount(t, db, statesTableName, 1) // add one eth_tx txStore := cltest.NewTestTxStore(t, db) cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 0, 42, key.Address) _, err = ethKeyStore.Delete(ctx, key.ID()) require.NoError(t, err) retrievedKeys, err := ethKeyStore.GetAll(ctx) require.NoError(t, err) require.Equal(t, 0, len(retrievedKeys)) cltest.AssertCount(t, db, statesTableName, 0) })` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.Create(ctx, &cltest.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.AssertCount(t, db, statesTableName, 1)` $DIR/core/services/keystore/eth_test.go: `.NewTestTxStore(t, db)` $DIR/core/services/keystore/eth_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 0, 42, key.Address)` $DIR/core/services/keystore/eth_test.go: `.Delete(ctx, key.ID())` $DIR/core/services/keystore/eth_test.go: `.ID()` $DIR/core/services/keystore/eth_test.go: `.GetAll(ctx)` $DIR/core/services/keystore/eth_test.go: `.AssertCount(t, db, statesTableName, 0)` $DIR/core/services/keystore/eth_test.go: `.Run("EnsureKeys / EnabledKeysForChain", func(t *testing.T) { ctx := testutils.Context(t) defer reset() err := ethKeyStore.EnsureKeys(ctx, &cltest.FixtureChainID) assert.NoError(t, err) sendingKeys1, err := ethKeyStore.EnabledKeysForChain(ctx, testutils.FixtureChainID) assert.NoError(t, err) require.Equal(t, 1, len(sendingKeys1)) cltest.AssertCount(t, db, statesTableName, 1) err = ethKeyStore.EnsureKeys(ctx, &cltest.FixtureChainID) assert.NoError(t, err) sendingKeys2, err := ethKeyStore.EnabledKeysForChain(ctx, testutils.FixtureChainID) assert.NoError(t, err) require.Equal(t, 1, len(sendingKeys2)) require.Equal(t, sendingKeys1, sendingKeys2) })` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.EnsureKeys(ctx, &cltest.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.EnabledKeysForChain(ctx, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.AssertCount(t, db, statesTableName, 1)` $DIR/core/services/keystore/eth_test.go: `.EnsureKeys(ctx, &cltest.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.EnabledKeysForChain(ctx, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.Run("EnabledKeysForChain with specified chain ID", func(t *testing.T) { ctx := testutils.Context(t) defer reset() key, err := ethKeyStore.Create(ctx, testutils.FixtureChainID) require.NoError(t, err) key2, err := ethKeyStore.Create(ctx, big.NewInt(1337)) require.NoError(t, err) keys, err := ethKeyStore.EnabledKeysForChain(ctx, testutils.FixtureChainID) require.NoError(t, err) require.Len(t, keys, 1) require.Equal(t, key, keys[0]) keys, err = ethKeyStore.EnabledKeysForChain(ctx, big.NewInt(1337)) require.NoError(t, err) require.Len(t, keys, 1) require.Equal(t, key2, keys[0]) _, err = ethKeyStore.EnabledKeysForChain(ctx, nil) assert.Error(t, err) assert.EqualError(t, err, "chainID must be non-nil") })` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.Create(ctx, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.Create(ctx, big.NewInt(1337))` $DIR/core/services/keystore/eth_test.go: `.NewInt(1337)` $DIR/core/services/keystore/eth_test.go: `.EnabledKeysForChain(ctx, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.EnabledKeysForChain(ctx, big.NewInt(1337))` $DIR/core/services/keystore/eth_test.go: `.NewInt(1337)` $DIR/core/services/keystore/eth_test.go: `.EnabledKeysForChain(ctx, nil)` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.Create(ctx, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.Create(ctx, big.NewInt(1337))` $DIR/core/services/keystore/eth_test.go: `.NewInt(1337)` $DIR/core/services/keystore/eth_test.go: `.AssertCount(t, db, "evm.key_states", 2)` $DIR/core/services/keystore/eth_test.go: `.GetAll(ctx)` $DIR/core/services/keystore/eth_test.go: `.EnabledAddressesForChain(ctx, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.EnabledAddressesForChain(ctx, big.NewInt(1337))` $DIR/core/services/keystore/eth_test.go: `.NewInt(1337)` $DIR/core/services/keystore/eth_test.go: `.EnabledAddressesForChain(ctx, nil)` $DIR/core/services/keystore/eth_test.go: `.Disable(ctx, key.Address, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.EnabledAddressesForChain(ctx, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.EnabledAddressesForChain(ctx, big.NewInt(1337))` $DIR/core/services/keystore/eth_test.go: `.NewInt(1337)` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.NewSqlxDB(t)` $DIR/core/services/keystore/eth_test.go: `.NewKeyStore(t, db)` $DIR/core/services/keystore/eth_test.go: `.Eth()` $DIR/core/services/keystore/eth_test.go: `.Run("should error when no addresses", func(t *testing.T) { ctx1 := testutils.Context(t) _, err := ethKeyStore.GetRoundRobinAddress(ctx1, testutils.FixtureChainID) require.Error(t, err) })` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.GetRoundRobinAddress(ctx1, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.MustInsertRandomKeyNoChains(t, ethKeyStore)` $DIR/core/services/keystore/eth_test.go: `.MustInsertRandomKeyNoChains(t, ethKeyStore)` $DIR/core/services/keystore/eth_test.go: `.MustInsertRandomKeyNoChains(t, ethKeyStore)` $DIR/core/services/keystore/eth_test.go: `.MustInsertRandomKeyNoChains(t, ethKeyStore)` $DIR/core/services/keystore/eth_test.go: `.Run("with no address filter, rotates between all enabled addresses", func(t *testing.T) { address1, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.FixtureChainID) require.NoError(t, err) address2, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.FixtureChainID) require.NoError(t, err) address3, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.FixtureChainID) require.NoError(t, err) address4, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.FixtureChainID) require.NoError(t, err) address5, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.FixtureChainID) require.NoError(t, err) address6, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.FixtureChainID) require.NoError(t, err) assert.NotEqual(t, address1, address2) assert.NotEqual(t, address2, address3) assert.NotEqual(t, address1, address3) assert.Equal(t, address1, address4) assert.Equal(t, address2, address5) assert.Equal(t, address3, address6) })` $DIR/core/services/keystore/eth_test.go: `.GetRoundRobinAddress(ctx, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.GetRoundRobinAddress(ctx, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.GetRoundRobinAddress(ctx, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.GetRoundRobinAddress(ctx, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.GetRoundRobinAddress(ctx, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.GetRoundRobinAddress(ctx, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.Run("with address filter, rotates between given addresses that match sending keys", func(t *testing.T) { { // k3 is a disabled address for FixtureChainID so even though it's whitelisted, it will be ignored addresses := []common.Address{k4.Address, k3.Address, k1.Address, k2.Address, testutils.NewAddress()} address1, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.FixtureChainID, addresses...) require.NoError(t, err) address2, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.FixtureChainID, addresses...) require.NoError(t, err) address3, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.FixtureChainID, addresses...) require.NoError(t, err) address4, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.FixtureChainID, addresses...) require.NoError(t, err) assert.NotEqual(t, k3.Address, address1) assert.NotEqual(t, k3.Address, address2) assert.NotEqual(t, k3.Address, address3) assert.NotEqual(t, address1, address2) assert.NotEqual(t, address1, address3) assert.NotEqual(t, address2, address3) assert.Equal(t, address1, address4) } { // k2 and k4 are disabled address for SimulatedChainID so even though it's whitelisted, it will be ignored addresses := []common.Address{k4.Address, k3.Address, k1.Address, k2.Address, testutils.NewAddress()} address1, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.SimulatedChainID, addresses...) require.NoError(t, err) address2, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.SimulatedChainID, addresses...) require.NoError(t, err) address3, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.SimulatedChainID, addresses...) require.NoError(t, err) address4, err := ethKeyStore.GetRoundRobinAddress(ctx, testutils.SimulatedChainID, addresses...) require.NoError(t, err) assert.True(t, address1 == k1.Address || address1 == k3.Address) assert.True(t, address2 == k1.Address || address2 == k3.Address) assert.NotEqual(t, address1, address2) assert.Equal(t, address1, address3) assert.Equal(t, address2, address4) } })` $DIR/core/services/keystore/eth_test.go: `.NewAddress()` $DIR/core/services/keystore/eth_test.go: `.GetRoundRobinAddress(ctx, testutils.FixtureChainID, addresses...)` $DIR/core/services/keystore/eth_test.go: `.GetRoundRobinAddress(ctx, testutils.FixtureChainID, addresses...)` $DIR/core/services/keystore/eth_test.go: `.GetRoundRobinAddress(ctx, testutils.FixtureChainID, addresses...)` $DIR/core/services/keystore/eth_test.go: `.GetRoundRobinAddress(ctx, testutils.FixtureChainID, addresses...)` $DIR/core/services/keystore/eth_test.go: `.NewAddress()` $DIR/core/services/keystore/eth_test.go: `.GetRoundRobinAddress(ctx, testutils.SimulatedChainID, addresses...)` $DIR/core/services/keystore/eth_test.go: `.GetRoundRobinAddress(ctx, testutils.SimulatedChainID, addresses...)` $DIR/core/services/keystore/eth_test.go: `.GetRoundRobinAddress(ctx, testutils.SimulatedChainID, addresses...)` $DIR/core/services/keystore/eth_test.go: `.GetRoundRobinAddress(ctx, testutils.SimulatedChainID, addresses...)` $DIR/core/services/keystore/eth_test.go: `.NewAddress()` $DIR/core/services/keystore/eth_test.go: `.GetRoundRobinAddress(ctx, testutils.FixtureChainID, []common.Address{addr}...)` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.NewSqlxDB(t)` $DIR/core/services/keystore/eth_test.go: `.NewKeyStore(t, db)` $DIR/core/services/keystore/eth_test.go: `.Eth()` $DIR/core/services/keystore/eth_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/services/keystore/eth_test.go: `.NewInt(evmclient.NullClientChainID)` $DIR/core/services/keystore/eth_test.go: `.NewLegacyTransaction(0, testutils.NewAddress(), big.NewInt(53), 21000, big.NewInt(1000000000), []byte{1, 2, 3, 4})` $DIR/core/services/keystore/eth_test.go: `.NewAddress()` $DIR/core/services/keystore/eth_test.go: `.NewInt(53)` $DIR/core/services/keystore/eth_test.go: `.NewInt(1000000000)` $DIR/core/services/keystore/eth_test.go: `.NewAddress()` $DIR/core/services/keystore/eth_test.go: `.SignTx(ctx, randomAddress, tx, chainID)` $DIR/core/services/keystore/eth_test.go: `.SignTx(ctx, k.Address, tx, chainID)` $DIR/core/services/keystore/eth_test.go: `.NewSqlxDB(t)` $DIR/core/services/keystore/eth_test.go: `.ExposedNewMaster(t, db)` $DIR/core/services/keystore/eth_test.go: `.Unlock(testutils.Context(t), cltest.Password)` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.Eth()` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.ResetXXXTestOnly()` $DIR/core/services/keystore/eth_test.go: `.Run("initializes with an empty state", func(t *testing.T) { ctx := testutils.Context(t) defer reset() keys, err := ks.GetAll(ctx) require.NoError(t, err) require.Equal(t, 0, len(keys)) })` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.GetAll(ctx)` $DIR/core/services/keystore/eth_test.go: `.Run("errors when getting non-existent ID", func(t *testing.T) { ctx := testutils.Context(t) defer reset() _, err := ks.Get(ctx, "non-existent-id") require.Error(t, err) })` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.Get(ctx, "non-existent-id")` $DIR/core/services/keystore/eth_test.go: `.Run("creates a key", func(t *testing.T) { ctx := testutils.Context(t) defer reset() key, err := ks.Create(ctx, &cltest.FixtureChainID) require.NoError(t, err) retrievedKey, err := ks.Get(ctx, key.ID()) require.NoError(t, err) require.Equal(t, key, retrievedKey) })` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.Create(ctx, &cltest.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.Get(ctx, key.ID())` $DIR/core/services/keystore/eth_test.go: `.ID()` $DIR/core/services/keystore/eth_test.go: `.Run("imports and exports a key", func(t *testing.T) { ctx := testutils.Context(t) defer reset() key, err := ks.Create(ctx, &cltest.FixtureChainID) require.NoError(t, err) exportJSON, err := ks.Export(ctx, key.ID(), cltest.Password) require.NoError(t, err) _, err = ks.Delete(ctx, key.ID()) require.NoError(t, err) _, err = ks.Get(ctx, key.ID()) require.Error(t, err) importedKey, err := ks.Import(ctx, exportJSON, cltest.Password, &cltest.FixtureChainID) require.NoError(t, err) require.Equal(t, key.ID(), importedKey.ID()) retrievedKey, err := ks.Get(ctx, key.ID()) require.NoError(t, err) require.Equal(t, importedKey, retrievedKey) })` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.Create(ctx, &cltest.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.Export(ctx, key.ID(), cltest.Password)` $DIR/core/services/keystore/eth_test.go: `.ID()` $DIR/core/services/keystore/eth_test.go: `.Delete(ctx, key.ID())` $DIR/core/services/keystore/eth_test.go: `.ID()` $DIR/core/services/keystore/eth_test.go: `.Get(ctx, key.ID())` $DIR/core/services/keystore/eth_test.go: `.ID()` $DIR/core/services/keystore/eth_test.go: `.Import(ctx, exportJSON, cltest.Password, &cltest.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.Get(ctx, key.ID())` $DIR/core/services/keystore/eth_test.go: `.ID()` $DIR/core/services/keystore/eth_test.go: `.Run("adds an externally created key / deletes a key", func(t *testing.T) { ctx := testutils.Context(t) defer reset() newKey, err := ethkey.NewV2() require.NoError(t, err) ks.XXXTestingOnlyAdd(ctx, newKey) keys, err := ks.GetAll(ctx) require.NoError(t, err) assert.Equal(t, 1, len(keys)) _, err = ks.Delete(ctx, newKey.ID()) require.NoError(t, err) keys, err = ks.GetAll(ctx) require.NoError(t, err) assert.Equal(t, 0, len(keys)) _, err = ks.Get(ctx, newKey.ID()) assert.Error(t, err) _, err = ks.Delete(ctx, newKey.ID()) assert.Error(t, err) })` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.NewV2()` $DIR/core/services/keystore/eth_test.go: `.XXXTestingOnlyAdd(ctx, newKey)` $DIR/core/services/keystore/eth_test.go: `.GetAll(ctx)` $DIR/core/services/keystore/eth_test.go: `.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/eth_test.go: `.ID()` $DIR/core/services/keystore/eth_test.go: `.GetAll(ctx)` $DIR/core/services/keystore/eth_test.go: `.Get(ctx, newKey.ID())` $DIR/core/services/keystore/eth_test.go: `.ID()` $DIR/core/services/keystore/eth_test.go: `.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/eth_test.go: `.ID()` $DIR/core/services/keystore/eth_test.go: `.Run("imports a key exported from a v1 keystore", func(t *testing.T) { ctx := testutils.Context(t) exportedKey := `{"address":"0dd359b4f22a30e44b2fd744b679971941865820","crypto":{"cipher":"aes-128-ctr","ciphertext":"b30af964a3b3f37894e599446b4cf2314bbfcd1062e6b35b620d3d20bd9965cc","cipherparams":{"iv":"58a8d75629cc1945da7cf8c24520d1dc"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"c352887e9d427d8a6a1869082619b73fac4566082a99f6e367d126f11b434f28"},"mac":"fd76a588210e0bf73d01332091e0e83a4584ee2df31eaec0e27f9a1b94f024b4"},"id":"a5ee0802-1d7b-45b6-aeb8-ea8a3351e715","version":3}` importedKey, err := ks.Import(ctx, []byte(exportedKey), "p4SsW0rD1!@#_", &cltest.FixtureChainID) require.NoError(t, err) assert.Equal(t, "0x0dd359b4f22a30E44b2fD744B679971941865820", importedKey.ID()) k, err := ks.Import(ctx, []byte(exportedKey), cltest.Password, &cltest.FixtureChainID) assert.Empty(t, k) assert.Error(t, err) })` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.Import(ctx, []byte(exportedKey), "p4SsW0rD1!@#_", &cltest.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.Import(ctx, []byte(exportedKey), cltest.Password, &cltest.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.Run("fails to export a non-existent key", func(t *testing.T) { ctx := testutils.Context(t) k, err := ks.Export(ctx, "non-existent", cltest.Password) assert.Empty(t, k) assert.Error(t, err) })` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.Export(ctx, "non-existent", cltest.Password)` $DIR/core/services/keystore/eth_test.go: `.Run("returns states for keys", func(t *testing.T) { ctx := testutils.Context(t) k1, err := ethkey.NewV2() require.NoError(t, err) k2, err := ethkey.NewV2() require.NoError(t, err) ks.XXXTestingOnlyAdd(ctx, k1) ks.XXXTestingOnlyAdd(ctx, k2) require.NoError(t, ks.Add(ctx, k1.Address, testutils.FixtureChainID)) require.NoError(t, ks.Enable(ctx, k1.Address, testutils.FixtureChainID)) states, err := ks.GetStatesForKeys(ctx, []ethkey.KeyV2{k1, k2}) require.NoError(t, err) assert.Len(t, states, 1) chainStates, err := ks.GetStatesForChain(ctx, testutils.FixtureChainID) require.NoError(t, err) assert.Len(t, chainStates, 2) // one created here, one created above chainStates, err = ks.GetStatesForChain(ctx, testutils.SimulatedChainID) require.NoError(t, err) assert.Len(t, chainStates, 0) })` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.NewV2()` $DIR/core/services/keystore/eth_test.go: `.NewV2()` $DIR/core/services/keystore/eth_test.go: `.XXXTestingOnlyAdd(ctx, k1)` $DIR/core/services/keystore/eth_test.go: `.XXXTestingOnlyAdd(ctx, k2)` $DIR/core/services/keystore/eth_test.go: `.GetStatesForKeys(ctx, []ethkey.KeyV2{k1, k2})` $DIR/core/services/keystore/eth_test.go: `.GetStatesForChain(ctx, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.GetStatesForChain(ctx, testutils.SimulatedChainID)` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.NewSqlxDB(t)` $DIR/core/services/keystore/eth_test.go: `.NewKeyStore(t, db)` $DIR/core/services/keystore/eth_test.go: `.Eth()` $DIR/core/services/keystore/eth_test.go: `.SubscribeToKeyChanges(ctx)` $DIR/core/services/keystore/eth_test.go: `.Add(1)` $DIR/core/services/keystore/eth_test.go: `.Store(0)` $DIR/core/services/keystore/eth_test.go: `.EnsureKeys(ctx, &cltest.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.Create(ctx, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.NewSqlxDB(t)` $DIR/core/services/keystore/eth_test.go: `.NewKeyStore(t, db)` $DIR/core/services/keystore/eth_test.go: `.Eth()` $DIR/core/services/keystore/eth_test.go: `.Run("already existing disabled key gets enabled", func(t *testing.T) { ctx := testutils.Context(t) k, _ := cltest.MustInsertRandomKeyNoChains(t, ks) require.NoError(t, ks.Add(ctx, k.Address, testutils.SimulatedChainID)) require.NoError(t, ks.Disable(ctx, k.Address, testutils.SimulatedChainID)) require.NoError(t, ks.Enable(ctx, k.Address, testutils.SimulatedChainID)) key, err := ks.GetState(ctx, k.Address.Hex(), testutils.SimulatedChainID) require.NoError(t, err) require.Equal(t, key.Disabled, false) })` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.MustInsertRandomKeyNoChains(t, ks)` $DIR/core/services/keystore/eth_test.go: `.GetState(ctx, k.Address.Hex(), testutils.SimulatedChainID)` $DIR/core/services/keystore/eth_test.go: `.Address.Hex()` $DIR/core/services/keystore/eth_test.go: `.Run("creates key, deletes it unsafely and then enable creates it again", func(t *testing.T) { ctx := testutils.Context(t) k, _ := cltest.MustInsertRandomKeyNoChains(t, ks) require.NoError(t, ks.Add(ctx, k.Address, testutils.SimulatedChainID)) _, err := db.Exec("DELETE FROM evm.key_states WHERE address = $1", k.Address) require.NoError(t, err) require.NoError(t, ks.Enable(ctx, k.Address, testutils.SimulatedChainID)) key, err := ks.GetState(ctx, k.Address.Hex(), testutils.SimulatedChainID) require.NoError(t, err) require.Equal(t, key.Disabled, false) })` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.MustInsertRandomKeyNoChains(t, ks)` $DIR/core/services/keystore/eth_test.go: `.Exec("DELETE FROM evm.key_states WHERE address = $1", k.Address)` $DIR/core/services/keystore/eth_test.go: `.GetState(ctx, k.Address.Hex(), testutils.SimulatedChainID)` $DIR/core/services/keystore/eth_test.go: `.Address.Hex()` $DIR/core/services/keystore/eth_test.go: `.Run("creates key and enables it if it exists in the keystore, but is missing from key states db table", func(t *testing.T) { ctx := testutils.Context(t) k, _ := cltest.MustInsertRandomKeyNoChains(t, ks) require.NoError(t, ks.Enable(ctx, k.Address, testutils.SimulatedChainID)) key, err := ks.GetState(ctx, k.Address.Hex(), testutils.SimulatedChainID) require.NoError(t, err) require.Equal(t, key.Disabled, false) })` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.MustInsertRandomKeyNoChains(t, ks)` $DIR/core/services/keystore/eth_test.go: `.GetState(ctx, k.Address.Hex(), testutils.SimulatedChainID)` $DIR/core/services/keystore/eth_test.go: `.Address.Hex()` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.NewAddress()` $DIR/core/services/keystore/eth_test.go: `.GetState(ctx, addrNotInKs.Hex(), testutils.SimulatedChainID)` $DIR/core/services/keystore/eth_test.go: `.Hex()` $DIR/core/services/keystore/eth_test.go: `.Run("creates one unique key per chain if none exist", func(t *testing.T) { ctx := testutils.Context(t) db := pgtest.NewSqlxDB(t) keyStore := cltest.NewKeyStore(t, db) ks := keyStore.Eth() testutils.AssertCount(t, db, "evm.key_states", 0) err := ks.EnsureKeys(ctx, testutils.FixtureChainID, testutils.SimulatedChainID) require.NoError(t, err) testutils.AssertCount(t, db, "evm.key_states", 2) keys, err := ks.GetAll(ctx) require.NoError(t, err) assert.Len(t, keys, 2) })` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.NewSqlxDB(t)` $DIR/core/services/keystore/eth_test.go: `.NewKeyStore(t, db)` $DIR/core/services/keystore/eth_test.go: `.Eth()` $DIR/core/services/keystore/eth_test.go: `.AssertCount(t, db, "evm.key_states", 0)` $DIR/core/services/keystore/eth_test.go: `.EnsureKeys(ctx, testutils.FixtureChainID, testutils.SimulatedChainID)` $DIR/core/services/keystore/eth_test.go: `.AssertCount(t, db, "evm.key_states", 2)` $DIR/core/services/keystore/eth_test.go: `.GetAll(ctx)` $DIR/core/services/keystore/eth_test.go: `.Run("does nothing if a key exists for a chain", func(t *testing.T) { ctx := testutils.Context(t) db := pgtest.NewSqlxDB(t) keyStore := cltest.NewKeyStore(t, db) ks := keyStore.Eth() // Add one enabled key _, err := ks.Create(ctx, testutils.FixtureChainID) require.NoError(t, err) testutils.AssertCount(t, db, "evm.key_states", 1) keys, err := ks.GetAll(ctx) require.NoError(t, err) assert.Len(t, keys, 1) // this adds one more key for the additional chain err = ks.EnsureKeys(ctx, testutils.FixtureChainID, testutils.SimulatedChainID) require.NoError(t, err) testutils.AssertCount(t, db, "evm.key_states", 2) keys, err = ks.GetAll(ctx) require.NoError(t, err) assert.Len(t, keys, 2) })` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.NewSqlxDB(t)` $DIR/core/services/keystore/eth_test.go: `.NewKeyStore(t, db)` $DIR/core/services/keystore/eth_test.go: `.Eth()` $DIR/core/services/keystore/eth_test.go: `.Create(ctx, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.AssertCount(t, db, "evm.key_states", 1)` $DIR/core/services/keystore/eth_test.go: `.GetAll(ctx)` $DIR/core/services/keystore/eth_test.go: `.EnsureKeys(ctx, testutils.FixtureChainID, testutils.SimulatedChainID)` $DIR/core/services/keystore/eth_test.go: `.AssertCount(t, db, "evm.key_states", 2)` $DIR/core/services/keystore/eth_test.go: `.GetAll(ctx)` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.NewSqlxDB(t)` $DIR/core/services/keystore/eth_test.go: `.NewKeyStore(t, db)` $DIR/core/services/keystore/eth_test.go: `.Eth()` $DIR/core/services/keystore/eth_test.go: `.Create(ctx, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.AssertCount(t, db, "evm.key_states", 1)` $DIR/core/services/keystore/eth_test.go: `.GetAll(ctx)` $DIR/core/services/keystore/eth_test.go: `.Disable(ctx, k.Address, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.EnsureKeys(ctx, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.AssertCount(t, db, "evm.key_states", 1)` $DIR/core/services/keystore/eth_test.go: `.GetAll(ctx)` $DIR/core/services/keystore/eth_test.go: `.GetState(ctx, k.Address.Hex(), testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.Address.Hex()` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.NewSqlxDB(t)` $DIR/core/services/keystore/eth_test.go: `.NewKeyStore(t, db)` $DIR/core/services/keystore/eth_test.go: `.Eth()` $DIR/core/services/keystore/eth_test.go: `.RandomAddress()` $DIR/core/services/keystore/eth_test.go: `.Hex()` $DIR/core/services/keystore/eth_test.go: `.Delete(ctx, randKeyID)` $DIR/core/services/keystore/eth_test.go: `.MustInsertRandomKey(t, ks)` $DIR/core/services/keystore/eth_test.go: `.MustInsertRandomKey(t, ks)` $DIR/core/services/keystore/eth_test.go: `.MustInsertRandomKey(t, ks, *ubig.New(testutils.SimulatedChainID))` $DIR/core/services/keystore/eth_test.go: `.New(testutils.SimulatedChainID)` $DIR/core/services/keystore/eth_test.go: `.AssertCount(t, db, "evm.key_states", 4)` $DIR/core/services/keystore/eth_test.go: `.GetAll(ctx)` $DIR/core/services/keystore/eth_test.go: `.GetState(ctx, addr1.Hex(), testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.Hex()` $DIR/core/services/keystore/eth_test.go: `.GetState(ctx, addr1.Hex(), testutils.SimulatedChainID)` $DIR/core/services/keystore/eth_test.go: `.Hex()` $DIR/core/services/keystore/eth_test.go: `.Delete(ctx, addr1.String())` $DIR/core/services/keystore/eth_test.go: `.String()` $DIR/core/services/keystore/eth_test.go: `.AssertCount(t, db, "evm.key_states", 2)` $DIR/core/services/keystore/eth_test.go: `.GetAll(ctx)` $DIR/core/services/keystore/eth_test.go: `.GetState(ctx, addr1.Hex(), testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.Hex()` $DIR/core/services/keystore/eth_test.go: `.GetState(ctx, addr1.Hex(), testutils.SimulatedChainID)` $DIR/core/services/keystore/eth_test.go: `.Hex()` $DIR/core/services/keystore/eth_test.go: `.GetState(ctx, addr2.Hex(), testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.Hex()` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.NewSqlxDB(t)` $DIR/core/services/keystore/eth_test.go: `.NewKeyStore(t, db)` $DIR/core/services/keystore/eth_test.go: `.Eth()` $DIR/core/services/keystore/eth_test.go: `.MustInsertRandomKeyNoChains(t, ks)` $DIR/core/services/keystore/eth_test.go: `.MustInsertRandomKeyNoChains(t, ks)` $DIR/core/services/keystore/eth_test.go: `.MustInsertRandomKeyNoChains(t, ks)` $DIR/core/services/keystore/eth_test.go: `.Run("enabling the same key multiple times does not create duplicate states", func(t *testing.T) { ctx2 := testutils.Context(t) require.NoError(t, ks.Enable(ctx2, k1.Address, testutils.FixtureChainID)) require.NoError(t, ks.Enable(ctx2, k1.Address, testutils.FixtureChainID)) require.NoError(t, ks.Enable(ctx2, k1.Address, testutils.FixtureChainID)) require.NoError(t, ks.Enable(ctx2, k1.Address, testutils.FixtureChainID)) states, err := ks.GetStatesForKeys(ctx2, []ethkey.KeyV2{k1}) require.NoError(t, err) assert.Len(t, states, 2) var cids []*big.Int for i := range states { cid := states[i].EVMChainID.ToInt() cids = append(cids, cid) } assert.Contains(t, cids, testutils.FixtureChainID) assert.Contains(t, cids, testutils.SimulatedChainID) for _, s := range states { assert.Equal(t, addr1, s.Address.Address()) } })` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.GetStatesForKeys(ctx2, []ethkey.KeyV2{k1})` $DIR/core/services/keystore/eth_test.go: `.EVMChainID.ToInt()` $DIR/core/services/keystore/eth_test.go: `.Run("returns nil when key is enabled for given chain", func(t *testing.T) { err := ks.CheckEnabled(ctx, addr1, testutils.FixtureChainID) assert.NoError(t, err) err = ks.CheckEnabled(ctx, addr1, testutils.SimulatedChainID) assert.NoError(t, err) })` $DIR/core/services/keystore/eth_test.go: `.CheckEnabled(ctx, addr1, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.CheckEnabled(ctx, addr1, testutils.SimulatedChainID)` $DIR/core/services/keystore/eth_test.go: `.Run("returns error when key does not exist", func(t *testing.T) { addr := utils.RandomAddress() err := ks.CheckEnabled(ctx, addr, testutils.FixtureChainID) assert.Error(t, err) require.Contains(t, err.Error(), fmt.Sprintf("no eth key exists with address %s", addr.Hex())) })` $DIR/core/services/keystore/eth_test.go: `.RandomAddress()` $DIR/core/services/keystore/eth_test.go: `.CheckEnabled(ctx, addr, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.Run("returns error when key exists but has never been enabled (no state) for the given chain", func(t *testing.T) { err := ks.CheckEnabled(ctx, addr3, testutils.FixtureChainID) assert.Error(t, err) require.Contains(t, err.Error(), fmt.Sprintf("eth key with address %s exists but is has not been enabled for chain 0 (enabled only for chain IDs: 1337)", addr3.Hex())) })` $DIR/core/services/keystore/eth_test.go: `.CheckEnabled(ctx, addr3, testutils.FixtureChainID)` $DIR/core/services/keystore/eth_test.go: `.CheckEnabled(ctx, addr2, testutils.SimulatedChainID)` $DIR/core/services/keystore/eth_test.go: `.NewSqlxDB(t)` $DIR/core/services/keystore/eth_test.go: `.NewKeyStore(t, db)` $DIR/core/services/keystore/eth_test.go: `.Eth()` $DIR/core/services/keystore/eth_test.go: `.Run("creates key, deletes it unsafely and then enable creates it again", func(t *testing.T) { ctx := testutils.Context(t) k, _ := cltest.MustInsertRandomKeyNoChains(t, ks) require.NoError(t, ks.Add(ctx, k.Address, testutils.SimulatedChainID)) _, err := db.Exec("DELETE FROM evm.key_states WHERE address = $1", k.Address) require.NoError(t, err) require.NoError(t, ks.Disable(ctx, k.Address, testutils.SimulatedChainID)) key, err := ks.GetState(ctx, k.Address.Hex(), testutils.SimulatedChainID) require.NoError(t, err) require.Equal(t, key.Disabled, true) })` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.MustInsertRandomKeyNoChains(t, ks)` $DIR/core/services/keystore/eth_test.go: `.Exec("DELETE FROM evm.key_states WHERE address = $1", k.Address)` $DIR/core/services/keystore/eth_test.go: `.GetState(ctx, k.Address.Hex(), testutils.SimulatedChainID)` $DIR/core/services/keystore/eth_test.go: `.Address.Hex()` $DIR/core/services/keystore/eth_test.go: `.Run("creates key and enables it if it exists in the keystore, but is missing from key states db table", func(t *testing.T) { ctx := testutils.Context(t) k, _ := cltest.MustInsertRandomKeyNoChains(t, ks) require.NoError(t, ks.Disable(ctx, k.Address, testutils.SimulatedChainID)) key, err := ks.GetState(ctx, k.Address.Hex(), testutils.SimulatedChainID) require.NoError(t, err) require.Equal(t, key.Disabled, true) })` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.MustInsertRandomKeyNoChains(t, ks)` $DIR/core/services/keystore/eth_test.go: `.GetState(ctx, k.Address.Hex(), testutils.SimulatedChainID)` $DIR/core/services/keystore/eth_test.go: `.Address.Hex()` $DIR/core/services/keystore/eth_test.go: `.Context(t)` $DIR/core/services/keystore/eth_test.go: `.NewAddress()` $DIR/core/services/keystore/eth_test.go: `.GetState(ctx, addrNotInKs.Hex(), testutils.SimulatedChainID)` $DIR/core/services/keystore/eth_test.go: `.Hex()` $DIR/core/services/keystore/keys/csakey/key_test.go: `err = key.Unlock(passphrase)` $DIR/core/services/keystore/keys/csakey/key_test.go: `.EncryptedPrivateKey.Decrypt("passphrase")` $DIR/core/services/keystore/keys/csakey/key_test.go: `.PrivateKey(rawprivkey)` $DIR/core/services/keystore/keys/csakey/key_test.go: `.PublicKey(key.PublicKey)` $DIR/core/services/keystore/keys/csakey/key_test.go: `.Public()` $DIR/core/services/keystore/keys/csakey/key_test.go: `.Unlock(passphrase)` $DIR/core/services/keystore/keys/csakey/key_test.go: `.EncryptedPrivateKey.Decrypt(passphrase)` $DIR/core/services/keystore/keys/csakey/key_test.go: `.Unsafe_GetPrivateKey()` $DIR/core/services/keystore/keys/csakey/key_test.go: `.ToV2()` $DIR/core/services/keystore/keys/csakey/key_test.go: `.PrivateKey(key.privateKey)` $DIR/core/services/keystore/keys/csakey/key_v2_test.go: `.GenerateKey(nil)` $DIR/core/services/keystore/keys/csakey/key_v2_test.go: `.String()` $DIR/core/services/keystore/keys/csakey/key_v2_test.go: `.GoString()` $DIR/core/services/keystore/keys/csakey/key_v2_test.go: `.GenerateKey(nil)` $DIR/core/services/keystore/keys/csakey/key_v2_test.go: `.Key()` $DIR/core/services/keystore/keys/csakey/key_v2_test.go: `.Sprintf("CSAKeyV2{PrivateKey: , PublicKey: %s}", pubKey)` $DIR/core/services/keystore/keys/csakey/key_v2_test.go: `.String()` $DIR/core/services/keystore/keys/dkgencryptkey/key_test.go: `.NewInt(1337)` $DIR/core/services/keystore/keys/dkgencryptkey/key_test.go: `.ID()` $DIR/core/services/keystore/keys/dkgencryptkey/key_test.go: `.NewInt(1337)` $DIR/core/services/keystore/keys/dkgencryptkey/key_test.go: `.Raw()` $DIR/core/services/keystore/keys/dkgencryptkey/key_test.go: `.Scalar()` $DIR/core/services/keystore/keys/dkgencryptkey/key_test.go: `.SetBytes(rawFromKey)` $DIR/core/services/keystore/keys/dkgencryptkey/key_test.go: `.Key()` $DIR/core/services/keystore/keys/dkgencryptkey/key_test.go: `.String()` $DIR/core/services/keystore/keys/dkgencryptkey/key_test.go: `.NewInt(1337)` $DIR/core/services/keystore/keys/dkgencryptkey/key_test.go: `.ToEncryptedJSON(password, utils.DefaultScryptParams)` $DIR/core/services/keystore/keys/dkgsignkey/key_test.go: `.NewInt(1337)` $DIR/core/services/keystore/keys/dkgsignkey/key_test.go: `.ID()` $DIR/core/services/keystore/keys/dkgsignkey/key_test.go: `.NewInt(1337)` $DIR/core/services/keystore/keys/dkgsignkey/key_test.go: `.Raw()` $DIR/core/services/keystore/keys/dkgsignkey/key_test.go: `.Scalar()` $DIR/core/services/keystore/keys/dkgsignkey/key_test.go: `.SetBytes(rawFromKey)` $DIR/core/services/keystore/keys/dkgsignkey/key_test.go: `.Key()` $DIR/core/services/keystore/keys/dkgsignkey/key_test.go: `.String()` $DIR/core/services/keystore/keys/dkgsignkey/key_test.go: `.NewInt(1337)` $DIR/core/services/keystore/keys/dkgsignkey/key_test.go: `.ToEncryptedJSON(password, utils.DefaultScryptParams)` $DIR/core/services/keystore/keys/ethkey/key_test.go: `.Type()` $DIR/core/services/keystore/keys/ethkey/key_v2_test.go: `.GenerateKey(crypto.S256(), rand.Reader)` $DIR/core/services/keystore/keys/ethkey/key_v2_test.go: `.S256()` $DIR/core/services/keystore/keys/ethkey/key_v2_test.go: `.D.Bytes()` $DIR/core/services/keystore/keys/ethkey/key_v2_test.go: `.Key()` $DIR/core/services/keystore/keys/ethkey/key_v2_test.go: `.EIP55AddressFromAddress(crypto.PubkeyToAddress(privateKeyECDSA.PublicKey))` $DIR/core/services/keystore/keys/ethkey/key_v2_test.go: `.PubkeyToAddress(privateKeyECDSA.PublicKey)` $DIR/core/services/keystore/keys/ethkey/key_v2_test.go: `.Hex()` $DIR/core/services/keystore/keys/ethkey/key_v2_test.go: `.ID()` $DIR/core/services/keystore/keys/ethkey/key_v2_test.go: `.GenerateKey(crypto.S256(), rand.Reader)` $DIR/core/services/keystore/keys/ethkey/key_v2_test.go: `.S256()` $DIR/core/services/keystore/keys/ethkey/key_v2_test.go: `.D.Bytes()` $DIR/core/services/keystore/keys/ethkey/key_v2_test.go: `.String()` $DIR/core/services/keystore/keys/ethkey/key_v2_test.go: `.GoString()` $DIR/core/services/keystore/keys/ethkey/key_v2_test.go: `.Address.Hex()` $DIR/core/services/keystore/keys/ethkey/key_v2_test.go: `.ID()` $DIR/core/services/keystore/keys/ocr2key/cosmos_keyring_test.go: `t.Run("can verify", func(t *testing.T) { report := ocrtypes.Report{} sig, err := kr1.Sign(ctx, report) require.NoError(t, err) t.Log(len(sig)) result := kr2.Verify(kr1.PublicKey(), ctx, report, sig) require.True(t, result) })` $DIR/core/services/keystore/keys/ocr2key/cosmos_keyring_test.go: `t.Run("invalid sig", func(t *testing.T) { report := ocrtypes.Report{} result := kr2.Verify(kr1.PublicKey(), ctx, report, []byte{0x01}) require.False(t, result) })` $DIR/core/services/keystore/keys/ocr2key/cosmos_keyring_test.go: `err = kr2.Unmarshal(m)` $DIR/core/services/keystore/keys/ocr2key/cosmos_keyring_test.go: `.Run("can verify", func(t *testing.T) { report := ocrtypes.Report{} sig, err := kr1.Sign(ctx, report) require.NoError(t, err) t.Log(len(sig)) result := kr2.Verify(kr1.PublicKey(), ctx, report, sig) require.True(t, result) })` $DIR/core/services/keystore/keys/ocr2key/cosmos_keyring_test.go: `.Sign(ctx, report)` $DIR/core/services/keystore/keys/ocr2key/cosmos_keyring_test.go: `.Verify(kr1.PublicKey(), ctx, report, sig)` $DIR/core/services/keystore/keys/ocr2key/cosmos_keyring_test.go: `.PublicKey()` $DIR/core/services/keystore/keys/ocr2key/cosmos_keyring_test.go: `.Run("invalid sig", func(t *testing.T) { report := ocrtypes.Report{} result := kr2.Verify(kr1.PublicKey(), ctx, report, []byte{0x01}) require.False(t, result) })` $DIR/core/services/keystore/keys/ocr2key/cosmos_keyring_test.go: `.Verify(kr1.PublicKey(), ctx, report, []byte{0x01})` $DIR/core/services/keystore/keys/ocr2key/cosmos_keyring_test.go: `.PublicKey()` $DIR/core/services/keystore/keys/ocr2key/cosmos_keyring_test.go: `.Sign(ctx, report)` $DIR/core/services/keystore/keys/ocr2key/cosmos_keyring_test.go: `.Verify([]byte{0x01}, ctx, report, sig)` $DIR/core/services/keystore/keys/ocr2key/cosmos_keyring_test.go: `.Marshal()` $DIR/core/services/keystore/keys/ocr2key/cosmos_keyring_test.go: `.Unmarshal(m)` $DIR/core/services/keystore/keys/ocr2key/cosmos_keyring_test.go: `.Unmarshal([]byte{0x01})` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `t.Run("can verify", func(t *testing.T) { report := ocrtypes.Report{} sig, err := kr1.Sign(ctx, report) require.NoError(t, err) t.Log(len(sig)) result := kr2.Verify(kr1.PublicKey(), ctx, report, sig) assert.True(t, result) })` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `t.Run("invalid sig", func(t *testing.T) { report := ocrtypes.Report{} result := kr2.Verify(kr1.PublicKey(), ctx, report, []byte{0x01}) assert.False(t, result) })` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `t.Run("can verify", func(t *testing.T) { sig, err := kr1.Sign3(digest, seqNr, r) require.NoError(t, err) t.Log(len(sig)) result := kr2.Verify3(kr1.PublicKey(), digest, seqNr, r, sig) assert.True(t, result) })` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `t.Run("invalid sig", func(t *testing.T) { result := kr2.Verify3(kr1.PublicKey(), digest, seqNr, r, []byte{0x01}) assert.False(t, result) })` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `err = kr2.Unmarshal(m)` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `.Run("can verify", func(t *testing.T) { report := ocrtypes.Report{} sig, err := kr1.Sign(ctx, report) require.NoError(t, err) t.Log(len(sig)) result := kr2.Verify(kr1.PublicKey(), ctx, report, sig) assert.True(t, result) })` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `.Sign(ctx, report)` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `.Verify(kr1.PublicKey(), ctx, report, sig)` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `.PublicKey()` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `.Run("invalid sig", func(t *testing.T) { report := ocrtypes.Report{} result := kr2.Verify(kr1.PublicKey(), ctx, report, []byte{0x01}) assert.False(t, result) })` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `.Verify(kr1.PublicKey(), ctx, report, []byte{0x01})` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `.PublicKey()` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `.Sign(ctx, report)` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `.Verify([]byte{0x01}, ctx, report, sig)` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `.BytesToConfigDigest(testutils.MustRandBytes(32))` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `.MustRandBytes(32)` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `.Uint64()` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `.Report(testutils.MustRandBytes(rand.Intn(1024)))` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `.MustRandBytes(rand.Intn(1024))` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `.Intn(1024)` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `.Run("can verify", func(t *testing.T) { sig, err := kr1.Sign3(digest, seqNr, r) require.NoError(t, err) t.Log(len(sig)) result := kr2.Verify3(kr1.PublicKey(), digest, seqNr, r, sig) assert.True(t, result) })` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `.Sign3(digest, seqNr, r)` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `.Verify3(kr1.PublicKey(), digest, seqNr, r, sig)` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `.PublicKey()` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `.Run("invalid sig", func(t *testing.T) { result := kr2.Verify3(kr1.PublicKey(), digest, seqNr, r, []byte{0x01}) assert.False(t, result) })` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `.Verify3(kr1.PublicKey(), digest, seqNr, r, []byte{0x01})` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `.PublicKey()` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `.Sign3(digest, seqNr, r)` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `.Verify3([]byte{0x01}, digest, seqNr, r, sig)` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `.Marshal()` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `.Unmarshal(m)` $DIR/core/services/keystore/keys/ocr2key/evm_keyring_test.go: `.Unmarshal([]byte{0x01})` $DIR/core/services/keystore/keys/ocr2key/export_test.go: `t.Run(string(tc.chain), func(t *testing.T) { kb, err := New(tc.chain) require.NoError(t, err) ej, err := ToEncryptedJSON(kb, "blah", utils.FastScryptParams) require.NoError(t, err) kbAfter, err := FromEncryptedJSON(ej, "blah") require.NoError(t, err) assert.Equal(t, kbAfter.ID(), kb.ID()) assert.Equal(t, kbAfter.PublicKey(), kb.PublicKey()) assert.Equal(t, kbAfter.OffchainPublicKey(), kb.OffchainPublicKey()) assert.Equal(t, kbAfter.MaxSignatureLength(), kb.MaxSignatureLength()) assert.Equal(t, kbAfter.Raw(), kb.Raw()) assert.Equal(t, kbAfter.ConfigEncryptionPublicKey(), kb.ConfigEncryptionPublicKey()) assert.Equal(t, kbAfter.ChainType(), kb.ChainType()) })` $DIR/core/services/keystore/keys/ocr2key/export_test.go: `.Run(string(tc.chain), func(t *testing.T) { kb, err := New(tc.chain) require.NoError(t, err) ej, err := ToEncryptedJSON(kb, "blah", utils.FastScryptParams) require.NoError(t, err) kbAfter, err := FromEncryptedJSON(ej, "blah") require.NoError(t, err) assert.Equal(t, kbAfter.ID(), kb.ID()) assert.Equal(t, kbAfter.PublicKey(), kb.PublicKey()) assert.Equal(t, kbAfter.OffchainPublicKey(), kb.OffchainPublicKey()) assert.Equal(t, kbAfter.MaxSignatureLength(), kb.MaxSignatureLength()) assert.Equal(t, kbAfter.Raw(), kb.Raw()) assert.Equal(t, kbAfter.ConfigEncryptionPublicKey(), kb.ConfigEncryptionPublicKey()) assert.Equal(t, kbAfter.ChainType(), kb.ChainType()) })` $DIR/core/services/keystore/keys/ocr2key/generic_key_bundle_test.go: `t.Run("EVM", func(t *testing.T) { // onchain key onKey, err := newEVMKeyring(cryptorand.Reader) require.NoError(t, err) onBytes, err := onKey.Marshal() require.NoError(t, err) // marshal old key format oldKey := XXXOldEVMKeyBundleRawData{ ChainType: chaintype.EVM, OffchainKeyring: offBytes, EVMKeyring: onBytes, } bundleBytes, err := json.Marshal(oldKey) require.NoError(t, err) // test Unmarshal with old raw bundle bundle := newKeyBundle(&evmKeyring{}) require.NoError(t, bundle.Unmarshal(bundleBytes)) newBundleBytes, err := bundle.Marshal() // marshalling migrates to a generic struct require.NoError(t, err) // new bundle == old bundle (only difference is Keyring == Keyring) var newRawBundle keyBundleRawData require.NoError(t, json.Unmarshal(newBundleBytes, &newRawBundle)) assert.Equal(t, oldKey.ChainType, newRawBundle.ChainType) assert.Equal(t, oldKey.OffchainKeyring, newRawBundle.OffchainKeyring) assert.Equal(t, oldKey.EVMKeyring, newRawBundle.Keyring) // test unmarshalling again to ensure ID has not changed // the underlying bytes have changed, but ID should be preserved newBundle := newKeyBundle(&evmKeyring{}) require.NoError(t, newBundle.Unmarshal(newBundleBytes)) assert.Equal(t, bundle.ID(), newBundle.ID()) })` $DIR/core/services/keystore/keys/ocr2key/generic_key_bundle_test.go: `t.Run("Solana", func(t *testing.T) { // onchain key onKey, err := newSolanaKeyring(cryptorand.Reader) require.NoError(t, err) onBytes, err := onKey.Marshal() require.NoError(t, err) // marshal old key format oldKey := XXXOldSolanaKeyBundleRawData{ ChainType: chaintype.Solana, OffchainKeyring: offBytes, SolanaKeyring: onBytes, } bundleBytes, err := json.Marshal(oldKey) require.NoError(t, err) // test Unmarshal with old raw bundle bundle := newKeyBundle(&solanaKeyring{}) require.NoError(t, bundle.Unmarshal(bundleBytes)) newBundleBytes, err := bundle.Marshal() require.NoError(t, err) // new bundle == old bundle (only difference is Keyring == Keyring) var newRawBundle keyBundleRawData require.NoError(t, json.Unmarshal(newBundleBytes, &newRawBundle)) assert.Equal(t, oldKey.ChainType, newRawBundle.ChainType) assert.Equal(t, oldKey.OffchainKeyring, newRawBundle.OffchainKeyring) assert.Equal(t, oldKey.SolanaKeyring, newRawBundle.Keyring) // test unmarshalling again to ensure ID has not changed // the underlying bytes have changed, but ID should be preserved newBundle := newKeyBundle(&solanaKeyring{}) require.NoError(t, newBundle.Unmarshal(newBundleBytes)) assert.Equal(t, bundle.ID(), newBundle.ID()) })` $DIR/core/services/keystore/keys/ocr2key/generic_key_bundle_test.go: `t.Run("Cosmos", func(t *testing.T) { // onchain key bundle, err := newKeyBundleRand(chaintype.Cosmos, newCosmosKeyring) require.NoError(t, err) bundleBytes, err := bundle.Marshal() require.NoError(t, err) // test unmarshalling again to ensure ID has not changed // the underlying bytes have changed, but ID should be preserved otherBundle := newKeyBundle(&cosmosKeyring{}) require.NoError(t, otherBundle.Unmarshal(bundleBytes)) assert.Equal(t, bundle.ID(), otherBundle.ID()) })` $DIR/core/services/keystore/keys/ocr2key/generic_key_bundle_test.go: `.marshal()` $DIR/core/services/keystore/keys/ocr2key/generic_key_bundle_test.go: `.Run("EVM", func(t *testing.T) { // onchain key onKey, err := newEVMKeyring(cryptorand.Reader) require.NoError(t, err) onBytes, err := onKey.Marshal() require.NoError(t, err) // marshal old key format oldKey := XXXOldEVMKeyBundleRawData{ ChainType: chaintype.EVM, OffchainKeyring: offBytes, EVMKeyring: onBytes, } bundleBytes, err := json.Marshal(oldKey) require.NoError(t, err) // test Unmarshal with old raw bundle bundle := newKeyBundle(&evmKeyring{}) require.NoError(t, bundle.Unmarshal(bundleBytes)) newBundleBytes, err := bundle.Marshal() // marshalling migrates to a generic struct require.NoError(t, err) // new bundle == old bundle (only difference is Keyring == Keyring) var newRawBundle keyBundleRawData require.NoError(t, json.Unmarshal(newBundleBytes, &newRawBundle)) assert.Equal(t, oldKey.ChainType, newRawBundle.ChainType) assert.Equal(t, oldKey.OffchainKeyring, newRawBundle.OffchainKeyring) assert.Equal(t, oldKey.EVMKeyring, newRawBundle.Keyring) // test unmarshalling again to ensure ID has not changed // the underlying bytes have changed, but ID should be preserved newBundle := newKeyBundle(&evmKeyring{}) require.NoError(t, newBundle.Unmarshal(newBundleBytes)) assert.Equal(t, bundle.ID(), newBundle.ID()) })` $DIR/core/services/keystore/keys/ocr2key/generic_key_bundle_test.go: `.Marshal()` $DIR/core/services/keystore/keys/ocr2key/generic_key_bundle_test.go: `.Marshal(oldKey)` $DIR/core/services/keystore/keys/ocr2key/generic_key_bundle_test.go: `.Marshal()` $DIR/core/services/keystore/keys/ocr2key/generic_key_bundle_test.go: `.Run("Solana", func(t *testing.T) { // onchain key onKey, err := newSolanaKeyring(cryptorand.Reader) require.NoError(t, err) onBytes, err := onKey.Marshal() require.NoError(t, err) // marshal old key format oldKey := XXXOldSolanaKeyBundleRawData{ ChainType: chaintype.Solana, OffchainKeyring: offBytes, SolanaKeyring: onBytes, } bundleBytes, err := json.Marshal(oldKey) require.NoError(t, err) // test Unmarshal with old raw bundle bundle := newKeyBundle(&solanaKeyring{}) require.NoError(t, bundle.Unmarshal(bundleBytes)) newBundleBytes, err := bundle.Marshal() require.NoError(t, err) // new bundle == old bundle (only difference is Keyring == Keyring) var newRawBundle keyBundleRawData require.NoError(t, json.Unmarshal(newBundleBytes, &newRawBundle)) assert.Equal(t, oldKey.ChainType, newRawBundle.ChainType) assert.Equal(t, oldKey.OffchainKeyring, newRawBundle.OffchainKeyring) assert.Equal(t, oldKey.SolanaKeyring, newRawBundle.Keyring) // test unmarshalling again to ensure ID has not changed // the underlying bytes have changed, but ID should be preserved newBundle := newKeyBundle(&solanaKeyring{}) require.NoError(t, newBundle.Unmarshal(newBundleBytes)) assert.Equal(t, bundle.ID(), newBundle.ID()) })` $DIR/core/services/keystore/keys/ocr2key/generic_key_bundle_test.go: `.Marshal()` $DIR/core/services/keystore/keys/ocr2key/generic_key_bundle_test.go: `.Marshal(oldKey)` $DIR/core/services/keystore/keys/ocr2key/generic_key_bundle_test.go: `.Marshal()` $DIR/core/services/keystore/keys/ocr2key/generic_key_bundle_test.go: `.Run("Cosmos", func(t *testing.T) { // onchain key bundle, err := newKeyBundleRand(chaintype.Cosmos, newCosmosKeyring) require.NoError(t, err) bundleBytes, err := bundle.Marshal() require.NoError(t, err) // test unmarshalling again to ensure ID has not changed // the underlying bytes have changed, but ID should be preserved otherBundle := newKeyBundle(&cosmosKeyring{}) require.NoError(t, otherBundle.Unmarshal(bundleBytes)) assert.Equal(t, bundle.ID(), otherBundle.ID()) })` $DIR/core/services/keystore/keys/ocr2key/generic_key_bundle_test.go: `.Marshal()` $DIR/core/services/keystore/keys/ocr2key/generic_key_bundle_test.go: `.Marshal()` $DIR/core/services/keystore/keys/ocr2key/generic_key_bundle_test.go: `.Marshal(oldKey)` $DIR/core/services/keystore/keys/ocr2key/generic_key_bundle_test.go: `.Marshal()` $DIR/core/services/keystore/keys/ocr2key/key_bundle_test.go: `keys = append(keys, pk0)` $DIR/core/services/keystore/keys/ocr2key/key_bundle_test.go: `keys = append(keys, pk1)` $DIR/core/services/keystore/keys/ocr2key/key_bundle_test.go: `assertKeyBundlesNotEqual(t, keys[i], keys[j])` $DIR/core/services/keystore/keys/ocr2key/key_bundle_test.go: `.New(chain)` $DIR/core/services/keystore/keys/ocr2key/key_bundle_test.go: `.New(chain)` $DIR/core/services/keystore/keys/ocr2key/key_bundle_test.go: `.New(chain)` $DIR/core/services/keystore/keys/ocr2key/key_bundle_test.go: `.Raw()` $DIR/core/services/keystore/keys/ocr2key/key_bundle_test.go: `.Key()` $DIR/core/services/keystore/keys/ocr2key/key_bundle_test.go: `.New(chain)` $DIR/core/services/keystore/keys/ocr2key/offchain_keyring_test.go: `_, err = kr.NaclBoxOpenAnonymous(shortMessage)` $DIR/core/services/keystore/keys/ocr2key/offchain_keyring_test.go: `_, err = kr.NaclBoxOpenAnonymous(invalid)` $DIR/core/services/keystore/keys/ocr2key/offchain_keyring_test.go: `.OffchainPublicKey()` $DIR/core/services/keystore/keys/ocr2key/offchain_keyring_test.go: `.Equal(kr.signingKey.Public().(ed25519.PublicKey), pubKey[:])` $DIR/core/services/keystore/keys/ocr2key/offchain_keyring_test.go: `.signingKey.Public()` $DIR/core/services/keystore/keys/ocr2key/offchain_keyring_test.go: `.ConfigEncryptionPublicKey()` $DIR/core/services/keystore/keys/ocr2key/offchain_keyring_test.go: `.NaclBoxOpenAnonymous(encryptedMessage)` $DIR/core/services/keystore/keys/ocr2key/offchain_keyring_test.go: `.NaclBoxOpenAnonymous(shortMessage)` $DIR/core/services/keystore/keys/ocr2key/offchain_keyring_test.go: `.NaclBoxOpenAnonymous(invalid)` $DIR/core/services/keystore/keys/ocr2key/solana_keyring_test.go: `t.Run("can verify", func(t *testing.T) { report := ocrtypes.Report{} sig, err := kr1.Sign(ctx, report) require.NoError(t, err) t.Log(len(sig)) result := kr2.Verify(kr1.PublicKey(), ctx, report, sig) assert.True(t, result) })` $DIR/core/services/keystore/keys/ocr2key/solana_keyring_test.go: `t.Run("invalid sig", func(t *testing.T) { report := ocrtypes.Report{} result := kr2.Verify(kr1.PublicKey(), ctx, report, []byte{0x01}) assert.False(t, result) })` $DIR/core/services/keystore/keys/ocr2key/solana_keyring_test.go: `err = kr2.Unmarshal(m)` $DIR/core/services/keystore/keys/ocr2key/solana_keyring_test.go: `.Run("can verify", func(t *testing.T) { report := ocrtypes.Report{} sig, err := kr1.Sign(ctx, report) require.NoError(t, err) t.Log(len(sig)) result := kr2.Verify(kr1.PublicKey(), ctx, report, sig) assert.True(t, result) })` $DIR/core/services/keystore/keys/ocr2key/solana_keyring_test.go: `.Sign(ctx, report)` $DIR/core/services/keystore/keys/ocr2key/solana_keyring_test.go: `.Verify(kr1.PublicKey(), ctx, report, sig)` $DIR/core/services/keystore/keys/ocr2key/solana_keyring_test.go: `.PublicKey()` $DIR/core/services/keystore/keys/ocr2key/solana_keyring_test.go: `.Run("invalid sig", func(t *testing.T) { report := ocrtypes.Report{} result := kr2.Verify(kr1.PublicKey(), ctx, report, []byte{0x01}) assert.False(t, result) })` $DIR/core/services/keystore/keys/ocr2key/solana_keyring_test.go: `.Verify(kr1.PublicKey(), ctx, report, []byte{0x01})` $DIR/core/services/keystore/keys/ocr2key/solana_keyring_test.go: `.PublicKey()` $DIR/core/services/keystore/keys/ocr2key/solana_keyring_test.go: `.Sign(ctx, report)` $DIR/core/services/keystore/keys/ocr2key/solana_keyring_test.go: `.Verify([]byte{0x01}, ctx, report, sig)` $DIR/core/services/keystore/keys/ocr2key/solana_keyring_test.go: `.Marshal()` $DIR/core/services/keystore/keys/ocr2key/solana_keyring_test.go: `.Unmarshal(m)` $DIR/core/services/keystore/keys/ocr2key/solana_keyring_test.go: `.Equal(kr1.privateKey.D.Bytes(), kr2.privateKey.D.Bytes())` $DIR/core/services/keystore/keys/ocr2key/solana_keyring_test.go: `.privateKey.D.Bytes()` $DIR/core/services/keystore/keys/ocr2key/solana_keyring_test.go: `.privateKey.D.Bytes()` $DIR/core/services/keystore/keys/ocrkey/config_public_key_test.go: `t.Run("fails to unmarshal invalid JSON", func(t *testing.T) { pk := ConfigPublicKey(k.PublicKeyConfig()) err := pk.UnmarshalJSON([]byte("")) assert.Error(t, err) })` $DIR/core/services/keystore/keys/ocrkey/config_public_key_test.go: `t.Run("returns serialized instance value", func(t *testing.T) { pk := ConfigPublicKey(k.PublicKeyConfig()) v, err := pk.Value() require.NoError(t, err) assert.NotEmpty(t, v) })` $DIR/core/services/keystore/keys/ocrkey/config_public_key_test.go: `.NewInt(1)` $DIR/core/services/keystore/keys/ocrkey/config_public_key_test.go: `.Run("fails to unmarshal invalid JSON", func(t *testing.T) { pk := ConfigPublicKey(k.PublicKeyConfig()) err := pk.UnmarshalJSON([]byte("")) assert.Error(t, err) })` $DIR/core/services/keystore/keys/ocrkey/config_public_key_test.go: `.PublicKeyConfig()` $DIR/core/services/keystore/keys/ocrkey/config_public_key_test.go: `.UnmarshalJSON([]byte(""))` $DIR/core/services/keystore/keys/ocrkey/config_public_key_test.go: `.Run("returns serialized instance value", func(t *testing.T) { pk := ConfigPublicKey(k.PublicKeyConfig()) v, err := pk.Value() require.NoError(t, err) assert.NotEmpty(t, v) })` $DIR/core/services/keystore/keys/ocrkey/config_public_key_test.go: `.PublicKeyConfig()` $DIR/core/services/keystore/keys/ocrkey/config_public_key_test.go: `.Value()` $DIR/core/services/keystore/keys/ocrkey/config_public_key_test.go: `.PublicKeyConfig()` $DIR/core/services/keystore/keys/ocrkey/config_public_key_test.go: `.NewInt(1)` $DIR/core/services/keystore/keys/ocrkey/config_public_key_test.go: `.PublicKeyConfig()` $DIR/core/services/keystore/keys/ocrkey/config_public_key_test.go: `.Scan(pk2[:])` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `assertKeyBundlesNotEqual(t, pk1, pk2)` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `assertKeyBundlesNotEqual(t, pk1, pk3)` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `err = ek.SetID("48656c6c6f20476f7068657221")` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `err = ek.SetID("invalid id")` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `_, err = ek.Decrypt("wrongpass")` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `dk.GoString()` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `err = k2.UnmarshalJSON(mk)` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.NewV2()` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.NewV2()` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.NewV2()` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.New()` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.ToV2()` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.ID.String()` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.ID()` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(1))` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.NewInt(1)` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.ID()` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.Raw()` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.Key()` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.ID()` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.New()` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.Encrypt("test", utils.FastScryptParams)` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.GetID()` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.SetID("48656c6c6f20476f7068657221")` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.SetID("invalid id")` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.New()` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.Encrypt("test", utils.FastScryptParams)` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.Decrypt("wrongpass")` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.Decrypt("test")` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.GoString()` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.ID.String()` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.ID.String()` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.New()` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.New()` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.MarshalJSON()` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.UnmarshalJSON(mk)` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.String()` $DIR/core/services/keystore/keys/ocrkey/key_bundle_test.go: `.String()` $DIR/core/services/keystore/keys/ocrkey/off_chain_public_key_test.go: `rawBytes[31] = 1` $DIR/core/services/keystore/keys/ocrkey/off_chain_public_key_test.go: `.OffChainPublicKey(rawBytes)` $DIR/core/services/keystore/keys/ocrkey/off_chain_public_key_test.go: `.Sprintf(`"%s"`, pubKeyString)` $DIR/core/services/keystore/keys/ocrkey/off_chain_public_key_test.go: `.Marshal(pubKey)` $DIR/core/services/keystore/keys/ocrkey/off_chain_public_key_test.go: `.Sprintf(`"%s"`, pubKeyString)` $DIR/core/services/keystore/keys/ocrkey/off_chain_public_key_test.go: `.Unmarshal([]byte(pubKeyJSON), &pubKey)` $DIR/core/services/keystore/keys/ocrkey/off_chain_public_key_test.go: `.Raw()` $DIR/core/services/keystore/keys/ocrkey/off_chain_public_key_test.go: `.Sprintf(`"%s"`, pubKeyString)` $DIR/core/services/keystore/keys/ocrkey/off_chain_public_key_test.go: `.Unmarshal([]byte(pubKeyJSON), &pubKey)` $DIR/core/services/keystore/keys/ocrkey/off_chan_private_key_test.go: `.offChainSigning.Sign([]byte("hello world"))` $DIR/core/services/keystore/keys/ocrkey/on_chain_private_key_test.go: `.GenerateKey(crypto.S256(), rand.Reader)` $DIR/core/services/keystore/keys/ocrkey/on_chain_private_key_test.go: `.S256()` $DIR/core/services/keystore/keys/ocrkey/on_chain_private_key_test.go: `.Sign([]byte("hello world"))` $DIR/core/services/keystore/keys/ocrkey/on_chain_public_key_test.go: `.GenerateKey(crypto.S256(), rand.Reader)` $DIR/core/services/keystore/keys/ocrkey/on_chain_public_key_test.go: `.S256()` $DIR/core/services/keystore/keys/ocrkey/on_chain_public_key_test.go: `.Address()` $DIR/core/services/keystore/keys/ocrkey/on_chain_signing_address_test.go: `_, err = address.Value()` $DIR/core/services/keystore/keys/ocrkey/on_chain_signing_address_test.go: `.UnmarshalText([]byte(ocrSigningKey))` $DIR/core/services/keystore/keys/ocrkey/on_chain_signing_address_test.go: `.Value()` $DIR/core/services/keystore/keys/ocrkey/on_chain_signing_address_test.go: `.String()` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `t.Run("converts into V2 key", func(t *testing.T) { k2 := k.ToV2() assert.Equal(t, k.PrivKey, k2.PrivKey) assert.Equal(t, k.PeerID(), k2.peerID) })` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `err = pkb.UnmarshalJSON(b)` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `err = pkb.UnmarshalJSON([]byte(""))` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `err = pkb.Scan([]byte(pk))` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `err = pkb.Scan("invalid-type")` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `marshalledPrivK, err = MarshalPrivateKey(k.PrivKey)` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `t.Run("sets a different ID", func(t *testing.T) { err := p2pk.SetID("12") require.NoError(t, err) assert.Equal(t, int32(12), p2pk.ID) err = p2pk.SetID("invalid") assert.Error(t, err) })` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `err = p2pk.SetID("invalid")` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `k, err = p2pk.Decrypt("password")` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `.GenerateKey(rand.Reader)` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `.Run("converts into V2 key", func(t *testing.T) { k2 := k.ToV2() assert.Equal(t, k.PrivKey, k2.PrivKey) assert.Equal(t, k.PeerID(), k2.peerID) })` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `.ToV2()` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `.GetPeerID()` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `.PeerID()` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `.GenerateKey(rand.Reader)` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `.MarshalJSON()` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `.UnmarshalJSON(b)` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `.UnmarshalJSON([]byte(""))` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `.Scan([]byte(pk))` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `.Scan("invalid-type")` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `.Value()` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `.GenerateKey(rand.Reader)` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `.PrivKey.Public()` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `.EncryptDataV3(marshalledPrivK, []byte(adulteratedPassword("password")), utils.FastScryptParams.N, utils.FastScryptParams.P)` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `.Marshal(&cryptoJSON)` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `.PeerID()` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `.Run("sets a different ID", func(t *testing.T) { err := p2pk.SetID("12") require.NoError(t, err) assert.Equal(t, int32(12), p2pk.ID) err = p2pk.SetID("invalid") assert.Error(t, err) })` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `.SetID("12")` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `.SetID("invalid")` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `.Decrypt("invalid-pass")` $DIR/core/services/keystore/keys/p2pkey/key_test.go: `.Decrypt("password")` $DIR/core/services/keystore/keys/p2pkey/key_v2_test.go: `.GenerateKey(rand.Reader)` $DIR/core/services/keystore/keys/p2pkey/key_v2_test.go: `.String()` $DIR/core/services/keystore/keys/p2pkey/key_v2_test.go: `.GenerateKey(rand.Reader)` $DIR/core/services/keystore/keys/p2pkey/key_v2_test.go: `.ToV2()` $DIR/core/services/keystore/keys/p2pkey/key_v2_test.go: `.PrivKey.Public()` $DIR/core/services/keystore/keys/p2pkey/key_v2_test.go: `.EncodeToString(pkv2)` $DIR/core/services/keystore/keys/p2pkey/key_v2_test.go: `.PublicKeyHex()` $DIR/core/services/keystore/keys/p2pkey/peer_id_test.go: `t.Run("make peer ID", func(t *testing.T) { id, err := MakePeerID("12D3KooWM1111111111111111111111111111111111111111111") require.NoError(t, err) _, err = MakePeerID("invalid") assert.Error(t, err) assert.Equal(t, "p2p_12D3KooWM1111111111111111111111111111111111111111111", id.String()) })` $DIR/core/services/keystore/keys/p2pkey/peer_id_test.go: `_, err = MakePeerID("invalid")` $DIR/core/services/keystore/keys/p2pkey/peer_id_test.go: `t.Run("unmarshals new ID", func(t *testing.T) { id, err := MakePeerID("12D3KooWM1111111111111111111111111111111111111111111") require.NoError(t, err) fakeKey := MustNewV2XXXTestingOnly(big.NewInt(1)) err = id.UnmarshalString(fakeKey.ID()) require.NoError(t, err) assert.Equal(t, "p2p_"+fakeKey.ID(), id.String()) })` $DIR/core/services/keystore/keys/p2pkey/peer_id_test.go: `err = id.UnmarshalString(fakeKey.ID())` $DIR/core/services/keystore/keys/p2pkey/peer_id_test.go: `err = id.Scan(fakeKey.ID())` $DIR/core/services/keystore/keys/p2pkey/peer_id_test.go: `err = id.Scan(12)` $DIR/core/services/keystore/keys/p2pkey/peer_id_test.go: `t.Run("json", func(t *testing.T) { b, err := id.MarshalJSON() require.NoError(t, err) var got PeerID require.NoError(t, got.UnmarshalJSON(b)) require.Equal(t, id, got) })` $DIR/core/services/keystore/keys/p2pkey/peer_id_test.go: `t.Run("db", func(t *testing.T) { v, err := id.Value() require.NoError(t, err) var got PeerID require.NoError(t, got.Scan(v)) require.Equal(t, id, got) })` $DIR/core/services/keystore/keys/p2pkey/peer_id_test.go: `.Run("make peer ID", func(t *testing.T) { id, err := MakePeerID("12D3KooWM1111111111111111111111111111111111111111111") require.NoError(t, err) _, err = MakePeerID("invalid") assert.Error(t, err) assert.Equal(t, "p2p_12D3KooWM1111111111111111111111111111111111111111111", id.String()) })` $DIR/core/services/keystore/keys/p2pkey/peer_id_test.go: `.Run("unmarshals new ID", func(t *testing.T) { id, err := MakePeerID("12D3KooWM1111111111111111111111111111111111111111111") require.NoError(t, err) fakeKey := MustNewV2XXXTestingOnly(big.NewInt(1)) err = id.UnmarshalString(fakeKey.ID()) require.NoError(t, err) assert.Equal(t, "p2p_"+fakeKey.ID(), id.String()) })` $DIR/core/services/keystore/keys/p2pkey/peer_id_test.go: `.NewInt(1)` $DIR/core/services/keystore/keys/p2pkey/peer_id_test.go: `.UnmarshalString(fakeKey.ID())` $DIR/core/services/keystore/keys/p2pkey/peer_id_test.go: `.ID()` $DIR/core/services/keystore/keys/p2pkey/peer_id_test.go: `.NewInt(1)` $DIR/core/services/keystore/keys/p2pkey/peer_id_test.go: `.Scan(fakeKey.ID())` $DIR/core/services/keystore/keys/p2pkey/peer_id_test.go: `.ID()` $DIR/core/services/keystore/keys/p2pkey/peer_id_test.go: `.Scan(12)` $DIR/core/services/keystore/keys/p2pkey/peer_id_test.go: `.Run("json", func(t *testing.T) { b, err := id.MarshalJSON() require.NoError(t, err) var got PeerID require.NoError(t, got.UnmarshalJSON(b)) require.Equal(t, id, got) })` $DIR/core/services/keystore/keys/p2pkey/peer_id_test.go: `.MarshalJSON()` $DIR/core/services/keystore/keys/p2pkey/peer_id_test.go: `.Run("db", func(t *testing.T) { v, err := id.Value() require.NoError(t, err) var got PeerID require.NoError(t, got.Scan(v)) require.Equal(t, id, got) })` $DIR/core/services/keystore/keys/p2pkey/peer_id_test.go: `.Value()` $DIR/core/services/keystore/keys/p2pkey/peer_id_test.go: `.MarshalText()` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `err = kr1.Unmarshal(bytesKey[:])` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `report = append(report, b1[:]...)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `report = append(report, b2[:]...)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `report = append(report, b3[:]...)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `report = append(report, b4[:]...)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `report = append(report, b4[:]...)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `report = append(report, b4[:]...)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `report = append(report, b4[:]...)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `report = append(report, b1[:]...)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `t.Run("can verify", func(t *testing.T) { sig, err := kr1.Sign(ctx, report) require.NoError(t, err) result := kr2.Verify(kr1.PublicKey(), ctx, report, sig) require.True(t, result) })` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `t.Run("invalid sig", func(t *testing.T) { result := kr2.Verify(kr1.PublicKey(), ctx, report, []byte{0x01}) require.False(t, result) longSig := [100]byte{} result = kr2.Verify(kr1.PublicKey(), ctx, report, longSig[:]) require.False(t, result) })` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `result = kr2.Verify(kr1.PublicKey(), ctx, report, longSig[:])` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `pk = big.NewInt(int64(31337)).Bytes()` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `result = kr2.Verify(pk, ctx, report, sig)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `err = kr2.Unmarshal(m)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.SetString("2137244795266879235401249500471353867704187908407744160927664772020405449078", 10)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.SetString(bigKey.String())` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.String()` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.Bytes()` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.Unmarshal(bytesKey[:])` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.DecodeString("0004acf99cb25a4803916f086440c661295b105a485efdc649ac4de9536da25b")` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.BytesToConfigDigest(bytes)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.SetUint64(1)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.Bytes()` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.DecodeString("00010203000000000000000000000000000000000000000000000000000000")` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.SetBytes(b2Bytes)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.Bytes()` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.SetUint64(4)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.Bytes()` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.SetUint64(99)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.Bytes()` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.SetString("0x1332a8dabaabef63b03438ca50760cb9f5c0292cbf015b2395e50e6157df4e3")` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.Bytes()` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.Sign(ctx, report)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.SetBytes(sig[0:32])` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.SetBytes(sig[32:64])` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.SetBytes(sig[64:])` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.SetString("1118148281956858477519852250235501663092798578871088714409528077622994994907", 10)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.SetBytes(bigPubExpected.Bytes())` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.Bytes()` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.SetString("2898571078985034687500959842265381508927681132188252715370774777831313601543", 10)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.SetBytes(bigRExpected.Bytes())` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.Bytes()` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.SetString("1930849708769648077928186998643944706551011476358007177069185543644456022504", 10)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.SetString("1687653079896483135769135784451125398975732275358080312084893914240056843079", 10)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.SetBytes(bigSExpected.Bytes())` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.Bytes()` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.DecodeString(digest)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.BytesToConfigDigest(bytes)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.Run("can verify", func(t *testing.T) { sig, err := kr1.Sign(ctx, report) require.NoError(t, err) result := kr2.Verify(kr1.PublicKey(), ctx, report, sig) require.True(t, result) })` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.Sign(ctx, report)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.Verify(kr1.PublicKey(), ctx, report, sig)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.PublicKey()` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.Run("invalid sig", func(t *testing.T) { result := kr2.Verify(kr1.PublicKey(), ctx, report, []byte{0x01}) require.False(t, result) longSig := [100]byte{} result = kr2.Verify(kr1.PublicKey(), ctx, report, longSig[:]) require.False(t, result) })` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.Verify(kr1.PublicKey(), ctx, report, []byte{0x01})` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.PublicKey()` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.Verify(kr1.PublicKey(), ctx, report, longSig[:])` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.PublicKey()` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.Sign(ctx, report)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.Verify(pk, ctx, report, sig)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.NewInt(int64(31337))` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.Bytes()` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.Verify(pk, ctx, report, sig)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.Marshal()` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.Unmarshal(m)` $DIR/core/services/keystore/keys/starkkey/ocr2key_test.go: `.Unmarshal([]byte{0x01})` $DIR/core/services/keystore/keys/vrfkey/crypto_test.go: `.I()` $DIR/core/services/keystore/keys/vrfkey/crypto_test.go: `.Sub(FieldSize, bm.One)` $DIR/core/services/keystore/keys/vrfkey/crypto_test.go: `.Add(bm.Mul(bm.Two, bm.Mul(bm.Two, bm.Two)), bm.Seven)` $DIR/core/services/keystore/keys/vrfkey/crypto_test.go: `.Mul(bm.Two, bm.Mul(bm.Two, bm.Two))` $DIR/core/services/keystore/keys/vrfkey/crypto_test.go: `.Mul(bm.Two, bm.Two)` $DIR/core/services/keystore/keys/vrfkey/crypto_test.go: `.NewInt(5)` $DIR/core/services/keystore/keys/vrfkey/key_v2_test.go: `.GenerateKey(crypto.S256(), rand.Reader)` $DIR/core/services/keystore/keys/vrfkey/key_v2_test.go: `.S256()` $DIR/core/services/keystore/keys/vrfkey/key_v2_test.go: `.D.Bytes()` $DIR/core/services/keystore/keys/vrfkey/key_v2_test.go: `.String()` $DIR/core/services/keystore/keys/vrfkey/key_v2_test.go: `.GenerateProof(big.NewInt(1))` $DIR/core/services/keystore/keys/vrfkey/key_v2_test.go: `.NewInt(1)` $DIR/core/services/keystore/keys/vrfkey/models_test.go: `err = vrfk.Scan(v2)` $DIR/core/services/keystore/keys/vrfkey/models_test.go: `err = vrfk.Scan("")` $DIR/core/services/keystore/keys/vrfkey/models_test.go: `err = vrfk.Scan(1)` $DIR/core/services/keystore/keys/vrfkey/models_test.go: `.JSON()` $DIR/core/services/keystore/keys/vrfkey/models_test.go: `.Value()` $DIR/core/services/keystore/keys/vrfkey/models_test.go: `.Scan(v2)` $DIR/core/services/keystore/keys/vrfkey/models_test.go: `.Scan("")` $DIR/core/services/keystore/keys/vrfkey/models_test.go: `.Scan(1)` $DIR/core/services/keystore/keys/vrfkey/private_key_test.go: `err = json.Unmarshal(cryptoJSON, &gethKey)` $DIR/core/services/keystore/keys/vrfkey/private_key_test.go: `_, err = Decrypt(ek, "wrong-password")` $DIR/core/services/keystore/keys/vrfkey/private_key_test.go: `.EncryptKey(k.toGethKey(), adulteratedPassword(testutils.Password), utils.FastScryptParams.N, utils.FastScryptParams.P)` $DIR/core/services/keystore/keys/vrfkey/private_key_test.go: `.toGethKey()` $DIR/core/services/keystore/keys/vrfkey/private_key_test.go: `.Unmarshal(cryptoJSON, &gethKey)` $DIR/core/services/keystore/keys/vrfkey/private_key_test.go: `.ToV2()` $DIR/core/services/keystore/keys/vrfkey/private_key_test.go: `.Sprintf("PrivateKey{k: , PublicKey: %s}", pk.PublicKey)` $DIR/core/services/keystore/keys/vrfkey/private_key_test.go: `.String()` $DIR/core/services/keystore/keys/vrfkey/proof_test.go: `p.Seed = big.NewInt(0).Add(seed, big.NewInt(1))` $DIR/core/services/keystore/keys/vrfkey/proof_test.go: `.NewInt(2)` $DIR/core/services/keystore/keys/vrfkey/proof_test.go: `.NewInt(3)` $DIR/core/services/keystore/keys/vrfkey/proof_test.go: `.GenerateProofWithNonce(seed, nonce)` $DIR/core/services/keystore/keys/vrfkey/proof_test.go: `.NewInt(0)` $DIR/core/services/keystore/keys/vrfkey/proof_test.go: `.Add(seed, big.NewInt(1))` $DIR/core/services/keystore/keys/vrfkey/proof_test.go: `.NewInt(1)` $DIR/core/services/keystore/keys/vrfkey/proof_test.go: `.VerifyVRFProof()` $DIR/core/services/keystore/keys/vrfkey/proof_test.go: `.Sprintf( "vrf.Proof{PublicKey: %s, Gamma: %s, C: %x, S: %x, Seed: %x, Output: %x}", p.PublicKey, p.Gamma, p.C, p.S, p.Seed, p.Output)` $DIR/core/services/keystore/keys/vrfkey/proof_test.go: `.String()` $DIR/core/services/keystore/keys/vrfkey/public_key_test.go: `nnPk.Set(pk)` $DIR/core/services/keystore/keys/vrfkey/public_key_test.go: `.NewStream(t, 0)` $DIR/core/services/keystore/keys/vrfkey/public_key_test.go: `.Point()` $DIR/core/services/keystore/keys/vrfkey/public_key_test.go: `.Pick(randomStream)` $DIR/core/services/keystore/keys/vrfkey/public_key_test.go: `.MarshalBinary()` $DIR/core/services/keystore/keys/vrfkey/public_key_test.go: `.Point()` $DIR/core/services/keystore/keys/vrfkey/public_key_test.go: `.Value()` $DIR/core/services/keystore/keys/vrfkey/public_key_test.go: `.Set(pk)` $DIR/core/services/keystore/keys/vrfkey/public_key_test.go: `.NewPublicKeyFromHex("0x9dc09a0f898f3b5e8047204e7ce7e44b587920932f08431e29c9bf6923b8450a01")` $DIR/core/services/keystore/keys/vrfkey/public_key_test.go: `.MustHash()` $DIR/core/services/keystore/keys/vrfkey/public_key_test.go: `.String()` $DIR/core/services/keystore/master_test.go: `keyStore.ResetXXXTestOnly()` $DIR/core/services/keystore/master_test.go: `t.Run("can be unlocked more than once, as long as the passwords match", func(t *testing.T) { defer reset() ctx := testutils.Context(t) require.NoError(t, keyStore.Unlock(ctx, cltest.Password)) require.NoError(t, keyStore.Unlock(ctx, cltest.Password)) require.NoError(t, keyStore.Unlock(ctx, cltest.Password)) require.Error(t, keyStore.Unlock(ctx, "wrong password")) })` $DIR/core/services/keystore/master_test.go: `t.Run("saves an empty keyRing", func(t *testing.T) { defer reset() ctx := testutils.Context(t) require.NoError(t, keyStore.Unlock(ctx, cltest.Password)) cltest.AssertCount(t, db, tableName, 1) require.NoError(t, keyStore.ExportedSave(ctx)) cltest.AssertCount(t, db, tableName, 1) })` $DIR/core/services/keystore/master_test.go: `cltest.AssertCount(t, db, tableName, 1)` $DIR/core/services/keystore/master_test.go: `cltest.AssertCount(t, db, tableName, 1)` $DIR/core/services/keystore/master_test.go: `t.Run("won't load a saved keyRing if the password is incorrect", func(t *testing.T) { defer reset() ctx := testutils.Context(t) require.NoError(t, keyStore.Unlock(ctx, cltest.Password)) cltest.MustInsertRandomKey(t, keyStore.Eth()) // need at least 1 key to encrypt cltest.AssertCount(t, db, tableName, 1) keyStore.ResetXXXTestOnly() cltest.AssertCount(t, db, tableName, 1) require.Error(t, keyStore.Unlock(ctx, "password2")) cltest.AssertCount(t, db, tableName, 1) })` $DIR/core/services/keystore/master_test.go: `cltest.MustInsertRandomKey(t, keyStore.Eth())` $DIR/core/services/keystore/master_test.go: `cltest.AssertCount(t, db, tableName, 1)` $DIR/core/services/keystore/master_test.go: `keyStore.ResetXXXTestOnly()` $DIR/core/services/keystore/master_test.go: `cltest.AssertCount(t, db, tableName, 1)` $DIR/core/services/keystore/master_test.go: `cltest.AssertCount(t, db, tableName, 1)` $DIR/core/services/keystore/master_test.go: `keyStore.ResetXXXTestOnly()` $DIR/core/services/keystore/master_test.go: `.NewSqlxDB(t)` $DIR/core/services/keystore/master_test.go: `.ExposedNewMaster(t, db)` $DIR/core/services/keystore/master_test.go: `.ResetXXXTestOnly()` $DIR/core/services/keystore/master_test.go: `.Exec(fmt.Sprintf("DELETE FROM %s", tableName))` $DIR/core/services/keystore/master_test.go: `.Sprintf("DELETE FROM %s", tableName)` $DIR/core/services/keystore/master_test.go: `.Run("can be unlocked more than once, as long as the passwords match", func(t *testing.T) { defer reset() ctx := testutils.Context(t) require.NoError(t, keyStore.Unlock(ctx, cltest.Password)) require.NoError(t, keyStore.Unlock(ctx, cltest.Password)) require.NoError(t, keyStore.Unlock(ctx, cltest.Password)) require.Error(t, keyStore.Unlock(ctx, "wrong password")) })` $DIR/core/services/keystore/master_test.go: `.Context(t)` $DIR/core/services/keystore/master_test.go: `.Run("saves an empty keyRing", func(t *testing.T) { defer reset() ctx := testutils.Context(t) require.NoError(t, keyStore.Unlock(ctx, cltest.Password)) cltest.AssertCount(t, db, tableName, 1) require.NoError(t, keyStore.ExportedSave(ctx)) cltest.AssertCount(t, db, tableName, 1) })` $DIR/core/services/keystore/master_test.go: `.Context(t)` $DIR/core/services/keystore/master_test.go: `.AssertCount(t, db, tableName, 1)` $DIR/core/services/keystore/master_test.go: `.AssertCount(t, db, tableName, 1)` $DIR/core/services/keystore/master_test.go: `.Run("won't load a saved keyRing if the password is incorrect", func(t *testing.T) { defer reset() ctx := testutils.Context(t) require.NoError(t, keyStore.Unlock(ctx, cltest.Password)) cltest.MustInsertRandomKey(t, keyStore.Eth()) // need at least 1 key to encrypt cltest.AssertCount(t, db, tableName, 1) keyStore.ResetXXXTestOnly() cltest.AssertCount(t, db, tableName, 1) require.Error(t, keyStore.Unlock(ctx, "password2")) cltest.AssertCount(t, db, tableName, 1) })` $DIR/core/services/keystore/master_test.go: `.Context(t)` $DIR/core/services/keystore/master_test.go: `.MustInsertRandomKey(t, keyStore.Eth())` $DIR/core/services/keystore/master_test.go: `.Eth()` $DIR/core/services/keystore/master_test.go: `.AssertCount(t, db, tableName, 1)` $DIR/core/services/keystore/master_test.go: `.ResetXXXTestOnly()` $DIR/core/services/keystore/master_test.go: `.AssertCount(t, db, tableName, 1)` $DIR/core/services/keystore/master_test.go: `.AssertCount(t, db, tableName, 1)` $DIR/core/services/keystore/master_test.go: `.Context(t)` $DIR/core/services/keystore/master_test.go: `.ResetXXXTestOnly()` $DIR/core/services/keystore/models_test.go: `ocr2 = append(ocr2, key)` $DIR/core/services/keystore/models_test.go: `ocr2_raw = append(ocr2_raw, key.Raw())` $DIR/core/services/keystore/models_test.go: `t.Run("test encrypt/decrypt", func(t *testing.T) { encryptedKr, err := originalKeyRing.Encrypt(password, utils.FastScryptParams) require.NoError(t, err) decryptedKeyRing, err := encryptedKr.Decrypt(password) require.NoError(t, err) // compare cosmos keys require.Equal(t, 2, len(decryptedKeyRing.Cosmos)) require.Equal(t, originalKeyRing.Cosmos[tk1.ID()].PublicKey(), decryptedKeyRing.Cosmos[tk1.ID()].PublicKey()) require.Equal(t, originalKeyRing.Cosmos[tk2.ID()].PublicKey(), decryptedKeyRing.Cosmos[tk2.ID()].PublicKey()) // compare csa keys require.Equal(t, 2, len(decryptedKeyRing.CSA)) require.Equal(t, originalKeyRing.CSA[csa1.ID()].PublicKey, decryptedKeyRing.CSA[csa1.ID()].PublicKey) require.Equal(t, originalKeyRing.CSA[csa2.ID()].PublicKey, decryptedKeyRing.CSA[csa2.ID()].PublicKey) // compare eth keys require.Equal(t, 2, len(decryptedKeyRing.Eth)) require.Equal(t, originalKeyRing.Eth[eth1.ID()].Address, decryptedKeyRing.Eth[eth1.ID()].Address) require.Equal(t, originalKeyRing.Eth[eth2.ID()].Address, decryptedKeyRing.Eth[eth2.ID()].Address) // compare ocr keys require.Equal(t, 2, len(decryptedKeyRing.OCR)) require.Equal(t, originalKeyRing.OCR[ocr[0].ID()].OnChainSigning.X, decryptedKeyRing.OCR[ocr[0].ID()].OnChainSigning.X) require.Equal(t, originalKeyRing.OCR[ocr[0].ID()].OnChainSigning.Y, decryptedKeyRing.OCR[ocr[0].ID()].OnChainSigning.Y) require.Equal(t, originalKeyRing.OCR[ocr[0].ID()].OnChainSigning.D, decryptedKeyRing.OCR[ocr[0].ID()].OnChainSigning.D) require.Equal(t, originalKeyRing.OCR[ocr[0].ID()].OffChainSigning, decryptedKeyRing.OCR[ocr[0].ID()].OffChainSigning) require.Equal(t, originalKeyRing.OCR[ocr[0].ID()].OffChainEncryption, decryptedKeyRing.OCR[ocr[0].ID()].OffChainEncryption) require.Equal(t, originalKeyRing.OCR[ocr[1].ID()].OnChainSigning.X, decryptedKeyRing.OCR[ocr[1].ID()].OnChainSigning.X) require.Equal(t, originalKeyRing.OCR[ocr[1].ID()].OnChainSigning.Y, decryptedKeyRing.OCR[ocr[1].ID()].OnChainSigning.Y) require.Equal(t, originalKeyRing.OCR[ocr[1].ID()].OnChainSigning.D, decryptedKeyRing.OCR[ocr[1].ID()].OnChainSigning.D) require.Equal(t, originalKeyRing.OCR[ocr[1].ID()].OffChainSigning, decryptedKeyRing.OCR[ocr[1].ID()].OffChainSigning) require.Equal(t, originalKeyRing.OCR[ocr[1].ID()].OffChainEncryption, decryptedKeyRing.OCR[ocr[1].ID()].OffChainEncryption) // compare ocr2 keys require.Equal(t, len(chaintype.SupportedChainTypes), len(decryptedKeyRing.OCR2)) for i := range ocr2 { id := ocr2[i].ID() require.Equal(t, originalKeyRing.OCR2[id].ID(), decryptedKeyRing.OCR2[id].ID()) require.Equal(t, ocr2[i].OnChainPublicKey(), decryptedKeyRing.OCR2[id].OnChainPublicKey()) require.Equal(t, originalKeyRing.OCR2[id].ChainType(), decryptedKeyRing.OCR2[id].ChainType()) } // compare p2p keys require.Equal(t, 2, len(decryptedKeyRing.P2P)) require.Equal(t, originalKeyRing.P2P[p2p1.ID()].PublicKeyHex(), decryptedKeyRing.P2P[p2p1.ID()].PublicKeyHex()) require.Equal(t, originalKeyRing.P2P[p2p1.ID()].PeerID(), decryptedKeyRing.P2P[p2p1.ID()].PeerID()) require.Equal(t, originalKeyRing.P2P[p2p2.ID()].PublicKeyHex(), decryptedKeyRing.P2P[p2p2.ID()].PublicKeyHex()) require.Equal(t, originalKeyRing.P2P[p2p2.ID()].PeerID(), decryptedKeyRing.P2P[p2p2.ID()].PeerID()) // compare solana keys require.Equal(t, 2, len(decryptedKeyRing.Solana)) require.Equal(t, originalKeyRing.Solana[sol1.ID()].GetPublic(), decryptedKeyRing.Solana[sol1.ID()].GetPublic()) // compare vrf keys require.Equal(t, 2, len(decryptedKeyRing.VRF)) require.Equal(t, originalKeyRing.VRF[vrf1.ID()].PublicKey, decryptedKeyRing.VRF[vrf1.ID()].PublicKey) require.Equal(t, originalKeyRing.VRF[vrf2.ID()].PublicKey, decryptedKeyRing.VRF[vrf2.ID()].PublicKey) // compare dkgsign keys require.Equal(t, 2, len(decryptedKeyRing.DKGSign)) require.Equal(t, originalKeyRing.DKGSign[dkgsign1.ID()].PublicKey, decryptedKeyRing.DKGSign[dkgsign1.ID()].PublicKey) require.Equal(t, originalKeyRing.DKGSign[dkgsign2.ID()].PublicKey, decryptedKeyRing.DKGSign[dkgsign2.ID()].PublicKey) // compare dkgencrypt keys require.Equal(t, 2, len(decryptedKeyRing.DKGEncrypt)) require.Equal(t, originalKeyRing.DKGEncrypt[dkgencrypt1.ID()].PublicKey, decryptedKeyRing.DKGEncrypt[dkgencrypt1.ID()].PublicKey) require.Equal(t, originalKeyRing.DKGEncrypt[dkgencrypt2.ID()].PublicKey, decryptedKeyRing.DKGEncrypt[dkgencrypt2.ID()].PublicKey) })` $DIR/core/services/keystore/models_test.go: `allKeys["OCR2"] = append(allKeys["OCR2"], newOCR2Key1.Raw().String())` $DIR/core/services/keystore/models_test.go: `allKeys["OCR2"] = append(allKeys["OCR2"], newOCR2Key2.Raw().String())` $DIR/core/services/keystore/models_test.go: `allKeys["P2P"] = append(allKeys["P2P"], newP2PKey1.Raw().String())` $DIR/core/services/keystore/models_test.go: `allKeys["P2P"] = append(allKeys["P2P"], newP2PKey2.Raw().String())` $DIR/core/services/keystore/models_test.go: `err = originalKeyRing.LegacyKeys.StoreUnsupported(newRawJson, originalKeyRing)` $DIR/core/services/keystore/models_test.go: `err = json.Unmarshal(unloadedKeysJson, &shouldHaveAllKeys)` $DIR/core/services/keystore/models_test.go: `err = originalKeyRing.LegacyKeys.StoreUnsupported(newRawJson, nil)` $DIR/core/services/keystore/models_test.go: `_, err = originalKeyRing.LegacyKeys.UnloadUnsupported(nil)` $DIR/core/services/keystore/models_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(1))` $DIR/core/services/keystore/models_test.go: `.NewInt(1)` $DIR/core/services/keystore/models_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(2))` $DIR/core/services/keystore/models_test.go: `.NewInt(2)` $DIR/core/services/keystore/models_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(1))` $DIR/core/services/keystore/models_test.go: `.NewInt(1)` $DIR/core/services/keystore/models_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(2))` $DIR/core/services/keystore/models_test.go: `.NewInt(2)` $DIR/core/services/keystore/models_test.go: `.MustNewInsecure(rand.Reader, chain)` $DIR/core/services/keystore/models_test.go: `.Raw()` $DIR/core/services/keystore/models_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(1))` $DIR/core/services/keystore/models_test.go: `.NewInt(1)` $DIR/core/services/keystore/models_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(2))` $DIR/core/services/keystore/models_test.go: `.NewInt(2)` $DIR/core/services/keystore/models_test.go: `.MustNewInsecure(rand.Reader)` $DIR/core/services/keystore/models_test.go: `.MustNewInsecure(rand.Reader)` $DIR/core/services/keystore/models_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(1))` $DIR/core/services/keystore/models_test.go: `.NewInt(1)` $DIR/core/services/keystore/models_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(2))` $DIR/core/services/keystore/models_test.go: `.NewInt(2)` $DIR/core/services/keystore/models_test.go: `.MustNewInsecure(rand.Reader)` $DIR/core/services/keystore/models_test.go: `.MustNewInsecure(rand.Reader)` $DIR/core/services/keystore/models_test.go: `.MustNewXXXTestingOnly(big.NewInt(1))` $DIR/core/services/keystore/models_test.go: `.NewInt(1)` $DIR/core/services/keystore/models_test.go: `.MustNewXXXTestingOnly(big.NewInt(2))` $DIR/core/services/keystore/models_test.go: `.NewInt(2)` $DIR/core/services/keystore/models_test.go: `.MustNewXXXTestingOnly(big.NewInt(1))` $DIR/core/services/keystore/models_test.go: `.NewInt(1)` $DIR/core/services/keystore/models_test.go: `.MustNewXXXTestingOnly(big.NewInt(2))` $DIR/core/services/keystore/models_test.go: `.NewInt(2)` $DIR/core/services/keystore/models_test.go: `.Raw()` $DIR/core/services/keystore/models_test.go: `.Raw()` $DIR/core/services/keystore/models_test.go: `.Raw()` $DIR/core/services/keystore/models_test.go: `.Raw()` $DIR/core/services/keystore/models_test.go: `.Raw()` $DIR/core/services/keystore/models_test.go: `.Raw()` $DIR/core/services/keystore/models_test.go: `.Raw()` $DIR/core/services/keystore/models_test.go: `.Raw()` $DIR/core/services/keystore/models_test.go: `.Raw()` $DIR/core/services/keystore/models_test.go: `.Raw()` $DIR/core/services/keystore/models_test.go: `.Raw()` $DIR/core/services/keystore/models_test.go: `.Raw()` $DIR/core/services/keystore/models_test.go: `.Raw()` $DIR/core/services/keystore/models_test.go: `.Raw()` $DIR/core/services/keystore/models_test.go: `.Raw()` $DIR/core/services/keystore/models_test.go: `.Raw()` $DIR/core/services/keystore/models_test.go: `.Raw()` $DIR/core/services/keystore/models_test.go: `.Raw()` $DIR/core/services/keystore/models_test.go: `.keys()` $DIR/core/services/keystore/models_test.go: `.Run("test encrypt/decrypt", func(t *testing.T) { encryptedKr, err := originalKeyRing.Encrypt(password, utils.FastScryptParams) require.NoError(t, err) decryptedKeyRing, err := encryptedKr.Decrypt(password) require.NoError(t, err) // compare cosmos keys require.Equal(t, 2, len(decryptedKeyRing.Cosmos)) require.Equal(t, originalKeyRing.Cosmos[tk1.ID()].PublicKey(), decryptedKeyRing.Cosmos[tk1.ID()].PublicKey()) require.Equal(t, originalKeyRing.Cosmos[tk2.ID()].PublicKey(), decryptedKeyRing.Cosmos[tk2.ID()].PublicKey()) // compare csa keys require.Equal(t, 2, len(decryptedKeyRing.CSA)) require.Equal(t, originalKeyRing.CSA[csa1.ID()].PublicKey, decryptedKeyRing.CSA[csa1.ID()].PublicKey) require.Equal(t, originalKeyRing.CSA[csa2.ID()].PublicKey, decryptedKeyRing.CSA[csa2.ID()].PublicKey) // compare eth keys require.Equal(t, 2, len(decryptedKeyRing.Eth)) require.Equal(t, originalKeyRing.Eth[eth1.ID()].Address, decryptedKeyRing.Eth[eth1.ID()].Address) require.Equal(t, originalKeyRing.Eth[eth2.ID()].Address, decryptedKeyRing.Eth[eth2.ID()].Address) // compare ocr keys require.Equal(t, 2, len(decryptedKeyRing.OCR)) require.Equal(t, originalKeyRing.OCR[ocr[0].ID()].OnChainSigning.X, decryptedKeyRing.OCR[ocr[0].ID()].OnChainSigning.X) require.Equal(t, originalKeyRing.OCR[ocr[0].ID()].OnChainSigning.Y, decryptedKeyRing.OCR[ocr[0].ID()].OnChainSigning.Y) require.Equal(t, originalKeyRing.OCR[ocr[0].ID()].OnChainSigning.D, decryptedKeyRing.OCR[ocr[0].ID()].OnChainSigning.D) require.Equal(t, originalKeyRing.OCR[ocr[0].ID()].OffChainSigning, decryptedKeyRing.OCR[ocr[0].ID()].OffChainSigning) require.Equal(t, originalKeyRing.OCR[ocr[0].ID()].OffChainEncryption, decryptedKeyRing.OCR[ocr[0].ID()].OffChainEncryption) require.Equal(t, originalKeyRing.OCR[ocr[1].ID()].OnChainSigning.X, decryptedKeyRing.OCR[ocr[1].ID()].OnChainSigning.X) require.Equal(t, originalKeyRing.OCR[ocr[1].ID()].OnChainSigning.Y, decryptedKeyRing.OCR[ocr[1].ID()].OnChainSigning.Y) require.Equal(t, originalKeyRing.OCR[ocr[1].ID()].OnChainSigning.D, decryptedKeyRing.OCR[ocr[1].ID()].OnChainSigning.D) require.Equal(t, originalKeyRing.OCR[ocr[1].ID()].OffChainSigning, decryptedKeyRing.OCR[ocr[1].ID()].OffChainSigning) require.Equal(t, originalKeyRing.OCR[ocr[1].ID()].OffChainEncryption, decryptedKeyRing.OCR[ocr[1].ID()].OffChainEncryption) // compare ocr2 keys require.Equal(t, len(chaintype.SupportedChainTypes), len(decryptedKeyRing.OCR2)) for i := range ocr2 { id := ocr2[i].ID() require.Equal(t, originalKeyRing.OCR2[id].ID(), decryptedKeyRing.OCR2[id].ID()) require.Equal(t, ocr2[i].OnChainPublicKey(), decryptedKeyRing.OCR2[id].OnChainPublicKey()) require.Equal(t, originalKeyRing.OCR2[id].ChainType(), decryptedKeyRing.OCR2[id].ChainType()) } // compare p2p keys require.Equal(t, 2, len(decryptedKeyRing.P2P)) require.Equal(t, originalKeyRing.P2P[p2p1.ID()].PublicKeyHex(), decryptedKeyRing.P2P[p2p1.ID()].PublicKeyHex()) require.Equal(t, originalKeyRing.P2P[p2p1.ID()].PeerID(), decryptedKeyRing.P2P[p2p1.ID()].PeerID()) require.Equal(t, originalKeyRing.P2P[p2p2.ID()].PublicKeyHex(), decryptedKeyRing.P2P[p2p2.ID()].PublicKeyHex()) require.Equal(t, originalKeyRing.P2P[p2p2.ID()].PeerID(), decryptedKeyRing.P2P[p2p2.ID()].PeerID()) // compare solana keys require.Equal(t, 2, len(decryptedKeyRing.Solana)) require.Equal(t, originalKeyRing.Solana[sol1.ID()].GetPublic(), decryptedKeyRing.Solana[sol1.ID()].GetPublic()) // compare vrf keys require.Equal(t, 2, len(decryptedKeyRing.VRF)) require.Equal(t, originalKeyRing.VRF[vrf1.ID()].PublicKey, decryptedKeyRing.VRF[vrf1.ID()].PublicKey) require.Equal(t, originalKeyRing.VRF[vrf2.ID()].PublicKey, decryptedKeyRing.VRF[vrf2.ID()].PublicKey) // compare dkgsign keys require.Equal(t, 2, len(decryptedKeyRing.DKGSign)) require.Equal(t, originalKeyRing.DKGSign[dkgsign1.ID()].PublicKey, decryptedKeyRing.DKGSign[dkgsign1.ID()].PublicKey) require.Equal(t, originalKeyRing.DKGSign[dkgsign2.ID()].PublicKey, decryptedKeyRing.DKGSign[dkgsign2.ID()].PublicKey) // compare dkgencrypt keys require.Equal(t, 2, len(decryptedKeyRing.DKGEncrypt)) require.Equal(t, originalKeyRing.DKGEncrypt[dkgencrypt1.ID()].PublicKey, decryptedKeyRing.DKGEncrypt[dkgencrypt1.ID()].PublicKey) require.Equal(t, originalKeyRing.DKGEncrypt[dkgencrypt2.ID()].PublicKey, decryptedKeyRing.DKGEncrypt[dkgencrypt2.ID()].PublicKey) })` $DIR/core/services/keystore/models_test.go: `.Encrypt(password, utils.FastScryptParams)` $DIR/core/services/keystore/models_test.go: `.Decrypt(password)` $DIR/core/services/keystore/models_test.go: `.ID()` $DIR/core/services/keystore/models_test.go: `.Marshal(originalKeyRing.raw())` $DIR/core/services/keystore/models_test.go: `.raw()` $DIR/core/services/keystore/models_test.go: `.Unmarshal(rawJson, &allKeys)` $DIR/core/services/keystore/models_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(5))` $DIR/core/services/keystore/models_test.go: `.NewInt(5)` $DIR/core/services/keystore/models_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(6))` $DIR/core/services/keystore/models_test.go: `.NewInt(6)` $DIR/core/services/keystore/models_test.go: `.Raw()` $DIR/core/services/keystore/models_test.go: `.String()` $DIR/core/services/keystore/models_test.go: `.Raw()` $DIR/core/services/keystore/models_test.go: `.String()` $DIR/core/services/keystore/models_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(5))` $DIR/core/services/keystore/models_test.go: `.NewInt(5)` $DIR/core/services/keystore/models_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(7))` $DIR/core/services/keystore/models_test.go: `.NewInt(7)` $DIR/core/services/keystore/models_test.go: `.Raw()` $DIR/core/services/keystore/models_test.go: `.String()` $DIR/core/services/keystore/models_test.go: `.Raw()` $DIR/core/services/keystore/models_test.go: `.String()` $DIR/core/services/keystore/models_test.go: `.Marshal(allKeys)` $DIR/core/services/keystore/models_test.go: `.LegacyKeys.StoreUnsupported(newRawJson, originalKeyRing)` $DIR/core/services/keystore/models_test.go: `.Marshal(originalKeyRing.raw())` $DIR/core/services/keystore/models_test.go: `.raw()` $DIR/core/services/keystore/models_test.go: `.LegacyKeys.UnloadUnsupported(marshalledRawKeyRingJson)` $DIR/core/services/keystore/models_test.go: `.Unmarshal(unloadedKeysJson, &shouldHaveAllKeys)` $DIR/core/services/keystore/models_test.go: `.LegacyKeys.StoreUnsupported(newRawJson, nil)` $DIR/core/services/keystore/models_test.go: `.LegacyKeys.UnloadUnsupported(nil)` $DIR/core/services/keystore/ocr2_test.go: `keyStore.ResetXXXTestOnly()` $DIR/core/services/keystore/ocr2_test.go: `err = keyStore.Unlock(ctx, cltest.Password)` $DIR/core/services/keystore/ocr2_test.go: `t.Run("initializes with an empty state", func(t *testing.T) { defer reset() keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) })` $DIR/core/services/keystore/ocr2_test.go: `t.Run("errors when getting non-existent ID", func(t *testing.T) { defer reset() _, err := ks.Get("non-existent-id") require.Error(t, err) })` $DIR/core/services/keystore/ocr2_test.go: `t.Run("creates a key with valid type", func(t *testing.T) { defer reset() ctx := testutils.Context(t) // lopp through different chain types for _, chain := range chaintype.SupportedChainTypes { key, err := ks.Create(ctx, chain) require.NoError(t, err) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, key, retrievedKey) } })` $DIR/core/services/keystore/ocr2_test.go: `t.Run("gets keys by type", func(t *testing.T) { defer reset() ctx := testutils.Context(t) created := map[chaintype.ChainType]bool{} for _, chain := range chaintype.SupportedChainTypes { // validate no keys exist for chain keys, err := ks.GetAllOfType(chain) require.NoError(t, err) require.Len(t, keys, 0) _, err = ks.Create(ctx, chain) require.NoError(t, err) created[chain] = true // validate that only 1 of each exists after creation for _, c := range chaintype.SupportedChainTypes { keys, err := ks.GetAllOfType(c) require.NoError(t, err) if created[c] { require.Len(t, keys, 1) continue } require.Len(t, keys, 0) } } })` $DIR/core/services/keystore/ocr2_test.go: `_, err = ks.Create(ctx, chain)` $DIR/core/services/keystore/ocr2_test.go: `created[chain] = true` $DIR/core/services/keystore/ocr2_test.go: `t.Run("errors when creating a key with an invalid type", func(t *testing.T) { defer reset() ctx := testutils.Context(t) _, err := ks.Create(ctx, "foobar") require.Error(t, err) })` $DIR/core/services/keystore/ocr2_test.go: `t.Run("imports and exports a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) for _, chain := range chaintype.SupportedChainTypes { key, err := ks.Create(ctx, chain) require.NoError(t, err) exportJSON, err := ks.Export(key.ID(), cltest.Password) require.NoError(t, err) _, err = ks.Export("non-existent", cltest.Password) assert.Error(t, err) err = ks.Delete(ctx, key.ID()) require.NoError(t, err) _, err = ks.Get(key.ID()) require.Error(t, err) importedKey, err := ks.Import(ctx, exportJSON, cltest.Password) require.NoError(t, err) _, err = ks.Import(ctx, []byte(""), cltest.Password) assert.Error(t, err) require.Equal(t, key.ID(), importedKey.ID()) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, importedKey, retrievedKey) require.Equal(t, importedKey.ChainType(), retrievedKey.ChainType()) } })` $DIR/core/services/keystore/ocr2_test.go: `_, err = ks.Export("non-existent", cltest.Password)` $DIR/core/services/keystore/ocr2_test.go: `err = ks.Delete(ctx, key.ID())` $DIR/core/services/keystore/ocr2_test.go: `_, err = ks.Get(key.ID())` $DIR/core/services/keystore/ocr2_test.go: `_, err = ks.Import(ctx, []byte(""), cltest.Password)` $DIR/core/services/keystore/ocr2_test.go: `t.Run("adds an externally created key / deletes a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) for _, chain := range chaintype.SupportedChainTypes { newKey, err := ocr2key.New(chain) require.NoError(t, err) err = ks.Add(ctx, newKey) require.NoError(t, err) err = ks.Add(ctx, newKey) assert.Error(t, err) keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 1, len(keys)) err = ks.Delete(ctx, newKey.ID()) require.NoError(t, err) err = ks.Delete(ctx, newKey.ID()) assert.Error(t, err) keys, err = ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) _, err = ks.Get(newKey.ID()) require.Error(t, err) } })` $DIR/core/services/keystore/ocr2_test.go: `err = ks.Add(ctx, newKey)` $DIR/core/services/keystore/ocr2_test.go: `err = ks.Add(ctx, newKey)` $DIR/core/services/keystore/ocr2_test.go: `err = ks.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/ocr2_test.go: `err = ks.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/ocr2_test.go: `keys, err = ks.GetAll()` $DIR/core/services/keystore/ocr2_test.go: `_, err = ks.Get(newKey.ID())` $DIR/core/services/keystore/ocr2_test.go: `t.Run("ensures key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) err := ks.EnsureKeys(ctx, chaintype.SupportedChainTypes...) assert.NoError(t, err) keys, err := ks.GetAll() assert.NoError(t, err) require.Equal(t, len(chaintype.SupportedChainTypes), len(keys)) err = ks.EnsureKeys(ctx, chaintype.SupportedChainTypes...) assert.NoError(t, err) // loop through different supported chain types for _, chain := range chaintype.SupportedChainTypes { keys, err := ks.GetAllOfType(chain) assert.NoError(t, err) require.Equal(t, 1, len(keys)) } })` $DIR/core/services/keystore/ocr2_test.go: `err = ks.EnsureKeys(ctx, chaintype.SupportedChainTypes...)` $DIR/core/services/keystore/ocr2_test.go: `err = ks.EnsureKeys(ctx, chaintype.Cosmos)` $DIR/core/services/keystore/ocr2_test.go: `keys, err = ks.GetAll()` $DIR/core/services/keystore/ocr2_test.go: `err = ks.EnsureKeys(ctx, chaintype.StarkNet)` $DIR/core/services/keystore/ocr2_test.go: `keys, err = ks.GetAll()` $DIR/core/services/keystore/ocr2_test.go: `.NewSqlxDB(t)` $DIR/core/services/keystore/ocr2_test.go: `.ExposedNewMaster(t, db)` $DIR/core/services/keystore/ocr2_test.go: `.OCR2()` $DIR/core/services/keystore/ocr2_test.go: `.Background()` $DIR/core/services/keystore/ocr2_test.go: `.Exec("DELETE FROM encrypted_key_rings")` $DIR/core/services/keystore/ocr2_test.go: `.ResetXXXTestOnly()` $DIR/core/services/keystore/ocr2_test.go: `.Unlock(ctx, cltest.Password)` $DIR/core/services/keystore/ocr2_test.go: `.Run("initializes with an empty state", func(t *testing.T) { defer reset() keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) })` $DIR/core/services/keystore/ocr2_test.go: `.GetAll()` $DIR/core/services/keystore/ocr2_test.go: `.Run("errors when getting non-existent ID", func(t *testing.T) { defer reset() _, err := ks.Get("non-existent-id") require.Error(t, err) })` $DIR/core/services/keystore/ocr2_test.go: `.Get("non-existent-id")` $DIR/core/services/keystore/ocr2_test.go: `.Run("creates a key with valid type", func(t *testing.T) { defer reset() ctx := testutils.Context(t) // lopp through different chain types for _, chain := range chaintype.SupportedChainTypes { key, err := ks.Create(ctx, chain) require.NoError(t, err) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, key, retrievedKey) } })` $DIR/core/services/keystore/ocr2_test.go: `.Context(t)` $DIR/core/services/keystore/ocr2_test.go: `.Create(ctx, chain)` $DIR/core/services/keystore/ocr2_test.go: `.Get(key.ID())` $DIR/core/services/keystore/ocr2_test.go: `.ID()` $DIR/core/services/keystore/ocr2_test.go: `.Run("gets keys by type", func(t *testing.T) { defer reset() ctx := testutils.Context(t) created := map[chaintype.ChainType]bool{} for _, chain := range chaintype.SupportedChainTypes { // validate no keys exist for chain keys, err := ks.GetAllOfType(chain) require.NoError(t, err) require.Len(t, keys, 0) _, err = ks.Create(ctx, chain) require.NoError(t, err) created[chain] = true // validate that only 1 of each exists after creation for _, c := range chaintype.SupportedChainTypes { keys, err := ks.GetAllOfType(c) require.NoError(t, err) if created[c] { require.Len(t, keys, 1) continue } require.Len(t, keys, 0) } } })` $DIR/core/services/keystore/ocr2_test.go: `.Context(t)` $DIR/core/services/keystore/ocr2_test.go: `.GetAllOfType(chain)` $DIR/core/services/keystore/ocr2_test.go: `.Create(ctx, chain)` $DIR/core/services/keystore/ocr2_test.go: `.GetAllOfType(c)` $DIR/core/services/keystore/ocr2_test.go: `.Run("errors when creating a key with an invalid type", func(t *testing.T) { defer reset() ctx := testutils.Context(t) _, err := ks.Create(ctx, "foobar") require.Error(t, err) })` $DIR/core/services/keystore/ocr2_test.go: `.Context(t)` $DIR/core/services/keystore/ocr2_test.go: `.Create(ctx, "foobar")` $DIR/core/services/keystore/ocr2_test.go: `.Run("imports and exports a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) for _, chain := range chaintype.SupportedChainTypes { key, err := ks.Create(ctx, chain) require.NoError(t, err) exportJSON, err := ks.Export(key.ID(), cltest.Password) require.NoError(t, err) _, err = ks.Export("non-existent", cltest.Password) assert.Error(t, err) err = ks.Delete(ctx, key.ID()) require.NoError(t, err) _, err = ks.Get(key.ID()) require.Error(t, err) importedKey, err := ks.Import(ctx, exportJSON, cltest.Password) require.NoError(t, err) _, err = ks.Import(ctx, []byte(""), cltest.Password) assert.Error(t, err) require.Equal(t, key.ID(), importedKey.ID()) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, importedKey, retrievedKey) require.Equal(t, importedKey.ChainType(), retrievedKey.ChainType()) } })` $DIR/core/services/keystore/ocr2_test.go: `.Context(t)` $DIR/core/services/keystore/ocr2_test.go: `.Create(ctx, chain)` $DIR/core/services/keystore/ocr2_test.go: `.Export(key.ID(), cltest.Password)` $DIR/core/services/keystore/ocr2_test.go: `.ID()` $DIR/core/services/keystore/ocr2_test.go: `.Export("non-existent", cltest.Password)` $DIR/core/services/keystore/ocr2_test.go: `.Delete(ctx, key.ID())` $DIR/core/services/keystore/ocr2_test.go: `.ID()` $DIR/core/services/keystore/ocr2_test.go: `.Get(key.ID())` $DIR/core/services/keystore/ocr2_test.go: `.ID()` $DIR/core/services/keystore/ocr2_test.go: `.Import(ctx, exportJSON, cltest.Password)` $DIR/core/services/keystore/ocr2_test.go: `.Import(ctx, []byte(""), cltest.Password)` $DIR/core/services/keystore/ocr2_test.go: `.Get(key.ID())` $DIR/core/services/keystore/ocr2_test.go: `.ID()` $DIR/core/services/keystore/ocr2_test.go: `.Run("adds an externally created key / deletes a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) for _, chain := range chaintype.SupportedChainTypes { newKey, err := ocr2key.New(chain) require.NoError(t, err) err = ks.Add(ctx, newKey) require.NoError(t, err) err = ks.Add(ctx, newKey) assert.Error(t, err) keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 1, len(keys)) err = ks.Delete(ctx, newKey.ID()) require.NoError(t, err) err = ks.Delete(ctx, newKey.ID()) assert.Error(t, err) keys, err = ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) _, err = ks.Get(newKey.ID()) require.Error(t, err) } })` $DIR/core/services/keystore/ocr2_test.go: `.Context(t)` $DIR/core/services/keystore/ocr2_test.go: `.New(chain)` $DIR/core/services/keystore/ocr2_test.go: `.Add(ctx, newKey)` $DIR/core/services/keystore/ocr2_test.go: `.Add(ctx, newKey)` $DIR/core/services/keystore/ocr2_test.go: `.GetAll()` $DIR/core/services/keystore/ocr2_test.go: `.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/ocr2_test.go: `.ID()` $DIR/core/services/keystore/ocr2_test.go: `.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/ocr2_test.go: `.ID()` $DIR/core/services/keystore/ocr2_test.go: `.GetAll()` $DIR/core/services/keystore/ocr2_test.go: `.Get(newKey.ID())` $DIR/core/services/keystore/ocr2_test.go: `.ID()` $DIR/core/services/keystore/ocr2_test.go: `.Run("ensures key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) err := ks.EnsureKeys(ctx, chaintype.SupportedChainTypes...) assert.NoError(t, err) keys, err := ks.GetAll() assert.NoError(t, err) require.Equal(t, len(chaintype.SupportedChainTypes), len(keys)) err = ks.EnsureKeys(ctx, chaintype.SupportedChainTypes...) assert.NoError(t, err) // loop through different supported chain types for _, chain := range chaintype.SupportedChainTypes { keys, err := ks.GetAllOfType(chain) assert.NoError(t, err) require.Equal(t, 1, len(keys)) } })` $DIR/core/services/keystore/ocr2_test.go: `.Context(t)` $DIR/core/services/keystore/ocr2_test.go: `.EnsureKeys(ctx, chaintype.SupportedChainTypes...)` $DIR/core/services/keystore/ocr2_test.go: `.GetAll()` $DIR/core/services/keystore/ocr2_test.go: `.EnsureKeys(ctx, chaintype.SupportedChainTypes...)` $DIR/core/services/keystore/ocr2_test.go: `.GetAllOfType(chain)` $DIR/core/services/keystore/ocr2_test.go: `.Context(t)` $DIR/core/services/keystore/ocr2_test.go: `.EnsureKeys(ctx, chaintype.EVM)` $DIR/core/services/keystore/ocr2_test.go: `.GetAll()` $DIR/core/services/keystore/ocr2_test.go: `.EnsureKeys(ctx, chaintype.Cosmos)` $DIR/core/services/keystore/ocr2_test.go: `.GetAll()` $DIR/core/services/keystore/ocr2_test.go: `.GetAllOfType(chaintype.Cosmos)` $DIR/core/services/keystore/ocr2_test.go: `.EnsureKeys(ctx, chaintype.StarkNet)` $DIR/core/services/keystore/ocr2_test.go: `.GetAll()` $DIR/core/services/keystore/ocr2_test.go: `.GetAllOfType(chaintype.StarkNet)` $DIR/core/services/keystore/ocr_test.go: `keyStore.ResetXXXTestOnly()` $DIR/core/services/keystore/ocr_test.go: `t.Run("initializes with an empty state", func(t *testing.T) { defer reset() keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) })` $DIR/core/services/keystore/ocr_test.go: `t.Run("errors when getting non-existent ID", func(t *testing.T) { defer reset() _, err := ks.Get("non-existent-id") require.Error(t, err) })` $DIR/core/services/keystore/ocr_test.go: `t.Run("creates a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, key, retrievedKey) })` $DIR/core/services/keystore/ocr_test.go: `t.Run("imports and exports a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) _, err = ks.Export("non-existent", cltest.Password) assert.Error(t, err) exportJSON, err := ks.Export(key.ID(), cltest.Password) require.NoError(t, err) _, err = ks.Delete(ctx, key.ID()) require.NoError(t, err) _, err = ks.Get(key.ID()) require.Error(t, err) importedKey, err := ks.Import(ctx, exportJSON, cltest.Password) require.NoError(t, err) _, err = ks.Import(ctx, []byte(""), cltest.Password) assert.Error(t, err) _, err = ks.Import(ctx, exportJSON, cltest.Password) assert.Error(t, err) assert.Equal(t, key.ID(), importedKey.ID()) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) assert.Equal(t, importedKey, retrievedKey) })` $DIR/core/services/keystore/ocr_test.go: `_, err = ks.Export("non-existent", cltest.Password)` $DIR/core/services/keystore/ocr_test.go: `_, err = ks.Delete(ctx, key.ID())` $DIR/core/services/keystore/ocr_test.go: `_, err = ks.Get(key.ID())` $DIR/core/services/keystore/ocr_test.go: `_, err = ks.Import(ctx, []byte(""), cltest.Password)` $DIR/core/services/keystore/ocr_test.go: `_, err = ks.Import(ctx, exportJSON, cltest.Password)` $DIR/core/services/keystore/ocr_test.go: `t.Run("adds an externally created key / deletes a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) newKey, err := ocrkey.NewV2() require.NoError(t, err) err = ks.Add(ctx, newKey) require.NoError(t, err) err = ks.Add(ctx, newKey) assert.Error(t, err) keys, err := ks.GetAll() require.NoError(t, err) assert.Equal(t, 1, len(keys)) _, err = ks.Delete(ctx, newKey.ID()) require.NoError(t, err) _, err = ks.Delete(ctx, newKey.ID()) assert.Error(t, err) keys, err = ks.GetAll() require.NoError(t, err) assert.Equal(t, 0, len(keys)) _, err = ks.Get(newKey.ID()) assert.Error(t, err) })` $DIR/core/services/keystore/ocr_test.go: `err = ks.Add(ctx, newKey)` $DIR/core/services/keystore/ocr_test.go: `err = ks.Add(ctx, newKey)` $DIR/core/services/keystore/ocr_test.go: `_, err = ks.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/ocr_test.go: `_, err = ks.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/ocr_test.go: `keys, err = ks.GetAll()` $DIR/core/services/keystore/ocr_test.go: `_, err = ks.Get(newKey.ID())` $DIR/core/services/keystore/ocr_test.go: `t.Run("ensures key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) err := ks.EnsureKey(ctx) require.NoError(t, err) err = ks.EnsureKey(ctx) require.NoError(t, err) keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 1, len(keys)) })` $DIR/core/services/keystore/ocr_test.go: `err = ks.EnsureKey(ctx)` $DIR/core/services/keystore/ocr_test.go: `.NewSqlxDB(t)` $DIR/core/services/keystore/ocr_test.go: `.ExposedNewMaster(t, db)` $DIR/core/services/keystore/ocr_test.go: `.OCR()` $DIR/core/services/keystore/ocr_test.go: `.Background()` $DIR/core/services/keystore/ocr_test.go: `.ResetXXXTestOnly()` $DIR/core/services/keystore/ocr_test.go: `.Run("initializes with an empty state", func(t *testing.T) { defer reset() keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) })` $DIR/core/services/keystore/ocr_test.go: `.GetAll()` $DIR/core/services/keystore/ocr_test.go: `.Run("errors when getting non-existent ID", func(t *testing.T) { defer reset() _, err := ks.Get("non-existent-id") require.Error(t, err) })` $DIR/core/services/keystore/ocr_test.go: `.Get("non-existent-id")` $DIR/core/services/keystore/ocr_test.go: `.Run("creates a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, key, retrievedKey) })` $DIR/core/services/keystore/ocr_test.go: `.Context(t)` $DIR/core/services/keystore/ocr_test.go: `.Create(ctx)` $DIR/core/services/keystore/ocr_test.go: `.Get(key.ID())` $DIR/core/services/keystore/ocr_test.go: `.ID()` $DIR/core/services/keystore/ocr_test.go: `.Run("imports and exports a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) _, err = ks.Export("non-existent", cltest.Password) assert.Error(t, err) exportJSON, err := ks.Export(key.ID(), cltest.Password) require.NoError(t, err) _, err = ks.Delete(ctx, key.ID()) require.NoError(t, err) _, err = ks.Get(key.ID()) require.Error(t, err) importedKey, err := ks.Import(ctx, exportJSON, cltest.Password) require.NoError(t, err) _, err = ks.Import(ctx, []byte(""), cltest.Password) assert.Error(t, err) _, err = ks.Import(ctx, exportJSON, cltest.Password) assert.Error(t, err) assert.Equal(t, key.ID(), importedKey.ID()) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) assert.Equal(t, importedKey, retrievedKey) })` $DIR/core/services/keystore/ocr_test.go: `.Context(t)` $DIR/core/services/keystore/ocr_test.go: `.Create(ctx)` $DIR/core/services/keystore/ocr_test.go: `.Export("non-existent", cltest.Password)` $DIR/core/services/keystore/ocr_test.go: `.Export(key.ID(), cltest.Password)` $DIR/core/services/keystore/ocr_test.go: `.ID()` $DIR/core/services/keystore/ocr_test.go: `.Delete(ctx, key.ID())` $DIR/core/services/keystore/ocr_test.go: `.ID()` $DIR/core/services/keystore/ocr_test.go: `.Get(key.ID())` $DIR/core/services/keystore/ocr_test.go: `.ID()` $DIR/core/services/keystore/ocr_test.go: `.Import(ctx, exportJSON, cltest.Password)` $DIR/core/services/keystore/ocr_test.go: `.Import(ctx, []byte(""), cltest.Password)` $DIR/core/services/keystore/ocr_test.go: `.Import(ctx, exportJSON, cltest.Password)` $DIR/core/services/keystore/ocr_test.go: `.Get(key.ID())` $DIR/core/services/keystore/ocr_test.go: `.ID()` $DIR/core/services/keystore/ocr_test.go: `.Run("adds an externally created key / deletes a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) newKey, err := ocrkey.NewV2() require.NoError(t, err) err = ks.Add(ctx, newKey) require.NoError(t, err) err = ks.Add(ctx, newKey) assert.Error(t, err) keys, err := ks.GetAll() require.NoError(t, err) assert.Equal(t, 1, len(keys)) _, err = ks.Delete(ctx, newKey.ID()) require.NoError(t, err) _, err = ks.Delete(ctx, newKey.ID()) assert.Error(t, err) keys, err = ks.GetAll() require.NoError(t, err) assert.Equal(t, 0, len(keys)) _, err = ks.Get(newKey.ID()) assert.Error(t, err) })` $DIR/core/services/keystore/ocr_test.go: `.Context(t)` $DIR/core/services/keystore/ocr_test.go: `.NewV2()` $DIR/core/services/keystore/ocr_test.go: `.Add(ctx, newKey)` $DIR/core/services/keystore/ocr_test.go: `.Add(ctx, newKey)` $DIR/core/services/keystore/ocr_test.go: `.GetAll()` $DIR/core/services/keystore/ocr_test.go: `.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/ocr_test.go: `.ID()` $DIR/core/services/keystore/ocr_test.go: `.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/ocr_test.go: `.ID()` $DIR/core/services/keystore/ocr_test.go: `.GetAll()` $DIR/core/services/keystore/ocr_test.go: `.Get(newKey.ID())` $DIR/core/services/keystore/ocr_test.go: `.ID()` $DIR/core/services/keystore/ocr_test.go: `.Run("ensures key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) err := ks.EnsureKey(ctx) require.NoError(t, err) err = ks.EnsureKey(ctx) require.NoError(t, err) keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 1, len(keys)) })` $DIR/core/services/keystore/ocr_test.go: `.Context(t)` $DIR/core/services/keystore/ocr_test.go: `.EnsureKey(ctx)` $DIR/core/services/keystore/ocr_test.go: `.EnsureKey(ctx)` $DIR/core/services/keystore/ocr_test.go: `.GetAll()` $DIR/core/services/keystore/ocr_test.go: `.Context(t)` $DIR/core/services/keystore/ocr_test.go: `.Import(ctx, []byte(exportedKey), "p4SsW0rD1!@#_")` $DIR/core/services/keystore/p2p_test.go: `keyStore.ResetXXXTestOnly()` $DIR/core/services/keystore/p2p_test.go: `t.Run("initializes with an empty state", func(t *testing.T) { defer reset() keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) })` $DIR/core/services/keystore/p2p_test.go: `t.Run("errors when getting non-existent ID", func(t *testing.T) { defer reset() var nonExistent p2pkey.PeerID _, err := rand.Read(nonExistent[:]) require.NoError(t, err) _, err = ks.Get(nonExistent) require.Error(t, err) })` $DIR/core/services/keystore/p2p_test.go: `_, err = ks.Get(nonExistent)` $DIR/core/services/keystore/p2p_test.go: `t.Run("creates a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) retrievedKey, err := ks.Get(key.PeerID()) require.NoError(t, err) require.Equal(t, key, retrievedKey) })` $DIR/core/services/keystore/p2p_test.go: `t.Run("imports and exports a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) exportJSON, err := ks.Export(key.PeerID(), cltest.Password) require.NoError(t, err) var nonExistent p2pkey.PeerID _, err = rand.Read(nonExistent[:]) require.NoError(t, err) _, err = ks.Export(nonExistent, cltest.Password) assert.Error(t, err) _, err = ks.Delete(ctx, key.PeerID()) require.NoError(t, err) _, err = ks.Get(key.PeerID()) require.Error(t, err) importedKey, err := ks.Import(ctx, exportJSON, cltest.Password) require.NoError(t, err) _, err = ks.Import(ctx, exportJSON, cltest.Password) assert.Error(t, err) _, err = ks.Import(ctx, []byte(""), cltest.Password) assert.Error(t, err) require.Equal(t, key.PeerID(), importedKey.PeerID()) retrievedKey, err := ks.Get(key.PeerID()) require.NoError(t, err) require.Equal(t, importedKey, retrievedKey) })` $DIR/core/services/keystore/p2p_test.go: `_, err = rand.Read(nonExistent[:])` $DIR/core/services/keystore/p2p_test.go: `_, err = ks.Export(nonExistent, cltest.Password)` $DIR/core/services/keystore/p2p_test.go: `_, err = ks.Delete(ctx, key.PeerID())` $DIR/core/services/keystore/p2p_test.go: `_, err = ks.Get(key.PeerID())` $DIR/core/services/keystore/p2p_test.go: `_, err = ks.Import(ctx, exportJSON, cltest.Password)` $DIR/core/services/keystore/p2p_test.go: `_, err = ks.Import(ctx, []byte(""), cltest.Password)` $DIR/core/services/keystore/p2p_test.go: `t.Run("adds an externally created key / deletes a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) newKey, err := p2pkey.NewV2() require.NoError(t, err) err = ks.Add(ctx, newKey) require.NoError(t, err) err = ks.Add(ctx, newKey) assert.Error(t, err) keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 1, len(keys)) _, err = ks.Delete(ctx, newKey.PeerID()) require.NoError(t, err) _, err = ks.Delete(ctx, newKey.PeerID()) assert.Error(t, err) keys, err = ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) _, err = ks.Get(newKey.PeerID()) require.Error(t, err) })` $DIR/core/services/keystore/p2p_test.go: `err = ks.Add(ctx, newKey)` $DIR/core/services/keystore/p2p_test.go: `err = ks.Add(ctx, newKey)` $DIR/core/services/keystore/p2p_test.go: `_, err = ks.Delete(ctx, newKey.PeerID())` $DIR/core/services/keystore/p2p_test.go: `_, err = ks.Delete(ctx, newKey.PeerID())` $DIR/core/services/keystore/p2p_test.go: `keys, err = ks.GetAll()` $DIR/core/services/keystore/p2p_test.go: `_, err = ks.Get(newKey.PeerID())` $DIR/core/services/keystore/p2p_test.go: `t.Run("ensures key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) err := ks.EnsureKey(ctx) assert.NoError(t, err) keys, err := ks.GetAll() assert.NoError(t, err) require.Equal(t, 1, len(keys)) err = ks.EnsureKey(ctx) assert.NoError(t, err) keys, err = ks.GetAll() assert.NoError(t, err) require.Equal(t, 1, len(keys)) })` $DIR/core/services/keystore/p2p_test.go: `err = ks.EnsureKey(ctx)` $DIR/core/services/keystore/p2p_test.go: `keys, err = ks.GetAll()` $DIR/core/services/keystore/p2p_test.go: `t.Run("GetOrFirst", func(t *testing.T) { defer reset() ctx := testutils.Context(t) _, err := ks.GetOrFirst(p2pkey.PeerID{}) require.Contains(t, err.Error(), "no p2p keys exist") id := p2pkey.PeerID{0xa0} _, err = ks.GetOrFirst(id) require.Contains(t, err.Error(), fmt.Sprintf("unable to find P2P key with id %s", id)) k1, err := ks.Create(ctx) require.NoError(t, err) k2, err := ks.GetOrFirst(p2pkey.PeerID{}) require.NoError(t, err) require.Equal(t, k1, k2) k3, err := ks.GetOrFirst(k1.PeerID()) require.NoError(t, err) require.Equal(t, k1, k3) _, err = ks.Create(ctx) require.NoError(t, err) _, err = ks.GetOrFirst(p2pkey.PeerID{}) require.Contains(t, err.Error(), "multiple p2p keys found") //Check for possible keys in error message require.Contains(t, err.Error(), k1.ID()) require.Contains(t, err.Error(), k2.ID()) require.Contains(t, err.Error(), k3.ID()) k4, err := ks.GetOrFirst(k1.PeerID()) require.NoError(t, err) require.Equal(t, k1, k4) })` $DIR/core/services/keystore/p2p_test.go: `_, err = ks.GetOrFirst(id)` $DIR/core/services/keystore/p2p_test.go: `_, err = ks.Create(ctx)` $DIR/core/services/keystore/p2p_test.go: `_, err = ks.GetOrFirst(p2pkey.PeerID{})` $DIR/core/services/keystore/p2p_test.go: `t.Run("clears p2p_peers on delete", func(t *testing.T) { ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) type P2PPeer struct { ID string Addr string PeerID string CreatedAt time.Time UpdatedAt time.Time } p2pPeer1 := P2PPeer{ ID: cltest.NewPeerID().String(), Addr: testutils.NewAddress().Hex(), PeerID: cltest.DefaultPeerID, // different p2p key } p2pPeer2 := P2PPeer{ ID: cltest.NewPeerID().String(), Addr: testutils.NewAddress().Hex(), PeerID: key.PeerID().Raw(), } const p2pTableName = "p2p_peers" sql := fmt.Sprintf(`INSERT INTO %s (id, addr, peer_id, created_at, updated_at) VALUES (:id, :addr, :peer_id, now(), now()) RETURNING *;`, p2pTableName) stmt, err := db.PrepareNamed(sql) require.NoError(t, err) t.Cleanup(func() { assert.NoError(t, stmt.Close()) }) require.NoError(t, stmt.Get(&p2pPeer1, &p2pPeer1)) require.NoError(t, stmt.Get(&p2pPeer2, &p2pPeer2)) cltest.AssertCount(t, db, p2pTableName, 2) _, err = ks.Delete(ctx, key.PeerID()) require.NoError(t, err) cltest.AssertCount(t, db, p2pTableName, 1) })` $DIR/core/services/keystore/p2p_test.go: `t.Cleanup(func() { assert.NoError(t, stmt.Close()) })` $DIR/core/services/keystore/p2p_test.go: `cltest.AssertCount(t, db, p2pTableName, 2)` $DIR/core/services/keystore/p2p_test.go: `_, err = ks.Delete(ctx, key.PeerID())` $DIR/core/services/keystore/p2p_test.go: `cltest.AssertCount(t, db, p2pTableName, 1)` $DIR/core/services/keystore/p2p_test.go: `.NewSqlxDB(t)` $DIR/core/services/keystore/p2p_test.go: `.ExposedNewMaster(t, db)` $DIR/core/services/keystore/p2p_test.go: `.P2P()` $DIR/core/services/keystore/p2p_test.go: `.Background()` $DIR/core/services/keystore/p2p_test.go: `.ResetXXXTestOnly()` $DIR/core/services/keystore/p2p_test.go: `.Run("initializes with an empty state", func(t *testing.T) { defer reset() keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) })` $DIR/core/services/keystore/p2p_test.go: `.GetAll()` $DIR/core/services/keystore/p2p_test.go: `.Run("errors when getting non-existent ID", func(t *testing.T) { defer reset() var nonExistent p2pkey.PeerID _, err := rand.Read(nonExistent[:]) require.NoError(t, err) _, err = ks.Get(nonExistent) require.Error(t, err) })` $DIR/core/services/keystore/p2p_test.go: `.Read(nonExistent[:])` $DIR/core/services/keystore/p2p_test.go: `.Get(nonExistent)` $DIR/core/services/keystore/p2p_test.go: `.Run("creates a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) retrievedKey, err := ks.Get(key.PeerID()) require.NoError(t, err) require.Equal(t, key, retrievedKey) })` $DIR/core/services/keystore/p2p_test.go: `.Context(t)` $DIR/core/services/keystore/p2p_test.go: `.Create(ctx)` $DIR/core/services/keystore/p2p_test.go: `.Get(key.PeerID())` $DIR/core/services/keystore/p2p_test.go: `.PeerID()` $DIR/core/services/keystore/p2p_test.go: `.Run("imports and exports a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) exportJSON, err := ks.Export(key.PeerID(), cltest.Password) require.NoError(t, err) var nonExistent p2pkey.PeerID _, err = rand.Read(nonExistent[:]) require.NoError(t, err) _, err = ks.Export(nonExistent, cltest.Password) assert.Error(t, err) _, err = ks.Delete(ctx, key.PeerID()) require.NoError(t, err) _, err = ks.Get(key.PeerID()) require.Error(t, err) importedKey, err := ks.Import(ctx, exportJSON, cltest.Password) require.NoError(t, err) _, err = ks.Import(ctx, exportJSON, cltest.Password) assert.Error(t, err) _, err = ks.Import(ctx, []byte(""), cltest.Password) assert.Error(t, err) require.Equal(t, key.PeerID(), importedKey.PeerID()) retrievedKey, err := ks.Get(key.PeerID()) require.NoError(t, err) require.Equal(t, importedKey, retrievedKey) })` $DIR/core/services/keystore/p2p_test.go: `.Context(t)` $DIR/core/services/keystore/p2p_test.go: `.Create(ctx)` $DIR/core/services/keystore/p2p_test.go: `.Export(key.PeerID(), cltest.Password)` $DIR/core/services/keystore/p2p_test.go: `.PeerID()` $DIR/core/services/keystore/p2p_test.go: `.Read(nonExistent[:])` $DIR/core/services/keystore/p2p_test.go: `.Export(nonExistent, cltest.Password)` $DIR/core/services/keystore/p2p_test.go: `.Delete(ctx, key.PeerID())` $DIR/core/services/keystore/p2p_test.go: `.PeerID()` $DIR/core/services/keystore/p2p_test.go: `.Get(key.PeerID())` $DIR/core/services/keystore/p2p_test.go: `.PeerID()` $DIR/core/services/keystore/p2p_test.go: `.Import(ctx, exportJSON, cltest.Password)` $DIR/core/services/keystore/p2p_test.go: `.Import(ctx, exportJSON, cltest.Password)` $DIR/core/services/keystore/p2p_test.go: `.Import(ctx, []byte(""), cltest.Password)` $DIR/core/services/keystore/p2p_test.go: `.Get(key.PeerID())` $DIR/core/services/keystore/p2p_test.go: `.PeerID()` $DIR/core/services/keystore/p2p_test.go: `.Run("adds an externally created key / deletes a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) newKey, err := p2pkey.NewV2() require.NoError(t, err) err = ks.Add(ctx, newKey) require.NoError(t, err) err = ks.Add(ctx, newKey) assert.Error(t, err) keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 1, len(keys)) _, err = ks.Delete(ctx, newKey.PeerID()) require.NoError(t, err) _, err = ks.Delete(ctx, newKey.PeerID()) assert.Error(t, err) keys, err = ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) _, err = ks.Get(newKey.PeerID()) require.Error(t, err) })` $DIR/core/services/keystore/p2p_test.go: `.Context(t)` $DIR/core/services/keystore/p2p_test.go: `.NewV2()` $DIR/core/services/keystore/p2p_test.go: `.Add(ctx, newKey)` $DIR/core/services/keystore/p2p_test.go: `.Add(ctx, newKey)` $DIR/core/services/keystore/p2p_test.go: `.GetAll()` $DIR/core/services/keystore/p2p_test.go: `.Delete(ctx, newKey.PeerID())` $DIR/core/services/keystore/p2p_test.go: `.PeerID()` $DIR/core/services/keystore/p2p_test.go: `.Delete(ctx, newKey.PeerID())` $DIR/core/services/keystore/p2p_test.go: `.PeerID()` $DIR/core/services/keystore/p2p_test.go: `.GetAll()` $DIR/core/services/keystore/p2p_test.go: `.Get(newKey.PeerID())` $DIR/core/services/keystore/p2p_test.go: `.PeerID()` $DIR/core/services/keystore/p2p_test.go: `.Run("ensures key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) err := ks.EnsureKey(ctx) assert.NoError(t, err) keys, err := ks.GetAll() assert.NoError(t, err) require.Equal(t, 1, len(keys)) err = ks.EnsureKey(ctx) assert.NoError(t, err) keys, err = ks.GetAll() assert.NoError(t, err) require.Equal(t, 1, len(keys)) })` $DIR/core/services/keystore/p2p_test.go: `.Context(t)` $DIR/core/services/keystore/p2p_test.go: `.EnsureKey(ctx)` $DIR/core/services/keystore/p2p_test.go: `.GetAll()` $DIR/core/services/keystore/p2p_test.go: `.EnsureKey(ctx)` $DIR/core/services/keystore/p2p_test.go: `.GetAll()` $DIR/core/services/keystore/p2p_test.go: `.Run("GetOrFirst", func(t *testing.T) { defer reset() ctx := testutils.Context(t) _, err := ks.GetOrFirst(p2pkey.PeerID{}) require.Contains(t, err.Error(), "no p2p keys exist") id := p2pkey.PeerID{0xa0} _, err = ks.GetOrFirst(id) require.Contains(t, err.Error(), fmt.Sprintf("unable to find P2P key with id %s", id)) k1, err := ks.Create(ctx) require.NoError(t, err) k2, err := ks.GetOrFirst(p2pkey.PeerID{}) require.NoError(t, err) require.Equal(t, k1, k2) k3, err := ks.GetOrFirst(k1.PeerID()) require.NoError(t, err) require.Equal(t, k1, k3) _, err = ks.Create(ctx) require.NoError(t, err) _, err = ks.GetOrFirst(p2pkey.PeerID{}) require.Contains(t, err.Error(), "multiple p2p keys found") //Check for possible keys in error message require.Contains(t, err.Error(), k1.ID()) require.Contains(t, err.Error(), k2.ID()) require.Contains(t, err.Error(), k3.ID()) k4, err := ks.GetOrFirst(k1.PeerID()) require.NoError(t, err) require.Equal(t, k1, k4) })` $DIR/core/services/keystore/p2p_test.go: `.Context(t)` $DIR/core/services/keystore/p2p_test.go: `.GetOrFirst(p2pkey.PeerID{})` $DIR/core/services/keystore/p2p_test.go: `.GetOrFirst(id)` $DIR/core/services/keystore/p2p_test.go: `.Create(ctx)` $DIR/core/services/keystore/p2p_test.go: `.GetOrFirst(p2pkey.PeerID{})` $DIR/core/services/keystore/p2p_test.go: `.GetOrFirst(k1.PeerID())` $DIR/core/services/keystore/p2p_test.go: `.PeerID()` $DIR/core/services/keystore/p2p_test.go: `.Create(ctx)` $DIR/core/services/keystore/p2p_test.go: `.GetOrFirst(p2pkey.PeerID{})` $DIR/core/services/keystore/p2p_test.go: `.GetOrFirst(k1.PeerID())` $DIR/core/services/keystore/p2p_test.go: `.PeerID()` $DIR/core/services/keystore/p2p_test.go: `.Run("clears p2p_peers on delete", func(t *testing.T) { ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) type P2PPeer struct { ID string Addr string PeerID string CreatedAt time.Time UpdatedAt time.Time } p2pPeer1 := P2PPeer{ ID: cltest.NewPeerID().String(), Addr: testutils.NewAddress().Hex(), PeerID: cltest.DefaultPeerID, // different p2p key } p2pPeer2 := P2PPeer{ ID: cltest.NewPeerID().String(), Addr: testutils.NewAddress().Hex(), PeerID: key.PeerID().Raw(), } const p2pTableName = "p2p_peers" sql := fmt.Sprintf(`INSERT INTO %s (id, addr, peer_id, created_at, updated_at) VALUES (:id, :addr, :peer_id, now(), now()) RETURNING *;`, p2pTableName) stmt, err := db.PrepareNamed(sql) require.NoError(t, err) t.Cleanup(func() { assert.NoError(t, stmt.Close()) }) require.NoError(t, stmt.Get(&p2pPeer1, &p2pPeer1)) require.NoError(t, stmt.Get(&p2pPeer2, &p2pPeer2)) cltest.AssertCount(t, db, p2pTableName, 2) _, err = ks.Delete(ctx, key.PeerID()) require.NoError(t, err) cltest.AssertCount(t, db, p2pTableName, 1) })` $DIR/core/services/keystore/p2p_test.go: `.Context(t)` $DIR/core/services/keystore/p2p_test.go: `.Create(ctx)` $DIR/core/services/keystore/p2p_test.go: `.NewPeerID()` $DIR/core/services/keystore/p2p_test.go: `.String()` $DIR/core/services/keystore/p2p_test.go: `.NewAddress()` $DIR/core/services/keystore/p2p_test.go: `.Hex()` $DIR/core/services/keystore/p2p_test.go: `.NewPeerID()` $DIR/core/services/keystore/p2p_test.go: `.String()` $DIR/core/services/keystore/p2p_test.go: `.NewAddress()` $DIR/core/services/keystore/p2p_test.go: `.Hex()` $DIR/core/services/keystore/p2p_test.go: `.PeerID()` $DIR/core/services/keystore/p2p_test.go: `.Raw()` $DIR/core/services/keystore/p2p_test.go: `.Sprintf(`INSERT INTO %s (id, addr, peer_id, created_at, updated_at) VALUES (:id, :addr, :peer_id, now(), now()) RETURNING *;`, p2pTableName)` $DIR/core/services/keystore/p2p_test.go: `.PrepareNamed(sql)` $DIR/core/services/keystore/p2p_test.go: `.Cleanup(func() { assert.NoError(t, stmt.Close()) })` $DIR/core/services/keystore/p2p_test.go: `.AssertCount(t, db, p2pTableName, 2)` $DIR/core/services/keystore/p2p_test.go: `.Delete(ctx, key.PeerID())` $DIR/core/services/keystore/p2p_test.go: `.PeerID()` $DIR/core/services/keystore/p2p_test.go: `.AssertCount(t, db, p2pTableName, 1)` $DIR/core/services/keystore/p2p_test.go: `.Context(t)` $DIR/core/services/keystore/p2p_test.go: `.Import(ctx, []byte(exportedKey), "p4SsW0rD1!@#_")` $DIR/core/services/keystore/solana_test.go: `keyStore.ResetXXXTestOnly()` $DIR/core/services/keystore/solana_test.go: `t.Run("initializes with an empty state", func(t *testing.T) { defer reset() keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) })` $DIR/core/services/keystore/solana_test.go: `t.Run("errors when getting non-existent ID", func(t *testing.T) { defer reset() _, err := ks.Get("non-existent-id") require.Error(t, err) })` $DIR/core/services/keystore/solana_test.go: `t.Run("creates a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, key, retrievedKey) })` $DIR/core/services/keystore/solana_test.go: `t.Run("imports and exports a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) exportJSON, err := ks.Export(key.ID(), cltest.Password) require.NoError(t, err) _, err = ks.Export("non-existent", cltest.Password) assert.Error(t, err) _, err = ks.Delete(ctx, key.ID()) require.NoError(t, err) _, err = ks.Get(key.ID()) require.Error(t, err) importedKey, err := ks.Import(ctx, exportJSON, cltest.Password) require.NoError(t, err) _, err = ks.Import(ctx, exportJSON, cltest.Password) assert.Error(t, err) _, err = ks.Import(ctx, []byte(""), cltest.Password) assert.Error(t, err) require.Equal(t, key.ID(), importedKey.ID()) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, importedKey, retrievedKey) })` $DIR/core/services/keystore/solana_test.go: `_, err = ks.Export("non-existent", cltest.Password)` $DIR/core/services/keystore/solana_test.go: `_, err = ks.Delete(ctx, key.ID())` $DIR/core/services/keystore/solana_test.go: `_, err = ks.Get(key.ID())` $DIR/core/services/keystore/solana_test.go: `_, err = ks.Import(ctx, exportJSON, cltest.Password)` $DIR/core/services/keystore/solana_test.go: `_, err = ks.Import(ctx, []byte(""), cltest.Password)` $DIR/core/services/keystore/solana_test.go: `t.Run("adds an externally created key / deletes a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) newKey, err := solkey.New() require.NoError(t, err) err = ks.Add(ctx, newKey) require.NoError(t, err) err = ks.Add(ctx, newKey) assert.Error(t, err) keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 1, len(keys)) _, err = ks.Delete(ctx, newKey.ID()) require.NoError(t, err) _, err = ks.Delete(ctx, newKey.ID()) assert.Error(t, err) keys, err = ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) _, err = ks.Get(newKey.ID()) require.Error(t, err) })` $DIR/core/services/keystore/solana_test.go: `err = ks.Add(ctx, newKey)` $DIR/core/services/keystore/solana_test.go: `err = ks.Add(ctx, newKey)` $DIR/core/services/keystore/solana_test.go: `_, err = ks.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/solana_test.go: `_, err = ks.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/solana_test.go: `keys, err = ks.GetAll()` $DIR/core/services/keystore/solana_test.go: `_, err = ks.Get(newKey.ID())` $DIR/core/services/keystore/solana_test.go: `t.Run("ensures key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) err := ks.EnsureKey(ctx) assert.NoError(t, err) err = ks.EnsureKey(ctx) assert.NoError(t, err) keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 1, len(keys)) })` $DIR/core/services/keystore/solana_test.go: `err = ks.EnsureKey(ctx)` $DIR/core/services/keystore/solana_test.go: `_, err = ks.Sign(testutils.Context(t), "not-real", nil)` $DIR/core/services/keystore/solana_test.go: `.NewSqlxDB(t)` $DIR/core/services/keystore/solana_test.go: `.ExposedNewMaster(t, db)` $DIR/core/services/keystore/solana_test.go: `.Solana()` $DIR/core/services/keystore/solana_test.go: `.Background()` $DIR/core/services/keystore/solana_test.go: `.ResetXXXTestOnly()` $DIR/core/services/keystore/solana_test.go: `.Run("initializes with an empty state", func(t *testing.T) { defer reset() keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) })` $DIR/core/services/keystore/solana_test.go: `.GetAll()` $DIR/core/services/keystore/solana_test.go: `.Run("errors when getting non-existent ID", func(t *testing.T) { defer reset() _, err := ks.Get("non-existent-id") require.Error(t, err) })` $DIR/core/services/keystore/solana_test.go: `.Get("non-existent-id")` $DIR/core/services/keystore/solana_test.go: `.Run("creates a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, key, retrievedKey) })` $DIR/core/services/keystore/solana_test.go: `.Context(t)` $DIR/core/services/keystore/solana_test.go: `.Create(ctx)` $DIR/core/services/keystore/solana_test.go: `.Get(key.ID())` $DIR/core/services/keystore/solana_test.go: `.ID()` $DIR/core/services/keystore/solana_test.go: `.Run("imports and exports a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) exportJSON, err := ks.Export(key.ID(), cltest.Password) require.NoError(t, err) _, err = ks.Export("non-existent", cltest.Password) assert.Error(t, err) _, err = ks.Delete(ctx, key.ID()) require.NoError(t, err) _, err = ks.Get(key.ID()) require.Error(t, err) importedKey, err := ks.Import(ctx, exportJSON, cltest.Password) require.NoError(t, err) _, err = ks.Import(ctx, exportJSON, cltest.Password) assert.Error(t, err) _, err = ks.Import(ctx, []byte(""), cltest.Password) assert.Error(t, err) require.Equal(t, key.ID(), importedKey.ID()) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, importedKey, retrievedKey) })` $DIR/core/services/keystore/solana_test.go: `.Context(t)` $DIR/core/services/keystore/solana_test.go: `.Create(ctx)` $DIR/core/services/keystore/solana_test.go: `.Export(key.ID(), cltest.Password)` $DIR/core/services/keystore/solana_test.go: `.ID()` $DIR/core/services/keystore/solana_test.go: `.Export("non-existent", cltest.Password)` $DIR/core/services/keystore/solana_test.go: `.Delete(ctx, key.ID())` $DIR/core/services/keystore/solana_test.go: `.ID()` $DIR/core/services/keystore/solana_test.go: `.Get(key.ID())` $DIR/core/services/keystore/solana_test.go: `.ID()` $DIR/core/services/keystore/solana_test.go: `.Import(ctx, exportJSON, cltest.Password)` $DIR/core/services/keystore/solana_test.go: `.Import(ctx, exportJSON, cltest.Password)` $DIR/core/services/keystore/solana_test.go: `.Import(ctx, []byte(""), cltest.Password)` $DIR/core/services/keystore/solana_test.go: `.Get(key.ID())` $DIR/core/services/keystore/solana_test.go: `.ID()` $DIR/core/services/keystore/solana_test.go: `.Run("adds an externally created key / deletes a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) newKey, err := solkey.New() require.NoError(t, err) err = ks.Add(ctx, newKey) require.NoError(t, err) err = ks.Add(ctx, newKey) assert.Error(t, err) keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 1, len(keys)) _, err = ks.Delete(ctx, newKey.ID()) require.NoError(t, err) _, err = ks.Delete(ctx, newKey.ID()) assert.Error(t, err) keys, err = ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) _, err = ks.Get(newKey.ID()) require.Error(t, err) })` $DIR/core/services/keystore/solana_test.go: `.Context(t)` $DIR/core/services/keystore/solana_test.go: `.New()` $DIR/core/services/keystore/solana_test.go: `.Add(ctx, newKey)` $DIR/core/services/keystore/solana_test.go: `.Add(ctx, newKey)` $DIR/core/services/keystore/solana_test.go: `.GetAll()` $DIR/core/services/keystore/solana_test.go: `.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/solana_test.go: `.ID()` $DIR/core/services/keystore/solana_test.go: `.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/solana_test.go: `.ID()` $DIR/core/services/keystore/solana_test.go: `.GetAll()` $DIR/core/services/keystore/solana_test.go: `.Get(newKey.ID())` $DIR/core/services/keystore/solana_test.go: `.ID()` $DIR/core/services/keystore/solana_test.go: `.Run("ensures key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) err := ks.EnsureKey(ctx) assert.NoError(t, err) err = ks.EnsureKey(ctx) assert.NoError(t, err) keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 1, len(keys)) })` $DIR/core/services/keystore/solana_test.go: `.Context(t)` $DIR/core/services/keystore/solana_test.go: `.EnsureKey(ctx)` $DIR/core/services/keystore/solana_test.go: `.EnsureKey(ctx)` $DIR/core/services/keystore/solana_test.go: `.GetAll()` $DIR/core/services/keystore/solana_test.go: `.Context(t)` $DIR/core/services/keystore/solana_test.go: `.New()` $DIR/core/services/keystore/solana_test.go: `.Sign(testutils.Context(t), "not-real", nil)` $DIR/core/services/keystore/solana_test.go: `.Context(t)` $DIR/core/services/keystore/solana_test.go: `.Sign(testutils.Context(t), newKey.ID(), payload)` $DIR/core/services/keystore/solana_test.go: `.Context(t)` $DIR/core/services/keystore/solana_test.go: `.ID()` $DIR/core/services/keystore/solana_test.go: `.Sign(payload)` $DIR/core/services/keystore/starknet_test.go: `keyStore.ResetXXXTestOnly()` $DIR/core/services/keystore/starknet_test.go: `t.Run("initializes with an empty state", func(t *testing.T) { defer reset() keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) })` $DIR/core/services/keystore/starknet_test.go: `t.Run("errors when getting non-existent ID", func(t *testing.T) { defer reset() _, err := ks.Get("non-existent-id") require.Error(t, err) })` $DIR/core/services/keystore/starknet_test.go: `t.Run("creates a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, key, retrievedKey) })` $DIR/core/services/keystore/starknet_test.go: `t.Run("imports and exports a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) exportJSON, err := ks.Export(key.ID(), cltest.Password) require.NoError(t, err) _, err = ks.Delete(ctx, key.ID()) require.NoError(t, err) _, err = ks.Get(key.ID()) require.Error(t, err) importedKey, err := ks.Import(ctx, exportJSON, cltest.Password) require.NoError(t, err) require.Equal(t, key.ID(), importedKey.ID()) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, importedKey, retrievedKey) })` $DIR/core/services/keystore/starknet_test.go: `_, err = ks.Delete(ctx, key.ID())` $DIR/core/services/keystore/starknet_test.go: `_, err = ks.Get(key.ID())` $DIR/core/services/keystore/starknet_test.go: `t.Run("adds an externally created key / deletes a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) newKey, err := starkkey.New() require.NoError(t, err) err = ks.Add(ctx, newKey) require.NoError(t, err) keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 1, len(keys)) _, err = ks.Delete(ctx, newKey.ID()) require.NoError(t, err) keys, err = ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) _, err = ks.Get(newKey.ID()) require.Error(t, err) })` $DIR/core/services/keystore/starknet_test.go: `err = ks.Add(ctx, newKey)` $DIR/core/services/keystore/starknet_test.go: `_, err = ks.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/starknet_test.go: `keys, err = ks.GetAll()` $DIR/core/services/keystore/starknet_test.go: `_, err = ks.Get(newKey.ID())` $DIR/core/services/keystore/starknet_test.go: `err = ks.EnsureKey(ctx)` $DIR/core/services/keystore/starknet_test.go: `t.Run("key exists", func(t *testing.T) { baseKs.On("Get", starknetSenderAddr).Return(starkKey, nil) signed, err := lk.Sign(testutils.Context(t), starknetSenderAddr, nil) require.Nil(t, signed) require.NoError(t, err) })` $DIR/core/services/keystore/starknet_test.go: `baseKs.On("Get", starknetSenderAddr).Return(starkKey, nil)` $DIR/core/services/keystore/starknet_test.go: `t.Run("key doesn't exists", func(t *testing.T) { baseKs.On("Get", mock.Anything).Return(starkkey.Key{}, fmt.Errorf("key doesn't exist")) signed, err := lk.Sign(testutils.Context(t), "not an address", nil) require.Nil(t, signed) require.Error(t, err) })` $DIR/core/services/keystore/starknet_test.go: `baseKs.On("Get", mock.Anything).Return(starkkey.Key{}, fmt.Errorf("key doesn't exist"))` $DIR/core/services/keystore/starknet_test.go: `baseKs.On("Get", starknetSenderAddr).Return(starkKey, nil)` $DIR/core/services/keystore/starknet_test.go: `.NewSqlxDB(t)` $DIR/core/services/keystore/starknet_test.go: `.ExposedNewMaster(t, db)` $DIR/core/services/keystore/starknet_test.go: `.StarkNet()` $DIR/core/services/keystore/starknet_test.go: `.Background()` $DIR/core/services/keystore/starknet_test.go: `.ResetXXXTestOnly()` $DIR/core/services/keystore/starknet_test.go: `.Run("initializes with an empty state", func(t *testing.T) { defer reset() keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) })` $DIR/core/services/keystore/starknet_test.go: `.GetAll()` $DIR/core/services/keystore/starknet_test.go: `.Run("errors when getting non-existent ID", func(t *testing.T) { defer reset() _, err := ks.Get("non-existent-id") require.Error(t, err) })` $DIR/core/services/keystore/starknet_test.go: `.Get("non-existent-id")` $DIR/core/services/keystore/starknet_test.go: `.Run("creates a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, key, retrievedKey) })` $DIR/core/services/keystore/starknet_test.go: `.Context(t)` $DIR/core/services/keystore/starknet_test.go: `.Create(ctx)` $DIR/core/services/keystore/starknet_test.go: `.Get(key.ID())` $DIR/core/services/keystore/starknet_test.go: `.ID()` $DIR/core/services/keystore/starknet_test.go: `.Run("imports and exports a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) exportJSON, err := ks.Export(key.ID(), cltest.Password) require.NoError(t, err) _, err = ks.Delete(ctx, key.ID()) require.NoError(t, err) _, err = ks.Get(key.ID()) require.Error(t, err) importedKey, err := ks.Import(ctx, exportJSON, cltest.Password) require.NoError(t, err) require.Equal(t, key.ID(), importedKey.ID()) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, importedKey, retrievedKey) })` $DIR/core/services/keystore/starknet_test.go: `.Context(t)` $DIR/core/services/keystore/starknet_test.go: `.Create(ctx)` $DIR/core/services/keystore/starknet_test.go: `.Export(key.ID(), cltest.Password)` $DIR/core/services/keystore/starknet_test.go: `.ID()` $DIR/core/services/keystore/starknet_test.go: `.Delete(ctx, key.ID())` $DIR/core/services/keystore/starknet_test.go: `.ID()` $DIR/core/services/keystore/starknet_test.go: `.Get(key.ID())` $DIR/core/services/keystore/starknet_test.go: `.ID()` $DIR/core/services/keystore/starknet_test.go: `.Import(ctx, exportJSON, cltest.Password)` $DIR/core/services/keystore/starknet_test.go: `.Get(key.ID())` $DIR/core/services/keystore/starknet_test.go: `.ID()` $DIR/core/services/keystore/starknet_test.go: `.Run("adds an externally created key / deletes a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) newKey, err := starkkey.New() require.NoError(t, err) err = ks.Add(ctx, newKey) require.NoError(t, err) keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 1, len(keys)) _, err = ks.Delete(ctx, newKey.ID()) require.NoError(t, err) keys, err = ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) _, err = ks.Get(newKey.ID()) require.Error(t, err) })` $DIR/core/services/keystore/starknet_test.go: `.Context(t)` $DIR/core/services/keystore/starknet_test.go: `.New()` $DIR/core/services/keystore/starknet_test.go: `.Add(ctx, newKey)` $DIR/core/services/keystore/starknet_test.go: `.GetAll()` $DIR/core/services/keystore/starknet_test.go: `.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/starknet_test.go: `.ID()` $DIR/core/services/keystore/starknet_test.go: `.GetAll()` $DIR/core/services/keystore/starknet_test.go: `.Get(newKey.ID())` $DIR/core/services/keystore/starknet_test.go: `.ID()` $DIR/core/services/keystore/starknet_test.go: `.Context(t)` $DIR/core/services/keystore/starknet_test.go: `.EnsureKey(ctx)` $DIR/core/services/keystore/starknet_test.go: `.EnsureKey(ctx)` $DIR/core/services/keystore/starknet_test.go: `.GetAll()` $DIR/core/services/keystore/starknet_test.go: `.NewStarkNet(t)` $DIR/core/services/keystore/starknet_test.go: `.New()` $DIR/core/services/keystore/starknet_test.go: `.Run("key exists", func(t *testing.T) { baseKs.On("Get", starknetSenderAddr).Return(starkKey, nil) signed, err := lk.Sign(testutils.Context(t), starknetSenderAddr, nil) require.Nil(t, signed) require.NoError(t, err) })` $DIR/core/services/keystore/starknet_test.go: `.On("Get", starknetSenderAddr)` $DIR/core/services/keystore/starknet_test.go: `.Return(starkKey, nil)` $DIR/core/services/keystore/starknet_test.go: `.Sign(testutils.Context(t), starknetSenderAddr, nil)` $DIR/core/services/keystore/starknet_test.go: `.Context(t)` $DIR/core/services/keystore/starknet_test.go: `.Run("key doesn't exists", func(t *testing.T) { baseKs.On("Get", mock.Anything).Return(starkkey.Key{}, fmt.Errorf("key doesn't exist")) signed, err := lk.Sign(testutils.Context(t), "not an address", nil) require.Nil(t, signed) require.Error(t, err) })` $DIR/core/services/keystore/starknet_test.go: `.On("Get", mock.Anything)` $DIR/core/services/keystore/starknet_test.go: `.Return(starkkey.Key{}, fmt.Errorf("key doesn't exist"))` $DIR/core/services/keystore/starknet_test.go: `.Sign(testutils.Context(t), "not an address", nil)` $DIR/core/services/keystore/starknet_test.go: `.Context(t)` $DIR/core/services/keystore/starknet_test.go: `.NewKeystoreAdapter(lk)` $DIR/core/services/keystore/starknet_test.go: `.On("Get", starknetSenderAddr)` $DIR/core/services/keystore/starknet_test.go: `.Return(starkKey, nil)` $DIR/core/services/keystore/starknet_test.go: `.Curve.PedersenHash([]*big.Int{big.NewInt(42)})` $DIR/core/services/keystore/starknet_test.go: `.NewInt(42)` $DIR/core/services/keystore/starknet_test.go: `.Sign(testutils.Context(t), starknetSenderAddr, hash)` $DIR/core/services/keystore/starknet_test.go: `.Context(t)` $DIR/core/services/keystore/starknet_test.go: `.Curve.PrivateToPoint(starkKey.ToPrivKey())` $DIR/core/services/keystore/starknet_test.go: `.ToPrivKey()` $DIR/core/services/keystore/vrf_test.go: `keyStore.ResetXXXTestOnly()` $DIR/core/services/keystore/vrf_test.go: `t.Run("initializes with an empty state", func(t *testing.T) { defer reset() keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) })` $DIR/core/services/keystore/vrf_test.go: `t.Run("errors when getting non-existent ID", func(t *testing.T) { defer reset() _, err := ks.Get("non-existent-id") require.Error(t, err) })` $DIR/core/services/keystore/vrf_test.go: `t.Run("creates a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, key, retrievedKey) })` $DIR/core/services/keystore/vrf_test.go: `t.Run("imports and exports a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) exportJSON, err := ks.Export(key.ID(), cltest.Password) require.NoError(t, err) _, err = ks.Delete(ctx, key.ID()) require.NoError(t, err) _, err = ks.Get(key.ID()) require.Error(t, err) importedKey, err := ks.Import(ctx, exportJSON, cltest.Password) require.NoError(t, err) require.Equal(t, key.ID(), importedKey.ID()) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, importedKey, retrievedKey) })` $DIR/core/services/keystore/vrf_test.go: `_, err = ks.Delete(ctx, key.ID())` $DIR/core/services/keystore/vrf_test.go: `_, err = ks.Get(key.ID())` $DIR/core/services/keystore/vrf_test.go: `t.Run("adds an externally created key / deletes a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) newKey, err := vrfkey.NewV2() require.NoError(t, err) err = ks.Add(ctx, newKey) require.NoError(t, err) keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 1, len(keys)) _, err = ks.Delete(ctx, newKey.ID()) require.NoError(t, err) keys, err = ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) _, err = ks.Get(newKey.ID()) require.Error(t, err) })` $DIR/core/services/keystore/vrf_test.go: `err = ks.Add(ctx, newKey)` $DIR/core/services/keystore/vrf_test.go: `_, err = ks.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/vrf_test.go: `keys, err = ks.GetAll()` $DIR/core/services/keystore/vrf_test.go: `_, err = ks.Get(newKey.ID())` $DIR/core/services/keystore/vrf_test.go: `t.Run("fails to add an already added key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) k, err := vrfkey.NewV2() require.NoError(t, err) err = ks.Add(ctx, k) require.NoError(t, err) err = ks.Add(ctx, k) assert.Error(t, err) assert.Equal(t, fmt.Sprintf("key with ID %s already exists", k.ID()), err.Error()) })` $DIR/core/services/keystore/vrf_test.go: `err = ks.Add(ctx, k)` $DIR/core/services/keystore/vrf_test.go: `err = ks.Add(ctx, k)` $DIR/core/services/keystore/vrf_test.go: `t.Run("fails to delete a key that doesn't exists", func(t *testing.T) { defer reset() ctx := testutils.Context(t) k, err := vrfkey.NewV2() require.NoError(t, err) err = ks.Add(ctx, k) require.NoError(t, err) fk, err := ks.Delete(ctx, "non-existent") assert.Zero(t, fk) assert.Error(t, err) })` $DIR/core/services/keystore/vrf_test.go: `err = ks.Add(ctx, k)` $DIR/core/services/keystore/vrf_test.go: `t.Run("imports a key exported from a v1 keystore", func(t *testing.T) { defer reset() ctx := testutils.Context(t) exportedKey := `{"PublicKey":"0xd2377bc6be8a2c5ce163e1867ee42ef111e320686f940a98e52e9c019ca0606800","vrf_key":{"address":"b94276ad4e5452732ec0cccf30ef7919b67844b6","crypto":{"cipher":"aes-128-ctr","ciphertext":"ff66d61d02dba54a61bab1ceb8414643f9e76b7351785d2959e2c8b50ee69a92","cipherparams":{"iv":"75705da271b11e330a27b8d593a3930c"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"efe5b372e4fe79d0af576a79d65a1ee35d0792d9c92b70107b5ada1817ea7c7b"},"mac":"e4d0bb08ffd004ab03aeaa42367acbd9bb814c6cfd981f5157503f54c30816e7"},"version":3}}` importedKey, err := ks.Import(ctx, []byte(exportedKey), "p4SsW0rD1!@#_") require.NoError(t, err) require.Equal(t, "0xd2377bc6be8a2c5ce163e1867ee42ef111e320686f940a98e52e9c019ca0606800", importedKey.ID()) })` $DIR/core/services/keystore/vrf_test.go: `t.Run("fails to import an already imported key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) exportedKey := `{"PublicKey":"0xd2377bc6be8a2c5ce163e1867ee42ef111e320686f940a98e52e9c019ca0606800","vrf_key":{"address":"b94276ad4e5452732ec0cccf30ef7919b67844b6","crypto":{"cipher":"aes-128-ctr","ciphertext":"ff66d61d02dba54a61bab1ceb8414643f9e76b7351785d2959e2c8b50ee69a92","cipherparams":{"iv":"75705da271b11e330a27b8d593a3930c"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"efe5b372e4fe79d0af576a79d65a1ee35d0792d9c92b70107b5ada1817ea7c7b"},"mac":"e4d0bb08ffd004ab03aeaa42367acbd9bb814c6cfd981f5157503f54c30816e7"},"version":3}}` importedKey, err := ks.Import(ctx, []byte(exportedKey), "p4SsW0rD1!@#_") require.NoError(t, err) keyStore.SetPassword("p4SsW0rD1!@#_") k, err := ks.Import(ctx, []byte(exportedKey), "p4SsW0rD1!@#_") assert.Zero(t, k) assert.Error(t, err) assert.Equal(t, fmt.Sprintf("key with ID %s already exists", importedKey.ID()), err.Error()) })` $DIR/core/services/keystore/vrf_test.go: `keyStore.SetPassword("p4SsW0rD1!@#_")` $DIR/core/services/keystore/vrf_test.go: `t.Run("fails to export non-existent key", func(t *testing.T) { k, err := ks.Export("non-existent", cltest.Password) assert.Zero(t, k) assert.Error(t, err) })` $DIR/core/services/keystore/vrf_test.go: `t.Run("fails to generate proof for non-existent key", func(t *testing.T) { pf, err := ks.GenerateProof("non-existent", big.NewInt(int64(1))) assert.Zero(t, pf) assert.Error(t, err) })` $DIR/core/services/keystore/vrf_test.go: `t.Run("generates a proof for a key", func(t *testing.T) { ctx := testutils.Context(t) k, err := vrfkey.NewV2() require.NoError(t, err) err = ks.Add(ctx, k) require.NoError(t, err) pf, err := ks.GenerateProof(k.ID(), big.NewInt(int64(1))) require.NoError(t, err) assert.NotZero(t, pf) })` $DIR/core/services/keystore/vrf_test.go: `err = ks.Add(ctx, k)` $DIR/core/services/keystore/vrf_test.go: `.NewSqlxDB(t)` $DIR/core/services/keystore/vrf_test.go: `.ExposedNewMaster(t, db)` $DIR/core/services/keystore/vrf_test.go: `.VRF()` $DIR/core/services/keystore/vrf_test.go: `.Background()` $DIR/core/services/keystore/vrf_test.go: `.ResetXXXTestOnly()` $DIR/core/services/keystore/vrf_test.go: `.Run("initializes with an empty state", func(t *testing.T) { defer reset() keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) })` $DIR/core/services/keystore/vrf_test.go: `.GetAll()` $DIR/core/services/keystore/vrf_test.go: `.Run("errors when getting non-existent ID", func(t *testing.T) { defer reset() _, err := ks.Get("non-existent-id") require.Error(t, err) })` $DIR/core/services/keystore/vrf_test.go: `.Get("non-existent-id")` $DIR/core/services/keystore/vrf_test.go: `.Run("creates a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, key, retrievedKey) })` $DIR/core/services/keystore/vrf_test.go: `.Context(t)` $DIR/core/services/keystore/vrf_test.go: `.Create(ctx)` $DIR/core/services/keystore/vrf_test.go: `.Get(key.ID())` $DIR/core/services/keystore/vrf_test.go: `.ID()` $DIR/core/services/keystore/vrf_test.go: `.Run("imports and exports a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) key, err := ks.Create(ctx) require.NoError(t, err) exportJSON, err := ks.Export(key.ID(), cltest.Password) require.NoError(t, err) _, err = ks.Delete(ctx, key.ID()) require.NoError(t, err) _, err = ks.Get(key.ID()) require.Error(t, err) importedKey, err := ks.Import(ctx, exportJSON, cltest.Password) require.NoError(t, err) require.Equal(t, key.ID(), importedKey.ID()) retrievedKey, err := ks.Get(key.ID()) require.NoError(t, err) require.Equal(t, importedKey, retrievedKey) })` $DIR/core/services/keystore/vrf_test.go: `.Context(t)` $DIR/core/services/keystore/vrf_test.go: `.Create(ctx)` $DIR/core/services/keystore/vrf_test.go: `.Export(key.ID(), cltest.Password)` $DIR/core/services/keystore/vrf_test.go: `.ID()` $DIR/core/services/keystore/vrf_test.go: `.Delete(ctx, key.ID())` $DIR/core/services/keystore/vrf_test.go: `.ID()` $DIR/core/services/keystore/vrf_test.go: `.Get(key.ID())` $DIR/core/services/keystore/vrf_test.go: `.ID()` $DIR/core/services/keystore/vrf_test.go: `.Import(ctx, exportJSON, cltest.Password)` $DIR/core/services/keystore/vrf_test.go: `.Get(key.ID())` $DIR/core/services/keystore/vrf_test.go: `.ID()` $DIR/core/services/keystore/vrf_test.go: `.Run("adds an externally created key / deletes a key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) newKey, err := vrfkey.NewV2() require.NoError(t, err) err = ks.Add(ctx, newKey) require.NoError(t, err) keys, err := ks.GetAll() require.NoError(t, err) require.Equal(t, 1, len(keys)) _, err = ks.Delete(ctx, newKey.ID()) require.NoError(t, err) keys, err = ks.GetAll() require.NoError(t, err) require.Equal(t, 0, len(keys)) _, err = ks.Get(newKey.ID()) require.Error(t, err) })` $DIR/core/services/keystore/vrf_test.go: `.Context(t)` $DIR/core/services/keystore/vrf_test.go: `.NewV2()` $DIR/core/services/keystore/vrf_test.go: `.Add(ctx, newKey)` $DIR/core/services/keystore/vrf_test.go: `.GetAll()` $DIR/core/services/keystore/vrf_test.go: `.Delete(ctx, newKey.ID())` $DIR/core/services/keystore/vrf_test.go: `.ID()` $DIR/core/services/keystore/vrf_test.go: `.GetAll()` $DIR/core/services/keystore/vrf_test.go: `.Get(newKey.ID())` $DIR/core/services/keystore/vrf_test.go: `.ID()` $DIR/core/services/keystore/vrf_test.go: `.Run("fails to add an already added key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) k, err := vrfkey.NewV2() require.NoError(t, err) err = ks.Add(ctx, k) require.NoError(t, err) err = ks.Add(ctx, k) assert.Error(t, err) assert.Equal(t, fmt.Sprintf("key with ID %s already exists", k.ID()), err.Error()) })` $DIR/core/services/keystore/vrf_test.go: `.Context(t)` $DIR/core/services/keystore/vrf_test.go: `.NewV2()` $DIR/core/services/keystore/vrf_test.go: `.Add(ctx, k)` $DIR/core/services/keystore/vrf_test.go: `.Add(ctx, k)` $DIR/core/services/keystore/vrf_test.go: `.Run("fails to delete a key that doesn't exists", func(t *testing.T) { defer reset() ctx := testutils.Context(t) k, err := vrfkey.NewV2() require.NoError(t, err) err = ks.Add(ctx, k) require.NoError(t, err) fk, err := ks.Delete(ctx, "non-existent") assert.Zero(t, fk) assert.Error(t, err) })` $DIR/core/services/keystore/vrf_test.go: `.Context(t)` $DIR/core/services/keystore/vrf_test.go: `.NewV2()` $DIR/core/services/keystore/vrf_test.go: `.Add(ctx, k)` $DIR/core/services/keystore/vrf_test.go: `.Delete(ctx, "non-existent")` $DIR/core/services/keystore/vrf_test.go: `.Run("imports a key exported from a v1 keystore", func(t *testing.T) { defer reset() ctx := testutils.Context(t) exportedKey := `{"PublicKey":"0xd2377bc6be8a2c5ce163e1867ee42ef111e320686f940a98e52e9c019ca0606800","vrf_key":{"address":"b94276ad4e5452732ec0cccf30ef7919b67844b6","crypto":{"cipher":"aes-128-ctr","ciphertext":"ff66d61d02dba54a61bab1ceb8414643f9e76b7351785d2959e2c8b50ee69a92","cipherparams":{"iv":"75705da271b11e330a27b8d593a3930c"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"efe5b372e4fe79d0af576a79d65a1ee35d0792d9c92b70107b5ada1817ea7c7b"},"mac":"e4d0bb08ffd004ab03aeaa42367acbd9bb814c6cfd981f5157503f54c30816e7"},"version":3}}` importedKey, err := ks.Import(ctx, []byte(exportedKey), "p4SsW0rD1!@#_") require.NoError(t, err) require.Equal(t, "0xd2377bc6be8a2c5ce163e1867ee42ef111e320686f940a98e52e9c019ca0606800", importedKey.ID()) })` $DIR/core/services/keystore/vrf_test.go: `.Context(t)` $DIR/core/services/keystore/vrf_test.go: `.Import(ctx, []byte(exportedKey), "p4SsW0rD1!@#_")` $DIR/core/services/keystore/vrf_test.go: `.Run("fails to import an already imported key", func(t *testing.T) { defer reset() ctx := testutils.Context(t) exportedKey := `{"PublicKey":"0xd2377bc6be8a2c5ce163e1867ee42ef111e320686f940a98e52e9c019ca0606800","vrf_key":{"address":"b94276ad4e5452732ec0cccf30ef7919b67844b6","crypto":{"cipher":"aes-128-ctr","ciphertext":"ff66d61d02dba54a61bab1ceb8414643f9e76b7351785d2959e2c8b50ee69a92","cipherparams":{"iv":"75705da271b11e330a27b8d593a3930c"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"efe5b372e4fe79d0af576a79d65a1ee35d0792d9c92b70107b5ada1817ea7c7b"},"mac":"e4d0bb08ffd004ab03aeaa42367acbd9bb814c6cfd981f5157503f54c30816e7"},"version":3}}` importedKey, err := ks.Import(ctx, []byte(exportedKey), "p4SsW0rD1!@#_") require.NoError(t, err) keyStore.SetPassword("p4SsW0rD1!@#_") k, err := ks.Import(ctx, []byte(exportedKey), "p4SsW0rD1!@#_") assert.Zero(t, k) assert.Error(t, err) assert.Equal(t, fmt.Sprintf("key with ID %s already exists", importedKey.ID()), err.Error()) })` $DIR/core/services/keystore/vrf_test.go: `.Context(t)` $DIR/core/services/keystore/vrf_test.go: `.Import(ctx, []byte(exportedKey), "p4SsW0rD1!@#_")` $DIR/core/services/keystore/vrf_test.go: `.SetPassword("p4SsW0rD1!@#_")` $DIR/core/services/keystore/vrf_test.go: `.Import(ctx, []byte(exportedKey), "p4SsW0rD1!@#_")` $DIR/core/services/keystore/vrf_test.go: `.Run("fails to export non-existent key", func(t *testing.T) { k, err := ks.Export("non-existent", cltest.Password) assert.Zero(t, k) assert.Error(t, err) })` $DIR/core/services/keystore/vrf_test.go: `.Export("non-existent", cltest.Password)` $DIR/core/services/keystore/vrf_test.go: `.Run("fails to generate proof for non-existent key", func(t *testing.T) { pf, err := ks.GenerateProof("non-existent", big.NewInt(int64(1))) assert.Zero(t, pf) assert.Error(t, err) })` $DIR/core/services/keystore/vrf_test.go: `.GenerateProof("non-existent", big.NewInt(int64(1)))` $DIR/core/services/keystore/vrf_test.go: `.NewInt(int64(1))` $DIR/core/services/keystore/vrf_test.go: `.Run("generates a proof for a key", func(t *testing.T) { ctx := testutils.Context(t) k, err := vrfkey.NewV2() require.NoError(t, err) err = ks.Add(ctx, k) require.NoError(t, err) pf, err := ks.GenerateProof(k.ID(), big.NewInt(int64(1))) require.NoError(t, err) assert.NotZero(t, pf) })` $DIR/core/services/keystore/vrf_test.go: `.Context(t)` $DIR/core/services/keystore/vrf_test.go: `.NewV2()` $DIR/core/services/keystore/vrf_test.go: `.Add(ctx, k)` $DIR/core/services/keystore/vrf_test.go: `.GenerateProof(k.ID(), big.NewInt(int64(1)))` $DIR/core/services/keystore/vrf_test.go: `.ID()` $DIR/core/services/keystore/vrf_test.go: `.NewInt(int64(1))` $DIR/core/services/llo/bm/dummy_transmitter_test.go: `servicetest.Run(t, tr)` $DIR/core/services/llo/bm/dummy_transmitter_test.go: `.TestLoggerObserved(t, zapcore.DebugLevel)` $DIR/core/services/llo/bm/dummy_transmitter_test.go: `.PublicKey("dummy")` $DIR/core/services/llo/bm/dummy_transmitter_test.go: `.Run(t, tr)` $DIR/core/services/llo/bm/dummy_transmitter_test.go: `.Transmit( testutils.Context(t), types.ConfigDigest{}, 42, ocr3types.ReportWithInfo[llotypes.ReportInfo]{}, []types.AttributedOnchainSignature{}, )` $DIR/core/services/llo/bm/dummy_transmitter_test.go: `.Context(t)` $DIR/core/services/llo/data_source_test.go: `streamIDs[streams.StreamID(1)] = struct{}{}` $DIR/core/services/llo/data_source_test.go: `streamIDs[streams.StreamID(2)] = struct{}{}` $DIR/core/services/llo/data_source_test.go: `streamIDs[streams.StreamID(3)] = struct{}{}` $DIR/core/services/llo/data_source_test.go: `t.Run("returns errors if no streams are defined", func(t *testing.T) { vals, err := ds.Observe(ctx, streamIDs) assert.NoError(t, err) assert.Equal(t, llo.StreamValues{ 2: llo.ObsResult[*big.Int]{Val: nil, Valid: false}, 1: llo.ObsResult[*big.Int]{Val: nil, Valid: false}, 3: llo.ObsResult[*big.Int]{Val: nil, Valid: false}, }, vals) })` $DIR/core/services/llo/data_source_test.go: `t.Run("observes each stream with success and returns values matching map argument", func(t *testing.T) { reg.streams[1] = makeStreamWithSingleResult[*big.Int](big.NewInt(2181), nil) reg.streams[2] = makeStreamWithSingleResult[*big.Int](big.NewInt(40602), nil) reg.streams[3] = makeStreamWithSingleResult[*big.Int](big.NewInt(15), nil) vals, err := ds.Observe(ctx, streamIDs) assert.NoError(t, err) assert.Equal(t, llo.StreamValues{ 2: llo.ObsResult[*big.Int]{Val: big.NewInt(40602), Valid: true}, 1: llo.ObsResult[*big.Int]{Val: big.NewInt(2181), Valid: true}, 3: llo.ObsResult[*big.Int]{Val: big.NewInt(15), Valid: true}, }, vals) })` $DIR/core/services/llo/data_source_test.go: `reg.streams[1] = makeStreamWithSingleResult[*big.Int](big.NewInt(2181), nil)` $DIR/core/services/llo/data_source_test.go: `reg.streams[2] = makeStreamWithSingleResult[*big.Int](big.NewInt(40602), nil)` $DIR/core/services/llo/data_source_test.go: `reg.streams[3] = makeStreamWithSingleResult[*big.Int](big.NewInt(15), nil)` $DIR/core/services/llo/data_source_test.go: `t.Run("observes each stream and returns success/errors", func(t *testing.T) { reg.streams[1] = makeStreamWithSingleResult[*big.Int](big.NewInt(2181), errors.New("something exploded")) reg.streams[2] = makeStreamWithSingleResult[*big.Int](big.NewInt(40602), nil) reg.streams[3] = makeStreamWithSingleResult[*big.Int](nil, errors.New("something exploded 2")) vals, err := ds.Observe(ctx, streamIDs) assert.NoError(t, err) assert.Equal(t, llo.StreamValues{ 2: llo.ObsResult[*big.Int]{Val: big.NewInt(40602), Valid: true}, 1: llo.ObsResult[*big.Int]{Val: nil, Valid: false}, 3: llo.ObsResult[*big.Int]{Val: nil, Valid: false}, }, vals) })` $DIR/core/services/llo/data_source_test.go: `reg.streams[1] = makeStreamWithSingleResult[*big.Int](big.NewInt(2181), errors.New("something exploded"))` $DIR/core/services/llo/data_source_test.go: `reg.streams[2] = makeStreamWithSingleResult[*big.Int](big.NewInt(40602), nil)` $DIR/core/services/llo/data_source_test.go: `reg.streams[3] = makeStreamWithSingleResult[*big.Int](nil, errors.New("something exploded 2"))` $DIR/core/services/llo/data_source_test.go: `.TestLogger(t)` $DIR/core/services/llo/data_source_test.go: `.Context(t)` $DIR/core/services/llo/data_source_test.go: `.StreamID(1)` $DIR/core/services/llo/data_source_test.go: `.StreamID(2)` $DIR/core/services/llo/data_source_test.go: `.StreamID(3)` $DIR/core/services/llo/data_source_test.go: `.Run("returns errors if no streams are defined", func(t *testing.T) { vals, err := ds.Observe(ctx, streamIDs) assert.NoError(t, err) assert.Equal(t, llo.StreamValues{ 2: llo.ObsResult[*big.Int]{Val: nil, Valid: false}, 1: llo.ObsResult[*big.Int]{Val: nil, Valid: false}, 3: llo.ObsResult[*big.Int]{Val: nil, Valid: false}, }, vals) })` $DIR/core/services/llo/data_source_test.go: `.Observe(ctx, streamIDs)` $DIR/core/services/llo/data_source_test.go: `.Run("observes each stream with success and returns values matching map argument", func(t *testing.T) { reg.streams[1] = makeStreamWithSingleResult[*big.Int](big.NewInt(2181), nil) reg.streams[2] = makeStreamWithSingleResult[*big.Int](big.NewInt(40602), nil) reg.streams[3] = makeStreamWithSingleResult[*big.Int](big.NewInt(15), nil) vals, err := ds.Observe(ctx, streamIDs) assert.NoError(t, err) assert.Equal(t, llo.StreamValues{ 2: llo.ObsResult[*big.Int]{Val: big.NewInt(40602), Valid: true}, 1: llo.ObsResult[*big.Int]{Val: big.NewInt(2181), Valid: true}, 3: llo.ObsResult[*big.Int]{Val: big.NewInt(15), Valid: true}, }, vals) })` $DIR/core/services/llo/data_source_test.go: `.NewInt(2181)` $DIR/core/services/llo/data_source_test.go: `.NewInt(40602)` $DIR/core/services/llo/data_source_test.go: `.NewInt(15)` $DIR/core/services/llo/data_source_test.go: `.Observe(ctx, streamIDs)` $DIR/core/services/llo/data_source_test.go: `.Run("observes each stream and returns success/errors", func(t *testing.T) { reg.streams[1] = makeStreamWithSingleResult[*big.Int](big.NewInt(2181), errors.New("something exploded")) reg.streams[2] = makeStreamWithSingleResult[*big.Int](big.NewInt(40602), nil) reg.streams[3] = makeStreamWithSingleResult[*big.Int](nil, errors.New("something exploded 2")) vals, err := ds.Observe(ctx, streamIDs) assert.NoError(t, err) assert.Equal(t, llo.StreamValues{ 2: llo.ObsResult[*big.Int]{Val: big.NewInt(40602), Valid: true}, 1: llo.ObsResult[*big.Int]{Val: nil, Valid: false}, 3: llo.ObsResult[*big.Int]{Val: nil, Valid: false}, }, vals) })` $DIR/core/services/llo/data_source_test.go: `.NewInt(2181)` $DIR/core/services/llo/data_source_test.go: `.New("something exploded")` $DIR/core/services/llo/data_source_test.go: `.NewInt(40602)` $DIR/core/services/llo/data_source_test.go: `.New("something exploded 2")` $DIR/core/services/llo/data_source_test.go: `.Observe(ctx, streamIDs)` $DIR/core/services/llo/evm/report_codec_test.go: `t.Run("Encode errors on zero fields", func(t *testing.T) { _, err := rc.Encode(llo.Report{}) require.Error(t, err) assert.Contains(t, err.Error(), "failed to get chain ID for selector 0; chain not found for chain selector 0") })` $DIR/core/services/llo/evm/report_codec_test.go: `t.Run("Encode constructs a report from observations", func(t *testing.T) { report := newValidReport() encoded, err := rc.Encode(report) require.NoError(t, err) reportElems := make(map[string]interface{}) err = Schema.UnpackIntoMap(reportElems, encoded) require.NoError(t, err) assert.Equal(t, [32]uint8{0x1, 0x2, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, reportElems["configDigest"]) assert.Equal(t, uint64(1), reportElems["chainId"]) assert.Equal(t, uint64(32), reportElems["seqNr"]) assert.Equal(t, uint32(31), reportElems["channelId"]) assert.Equal(t, uint32(33), reportElems["validAfterSeconds"]) assert.Equal(t, uint32(34), reportElems["validUntilSeconds"]) assert.Equal(t, []*big.Int{big.NewInt(35), big.NewInt(36)}, reportElems["values"]) assert.Equal(t, true, reportElems["specimen"]) assert.Len(t, encoded, 352) assert.Equal(t, []byte{0x1, 0x2, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24}, encoded) t.Run("Decode decodes the report", func(t *testing.T) { decoded, err := rc.Decode(encoded) require.NoError(t, err) assert.Equal(t, report.ConfigDigest, decoded.ConfigDigest) assert.Equal(t, report.ChainSelector, decoded.ChainSelector) assert.Equal(t, report.SeqNr, decoded.SeqNr) assert.Equal(t, report.ChannelID, decoded.ChannelID) assert.Equal(t, report.ValidAfterSeconds, decoded.ValidAfterSeconds) assert.Equal(t, report.ValidUntilSeconds, decoded.ValidUntilSeconds) assert.Equal(t, report.Values, decoded.Values) assert.Equal(t, report.Specimen, decoded.Specimen) }) })` $DIR/core/services/llo/evm/report_codec_test.go: `err = Schema.UnpackIntoMap(reportElems, encoded)` $DIR/core/services/llo/evm/report_codec_test.go: `t.Run("Decode decodes the report", func(t *testing.T) { decoded, err := rc.Decode(encoded) require.NoError(t, err) assert.Equal(t, report.ConfigDigest, decoded.ConfigDigest) assert.Equal(t, report.ChainSelector, decoded.ChainSelector) assert.Equal(t, report.SeqNr, decoded.SeqNr) assert.Equal(t, report.ChannelID, decoded.ChannelID) assert.Equal(t, report.ValidAfterSeconds, decoded.ValidAfterSeconds) assert.Equal(t, report.ValidUntilSeconds, decoded.ValidUntilSeconds) assert.Equal(t, report.Values, decoded.Values) assert.Equal(t, report.Specimen, decoded.Specimen) })` $DIR/core/services/llo/evm/report_codec_test.go: `longBad[i] = byte(i)` $DIR/core/services/llo/evm/report_codec_test.go: `_, err = rc.Decode(longBad)` $DIR/core/services/llo/evm/report_codec_test.go: `.Run("Encode errors on zero fields", func(t *testing.T) { _, err := rc.Encode(llo.Report{}) require.Error(t, err) assert.Contains(t, err.Error(), "failed to get chain ID for selector 0; chain not found for chain selector 0") })` $DIR/core/services/llo/evm/report_codec_test.go: `.Encode(llo.Report{})` $DIR/core/services/llo/evm/report_codec_test.go: `.Run("Encode constructs a report from observations", func(t *testing.T) { report := newValidReport() encoded, err := rc.Encode(report) require.NoError(t, err) reportElems := make(map[string]interface{}) err = Schema.UnpackIntoMap(reportElems, encoded) require.NoError(t, err) assert.Equal(t, [32]uint8{0x1, 0x2, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, reportElems["configDigest"]) assert.Equal(t, uint64(1), reportElems["chainId"]) assert.Equal(t, uint64(32), reportElems["seqNr"]) assert.Equal(t, uint32(31), reportElems["channelId"]) assert.Equal(t, uint32(33), reportElems["validAfterSeconds"]) assert.Equal(t, uint32(34), reportElems["validUntilSeconds"]) assert.Equal(t, []*big.Int{big.NewInt(35), big.NewInt(36)}, reportElems["values"]) assert.Equal(t, true, reportElems["specimen"]) assert.Len(t, encoded, 352) assert.Equal(t, []byte{0x1, 0x2, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24}, encoded) t.Run("Decode decodes the report", func(t *testing.T) { decoded, err := rc.Decode(encoded) require.NoError(t, err) assert.Equal(t, report.ConfigDigest, decoded.ConfigDigest) assert.Equal(t, report.ChainSelector, decoded.ChainSelector) assert.Equal(t, report.SeqNr, decoded.SeqNr) assert.Equal(t, report.ChannelID, decoded.ChannelID) assert.Equal(t, report.ValidAfterSeconds, decoded.ValidAfterSeconds) assert.Equal(t, report.ValidUntilSeconds, decoded.ValidUntilSeconds) assert.Equal(t, report.Values, decoded.Values) assert.Equal(t, report.Specimen, decoded.Specimen) }) })` $DIR/core/services/llo/evm/report_codec_test.go: `.Encode(report)` $DIR/core/services/llo/evm/report_codec_test.go: `.UnpackIntoMap(reportElems, encoded)` $DIR/core/services/llo/evm/report_codec_test.go: `.Run("Decode decodes the report", func(t *testing.T) { decoded, err := rc.Decode(encoded) require.NoError(t, err) assert.Equal(t, report.ConfigDigest, decoded.ConfigDigest) assert.Equal(t, report.ChainSelector, decoded.ChainSelector) assert.Equal(t, report.SeqNr, decoded.SeqNr) assert.Equal(t, report.ChannelID, decoded.ChannelID) assert.Equal(t, report.ValidAfterSeconds, decoded.ValidAfterSeconds) assert.Equal(t, report.ValidUntilSeconds, decoded.ValidUntilSeconds) assert.Equal(t, report.Values, decoded.Values) assert.Equal(t, report.Specimen, decoded.Specimen) })` $DIR/core/services/llo/evm/report_codec_test.go: `.Decode(encoded)` $DIR/core/services/llo/evm/report_codec_test.go: `.Decode([]byte{1, 2, 3})` $DIR/core/services/llo/evm/report_codec_test.go: `.Decode(longBad)` $DIR/core/services/llo/keyring_test.go: `t.Run("Sign+Verify", func(t *testing.T) { for _, tc := range cases { t.Run(tc.format.String(), func(t *testing.T) { k := ks[tc.format] defer k.(*mockKey).reset(tc.format) sig, err := kr.Sign(cd, seqNr, ocr3types.ReportWithInfo[llotypes.ReportInfo]{Info: llotypes.ReportInfo{ReportFormat: tc.format}}) require.NoError(t, err) assert.Equal(t, []byte(fmt.Sprintf("sig-%d", tc.format)), sig) assert.False(t, kr.Verify(nil, cd, seqNr, ocr3types.ReportWithInfo[llotypes.ReportInfo]{Info: llotypes.ReportInfo{ReportFormat: tc.format}}, sig)) k.(*mockKey).verify = true for _, tc2 := range cases { verified := kr.Verify(nil, cd, seqNr, ocr3types.ReportWithInfo[llotypes.ReportInfo]{Info: llotypes.ReportInfo{ReportFormat: tc2.format}}, sig) if tc.format == tc2.format { assert.True(t, verified, "expected true for %s", tc2.format) } else { assert.False(t, verified, "expected false for %s", tc2.format) } } }) } })` $DIR/core/services/llo/keyring_test.go: `t.Run(tc.format.String(), func(t *testing.T) { k := ks[tc.format] defer k.(*mockKey).reset(tc.format) sig, err := kr.Sign(cd, seqNr, ocr3types.ReportWithInfo[llotypes.ReportInfo]{Info: llotypes.ReportInfo{ReportFormat: tc.format}}) require.NoError(t, err) assert.Equal(t, []byte(fmt.Sprintf("sig-%d", tc.format)), sig) assert.False(t, kr.Verify(nil, cd, seqNr, ocr3types.ReportWithInfo[llotypes.ReportInfo]{Info: llotypes.ReportInfo{ReportFormat: tc.format}}, sig)) k.(*mockKey).verify = true for _, tc2 := range cases { verified := kr.Verify(nil, cd, seqNr, ocr3types.ReportWithInfo[llotypes.ReportInfo]{Info: llotypes.ReportInfo{ReportFormat: tc2.format}}, sig) if tc.format == tc2.format { assert.True(t, verified, "expected true for %s", tc2.format) } else { assert.False(t, verified, "expected false for %s", tc2.format) } } })` $DIR/core/services/llo/keyring_test.go: `k.(*mockKey).verify = true` $DIR/core/services/llo/keyring_test.go: `t.Run("MaxSignatureLength", func(t *testing.T) { assert.Equal(t, 8+4+2+1, kr.MaxSignatureLength()) })` $DIR/core/services/llo/keyring_test.go: `b[i] = byte(255)` $DIR/core/services/llo/keyring_test.go: `.TestLogger(t)` $DIR/core/services/llo/keyring_test.go: `.BytesToConfigDigest(testutils.MustRandBytes(32))` $DIR/core/services/llo/keyring_test.go: `.MustRandBytes(32)` $DIR/core/services/llo/keyring_test.go: `.Uint64()` $DIR/core/services/llo/keyring_test.go: `.Run("Sign+Verify", func(t *testing.T) { for _, tc := range cases { t.Run(tc.format.String(), func(t *testing.T) { k := ks[tc.format] defer k.(*mockKey).reset(tc.format) sig, err := kr.Sign(cd, seqNr, ocr3types.ReportWithInfo[llotypes.ReportInfo]{Info: llotypes.ReportInfo{ReportFormat: tc.format}}) require.NoError(t, err) assert.Equal(t, []byte(fmt.Sprintf("sig-%d", tc.format)), sig) assert.False(t, kr.Verify(nil, cd, seqNr, ocr3types.ReportWithInfo[llotypes.ReportInfo]{Info: llotypes.ReportInfo{ReportFormat: tc.format}}, sig)) k.(*mockKey).verify = true for _, tc2 := range cases { verified := kr.Verify(nil, cd, seqNr, ocr3types.ReportWithInfo[llotypes.ReportInfo]{Info: llotypes.ReportInfo{ReportFormat: tc2.format}}, sig) if tc.format == tc2.format { assert.True(t, verified, "expected true for %s", tc2.format) } else { assert.False(t, verified, "expected false for %s", tc2.format) } } }) } })` $DIR/core/services/llo/keyring_test.go: `.Run(tc.format.String(), func(t *testing.T) { k := ks[tc.format] defer k.(*mockKey).reset(tc.format) sig, err := kr.Sign(cd, seqNr, ocr3types.ReportWithInfo[llotypes.ReportInfo]{Info: llotypes.ReportInfo{ReportFormat: tc.format}}) require.NoError(t, err) assert.Equal(t, []byte(fmt.Sprintf("sig-%d", tc.format)), sig) assert.False(t, kr.Verify(nil, cd, seqNr, ocr3types.ReportWithInfo[llotypes.ReportInfo]{Info: llotypes.ReportInfo{ReportFormat: tc.format}}, sig)) k.(*mockKey).verify = true for _, tc2 := range cases { verified := kr.Verify(nil, cd, seqNr, ocr3types.ReportWithInfo[llotypes.ReportInfo]{Info: llotypes.ReportInfo{ReportFormat: tc2.format}}, sig) if tc.format == tc2.format { assert.True(t, verified, "expected true for %s", tc2.format) } else { assert.False(t, verified, "expected false for %s", tc2.format) } } })` $DIR/core/services/llo/keyring_test.go: `.format.String()` $DIR/core/services/llo/keyring_test.go: `.reset(tc.format)` $DIR/core/services/llo/keyring_test.go: `.Sign(cd, seqNr, ocr3types.ReportWithInfo[llotypes.ReportInfo]{Info: llotypes.ReportInfo{ReportFormat: tc.format}})` $DIR/core/services/llo/keyring_test.go: `.Verify(nil, cd, seqNr, ocr3types.ReportWithInfo[llotypes.ReportInfo]{Info: llotypes.ReportInfo{ReportFormat: tc2.format}}, sig)` $DIR/core/services/llo/keyring_test.go: `.Run("MaxSignatureLength", func(t *testing.T) { assert.Equal(t, 8+4+2+1, kr.MaxSignatureLength()) })` $DIR/core/services/llo/offchain_config_digester_test.go: `_, err = OffchainConfigDigester{}.ConfigDigest(types.ContractConfig{ Signers: []types.OnchainPublicKey{{1, 2}}, })` $DIR/core/services/llo/offchain_config_digester_test.go: `_, err = OffchainConfigDigester{}.ConfigDigest(types.ContractConfig{ Transmitters: []types.Account{"0x"}, })` $DIR/core/services/llo/offchain_config_digester_test.go: `_, err = OffchainConfigDigester{}.ConfigDigest(types.ContractConfig{ Transmitters: []types.Account{"7343581f55146951b0f678dc6cfa8fd360e2f353"}, })` $DIR/core/services/llo/offchain_config_digester_test.go: `_, err = OffchainConfigDigester{}.ConfigDigest(types.ContractConfig{ Transmitters: []types.Account{"7343581f55146951b0f678dc6cfa8fd360e2f353aabbccddeeffaaccddeeffaz"}, })` $DIR/core/services/llo/offchain_config_digester_test.go: `_, err = OffchainConfigDigester{ChainID: big.NewInt(0)}.ConfigDigest(types.ContractConfig{ Transmitters: []types.Account{"7343581f55146951b0f678dc6cfa8fd360e2f353aabbccddeeffaaccddeeffaa"}, })` $DIR/core/services/llo/offchain_config_digester_test.go: `.NewInt(0)` $DIR/core/services/llo/offchain_config_digester_test.go: `.ConfigDigest(types.ContractConfig{})` $DIR/core/services/llo/offchain_config_digester_test.go: `.NewInt(0)` $DIR/core/services/llo/offchain_config_digester_test.go: `.ConfigDigest(types.ContractConfig{})` $DIR/core/services/llo/offchain_config_digester_test.go: `.NewInt(1)` $DIR/core/services/llo/offchain_config_digester_test.go: `.ConfigDigest(types.ContractConfig{})` $DIR/core/services/llo/offchain_config_digester_test.go: `.NewInt(1)` $DIR/core/services/llo/offchain_config_digester_test.go: `.ConfigDigest(types.ContractConfig{})` $DIR/core/services/llo/offchain_config_digester_test.go: `.ConfigDigest(types.ContractConfig{ Signers: []types.OnchainPublicKey{{1, 2}}, })` $DIR/core/services/llo/offchain_config_digester_test.go: `.ConfigDigest(types.ContractConfig{ Transmitters: []types.Account{"0x"}, })` $DIR/core/services/llo/offchain_config_digester_test.go: `.ConfigDigest(types.ContractConfig{ Transmitters: []types.Account{"7343581f55146951b0f678dc6cfa8fd360e2f353"}, })` $DIR/core/services/llo/offchain_config_digester_test.go: `.ConfigDigest(types.ContractConfig{ Transmitters: []types.Account{"7343581f55146951b0f678dc6cfa8fd360e2f353aabbccddeeffaaccddeeffaz"}, })` $DIR/core/services/llo/offchain_config_digester_test.go: `.NewInt(0)` $DIR/core/services/llo/offchain_config_digester_test.go: `.ConfigDigest(types.ContractConfig{ Transmitters: []types.Account{"7343581f55146951b0f678dc6cfa8fd360e2f353aabbccddeeffaaccddeeffaa"}, })` $DIR/core/services/llo/onchain_channel_definition_cache_test.go: `.ChannelDefinitions(map[llotypes.ChannelID]llotypes.ChannelDefinition{ 1: { ReportFormat: llotypes.ReportFormat(43), ChainSelector: 42, StreamIDs: []llotypes.StreamID{1, 2, 3}, }, })` $DIR/core/services/llo/onchain_channel_definition_cache_test.go: `.ReportFormat(43)` $DIR/core/services/llo/orm_test.go: `t.Run("returns zero values if nothing in database", func(t *testing.T) { cd, blockNum, err := orm.LoadChannelDefinitions(ctx, addr1) require.NoError(t, err) assert.Zero(t, cd) assert.Zero(t, blockNum) })` $DIR/core/services/llo/orm_test.go: `t.Run("loads channel definitions from database", func(t *testing.T) { expectedBlockNum := rand.Int63() expectedBlockNum2 := rand.Int63() cid1 := rand.Uint32() cid2 := rand.Uint32() channelDefsJSON := fmt.Sprintf(` { "%d": { "reportFormat": 42, "chainSelector": 142, "streamIds": [1, 2] }, "%d": { "reportFormat": 42, "chainSelector": 142, "streamIds": [1, 3] } } `, cid1, cid2) pgtest.MustExec(t, db, ` INSERT INTO channel_definitions(addr, evm_chain_id, definitions, block_num, updated_at) VALUES ( $1, $2, $3, $4, NOW()) `, addr1, testutils.FixtureChainID.String(), channelDefsJSON, expectedBlockNum) pgtest.MustExec(t, db, ` INSERT INTO channel_definitions(addr, evm_chain_id, definitions, block_num, updated_at) VALUES ( $1, $2, $3, $4, NOW()) `, addr2, testutils.FixtureChainID.String(), `{}`, expectedBlockNum2) { // alternative chain ID; we expect these ones to be ignored pgtest.MustExec(t, db, ` INSERT INTO channel_definitions(addr, evm_chain_id, definitions, block_num, updated_at) VALUES ( $1, $2, $3, $4, NOW()) `, addr1, testutils.SimulatedChainID.String(), channelDefsJSON, expectedBlockNum) pgtest.MustExec(t, db, ` INSERT INTO channel_definitions(addr, evm_chain_id, definitions, block_num, updated_at) VALUES ( $1, $2, $3, $4, NOW()) `, addr3, testutils.SimulatedChainID.String(), channelDefsJSON, expectedBlockNum) } cd, blockNum, err := orm.LoadChannelDefinitions(ctx, addr1) require.NoError(t, err) assert.Equal(t, llotypes.ChannelDefinitions{ cid1: llotypes.ChannelDefinition{ ReportFormat: 42, ChainSelector: 142, StreamIDs: []llotypes.StreamID{1, 2}, }, cid2: llotypes.ChannelDefinition{ ReportFormat: 42, ChainSelector: 142, StreamIDs: []llotypes.StreamID{1, 3}, }, }, cd) assert.Equal(t, expectedBlockNum, blockNum) cd, blockNum, err = orm.LoadChannelDefinitions(ctx, addr2) require.NoError(t, err) assert.Equal(t, llotypes.ChannelDefinitions{}, cd) assert.Equal(t, expectedBlockNum2, blockNum) })` $DIR/core/services/llo/orm_test.go: `pgtest.MustExec(t, db, ` INSERT INTO channel_definitions(addr, evm_chain_id, definitions, block_num, updated_at) VALUES ( $1, $2, $3, $4, NOW()) `, addr1, testutils.FixtureChainID.String(), channelDefsJSON, expectedBlockNum)` $DIR/core/services/llo/orm_test.go: `pgtest.MustExec(t, db, ` INSERT INTO channel_definitions(addr, evm_chain_id, definitions, block_num, updated_at) VALUES ( $1, $2, $3, $4, NOW()) `, addr2, testutils.FixtureChainID.String(), `{}`, expectedBlockNum2)` $DIR/core/services/llo/orm_test.go: `pgtest.MustExec(t, db, ` INSERT INTO channel_definitions(addr, evm_chain_id, definitions, block_num, updated_at) VALUES ( $1, $2, $3, $4, NOW()) `, addr1, testutils.SimulatedChainID.String(), channelDefsJSON, expectedBlockNum)` $DIR/core/services/llo/orm_test.go: `pgtest.MustExec(t, db, ` INSERT INTO channel_definitions(addr, evm_chain_id, definitions, block_num, updated_at) VALUES ( $1, $2, $3, $4, NOW()) `, addr3, testutils.SimulatedChainID.String(), channelDefsJSON, expectedBlockNum)` $DIR/core/services/llo/orm_test.go: `cd, blockNum, err = orm.LoadChannelDefinitions(ctx, addr2)` $DIR/core/services/llo/orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/llo/orm_test.go: `.Context(t)` $DIR/core/services/llo/orm_test.go: `.NewAddress()` $DIR/core/services/llo/orm_test.go: `.NewAddress()` $DIR/core/services/llo/orm_test.go: `.NewAddress()` $DIR/core/services/llo/orm_test.go: `.Run("returns zero values if nothing in database", func(t *testing.T) { cd, blockNum, err := orm.LoadChannelDefinitions(ctx, addr1) require.NoError(t, err) assert.Zero(t, cd) assert.Zero(t, blockNum) })` $DIR/core/services/llo/orm_test.go: `.LoadChannelDefinitions(ctx, addr1)` $DIR/core/services/llo/orm_test.go: `.Run("loads channel definitions from database", func(t *testing.T) { expectedBlockNum := rand.Int63() expectedBlockNum2 := rand.Int63() cid1 := rand.Uint32() cid2 := rand.Uint32() channelDefsJSON := fmt.Sprintf(` { "%d": { "reportFormat": 42, "chainSelector": 142, "streamIds": [1, 2] }, "%d": { "reportFormat": 42, "chainSelector": 142, "streamIds": [1, 3] } } `, cid1, cid2) pgtest.MustExec(t, db, ` INSERT INTO channel_definitions(addr, evm_chain_id, definitions, block_num, updated_at) VALUES ( $1, $2, $3, $4, NOW()) `, addr1, testutils.FixtureChainID.String(), channelDefsJSON, expectedBlockNum) pgtest.MustExec(t, db, ` INSERT INTO channel_definitions(addr, evm_chain_id, definitions, block_num, updated_at) VALUES ( $1, $2, $3, $4, NOW()) `, addr2, testutils.FixtureChainID.String(), `{}`, expectedBlockNum2) { // alternative chain ID; we expect these ones to be ignored pgtest.MustExec(t, db, ` INSERT INTO channel_definitions(addr, evm_chain_id, definitions, block_num, updated_at) VALUES ( $1, $2, $3, $4, NOW()) `, addr1, testutils.SimulatedChainID.String(), channelDefsJSON, expectedBlockNum) pgtest.MustExec(t, db, ` INSERT INTO channel_definitions(addr, evm_chain_id, definitions, block_num, updated_at) VALUES ( $1, $2, $3, $4, NOW()) `, addr3, testutils.SimulatedChainID.String(), channelDefsJSON, expectedBlockNum) } cd, blockNum, err := orm.LoadChannelDefinitions(ctx, addr1) require.NoError(t, err) assert.Equal(t, llotypes.ChannelDefinitions{ cid1: llotypes.ChannelDefinition{ ReportFormat: 42, ChainSelector: 142, StreamIDs: []llotypes.StreamID{1, 2}, }, cid2: llotypes.ChannelDefinition{ ReportFormat: 42, ChainSelector: 142, StreamIDs: []llotypes.StreamID{1, 3}, }, }, cd) assert.Equal(t, expectedBlockNum, blockNum) cd, blockNum, err = orm.LoadChannelDefinitions(ctx, addr2) require.NoError(t, err) assert.Equal(t, llotypes.ChannelDefinitions{}, cd) assert.Equal(t, expectedBlockNum2, blockNum) })` $DIR/core/services/llo/orm_test.go: `.Int63()` $DIR/core/services/llo/orm_test.go: `.Int63()` $DIR/core/services/llo/orm_test.go: `.Uint32()` $DIR/core/services/llo/orm_test.go: `.Uint32()` $DIR/core/services/llo/orm_test.go: `.Sprintf(` { "%d": { "reportFormat": 42, "chainSelector": 142, "streamIds": [1, 2] }, "%d": { "reportFormat": 42, "chainSelector": 142, "streamIds": [1, 3] } } `, cid1, cid2)` $DIR/core/services/llo/orm_test.go: `.MustExec(t, db, ` INSERT INTO channel_definitions(addr, evm_chain_id, definitions, block_num, updated_at) VALUES ( $1, $2, $3, $4, NOW()) `, addr1, testutils.FixtureChainID.String(), channelDefsJSON, expectedBlockNum)` $DIR/core/services/llo/orm_test.go: `.FixtureChainID.String()` $DIR/core/services/llo/orm_test.go: `.MustExec(t, db, ` INSERT INTO channel_definitions(addr, evm_chain_id, definitions, block_num, updated_at) VALUES ( $1, $2, $3, $4, NOW()) `, addr2, testutils.FixtureChainID.String(), `{}`, expectedBlockNum2)` $DIR/core/services/llo/orm_test.go: `.FixtureChainID.String()` $DIR/core/services/llo/orm_test.go: `.MustExec(t, db, ` INSERT INTO channel_definitions(addr, evm_chain_id, definitions, block_num, updated_at) VALUES ( $1, $2, $3, $4, NOW()) `, addr1, testutils.SimulatedChainID.String(), channelDefsJSON, expectedBlockNum)` $DIR/core/services/llo/orm_test.go: `.SimulatedChainID.String()` $DIR/core/services/llo/orm_test.go: `.MustExec(t, db, ` INSERT INTO channel_definitions(addr, evm_chain_id, definitions, block_num, updated_at) VALUES ( $1, $2, $3, $4, NOW()) `, addr3, testutils.SimulatedChainID.String(), channelDefsJSON, expectedBlockNum)` $DIR/core/services/llo/orm_test.go: `.SimulatedChainID.String()` $DIR/core/services/llo/orm_test.go: `.LoadChannelDefinitions(ctx, addr1)` $DIR/core/services/llo/orm_test.go: `.LoadChannelDefinitions(ctx, addr2)` $DIR/core/services/nurse_test.go: `nrse.AddCheck("test", func() (bool, Meta) { return true, Meta{} })` $DIR/core/services/nurse_test.go: `wc, err = nrse.createFile(time.Now(), "testgz", false)` $DIR/core/services/nurse_test.go: `testutils.AssertEventually(t, func() bool { return profileExists(t, nrse, cpuProfName) })` $DIR/core/services/nurse_test.go: `testutils.AssertEventually(t, func() bool { return profileExists(t, nrse, traceProfName) })` $DIR/core/services/nurse_test.go: `.TestLogger(t)` $DIR/core/services/nurse_test.go: `.AddCheck("test", func() (bool, Meta) { return true, Meta{} })` $DIR/core/services/nurse_test.go: `.createFile(time.Now(), "test", false)` $DIR/core/services/nurse_test.go: `.Now()` $DIR/core/services/nurse_test.go: `.Write([]byte("junk"))` $DIR/core/services/nurse_test.go: `.createFile(time.Now(), "testgz", false)` $DIR/core/services/nurse_test.go: `.Now()` $DIR/core/services/nurse_test.go: `.AssertEventually(t, func() bool { return profileExists(t, nrse, cpuProfName) })` $DIR/core/services/nurse_test.go: `.AssertEventually(t, func() bool { return profileExists(t, nrse, traceProfName) })` $DIR/core/services/nurse_test.go: `.totalProfileBytes()` $DIR/core/services/ocr/config_overrider_test.go: `flagsContract.On("GetFlags", mock.Anything, mock.Anything). Run(checkFlagsAddress(t, uni.contractAddress)). Return([]bool{false, true}, nil).Once()` $DIR/core/services/ocr/config_overrider_test.go: `flagsContract.On("GetFlags", mock.Anything, mock.Anything). Run(checkFlagsAddress(t, uni.contractAddress)). Return([]bool{true, true}, nil)` $DIR/core/services/ocr/config_overrider_test.go: `servicetest.Run(t, uni.overrider)` $DIR/core/services/ocr/config_overrider_test.go: `t.Run("Before first tick returns nil override, later does return a specific override when hibernating", func(t *testing.T) { flagsContract := mocks.NewFlags(t) ticker := NewFakeTicker() uni := newConfigOverriderUni(t, ticker, flagsContract) // not hibernating, because one of the flags is lowered flagsContract.On("GetFlags", mock.Anything, mock.Anything). Run(checkFlagsAddress(t, uni.contractAddress)). Return([]bool{false, true}, nil).Once() // hibernating flagsContract.On("GetFlags", mock.Anything, mock.Anything). Run(checkFlagsAddress(t, uni.contractAddress)). Return([]bool{true, true}, nil) servicetest.Run(t, uni.overrider) // not hibernating initially require.Nil(t, uni.overrider.ConfigOverride()) // update state by getting flags require.NoError(t, uni.overrider.ExportedUpdateFlagsStatus()) expectedOverride := &ocrtypes.ConfigOverride{AlphaPPB: math.MaxUint64, DeltaC: uni.overrider.DeltaCFromAddress} require.Equal(t, expectedOverride, uni.overrider.ConfigOverride()) })` $DIR/core/services/ocr/config_overrider_test.go: `flagsContract.On("GetFlags", mock.Anything, mock.Anything). Run(checkFlagsAddress(t, uni.contractAddress)). Return([]bool{false, true}, nil).Once()` $DIR/core/services/ocr/config_overrider_test.go: `flagsContract.On("GetFlags", mock.Anything, mock.Anything). Run(checkFlagsAddress(t, uni.contractAddress)). Return([]bool{true, true}, nil)` $DIR/core/services/ocr/config_overrider_test.go: `servicetest.Run(t, uni.overrider)` $DIR/core/services/ocr/config_overrider_test.go: `t.Run("Before first tick is hibernating, later exists hibernation", func(t *testing.T) { flagsContract := mocks.NewFlags(t) ticker := NewFakeTicker() uni := newConfigOverriderUni(t, ticker, flagsContract) // hibernating flagsContract.On("GetFlags", mock.Anything, mock.Anything). Run(checkFlagsAddress(t, uni.contractAddress)). Return([]bool{true, true}, nil).Once() // not hibernating flagsContract.On("GetFlags", mock.Anything, mock.Anything). Run(checkFlagsAddress(t, uni.contractAddress)). Return([]bool{true, false}, nil) servicetest.Run(t, uni.overrider) // initially enters hibernation expectedOverride := &ocrtypes.ConfigOverride{AlphaPPB: math.MaxUint64, DeltaC: uni.overrider.DeltaCFromAddress} require.Equal(t, expectedOverride, uni.overrider.ConfigOverride()) // update state by getting flags require.NoError(t, uni.overrider.ExportedUpdateFlagsStatus()) // should exit hibernation require.Nil(t, uni.overrider.ConfigOverride()) })` $DIR/core/services/ocr/config_overrider_test.go: `flagsContract.On("GetFlags", mock.Anything, mock.Anything). Run(checkFlagsAddress(t, uni.contractAddress)). Return([]bool{true, true}, nil).Once()` $DIR/core/services/ocr/config_overrider_test.go: `flagsContract.On("GetFlags", mock.Anything, mock.Anything). Run(checkFlagsAddress(t, uni.contractAddress)). Return([]bool{true, false}, nil)` $DIR/core/services/ocr/config_overrider_test.go: `servicetest.Run(t, uni.overrider)` $DIR/core/services/ocr/config_overrider_test.go: `t.Run("Errors if flags contract is missing", func(t *testing.T) { var testLogger = logger.TestLogger(t) contractAddress := cltest.NewEIP55Address() flags := &ocr.ContractFlags{FlagsInterface: nil} _, err := ocr.NewConfigOverriderImpl( testLogger, deltaCConfig{}, contractAddress, flags, nil, ) require.Error(t, err) require.Contains(t, err.Error(), "Flags contract instance is missing, the contract does not exist") })` $DIR/core/services/ocr/config_overrider_test.go: `.NewWithT(t)` $DIR/core/services/ocr/config_overrider_test.go: `.NewFlags(t)` $DIR/core/services/ocr/config_overrider_test.go: `.NewPausableTicker(3 * time.Second)` $DIR/core/services/ocr/config_overrider_test.go: `.On("GetFlags", mock.Anything, mock.Anything)` $DIR/core/services/ocr/config_overrider_test.go: `. Run(checkFlagsAddress(t, uni.contractAddress))` $DIR/core/services/ocr/config_overrider_test.go: `. Return([]bool{false, true}, nil)` $DIR/core/services/ocr/config_overrider_test.go: `.Once()` $DIR/core/services/ocr/config_overrider_test.go: `.On("GetFlags", mock.Anything, mock.Anything)` $DIR/core/services/ocr/config_overrider_test.go: `. Run(checkFlagsAddress(t, uni.contractAddress))` $DIR/core/services/ocr/config_overrider_test.go: `. Return([]bool{true, true}, nil)` $DIR/core/services/ocr/config_overrider_test.go: `.Run(t, uni.overrider)` $DIR/core/services/ocr/config_overrider_test.go: `.Eventually(func() *ocrtypes.ConfigOverride { return uni.overrider.ConfigOverride() }, 10*time.Second, 450*time.Millisecond)` $DIR/core/services/ocr/config_overrider_test.go: `.overrider.ConfigOverride()` $DIR/core/services/ocr/config_overrider_test.go: `.Equal(expectedOverride)` $DIR/core/services/ocr/config_overrider_test.go: `.Run("Before first tick returns nil override, later does return a specific override when hibernating", func(t *testing.T) { flagsContract := mocks.NewFlags(t) ticker := NewFakeTicker() uni := newConfigOverriderUni(t, ticker, flagsContract) // not hibernating, because one of the flags is lowered flagsContract.On("GetFlags", mock.Anything, mock.Anything). Run(checkFlagsAddress(t, uni.contractAddress)). Return([]bool{false, true}, nil).Once() // hibernating flagsContract.On("GetFlags", mock.Anything, mock.Anything). Run(checkFlagsAddress(t, uni.contractAddress)). Return([]bool{true, true}, nil) servicetest.Run(t, uni.overrider) // not hibernating initially require.Nil(t, uni.overrider.ConfigOverride()) // update state by getting flags require.NoError(t, uni.overrider.ExportedUpdateFlagsStatus()) expectedOverride := &ocrtypes.ConfigOverride{AlphaPPB: math.MaxUint64, DeltaC: uni.overrider.DeltaCFromAddress} require.Equal(t, expectedOverride, uni.overrider.ConfigOverride()) })` $DIR/core/services/ocr/config_overrider_test.go: `.NewFlags(t)` $DIR/core/services/ocr/config_overrider_test.go: `.On("GetFlags", mock.Anything, mock.Anything)` $DIR/core/services/ocr/config_overrider_test.go: `. Run(checkFlagsAddress(t, uni.contractAddress))` $DIR/core/services/ocr/config_overrider_test.go: `. Return([]bool{false, true}, nil)` $DIR/core/services/ocr/config_overrider_test.go: `.Once()` $DIR/core/services/ocr/config_overrider_test.go: `.On("GetFlags", mock.Anything, mock.Anything)` $DIR/core/services/ocr/config_overrider_test.go: `. Run(checkFlagsAddress(t, uni.contractAddress))` $DIR/core/services/ocr/config_overrider_test.go: `. Return([]bool{true, true}, nil)` $DIR/core/services/ocr/config_overrider_test.go: `.Run(t, uni.overrider)` $DIR/core/services/ocr/config_overrider_test.go: `.Run("Before first tick is hibernating, later exists hibernation", func(t *testing.T) { flagsContract := mocks.NewFlags(t) ticker := NewFakeTicker() uni := newConfigOverriderUni(t, ticker, flagsContract) // hibernating flagsContract.On("GetFlags", mock.Anything, mock.Anything). Run(checkFlagsAddress(t, uni.contractAddress)). Return([]bool{true, true}, nil).Once() // not hibernating flagsContract.On("GetFlags", mock.Anything, mock.Anything). Run(checkFlagsAddress(t, uni.contractAddress)). Return([]bool{true, false}, nil) servicetest.Run(t, uni.overrider) // initially enters hibernation expectedOverride := &ocrtypes.ConfigOverride{AlphaPPB: math.MaxUint64, DeltaC: uni.overrider.DeltaCFromAddress} require.Equal(t, expectedOverride, uni.overrider.ConfigOverride()) // update state by getting flags require.NoError(t, uni.overrider.ExportedUpdateFlagsStatus()) // should exit hibernation require.Nil(t, uni.overrider.ConfigOverride()) })` $DIR/core/services/ocr/config_overrider_test.go: `.NewFlags(t)` $DIR/core/services/ocr/config_overrider_test.go: `.On("GetFlags", mock.Anything, mock.Anything)` $DIR/core/services/ocr/config_overrider_test.go: `. Run(checkFlagsAddress(t, uni.contractAddress))` $DIR/core/services/ocr/config_overrider_test.go: `. Return([]bool{true, true}, nil)` $DIR/core/services/ocr/config_overrider_test.go: `.Once()` $DIR/core/services/ocr/config_overrider_test.go: `.On("GetFlags", mock.Anything, mock.Anything)` $DIR/core/services/ocr/config_overrider_test.go: `. Run(checkFlagsAddress(t, uni.contractAddress))` $DIR/core/services/ocr/config_overrider_test.go: `. Return([]bool{true, false}, nil)` $DIR/core/services/ocr/config_overrider_test.go: `.Run(t, uni.overrider)` $DIR/core/services/ocr/config_overrider_test.go: `.Run("Errors if flags contract is missing", func(t *testing.T) { var testLogger = logger.TestLogger(t) contractAddress := cltest.NewEIP55Address() flags := &ocr.ContractFlags{FlagsInterface: nil} _, err := ocr.NewConfigOverriderImpl( testLogger, deltaCConfig{}, contractAddress, flags, nil, ) require.Error(t, err) require.Contains(t, err.Error(), "Flags contract instance is missing, the contract does not exist") })` $DIR/core/services/ocr/config_overrider_test.go: `.TestLogger(t)` $DIR/core/services/ocr/config_overrider_test.go: `.NewEIP55Address()` $DIR/core/services/ocr/config_overrider_test.go: `.NewConfigOverriderImpl( testLogger, deltaCConfig{}, contractAddress, flags, nil, )` $DIR/core/services/ocr/config_overrider_test.go: `.TestLogger(t)` $DIR/core/services/ocr/config_overrider_test.go: `.NewFlags(t)` $DIR/core/services/ocr/config_overrider_test.go: `.NewEIP55Address(common.BigToAddress(big.NewInt(10000)).Hex())` $DIR/core/services/ocr/config_overrider_test.go: `.BigToAddress(big.NewInt(10000))` $DIR/core/services/ocr/config_overrider_test.go: `.NewInt(10000)` $DIR/core/services/ocr/config_overrider_test.go: `.Hex()` $DIR/core/services/ocr/config_overrider_test.go: `.NewEIP55Address(common.BigToAddress(big.NewInt(1234567890)).Hex())` $DIR/core/services/ocr/config_overrider_test.go: `.BigToAddress(big.NewInt(1234567890))` $DIR/core/services/ocr/config_overrider_test.go: `.NewInt(1234567890)` $DIR/core/services/ocr/config_overrider_test.go: `.Hex()` $DIR/core/services/ocr/config_overrider_test.go: `.NewConfigOverriderImpl(testLogger, deltaCConfig{}, address1, flags, nil)` $DIR/core/services/ocr/config_overrider_test.go: `.NewConfigOverriderImpl(testLogger, deltaCConfig{}, address1, flags, nil)` $DIR/core/services/ocr/config_overrider_test.go: `.NewConfigOverriderImpl(testLogger, deltaCConfig{}, address2, flags, nil)` $DIR/core/services/ocr/contract_tracker_test.go: `t.Run("before first head incoming, looks up on-chain", func(t *testing.T) { uni := newContractTrackerUni(t) uni.ec.On("HeadByNumber", mock.AnythingOfType("*context.cancelCtx"), (*big.Int)(nil)).Return(&evmtypes.Head{Number: 42}, nil) l, err := uni.tracker.LatestBlockHeight(testutils.Context(t)) require.NoError(t, err) assert.Equal(t, uint64(42), l) })` $DIR/core/services/ocr/contract_tracker_test.go: `uni.ec.On("HeadByNumber", mock.AnythingOfType("*context.cancelCtx"), (*big.Int)(nil)).Return(&evmtypes.Head{Number: 42}, nil)` $DIR/core/services/ocr/contract_tracker_test.go: `t.Run("Before first head incoming, on client error returns error", func(t *testing.T) { uni := newContractTrackerUni(t) uni.ec.On("HeadByNumber", mock.AnythingOfType("*context.cancelCtx"), (*big.Int)(nil)).Return(nil, nil).Once() _, err := uni.tracker.LatestBlockHeight(testutils.Context(t)) assert.EqualError(t, err, "got nil head") uni.ec.On("HeadByNumber", mock.AnythingOfType("*context.cancelCtx"), (*big.Int)(nil)).Return(nil, errors.New("bar")).Once() _, err = uni.tracker.LatestBlockHeight(testutils.Context(t)) assert.EqualError(t, err, "bar") })` $DIR/core/services/ocr/contract_tracker_test.go: `uni.ec.On("HeadByNumber", mock.AnythingOfType("*context.cancelCtx"), (*big.Int)(nil)).Return(nil, nil).Once()` $DIR/core/services/ocr/contract_tracker_test.go: `uni.ec.On("HeadByNumber", mock.AnythingOfType("*context.cancelCtx"), (*big.Int)(nil)).Return(nil, errors.New("bar")).Once()` $DIR/core/services/ocr/contract_tracker_test.go: `_, err = uni.tracker.LatestBlockHeight(testutils.Context(t))` $DIR/core/services/ocr/contract_tracker_test.go: `t.Run("after first head incoming, uses cached value", func(t *testing.T) { uni := newContractTrackerUni(t) uni.tracker.OnNewLongestChain(testutils.Context(t), &evmtypes.Head{Number: 42}) l, err := uni.tracker.LatestBlockHeight(testutils.Context(t)) require.NoError(t, err) assert.Equal(t, uint64(42), l) })` $DIR/core/services/ocr/contract_tracker_test.go: `uni.tracker.OnNewLongestChain(testutils.Context(t), &evmtypes.Head{Number: 42})` $DIR/core/services/ocr/contract_tracker_test.go: `uni.hb.On("Subscribe", uni.tracker).Return(&evmtypes.Head{Number: 42}, func() {})` $DIR/core/services/ocr/contract_tracker_test.go: `uni.db.On("LoadLatestRoundRequested", mock.Anything).Return(offchainaggregator.OffchainAggregatorRoundRequested{}, nil)` $DIR/core/services/ocr/contract_tracker_test.go: `uni.lb.On("Register", uni.tracker, mock.Anything).Return(func() {})` $DIR/core/services/ocr/contract_tracker_test.go: `servicetest.Run(t, uni.tracker)` $DIR/core/services/ocr/contract_tracker_test.go: `t.Run("does not update if contract address doesn't match", func(t *testing.T) { uni := newContractTrackerUni(t) logBroadcast := logmocks.NewBroadcast(t) rawLog := cltest.LogFromFixture(t, "../../testdata/jsonrpc/round_requested_log_1_1.json") logBroadcast.On("RawLog").Return(rawLog).Maybe() logBroadcast.On("String").Return("").Maybe() uni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) configDigest, epoch, round, err := uni.tracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) require.Equal(t, ocrtypes.ConfigDigest{}, configDigest) require.Equal(t, 0, int(round)) require.Equal(t, 0, int(epoch)) uni.tracker.HandleLog(testutils.Context(t), logBroadcast) configDigest, epoch, round, err = uni.tracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) require.Equal(t, ocrtypes.ConfigDigest{}, configDigest) require.Equal(t, 0, int(round)) require.Equal(t, 0, int(epoch)) })` $DIR/core/services/ocr/contract_tracker_test.go: `logBroadcast.On("RawLog").Return(rawLog).Maybe()` $DIR/core/services/ocr/contract_tracker_test.go: `logBroadcast.On("String").Return("").Maybe()` $DIR/core/services/ocr/contract_tracker_test.go: `uni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/ocr/contract_tracker_test.go: `uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/ocr/contract_tracker_test.go: `uni.tracker.HandleLog(testutils.Context(t), logBroadcast)` $DIR/core/services/ocr/contract_tracker_test.go: `configDigest, epoch, round, err = uni.tracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/ocr/contract_tracker_test.go: `t.Run("does nothing if log has already been consumed", func(t *testing.T) { uni := newContractTrackerUni(t, fixtureFilterer, fixtureContract) logBroadcast := logmocks.NewBroadcast(t) logBroadcast.On("String").Return("").Maybe() uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(true, nil) configDigest, epoch, round, err := uni.tracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) require.Equal(t, ocrtypes.ConfigDigest{}, configDigest) require.Equal(t, 0, int(round)) require.Equal(t, 0, int(epoch)) uni.tracker.HandleLog(testutils.Context(t), logBroadcast) configDigest, epoch, round, err = uni.tracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) require.Equal(t, ocrtypes.ConfigDigest{}, configDigest) require.Equal(t, 0, int(round)) require.Equal(t, 0, int(epoch)) })` $DIR/core/services/ocr/contract_tracker_test.go: `logBroadcast.On("String").Return("").Maybe()` $DIR/core/services/ocr/contract_tracker_test.go: `uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(true, nil)` $DIR/core/services/ocr/contract_tracker_test.go: `uni.tracker.HandleLog(testutils.Context(t), logBroadcast)` $DIR/core/services/ocr/contract_tracker_test.go: `configDigest, epoch, round, err = uni.tracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/ocr/contract_tracker_test.go: `t.Run("for new round requested log", func(t *testing.T) { uni := newContractTrackerUni(t, fixtureFilterer, fixtureContract) configDigest, epoch, round, err := uni.tracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) require.Equal(t, ocrtypes.ConfigDigest{}, configDigest) require.Equal(t, 0, int(round)) require.Equal(t, 0, int(epoch)) // Any round supercedes the 0 round rawLog := cltest.LogFromFixture(t, "../../testdata/jsonrpc/round_requested_log_1_1.json") logBroadcast := logmocks.NewBroadcast(t) logBroadcast.On("RawLog").Return(rawLog).Maybe() logBroadcast.On("String").Return("").Maybe() uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) uni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) uni.db.On("SaveLatestRoundRequested", mock.Anything, mock.MatchedBy(func(rr offchainaggregator.OffchainAggregatorRoundRequested) bool { return rr.Epoch == 1 && rr.Round == 1 })).Return(nil) uni.db.On("WithDataSource", mock.Anything).Return(uni.db) uni.tracker.HandleLog(testutils.Context(t), logBroadcast) configDigest, epoch, round, err = uni.tracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) assert.Equal(t, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", configDigest.Hex()) assert.Equal(t, 1, int(epoch)) assert.Equal(t, 1, int(round)) // Same round with higher epoch supercedes rawLog2 := cltest.LogFromFixture(t, "../../testdata/jsonrpc/round_requested_log_1_9.json") logBroadcast2 := logmocks.NewBroadcast(t) logBroadcast2.On("RawLog").Return(rawLog2) logBroadcast2.On("String").Return("").Maybe() uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) uni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) uni.db.On("SaveLatestRoundRequested", mock.Anything, mock.MatchedBy(func(rr offchainaggregator.OffchainAggregatorRoundRequested) bool { return rr.Epoch == 1 && rr.Round == 9 })).Return(nil) uni.tracker.HandleLog(testutils.Context(t), logBroadcast2) configDigest, epoch, round, err = uni.tracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) assert.Equal(t, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", configDigest.Hex()) assert.Equal(t, 1, int(epoch)) assert.Equal(t, 9, int(round)) // Same round with lower epoch is ignored uni.tracker.HandleLog(testutils.Context(t), logBroadcast) configDigest, epoch, round, err = uni.tracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) assert.Equal(t, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", configDigest.Hex()) assert.Equal(t, 1, int(epoch)) assert.Equal(t, 9, int(round)) // Higher epoch with lower round supercedes rawLog3 := cltest.LogFromFixture(t, "../../testdata/jsonrpc/round_requested_log_2_1.json") logBroadcast3 := logmocks.NewBroadcast(t) logBroadcast3.On("RawLog").Return(rawLog3).Maybe() logBroadcast3.On("String").Return("").Maybe() uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) uni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) uni.db.On("SaveLatestRoundRequested", mock.Anything, mock.MatchedBy(func(rr offchainaggregator.OffchainAggregatorRoundRequested) bool { return rr.Epoch == 2 && rr.Round == 1 })).Return(nil) uni.tracker.HandleLog(testutils.Context(t), logBroadcast3) configDigest, epoch, round, err = uni.tracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) assert.Equal(t, "cccccccccccccccccccccccccccccccc", configDigest.Hex()) assert.Equal(t, 2, int(epoch)) assert.Equal(t, 1, int(round)) })` $DIR/core/services/ocr/contract_tracker_test.go: `logBroadcast.On("RawLog").Return(rawLog).Maybe()` $DIR/core/services/ocr/contract_tracker_test.go: `logBroadcast.On("String").Return("").Maybe()` $DIR/core/services/ocr/contract_tracker_test.go: `uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/ocr/contract_tracker_test.go: `uni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/ocr/contract_tracker_test.go: `uni.db.On("SaveLatestRoundRequested", mock.Anything, mock.MatchedBy(func(rr offchainaggregator.OffchainAggregatorRoundRequested) bool { return rr.Epoch == 1 && rr.Round == 1 })).Return(nil)` $DIR/core/services/ocr/contract_tracker_test.go: `uni.db.On("WithDataSource", mock.Anything).Return(uni.db)` $DIR/core/services/ocr/contract_tracker_test.go: `uni.tracker.HandleLog(testutils.Context(t), logBroadcast)` $DIR/core/services/ocr/contract_tracker_test.go: `configDigest, epoch, round, err = uni.tracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/ocr/contract_tracker_test.go: `logBroadcast2.On("RawLog").Return(rawLog2)` $DIR/core/services/ocr/contract_tracker_test.go: `logBroadcast2.On("String").Return("").Maybe()` $DIR/core/services/ocr/contract_tracker_test.go: `uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/ocr/contract_tracker_test.go: `uni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/ocr/contract_tracker_test.go: `uni.db.On("SaveLatestRoundRequested", mock.Anything, mock.MatchedBy(func(rr offchainaggregator.OffchainAggregatorRoundRequested) bool { return rr.Epoch == 1 && rr.Round == 9 })).Return(nil)` $DIR/core/services/ocr/contract_tracker_test.go: `uni.tracker.HandleLog(testutils.Context(t), logBroadcast2)` $DIR/core/services/ocr/contract_tracker_test.go: `configDigest, epoch, round, err = uni.tracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/ocr/contract_tracker_test.go: `uni.tracker.HandleLog(testutils.Context(t), logBroadcast)` $DIR/core/services/ocr/contract_tracker_test.go: `configDigest, epoch, round, err = uni.tracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/ocr/contract_tracker_test.go: `logBroadcast3.On("RawLog").Return(rawLog3).Maybe()` $DIR/core/services/ocr/contract_tracker_test.go: `logBroadcast3.On("String").Return("").Maybe()` $DIR/core/services/ocr/contract_tracker_test.go: `uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/ocr/contract_tracker_test.go: `uni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/ocr/contract_tracker_test.go: `uni.db.On("SaveLatestRoundRequested", mock.Anything, mock.MatchedBy(func(rr offchainaggregator.OffchainAggregatorRoundRequested) bool { return rr.Epoch == 2 && rr.Round == 1 })).Return(nil)` $DIR/core/services/ocr/contract_tracker_test.go: `uni.tracker.HandleLog(testutils.Context(t), logBroadcast3)` $DIR/core/services/ocr/contract_tracker_test.go: `configDigest, epoch, round, err = uni.tracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/ocr/contract_tracker_test.go: `t.Run("does not mark consumed or update state if latest round fails to save", func(t *testing.T) { uni := newContractTrackerUni(t, fixtureFilterer, fixtureContract) rawLog := cltest.LogFromFixture(t, "../../testdata/jsonrpc/round_requested_log_1_1.json") logBroadcast := logmocks.NewBroadcast(t) logBroadcast.On("RawLog").Return(rawLog) logBroadcast.On("String").Return("").Maybe() uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) uni.db.On("SaveLatestRoundRequested", mock.Anything, mock.Anything).Return(errors.New("something exploded")) uni.db.On("WithDataSource", mock.Anything).Return(uni.db) uni.tracker.HandleLog(testutils.Context(t), logBroadcast) configDigest, epoch, round, err := uni.tracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) require.Equal(t, ocrtypes.ConfigDigest{}, configDigest) require.Equal(t, 0, int(round)) require.Equal(t, 0, int(epoch)) })` $DIR/core/services/ocr/contract_tracker_test.go: `logBroadcast.On("RawLog").Return(rawLog)` $DIR/core/services/ocr/contract_tracker_test.go: `logBroadcast.On("String").Return("").Maybe()` $DIR/core/services/ocr/contract_tracker_test.go: `uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/ocr/contract_tracker_test.go: `uni.db.On("SaveLatestRoundRequested", mock.Anything, mock.Anything).Return(errors.New("something exploded"))` $DIR/core/services/ocr/contract_tracker_test.go: `uni.db.On("WithDataSource", mock.Anything).Return(uni.db)` $DIR/core/services/ocr/contract_tracker_test.go: `uni.tracker.HandleLog(testutils.Context(t), logBroadcast)` $DIR/core/services/ocr/contract_tracker_test.go: `uni.lb.On("Register", uni.tracker, mock.Anything).Return(func() { eventuallyCloseLogBroadcaster.ItHappened() })` $DIR/core/services/ocr/contract_tracker_test.go: `eventuallyCloseLogBroadcaster.ItHappened()` $DIR/core/services/ocr/contract_tracker_test.go: `uni.lb.On("IsConnected").Return(true).Maybe()` $DIR/core/services/ocr/contract_tracker_test.go: `uni.hb.On("Subscribe", uni.tracker).Return((*evmtypes.Head)(nil), func() { eventuallyCloseHeadBroadcaster.ItHappened() })` $DIR/core/services/ocr/contract_tracker_test.go: `eventuallyCloseHeadBroadcaster.ItHappened()` $DIR/core/services/ocr/contract_tracker_test.go: `uni.db.On("LoadLatestRoundRequested", mock.Anything).Return(rr, nil)` $DIR/core/services/ocr/contract_tracker_test.go: `eventuallyCloseHeadBroadcaster.AssertHappened(t, true)` $DIR/core/services/ocr/contract_tracker_test.go: `eventuallyCloseLogBroadcaster.AssertHappened(t, true)` $DIR/core/services/ocr/contract_tracker_test.go: `t.Run(test.name, func(t *testing.T) { res := ocr.IsLaterThan(test.incoming, test.existing) assert.Equal(t, test.expected, res) })` $DIR/core/services/ocr/contract_tracker_test.go: `.Run("before first head incoming, looks up on-chain", func(t *testing.T) { uni := newContractTrackerUni(t) uni.ec.On("HeadByNumber", mock.AnythingOfType("*context.cancelCtx"), (*big.Int)(nil)).Return(&evmtypes.Head{Number: 42}, nil) l, err := uni.tracker.LatestBlockHeight(testutils.Context(t)) require.NoError(t, err) assert.Equal(t, uint64(42), l) })` $DIR/core/services/ocr/contract_tracker_test.go: `.ec.On("HeadByNumber", mock.AnythingOfType("*context.cancelCtx"), (*big.Int)(nil))` $DIR/core/services/ocr/contract_tracker_test.go: `.AnythingOfType("*context.cancelCtx")` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(&evmtypes.Head{Number: 42}, nil)` $DIR/core/services/ocr/contract_tracker_test.go: `.tracker.LatestBlockHeight(testutils.Context(t))` $DIR/core/services/ocr/contract_tracker_test.go: `.Context(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.Run("Before first head incoming, on client error returns error", func(t *testing.T) { uni := newContractTrackerUni(t) uni.ec.On("HeadByNumber", mock.AnythingOfType("*context.cancelCtx"), (*big.Int)(nil)).Return(nil, nil).Once() _, err := uni.tracker.LatestBlockHeight(testutils.Context(t)) assert.EqualError(t, err, "got nil head") uni.ec.On("HeadByNumber", mock.AnythingOfType("*context.cancelCtx"), (*big.Int)(nil)).Return(nil, errors.New("bar")).Once() _, err = uni.tracker.LatestBlockHeight(testutils.Context(t)) assert.EqualError(t, err, "bar") })` $DIR/core/services/ocr/contract_tracker_test.go: `.ec.On("HeadByNumber", mock.AnythingOfType("*context.cancelCtx"), (*big.Int)(nil))` $DIR/core/services/ocr/contract_tracker_test.go: `.AnythingOfType("*context.cancelCtx")` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(nil, nil)` $DIR/core/services/ocr/contract_tracker_test.go: `.Once()` $DIR/core/services/ocr/contract_tracker_test.go: `.tracker.LatestBlockHeight(testutils.Context(t))` $DIR/core/services/ocr/contract_tracker_test.go: `.Context(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.ec.On("HeadByNumber", mock.AnythingOfType("*context.cancelCtx"), (*big.Int)(nil))` $DIR/core/services/ocr/contract_tracker_test.go: `.AnythingOfType("*context.cancelCtx")` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(nil, errors.New("bar"))` $DIR/core/services/ocr/contract_tracker_test.go: `.New("bar")` $DIR/core/services/ocr/contract_tracker_test.go: `.Once()` $DIR/core/services/ocr/contract_tracker_test.go: `.tracker.LatestBlockHeight(testutils.Context(t))` $DIR/core/services/ocr/contract_tracker_test.go: `.Context(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.Run("after first head incoming, uses cached value", func(t *testing.T) { uni := newContractTrackerUni(t) uni.tracker.OnNewLongestChain(testutils.Context(t), &evmtypes.Head{Number: 42}) l, err := uni.tracker.LatestBlockHeight(testutils.Context(t)) require.NoError(t, err) assert.Equal(t, uint64(42), l) })` $DIR/core/services/ocr/contract_tracker_test.go: `.tracker.OnNewLongestChain(testutils.Context(t), &evmtypes.Head{Number: 42})` $DIR/core/services/ocr/contract_tracker_test.go: `.Context(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.tracker.LatestBlockHeight(testutils.Context(t))` $DIR/core/services/ocr/contract_tracker_test.go: `.Context(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.hb.On("Subscribe", uni.tracker)` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(&evmtypes.Head{Number: 42}, func() {})` $DIR/core/services/ocr/contract_tracker_test.go: `.db.On("LoadLatestRoundRequested", mock.Anything)` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(offchainaggregator.OffchainAggregatorRoundRequested{}, nil)` $DIR/core/services/ocr/contract_tracker_test.go: `.lb.On("Register", uni.tracker, mock.Anything)` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(func() {})` $DIR/core/services/ocr/contract_tracker_test.go: `.Run(t, uni.tracker)` $DIR/core/services/ocr/contract_tracker_test.go: `.tracker.LatestBlockHeight(testutils.Context(t))` $DIR/core/services/ocr/contract_tracker_test.go: `.Context(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.HexToAddress("0x03bd0d5d39629423979f8a0e53dbce78c1791ebf")` $DIR/core/services/ocr/contract_tracker_test.go: `.Run("does not update if contract address doesn't match", func(t *testing.T) { uni := newContractTrackerUni(t) logBroadcast := logmocks.NewBroadcast(t) rawLog := cltest.LogFromFixture(t, "../../testdata/jsonrpc/round_requested_log_1_1.json") logBroadcast.On("RawLog").Return(rawLog).Maybe() logBroadcast.On("String").Return("").Maybe() uni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) configDigest, epoch, round, err := uni.tracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) require.Equal(t, ocrtypes.ConfigDigest{}, configDigest) require.Equal(t, 0, int(round)) require.Equal(t, 0, int(epoch)) uni.tracker.HandleLog(testutils.Context(t), logBroadcast) configDigest, epoch, round, err = uni.tracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) require.Equal(t, ocrtypes.ConfigDigest{}, configDigest) require.Equal(t, 0, int(round)) require.Equal(t, 0, int(epoch)) })` $DIR/core/services/ocr/contract_tracker_test.go: `.NewBroadcast(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.LogFromFixture(t, "../../testdata/jsonrpc/round_requested_log_1_1.json")` $DIR/core/services/ocr/contract_tracker_test.go: `.On("RawLog")` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(rawLog)` $DIR/core/services/ocr/contract_tracker_test.go: `.Maybe()` $DIR/core/services/ocr/contract_tracker_test.go: `.On("String")` $DIR/core/services/ocr/contract_tracker_test.go: `.Return("")` $DIR/core/services/ocr/contract_tracker_test.go: `.Maybe()` $DIR/core/services/ocr/contract_tracker_test.go: `.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(nil)` $DIR/core/services/ocr/contract_tracker_test.go: `.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(false, nil)` $DIR/core/services/ocr/contract_tracker_test.go: `.tracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/ocr/contract_tracker_test.go: `.Context(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.tracker.HandleLog(testutils.Context(t), logBroadcast)` $DIR/core/services/ocr/contract_tracker_test.go: `.Context(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.tracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/ocr/contract_tracker_test.go: `.Context(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.Run("does nothing if log has already been consumed", func(t *testing.T) { uni := newContractTrackerUni(t, fixtureFilterer, fixtureContract) logBroadcast := logmocks.NewBroadcast(t) logBroadcast.On("String").Return("").Maybe() uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(true, nil) configDigest, epoch, round, err := uni.tracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) require.Equal(t, ocrtypes.ConfigDigest{}, configDigest) require.Equal(t, 0, int(round)) require.Equal(t, 0, int(epoch)) uni.tracker.HandleLog(testutils.Context(t), logBroadcast) configDigest, epoch, round, err = uni.tracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) require.Equal(t, ocrtypes.ConfigDigest{}, configDigest) require.Equal(t, 0, int(round)) require.Equal(t, 0, int(epoch)) })` $DIR/core/services/ocr/contract_tracker_test.go: `.NewBroadcast(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.On("String")` $DIR/core/services/ocr/contract_tracker_test.go: `.Return("")` $DIR/core/services/ocr/contract_tracker_test.go: `.Maybe()` $DIR/core/services/ocr/contract_tracker_test.go: `.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(true, nil)` $DIR/core/services/ocr/contract_tracker_test.go: `.tracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/ocr/contract_tracker_test.go: `.Context(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.tracker.HandleLog(testutils.Context(t), logBroadcast)` $DIR/core/services/ocr/contract_tracker_test.go: `.Context(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.tracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/ocr/contract_tracker_test.go: `.Context(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.Run("for new round requested log", func(t *testing.T) { uni := newContractTrackerUni(t, fixtureFilterer, fixtureContract) configDigest, epoch, round, err := uni.tracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) require.Equal(t, ocrtypes.ConfigDigest{}, configDigest) require.Equal(t, 0, int(round)) require.Equal(t, 0, int(epoch)) // Any round supercedes the 0 round rawLog := cltest.LogFromFixture(t, "../../testdata/jsonrpc/round_requested_log_1_1.json") logBroadcast := logmocks.NewBroadcast(t) logBroadcast.On("RawLog").Return(rawLog).Maybe() logBroadcast.On("String").Return("").Maybe() uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) uni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) uni.db.On("SaveLatestRoundRequested", mock.Anything, mock.MatchedBy(func(rr offchainaggregator.OffchainAggregatorRoundRequested) bool { return rr.Epoch == 1 && rr.Round == 1 })).Return(nil) uni.db.On("WithDataSource", mock.Anything).Return(uni.db) uni.tracker.HandleLog(testutils.Context(t), logBroadcast) configDigest, epoch, round, err = uni.tracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) assert.Equal(t, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", configDigest.Hex()) assert.Equal(t, 1, int(epoch)) assert.Equal(t, 1, int(round)) // Same round with higher epoch supercedes rawLog2 := cltest.LogFromFixture(t, "../../testdata/jsonrpc/round_requested_log_1_9.json") logBroadcast2 := logmocks.NewBroadcast(t) logBroadcast2.On("RawLog").Return(rawLog2) logBroadcast2.On("String").Return("").Maybe() uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) uni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) uni.db.On("SaveLatestRoundRequested", mock.Anything, mock.MatchedBy(func(rr offchainaggregator.OffchainAggregatorRoundRequested) bool { return rr.Epoch == 1 && rr.Round == 9 })).Return(nil) uni.tracker.HandleLog(testutils.Context(t), logBroadcast2) configDigest, epoch, round, err = uni.tracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) assert.Equal(t, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", configDigest.Hex()) assert.Equal(t, 1, int(epoch)) assert.Equal(t, 9, int(round)) // Same round with lower epoch is ignored uni.tracker.HandleLog(testutils.Context(t), logBroadcast) configDigest, epoch, round, err = uni.tracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) assert.Equal(t, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", configDigest.Hex()) assert.Equal(t, 1, int(epoch)) assert.Equal(t, 9, int(round)) // Higher epoch with lower round supercedes rawLog3 := cltest.LogFromFixture(t, "../../testdata/jsonrpc/round_requested_log_2_1.json") logBroadcast3 := logmocks.NewBroadcast(t) logBroadcast3.On("RawLog").Return(rawLog3).Maybe() logBroadcast3.On("String").Return("").Maybe() uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) uni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) uni.db.On("SaveLatestRoundRequested", mock.Anything, mock.MatchedBy(func(rr offchainaggregator.OffchainAggregatorRoundRequested) bool { return rr.Epoch == 2 && rr.Round == 1 })).Return(nil) uni.tracker.HandleLog(testutils.Context(t), logBroadcast3) configDigest, epoch, round, err = uni.tracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) assert.Equal(t, "cccccccccccccccccccccccccccccccc", configDigest.Hex()) assert.Equal(t, 2, int(epoch)) assert.Equal(t, 1, int(round)) })` $DIR/core/services/ocr/contract_tracker_test.go: `.tracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/ocr/contract_tracker_test.go: `.Context(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.LogFromFixture(t, "../../testdata/jsonrpc/round_requested_log_1_1.json")` $DIR/core/services/ocr/contract_tracker_test.go: `.NewBroadcast(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.On("RawLog")` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(rawLog)` $DIR/core/services/ocr/contract_tracker_test.go: `.Maybe()` $DIR/core/services/ocr/contract_tracker_test.go: `.On("String")` $DIR/core/services/ocr/contract_tracker_test.go: `.Return("")` $DIR/core/services/ocr/contract_tracker_test.go: `.Maybe()` $DIR/core/services/ocr/contract_tracker_test.go: `.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(false, nil)` $DIR/core/services/ocr/contract_tracker_test.go: `.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(nil)` $DIR/core/services/ocr/contract_tracker_test.go: `.db.On("SaveLatestRoundRequested", mock.Anything, mock.MatchedBy(func(rr offchainaggregator.OffchainAggregatorRoundRequested) bool { return rr.Epoch == 1 && rr.Round == 1 }))` $DIR/core/services/ocr/contract_tracker_test.go: `.MatchedBy(func(rr offchainaggregator.OffchainAggregatorRoundRequested) bool { return rr.Epoch == 1 && rr.Round == 1 })` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(nil)` $DIR/core/services/ocr/contract_tracker_test.go: `.db.On("WithDataSource", mock.Anything)` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(uni.db)` $DIR/core/services/ocr/contract_tracker_test.go: `.tracker.HandleLog(testutils.Context(t), logBroadcast)` $DIR/core/services/ocr/contract_tracker_test.go: `.Context(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.tracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/ocr/contract_tracker_test.go: `.Context(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.LogFromFixture(t, "../../testdata/jsonrpc/round_requested_log_1_9.json")` $DIR/core/services/ocr/contract_tracker_test.go: `.NewBroadcast(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.On("RawLog")` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(rawLog2)` $DIR/core/services/ocr/contract_tracker_test.go: `.On("String")` $DIR/core/services/ocr/contract_tracker_test.go: `.Return("")` $DIR/core/services/ocr/contract_tracker_test.go: `.Maybe()` $DIR/core/services/ocr/contract_tracker_test.go: `.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(false, nil)` $DIR/core/services/ocr/contract_tracker_test.go: `.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(nil)` $DIR/core/services/ocr/contract_tracker_test.go: `.db.On("SaveLatestRoundRequested", mock.Anything, mock.MatchedBy(func(rr offchainaggregator.OffchainAggregatorRoundRequested) bool { return rr.Epoch == 1 && rr.Round == 9 }))` $DIR/core/services/ocr/contract_tracker_test.go: `.MatchedBy(func(rr offchainaggregator.OffchainAggregatorRoundRequested) bool { return rr.Epoch == 1 && rr.Round == 9 })` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(nil)` $DIR/core/services/ocr/contract_tracker_test.go: `.tracker.HandleLog(testutils.Context(t), logBroadcast2)` $DIR/core/services/ocr/contract_tracker_test.go: `.Context(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.tracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/ocr/contract_tracker_test.go: `.Context(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.tracker.HandleLog(testutils.Context(t), logBroadcast)` $DIR/core/services/ocr/contract_tracker_test.go: `.Context(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.tracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/ocr/contract_tracker_test.go: `.Context(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.LogFromFixture(t, "../../testdata/jsonrpc/round_requested_log_2_1.json")` $DIR/core/services/ocr/contract_tracker_test.go: `.NewBroadcast(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.On("RawLog")` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(rawLog3)` $DIR/core/services/ocr/contract_tracker_test.go: `.Maybe()` $DIR/core/services/ocr/contract_tracker_test.go: `.On("String")` $DIR/core/services/ocr/contract_tracker_test.go: `.Return("")` $DIR/core/services/ocr/contract_tracker_test.go: `.Maybe()` $DIR/core/services/ocr/contract_tracker_test.go: `.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(false, nil)` $DIR/core/services/ocr/contract_tracker_test.go: `.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(nil)` $DIR/core/services/ocr/contract_tracker_test.go: `.db.On("SaveLatestRoundRequested", mock.Anything, mock.MatchedBy(func(rr offchainaggregator.OffchainAggregatorRoundRequested) bool { return rr.Epoch == 2 && rr.Round == 1 }))` $DIR/core/services/ocr/contract_tracker_test.go: `.MatchedBy(func(rr offchainaggregator.OffchainAggregatorRoundRequested) bool { return rr.Epoch == 2 && rr.Round == 1 })` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(nil)` $DIR/core/services/ocr/contract_tracker_test.go: `.tracker.HandleLog(testutils.Context(t), logBroadcast3)` $DIR/core/services/ocr/contract_tracker_test.go: `.Context(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.tracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/ocr/contract_tracker_test.go: `.Context(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.Run("does not mark consumed or update state if latest round fails to save", func(t *testing.T) { uni := newContractTrackerUni(t, fixtureFilterer, fixtureContract) rawLog := cltest.LogFromFixture(t, "../../testdata/jsonrpc/round_requested_log_1_1.json") logBroadcast := logmocks.NewBroadcast(t) logBroadcast.On("RawLog").Return(rawLog) logBroadcast.On("String").Return("").Maybe() uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) uni.db.On("SaveLatestRoundRequested", mock.Anything, mock.Anything).Return(errors.New("something exploded")) uni.db.On("WithDataSource", mock.Anything).Return(uni.db) uni.tracker.HandleLog(testutils.Context(t), logBroadcast) configDigest, epoch, round, err := uni.tracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) require.Equal(t, ocrtypes.ConfigDigest{}, configDigest) require.Equal(t, 0, int(round)) require.Equal(t, 0, int(epoch)) })` $DIR/core/services/ocr/contract_tracker_test.go: `.LogFromFixture(t, "../../testdata/jsonrpc/round_requested_log_1_1.json")` $DIR/core/services/ocr/contract_tracker_test.go: `.NewBroadcast(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.On("RawLog")` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(rawLog)` $DIR/core/services/ocr/contract_tracker_test.go: `.On("String")` $DIR/core/services/ocr/contract_tracker_test.go: `.Return("")` $DIR/core/services/ocr/contract_tracker_test.go: `.Maybe()` $DIR/core/services/ocr/contract_tracker_test.go: `.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(false, nil)` $DIR/core/services/ocr/contract_tracker_test.go: `.db.On("SaveLatestRoundRequested", mock.Anything, mock.Anything)` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(errors.New("something exploded"))` $DIR/core/services/ocr/contract_tracker_test.go: `.New("something exploded")` $DIR/core/services/ocr/contract_tracker_test.go: `.db.On("WithDataSource", mock.Anything)` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(uni.db)` $DIR/core/services/ocr/contract_tracker_test.go: `.tracker.HandleLog(testutils.Context(t), logBroadcast)` $DIR/core/services/ocr/contract_tracker_test.go: `.Context(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.tracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/ocr/contract_tracker_test.go: `.Context(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.LogFromFixture(t, "../../testdata/jsonrpc/round_requested_log_1_1.json")` $DIR/core/services/ocr/contract_tracker_test.go: `.NewAddress()` $DIR/core/services/ocr/contract_tracker_test.go: `.MakeConfigDigest(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.NewAwaiter()` $DIR/core/services/ocr/contract_tracker_test.go: `.lb.On("Register", uni.tracker, mock.Anything)` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(func() { eventuallyCloseLogBroadcaster.ItHappened() })` $DIR/core/services/ocr/contract_tracker_test.go: `.ItHappened()` $DIR/core/services/ocr/contract_tracker_test.go: `.lb.On("IsConnected")` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(true)` $DIR/core/services/ocr/contract_tracker_test.go: `.Maybe()` $DIR/core/services/ocr/contract_tracker_test.go: `.NewAwaiter()` $DIR/core/services/ocr/contract_tracker_test.go: `.hb.On("Subscribe", uni.tracker)` $DIR/core/services/ocr/contract_tracker_test.go: `.Return((*evmtypes.Head)(nil), func() { eventuallyCloseHeadBroadcaster.ItHappened() })` $DIR/core/services/ocr/contract_tracker_test.go: `.ItHappened()` $DIR/core/services/ocr/contract_tracker_test.go: `.db.On("LoadLatestRoundRequested", mock.Anything)` $DIR/core/services/ocr/contract_tracker_test.go: `.Return(rr, nil)` $DIR/core/services/ocr/contract_tracker_test.go: `.tracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/ocr/contract_tracker_test.go: `.Context(t)` $DIR/core/services/ocr/contract_tracker_test.go: `.AssertHappened(t, true)` $DIR/core/services/ocr/contract_tracker_test.go: `.AssertHappened(t, true)` $DIR/core/services/ocr/contract_tracker_test.go: `.Run(test.name, func(t *testing.T) { res := ocr.IsLaterThan(test.incoming, test.existing) assert.Equal(t, test.expected, res) })` $DIR/core/services/ocr/contract_tracker_test.go: `.IsLaterThan(test.incoming, test.existing)` $DIR/core/services/ocr/contract_transmitter_test.go: `.NewInt(42)` $DIR/core/services/ocr/contract_transmitter_test.go: `.JSON(strings.NewReader(offchainaggregator.OffchainAggregatorABI))` $DIR/core/services/ocr/contract_transmitter_test.go: `.NewReader(offchainaggregator.OffchainAggregatorABI)` $DIR/core/services/ocr/contract_transmitter_test.go: `.NewOCRContractTransmitter( testutils.NewAddress(), nil, contractABI, nil, nil, nil, chainID, common.Address{}, )` $DIR/core/services/ocr/contract_transmitter_test.go: `.NewAddress()` $DIR/core/services/ocr/contract_transmitter_test.go: `.ChainID()` $DIR/core/services/ocr/database_test.go: `t.Run("reads and writes state", func(t *testing.T) { t.Log("creating DB") odb := ocr.NewTestDB(t, db, spec.ID) state := ocrtypes.PersistentState{ Epoch: 1, HighestSentEpoch: 2, HighestReceivedEpoch: []uint32{3}, } err := odb.WriteState(testutils.Context(t), configDigest, state) require.NoError(t, err) readState, err := odb.ReadState(testutils.Context(t), configDigest) require.NoError(t, err) require.Equal(t, state, *readState) })` $DIR/core/services/ocr/database_test.go: `t.Run("updates state", func(t *testing.T) { odb := ocr.NewTestDB(t, db, spec.ID) newState := ocrtypes.PersistentState{ Epoch: 2, HighestSentEpoch: 3, HighestReceivedEpoch: []uint32{4, 5}, } err := odb.WriteState(testutils.Context(t), configDigest, newState) require.NoError(t, err) readState, err := odb.ReadState(testutils.Context(t), configDigest) require.NoError(t, err) require.Equal(t, newState, *readState) })` $DIR/core/services/ocr/database_test.go: `t.Run("does not return result for wrong spec", func(t *testing.T) { odb := ocr.NewTestDB(t, db, spec.ID) state := ocrtypes.PersistentState{ Epoch: 3, HighestSentEpoch: 4, HighestReceivedEpoch: []uint32{5, 6}, } err := odb.WriteState(testutils.Context(t), configDigest, state) require.NoError(t, err) // db with different spec odb = ocr.NewTestDB(t, db, -1) readState, err := odb.ReadState(testutils.Context(t), configDigest) require.NoError(t, err) require.Nil(t, readState) })` $DIR/core/services/ocr/database_test.go: `odb = ocr.NewTestDB(t, db, -1)` $DIR/core/services/ocr/database_test.go: `t.Run("reads and writes config", func(t *testing.T) { db := ocr.NewTestDB(t, sqlDB, spec.ID) err := db.WriteConfig(testutils.Context(t), config) require.NoError(t, err) readConfig, err := db.ReadConfig(testutils.Context(t)) require.NoError(t, err) require.Equal(t, &config, readConfig) })` $DIR/core/services/ocr/database_test.go: `t.Run("updates config", func(t *testing.T) { db := ocr.NewTestDB(t, sqlDB, spec.ID) newConfig := ocrtypes.ContractConfig{ ConfigDigest: cltest.MakeConfigDigest(t), Signers: []common.Address{utils.ZeroAddress, transmitterAddress, testutils.NewAddress()}, Transmitters: []common.Address{utils.ZeroAddress, transmitterAddress, testutils.NewAddress()}, Threshold: uint8(36), EncodedConfigVersion: uint64(987655), Encoded: []byte{2, 3, 4, 5, 6}, } err := db.WriteConfig(testutils.Context(t), newConfig) require.NoError(t, err) readConfig, err := db.ReadConfig(testutils.Context(t)) require.NoError(t, err) require.Equal(t, &newConfig, readConfig) })` $DIR/core/services/ocr/database_test.go: `db = ocr.NewTestDB(t, sqlDB, -1)` $DIR/core/services/ocr/database_test.go: `t.Run("stores and retrieves pending transmissions", func(t *testing.T) { p := ocrtypes.PendingTransmission{ Time: time.Now(), Median: ocrtypes.Observation(big.NewInt(41)), SerializedReport: []byte{0, 2, 3}, Rs: [][32]byte{testutils.Random32Byte(), testutils.Random32Byte()}, Ss: [][32]byte{testutils.Random32Byte(), testutils.Random32Byte()}, Vs: testutils.Random32Byte(), } err := odb.StorePendingTransmission(testutils.Context(t), k, p) require.NoError(t, err) m, err := odb.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) assertPendingTransmissionEqual(t, m[k], p) // Now overwrite value for k to prove that updating works p = ocrtypes.PendingTransmission{ Time: time.Now(), Median: ocrtypes.Observation(big.NewInt(42)), SerializedReport: []byte{1, 2, 3}, Rs: [][32]byte{testutils.Random32Byte()}, Ss: [][32]byte{testutils.Random32Byte()}, Vs: testutils.Random32Byte(), } err = odb.StorePendingTransmission(testutils.Context(t), k, p) require.NoError(t, err) m, err = odb.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) assertPendingTransmissionEqual(t, m[k], p) p2 := ocrtypes.PendingTransmission{ Time: time.Now(), Median: ocrtypes.Observation(big.NewInt(43)), SerializedReport: []byte{2, 2, 3}, Rs: [][32]byte{testutils.Random32Byte()}, Ss: [][32]byte{testutils.Random32Byte()}, Vs: testutils.Random32Byte(), } err = odb.StorePendingTransmission(testutils.Context(t), k2, p2) require.NoError(t, err) kRedHerring := ocrtypes.ReportTimestamp{ ConfigDigest: ocrtypes.ConfigDigest{43}, Epoch: 1, Round: 2, } pRedHerring := ocrtypes.PendingTransmission{ Time: time.Now(), Median: ocrtypes.Observation(big.NewInt(43)), SerializedReport: []byte{3, 2, 3}, Rs: [][32]byte{testutils.Random32Byte()}, Ss: [][32]byte{testutils.Random32Byte()}, Vs: testutils.Random32Byte(), } err = odb.StorePendingTransmission(testutils.Context(t), kRedHerring, pRedHerring) require.NoError(t, err) m, err = odb.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) require.Len(t, m, 2) // HACK to get around time equality because otherwise its annoying (time storage into postgres is mildly lossy) require.Equal(t, p.Time.Unix(), m[k].Time.Unix()) require.Equal(t, p2.Time.Unix(), m[k2].Time.Unix()) var zt time.Time p.Time, p2.Time = zt, zt for k, v := range m { v.Time = zt m[k] = v } require.Equal(t, p, m[k]) require.Equal(t, p2, m[k2]) // No keys for this oracleSpecID yet m, err = odb2.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) require.Len(t, m, 0) })` $DIR/core/services/ocr/database_test.go: `assertPendingTransmissionEqual(t, m[k], p)` $DIR/core/services/ocr/database_test.go: `p = ocrtypes.PendingTransmission{ Time: time.Now(), Median: ocrtypes.Observation(big.NewInt(42)), SerializedReport: []byte{1, 2, 3}, Rs: [][32]byte{testutils.Random32Byte()}, Ss: [][32]byte{testutils.Random32Byte()}, Vs: testutils.Random32Byte(), }` $DIR/core/services/ocr/database_test.go: `err = odb.StorePendingTransmission(testutils.Context(t), k, p)` $DIR/core/services/ocr/database_test.go: `m, err = odb.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr/database_test.go: `assertPendingTransmissionEqual(t, m[k], p)` $DIR/core/services/ocr/database_test.go: `err = odb.StorePendingTransmission(testutils.Context(t), k2, p2)` $DIR/core/services/ocr/database_test.go: `err = odb.StorePendingTransmission(testutils.Context(t), kRedHerring, pRedHerring)` $DIR/core/services/ocr/database_test.go: `m, err = odb.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr/database_test.go: `p.Time, p2.Time = zt, zt` $DIR/core/services/ocr/database_test.go: `v.Time = zt` $DIR/core/services/ocr/database_test.go: `m[k] = v` $DIR/core/services/ocr/database_test.go: `m, err = odb2.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr/database_test.go: `t.Run("deletes pending transmission by key", func(t *testing.T) { p := ocrtypes.PendingTransmission{ Time: time.Unix(100, 0), Median: ocrtypes.Observation(big.NewInt(44)), SerializedReport: []byte{1, 4, 3}, Rs: [][32]byte{testutils.Random32Byte()}, Ss: [][32]byte{testutils.Random32Byte()}, Vs: testutils.Random32Byte(), } err := odb.StorePendingTransmission(testutils.Context(t), k, p) require.NoError(t, err) err = odb2.StorePendingTransmission(testutils.Context(t), k, p) require.NoError(t, err) err = odb.DeletePendingTransmission(testutils.Context(t), k) require.NoError(t, err) m, err := odb.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) require.Len(t, m, 1) // Did not affect other oracleSpecID m, err = odb2.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) require.Len(t, m, 1) })` $DIR/core/services/ocr/database_test.go: `err = odb2.StorePendingTransmission(testutils.Context(t), k, p)` $DIR/core/services/ocr/database_test.go: `err = odb.DeletePendingTransmission(testutils.Context(t), k)` $DIR/core/services/ocr/database_test.go: `m, err = odb2.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr/database_test.go: `t.Run("allows multiple duplicate keys for different spec ID", func(t *testing.T) { p := ocrtypes.PendingTransmission{ Time: time.Unix(100, 0), Median: ocrtypes.Observation(big.NewInt(44)), SerializedReport: []byte{1, 4, 3}, Rs: [][32]byte{testutils.Random32Byte()}, Ss: [][32]byte{testutils.Random32Byte()}, Vs: testutils.Random32Byte(), } err := odb.StorePendingTransmission(testutils.Context(t), k2, p) require.NoError(t, err) m, err := odb.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) require.Len(t, m, 1) require.Equal(t, p.Median, m[k2].Median) })` $DIR/core/services/ocr/database_test.go: `err = odb.StorePendingTransmission(testutils.Context(t), k2, p2)` $DIR/core/services/ocr/database_test.go: `p2 = ocrtypes.PendingTransmission{ Time: time.Now(), Median: ocrtypes.Observation(big.NewInt(43)), SerializedReport: []byte{2, 2, 3}, Rs: [][32]byte{testutils.Random32Byte()}, Ss: [][32]byte{testutils.Random32Byte()}, Vs: testutils.Random32Byte(), }` $DIR/core/services/ocr/database_test.go: `err = odb.StorePendingTransmission(testutils.Context(t), k2, p2)` $DIR/core/services/ocr/database_test.go: `err = odb.DeletePendingTransmissionsOlderThan(testutils.Context(t), time.Unix(900, 0))` $DIR/core/services/ocr/database_test.go: `odb = ocr.NewTestDB(t, sqlDB, spec2.ID)` $DIR/core/services/ocr/database_test.go: `m, err = odb.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr/database_test.go: `pgtest.MustExec(t, db, `SET CONSTRAINTS offchainreporting_latest_roun_offchainreporting_oracle_spe_fkey DEFERRED`)` $DIR/core/services/ocr/database_test.go: `t.Run("saves latest round requested", func(t *testing.T) { ctx := testutils.Context(t) err := odb.SaveLatestRoundRequested(ctx, rr) require.NoError(t, err) rawLog.Index = 42 // Now overwrite to prove that updating works rr = offchainaggregator.OffchainAggregatorRoundRequested{ Requester: testutils.NewAddress(), ConfigDigest: cltest.MakeConfigDigest(t), Epoch: 43, Round: 8, Raw: rawLog, } err = odb.SaveLatestRoundRequested(ctx, rr) require.NoError(t, err) })` $DIR/core/services/ocr/database_test.go: `rawLog.Index = 42` $DIR/core/services/ocr/database_test.go: `rr = offchainaggregator.OffchainAggregatorRoundRequested{ Requester: testutils.NewAddress(), ConfigDigest: cltest.MakeConfigDigest(t), Epoch: 43, Round: 8, Raw: rawLog, }` $DIR/core/services/ocr/database_test.go: `err = odb.SaveLatestRoundRequested(ctx, rr)` $DIR/core/services/ocr/database_test.go: `t.Run("loads latest round requested", func(t *testing.T) { ctx := testutils.Context(t) // There is no round for db2 lrr, err := odb2.LoadLatestRoundRequested(ctx) require.NoError(t, err) require.Equal(t, 0, int(lrr.Epoch)) lrr, err = odb.LoadLatestRoundRequested(ctx) require.NoError(t, err) assert.Equal(t, rr, lrr) })` $DIR/core/services/ocr/database_test.go: `lrr, err = odb.LoadLatestRoundRequested(ctx)` $DIR/core/services/ocr/database_test.go: `.NewSqlxDB(t)` $DIR/core/services/ocr/database_test.go: `.MakeConfigDigest(t)` $DIR/core/services/ocr/database_test.go: `.NewKeyStore(t, db)` $DIR/core/services/ocr/database_test.go: `.Eth()` $DIR/core/services/ocr/database_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/services/ocr/database_test.go: `.MustInsertOffchainreportingOracleSpec(t, db, key.EIP55Address)` $DIR/core/services/ocr/database_test.go: `.Run("reads and writes state", func(t *testing.T) { t.Log("creating DB") odb := ocr.NewTestDB(t, db, spec.ID) state := ocrtypes.PersistentState{ Epoch: 1, HighestSentEpoch: 2, HighestReceivedEpoch: []uint32{3}, } err := odb.WriteState(testutils.Context(t), configDigest, state) require.NoError(t, err) readState, err := odb.ReadState(testutils.Context(t), configDigest) require.NoError(t, err) require.Equal(t, state, *readState) })` $DIR/core/services/ocr/database_test.go: `.NewTestDB(t, db, spec.ID)` $DIR/core/services/ocr/database_test.go: `.WriteState(testutils.Context(t), configDigest, state)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.ReadState(testutils.Context(t), configDigest)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.Run("updates state", func(t *testing.T) { odb := ocr.NewTestDB(t, db, spec.ID) newState := ocrtypes.PersistentState{ Epoch: 2, HighestSentEpoch: 3, HighestReceivedEpoch: []uint32{4, 5}, } err := odb.WriteState(testutils.Context(t), configDigest, newState) require.NoError(t, err) readState, err := odb.ReadState(testutils.Context(t), configDigest) require.NoError(t, err) require.Equal(t, newState, *readState) })` $DIR/core/services/ocr/database_test.go: `.NewTestDB(t, db, spec.ID)` $DIR/core/services/ocr/database_test.go: `.WriteState(testutils.Context(t), configDigest, newState)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.ReadState(testutils.Context(t), configDigest)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.Run("does not return result for wrong spec", func(t *testing.T) { odb := ocr.NewTestDB(t, db, spec.ID) state := ocrtypes.PersistentState{ Epoch: 3, HighestSentEpoch: 4, HighestReceivedEpoch: []uint32{5, 6}, } err := odb.WriteState(testutils.Context(t), configDigest, state) require.NoError(t, err) // db with different spec odb = ocr.NewTestDB(t, db, -1) readState, err := odb.ReadState(testutils.Context(t), configDigest) require.NoError(t, err) require.Nil(t, readState) })` $DIR/core/services/ocr/database_test.go: `.NewTestDB(t, db, spec.ID)` $DIR/core/services/ocr/database_test.go: `.WriteState(testutils.Context(t), configDigest, state)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.NewTestDB(t, db, -1)` $DIR/core/services/ocr/database_test.go: `.ReadState(testutils.Context(t), configDigest)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.NewTestDB(t, db, spec.ID)` $DIR/core/services/ocr/database_test.go: `.WriteState(testutils.Context(t), configDigest, state)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.ReadState(testutils.Context(t), cltest.MakeConfigDigest(t))` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.MakeConfigDigest(t)` $DIR/core/services/ocr/database_test.go: `.NewSqlxDB(t)` $DIR/core/services/ocr/database_test.go: `.MakeConfigDigest(t)` $DIR/core/services/ocr/database_test.go: `.NewAddress()` $DIR/core/services/ocr/database_test.go: `.NewAddress()` $DIR/core/services/ocr/database_test.go: `.NewAddress()` $DIR/core/services/ocr/database_test.go: `.NewAddress()` $DIR/core/services/ocr/database_test.go: `.NewKeyStore(t, db)` $DIR/core/services/ocr/database_test.go: `.Eth()` $DIR/core/services/ocr/database_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/services/ocr/database_test.go: `.MustInsertOffchainreportingOracleSpec(t, db, key.EIP55Address)` $DIR/core/services/ocr/database_test.go: `.Run("reads and writes config", func(t *testing.T) { db := ocr.NewTestDB(t, sqlDB, spec.ID) err := db.WriteConfig(testutils.Context(t), config) require.NoError(t, err) readConfig, err := db.ReadConfig(testutils.Context(t)) require.NoError(t, err) require.Equal(t, &config, readConfig) })` $DIR/core/services/ocr/database_test.go: `.NewTestDB(t, sqlDB, spec.ID)` $DIR/core/services/ocr/database_test.go: `.WriteConfig(testutils.Context(t), config)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.ReadConfig(testutils.Context(t))` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.Run("updates config", func(t *testing.T) { db := ocr.NewTestDB(t, sqlDB, spec.ID) newConfig := ocrtypes.ContractConfig{ ConfigDigest: cltest.MakeConfigDigest(t), Signers: []common.Address{utils.ZeroAddress, transmitterAddress, testutils.NewAddress()}, Transmitters: []common.Address{utils.ZeroAddress, transmitterAddress, testutils.NewAddress()}, Threshold: uint8(36), EncodedConfigVersion: uint64(987655), Encoded: []byte{2, 3, 4, 5, 6}, } err := db.WriteConfig(testutils.Context(t), newConfig) require.NoError(t, err) readConfig, err := db.ReadConfig(testutils.Context(t)) require.NoError(t, err) require.Equal(t, &newConfig, readConfig) })` $DIR/core/services/ocr/database_test.go: `.NewTestDB(t, sqlDB, spec.ID)` $DIR/core/services/ocr/database_test.go: `.MakeConfigDigest(t)` $DIR/core/services/ocr/database_test.go: `.NewAddress()` $DIR/core/services/ocr/database_test.go: `.NewAddress()` $DIR/core/services/ocr/database_test.go: `.WriteConfig(testutils.Context(t), newConfig)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.ReadConfig(testutils.Context(t))` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.NewTestDB(t, sqlDB, spec.ID)` $DIR/core/services/ocr/database_test.go: `.WriteConfig(testutils.Context(t), config)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.NewTestDB(t, sqlDB, -1)` $DIR/core/services/ocr/database_test.go: `.ReadConfig(testutils.Context(t))` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.NewSqlxDB(t)` $DIR/core/services/ocr/database_test.go: `.NewKeyStore(t, db)` $DIR/core/services/ocr/database_test.go: `.Eth()` $DIR/core/services/ocr/database_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/services/ocr/database_test.go: `.MustInsertOffchainreportingOracleSpec(t, db, key.EIP55Address)` $DIR/core/services/ocr/database_test.go: `.MustInsertOffchainreportingOracleSpec(t, db, key.EIP55Address)` $DIR/core/services/ocr/database_test.go: `.NewTestDB(t, sqlDB, spec.ID)` $DIR/core/services/ocr/database_test.go: `.NewTestDB(t, sqlDB, spec2.ID)` $DIR/core/services/ocr/database_test.go: `.MakeConfigDigest(t)` $DIR/core/services/ocr/database_test.go: `.Run("stores and retrieves pending transmissions", func(t *testing.T) { p := ocrtypes.PendingTransmission{ Time: time.Now(), Median: ocrtypes.Observation(big.NewInt(41)), SerializedReport: []byte{0, 2, 3}, Rs: [][32]byte{testutils.Random32Byte(), testutils.Random32Byte()}, Ss: [][32]byte{testutils.Random32Byte(), testutils.Random32Byte()}, Vs: testutils.Random32Byte(), } err := odb.StorePendingTransmission(testutils.Context(t), k, p) require.NoError(t, err) m, err := odb.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) assertPendingTransmissionEqual(t, m[k], p) // Now overwrite value for k to prove that updating works p = ocrtypes.PendingTransmission{ Time: time.Now(), Median: ocrtypes.Observation(big.NewInt(42)), SerializedReport: []byte{1, 2, 3}, Rs: [][32]byte{testutils.Random32Byte()}, Ss: [][32]byte{testutils.Random32Byte()}, Vs: testutils.Random32Byte(), } err = odb.StorePendingTransmission(testutils.Context(t), k, p) require.NoError(t, err) m, err = odb.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) assertPendingTransmissionEqual(t, m[k], p) p2 := ocrtypes.PendingTransmission{ Time: time.Now(), Median: ocrtypes.Observation(big.NewInt(43)), SerializedReport: []byte{2, 2, 3}, Rs: [][32]byte{testutils.Random32Byte()}, Ss: [][32]byte{testutils.Random32Byte()}, Vs: testutils.Random32Byte(), } err = odb.StorePendingTransmission(testutils.Context(t), k2, p2) require.NoError(t, err) kRedHerring := ocrtypes.ReportTimestamp{ ConfigDigest: ocrtypes.ConfigDigest{43}, Epoch: 1, Round: 2, } pRedHerring := ocrtypes.PendingTransmission{ Time: time.Now(), Median: ocrtypes.Observation(big.NewInt(43)), SerializedReport: []byte{3, 2, 3}, Rs: [][32]byte{testutils.Random32Byte()}, Ss: [][32]byte{testutils.Random32Byte()}, Vs: testutils.Random32Byte(), } err = odb.StorePendingTransmission(testutils.Context(t), kRedHerring, pRedHerring) require.NoError(t, err) m, err = odb.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) require.Len(t, m, 2) // HACK to get around time equality because otherwise its annoying (time storage into postgres is mildly lossy) require.Equal(t, p.Time.Unix(), m[k].Time.Unix()) require.Equal(t, p2.Time.Unix(), m[k2].Time.Unix()) var zt time.Time p.Time, p2.Time = zt, zt for k, v := range m { v.Time = zt m[k] = v } require.Equal(t, p, m[k]) require.Equal(t, p2, m[k2]) // No keys for this oracleSpecID yet m, err = odb2.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) require.Len(t, m, 0) })` $DIR/core/services/ocr/database_test.go: `.Now()` $DIR/core/services/ocr/database_test.go: `.Observation(big.NewInt(41))` $DIR/core/services/ocr/database_test.go: `.NewInt(41)` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.StorePendingTransmission(testutils.Context(t), k, p)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.Now()` $DIR/core/services/ocr/database_test.go: `.Observation(big.NewInt(42))` $DIR/core/services/ocr/database_test.go: `.NewInt(42)` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.StorePendingTransmission(testutils.Context(t), k, p)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.Now()` $DIR/core/services/ocr/database_test.go: `.Observation(big.NewInt(43))` $DIR/core/services/ocr/database_test.go: `.NewInt(43)` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.StorePendingTransmission(testutils.Context(t), k2, p2)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.Now()` $DIR/core/services/ocr/database_test.go: `.Observation(big.NewInt(43))` $DIR/core/services/ocr/database_test.go: `.NewInt(43)` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.StorePendingTransmission(testutils.Context(t), kRedHerring, pRedHerring)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.Run("deletes pending transmission by key", func(t *testing.T) { p := ocrtypes.PendingTransmission{ Time: time.Unix(100, 0), Median: ocrtypes.Observation(big.NewInt(44)), SerializedReport: []byte{1, 4, 3}, Rs: [][32]byte{testutils.Random32Byte()}, Ss: [][32]byte{testutils.Random32Byte()}, Vs: testutils.Random32Byte(), } err := odb.StorePendingTransmission(testutils.Context(t), k, p) require.NoError(t, err) err = odb2.StorePendingTransmission(testutils.Context(t), k, p) require.NoError(t, err) err = odb.DeletePendingTransmission(testutils.Context(t), k) require.NoError(t, err) m, err := odb.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) require.Len(t, m, 1) // Did not affect other oracleSpecID m, err = odb2.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) require.Len(t, m, 1) })` $DIR/core/services/ocr/database_test.go: `.Unix(100, 0)` $DIR/core/services/ocr/database_test.go: `.Observation(big.NewInt(44))` $DIR/core/services/ocr/database_test.go: `.NewInt(44)` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.StorePendingTransmission(testutils.Context(t), k, p)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.StorePendingTransmission(testutils.Context(t), k, p)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.DeletePendingTransmission(testutils.Context(t), k)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.Run("allows multiple duplicate keys for different spec ID", func(t *testing.T) { p := ocrtypes.PendingTransmission{ Time: time.Unix(100, 0), Median: ocrtypes.Observation(big.NewInt(44)), SerializedReport: []byte{1, 4, 3}, Rs: [][32]byte{testutils.Random32Byte()}, Ss: [][32]byte{testutils.Random32Byte()}, Vs: testutils.Random32Byte(), } err := odb.StorePendingTransmission(testutils.Context(t), k2, p) require.NoError(t, err) m, err := odb.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) require.Len(t, m, 1) require.Equal(t, p.Median, m[k2].Median) })` $DIR/core/services/ocr/database_test.go: `.Unix(100, 0)` $DIR/core/services/ocr/database_test.go: `.Observation(big.NewInt(44))` $DIR/core/services/ocr/database_test.go: `.NewInt(44)` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.StorePendingTransmission(testutils.Context(t), k2, p)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.Unix(100, 0)` $DIR/core/services/ocr/database_test.go: `.Observation(big.NewInt(41))` $DIR/core/services/ocr/database_test.go: `.NewInt(41)` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.StorePendingTransmission(testutils.Context(t), k, p)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.Unix(1000, 0)` $DIR/core/services/ocr/database_test.go: `.Observation(big.NewInt(42))` $DIR/core/services/ocr/database_test.go: `.NewInt(42)` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.StorePendingTransmission(testutils.Context(t), k2, p2)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.Now()` $DIR/core/services/ocr/database_test.go: `.Observation(big.NewInt(43))` $DIR/core/services/ocr/database_test.go: `.NewInt(43)` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.Random32Byte()` $DIR/core/services/ocr/database_test.go: `.StorePendingTransmission(testutils.Context(t), k2, p2)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.DeletePendingTransmissionsOlderThan(testutils.Context(t), time.Unix(900, 0))` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.Unix(900, 0)` $DIR/core/services/ocr/database_test.go: `.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.NewTestDB(t, sqlDB, spec2.ID)` $DIR/core/services/ocr/database_test.go: `.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.NewSqlxDB(t)` $DIR/core/services/ocr/database_test.go: `.MustExec(t, db, `SET CONSTRAINTS offchainreporting_latest_roun_offchainreporting_oracle_spe_fkey DEFERRED`)` $DIR/core/services/ocr/database_test.go: `.NewTestDB(t, sqlDB, 1)` $DIR/core/services/ocr/database_test.go: `.NewTestDB(t, sqlDB, 2)` $DIR/core/services/ocr/database_test.go: `.LogFromFixture(t, "../../testdata/jsonrpc/round_requested_log_1_1.json")` $DIR/core/services/ocr/database_test.go: `.NewAddress()` $DIR/core/services/ocr/database_test.go: `.MakeConfigDigest(t)` $DIR/core/services/ocr/database_test.go: `.Run("saves latest round requested", func(t *testing.T) { ctx := testutils.Context(t) err := odb.SaveLatestRoundRequested(ctx, rr) require.NoError(t, err) rawLog.Index = 42 // Now overwrite to prove that updating works rr = offchainaggregator.OffchainAggregatorRoundRequested{ Requester: testutils.NewAddress(), ConfigDigest: cltest.MakeConfigDigest(t), Epoch: 43, Round: 8, Raw: rawLog, } err = odb.SaveLatestRoundRequested(ctx, rr) require.NoError(t, err) })` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.SaveLatestRoundRequested(ctx, rr)` $DIR/core/services/ocr/database_test.go: `.NewAddress()` $DIR/core/services/ocr/database_test.go: `.MakeConfigDigest(t)` $DIR/core/services/ocr/database_test.go: `.SaveLatestRoundRequested(ctx, rr)` $DIR/core/services/ocr/database_test.go: `.Run("loads latest round requested", func(t *testing.T) { ctx := testutils.Context(t) // There is no round for db2 lrr, err := odb2.LoadLatestRoundRequested(ctx) require.NoError(t, err) require.Equal(t, 0, int(lrr.Epoch)) lrr, err = odb.LoadLatestRoundRequested(ctx) require.NoError(t, err) assert.Equal(t, rr, lrr) })` $DIR/core/services/ocr/database_test.go: `.Context(t)` $DIR/core/services/ocr/database_test.go: `.LoadLatestRoundRequested(ctx)` $DIR/core/services/ocr/database_test.go: `.LoadLatestRoundRequested(ctx)` $DIR/core/services/ocr/database_test.go: `.Exec(`DELETE FROM ocr_oracle_specs`)` $DIR/core/services/ocr/flags_test.go: `t.Run(tc.name, func(t *testing.T) { var ( flagsContract = mocks.NewFlags(t) address = testutils.NewAddress() ) flags := fluxmonitorv2.ContractFlags{FlagsInterface: flagsContract} flagsContract.On("GetFlags", mock.Anything, mock.Anything). Run(func(args mock.Arguments) { require.Equal(t, []common.Address{ utils.ZeroAddress, address, }, args.Get(1).([]common.Address)) }). Return(tc.getFlagsResult, nil) result, err := flags.IsLowered(address) require.NoError(t, err) require.Equal(t, tc.expected, result) })` $DIR/core/services/ocr/flags_test.go: `flagsContract.On("GetFlags", mock.Anything, mock.Anything). Run(func(args mock.Arguments) { require.Equal(t, []common.Address{ utils.ZeroAddress, address, }, args.Get(1).([]common.Address)) }). Return(tc.getFlagsResult, nil)` $DIR/core/services/ocr/flags_test.go: `.Run(tc.name, func(t *testing.T) { var ( flagsContract = mocks.NewFlags(t) address = testutils.NewAddress() ) flags := fluxmonitorv2.ContractFlags{FlagsInterface: flagsContract} flagsContract.On("GetFlags", mock.Anything, mock.Anything). Run(func(args mock.Arguments) { require.Equal(t, []common.Address{ utils.ZeroAddress, address, }, args.Get(1).([]common.Address)) }). Return(tc.getFlagsResult, nil) result, err := flags.IsLowered(address) require.NoError(t, err) require.Equal(t, tc.expected, result) })` $DIR/core/services/ocr/flags_test.go: `.NewFlags(t)` $DIR/core/services/ocr/flags_test.go: `.NewAddress()` $DIR/core/services/ocr/flags_test.go: `.On("GetFlags", mock.Anything, mock.Anything)` $DIR/core/services/ocr/flags_test.go: `. Run(func(args mock.Arguments) { require.Equal(t, []common.Address{ utils.ZeroAddress, address, }, args.Get(1).([]common.Address)) })` $DIR/core/services/ocr/flags_test.go: `. Return(tc.getFlagsResult, nil)` $DIR/core/services/ocr/flags_test.go: `.IsLowered(address)` $DIR/core/services/ocr/validate_test.go: `err = jsonapi.Unmarshal(b, &r)` $DIR/core/services/ocr/validate_test.go: `c.OCR.ObservationTimeout = commonconfig.MustNewDuration(20 * time.Minute)` $DIR/core/services/ocr/validate_test.go: `t.Run(tc.name, func(t *testing.T) { c := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Insecure.OCRDevelopmentMode = null.BoolFrom(false).Ptr() if tc.overrides != nil { tc.overrides(c, s) } }) s, err := ocr.ValidatedOracleSpecTomlCfg(c, func(id *big.Int) (evmconfig.ChainScopedConfig, error) { return evmtest.NewChainScopedConfig(t, c), nil }, tc.toml) tc.assertion(t, s, err) })` $DIR/core/services/ocr/validate_test.go: `c.Insecure.OCRDevelopmentMode = null.BoolFrom(false).Ptr()` $DIR/core/services/ocr/validate_test.go: `tc.overrides(c, s)` $DIR/core/services/ocr/validate_test.go: `tc.assertion(t, s, err)` $DIR/core/services/ocr/validate_test.go: `.Marshal(os.OCROracleSpec)` $DIR/core/services/ocr/validate_test.go: `.Unmarshal(b, &r)` $DIR/core/services/ocr/validate_test.go: `.MustDecode("0x2222220d5c22223b22225c0d21222222")` $DIR/core/services/ocr/validate_test.go: `.MustNewDuration(20 * time.Minute)` $DIR/core/services/ocr/validate_test.go: `.Run(tc.name, func(t *testing.T) { c := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Insecure.OCRDevelopmentMode = null.BoolFrom(false).Ptr() if tc.overrides != nil { tc.overrides(c, s) } }) s, err := ocr.ValidatedOracleSpecTomlCfg(c, func(id *big.Int) (evmconfig.ChainScopedConfig, error) { return evmtest.NewChainScopedConfig(t, c), nil }, tc.toml) tc.assertion(t, s, err) })` $DIR/core/services/ocr/validate_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Insecure.OCRDevelopmentMode = null.BoolFrom(false).Ptr() if tc.overrides != nil { tc.overrides(c, s) } })` $DIR/core/services/ocr/validate_test.go: `.BoolFrom(false)` $DIR/core/services/ocr/validate_test.go: `.Ptr()` $DIR/core/services/ocr/validate_test.go: `.overrides(c, s)` $DIR/core/services/ocr/validate_test.go: `.ValidatedOracleSpecTomlCfg(c, func(id *big.Int) (evmconfig.ChainScopedConfig, error) { return evmtest.NewChainScopedConfig(t, c), nil }, tc.toml)` $DIR/core/services/ocr/validate_test.go: `.NewChainScopedConfig(t, c)` $DIR/core/services/ocr/validate_test.go: `.assertion(t, s, err)` $DIR/core/services/ocr2/database_test.go: `t.Run("reads and writes state", func(t *testing.T) { db := ocr2.NewDB(sqlDB, spec.ID, defaultPluginID, lggr) state := ocrtypes.PersistentState{ Epoch: 1, HighestSentEpoch: 2, HighestReceivedEpoch: []uint32{3}, } err := db.WriteState(testutils.Context(t), configDigest, state) require.NoError(t, err) readState, err := db.ReadState(testutils.Context(t), configDigest) require.NoError(t, err) require.Equal(t, state, *readState) })` $DIR/core/services/ocr2/database_test.go: `t.Run("updates state", func(t *testing.T) { db := ocr2.NewDB(sqlDB, spec.ID, defaultPluginID, lggr) newState := ocrtypes.PersistentState{ Epoch: 2, HighestSentEpoch: 3, HighestReceivedEpoch: []uint32{4, 5}, } err := db.WriteState(testutils.Context(t), configDigest, newState) require.NoError(t, err) readState, err := db.ReadState(testutils.Context(t), configDigest) require.NoError(t, err) require.Equal(t, newState, *readState) })` $DIR/core/services/ocr2/database_test.go: `t.Run("does not return result for wrong spec", func(t *testing.T) { db := ocr2.NewDB(sqlDB, spec.ID, defaultPluginID, lggr) state := ocrtypes.PersistentState{ Epoch: 3, HighestSentEpoch: 4, HighestReceivedEpoch: []uint32{5, 6}, } err := db.WriteState(testutils.Context(t), configDigest, state) require.NoError(t, err) // odb with different spec db = ocr2.NewDB(sqlDB, -1, defaultPluginID, lggr) readState, err := db.ReadState(testutils.Context(t), configDigest) require.NoError(t, err) require.Nil(t, readState) })` $DIR/core/services/ocr2/database_test.go: `db = ocr2.NewDB(sqlDB, -1, defaultPluginID, lggr)` $DIR/core/services/ocr2/database_test.go: `t.Run("reads and writes config", func(t *testing.T) { db := ocr2.NewDB(sqlDB, spec.ID, defaultPluginID, lggr) err := db.WriteConfig(testutils.Context(t), config) require.NoError(t, err) readConfig, err := db.ReadConfig(testutils.Context(t)) require.NoError(t, err) require.Equal(t, &config, readConfig) })` $DIR/core/services/ocr2/database_test.go: `t.Run("updates config", func(t *testing.T) { db := ocr2.NewDB(sqlDB, spec.ID, defaultPluginID, lggr) newConfig := ocrtypes.ContractConfig{ ConfigDigest: testhelpers.MakeConfigDigest(t), Signers: []ocrtypes.OnchainPublicKey{}, Transmitters: []ocrtypes.Account{}, } err := db.WriteConfig(testutils.Context(t), newConfig) require.NoError(t, err) readConfig, err := db.ReadConfig(testutils.Context(t)) require.NoError(t, err) require.Equal(t, &newConfig, readConfig) })` $DIR/core/services/ocr2/database_test.go: `t.Run("does not return result for wrong spec", func(t *testing.T) { db := ocr2.NewDB(sqlDB, spec.ID, defaultPluginID, lggr) err := db.WriteConfig(testutils.Context(t), config) require.NoError(t, err) db = ocr2.NewDB(sqlDB, -1, defaultPluginID, lggr) readConfig, err := db.ReadConfig(testutils.Context(t)) require.NoError(t, err) require.Nil(t, readConfig) })` $DIR/core/services/ocr2/database_test.go: `db = ocr2.NewDB(sqlDB, -1, defaultPluginID, lggr)` $DIR/core/services/ocr2/database_test.go: `err = db2.WriteConfig(testutils.Context(t), otherConfig)` $DIR/core/services/ocr2/database_test.go: `readConfig, err = db2.ReadConfig(testutils.Context(t))` $DIR/core/services/ocr2/database_test.go: `t.Run("stores and retrieves pending transmissions", func(t *testing.T) { p := ocrtypes.PendingTransmission{ Time: time.Now(), ExtraHash: testutils.Random32Byte(), Report: []byte{0, 2, 3}, AttributedSignatures: []ocrtypes.AttributedOnchainSignature{ {Signature: cltest.MustRandomBytes(t, 7), Signer: 248}, {Signature: cltest.MustRandomBytes(t, 17), Signer: 31}, }, } err := db.StorePendingTransmission(testutils.Context(t), k, p) require.NoError(t, err) m, err := db.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) assertPendingTransmissionEqual(t, p, m[k]) // Now overwrite value for k to prove that updating works p = ocrtypes.PendingTransmission{ Time: time.Now(), ExtraHash: testutils.Random32Byte(), Report: []byte{1, 2, 3}, AttributedSignatures: []ocrtypes.AttributedOnchainSignature{ {Signature: cltest.MustRandomBytes(t, 7), Signer: 248}, }, } err = db.StorePendingTransmission(testutils.Context(t), k, p) require.NoError(t, err) m, err = db.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) assertPendingTransmissionEqual(t, p, m[k]) p2 := ocrtypes.PendingTransmission{ Time: time.Now(), ExtraHash: testutils.Random32Byte(), Report: []byte{2, 2, 3}, AttributedSignatures: []ocrtypes.AttributedOnchainSignature{ {Signature: cltest.MustRandomBytes(t, 7), Signer: 248}, }, } err = db.StorePendingTransmission(testutils.Context(t), k2, p2) require.NoError(t, err) kRedHerring := ocrtypes.ReportTimestamp{ ConfigDigest: ocrtypes.ConfigDigest{43}, Epoch: 1, Round: 2, } pRedHerring := ocrtypes.PendingTransmission{ Time: time.Now(), ExtraHash: testutils.Random32Byte(), Report: []byte{3, 2, 3}, AttributedSignatures: []ocrtypes.AttributedOnchainSignature{ {Signature: cltest.MustRandomBytes(t, 7), Signer: 248}, }, } err = db.StorePendingTransmission(testutils.Context(t), kRedHerring, pRedHerring) require.NoError(t, err) m, err = db.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) require.Len(t, m, 2) // HACK to get around time equality because otherwise its annoying (time storage into postgres is mildly lossy) require.Equal(t, p.Time.Unix(), m[k].Time.Unix()) require.Equal(t, p2.Time.Unix(), m[k2].Time.Unix()) var zt time.Time p.Time, p2.Time = zt, zt for k, v := range m { v.Time = zt m[k] = v } require.Equal(t, p, m[k]) require.Equal(t, p2, m[k2]) // No keys for this oracleSpecID yet m, err = db2.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) require.Len(t, m, 0) })` $DIR/core/services/ocr2/database_test.go: `assertPendingTransmissionEqual(t, p, m[k])` $DIR/core/services/ocr2/database_test.go: `p = ocrtypes.PendingTransmission{ Time: time.Now(), ExtraHash: testutils.Random32Byte(), Report: []byte{1, 2, 3}, AttributedSignatures: []ocrtypes.AttributedOnchainSignature{ {Signature: cltest.MustRandomBytes(t, 7), Signer: 248}, }, }` $DIR/core/services/ocr2/database_test.go: `err = db.StorePendingTransmission(testutils.Context(t), k, p)` $DIR/core/services/ocr2/database_test.go: `m, err = db.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr2/database_test.go: `assertPendingTransmissionEqual(t, p, m[k])` $DIR/core/services/ocr2/database_test.go: `err = db.StorePendingTransmission(testutils.Context(t), k2, p2)` $DIR/core/services/ocr2/database_test.go: `err = db.StorePendingTransmission(testutils.Context(t), kRedHerring, pRedHerring)` $DIR/core/services/ocr2/database_test.go: `m, err = db.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr2/database_test.go: `p.Time, p2.Time = zt, zt` $DIR/core/services/ocr2/database_test.go: `v.Time = zt` $DIR/core/services/ocr2/database_test.go: `m[k] = v` $DIR/core/services/ocr2/database_test.go: `m, err = db2.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr2/database_test.go: `t.Run("deletes pending transmission by key", func(t *testing.T) { p := ocrtypes.PendingTransmission{ Time: time.Unix(100, 0), ExtraHash: testutils.Random32Byte(), Report: []byte{1, 4, 3}, AttributedSignatures: []ocrtypes.AttributedOnchainSignature{ {Signature: cltest.MustRandomBytes(t, 7), Signer: 248}, }, } err := db.StorePendingTransmission(testutils.Context(t), k, p) require.NoError(t, err) err = db2.StorePendingTransmission(testutils.Context(t), k, p) require.NoError(t, err) err = db.DeletePendingTransmission(testutils.Context(t), k) require.NoError(t, err) m, err := db.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) require.Len(t, m, 1) // Did not affect other oracleSpecID m, err = db2.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) require.Len(t, m, 1) })` $DIR/core/services/ocr2/database_test.go: `err = db2.StorePendingTransmission(testutils.Context(t), k, p)` $DIR/core/services/ocr2/database_test.go: `err = db.DeletePendingTransmission(testutils.Context(t), k)` $DIR/core/services/ocr2/database_test.go: `m, err = db2.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr2/database_test.go: `t.Run("allows multiple duplicate keys for different spec ID", func(t *testing.T) { p := ocrtypes.PendingTransmission{ Time: time.Unix(100, 0), ExtraHash: testutils.Random32Byte(), Report: []byte{2, 2, 3}, AttributedSignatures: []ocrtypes.AttributedOnchainSignature{ {Signature: cltest.MustRandomBytes(t, 7), Signer: 248}, }, } err := db.StorePendingTransmission(testutils.Context(t), k2, p) require.NoError(t, err) m, err := db.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) require.Len(t, m, 1) // FIXME: don't understand how the median is being used as a key or what the replacement is yet // require.Equal(t, p.Median, m[k2].Median) })` $DIR/core/services/ocr2/database_test.go: `err = db.StorePendingTransmission(testutils.Context(t), k2, p2)` $DIR/core/services/ocr2/database_test.go: `p2 = ocrtypes.PendingTransmission{ Time: time.Now(), ExtraHash: testutils.Random32Byte(), Report: []byte{2, 2, 3}, AttributedSignatures: []ocrtypes.AttributedOnchainSignature{ {Signature: cltest.MustRandomBytes(t, 7), Signer: 248}, }, }` $DIR/core/services/ocr2/database_test.go: `err = db.StorePendingTransmission(testutils.Context(t), k2, p2)` $DIR/core/services/ocr2/database_test.go: `err = db.DeletePendingTransmissionsOlderThan(testutils.Context(t), time.Unix(900, 0))` $DIR/core/services/ocr2/database_test.go: `db = ocr2.NewDB(sqlDB, spec2.ID, defaultPluginID, lggr)` $DIR/core/services/ocr2/database_test.go: `m, err = db.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr2/database_test.go: `testutils.AssertCount(t, sqlDB, "ocr_protocol_states", expected)` $DIR/core/services/ocr2/database_test.go: `assertCount(0)` $DIR/core/services/ocr2/database_test.go: `assertCount(1)` $DIR/core/services/ocr2/database_test.go: `err = db.WriteProtocolState(ctx, cd2, "key1", []byte{2})` $DIR/core/services/ocr2/database_test.go: `assertCount(2)` $DIR/core/services/ocr2/database_test.go: `err = db.WriteProtocolState(ctx, cd2, "key2", []byte{3})` $DIR/core/services/ocr2/database_test.go: `assertCount(3)` $DIR/core/services/ocr2/database_test.go: `err = db.WriteProtocolState(ctx, cd2, "key2", []byte{4})` $DIR/core/services/ocr2/database_test.go: `val, err = db.ReadProtocolState(ctx, cd2, "key1")` $DIR/core/services/ocr2/database_test.go: `val, err = db.ReadProtocolState(ctx, cd2, "key2")` $DIR/core/services/ocr2/database_test.go: `err = db.WriteProtocolState(ctx, cd1, "key1", []byte{})` $DIR/core/services/ocr2/database_test.go: `val, err = db.ReadProtocolState(ctx, cd1, "key1")` $DIR/core/services/ocr2/database_test.go: `assertCount(3)` $DIR/core/services/ocr2/database_test.go: `err = db.WriteProtocolState(ctx, cd1, "key1", nil)` $DIR/core/services/ocr2/database_test.go: `assertCount(2)` $DIR/core/services/ocr2/database_test.go: `val, err = db.ReadProtocolState(ctx, cd1, "key1")` $DIR/core/services/ocr2/database_test.go: `.MakeConfigDigest(t)` $DIR/core/services/ocr2/database_test.go: `.NewKeyStore(t, sqlDB)` $DIR/core/services/ocr2/database_test.go: `.Eth()` $DIR/core/services/ocr2/database_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/services/ocr2/database_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/database_test.go: `.Run("reads and writes state", func(t *testing.T) { db := ocr2.NewDB(sqlDB, spec.ID, defaultPluginID, lggr) state := ocrtypes.PersistentState{ Epoch: 1, HighestSentEpoch: 2, HighestReceivedEpoch: []uint32{3}, } err := db.WriteState(testutils.Context(t), configDigest, state) require.NoError(t, err) readState, err := db.ReadState(testutils.Context(t), configDigest) require.NoError(t, err) require.Equal(t, state, *readState) })` $DIR/core/services/ocr2/database_test.go: `.NewDB(sqlDB, spec.ID, defaultPluginID, lggr)` $DIR/core/services/ocr2/database_test.go: `.WriteState(testutils.Context(t), configDigest, state)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.ReadState(testutils.Context(t), configDigest)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.Run("updates state", func(t *testing.T) { db := ocr2.NewDB(sqlDB, spec.ID, defaultPluginID, lggr) newState := ocrtypes.PersistentState{ Epoch: 2, HighestSentEpoch: 3, HighestReceivedEpoch: []uint32{4, 5}, } err := db.WriteState(testutils.Context(t), configDigest, newState) require.NoError(t, err) readState, err := db.ReadState(testutils.Context(t), configDigest) require.NoError(t, err) require.Equal(t, newState, *readState) })` $DIR/core/services/ocr2/database_test.go: `.NewDB(sqlDB, spec.ID, defaultPluginID, lggr)` $DIR/core/services/ocr2/database_test.go: `.WriteState(testutils.Context(t), configDigest, newState)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.ReadState(testutils.Context(t), configDigest)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.Run("does not return result for wrong spec", func(t *testing.T) { db := ocr2.NewDB(sqlDB, spec.ID, defaultPluginID, lggr) state := ocrtypes.PersistentState{ Epoch: 3, HighestSentEpoch: 4, HighestReceivedEpoch: []uint32{5, 6}, } err := db.WriteState(testutils.Context(t), configDigest, state) require.NoError(t, err) // odb with different spec db = ocr2.NewDB(sqlDB, -1, defaultPluginID, lggr) readState, err := db.ReadState(testutils.Context(t), configDigest) require.NoError(t, err) require.Nil(t, readState) })` $DIR/core/services/ocr2/database_test.go: `.NewDB(sqlDB, spec.ID, defaultPluginID, lggr)` $DIR/core/services/ocr2/database_test.go: `.WriteState(testutils.Context(t), configDigest, state)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.NewDB(sqlDB, -1, defaultPluginID, lggr)` $DIR/core/services/ocr2/database_test.go: `.ReadState(testutils.Context(t), configDigest)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.NewDB(sqlDB, spec.ID, defaultPluginID, lggr)` $DIR/core/services/ocr2/database_test.go: `.WriteState(testutils.Context(t), configDigest, state)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.ReadState(testutils.Context(t), testhelpers.MakeConfigDigest(t))` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.MakeConfigDigest(t)` $DIR/core/services/ocr2/database_test.go: `.MakeConfigDigest(t)` $DIR/core/services/ocr2/database_test.go: `.NewKeyStore(t, sqlDB)` $DIR/core/services/ocr2/database_test.go: `.Eth()` $DIR/core/services/ocr2/database_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/services/ocr2/database_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/database_test.go: `.Run("reads and writes config", func(t *testing.T) { db := ocr2.NewDB(sqlDB, spec.ID, defaultPluginID, lggr) err := db.WriteConfig(testutils.Context(t), config) require.NoError(t, err) readConfig, err := db.ReadConfig(testutils.Context(t)) require.NoError(t, err) require.Equal(t, &config, readConfig) })` $DIR/core/services/ocr2/database_test.go: `.NewDB(sqlDB, spec.ID, defaultPluginID, lggr)` $DIR/core/services/ocr2/database_test.go: `.WriteConfig(testutils.Context(t), config)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.ReadConfig(testutils.Context(t))` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.Run("updates config", func(t *testing.T) { db := ocr2.NewDB(sqlDB, spec.ID, defaultPluginID, lggr) newConfig := ocrtypes.ContractConfig{ ConfigDigest: testhelpers.MakeConfigDigest(t), Signers: []ocrtypes.OnchainPublicKey{}, Transmitters: []ocrtypes.Account{}, } err := db.WriteConfig(testutils.Context(t), newConfig) require.NoError(t, err) readConfig, err := db.ReadConfig(testutils.Context(t)) require.NoError(t, err) require.Equal(t, &newConfig, readConfig) })` $DIR/core/services/ocr2/database_test.go: `.NewDB(sqlDB, spec.ID, defaultPluginID, lggr)` $DIR/core/services/ocr2/database_test.go: `.MakeConfigDigest(t)` $DIR/core/services/ocr2/database_test.go: `.WriteConfig(testutils.Context(t), newConfig)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.ReadConfig(testutils.Context(t))` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.Run("does not return result for wrong spec", func(t *testing.T) { db := ocr2.NewDB(sqlDB, spec.ID, defaultPluginID, lggr) err := db.WriteConfig(testutils.Context(t), config) require.NoError(t, err) db = ocr2.NewDB(sqlDB, -1, defaultPluginID, lggr) readConfig, err := db.ReadConfig(testutils.Context(t)) require.NoError(t, err) require.Nil(t, readConfig) })` $DIR/core/services/ocr2/database_test.go: `.NewDB(sqlDB, spec.ID, defaultPluginID, lggr)` $DIR/core/services/ocr2/database_test.go: `.WriteConfig(testutils.Context(t), config)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.NewDB(sqlDB, -1, defaultPluginID, lggr)` $DIR/core/services/ocr2/database_test.go: `.ReadConfig(testutils.Context(t))` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.NewDB(sqlDB, spec.ID, defaultPluginID, lggr)` $DIR/core/services/ocr2/database_test.go: `.NewDB(sqlDB, spec.ID, otherPluginID, lggr)` $DIR/core/services/ocr2/database_test.go: `.MakeConfigDigest(t)` $DIR/core/services/ocr2/database_test.go: `.WriteConfig(testutils.Context(t), config)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.WriteConfig(testutils.Context(t), otherConfig)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.ReadConfig(testutils.Context(t))` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.ReadConfig(testutils.Context(t))` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.NewKeyStore(t, sqlDB)` $DIR/core/services/ocr2/database_test.go: `.Eth()` $DIR/core/services/ocr2/database_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/services/ocr2/database_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/database_test.go: `.NewDB(sqlDB, spec.ID, defaultPluginID, lggr)` $DIR/core/services/ocr2/database_test.go: `.NewDB(sqlDB, spec2.ID, defaultPluginID, lggr)` $DIR/core/services/ocr2/database_test.go: `.MakeConfigDigest(t)` $DIR/core/services/ocr2/database_test.go: `.Run("stores and retrieves pending transmissions", func(t *testing.T) { p := ocrtypes.PendingTransmission{ Time: time.Now(), ExtraHash: testutils.Random32Byte(), Report: []byte{0, 2, 3}, AttributedSignatures: []ocrtypes.AttributedOnchainSignature{ {Signature: cltest.MustRandomBytes(t, 7), Signer: 248}, {Signature: cltest.MustRandomBytes(t, 17), Signer: 31}, }, } err := db.StorePendingTransmission(testutils.Context(t), k, p) require.NoError(t, err) m, err := db.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) assertPendingTransmissionEqual(t, p, m[k]) // Now overwrite value for k to prove that updating works p = ocrtypes.PendingTransmission{ Time: time.Now(), ExtraHash: testutils.Random32Byte(), Report: []byte{1, 2, 3}, AttributedSignatures: []ocrtypes.AttributedOnchainSignature{ {Signature: cltest.MustRandomBytes(t, 7), Signer: 248}, }, } err = db.StorePendingTransmission(testutils.Context(t), k, p) require.NoError(t, err) m, err = db.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) assertPendingTransmissionEqual(t, p, m[k]) p2 := ocrtypes.PendingTransmission{ Time: time.Now(), ExtraHash: testutils.Random32Byte(), Report: []byte{2, 2, 3}, AttributedSignatures: []ocrtypes.AttributedOnchainSignature{ {Signature: cltest.MustRandomBytes(t, 7), Signer: 248}, }, } err = db.StorePendingTransmission(testutils.Context(t), k2, p2) require.NoError(t, err) kRedHerring := ocrtypes.ReportTimestamp{ ConfigDigest: ocrtypes.ConfigDigest{43}, Epoch: 1, Round: 2, } pRedHerring := ocrtypes.PendingTransmission{ Time: time.Now(), ExtraHash: testutils.Random32Byte(), Report: []byte{3, 2, 3}, AttributedSignatures: []ocrtypes.AttributedOnchainSignature{ {Signature: cltest.MustRandomBytes(t, 7), Signer: 248}, }, } err = db.StorePendingTransmission(testutils.Context(t), kRedHerring, pRedHerring) require.NoError(t, err) m, err = db.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) require.Len(t, m, 2) // HACK to get around time equality because otherwise its annoying (time storage into postgres is mildly lossy) require.Equal(t, p.Time.Unix(), m[k].Time.Unix()) require.Equal(t, p2.Time.Unix(), m[k2].Time.Unix()) var zt time.Time p.Time, p2.Time = zt, zt for k, v := range m { v.Time = zt m[k] = v } require.Equal(t, p, m[k]) require.Equal(t, p2, m[k2]) // No keys for this oracleSpecID yet m, err = db2.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) require.Len(t, m, 0) })` $DIR/core/services/ocr2/database_test.go: `.Now()` $DIR/core/services/ocr2/database_test.go: `.Random32Byte()` $DIR/core/services/ocr2/database_test.go: `.MustRandomBytes(t, 7)` $DIR/core/services/ocr2/database_test.go: `.MustRandomBytes(t, 17)` $DIR/core/services/ocr2/database_test.go: `.StorePendingTransmission(testutils.Context(t), k, p)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.Now()` $DIR/core/services/ocr2/database_test.go: `.Random32Byte()` $DIR/core/services/ocr2/database_test.go: `.MustRandomBytes(t, 7)` $DIR/core/services/ocr2/database_test.go: `.StorePendingTransmission(testutils.Context(t), k, p)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.Now()` $DIR/core/services/ocr2/database_test.go: `.Random32Byte()` $DIR/core/services/ocr2/database_test.go: `.MustRandomBytes(t, 7)` $DIR/core/services/ocr2/database_test.go: `.StorePendingTransmission(testutils.Context(t), k2, p2)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.Now()` $DIR/core/services/ocr2/database_test.go: `.Random32Byte()` $DIR/core/services/ocr2/database_test.go: `.MustRandomBytes(t, 7)` $DIR/core/services/ocr2/database_test.go: `.StorePendingTransmission(testutils.Context(t), kRedHerring, pRedHerring)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.Run("deletes pending transmission by key", func(t *testing.T) { p := ocrtypes.PendingTransmission{ Time: time.Unix(100, 0), ExtraHash: testutils.Random32Byte(), Report: []byte{1, 4, 3}, AttributedSignatures: []ocrtypes.AttributedOnchainSignature{ {Signature: cltest.MustRandomBytes(t, 7), Signer: 248}, }, } err := db.StorePendingTransmission(testutils.Context(t), k, p) require.NoError(t, err) err = db2.StorePendingTransmission(testutils.Context(t), k, p) require.NoError(t, err) err = db.DeletePendingTransmission(testutils.Context(t), k) require.NoError(t, err) m, err := db.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) require.Len(t, m, 1) // Did not affect other oracleSpecID m, err = db2.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) require.Len(t, m, 1) })` $DIR/core/services/ocr2/database_test.go: `.Unix(100, 0)` $DIR/core/services/ocr2/database_test.go: `.Random32Byte()` $DIR/core/services/ocr2/database_test.go: `.MustRandomBytes(t, 7)` $DIR/core/services/ocr2/database_test.go: `.StorePendingTransmission(testutils.Context(t), k, p)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.StorePendingTransmission(testutils.Context(t), k, p)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.DeletePendingTransmission(testutils.Context(t), k)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.Run("allows multiple duplicate keys for different spec ID", func(t *testing.T) { p := ocrtypes.PendingTransmission{ Time: time.Unix(100, 0), ExtraHash: testutils.Random32Byte(), Report: []byte{2, 2, 3}, AttributedSignatures: []ocrtypes.AttributedOnchainSignature{ {Signature: cltest.MustRandomBytes(t, 7), Signer: 248}, }, } err := db.StorePendingTransmission(testutils.Context(t), k2, p) require.NoError(t, err) m, err := db.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest) require.NoError(t, err) require.Len(t, m, 1) // FIXME: don't understand how the median is being used as a key or what the replacement is yet // require.Equal(t, p.Median, m[k2].Median) })` $DIR/core/services/ocr2/database_test.go: `.Unix(100, 0)` $DIR/core/services/ocr2/database_test.go: `.Random32Byte()` $DIR/core/services/ocr2/database_test.go: `.MustRandomBytes(t, 7)` $DIR/core/services/ocr2/database_test.go: `.StorePendingTransmission(testutils.Context(t), k2, p)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.Unix(100, 0)` $DIR/core/services/ocr2/database_test.go: `.Random32Byte()` $DIR/core/services/ocr2/database_test.go: `.MustRandomBytes(t, 7)` $DIR/core/services/ocr2/database_test.go: `.StorePendingTransmission(testutils.Context(t), k, p)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.Unix(1000, 0)` $DIR/core/services/ocr2/database_test.go: `.Random32Byte()` $DIR/core/services/ocr2/database_test.go: `.MustRandomBytes(t, 7)` $DIR/core/services/ocr2/database_test.go: `.StorePendingTransmission(testutils.Context(t), k2, p2)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.Now()` $DIR/core/services/ocr2/database_test.go: `.Random32Byte()` $DIR/core/services/ocr2/database_test.go: `.MustRandomBytes(t, 7)` $DIR/core/services/ocr2/database_test.go: `.StorePendingTransmission(testutils.Context(t), k2, p2)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.DeletePendingTransmissionsOlderThan(testutils.Context(t), time.Unix(900, 0))` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.Unix(900, 0)` $DIR/core/services/ocr2/database_test.go: `.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.NewDB(sqlDB, spec2.ID, defaultPluginID, lggr)` $DIR/core/services/ocr2/database_test.go: `.PendingTransmissionsWithConfigDigest(testutils.Context(t), configDigest)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/database_test.go: `.NewDB(sqlDB, 0, defaultPluginID, lggr)` $DIR/core/services/ocr2/database_test.go: `.MakeConfigDigest(t)` $DIR/core/services/ocr2/database_test.go: `.MakeConfigDigest(t)` $DIR/core/services/ocr2/database_test.go: `.Context(t)` $DIR/core/services/ocr2/database_test.go: `.AssertCount(t, sqlDB, "ocr_protocol_states", expected)` $DIR/core/services/ocr2/database_test.go: `.WriteProtocolState(ctx, cd1, "key1", []byte{1})` $DIR/core/services/ocr2/database_test.go: `.WriteProtocolState(ctx, cd2, "key1", []byte{2})` $DIR/core/services/ocr2/database_test.go: `.WriteProtocolState(ctx, cd2, "key2", []byte{3})` $DIR/core/services/ocr2/database_test.go: `.WriteProtocolState(ctx, cd2, "key2", []byte{4})` $DIR/core/services/ocr2/database_test.go: `.ReadProtocolState(ctx, cd1, "key1")` $DIR/core/services/ocr2/database_test.go: `.ReadProtocolState(ctx, cd2, "key1")` $DIR/core/services/ocr2/database_test.go: `.ReadProtocolState(ctx, cd2, "key2")` $DIR/core/services/ocr2/database_test.go: `.WriteProtocolState(ctx, cd1, "key1", []byte{})` $DIR/core/services/ocr2/database_test.go: `.ReadProtocolState(ctx, cd1, "key1")` $DIR/core/services/ocr2/database_test.go: `.WriteProtocolState(ctx, cd1, "key1", nil)` $DIR/core/services/ocr2/database_test.go: `.ReadProtocolState(ctx, cd1, "key1")` $DIR/core/services/ocr2/delegate_test.go: `c.EVM = append(c.EVM, &evmcfg.EVMConfig{ ChainID: customChainID, Chain: evmcfg.Defaults(customChainID), Enabled: &enabled, Nodes: evmcfg.EVMNodes{{}}, })` $DIR/core/services/ocr2/delegate_test.go: `jb.OCR2OracleSpec.PluginType = tc.pluginType` $DIR/core/services/ocr2/delegate_test.go: `jb.OCR2OracleSpec.TransmitterID = tc.transmitterID` $DIR/core/services/ocr2/delegate_test.go: `jb.OCR2OracleSpec.RelayConfig["sendingKeys"] = tc.sendingKeys` $DIR/core/services/ocr2/delegate_test.go: `jb.ForwardingAllowed = tc.forwardingEnabled` $DIR/core/services/ocr2/delegate_test.go: `getForwarderMethodName = "GetForwarderForEOAOCR2Feeds"` $DIR/core/services/ocr2/delegate_test.go: `args = append(args, common.HexToAddress(jb.OCR2OracleSpec.ContractID))` $DIR/core/services/ocr2/delegate_test.go: `txManager.Mock.On(getForwarderMethodName, args...).Return(common.HexToAddress("0x0"), errors.New("random error")).Once()` $DIR/core/services/ocr2/delegate_test.go: `txManager.Mock.On(getForwarderMethodName, args...).Return(common.HexToAddress(tc.expectedTransmitterID), nil).Once()` $DIR/core/services/ocr2/delegate_test.go: `t.Run("when sending keys are not defined, the first one should be set to transmitterID", func(t *testing.T) { ctx := testutils.Context(t) jb, err := ocr2validate.ValidatedOracleSpecToml(testutils.Context(t), config.OCR2(), config.Insecure(), testspecs.GetOCR2EVMSpecMinimal(), nil) require.NoError(t, err) jb.OCR2OracleSpec.TransmitterID = null.StringFrom("some transmitterID string") jb.OCR2OracleSpec.RelayConfig["sendingKeys"] = nil chain, err := legacyChains.Get(customChainID.String()) require.NoError(t, err) effectiveTransmitterID, err := ocr2.GetEVMEffectiveTransmitterID(ctx, &jb, chain, lggr) require.NoError(t, err) require.Equal(t, "some transmitterID string", effectiveTransmitterID) require.Equal(t, []string{"some transmitterID string"}, jb.OCR2OracleSpec.RelayConfig["sendingKeys"].([]string)) })` $DIR/core/services/ocr2/delegate_test.go: `jb.OCR2OracleSpec.TransmitterID = null.StringFrom("some transmitterID string")` $DIR/core/services/ocr2/delegate_test.go: `jb.OCR2OracleSpec.RelayConfig["sendingKeys"] = nil` $DIR/core/services/ocr2/delegate_test.go: `t.Run(tc.name, func(t *testing.T) { ctx := testutils.Context(t) jb, err := ocr2validate.ValidatedOracleSpecToml(testutils.Context(t), config.OCR2(), config.Insecure(), testspecs.GetOCR2EVMSpecMinimal(), nil) require.NoError(t, err) setTestCase(&jb, tc, txManager) chain, err := legacyChains.Get(customChainID.String()) require.NoError(t, err) effectiveTransmitterID, err := ocr2.GetEVMEffectiveTransmitterID(ctx, &jb, chain, lggr) if tc.expectedError { require.Error(t, err) } else { require.NoError(t, err) } require.Equal(t, tc.expectedTransmitterID, effectiveTransmitterID) // when forwarding is enabled effectiveTransmitter differs unless it failed to fetch forwarder address if !jb.ForwardingAllowed { require.Equal(t, jb.OCR2OracleSpec.TransmitterID.String, effectiveTransmitterID) } })` $DIR/core/services/ocr2/delegate_test.go: `setTestCase(&jb, tc, txManager)` $DIR/core/services/ocr2/delegate_test.go: `jb.ForwardingAllowed = true` $DIR/core/services/ocr2/delegate_test.go: `jb.OCR2OracleSpec.TransmitterID = null.StringFrom("0x7e57000000000000000000000000000000000001")` $DIR/core/services/ocr2/delegate_test.go: `_, err = ocr2.GetEVMEffectiveTransmitterID(ctx, &jb, chain, lggr)` $DIR/core/services/ocr2/delegate_test.go: `.New(testutils.NewRandomEVMChainID())` $DIR/core/services/ocr2/delegate_test.go: `.NewRandomEVMChainID()` $DIR/core/services/ocr2/delegate_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { enabled := true c.EVM = append(c.EVM, &evmcfg.EVMConfig{ ChainID: customChainID, Chain: evmcfg.Defaults(customChainID), Enabled: &enabled, Nodes: evmcfg.EVMNodes{{}}, }) })` $DIR/core/services/ocr2/delegate_test.go: `.Defaults(customChainID)` $DIR/core/services/ocr2/delegate_test.go: `.NewSqlxDB(t)` $DIR/core/services/ocr2/delegate_test.go: `.NewKeyStore(t, db)` $DIR/core/services/ocr2/delegate_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/delegate_test.go: `.NewMockEvmTxManager(t)` $DIR/core/services/ocr2/delegate_test.go: `.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, GeneralConfig: config, KeyStore: keyStore.Eth(), TxManager: txManager})` $DIR/core/services/ocr2/delegate_test.go: `.Eth()` $DIR/core/services/ocr2/delegate_test.go: `.NewLegacyChainsFromRelayerExtenders(relayExtenders)` $DIR/core/services/ocr2/delegate_test.go: `.HexToAddress(jb.OCR2OracleSpec.ContractID)` $DIR/core/services/ocr2/delegate_test.go: `.Mock.On(getForwarderMethodName, args...)` $DIR/core/services/ocr2/delegate_test.go: `.Return(common.HexToAddress("0x0"), errors.New("random error"))` $DIR/core/services/ocr2/delegate_test.go: `.HexToAddress("0x0")` $DIR/core/services/ocr2/delegate_test.go: `.New("random error")` $DIR/core/services/ocr2/delegate_test.go: `.Once()` $DIR/core/services/ocr2/delegate_test.go: `.Mock.On(getForwarderMethodName, args...)` $DIR/core/services/ocr2/delegate_test.go: `.Return(common.HexToAddress(tc.expectedTransmitterID), nil)` $DIR/core/services/ocr2/delegate_test.go: `.HexToAddress(tc.expectedTransmitterID)` $DIR/core/services/ocr2/delegate_test.go: `.Once()` $DIR/core/services/ocr2/delegate_test.go: `.StringFrom("Mercury transmitterID")` $DIR/core/services/ocr2/delegate_test.go: `.StringFrom("0x7e57000000000000000000000000000000000001")` $DIR/core/services/ocr2/delegate_test.go: `.HexToAddress("0x7e57000000000000000000000000000000000001")` $DIR/core/services/ocr2/delegate_test.go: `.HexToAddress("0x7e57000000000000000000000000000000000001")` $DIR/core/services/ocr2/delegate_test.go: `.HexToAddress("0x7e57000000000000000000000000000000000001")` $DIR/core/services/ocr2/delegate_test.go: `.StringFrom("0x7e57000000000000000000000000000000000003")` $DIR/core/services/ocr2/delegate_test.go: `.HexToAddress("0x7e57000000000000000000000000000000000003")` $DIR/core/services/ocr2/delegate_test.go: `.Run("when sending keys are not defined, the first one should be set to transmitterID", func(t *testing.T) { ctx := testutils.Context(t) jb, err := ocr2validate.ValidatedOracleSpecToml(testutils.Context(t), config.OCR2(), config.Insecure(), testspecs.GetOCR2EVMSpecMinimal(), nil) require.NoError(t, err) jb.OCR2OracleSpec.TransmitterID = null.StringFrom("some transmitterID string") jb.OCR2OracleSpec.RelayConfig["sendingKeys"] = nil chain, err := legacyChains.Get(customChainID.String()) require.NoError(t, err) effectiveTransmitterID, err := ocr2.GetEVMEffectiveTransmitterID(ctx, &jb, chain, lggr) require.NoError(t, err) require.Equal(t, "some transmitterID string", effectiveTransmitterID) require.Equal(t, []string{"some transmitterID string"}, jb.OCR2OracleSpec.RelayConfig["sendingKeys"].([]string)) })` $DIR/core/services/ocr2/delegate_test.go: `.Context(t)` $DIR/core/services/ocr2/delegate_test.go: `.ValidatedOracleSpecToml(testutils.Context(t), config.OCR2(), config.Insecure(), testspecs.GetOCR2EVMSpecMinimal(), nil)` $DIR/core/services/ocr2/delegate_test.go: `.Context(t)` $DIR/core/services/ocr2/delegate_test.go: `.OCR2()` $DIR/core/services/ocr2/delegate_test.go: `.Insecure()` $DIR/core/services/ocr2/delegate_test.go: `.GetOCR2EVMSpecMinimal()` $DIR/core/services/ocr2/delegate_test.go: `.StringFrom("some transmitterID string")` $DIR/core/services/ocr2/delegate_test.go: `.Get(customChainID.String())` $DIR/core/services/ocr2/delegate_test.go: `.String()` $DIR/core/services/ocr2/delegate_test.go: `.GetEVMEffectiveTransmitterID(ctx, &jb, chain, lggr)` $DIR/core/services/ocr2/delegate_test.go: `.Run(tc.name, func(t *testing.T) { ctx := testutils.Context(t) jb, err := ocr2validate.ValidatedOracleSpecToml(testutils.Context(t), config.OCR2(), config.Insecure(), testspecs.GetOCR2EVMSpecMinimal(), nil) require.NoError(t, err) setTestCase(&jb, tc, txManager) chain, err := legacyChains.Get(customChainID.String()) require.NoError(t, err) effectiveTransmitterID, err := ocr2.GetEVMEffectiveTransmitterID(ctx, &jb, chain, lggr) if tc.expectedError { require.Error(t, err) } else { require.NoError(t, err) } require.Equal(t, tc.expectedTransmitterID, effectiveTransmitterID) // when forwarding is enabled effectiveTransmitter differs unless it failed to fetch forwarder address if !jb.ForwardingAllowed { require.Equal(t, jb.OCR2OracleSpec.TransmitterID.String, effectiveTransmitterID) } })` $DIR/core/services/ocr2/delegate_test.go: `.Context(t)` $DIR/core/services/ocr2/delegate_test.go: `.ValidatedOracleSpecToml(testutils.Context(t), config.OCR2(), config.Insecure(), testspecs.GetOCR2EVMSpecMinimal(), nil)` $DIR/core/services/ocr2/delegate_test.go: `.Context(t)` $DIR/core/services/ocr2/delegate_test.go: `.OCR2()` $DIR/core/services/ocr2/delegate_test.go: `.Insecure()` $DIR/core/services/ocr2/delegate_test.go: `.GetOCR2EVMSpecMinimal()` $DIR/core/services/ocr2/delegate_test.go: `.Get(customChainID.String())` $DIR/core/services/ocr2/delegate_test.go: `.String()` $DIR/core/services/ocr2/delegate_test.go: `.GetEVMEffectiveTransmitterID(ctx, &jb, chain, lggr)` $DIR/core/services/ocr2/delegate_test.go: `.Context(t)` $DIR/core/services/ocr2/delegate_test.go: `.ValidatedOracleSpecToml(testutils.Context(t), config.OCR2(), config.Insecure(), testspecs.GetOCR2EVMSpecMinimal(), nil)` $DIR/core/services/ocr2/delegate_test.go: `.Context(t)` $DIR/core/services/ocr2/delegate_test.go: `.OCR2()` $DIR/core/services/ocr2/delegate_test.go: `.Insecure()` $DIR/core/services/ocr2/delegate_test.go: `.GetOCR2EVMSpecMinimal()` $DIR/core/services/ocr2/delegate_test.go: `.StringFrom("0x7e57000000000000000000000000000000000001")` $DIR/core/services/ocr2/delegate_test.go: `.Get("not an id")` $DIR/core/services/ocr2/delegate_test.go: `.GetEVMEffectiveTransmitterID(ctx, &jb, chain, lggr)` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `t.Run("no error when keys are found", func(t *testing.T) { err = config.ValidatePluginConfig(pluginConfig, kst.DKGSign(), kst.DKGEncrypt()) require.NoError(t, err) })` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `err = config.ValidatePluginConfig(pluginConfig, kst.DKGSign(), kst.DKGEncrypt())` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `t.Run("error when encryption key not found", func(t *testing.T) { pluginConfig = config.PluginConfig{ EncryptionPublicKey: "wrongKey", SigningPublicKey: signKey, } err = config.ValidatePluginConfig(pluginConfig, kst.DKGSign(), kst.DKGEncrypt()) require.Error(t, err) require.Contains(t, err.Error(), "DKG encryption key: wrongKey not found in key store") })` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `pluginConfig = config.PluginConfig{ EncryptionPublicKey: "wrongKey", SigningPublicKey: signKey, }` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `err = config.ValidatePluginConfig(pluginConfig, kst.DKGSign(), kst.DKGEncrypt())` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `pluginConfig = config.PluginConfig{ EncryptionPublicKey: encryptKey, SigningPublicKey: "wrongKey", }` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `err = config.ValidatePluginConfig(pluginConfig, kst.DKGSign(), kst.DKGEncrypt())` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `.NewSqlxDB(t)` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `.NewKeyStore(t, db)` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `.DKGEncrypt()` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `.Create(ctx)` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `.DKGSign()` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `.Create(ctx)` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `.PublicKey.MarshalBinary()` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `.EncodeToString(encryptKeyBytes)` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `.PublicKey.MarshalBinary()` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `.EncodeToString(signKeyBytes)` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `.Run("no error when keys are found", func(t *testing.T) { err = config.ValidatePluginConfig(pluginConfig, kst.DKGSign(), kst.DKGEncrypt()) require.NoError(t, err) })` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `.ValidatePluginConfig(pluginConfig, kst.DKGSign(), kst.DKGEncrypt())` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `.DKGSign()` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `.DKGEncrypt()` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `.Run("error when encryption key not found", func(t *testing.T) { pluginConfig = config.PluginConfig{ EncryptionPublicKey: "wrongKey", SigningPublicKey: signKey, } err = config.ValidatePluginConfig(pluginConfig, kst.DKGSign(), kst.DKGEncrypt()) require.Error(t, err) require.Contains(t, err.Error(), "DKG encryption key: wrongKey not found in key store") })` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `.ValidatePluginConfig(pluginConfig, kst.DKGSign(), kst.DKGEncrypt())` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `.DKGSign()` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `.DKGEncrypt()` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `.ValidatePluginConfig(pluginConfig, kst.DKGSign(), kst.DKGEncrypt())` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `.DKGSign()` $DIR/core/services/ocr2/plugins/dkg/config/config_test.go: `.DKGEncrypt()` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `t.Run("valid input", func(tt *testing.T) { shareDB, db := setup(tt) var expectedRecords []ocr2vrftypes.PersistentShareSetRecord // Starting from 1 because player indexes must not be 0 for i := 1; i < 4; i++ { b := ocr2vrftypes.RawMarshalPlayerIdxInt(ocr2vrftypes.PlayerIdxInt(i)) playerIdx, _, err := ocr2vrftypes.UnmarshalPlayerIdx(b) require.NoError(t, err) shareRecord := crypto.Keccak256Hash([]byte(fmt.Sprintf("%d", i))) shareRecordHash := hash.GetHash(shareRecord[:]) var h hash.Hash copy(h[:], shareRecordHash[:]) rec := ocr2vrftypes.PersistentShareSetRecord{ Dealer: *playerIdx, MarshaledShareRecord: shareRecord[:], Hash: h, } expectedRecords = append(expectedRecords, rec) } err := shareDB.WriteShareRecords(testutils.Context(t), configDigest, keyID, expectedRecords) require.NoError(tt, err) rows, err := db.Query(`SELECT COUNT(*) AS count FROM dkg_shares`) require.NoError(tt, err) t.Cleanup(func() { assert.NoError(t, rows.Close()) }) var count int for rows.Next() { require.NoError(tt, rows.Scan(&count)) } require.NoError(tt, rows.Err()) require.Equal(tt, 3, count) })` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `copy(h[:], shareRecordHash[:])` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `expectedRecords = append(expectedRecords, rec)` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `t.Cleanup(func() { assert.NoError(t, rows.Close()) })` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `t.Run("bad input, zero hash", func(tt *testing.T) { shareDB, db := setup(tt) b := ocr2vrftypes.RawMarshalPlayerIdxInt(ocr2vrftypes.PlayerIdxInt(1)) dealer, _, err := ocr2vrftypes.UnmarshalPlayerIdx(b) require.NoError(tt, err) records := []ocr2vrftypes.PersistentShareSetRecord{ { Dealer: *dealer, MarshaledShareRecord: []byte{1}, Hash: hash.Hash{}, // There's a problem here }, } // no error, but there will be no rows inserted in the db err = shareDB.WriteShareRecords(testutils.Context(t), configDigest, keyID, records) require.NoError(tt, err) rows, err := db.Query(`SELECT COUNT(*) AS count FROM dkg_shares`) require.NoError(tt, err) t.Cleanup(func() { assert.NoError(t, rows.Close()) }) var count int for rows.Next() { require.NoError(tt, rows.Scan(&count)) } require.NoError(tt, rows.Err()) require.Equal(tt, 0, count) })` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `err = shareDB.WriteShareRecords(testutils.Context(t), configDigest, keyID, records)` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `t.Cleanup(func() { assert.NoError(t, rows.Close()) })` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `copy(h[:], shareRecordHash[:])` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `records = append(records, rec)` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `t.Cleanup(func() { assert.NoError(t, rows.Close()) })` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `copy(h[:], shareRecordHash[:])` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `expectedRecords = append(expectedRecords, rec)` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `expectedRecordsMap[*playerIdx] = rec` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `numAssertions++` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.Random32Byte()` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.Random32Byte()` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.Run("valid input", func(tt *testing.T) { shareDB, db := setup(tt) var expectedRecords []ocr2vrftypes.PersistentShareSetRecord // Starting from 1 because player indexes must not be 0 for i := 1; i < 4; i++ { b := ocr2vrftypes.RawMarshalPlayerIdxInt(ocr2vrftypes.PlayerIdxInt(i)) playerIdx, _, err := ocr2vrftypes.UnmarshalPlayerIdx(b) require.NoError(t, err) shareRecord := crypto.Keccak256Hash([]byte(fmt.Sprintf("%d", i))) shareRecordHash := hash.GetHash(shareRecord[:]) var h hash.Hash copy(h[:], shareRecordHash[:]) rec := ocr2vrftypes.PersistentShareSetRecord{ Dealer: *playerIdx, MarshaledShareRecord: shareRecord[:], Hash: h, } expectedRecords = append(expectedRecords, rec) } err := shareDB.WriteShareRecords(testutils.Context(t), configDigest, keyID, expectedRecords) require.NoError(tt, err) rows, err := db.Query(`SELECT COUNT(*) AS count FROM dkg_shares`) require.NoError(tt, err) t.Cleanup(func() { assert.NoError(t, rows.Close()) }) var count int for rows.Next() { require.NoError(tt, rows.Scan(&count)) } require.NoError(tt, rows.Err()) require.Equal(tt, 3, count) })` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.RawMarshalPlayerIdxInt(ocr2vrftypes.PlayerIdxInt(i))` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.PlayerIdxInt(i)` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.UnmarshalPlayerIdx(b)` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.Keccak256Hash([]byte(fmt.Sprintf("%d", i)))` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.Sprintf("%d", i)` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.GetHash(shareRecord[:])` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.WriteShareRecords(testutils.Context(t), configDigest, keyID, expectedRecords)` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.Query(`SELECT COUNT(*) AS count FROM dkg_shares`)` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.Cleanup(func() { assert.NoError(t, rows.Close()) })` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.Next()` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.Run("bad input, zero hash", func(tt *testing.T) { shareDB, db := setup(tt) b := ocr2vrftypes.RawMarshalPlayerIdxInt(ocr2vrftypes.PlayerIdxInt(1)) dealer, _, err := ocr2vrftypes.UnmarshalPlayerIdx(b) require.NoError(tt, err) records := []ocr2vrftypes.PersistentShareSetRecord{ { Dealer: *dealer, MarshaledShareRecord: []byte{1}, Hash: hash.Hash{}, // There's a problem here }, } // no error, but there will be no rows inserted in the db err = shareDB.WriteShareRecords(testutils.Context(t), configDigest, keyID, records) require.NoError(tt, err) rows, err := db.Query(`SELECT COUNT(*) AS count FROM dkg_shares`) require.NoError(tt, err) t.Cleanup(func() { assert.NoError(t, rows.Close()) }) var count int for rows.Next() { require.NoError(tt, rows.Scan(&count)) } require.NoError(tt, rows.Err()) require.Equal(tt, 0, count) })` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.RawMarshalPlayerIdxInt(ocr2vrftypes.PlayerIdxInt(1))` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.PlayerIdxInt(1)` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.UnmarshalPlayerIdx(b)` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.WriteShareRecords(testutils.Context(t), configDigest, keyID, records)` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.Query(`SELECT COUNT(*) AS count FROM dkg_shares`)` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.Cleanup(func() { assert.NoError(t, rows.Close()) })` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.Next()` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.RawMarshalPlayerIdxInt(ocr2vrftypes.PlayerIdxInt(i))` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.PlayerIdxInt(i)` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.UnmarshalPlayerIdx(b)` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.Keccak256Hash([]byte(fmt.Sprintf("%d", i)))` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.Sprintf("%d", i)` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.Keccak256Hash(shareRecord[:])` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.WriteShareRecords(testutils.Context(t), configDigest, keyID, records)` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.Query(`SELECT COUNT(*) AS count FROM dkg_shares`)` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.Cleanup(func() { assert.NoError(t, rows.Close()) })` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.Next()` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.Random32Byte()` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.Random32Byte()` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.RawMarshalPlayerIdxInt(ocr2vrftypes.PlayerIdxInt(i))` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.PlayerIdxInt(i)` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.UnmarshalPlayerIdx(b)` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.Keccak256Hash([]byte(fmt.Sprintf("%d", i)))` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.Sprintf("%d", i)` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.GetHash(shareRecord[:])` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.WriteShareRecords(testutils.Context(t), configDigest, keyID, expectedRecords)` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/dkg/persistence/db_test.go: `.ReadShareRecords(configDigest, keyID)` $DIR/core/services/ocr2/plugins/functions/aggregation_test.go: `t.Run(test.name, func(t *testing.T) { result, err := functions.Aggregate(test.mode, test.input) require.NoError(t, err) require.Equal(t, test.expected, result) })` $DIR/core/services/ocr2/plugins/functions/aggregation_test.go: `.CanAggregate(0, 0, obs[:0])` $DIR/core/services/ocr2/plugins/functions/aggregation_test.go: `.Run(test.name, func(t *testing.T) { result, err := functions.Aggregate(test.mode, test.input) require.NoError(t, err) require.Equal(t, test.expected, result) })` $DIR/core/services/ocr2/plugins/functions/aggregation_test.go: `.Aggregate(test.mode, test.input)` $DIR/core/services/ocr2/plugins/functions/config/config_test.go: `.Marshal(configProto)` $DIR/core/services/ocr2/plugins/functions/config/config_test.go: `.S4ConfigDecoder(configBytes)` $DIR/core/services/ocr2/plugins/functions/encoding/abi_codec_test.go: `_, err = encoding.SliceToByte32([]byte("0123456789012345678901234567890123456789"))` $DIR/core/services/ocr2/plugins/functions/encoding/abi_codec_test.go: `expected[i] = byte(i)` $DIR/core/services/ocr2/plugins/functions/encoding/abi_codec_test.go: `.NewReportCodec(1)` $DIR/core/services/ocr2/plugins/functions/encoding/abi_codec_test.go: `.Sprintf("%032d", 123)` $DIR/core/services/ocr2/plugins/functions/encoding/abi_codec_test.go: `.Sprintf("%032d", 4321)` $DIR/core/services/ocr2/plugins/functions/encoding/abi_codec_test.go: `.EncodeReport(report)` $DIR/core/services/ocr2/plugins/functions/encoding/abi_codec_test.go: `.DecodeReport(encoded)` $DIR/core/services/ocr2/plugins/functions/encoding/abi_codec_test.go: `.SliceToByte32([]byte("abcd"))` $DIR/core/services/ocr2/plugins/functions/encoding/abi_codec_test.go: `.SliceToByte32([]byte("0123456789012345678901234567890123456789"))` $DIR/core/services/ocr2/plugins/functions/encoding/abi_codec_test.go: `.SliceToByte32(expected[:])` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `utils.SetupRouterRoutes(t, b, owner, routerContract, active.Address, proposed.Address, allowListContractAddress)` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `utils.SetOracleConfig(t, b, owner, active.Contract, oracleIdentities, batchSize, &pluginConfig)` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `b.Commit()` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `utils.SetupRouterRoutes(t, b, owner, routerContract, active.Address, proposed.Address, allowListContractAddress)` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `utils.SetOracleConfig(t, b, owner, active.Contract, oracleIdentities, batchSize, &pluginConfig)` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `b.Commit()` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `utils.SetupRouterRoutes(t, b, owner, routerContract, active.Address, proposed.Address, allowListContractAddress)` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `utils.SetOracleConfig(t, b, owner, active.Contract, oracleIdentities, batchSize, &pluginConfig)` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `utils.SetOracleConfig(t, b, owner, proposed.Contract, oracleIdentities, batchSize, &pluginConfig)` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `utils.ClientTestRequests(t, owner, b, linkToken, routerAddress, routerContract, allowListContract, clientContracts, requestLenBytes, utils.DefaultSecretsUrlsBytes, subscriptionId, 1*time.Minute)` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `b.Commit()` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `.StartNewChainWithContracts(t, nClients)` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `.Stop()` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `.SetupRouterRoutes(t, b, owner, routerContract, active.Address, proposed.Address, allowListContractAddress)` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `.CreateFunctionsNodes(t, owner, b, routerAddress, nOracleNodes, maxGas, nil, nil)` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `.SetOracleConfig(t, b, owner, active.Contract, oracleIdentities, batchSize, &pluginConfig)` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `.CreateAndFundSubscriptions(t, b, owner, linkToken, routerAddress, routerContract, clientContracts, allowListContract)` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `.StartNewChainWithContracts(t, nClients)` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `.Stop()` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `.SetupRouterRoutes(t, b, owner, routerContract, active.Address, proposed.Address, allowListContractAddress)` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `.CreateFunctionsNodes(t, owner, b, routerAddress, nOracleNodes, maxGas, utils.ExportedOcr2Keystores, utils.MockThresholdKeyShares)` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `.SetOracleConfig(t, b, owner, active.Contract, oracleIdentities, batchSize, &pluginConfig)` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `.CreateAndFundSubscriptions(t, b, owner, linkToken, routerAddress, routerContract, clientContracts, allowListContract)` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `.StartNewChainWithContracts(t, nClients)` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `.Stop()` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `.SetupRouterRoutes(t, b, owner, routerContract, active.Address, proposed.Address, allowListContractAddress)` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `.CreateFunctionsNodes(t, owner, b, routerAddress, nOracleNodes, maxGas, utils.ExportedOcr2Keystores, utils.MockThresholdKeyShares)` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `.SetOracleConfig(t, b, owner, active.Contract, oracleIdentities, batchSize, &pluginConfig)` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `.SetOracleConfig(t, b, owner, proposed.Contract, oracleIdentities, batchSize, &pluginConfig)` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `.CreateAndFundSubscriptions(t, b, owner, linkToken, routerAddress, routerContract, clientContracts, allowListContract)` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `.ClientTestRequests(t, owner, b, linkToken, routerAddress, routerContract, allowListContract, clientContracts, requestLenBytes, utils.DefaultSecretsUrlsBytes, subscriptionId, 1*time.Minute)` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `.UpdateContracts(owner)` $DIR/core/services/ocr2/plugins/functions/integration_tests/v1/functions_integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `ethKeystore.On("EnabledKeysForChain", mock.Anything, mock.Anything).Return([]ethkey.KeyV2{keyV2}, nil)` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `_, err = functions.NewConnector(ctx, config, ethKeystore, chainID, s4Storage, allowlist, rateLimiter, subscriptions, listener, offchainTransmitter, logger.TestLogger(t))` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `ethKeystore.On("EnabledKeysForChain", mock.Anything, mock.Anything).Return([]ethkey.KeyV2{{Address: common.HexToAddress(addresses[1])}}, nil)` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `_, err = functions.NewConnector(ctx, config, ethKeystore, chainID, s4Storage, allowlist, rateLimiter, subscriptions, listener, offchainTransmitter, logger.TestLogger(t))` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.NewV2()` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.Address.String()` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.NewInt(80001)` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.NewEth(t)` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.NewStorage(t)` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.NewOnchainAllowlist(t)` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.NewOnchainSubscriptions(t)` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.NewRateLimiter(hc.RateLimiterConfig{GlobalRPS: 100.0, GlobalBurst: 100, PerSenderRPS: 100.0, PerSenderBurst: 100})` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.NewFunctionsListener(t)` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.NewOffchainTransmitter(t)` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.On("EnabledKeysForChain", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.Return([]ethkey.KeyV2{keyV2}, nil)` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.NewConnector(ctx, config, ethKeystore, chainID, s4Storage, allowlist, rateLimiter, subscriptions, listener, offchainTransmitter, logger.TestLogger(t))` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.NewInt(80001)` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.NewEth(t)` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.NewStorage(t)` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.NewOnchainAllowlist(t)` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.NewOnchainSubscriptions(t)` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.NewRateLimiter(hc.RateLimiterConfig{GlobalRPS: 100.0, GlobalBurst: 100, PerSenderRPS: 100.0, PerSenderBurst: 100})` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.NewFunctionsListener(t)` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.NewOffchainTransmitter(t)` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.On("EnabledKeysForChain", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.Return([]ethkey.KeyV2{{Address: common.HexToAddress(addresses[1])}}, nil)` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.HexToAddress(addresses[1])` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.NewConnector(ctx, config, ethKeystore, chainID, s4Storage, allowlist, rateLimiter, subscriptions, listener, offchainTransmitter, logger.TestLogger(t))` $DIR/core/services/ocr2/plugins/functions/plugin_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `orm.On("FindOldestEntriesByState", mock.Anything, functions_srv.RESULT_READY, uint32(batchSize), mock.Anything).Return(reqs, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `err = proto.Unmarshal(q, queryProto)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `reqs[0].CoordinatorContractAddress = &common.Address{1}` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `reqs[1].CoordinatorContractAddress = &common.Address{2}` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `orm.On("FindOldestEntriesByState", mock.Anything, functions_srv.RESULT_READY, uint32(batchSize), mock.Anything).Return(reqs, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `err = proto.Unmarshal(q, queryProto)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `orm.On("FindById", mock.Anything, req1.RequestID, mock.Anything).Return(&req1, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `orm.On("FindById", mock.Anything, req2.RequestID, mock.Anything).Return(&req2, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `orm.On("FindById", mock.Anything, req3.RequestID, mock.Anything).Return(&req3, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `orm.On("FindById", mock.Anything, req4.RequestID, mock.Anything).Return(&req4, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `orm.On("FindById", mock.Anything, nonexistentId, mock.Anything).Return(nil, errors.New("nonexistent ID"))` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `err = proto.Unmarshal(obs, observationProto)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `orm.On("FindById", mock.Anything, req1.RequestID, mock.Anything).Return(&req1, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `queryProto.RequestIDs = [][]byte{invalidId, req1.RequestID[:], invalidId}` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `err = proto.Unmarshal(obs, observationProto)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `obs = append(obs, newObservation(t, 3, procReq1, procReq2))` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `produced, reportBytes, err = plugin.Report(testutils.Context(t), types.ReportTimestamp{}, query, obs)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `orm.On("FindById", mock.Anything, req1.RequestID, mock.Anything).Return(nil, errors.New("nonexistent ID"))` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `orm.On("FindById", mock.Anything, req2.RequestID, mock.Anything).Return(&req2, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `orm.On("SetFinalized", mock.Anything, req2.RequestID, mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `orm.On("FindById", mock.Anything, req3.RequestID, mock.Anything).Return(&req3, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `orm.On("SetFinalized", mock.Anything, req3.RequestID, mock.Anything, mock.Anything, mock.Anything).Return(errors.New("same state"))` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `orm.On("FindById", mock.Anything, req4.RequestID, mock.Anything).Return(&req4, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `orm.On("SetFinalized", mock.Anything, req4.RequestID, mock.Anything, mock.Anything, mock.Anything).Return(errors.New("already timed out"))` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `should, err = plugin.ShouldAcceptFinalizedReport(testutils.Context(t), types.ReportTimestamp{}, getReportBytes(t, codec, req2, req3))` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `should, err = plugin.ShouldAcceptFinalizedReport(testutils.Context(t), types.ReportTimestamp{}, getReportBytes(t, codec, req1, req4))` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `req1.OnchainMetadata = []byte(functions_srv.OffchainRequestMarker)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `orm.On("FindById", mock.Anything, req1.RequestID, mock.Anything).Return(&req1, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `orm.On("SetFinalized", mock.Anything, req1.RequestID, mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `offchainTransmitter.On("TransmitReport", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `orm.On("FindById", mock.Anything, req1.RequestID, mock.Anything).Return(nil, errors.New("nonexistent ID"))` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `orm.On("FindById", mock.Anything, req2.RequestID, mock.Anything).Return(&req2, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `orm.On("FindById", mock.Anything, req3.RequestID, mock.Anything).Return(&req3, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `orm.On("FindById", mock.Anything, req4.RequestID, mock.Anything).Return(&req4, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `orm.On("FindById", mock.Anything, req5.RequestID, mock.Anything).Return(&req5, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `should, err = plugin.ShouldTransmitAcceptedReport(testutils.Context(t), types.ReportTimestamp{}, getReportBytes(t, codec, req2, req3))` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `should, err = plugin.ShouldTransmitAcceptedReport(testutils.Context(t), types.ReportTimestamp{}, getReportBytes(t, codec, req1, req2))` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `newCoord, err = functions.ShouldIncludeCoordinator(zeroAddr, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `newCoord, err = functions.ShouldIncludeCoordinator(coord1, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `newCoord, err = functions.ShouldIncludeCoordinator(coord1, newCoord)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `newCoord, err = functions.ShouldIncludeCoordinator(coord2, newCoord)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.On("FindOldestEntriesByState", mock.Anything, functions_srv.RESULT_READY, uint32(batchSize), mock.Anything)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Return(reqs, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Query(testutils.Context(t), types.ReportTimestamp{})` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Unmarshal(q, queryProto)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.On("FindOldestEntriesByState", mock.Anything, functions_srv.RESULT_READY, uint32(batchSize), mock.Anything)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Return(reqs, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Query(testutils.Context(t), types.ReportTimestamp{})` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Unmarshal(q, queryProto)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.On("FindById", mock.Anything, req1.RequestID, mock.Anything)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Return(&req1, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.On("FindById", mock.Anything, req2.RequestID, mock.Anything)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Return(&req2, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.On("FindById", mock.Anything, req3.RequestID, mock.Anything)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Return(&req3, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.On("FindById", mock.Anything, req4.RequestID, mock.Anything)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Return(&req4, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.On("FindById", mock.Anything, nonexistentId, mock.Anything)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Return(nil, errors.New("nonexistent ID"))` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.New("nonexistent ID")` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Observation(testutils.Context(t), types.ReportTimestamp{}, query)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Unmarshal(obs, observationProto)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.On("FindById", mock.Anything, req1.RequestID, mock.Anything)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Return(&req1, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Marshal(&queryProto)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Observation(testutils.Context(t), types.ReportTimestamp{}, marshalled)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Unmarshal(obs, observationProto)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Report(testutils.Context(t), types.ReportTimestamp{}, query, obs)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Report(testutils.Context(t), types.ReportTimestamp{}, query, obs)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.DecodeReport(reportBytes)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Report(testutils.Context(t), types.ReportTimestamp{}, query, obs)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.DecodeReport(reportBytes)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Report(testutils.Context(t), types.ReportTimestamp{}, query, obs)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.DecodeReport(reportBytes)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Report(testutils.Context(t), types.ReportTimestamp{}, query, obs)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.DecodeReport(reportBytes)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Report(testutils.Context(t), types.ReportTimestamp{}, query, obs)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Report(testutils.Context(t), types.ReportTimestamp{}, query, obs)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.DecodeReport(reportBytes1)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Report(testutils.Context(t), types.ReportTimestamp{}, query, obs)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.On("FindById", mock.Anything, req1.RequestID, mock.Anything)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Return(nil, errors.New("nonexistent ID"))` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.New("nonexistent ID")` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.On("FindById", mock.Anything, req2.RequestID, mock.Anything)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Return(&req2, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.On("SetFinalized", mock.Anything, req2.RequestID, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Return(nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.On("FindById", mock.Anything, req3.RequestID, mock.Anything)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Return(&req3, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.On("SetFinalized", mock.Anything, req3.RequestID, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Return(errors.New("same state"))` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.New("same state")` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.On("FindById", mock.Anything, req4.RequestID, mock.Anything)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Return(&req4, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.On("SetFinalized", mock.Anything, req4.RequestID, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Return(errors.New("already timed out"))` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.New("already timed out")` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.ShouldAcceptFinalizedReport(testutils.Context(t), types.ReportTimestamp{}, getReportBytes(t, codec, req3, req4))` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.ShouldAcceptFinalizedReport(testutils.Context(t), types.ReportTimestamp{}, getReportBytes(t, codec, req2, req3))` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.ShouldAcceptFinalizedReport(testutils.Context(t), types.ReportTimestamp{}, getReportBytes(t, codec, req1, req4))` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.On("FindById", mock.Anything, req1.RequestID, mock.Anything)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Return(&req1, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.On("SetFinalized", mock.Anything, req1.RequestID, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Return(nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.On("TransmitReport", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Return(nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.ShouldAcceptFinalizedReport(testutils.Context(t), types.ReportTimestamp{}, getReportBytes(t, codec, req1))` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.On("FindById", mock.Anything, req1.RequestID, mock.Anything)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Return(nil, errors.New("nonexistent ID"))` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.New("nonexistent ID")` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.On("FindById", mock.Anything, req2.RequestID, mock.Anything)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Return(&req2, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.On("FindById", mock.Anything, req3.RequestID, mock.Anything)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Return(&req3, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.On("FindById", mock.Anything, req4.RequestID, mock.Anything)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Return(&req4, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.On("FindById", mock.Anything, req5.RequestID, mock.Anything)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Return(&req5, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.ShouldTransmitAcceptedReport(testutils.Context(t), types.ReportTimestamp{}, getReportBytes(t, codec, req5, req4))` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.ShouldTransmitAcceptedReport(testutils.Context(t), types.ReportTimestamp{}, getReportBytes(t, codec, req2, req3))` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.ShouldTransmitAcceptedReport(testutils.Context(t), types.ReportTimestamp{}, getReportBytes(t, codec, req1, req2))` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.ShouldIncludeCoordinator(nil, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.ShouldIncludeCoordinator(zeroAddr, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.ShouldIncludeCoordinator(coord1, nil)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.ShouldIncludeCoordinator(coord1, newCoord)` $DIR/core/services/ocr2/plugins/functions/reporting_test.go: `.ShouldIncludeCoordinator(coord2, newCoord)` $DIR/core/services/ocr2/plugins/generic/merge_test.go: `merge(vars, addedVars)` $DIR/core/services/ocr2/plugins/generic/merge_test.go: `.DeepEqual(vars, map[string]interface{}{ "jb": map[string]interface{}{ "databaseID": "some-job-id", "some-other-var": "foo", }, "val": 0, })` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `testutils.SkipShortDB(t)` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `err = keystore.Unlock(ctx, cfg.Password().Keystore())` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `jb.Name = null.StringFrom("Job 1")` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `jb.OCR2OracleSpec.TransmitterID = null.StringFrom(address.String())` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `jb.OCR2OracleSpec.PluginConfig["juelsPerFeeCoinSource"] = juelsPerFeeCoinSource` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `err = jobORM.CreateJob(ctx, &jb)` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.SkipShortDB(t)` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.Database()` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.URL()` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.NewConnection(url.String(), cfg.Database().Dialect(), cfg.Database())` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.String()` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.Database()` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.Dialect()` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.Database()` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.NewInMemory(db, utils.FastScryptParams, logger)` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.NewORM(db, logger, cfg.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.JobPipeline()` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.NewORM(db)` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.NewORM(db, pipelineORM, bridgesORM, keystore, logger)` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.NewRunner( pipelineORM, bridgesORM, cfg.JobPipeline(), cfg.WebServer(), nil, keystore.Eth(), keystore.VRF(), logger, http.DefaultClient, http.DefaultClient, )` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.JobPipeline()` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.WebServer()` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.Eth()` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.VRF()` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.Unlock(ctx, cfg.Password().Keystore())` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.Password()` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.Keystore()` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.ValidatedOracleSpecToml(testutils.Context(t), cfg.OCR2(), cfg.Insecure(), testspecs.GetOCR2EVMSpecMinimal(), nil)` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.OCR2()` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.Insecure()` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.GetOCR2EVMSpecMinimal()` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.MustInsertRandomKey(t, keystore.Eth())` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.Eth()` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.StringFrom("Job 1")` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.StringFrom(address.String())` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.String()` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.CreateJob(ctx, &jb)` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.NewPipelineRunnerAdapter(logger, jb, pr)` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.ExecuteRun(testutils.Context(t), spec, core.Vars{Vars: map[string]interface{}{"val": 1}}, core.Options{})` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.NewFromInt(3)` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.Equal(finalResult)` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.New()` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.StringFrom("job-name")` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.NewPipelineRunnerAdapter(logger, job.Job{ID: jobID, ExternalJobID: externalJobID, Name: name}, mpr)` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.ExecuteRun(testutils.Context(t), spec, core.Vars{}, core.Options{})` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.vars.Get("jb.name")` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.vars.Get("jb.databaseID")` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.vars.Get("jb.externalJobID")` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.New()` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.StringFrom("job-name")` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.Type("generic")` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.NewPipelineRunnerAdapter(logger, job.Job{ID: jobID, ExternalJobID: externalJobID, Name: name, Type: jobType}, mpr)` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.ExecuteRun(testutils.Context(t), spec, core.Vars{}, core.Options{MaxTaskDuration: maxDuration})` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/generic/pipeline_runner_adapter_test.go: `.spec.MaxTaskDuration.Duration()` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `testRelayersMap[types.RelayID{Network: "N1", ChainID: "C1"}] = &TestRelayer{}` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `testRelayersMap[types.RelayID{Network: "N2", ChainID: "C2"}] = &TestRelayer{}` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `testRelayersMap[types.RelayID{Network: "N3", ChainID: "C3"}] = &TestRelayer{}` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `relayers, err = relayerSet.List(context.Background(), types.RelayID{Network: "N1", ChainID: "C1"}, types.RelayID{Network: "N3", ChainID: "C3"})` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `_, ok = relayers[types.RelayID{Network: "N3", ChainID: "C3"}]` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `testRelayersMap[types.RelayID{Network: "N1", ChainID: "C1"}] = &TestRelayer{}` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `testRelayersMap[types.RelayID{Network: "N2", ChainID: "C2"}] = &TestRelayer{}` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `testRelayersMap[types.RelayID{Network: "N3", ChainID: "C3"}] = &TestRelayer{}` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `_, err = relayerSet.Get(context.Background(), types.RelayID{Network: "N1", ChainID: "C1"})` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `_, err = relayerSet.Get(context.Background(), types.RelayID{Network: "N4", ChainID: "C4"})` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `testRelayersMap[types.RelayID{Network: "N1", ChainID: "C1"}] = testRelayer` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `testRelayersMap[types.RelayID{Network: "N2", ChainID: "C2"}] = &TestRelayer{}` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `testRelayersMap[types.RelayID{Network: "N3", ChainID: "C3"}] = &TestRelayer{}` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `_, err = relayer.NewPluginProvider(context.Background(), core.RelayArgs{ ContractID: "c1", RelayConfig: []byte("relayconfig"), ProviderType: "p1", MercuryCredentials: &types.MercuryCredentials{ LegacyURL: "legacy", URL: "url", Username: "user", Password: "pass", }, }, core.PluginArgs{ TransmitterID: "t1", PluginConfig: []byte("pluginconfig"), })` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `.New()` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `.List(context.Background())` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `.Background()` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `.List(context.Background(), types.RelayID{Network: "N1", ChainID: "C1"}, types.RelayID{Network: "N3", ChainID: "C3"})` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `.Background()` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `.New()` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `.Get(context.Background(), types.RelayID{Network: "N1", ChainID: "C1"})` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `.Background()` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `.Get(context.Background(), types.RelayID{Network: "N4", ChainID: "C4"})` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `.Background()` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `.New()` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `.Get(context.Background(), types.RelayID{Network: "N1", ChainID: "C1"})` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `.Background()` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `.NewPluginProvider(context.Background(), core.RelayArgs{ ContractID: "c1", RelayConfig: []byte("relayconfig"), ProviderType: "p1", MercuryCredentials: &types.MercuryCredentials{ LegacyURL: "legacy", URL: "url", Username: "user", Password: "pass", }, }, core.PluginArgs{ TransmitterID: "t1", PluginConfig: []byte("pluginconfig"), })` $DIR/core/services/ocr2/plugins/generic/relayerset_test.go: `.Background()` $DIR/core/services/ocr2/plugins/generic/telemetry_adapter_test.go: `t.Run(test.name, func(t *testing.T) { err := ta.Send(testutils.Context(t), test.networkID, test.chainID, test.contractID, test.telemetryType, test.payload) if test.errorMsg != "" { assert.ErrorContains(t, err, test.errorMsg) } else { require.NoError(t, err) key := [4]string{test.networkID, test.chainID, test.contractID, test.telemetryType} endpoint, ok := ta.Endpoints()[key] require.True(t, ok) me := endpoint.(*mockEndpoint) assert.Equal(t, test.networkID, me.network) assert.Equal(t, test.chainID, me.chainID) assert.Equal(t, test.contractID, me.contractID) assert.Equal(t, test.telemetryType, me.telemetryType) assert.Equal(t, test.payload, me.payload) } })` $DIR/core/services/ocr2/plugins/generic/telemetry_adapter_test.go: `.NewTelemetryAdapter(&mockGenerator{})` $DIR/core/services/ocr2/plugins/generic/telemetry_adapter_test.go: `.Run(test.name, func(t *testing.T) { err := ta.Send(testutils.Context(t), test.networkID, test.chainID, test.contractID, test.telemetryType, test.payload) if test.errorMsg != "" { assert.ErrorContains(t, err, test.errorMsg) } else { require.NoError(t, err) key := [4]string{test.networkID, test.chainID, test.contractID, test.telemetryType} endpoint, ok := ta.Endpoints()[key] require.True(t, ok) me := endpoint.(*mockEndpoint) assert.Equal(t, test.networkID, me.network) assert.Equal(t, test.chainID, me.chainID) assert.Equal(t, test.contractID, me.contractID) assert.Equal(t, test.telemetryType, me.telemetryType) assert.Equal(t, test.payload, me.payload) } })` $DIR/core/services/ocr2/plugins/generic/telemetry_adapter_test.go: `.Send(testutils.Context(t), test.networkID, test.chainID, test.contractID, test.telemetryType, test.payload)` $DIR/core/services/ocr2/plugins/generic/telemetry_adapter_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/generic/telemetry_adapter_test.go: `.Endpoints()` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `t.Run("with all possible values set", func(t *testing.T) { rawToml := fmt.Sprintf(` ServerURL = "example.com:80" ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" BenchmarkMode = true ChannelDefinitionsContractAddress = "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef" ChannelDefinitionsContractFromBlock = 1234 ChannelDefinitions = """ %s """`, cdjson) var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) assert.Equal(t, "example.com:80", mc.RawServerURL) assert.Equal(t, "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", mc.ServerPubKey.String()) assert.Equal(t, "0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF", mc.ChannelDefinitionsContractAddress.Hex()) assert.Equal(t, int64(1234), mc.ChannelDefinitionsContractFromBlock) assert.JSONEq(t, cdjson, mc.ChannelDefinitions) assert.True(t, mc.BenchmarkMode) err = mc.Validate() require.Error(t, err) assert.Contains(t, err.Error(), "llo: ChannelDefinitionsContractAddress is not allowed if ChannelDefinitions is specified") assert.Contains(t, err.Error(), "llo: ChannelDefinitionsContractFromBlock is not allowed if ChannelDefinitions is specified") })` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `err = mc.Validate()` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `t.Run("with only channelDefinitions", func(t *testing.T) { rawToml := fmt.Sprintf(` ServerURL = "example.com:80" ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" ChannelDefinitions = """ %s """`, cdjson) var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) assert.Equal(t, "example.com:80", mc.RawServerURL) assert.Equal(t, "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", mc.ServerPubKey.String()) assert.JSONEq(t, cdjson, mc.ChannelDefinitions) assert.False(t, mc.BenchmarkMode) err = mc.Validate() require.NoError(t, err) })` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `err = mc.Validate()` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `t.Run("with only channelDefinitions contract details", func(t *testing.T) { rawToml := ` ServerURL = "example.com:80" ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" ChannelDefinitionsContractAddress = "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef"` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) assert.Equal(t, "example.com:80", mc.RawServerURL) assert.Equal(t, "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", mc.ServerPubKey.String()) assert.Equal(t, "0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF", mc.ChannelDefinitionsContractAddress.Hex()) assert.False(t, mc.BenchmarkMode) err = mc.Validate() require.NoError(t, err) })` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `err = mc.Validate()` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `t.Run("with missing ChannelDefinitionsContractAddress", func(t *testing.T) { rawToml := ` ServerURL = "example.com:80" ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93"` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) assert.Equal(t, "example.com:80", mc.RawServerURL) assert.Equal(t, "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", mc.ServerPubKey.String()) assert.False(t, mc.BenchmarkMode) err = mc.Validate() require.Error(t, err) assert.EqualError(t, err, "llo: ChannelDefinitionsContractAddress is required if ChannelDefinitions is not specified") })` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `err = mc.Validate()` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `t.Run("with invalid values", func(t *testing.T) { rawToml := ` ChannelDefinitionsContractFromBlock = "invalid" ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.Error(t, err) assert.EqualError(t, err, `toml: cannot decode TOML string into struct field config.PluginConfig.ChannelDefinitionsContractFromBlock of type int64`) assert.False(t, mc.BenchmarkMode) rawToml = ` ServerURL = "http://example.com" ServerPubKey = "4242" ` err = toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = mc.Validate() require.Error(t, err) assert.Contains(t, err.Error(), `invalid scheme specified for MercuryServer, got: "http://example.com" (scheme: "http") but expected a websocket url e.g. "192.0.2.2:4242" or "wss://192.0.2.2:4242"`) assert.Contains(t, err.Error(), `ServerPubKey is required and must be a 32-byte hex string`) })` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `rawToml = ` ServerURL = "http://example.com" ServerPubKey = "4242" `` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `err = toml.Unmarshal([]byte(rawToml), &mc)` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `err = mc.Validate()` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `.Run("with all possible values set", func(t *testing.T) { rawToml := fmt.Sprintf(` ServerURL = "example.com:80" ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" BenchmarkMode = true ChannelDefinitionsContractAddress = "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef" ChannelDefinitionsContractFromBlock = 1234 ChannelDefinitions = """ %s """`, cdjson) var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) assert.Equal(t, "example.com:80", mc.RawServerURL) assert.Equal(t, "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", mc.ServerPubKey.String()) assert.Equal(t, "0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF", mc.ChannelDefinitionsContractAddress.Hex()) assert.Equal(t, int64(1234), mc.ChannelDefinitionsContractFromBlock) assert.JSONEq(t, cdjson, mc.ChannelDefinitions) assert.True(t, mc.BenchmarkMode) err = mc.Validate() require.Error(t, err) assert.Contains(t, err.Error(), "llo: ChannelDefinitionsContractAddress is not allowed if ChannelDefinitions is specified") assert.Contains(t, err.Error(), "llo: ChannelDefinitionsContractFromBlock is not allowed if ChannelDefinitions is specified") })` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `.Sprintf(` ServerURL = "example.com:80" ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" BenchmarkMode = true ChannelDefinitionsContractAddress = "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef" ChannelDefinitionsContractFromBlock = 1234 ChannelDefinitions = """ %s """`, cdjson)` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `.Unmarshal([]byte(rawToml), &mc)` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `.Validate()` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `.Run("with only channelDefinitions", func(t *testing.T) { rawToml := fmt.Sprintf(` ServerURL = "example.com:80" ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" ChannelDefinitions = """ %s """`, cdjson) var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) assert.Equal(t, "example.com:80", mc.RawServerURL) assert.Equal(t, "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", mc.ServerPubKey.String()) assert.JSONEq(t, cdjson, mc.ChannelDefinitions) assert.False(t, mc.BenchmarkMode) err = mc.Validate() require.NoError(t, err) })` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `.Sprintf(` ServerURL = "example.com:80" ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" ChannelDefinitions = """ %s """`, cdjson)` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `.Unmarshal([]byte(rawToml), &mc)` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `.Validate()` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `.Run("with only channelDefinitions contract details", func(t *testing.T) { rawToml := ` ServerURL = "example.com:80" ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" ChannelDefinitionsContractAddress = "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef"` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) assert.Equal(t, "example.com:80", mc.RawServerURL) assert.Equal(t, "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", mc.ServerPubKey.String()) assert.Equal(t, "0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF", mc.ChannelDefinitionsContractAddress.Hex()) assert.False(t, mc.BenchmarkMode) err = mc.Validate() require.NoError(t, err) })` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `.Unmarshal([]byte(rawToml), &mc)` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `.Validate()` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `.Run("with missing ChannelDefinitionsContractAddress", func(t *testing.T) { rawToml := ` ServerURL = "example.com:80" ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93"` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) assert.Equal(t, "example.com:80", mc.RawServerURL) assert.Equal(t, "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", mc.ServerPubKey.String()) assert.False(t, mc.BenchmarkMode) err = mc.Validate() require.Error(t, err) assert.EqualError(t, err, "llo: ChannelDefinitionsContractAddress is required if ChannelDefinitions is not specified") })` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `.Unmarshal([]byte(rawToml), &mc)` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `.Validate()` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `.Run("with invalid values", func(t *testing.T) { rawToml := ` ChannelDefinitionsContractFromBlock = "invalid" ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.Error(t, err) assert.EqualError(t, err, `toml: cannot decode TOML string into struct field config.PluginConfig.ChannelDefinitionsContractFromBlock of type int64`) assert.False(t, mc.BenchmarkMode) rawToml = ` ServerURL = "http://example.com" ServerPubKey = "4242" ` err = toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = mc.Validate() require.Error(t, err) assert.Contains(t, err.Error(), `invalid scheme specified for MercuryServer, got: "http://example.com" (scheme: "http") but expected a websocket url e.g. "192.0.2.2:4242" or "wss://192.0.2.2:4242"`) assert.Contains(t, err.Error(), `ServerPubKey is required and must be a 32-byte hex string`) })` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `.Unmarshal([]byte(rawToml), &mc)` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `.Unmarshal([]byte(rawToml), &mc)` $DIR/core/services/ocr2/plugins/llo/config/config_test.go: `.Validate()` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `streamMap[strm.id] = strm` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `clientCSAKeys[i] = key` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `clientPubKeys[i] = key.PublicKey` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `nodes = append(nodes, Node{ app, transmitter, kb, })` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `oracles = append(oracles, confighelper.OracleIdentityExtra{ OracleIdentity: confighelper.OracleIdentity{ OnchainPublicKey: offchainPublicKey, TransmitAccount: ocr2types.Account(fmt.Sprintf("%x", transmitter[:])), OffchainPublicKey: kb.OffchainPublicKey(), PeerID: peerID, }, ConfigEncryptionPublicKey: kb.ConfigEncryptionPublicKey(), })` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `backend.Commit()` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `addBootstrapJob(t, bootstrapNode, chainID, verifierAddress, "job-1")` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `addOCRJobs(t, streams, serverPubKey, serverURL, verifierAddress, bootstrapPeerID, bootstrapNodePort, nodes, configStoreAddress, clientPubKeys, chainID, fromBlock)` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `seen[o.OracleIdentity.TransmitAccount] = make(map[llotypes.ChannelID]struct{})` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `r, err = (datastreamsllo.JSONReportCodec{}).Decode(report.([]byte))` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `r, err = (lloevm.ReportCodec{}).Decode(report.([]byte))` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `seen[req.TransmitterID()][r.ChannelID] = struct{}{}` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `delete(seen, req.TransmitterID())` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.Now()` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.Unix()` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.NewInt(20_000 * multiplier)` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.NewInt(1_568 * multiplier)` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.NewInt(7150 * multiplier / 1000)` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.NewInt(2_020 * multiplier)` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(-1))` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.NewInt(-1)` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.PrivateKey(serverKey.Raw())` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.Raw()` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.NewInt(int64(i))` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.MustNewV2XXXTestingOnly(k)` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(-1))` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.NewInt(-1)` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.GetOne(t)` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.GetN(t, nNodes)` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.Sprintf("oracle_streams_%d", i)` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.DecodeString(strings.TrimPrefix(kb.OnChainPublicKey(), "0x"))` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.TrimPrefix(kb.OnChainPublicKey(), "0x")` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.OnChainPublicKey()` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.Account(fmt.Sprintf("%x", transmitter[:]))` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.Sprintf("%x", transmitter[:])` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.OffchainPublicKey()` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.ConfigEncryptionPublicKey()` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.App.GetRelayers()` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.LegacyEVMChains()` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.Get(testutils.SimulatedChainID.String())` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.SimulatedChainID.String()` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.Config()` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.EVM()` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.FinalityDepth()` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.TransmitterID()` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.PayloadTypes.UnpackIntoMap(v, req.req.Payload)` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.Decode(report.([]byte))` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.Decode(report.([]byte))` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.TransmitterID()` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.TransmitterID()` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.TransmitterID()` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.TransmitterID()` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.Deadline()` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.After(time.Until(d.Add(-100 * time.Millisecond)))` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.Until(d.Add(-100 * time.Millisecond))` $DIR/core/services/ocr2/plugins/llo/integration_test.go: `.Add(-100 * time.Millisecond)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `backend.Commit()` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `t.Run("with zero fromblock", func(t *testing.T) { lpOpts := logpoller.Opts{ PollPeriod: 100 * time.Millisecond, FinalityDepth: 1, BackfillBatchSize: 3, RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } lp := logpoller.NewLogPoller( logpoller.NewORM(testutils.SimulatedChainID, db, lggr), ethClient, lggr, lpOpts) servicetest.Run(t, lp) cdc := llo.NewChannelDefinitionCache(lggr, orm, lp, configStoreAddress, 0) servicetest.Run(t, cdc) testutils.WaitForLogMessage(t, observedLogs, "Updated channel definitions") dfns := cdc.Definitions() require.Len(t, dfns, 2) require.Contains(t, dfns, channel1) require.Contains(t, dfns, channel2) assert.Equal(t, llotypes.ChannelDefinition{ ReportFormat: llotypes.ReportFormatSolana, ChainSelector: chainSelector, StreamIDs: []uint32{1, 2, 3}, }, dfns[channel1]) assert.Equal(t, llotypes.ChannelDefinition{ ReportFormat: llotypes.ReportFormatEVM, ChainSelector: chainSelector, StreamIDs: []uint32{1, 2, 3}, }, dfns[channel2]) // remove solana require.NoError(t, utils.JustError(configStoreContract.RemoveChannel(steve, channel1))) backend.Commit() testutils.WaitForLogMessageCount(t, observedLogs, "Updated channel definitions", 2) dfns = cdc.Definitions() require.Len(t, dfns, 1) assert.NotContains(t, dfns, channel1) require.Contains(t, dfns, channel2) assert.Equal(t, llotypes.ChannelDefinition{ ReportFormat: llotypes.ReportFormatEVM, ChainSelector: chainSelector, StreamIDs: []uint32{1, 2, 3}, }, dfns[channel2]) // add channel3 with additional stream require.NoError(t, utils.JustError(configStoreContract.AddChannel(steve, channel3, channel3Def))) backend.Commit() testutils.WaitForLogMessageCount(t, observedLogs, "Updated channel definitions", 3) dfns = cdc.Definitions() require.Len(t, dfns, 2) require.Contains(t, dfns, channel2) require.Contains(t, dfns, channel3) assert.Equal(t, llotypes.ChannelDefinition{ ReportFormat: llotypes.ReportFormatEVM, ChainSelector: chainSelector, StreamIDs: []uint32{1, 2, 3}, }, dfns[channel2]) assert.Equal(t, llotypes.ChannelDefinition{ ReportFormat: llotypes.ReportFormatEVM, ChainSelector: chainSelector, StreamIDs: []uint32{1, 2, 3, 4}, }, dfns[channel3]) })` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `servicetest.Run(t, lp)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `servicetest.Run(t, cdc)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `testutils.WaitForLogMessage(t, observedLogs, "Updated channel definitions")` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `backend.Commit()` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `testutils.WaitForLogMessageCount(t, observedLogs, "Updated channel definitions", 2)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `dfns = cdc.Definitions()` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `backend.Commit()` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `testutils.WaitForLogMessageCount(t, observedLogs, "Updated channel definitions", 3)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `dfns = cdc.Definitions()` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `t.Run("loads from ORM", func(t *testing.T) { // Override logpoller to always return no logs lpOpts := logpoller.Opts{ PollPeriod: 100 * time.Millisecond, FinalityDepth: 1, BackfillBatchSize: 3, RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } lp := &mockLogPoller{ LogPoller: logpoller.NewLogPoller(logpoller.NewORM(testutils.SimulatedChainID, db, lggr), ethClient, lggr, lpOpts), LatestBlockFn: func(ctx context.Context) (int64, error) { return 0, nil }, LogsWithSigsFn: func(ctx context.Context, start, end int64, eventSigs []common.Hash, address common.Address) ([]logpoller.Log, error) { return []logpoller.Log{}, nil }, } cdc := llo.NewChannelDefinitionCache(lggr, orm, lp, configStoreAddress, 0) servicetest.Run(t, cdc) dfns := cdc.Definitions() require.Len(t, dfns, 2) require.Contains(t, dfns, channel2) require.Contains(t, dfns, channel3) assert.Equal(t, llotypes.ChannelDefinition{ ReportFormat: llotypes.ReportFormatEVM, ChainSelector: chainSelector, StreamIDs: []uint32{1, 2, 3}, }, dfns[channel2]) assert.Equal(t, llotypes.ChannelDefinition{ ReportFormat: llotypes.ReportFormatEVM, ChainSelector: chainSelector, StreamIDs: []uint32{1, 2, 3, 4}, }, dfns[channel3]) })` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `servicetest.Run(t, cdc)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `pgtest.MustExec(t, db, `DELETE FROM channel_definitions`)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `servicetest.Run(t, lp)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `servicetest.Run(t, cdc)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `testutils.WaitForLogMessageCount(t, observedLogs, "Updated channel definitions", 4)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.TestLoggerObserved(t, zapcore.InfoLevel)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.NewSqlxDB(t)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.NewORM(db, testutils.SimulatedChainID)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.Ether(1000)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.ToInt()` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil))` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.NewSimulatedBackendClient(t, backend, testutils.SimulatedChainID)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.DeployChannelConfigStore(steve, backend)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.Uint32()` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.Uint32()` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.Uint32()` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.SelectorFromChainId(testutils.SimulatedChainID.Uint64())` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.SimulatedChainID.Uint64()` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.BlockByHash(ctx, h)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.Run("with zero fromblock", func(t *testing.T) { lpOpts := logpoller.Opts{ PollPeriod: 100 * time.Millisecond, FinalityDepth: 1, BackfillBatchSize: 3, RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } lp := logpoller.NewLogPoller( logpoller.NewORM(testutils.SimulatedChainID, db, lggr), ethClient, lggr, lpOpts) servicetest.Run(t, lp) cdc := llo.NewChannelDefinitionCache(lggr, orm, lp, configStoreAddress, 0) servicetest.Run(t, cdc) testutils.WaitForLogMessage(t, observedLogs, "Updated channel definitions") dfns := cdc.Definitions() require.Len(t, dfns, 2) require.Contains(t, dfns, channel1) require.Contains(t, dfns, channel2) assert.Equal(t, llotypes.ChannelDefinition{ ReportFormat: llotypes.ReportFormatSolana, ChainSelector: chainSelector, StreamIDs: []uint32{1, 2, 3}, }, dfns[channel1]) assert.Equal(t, llotypes.ChannelDefinition{ ReportFormat: llotypes.ReportFormatEVM, ChainSelector: chainSelector, StreamIDs: []uint32{1, 2, 3}, }, dfns[channel2]) // remove solana require.NoError(t, utils.JustError(configStoreContract.RemoveChannel(steve, channel1))) backend.Commit() testutils.WaitForLogMessageCount(t, observedLogs, "Updated channel definitions", 2) dfns = cdc.Definitions() require.Len(t, dfns, 1) assert.NotContains(t, dfns, channel1) require.Contains(t, dfns, channel2) assert.Equal(t, llotypes.ChannelDefinition{ ReportFormat: llotypes.ReportFormatEVM, ChainSelector: chainSelector, StreamIDs: []uint32{1, 2, 3}, }, dfns[channel2]) // add channel3 with additional stream require.NoError(t, utils.JustError(configStoreContract.AddChannel(steve, channel3, channel3Def))) backend.Commit() testutils.WaitForLogMessageCount(t, observedLogs, "Updated channel definitions", 3) dfns = cdc.Definitions() require.Len(t, dfns, 2) require.Contains(t, dfns, channel2) require.Contains(t, dfns, channel3) assert.Equal(t, llotypes.ChannelDefinition{ ReportFormat: llotypes.ReportFormatEVM, ChainSelector: chainSelector, StreamIDs: []uint32{1, 2, 3}, }, dfns[channel2]) assert.Equal(t, llotypes.ChannelDefinition{ ReportFormat: llotypes.ReportFormatEVM, ChainSelector: chainSelector, StreamIDs: []uint32{1, 2, 3, 4}, }, dfns[channel3]) })` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.NewLogPoller( logpoller.NewORM(testutils.SimulatedChainID, db, lggr), ethClient, lggr, lpOpts)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.NewORM(testutils.SimulatedChainID, db, lggr)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.Run(t, lp)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.NewChannelDefinitionCache(lggr, orm, lp, configStoreAddress, 0)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.Run(t, cdc)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.WaitForLogMessage(t, observedLogs, "Updated channel definitions")` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.Definitions()` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.WaitForLogMessageCount(t, observedLogs, "Updated channel definitions", 2)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.Definitions()` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.WaitForLogMessageCount(t, observedLogs, "Updated channel definitions", 3)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.Definitions()` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.Run("loads from ORM", func(t *testing.T) { // Override logpoller to always return no logs lpOpts := logpoller.Opts{ PollPeriod: 100 * time.Millisecond, FinalityDepth: 1, BackfillBatchSize: 3, RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } lp := &mockLogPoller{ LogPoller: logpoller.NewLogPoller(logpoller.NewORM(testutils.SimulatedChainID, db, lggr), ethClient, lggr, lpOpts), LatestBlockFn: func(ctx context.Context) (int64, error) { return 0, nil }, LogsWithSigsFn: func(ctx context.Context, start, end int64, eventSigs []common.Hash, address common.Address) ([]logpoller.Log, error) { return []logpoller.Log{}, nil }, } cdc := llo.NewChannelDefinitionCache(lggr, orm, lp, configStoreAddress, 0) servicetest.Run(t, cdc) dfns := cdc.Definitions() require.Len(t, dfns, 2) require.Contains(t, dfns, channel2) require.Contains(t, dfns, channel3) assert.Equal(t, llotypes.ChannelDefinition{ ReportFormat: llotypes.ReportFormatEVM, ChainSelector: chainSelector, StreamIDs: []uint32{1, 2, 3}, }, dfns[channel2]) assert.Equal(t, llotypes.ChannelDefinition{ ReportFormat: llotypes.ReportFormatEVM, ChainSelector: chainSelector, StreamIDs: []uint32{1, 2, 3, 4}, }, dfns[channel3]) })` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.NewLogPoller(logpoller.NewORM(testutils.SimulatedChainID, db, lggr), ethClient, lggr, lpOpts)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.NewORM(testutils.SimulatedChainID, db, lggr)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.NewChannelDefinitionCache(lggr, orm, lp, configStoreAddress, 0)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.Run(t, cdc)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.Definitions()` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.MustExec(t, db, `DELETE FROM channel_definitions`)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.NewLogPoller(logpoller.NewORM(testutils.SimulatedChainID, db, lggr), ethClient, lggr, lpOpts)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.NewORM(testutils.SimulatedChainID, db, lggr)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.Run(t, lp)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.NewChannelDefinitionCache(lggr, orm, lp, configStoreAddress, channel2Block.Number().Int64()+1)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.Number()` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.Int64()` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.Run(t, cdc)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.WaitForLogMessageCount(t, observedLogs, "Updated channel definitions", 4)` $DIR/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go: `.Definitions()` $DIR/core/services/ocr2/plugins/median/config/config_test.go: `t.Run("pipeline validation", func(t *testing.T) { for _, tc := range []testCase{ {"empty pipeline", "", models.Interval(time.Minute), fmt.Errorf("invalid juelsPerFeeCoinSource pipeline: empty pipeline")}, {"blank pipeline", " ", models.Interval(time.Minute), fmt.Errorf("invalid juelsPerFeeCoinSource pipeline: empty pipeline")}, {"foo pipeline", "foo", models.Interval(time.Minute), fmt.Errorf("invalid juelsPerFeeCoinSource pipeline: UnmarshalTaskFromMap: unknown task type: \"\"")}, } { t.Run(tc.name, func(t *testing.T) { pc := PluginConfig{JuelsPerFeeCoinPipeline: tc.pipeline} assert.EqualError(t, pc.ValidatePluginConfig(), tc.expectedError.Error()) }) } })` $DIR/core/services/ocr2/plugins/median/config/config_test.go: `t.Run(tc.name, func(t *testing.T) { pc := PluginConfig{JuelsPerFeeCoinPipeline: tc.pipeline} assert.EqualError(t, pc.ValidatePluginConfig(), tc.expectedError.Error()) })` $DIR/core/services/ocr2/plugins/median/config/config_test.go: `t.Run("cache duration validation", func(t *testing.T) { for _, tc := range []testCase{ {"cache duration below minimum", `ds1 [type=bridge name=voter_turnout];`, models.Interval(time.Second * 29), fmt.Errorf("juelsPerFeeCoinSourceCache update interval: 29s is below 30 second minimum")}, {"cache duration above maximum", `ds1 [type=bridge name=voter_turnout];`, models.Interval(time.Minute*20 + time.Second), fmt.Errorf("juelsPerFeeCoinSourceCache update interval: 20m1s is above 20 minute maximum")}, } { t.Run(tc.name, func(t *testing.T) { pc := PluginConfig{JuelsPerFeeCoinPipeline: tc.pipeline, JuelsPerFeeCoinCache: &JuelsPerFeeCoinCache{UpdateInterval: tc.cacheDuration}} assert.EqualError(t, pc.ValidatePluginConfig(), tc.expectedError.Error()) }) } })` $DIR/core/services/ocr2/plugins/median/config/config_test.go: `t.Run(tc.name, func(t *testing.T) { pc := PluginConfig{JuelsPerFeeCoinPipeline: tc.pipeline, JuelsPerFeeCoinCache: &JuelsPerFeeCoinCache{UpdateInterval: tc.cacheDuration}} assert.EqualError(t, pc.ValidatePluginConfig(), tc.expectedError.Error()) })` $DIR/core/services/ocr2/plugins/median/config/config_test.go: `t.Run(s.name, func(t *testing.T) { pc := PluginConfig{JuelsPerFeeCoinPipeline: s.pipeline} assert.Nil(t, pc.ValidatePluginConfig()) })` $DIR/core/services/ocr2/plugins/median/config/config_test.go: `.Run("pipeline validation", func(t *testing.T) { for _, tc := range []testCase{ {"empty pipeline", "", models.Interval(time.Minute), fmt.Errorf("invalid juelsPerFeeCoinSource pipeline: empty pipeline")}, {"blank pipeline", " ", models.Interval(time.Minute), fmt.Errorf("invalid juelsPerFeeCoinSource pipeline: empty pipeline")}, {"foo pipeline", "foo", models.Interval(time.Minute), fmt.Errorf("invalid juelsPerFeeCoinSource pipeline: UnmarshalTaskFromMap: unknown task type: \"\"")}, } { t.Run(tc.name, func(t *testing.T) { pc := PluginConfig{JuelsPerFeeCoinPipeline: tc.pipeline} assert.EqualError(t, pc.ValidatePluginConfig(), tc.expectedError.Error()) }) } })` $DIR/core/services/ocr2/plugins/median/config/config_test.go: `.Interval(time.Minute)` $DIR/core/services/ocr2/plugins/median/config/config_test.go: `.Interval(time.Minute)` $DIR/core/services/ocr2/plugins/median/config/config_test.go: `.Interval(time.Minute)` $DIR/core/services/ocr2/plugins/median/config/config_test.go: `.Run(tc.name, func(t *testing.T) { pc := PluginConfig{JuelsPerFeeCoinPipeline: tc.pipeline} assert.EqualError(t, pc.ValidatePluginConfig(), tc.expectedError.Error()) })` $DIR/core/services/ocr2/plugins/median/config/config_test.go: `.Run("cache duration validation", func(t *testing.T) { for _, tc := range []testCase{ {"cache duration below minimum", `ds1 [type=bridge name=voter_turnout];`, models.Interval(time.Second * 29), fmt.Errorf("juelsPerFeeCoinSourceCache update interval: 29s is below 30 second minimum")}, {"cache duration above maximum", `ds1 [type=bridge name=voter_turnout];`, models.Interval(time.Minute*20 + time.Second), fmt.Errorf("juelsPerFeeCoinSourceCache update interval: 20m1s is above 20 minute maximum")}, } { t.Run(tc.name, func(t *testing.T) { pc := PluginConfig{JuelsPerFeeCoinPipeline: tc.pipeline, JuelsPerFeeCoinCache: &JuelsPerFeeCoinCache{UpdateInterval: tc.cacheDuration}} assert.EqualError(t, pc.ValidatePluginConfig(), tc.expectedError.Error()) }) } })` $DIR/core/services/ocr2/plugins/median/config/config_test.go: `.Interval(time.Second * 29)` $DIR/core/services/ocr2/plugins/median/config/config_test.go: `.Interval(time.Minute*20 + time.Second)` $DIR/core/services/ocr2/plugins/median/config/config_test.go: `.Run(tc.name, func(t *testing.T) { pc := PluginConfig{JuelsPerFeeCoinPipeline: tc.pipeline, JuelsPerFeeCoinCache: &JuelsPerFeeCoinCache{UpdateInterval: tc.cacheDuration}} assert.EqualError(t, pc.ValidatePluginConfig(), tc.expectedError.Error()) })` $DIR/core/services/ocr2/plugins/median/config/config_test.go: `.Interval(time.Second * 30)` $DIR/core/services/ocr2/plugins/median/config/config_test.go: `.Interval(time.Minute * 20)` $DIR/core/services/ocr2/plugins/median/config/config_test.go: `.Run(s.name, func(t *testing.T) { pc := PluginConfig{JuelsPerFeeCoinPipeline: s.pipeline} assert.Nil(t, pc.ValidatePluginConfig()) })` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `t.Run("Mercury v1", func(t *testing.T) { t.Run("with valid values", func(t *testing.T) { rawToml := ` ServerURL = "example.com:80" ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" InitialBlockNumber = 1234 ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) assert.Equal(t, "example.com:80", mc.RawServerURL) assert.Equal(t, "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", mc.ServerPubKey.String()) assert.Equal(t, int64(1234), mc.InitialBlockNumber.Int64) err = ValidatePluginConfig(mc, v1FeedId) require.NoError(t, err) }) t.Run("with multiple server URLs", func(t *testing.T) { t.Run("if no ServerURL/ServerPubKey is specified", func(t *testing.T) { rawToml := ` Servers = { "example.com:80" = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", "example2.invalid:1234" = "524ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" } ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) assert.Len(t, mc.Servers, 2) assert.Equal(t, "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", mc.Servers["example.com:80"].String()) assert.Equal(t, "524ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", mc.Servers["example2.invalid:1234"].String()) err = ValidatePluginConfig(mc, v1FeedId) require.NoError(t, err) }) t.Run("if ServerURL or ServerPubKey is specified", func(t *testing.T) { rawToml := ` Servers = { "example.com:80" = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", "example2.invalid:1234" = "524ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" } ServerURL = "example.com:80" ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = ValidatePluginConfig(mc, v1FeedId) require.EqualError(t, err, "Mercury: Servers and RawServerURL/ServerPubKey may not be specified together") rawToml = ` Servers = { "example.com:80" = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", "example2.invalid:1234" = "524ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" } ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" ` err = toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = ValidatePluginConfig(mc, v1FeedId) require.EqualError(t, err, "Mercury: Servers and RawServerURL/ServerPubKey may not be specified together") }) }) t.Run("with invalid values", func(t *testing.T) { rawToml := ` InitialBlockNumber = "invalid" ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.Error(t, err) assert.EqualError(t, err, `toml: strconv.ParseInt: parsing "invalid": invalid syntax`) rawToml = ` ServerURL = "http://example.com" ServerPubKey = "4242" ` err = toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = ValidatePluginConfig(mc, v1FeedId) require.Error(t, err) assert.Contains(t, err.Error(), `Mercury: invalid scheme specified for MercuryServer, got: "http://example.com" (scheme: "http") but expected a websocket url e.g. "192.0.2.2:4242" or "wss://192.0.2.2:4242"`) assert.Contains(t, err.Error(), `If RawServerURL is specified, ServerPubKey is also required and must be a 32-byte hex string`) }) t.Run("with unnecessary values", func(t *testing.T) { rawToml := ` ServerURL = "example.com:80" ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" LinkFeedID = "0x00026b4aa7e57ca7b68ae1bf45653f56b656fd3aa335ef7fae696b663f1b8472" ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = ValidatePluginConfig(mc, v1FeedId) assert.Contains(t, err.Error(), `linkFeedID may not be specified for v1 jobs`) }) })` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `t.Run("with valid values", func(t *testing.T) { rawToml := ` ServerURL = "example.com:80" ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" InitialBlockNumber = 1234 ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) assert.Equal(t, "example.com:80", mc.RawServerURL) assert.Equal(t, "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", mc.ServerPubKey.String()) assert.Equal(t, int64(1234), mc.InitialBlockNumber.Int64) err = ValidatePluginConfig(mc, v1FeedId) require.NoError(t, err) })` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `err = ValidatePluginConfig(mc, v1FeedId)` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `t.Run("with multiple server URLs", func(t *testing.T) { t.Run("if no ServerURL/ServerPubKey is specified", func(t *testing.T) { rawToml := ` Servers = { "example.com:80" = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", "example2.invalid:1234" = "524ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" } ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) assert.Len(t, mc.Servers, 2) assert.Equal(t, "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", mc.Servers["example.com:80"].String()) assert.Equal(t, "524ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", mc.Servers["example2.invalid:1234"].String()) err = ValidatePluginConfig(mc, v1FeedId) require.NoError(t, err) }) t.Run("if ServerURL or ServerPubKey is specified", func(t *testing.T) { rawToml := ` Servers = { "example.com:80" = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", "example2.invalid:1234" = "524ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" } ServerURL = "example.com:80" ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = ValidatePluginConfig(mc, v1FeedId) require.EqualError(t, err, "Mercury: Servers and RawServerURL/ServerPubKey may not be specified together") rawToml = ` Servers = { "example.com:80" = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", "example2.invalid:1234" = "524ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" } ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" ` err = toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = ValidatePluginConfig(mc, v1FeedId) require.EqualError(t, err, "Mercury: Servers and RawServerURL/ServerPubKey may not be specified together") }) })` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `t.Run("if no ServerURL/ServerPubKey is specified", func(t *testing.T) { rawToml := ` Servers = { "example.com:80" = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", "example2.invalid:1234" = "524ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" } ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) assert.Len(t, mc.Servers, 2) assert.Equal(t, "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", mc.Servers["example.com:80"].String()) assert.Equal(t, "524ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", mc.Servers["example2.invalid:1234"].String()) err = ValidatePluginConfig(mc, v1FeedId) require.NoError(t, err) })` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `err = ValidatePluginConfig(mc, v1FeedId)` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `t.Run("if ServerURL or ServerPubKey is specified", func(t *testing.T) { rawToml := ` Servers = { "example.com:80" = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", "example2.invalid:1234" = "524ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" } ServerURL = "example.com:80" ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = ValidatePluginConfig(mc, v1FeedId) require.EqualError(t, err, "Mercury: Servers and RawServerURL/ServerPubKey may not be specified together") rawToml = ` Servers = { "example.com:80" = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", "example2.invalid:1234" = "524ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" } ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" ` err = toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = ValidatePluginConfig(mc, v1FeedId) require.EqualError(t, err, "Mercury: Servers and RawServerURL/ServerPubKey may not be specified together") })` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `err = ValidatePluginConfig(mc, v1FeedId)` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `rawToml = ` Servers = { "example.com:80" = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", "example2.invalid:1234" = "524ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" } ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" `` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `err = toml.Unmarshal([]byte(rawToml), &mc)` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `err = ValidatePluginConfig(mc, v1FeedId)` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `t.Run("with invalid values", func(t *testing.T) { rawToml := ` InitialBlockNumber = "invalid" ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.Error(t, err) assert.EqualError(t, err, `toml: strconv.ParseInt: parsing "invalid": invalid syntax`) rawToml = ` ServerURL = "http://example.com" ServerPubKey = "4242" ` err = toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = ValidatePluginConfig(mc, v1FeedId) require.Error(t, err) assert.Contains(t, err.Error(), `Mercury: invalid scheme specified for MercuryServer, got: "http://example.com" (scheme: "http") but expected a websocket url e.g. "192.0.2.2:4242" or "wss://192.0.2.2:4242"`) assert.Contains(t, err.Error(), `If RawServerURL is specified, ServerPubKey is also required and must be a 32-byte hex string`) })` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `rawToml = ` ServerURL = "http://example.com" ServerPubKey = "4242" `` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `err = toml.Unmarshal([]byte(rawToml), &mc)` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `err = ValidatePluginConfig(mc, v1FeedId)` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `t.Run("with unnecessary values", func(t *testing.T) { rawToml := ` ServerURL = "example.com:80" ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" LinkFeedID = "0x00026b4aa7e57ca7b68ae1bf45653f56b656fd3aa335ef7fae696b663f1b8472" ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = ValidatePluginConfig(mc, v1FeedId) assert.Contains(t, err.Error(), `linkFeedID may not be specified for v1 jobs`) })` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `err = ValidatePluginConfig(mc, v1FeedId)` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `t.Run("with valid values", func(t *testing.T) { rawToml := ` ServerURL = "example.com:80" ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" LinkFeedID = "0x00026b4aa7e57ca7b68ae1bf45653f56b656fd3aa335ef7fae696b663f1b8472" NativeFeedID = "0x00036b4aa7e57ca7b68ae1bf45653f56b656fd3aa335ef7fae696b663f1b8472" ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = ValidatePluginConfig(mc, v2FeedId) require.NoError(t, err) require.NotNil(t, mc.LinkFeedID) require.NotNil(t, mc.NativeFeedID) assert.Equal(t, "0x00026b4aa7e57ca7b68ae1bf45653f56b656fd3aa335ef7fae696b663f1b8472", (*mc.LinkFeedID).String()) assert.Equal(t, "0x00036b4aa7e57ca7b68ae1bf45653f56b656fd3aa335ef7fae696b663f1b8472", (*mc.NativeFeedID).String()) })` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `err = ValidatePluginConfig(mc, v2FeedId)` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `t.Run("with invalid values", func(t *testing.T) { var mc PluginConfig rawToml := `LinkFeedID = "test"` err := toml.Unmarshal([]byte(rawToml), &mc) assert.Contains(t, err.Error(), "toml: hash: expected a hex string starting with '0x'") rawToml = `LinkFeedID = "0xtest"` err = toml.Unmarshal([]byte(rawToml), &mc) assert.Contains(t, err.Error(), `toml: hash: UnmarshalText failed: encoding/hex: invalid byte: U+0074 't'`) rawToml = ` ServerURL = "example.com:80" ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" LinkFeedID = "0x00026b4aa7e57ca7b68ae1bf45653f56b656fd3aa335ef7fae696b663f1b8472" ` err = toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = ValidatePluginConfig(mc, v2FeedId) assert.Contains(t, err.Error(), "nativeFeedID must be specified for v2 jobs") })` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `rawToml = `LinkFeedID = "0xtest"`` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `err = toml.Unmarshal([]byte(rawToml), &mc)` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `rawToml = ` ServerURL = "example.com:80" ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" LinkFeedID = "0x00026b4aa7e57ca7b68ae1bf45653f56b656fd3aa335ef7fae696b663f1b8472" `` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `err = toml.Unmarshal([]byte(rawToml), &mc)` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `err = ValidatePluginConfig(mc, v2FeedId)` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `t.Run("with unnecessary values", func(t *testing.T) { rawToml := ` ServerURL = "example.com:80" ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" InitialBlockNumber = 1234 ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = ValidatePluginConfig(mc, v2FeedId) assert.Contains(t, err.Error(), `initialBlockNumber may not be specified for v2 jobs`) })` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `err = ValidatePluginConfig(mc, v2FeedId)` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `t.Run("with single server", func(t *testing.T) { pubKey := utils.PlainHexBytes([]byte{1, 2, 3}) pc := PluginConfig{RawServerURL: "example.com", ServerPubKey: pubKey} require.Len(t, pc.GetServers(), 1) assert.Equal(t, "example.com", pc.GetServers()[0].URL) assert.Equal(t, pubKey, pc.GetServers()[0].PubKey) pc = PluginConfig{RawServerURL: "wss://example.com", ServerPubKey: pubKey} require.Len(t, pc.GetServers(), 1) assert.Equal(t, "example.com", pc.GetServers()[0].URL) assert.Equal(t, pubKey, pc.GetServers()[0].PubKey) pc = PluginConfig{RawServerURL: "example.com:1234/foo", ServerPubKey: pubKey} require.Len(t, pc.GetServers(), 1) assert.Equal(t, "example.com:1234/foo", pc.GetServers()[0].URL) assert.Equal(t, pubKey, pc.GetServers()[0].PubKey) pc = PluginConfig{RawServerURL: "wss://example.com:1234/foo", ServerPubKey: pubKey} require.Len(t, pc.GetServers(), 1) assert.Equal(t, "example.com:1234/foo", pc.GetServers()[0].URL) assert.Equal(t, pubKey, pc.GetServers()[0].PubKey) })` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `pc = PluginConfig{RawServerURL: "wss://example.com", ServerPubKey: pubKey}` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `pc = PluginConfig{RawServerURL: "example.com:1234/foo", ServerPubKey: pubKey}` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `pc = PluginConfig{RawServerURL: "wss://example.com:1234/foo", ServerPubKey: pubKey}` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `.Run("Mercury v1", func(t *testing.T) { t.Run("with valid values", func(t *testing.T) { rawToml := ` ServerURL = "example.com:80" ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" InitialBlockNumber = 1234 ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) assert.Equal(t, "example.com:80", mc.RawServerURL) assert.Equal(t, "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", mc.ServerPubKey.String()) assert.Equal(t, int64(1234), mc.InitialBlockNumber.Int64) err = ValidatePluginConfig(mc, v1FeedId) require.NoError(t, err) }) t.Run("with multiple server URLs", func(t *testing.T) { t.Run("if no ServerURL/ServerPubKey is specified", func(t *testing.T) { rawToml := ` Servers = { "example.com:80" = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", "example2.invalid:1234" = "524ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" } ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) assert.Len(t, mc.Servers, 2) assert.Equal(t, "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", mc.Servers["example.com:80"].String()) assert.Equal(t, "524ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", mc.Servers["example2.invalid:1234"].String()) err = ValidatePluginConfig(mc, v1FeedId) require.NoError(t, err) }) t.Run("if ServerURL or ServerPubKey is specified", func(t *testing.T) { rawToml := ` Servers = { "example.com:80" = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", "example2.invalid:1234" = "524ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" } ServerURL = "example.com:80" ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = ValidatePluginConfig(mc, v1FeedId) require.EqualError(t, err, "Mercury: Servers and RawServerURL/ServerPubKey may not be specified together") rawToml = ` Servers = { "example.com:80" = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", "example2.invalid:1234" = "524ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" } ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" ` err = toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = ValidatePluginConfig(mc, v1FeedId) require.EqualError(t, err, "Mercury: Servers and RawServerURL/ServerPubKey may not be specified together") }) }) t.Run("with invalid values", func(t *testing.T) { rawToml := ` InitialBlockNumber = "invalid" ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.Error(t, err) assert.EqualError(t, err, `toml: strconv.ParseInt: parsing "invalid": invalid syntax`) rawToml = ` ServerURL = "http://example.com" ServerPubKey = "4242" ` err = toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = ValidatePluginConfig(mc, v1FeedId) require.Error(t, err) assert.Contains(t, err.Error(), `Mercury: invalid scheme specified for MercuryServer, got: "http://example.com" (scheme: "http") but expected a websocket url e.g. "192.0.2.2:4242" or "wss://192.0.2.2:4242"`) assert.Contains(t, err.Error(), `If RawServerURL is specified, ServerPubKey is also required and must be a 32-byte hex string`) }) t.Run("with unnecessary values", func(t *testing.T) { rawToml := ` ServerURL = "example.com:80" ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" LinkFeedID = "0x00026b4aa7e57ca7b68ae1bf45653f56b656fd3aa335ef7fae696b663f1b8472" ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = ValidatePluginConfig(mc, v1FeedId) assert.Contains(t, err.Error(), `linkFeedID may not be specified for v1 jobs`) }) })` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `.Run("with valid values", func(t *testing.T) { rawToml := ` ServerURL = "example.com:80" ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" InitialBlockNumber = 1234 ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) assert.Equal(t, "example.com:80", mc.RawServerURL) assert.Equal(t, "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", mc.ServerPubKey.String()) assert.Equal(t, int64(1234), mc.InitialBlockNumber.Int64) err = ValidatePluginConfig(mc, v1FeedId) require.NoError(t, err) })` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `.Unmarshal([]byte(rawToml), &mc)` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `.Run("with multiple server URLs", func(t *testing.T) { t.Run("if no ServerURL/ServerPubKey is specified", func(t *testing.T) { rawToml := ` Servers = { "example.com:80" = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", "example2.invalid:1234" = "524ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" } ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) assert.Len(t, mc.Servers, 2) assert.Equal(t, "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", mc.Servers["example.com:80"].String()) assert.Equal(t, "524ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", mc.Servers["example2.invalid:1234"].String()) err = ValidatePluginConfig(mc, v1FeedId) require.NoError(t, err) }) t.Run("if ServerURL or ServerPubKey is specified", func(t *testing.T) { rawToml := ` Servers = { "example.com:80" = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", "example2.invalid:1234" = "524ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" } ServerURL = "example.com:80" ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = ValidatePluginConfig(mc, v1FeedId) require.EqualError(t, err, "Mercury: Servers and RawServerURL/ServerPubKey may not be specified together") rawToml = ` Servers = { "example.com:80" = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", "example2.invalid:1234" = "524ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" } ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" ` err = toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = ValidatePluginConfig(mc, v1FeedId) require.EqualError(t, err, "Mercury: Servers and RawServerURL/ServerPubKey may not be specified together") }) })` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `.Run("if no ServerURL/ServerPubKey is specified", func(t *testing.T) { rawToml := ` Servers = { "example.com:80" = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", "example2.invalid:1234" = "524ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" } ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) assert.Len(t, mc.Servers, 2) assert.Equal(t, "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", mc.Servers["example.com:80"].String()) assert.Equal(t, "524ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", mc.Servers["example2.invalid:1234"].String()) err = ValidatePluginConfig(mc, v1FeedId) require.NoError(t, err) })` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `.Unmarshal([]byte(rawToml), &mc)` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `.Run("if ServerURL or ServerPubKey is specified", func(t *testing.T) { rawToml := ` Servers = { "example.com:80" = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", "example2.invalid:1234" = "524ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" } ServerURL = "example.com:80" ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = ValidatePluginConfig(mc, v1FeedId) require.EqualError(t, err, "Mercury: Servers and RawServerURL/ServerPubKey may not be specified together") rawToml = ` Servers = { "example.com:80" = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", "example2.invalid:1234" = "524ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" } ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" ` err = toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = ValidatePluginConfig(mc, v1FeedId) require.EqualError(t, err, "Mercury: Servers and RawServerURL/ServerPubKey may not be specified together") })` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `.Unmarshal([]byte(rawToml), &mc)` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `.Unmarshal([]byte(rawToml), &mc)` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `.Run("with invalid values", func(t *testing.T) { rawToml := ` InitialBlockNumber = "invalid" ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.Error(t, err) assert.EqualError(t, err, `toml: strconv.ParseInt: parsing "invalid": invalid syntax`) rawToml = ` ServerURL = "http://example.com" ServerPubKey = "4242" ` err = toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = ValidatePluginConfig(mc, v1FeedId) require.Error(t, err) assert.Contains(t, err.Error(), `Mercury: invalid scheme specified for MercuryServer, got: "http://example.com" (scheme: "http") but expected a websocket url e.g. "192.0.2.2:4242" or "wss://192.0.2.2:4242"`) assert.Contains(t, err.Error(), `If RawServerURL is specified, ServerPubKey is also required and must be a 32-byte hex string`) })` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `.Unmarshal([]byte(rawToml), &mc)` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `.Unmarshal([]byte(rawToml), &mc)` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `.Run("with unnecessary values", func(t *testing.T) { rawToml := ` ServerURL = "example.com:80" ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" LinkFeedID = "0x00026b4aa7e57ca7b68ae1bf45653f56b656fd3aa335ef7fae696b663f1b8472" ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = ValidatePluginConfig(mc, v1FeedId) assert.Contains(t, err.Error(), `linkFeedID may not be specified for v1 jobs`) })` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `.Unmarshal([]byte(rawToml), &mc)` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `.Run("with valid values", func(t *testing.T) { rawToml := ` ServerURL = "example.com:80" ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" LinkFeedID = "0x00026b4aa7e57ca7b68ae1bf45653f56b656fd3aa335ef7fae696b663f1b8472" NativeFeedID = "0x00036b4aa7e57ca7b68ae1bf45653f56b656fd3aa335ef7fae696b663f1b8472" ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = ValidatePluginConfig(mc, v2FeedId) require.NoError(t, err) require.NotNil(t, mc.LinkFeedID) require.NotNil(t, mc.NativeFeedID) assert.Equal(t, "0x00026b4aa7e57ca7b68ae1bf45653f56b656fd3aa335ef7fae696b663f1b8472", (*mc.LinkFeedID).String()) assert.Equal(t, "0x00036b4aa7e57ca7b68ae1bf45653f56b656fd3aa335ef7fae696b663f1b8472", (*mc.NativeFeedID).String()) })` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `.Unmarshal([]byte(rawToml), &mc)` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `.Run("with invalid values", func(t *testing.T) { var mc PluginConfig rawToml := `LinkFeedID = "test"` err := toml.Unmarshal([]byte(rawToml), &mc) assert.Contains(t, err.Error(), "toml: hash: expected a hex string starting with '0x'") rawToml = `LinkFeedID = "0xtest"` err = toml.Unmarshal([]byte(rawToml), &mc) assert.Contains(t, err.Error(), `toml: hash: UnmarshalText failed: encoding/hex: invalid byte: U+0074 't'`) rawToml = ` ServerURL = "example.com:80" ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" LinkFeedID = "0x00026b4aa7e57ca7b68ae1bf45653f56b656fd3aa335ef7fae696b663f1b8472" ` err = toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = ValidatePluginConfig(mc, v2FeedId) assert.Contains(t, err.Error(), "nativeFeedID must be specified for v2 jobs") })` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `.Unmarshal([]byte(rawToml), &mc)` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `.Unmarshal([]byte(rawToml), &mc)` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `.Unmarshal([]byte(rawToml), &mc)` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `.Run("with unnecessary values", func(t *testing.T) { rawToml := ` ServerURL = "example.com:80" ServerPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" InitialBlockNumber = 1234 ` var mc PluginConfig err := toml.Unmarshal([]byte(rawToml), &mc) require.NoError(t, err) err = ValidatePluginConfig(mc, v2FeedId) assert.Contains(t, err.Error(), `initialBlockNumber may not be specified for v2 jobs`) })` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `.Unmarshal([]byte(rawToml), &mc)` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `.Run("with single server", func(t *testing.T) { pubKey := utils.PlainHexBytes([]byte{1, 2, 3}) pc := PluginConfig{RawServerURL: "example.com", ServerPubKey: pubKey} require.Len(t, pc.GetServers(), 1) assert.Equal(t, "example.com", pc.GetServers()[0].URL) assert.Equal(t, pubKey, pc.GetServers()[0].PubKey) pc = PluginConfig{RawServerURL: "wss://example.com", ServerPubKey: pubKey} require.Len(t, pc.GetServers(), 1) assert.Equal(t, "example.com", pc.GetServers()[0].URL) assert.Equal(t, pubKey, pc.GetServers()[0].PubKey) pc = PluginConfig{RawServerURL: "example.com:1234/foo", ServerPubKey: pubKey} require.Len(t, pc.GetServers(), 1) assert.Equal(t, "example.com:1234/foo", pc.GetServers()[0].URL) assert.Equal(t, pubKey, pc.GetServers()[0].PubKey) pc = PluginConfig{RawServerURL: "wss://example.com:1234/foo", ServerPubKey: pubKey} require.Len(t, pc.GetServers(), 1) assert.Equal(t, "example.com:1234/foo", pc.GetServers()[0].URL) assert.Equal(t, pubKey, pc.GetServers()[0].PubKey) })` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `.PlainHexBytes([]byte{1, 2, 3})` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `.PlainHexBytes([]byte{1, 2, 3})` $DIR/core/services/ocr2/plugins/mercury/config/config_test.go: `.PlainHexBytes([]byte{4, 5, 6})` $DIR/core/services/ocr2/plugins/mercury/integration_plugin_test.go: `t.Setenv(string(env.MercuryPlugin.Cmd), "chainlink-mercury")` $DIR/core/services/ocr2/plugins/mercury/integration_plugin_test.go: `t.Setenv(string(env.MercuryPlugin.Cmd), "chainlink-mercury")` $DIR/core/services/ocr2/plugins/mercury/integration_plugin_test.go: `t.Setenv(string(env.MercuryPlugin.Cmd), "chainlink-mercury")` $DIR/core/services/ocr2/plugins/mercury/integration_plugin_test.go: `.Setenv(string(env.MercuryPlugin.Cmd), "chainlink-mercury")` $DIR/core/services/ocr2/plugins/mercury/integration_plugin_test.go: `.Setenv(string(env.MercuryPlugin.Cmd), "chainlink-mercury")` $DIR/core/services/ocr2/plugins/mercury/integration_plugin_test.go: `.Setenv(string(env.MercuryPlugin.Cmd), "chainlink-mercury")` $DIR/core/services/ocr2/plugins/mercury/plugin_test.go: `t.Run(tt.name, func(t *testing.T) { if tt.loopMode { t.Setenv(string(env.MercuryPlugin.Cmd), "fake_cmd") assert.NotEmpty(t, env.MercuryPlugin.Cmd.Get()) } got, err := newServicesTestWrapper(t, tt.args.pluginConfig, tt.args.feedID) if (err != nil) != tt.wantErr { t.Errorf("NewServices() error = %v, wantErr %v", err, tt.wantErr) return } assert.Len(t, got, tt.wantServiceCnt) if tt.loopMode { foundLoopFactory := false for i := 0; i < len(got); i++ { if reflect.TypeOf(got[i]) == reflect.TypeOf(tt.wantLoopFactory) { foundLoopFactory = true break } } assert.True(t, foundLoopFactory) } })` $DIR/core/services/ocr2/plugins/mercury/plugin_test.go: `t.Setenv(string(env.MercuryPlugin.Cmd), "fake_cmd")` $DIR/core/services/ocr2/plugins/mercury/plugin_test.go: `foundLoopFactory = true` $DIR/core/services/ocr2/plugins/mercury/plugin_test.go: `.Run(tt.name, func(t *testing.T) { if tt.loopMode { t.Setenv(string(env.MercuryPlugin.Cmd), "fake_cmd") assert.NotEmpty(t, env.MercuryPlugin.Cmd.Get()) } got, err := newServicesTestWrapper(t, tt.args.pluginConfig, tt.args.feedID) if (err != nil) != tt.wantErr { t.Errorf("NewServices() error = %v, wantErr %v", err, tt.wantErr) return } assert.Len(t, got, tt.wantServiceCnt) if tt.loopMode { foundLoopFactory := false for i := 0; i < len(got); i++ { if reflect.TypeOf(got[i]) == reflect.TypeOf(tt.wantLoopFactory) { foundLoopFactory = true break } } assert.True(t, foundLoopFactory) } })` $DIR/core/services/ocr2/plugins/mercury/plugin_test.go: `.Setenv(string(env.MercuryPlugin.Cmd), "fake_cmd")` $DIR/core/services/ocr2/plugins/mercury/plugin_test.go: `.TypeOf(got[i])` $DIR/core/services/ocr2/plugins/mercury/plugin_test.go: `.TypeOf(tt.wantLoopFactory)` $DIR/core/services/ocr2/plugins/ocr2keeper/config_test.go: `.Unmarshal([]byte(raw), &value)` $DIR/core/services/ocr2/plugins/ocr2keeper/config_test.go: `.Value()` $DIR/core/services/ocr2/plugins/ocr2keeper/config_test.go: `.Unmarshal([]byte(raw), &config)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `t.Run(test.Name, func(t *testing.T) { abi, err := abi.JSON(strings.NewReader(keeper_registry_wrapper2_0.KeeperRegistryABI)) assert.Nil(t, err) packer := &evmRegistryPackerV2_0{abi: abi} _, err = packer.UnpackTransmitTxInput(hexutil.MustDecode(test.RawData)) assert.NotNil(t, err) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `_, err = packer.UnpackTransmitTxInput(hexutil.MustDecode(test.RawData))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `t.Run(test.Name, func(t *testing.T) { packer := &evmRegistryPackerV2_0{abi: registryABI} rs, err := packer.UnpackCheckResult(test.UpkeepKey, test.RawData) assert.Nil(t, err) assert.Equal(t, test.ExpectedResult, rs) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `t.Run(test.Name, func(t *testing.T) { packer := &evmRegistryPackerV2_0{abi: registryABI} rs, err := packer.UnpackPerformResult(test.RawData) assert.Nil(t, err) assert.True(t, rs) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.JSON(strings.NewReader(keeper_registry_wrapper2_0.KeeperRegistryABI))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.NewReader(keeper_registry_wrapper2_0.KeeperRegistryABI)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.UnpackTransmitTxInput(hexutil.MustDecode("0x00011a04d404e571ead64b2f08cfae623a0d96b9beb326c20e322001cbbd344700000000000000000000000000000000000000000000000000000000000d580e35681c68a0426c30f4686e837c0cd7864200f48dbfe48c80c51f92aa5ac607b300000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000360000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000773594000000000000000000000000000000000000000000000000000010fb9cd2f34a00000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000001de1256139081c6b165a3aee0432f605d3dee0e6087ea53b46ca9478c253ea9c8000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000827075c4bacd41884f60c2ca7af3630400bedd92ad7ad0ba4e1f000e70297de0573e180000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000a8c0000000000000000000000000000000000000000000000000000000000086470000000000000000000000000000000000000000000000000000000000000000326e2b521089d44f1457ae51b3f8d76e8577e08c4af9374bdc62aebbfad081a78a13941ab209ad44a905ee0fd704a46b2ebc022dcb60659bed87342fd94dadb70827af523f59c7c9bb8dcc77e959b0476869612e8cf84e63a2e9a5617290633f70000000000000000000000000000000000000000000000000000000000000003723d77998618c5959396115fc61380215e0395f68c18a6cf0647c3e759ee013040c2967fdd369aac59b464f931dacd7b8863498757eda53a9f6a4b6150f2dbe640771f3c242c297265c36c5e78f4c660ae74dcd1f5bda8687b6afed3d3f27e0d"))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.MustDecode("0x00011a04d404e571ead64b2f08cfae623a0d96b9beb326c20e322001cbbd344700000000000000000000000000000000000000000000000000000000000d580e35681c68a0426c30f4686e837c0cd7864200f48dbfe48c80c51f92aa5ac607b300000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000360000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000773594000000000000000000000000000000000000000000000000000010fb9cd2f34a00000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000001de1256139081c6b165a3aee0432f605d3dee0e6087ea53b46ca9478c253ea9c8000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000827075c4bacd41884f60c2ca7af3630400bedd92ad7ad0ba4e1f000e70297de0573e180000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000a8c0000000000000000000000000000000000000000000000000000000000086470000000000000000000000000000000000000000000000000000000000000000326e2b521089d44f1457ae51b3f8d76e8577e08c4af9374bdc62aebbfad081a78a13941ab209ad44a905ee0fd704a46b2ebc022dcb60659bed87342fd94dadb70827af523f59c7c9bb8dcc77e959b0476869612e8cf84e63a2e9a5617290633f70000000000000000000000000000000000000000000000000000000000000003723d77998618c5959396115fc61380215e0395f68c18a6cf0647c3e759ee013040c2967fdd369aac59b464f931dacd7b8863498757eda53a9f6a4b6150f2dbe640771f3c242c297265c36c5e78f4c660ae74dcd1f5bda8687b6afed3d3f27e0d")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.SetString("100445849710294316610676143149039812931260394722330855891004881602834541226440", 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.ID.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.Run(test.Name, func(t *testing.T) { abi, err := abi.JSON(strings.NewReader(keeper_registry_wrapper2_0.KeeperRegistryABI)) assert.Nil(t, err) packer := &evmRegistryPackerV2_0{abi: abi} _, err = packer.UnpackTransmitTxInput(hexutil.MustDecode(test.RawData)) assert.NotNil(t, err) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.JSON(strings.NewReader(keeper_registry_wrapper2_0.KeeperRegistryABI))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.NewReader(keeper_registry_wrapper2_0.KeeperRegistryABI)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.UnpackTransmitTxInput(hexutil.MustDecode(test.RawData))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.MustDecode(test.RawData)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.JSON(strings.NewReader(keeper_registry_wrapper2_0.KeeperRegistryABI))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.NewReader(keeper_registry_wrapper2_0.KeeperRegistryABI)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.SetString("1843548457736589226156809205796175506139185429616502850435279853710366065936", 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.UpkeepKey(fmt.Sprintf("19447615|%s", upkeepId))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.Sprintf("19447615|%s", upkeepId)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.NewInt(16924)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.NewInt(1000000000)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.NewInt(3532383906411401)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.UpkeepKey(fmt.Sprintf("19448272|%s", upkeepId))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.Sprintf("19448272|%s", upkeepId)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.NewInt(30001)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.NewInt(1000000000)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.NewInt(3532383906411401)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.Run(test.Name, func(t *testing.T) { packer := &evmRegistryPackerV2_0{abi: registryABI} rs, err := packer.UnpackCheckResult(test.UpkeepKey, test.RawData) assert.Nil(t, err) assert.Equal(t, test.ExpectedResult, rs) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.UnpackCheckResult(test.UpkeepKey, test.RawData)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.JSON(strings.NewReader(keeper_registry_wrapper2_0.KeeperRegistryABI))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.NewReader(keeper_registry_wrapper2_0.KeeperRegistryABI)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.Run(test.Name, func(t *testing.T) { packer := &evmRegistryPackerV2_0{abi: registryABI} rs, err := packer.UnpackPerformResult(test.RawData) assert.Nil(t, err) assert.True(t, rs) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/abi_test.go: `.UnpackPerformResult(test.RawData)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `t.Run("encoding an empty list of upkeep results returns a nil byte array", func(t *testing.T) { b, err := encoder.EncodeReport([]ocr2keepers.UpkeepResult{}) assert.Nil(t, err) assert.Equal(t, b, []byte(nil)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `t.Run("attempting to encode an invalid upkeep result returns an error", func(t *testing.T) { b, err := encoder.EncodeReport([]ocr2keepers.UpkeepResult{"data"}) assert.Error(t, err, "unexpected upkeep result struct") assert.Equal(t, b, []byte(nil)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `t.Run("successfully encodes a single upkeep result", func(t *testing.T) { upkeepResult := EVMAutomationUpkeepResult20{ Block: 1, ID: big.NewInt(10), Eligible: true, GasUsed: big.NewInt(100), PerformData: []byte("data"), FastGasWei: big.NewInt(100), LinkNative: big.NewInt(100), CheckBlockNumber: 1, CheckBlockHash: [32]byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8}, ExecuteGas: 10, } b, err := encoder.EncodeReport([]ocr2keepers.UpkeepResult{upkeepResult}) assert.Nil(t, err) assert.Len(t, b, 416) t.Run("successfully decodes a report with a single upkeep result", func(t *testing.T) { upkeeps, err := encoder.DecodeReport(b) assert.Nil(t, err) assert.Len(t, upkeeps, 1) upkeep := upkeeps[0].(EVMAutomationUpkeepResult20) // some fields aren't populated by the decode so we compare field-by-field for those that are populated assert.Equal(t, upkeep.Block, upkeepResult.Block) assert.Equal(t, upkeep.ID, upkeepResult.ID) assert.Equal(t, upkeep.Eligible, upkeepResult.Eligible) assert.Equal(t, upkeep.PerformData, upkeepResult.PerformData) assert.Equal(t, upkeep.FastGasWei, upkeepResult.FastGasWei) assert.Equal(t, upkeep.LinkNative, upkeepResult.LinkNative) assert.Equal(t, upkeep.CheckBlockNumber, upkeepResult.CheckBlockNumber) assert.Equal(t, upkeep.CheckBlockHash, upkeepResult.CheckBlockHash) }) t.Run("an error is returned when unpacking into a map fails", func(t *testing.T) { oldUnpackIntoMapFn := unpackIntoMapFn unpackIntoMapFn = func(v map[string]interface{}, data []byte) error { return errors.New("failed to unpack into map") } defer func() { unpackIntoMapFn = oldUnpackIntoMapFn }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "failed to unpack into map") assert.Len(t, upkeeps, 0) }) t.Run("an error is returned when an expected key is missing from the map", func(t *testing.T) { oldMKeys := mKeys mKeys = []string{"fastGasWei", "linkNative", "upkeepIds", "wrappedPerformDatas", "thisKeyWontExist"} defer func() { mKeys = oldMKeys }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "decoding error") assert.Len(t, upkeeps, 0) }) t.Run("an error is returned when the third element of the map is not a slice of big.Int", func(t *testing.T) { oldMKeys := mKeys mKeys = []string{"fastGasWei", "linkNative", "wrappedPerformDatas", "upkeepIds"} defer func() { mKeys = oldMKeys }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "upkeep ids of incorrect type in report") assert.Len(t, upkeeps, 0) }) t.Run("an error is returned when the fourth element of the map is not a struct of perform data", func(t *testing.T) { oldMKeys := mKeys mKeys = []string{"fastGasWei", "linkNative", "upkeepIds", "upkeepIds"} defer func() { mKeys = oldMKeys }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "performs of incorrect structure in report") assert.Len(t, upkeeps, 0) }) t.Run("an error is returned when the upkeep ids and performDatas are of different lengths", func(t *testing.T) { oldUnpackIntoMapFn := unpackIntoMapFn unpackIntoMapFn = func(v map[string]interface{}, data []byte) error { v["fastGasWei"] = 1 v["linkNative"] = 2 v["upkeepIds"] = []*big.Int{big.NewInt(123), big.NewInt(456)} v["wrappedPerformDatas"] = []struct { CheckBlockNumber uint32 `json:"checkBlockNumber"` CheckBlockhash [32]byte `json:"checkBlockhash"` PerformData []byte `json:"performData"` }{ { CheckBlockNumber: 1, CheckBlockhash: [32]byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8}, PerformData: []byte{}, }, } return nil } defer func() { unpackIntoMapFn = oldUnpackIntoMapFn }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "upkeep ids and performs should have matching length") assert.Len(t, upkeeps, 0) }) t.Run("an error is returned when the first element of the map is not a big int", func(t *testing.T) { oldMKeys := mKeys mKeys = []string{"upkeepIds", "linkNative", "upkeepIds", "wrappedPerformDatas"} defer func() { mKeys = oldMKeys }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "fast gas as wrong type") assert.Len(t, upkeeps, 0) }) t.Run("an error is returned when the second element of the map is not a big int", func(t *testing.T) { oldMKeys := mKeys mKeys = []string{"fastGasWei", "upkeepIds", "upkeepIds", "wrappedPerformDatas"} defer func() { mKeys = oldMKeys }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "link native as wrong type") assert.Len(t, upkeeps, 0) }) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `t.Run("successfully decodes a report with a single upkeep result", func(t *testing.T) { upkeeps, err := encoder.DecodeReport(b) assert.Nil(t, err) assert.Len(t, upkeeps, 1) upkeep := upkeeps[0].(EVMAutomationUpkeepResult20) // some fields aren't populated by the decode so we compare field-by-field for those that are populated assert.Equal(t, upkeep.Block, upkeepResult.Block) assert.Equal(t, upkeep.ID, upkeepResult.ID) assert.Equal(t, upkeep.Eligible, upkeepResult.Eligible) assert.Equal(t, upkeep.PerformData, upkeepResult.PerformData) assert.Equal(t, upkeep.FastGasWei, upkeepResult.FastGasWei) assert.Equal(t, upkeep.LinkNative, upkeepResult.LinkNative) assert.Equal(t, upkeep.CheckBlockNumber, upkeepResult.CheckBlockNumber) assert.Equal(t, upkeep.CheckBlockHash, upkeepResult.CheckBlockHash) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `t.Run("an error is returned when unpacking into a map fails", func(t *testing.T) { oldUnpackIntoMapFn := unpackIntoMapFn unpackIntoMapFn = func(v map[string]interface{}, data []byte) error { return errors.New("failed to unpack into map") } defer func() { unpackIntoMapFn = oldUnpackIntoMapFn }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "failed to unpack into map") assert.Len(t, upkeeps, 0) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `unpackIntoMapFn = oldUnpackIntoMapFn` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `t.Run("an error is returned when an expected key is missing from the map", func(t *testing.T) { oldMKeys := mKeys mKeys = []string{"fastGasWei", "linkNative", "upkeepIds", "wrappedPerformDatas", "thisKeyWontExist"} defer func() { mKeys = oldMKeys }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "decoding error") assert.Len(t, upkeeps, 0) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `mKeys = []string{"fastGasWei", "linkNative", "upkeepIds", "wrappedPerformDatas", "thisKeyWontExist"}` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `mKeys = oldMKeys` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `t.Run("an error is returned when the third element of the map is not a slice of big.Int", func(t *testing.T) { oldMKeys := mKeys mKeys = []string{"fastGasWei", "linkNative", "wrappedPerformDatas", "upkeepIds"} defer func() { mKeys = oldMKeys }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "upkeep ids of incorrect type in report") assert.Len(t, upkeeps, 0) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `mKeys = []string{"fastGasWei", "linkNative", "wrappedPerformDatas", "upkeepIds"}` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `mKeys = oldMKeys` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `t.Run("an error is returned when the fourth element of the map is not a struct of perform data", func(t *testing.T) { oldMKeys := mKeys mKeys = []string{"fastGasWei", "linkNative", "upkeepIds", "upkeepIds"} defer func() { mKeys = oldMKeys }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "performs of incorrect structure in report") assert.Len(t, upkeeps, 0) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `mKeys = []string{"fastGasWei", "linkNative", "upkeepIds", "upkeepIds"}` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `mKeys = oldMKeys` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `t.Run("an error is returned when the upkeep ids and performDatas are of different lengths", func(t *testing.T) { oldUnpackIntoMapFn := unpackIntoMapFn unpackIntoMapFn = func(v map[string]interface{}, data []byte) error { v["fastGasWei"] = 1 v["linkNative"] = 2 v["upkeepIds"] = []*big.Int{big.NewInt(123), big.NewInt(456)} v["wrappedPerformDatas"] = []struct { CheckBlockNumber uint32 `json:"checkBlockNumber"` CheckBlockhash [32]byte `json:"checkBlockhash"` PerformData []byte `json:"performData"` }{ { CheckBlockNumber: 1, CheckBlockhash: [32]byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8}, PerformData: []byte{}, }, } return nil } defer func() { unpackIntoMapFn = oldUnpackIntoMapFn }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "upkeep ids and performs should have matching length") assert.Len(t, upkeeps, 0) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `v["fastGasWei"] = 1` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `v["linkNative"] = 2` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `v["upkeepIds"] = []*big.Int{big.NewInt(123), big.NewInt(456)}` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `v["wrappedPerformDatas"] = []struct { CheckBlockNumber uint32 `json:"checkBlockNumber"` CheckBlockhash [32]byte `json:"checkBlockhash"` PerformData []byte `json:"performData"` }{ { CheckBlockNumber: 1, CheckBlockhash: [32]byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8}, PerformData: []byte{}, }, }` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `unpackIntoMapFn = oldUnpackIntoMapFn` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `t.Run("an error is returned when the first element of the map is not a big int", func(t *testing.T) { oldMKeys := mKeys mKeys = []string{"upkeepIds", "linkNative", "upkeepIds", "wrappedPerformDatas"} defer func() { mKeys = oldMKeys }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "fast gas as wrong type") assert.Len(t, upkeeps, 0) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `mKeys = []string{"upkeepIds", "linkNative", "upkeepIds", "wrappedPerformDatas"}` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `mKeys = oldMKeys` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `t.Run("an error is returned when the second element of the map is not a big int", func(t *testing.T) { oldMKeys := mKeys mKeys = []string{"fastGasWei", "upkeepIds", "upkeepIds", "wrappedPerformDatas"} defer func() { mKeys = oldMKeys }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "link native as wrong type") assert.Len(t, upkeeps, 0) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `mKeys = []string{"fastGasWei", "upkeepIds", "upkeepIds", "wrappedPerformDatas"}` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `mKeys = oldMKeys` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `t.Run("successfully encodes multiple upkeep results", func(t *testing.T) { upkeepResult0 := EVMAutomationUpkeepResult20{ Block: 1, ID: big.NewInt(10), Eligible: true, GasUsed: big.NewInt(100), PerformData: []byte("data0"), FastGasWei: big.NewInt(100), LinkNative: big.NewInt(100), CheckBlockNumber: 1, CheckBlockHash: [32]byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8}, ExecuteGas: 10, } upkeepResult1 := EVMAutomationUpkeepResult20{ Block: 1, ID: big.NewInt(10), Eligible: true, GasUsed: big.NewInt(200), PerformData: []byte("data1"), FastGasWei: big.NewInt(200), LinkNative: big.NewInt(200), CheckBlockNumber: 2, CheckBlockHash: [32]byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8}, ExecuteGas: 20, } b, err := encoder.EncodeReport([]ocr2keepers.UpkeepResult{upkeepResult0, upkeepResult1}) assert.Nil(t, err) assert.Len(t, b, 640) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `packFn = oldPackFn` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.Run("encoding an empty list of upkeep results returns a nil byte array", func(t *testing.T) { b, err := encoder.EncodeReport([]ocr2keepers.UpkeepResult{}) assert.Nil(t, err) assert.Equal(t, b, []byte(nil)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.EncodeReport([]ocr2keepers.UpkeepResult{})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.Run("attempting to encode an invalid upkeep result returns an error", func(t *testing.T) { b, err := encoder.EncodeReport([]ocr2keepers.UpkeepResult{"data"}) assert.Error(t, err, "unexpected upkeep result struct") assert.Equal(t, b, []byte(nil)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.EncodeReport([]ocr2keepers.UpkeepResult{"data"})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.Run("successfully encodes a single upkeep result", func(t *testing.T) { upkeepResult := EVMAutomationUpkeepResult20{ Block: 1, ID: big.NewInt(10), Eligible: true, GasUsed: big.NewInt(100), PerformData: []byte("data"), FastGasWei: big.NewInt(100), LinkNative: big.NewInt(100), CheckBlockNumber: 1, CheckBlockHash: [32]byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8}, ExecuteGas: 10, } b, err := encoder.EncodeReport([]ocr2keepers.UpkeepResult{upkeepResult}) assert.Nil(t, err) assert.Len(t, b, 416) t.Run("successfully decodes a report with a single upkeep result", func(t *testing.T) { upkeeps, err := encoder.DecodeReport(b) assert.Nil(t, err) assert.Len(t, upkeeps, 1) upkeep := upkeeps[0].(EVMAutomationUpkeepResult20) // some fields aren't populated by the decode so we compare field-by-field for those that are populated assert.Equal(t, upkeep.Block, upkeepResult.Block) assert.Equal(t, upkeep.ID, upkeepResult.ID) assert.Equal(t, upkeep.Eligible, upkeepResult.Eligible) assert.Equal(t, upkeep.PerformData, upkeepResult.PerformData) assert.Equal(t, upkeep.FastGasWei, upkeepResult.FastGasWei) assert.Equal(t, upkeep.LinkNative, upkeepResult.LinkNative) assert.Equal(t, upkeep.CheckBlockNumber, upkeepResult.CheckBlockNumber) assert.Equal(t, upkeep.CheckBlockHash, upkeepResult.CheckBlockHash) }) t.Run("an error is returned when unpacking into a map fails", func(t *testing.T) { oldUnpackIntoMapFn := unpackIntoMapFn unpackIntoMapFn = func(v map[string]interface{}, data []byte) error { return errors.New("failed to unpack into map") } defer func() { unpackIntoMapFn = oldUnpackIntoMapFn }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "failed to unpack into map") assert.Len(t, upkeeps, 0) }) t.Run("an error is returned when an expected key is missing from the map", func(t *testing.T) { oldMKeys := mKeys mKeys = []string{"fastGasWei", "linkNative", "upkeepIds", "wrappedPerformDatas", "thisKeyWontExist"} defer func() { mKeys = oldMKeys }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "decoding error") assert.Len(t, upkeeps, 0) }) t.Run("an error is returned when the third element of the map is not a slice of big.Int", func(t *testing.T) { oldMKeys := mKeys mKeys = []string{"fastGasWei", "linkNative", "wrappedPerformDatas", "upkeepIds"} defer func() { mKeys = oldMKeys }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "upkeep ids of incorrect type in report") assert.Len(t, upkeeps, 0) }) t.Run("an error is returned when the fourth element of the map is not a struct of perform data", func(t *testing.T) { oldMKeys := mKeys mKeys = []string{"fastGasWei", "linkNative", "upkeepIds", "upkeepIds"} defer func() { mKeys = oldMKeys }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "performs of incorrect structure in report") assert.Len(t, upkeeps, 0) }) t.Run("an error is returned when the upkeep ids and performDatas are of different lengths", func(t *testing.T) { oldUnpackIntoMapFn := unpackIntoMapFn unpackIntoMapFn = func(v map[string]interface{}, data []byte) error { v["fastGasWei"] = 1 v["linkNative"] = 2 v["upkeepIds"] = []*big.Int{big.NewInt(123), big.NewInt(456)} v["wrappedPerformDatas"] = []struct { CheckBlockNumber uint32 `json:"checkBlockNumber"` CheckBlockhash [32]byte `json:"checkBlockhash"` PerformData []byte `json:"performData"` }{ { CheckBlockNumber: 1, CheckBlockhash: [32]byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8}, PerformData: []byte{}, }, } return nil } defer func() { unpackIntoMapFn = oldUnpackIntoMapFn }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "upkeep ids and performs should have matching length") assert.Len(t, upkeeps, 0) }) t.Run("an error is returned when the first element of the map is not a big int", func(t *testing.T) { oldMKeys := mKeys mKeys = []string{"upkeepIds", "linkNative", "upkeepIds", "wrappedPerformDatas"} defer func() { mKeys = oldMKeys }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "fast gas as wrong type") assert.Len(t, upkeeps, 0) }) t.Run("an error is returned when the second element of the map is not a big int", func(t *testing.T) { oldMKeys := mKeys mKeys = []string{"fastGasWei", "upkeepIds", "upkeepIds", "wrappedPerformDatas"} defer func() { mKeys = oldMKeys }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "link native as wrong type") assert.Len(t, upkeeps, 0) }) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.NewInt(10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.NewInt(100)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.NewInt(100)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.NewInt(100)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.EncodeReport([]ocr2keepers.UpkeepResult{upkeepResult})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.Run("successfully decodes a report with a single upkeep result", func(t *testing.T) { upkeeps, err := encoder.DecodeReport(b) assert.Nil(t, err) assert.Len(t, upkeeps, 1) upkeep := upkeeps[0].(EVMAutomationUpkeepResult20) // some fields aren't populated by the decode so we compare field-by-field for those that are populated assert.Equal(t, upkeep.Block, upkeepResult.Block) assert.Equal(t, upkeep.ID, upkeepResult.ID) assert.Equal(t, upkeep.Eligible, upkeepResult.Eligible) assert.Equal(t, upkeep.PerformData, upkeepResult.PerformData) assert.Equal(t, upkeep.FastGasWei, upkeepResult.FastGasWei) assert.Equal(t, upkeep.LinkNative, upkeepResult.LinkNative) assert.Equal(t, upkeep.CheckBlockNumber, upkeepResult.CheckBlockNumber) assert.Equal(t, upkeep.CheckBlockHash, upkeepResult.CheckBlockHash) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.DecodeReport(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.Run("an error is returned when unpacking into a map fails", func(t *testing.T) { oldUnpackIntoMapFn := unpackIntoMapFn unpackIntoMapFn = func(v map[string]interface{}, data []byte) error { return errors.New("failed to unpack into map") } defer func() { unpackIntoMapFn = oldUnpackIntoMapFn }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "failed to unpack into map") assert.Len(t, upkeeps, 0) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.New("failed to unpack into map")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.DecodeReport(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.Run("an error is returned when an expected key is missing from the map", func(t *testing.T) { oldMKeys := mKeys mKeys = []string{"fastGasWei", "linkNative", "upkeepIds", "wrappedPerformDatas", "thisKeyWontExist"} defer func() { mKeys = oldMKeys }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "decoding error") assert.Len(t, upkeeps, 0) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.DecodeReport(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.Run("an error is returned when the third element of the map is not a slice of big.Int", func(t *testing.T) { oldMKeys := mKeys mKeys = []string{"fastGasWei", "linkNative", "wrappedPerformDatas", "upkeepIds"} defer func() { mKeys = oldMKeys }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "upkeep ids of incorrect type in report") assert.Len(t, upkeeps, 0) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.DecodeReport(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.Run("an error is returned when the fourth element of the map is not a struct of perform data", func(t *testing.T) { oldMKeys := mKeys mKeys = []string{"fastGasWei", "linkNative", "upkeepIds", "upkeepIds"} defer func() { mKeys = oldMKeys }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "performs of incorrect structure in report") assert.Len(t, upkeeps, 0) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.DecodeReport(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.Run("an error is returned when the upkeep ids and performDatas are of different lengths", func(t *testing.T) { oldUnpackIntoMapFn := unpackIntoMapFn unpackIntoMapFn = func(v map[string]interface{}, data []byte) error { v["fastGasWei"] = 1 v["linkNative"] = 2 v["upkeepIds"] = []*big.Int{big.NewInt(123), big.NewInt(456)} v["wrappedPerformDatas"] = []struct { CheckBlockNumber uint32 `json:"checkBlockNumber"` CheckBlockhash [32]byte `json:"checkBlockhash"` PerformData []byte `json:"performData"` }{ { CheckBlockNumber: 1, CheckBlockhash: [32]byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8}, PerformData: []byte{}, }, } return nil } defer func() { unpackIntoMapFn = oldUnpackIntoMapFn }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "upkeep ids and performs should have matching length") assert.Len(t, upkeeps, 0) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.NewInt(123)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.NewInt(456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.DecodeReport(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.Run("an error is returned when the first element of the map is not a big int", func(t *testing.T) { oldMKeys := mKeys mKeys = []string{"upkeepIds", "linkNative", "upkeepIds", "wrappedPerformDatas"} defer func() { mKeys = oldMKeys }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "fast gas as wrong type") assert.Len(t, upkeeps, 0) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.DecodeReport(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.Run("an error is returned when the second element of the map is not a big int", func(t *testing.T) { oldMKeys := mKeys mKeys = []string{"fastGasWei", "upkeepIds", "upkeepIds", "wrappedPerformDatas"} defer func() { mKeys = oldMKeys }() upkeeps, err := encoder.DecodeReport(b) assert.Error(t, err, "link native as wrong type") assert.Len(t, upkeeps, 0) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.DecodeReport(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.Run("successfully encodes multiple upkeep results", func(t *testing.T) { upkeepResult0 := EVMAutomationUpkeepResult20{ Block: 1, ID: big.NewInt(10), Eligible: true, GasUsed: big.NewInt(100), PerformData: []byte("data0"), FastGasWei: big.NewInt(100), LinkNative: big.NewInt(100), CheckBlockNumber: 1, CheckBlockHash: [32]byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8}, ExecuteGas: 10, } upkeepResult1 := EVMAutomationUpkeepResult20{ Block: 1, ID: big.NewInt(10), Eligible: true, GasUsed: big.NewInt(200), PerformData: []byte("data1"), FastGasWei: big.NewInt(200), LinkNative: big.NewInt(200), CheckBlockNumber: 2, CheckBlockHash: [32]byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8}, ExecuteGas: 20, } b, err := encoder.EncodeReport([]ocr2keepers.UpkeepResult{upkeepResult0, upkeepResult1}) assert.Nil(t, err) assert.Len(t, b, 640) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.NewInt(10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.NewInt(100)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.NewInt(100)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.NewInt(100)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.NewInt(10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.NewInt(200)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.NewInt(200)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.NewInt(200)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.EncodeReport([]ocr2keepers.UpkeepResult{upkeepResult0, upkeepResult1})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.New("pack failed")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.NewInt(10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.NewInt(100)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.NewInt(100)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.NewInt(100)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/encoder_test.go: `.EncodeReport([]ocr2keepers.UpkeepResult{upkeepResult0})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `t.Run(test.Name, func(t *testing.T) { actives := make(map[string]activeUpkeep) for _, id := range test.ActiveIDs { idNum := big.NewInt(0) idNum.SetString(id, 10) actives[id] = activeUpkeep{ID: idNum} } mht := htmocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) rg := &EvmRegistry{ HeadProvider: HeadProvider{ ht: mht, }, active: actives, } keys, err := rg.GetActiveUpkeepIDs(testutils.Context(t)) if test.ExpectedErr != nil { assert.ErrorIs(t, err, test.ExpectedErr) } else { assert.Nil(t, err) } if len(test.ExpectedKeys) > 0 { for _, key := range keys { assert.Contains(t, test.ExpectedKeys, key) } } else { assert.Equal(t, test.ExpectedKeys, keys) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `idNum.SetString(id, 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `actives[id] = activeUpkeep{ID: idNum}` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `t.Run(test.Name, func(t *testing.T) { ctx := testutils.Context(t) mp := new(mocks.LogPoller) if test.LatestBlock != nil { mp.On("LatestBlock", mock.Anything). Return(logpoller.LogPollerBlock{BlockNumber: test.LatestBlock.OutputBlock}, test.LatestBlock.OutputErr) } if test.LogsWithSigs != nil { fc := test.LogsWithSigs mp.On("LogsWithSigs", mock.Anything, fc.InputStart, fc.InputEnd, upkeepStateEvents, test.Address).Return(fc.OutputLogs, fc.OutputErr) } rg := &EvmRegistry{ addr: test.Address, lastPollBlock: test.LastPoll, poller: mp, chLog: make(chan logpoller.Log, 10), } err := rg.pollLogs(ctx) assert.Equal(t, test.ExpectedLastPoll, rg.lastPollBlock) if test.ExpectedErr != nil { assert.ErrorIs(t, err, test.ExpectedErr) } else { assert.Nil(t, err) } var outputLogCount int CheckLoop: for { chT := time.NewTimer(20 * time.Millisecond) select { case l := <-rg.chLog: chT.Stop() if test.LogsWithSigs == nil { assert.FailNow(t, "logs detected but no logs were expected") } outputLogCount++ assert.Contains(t, test.LogsWithSigs.OutputLogs, l) case <-chT.C: break CheckLoop } } if test.LogsWithSigs != nil { assert.Equal(t, len(test.LogsWithSigs.OutputLogs), outputLogCount) } mp.AssertExpectations(t) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `mp.On("LatestBlock", mock.Anything). Return(logpoller.LogPollerBlock{BlockNumber: test.LatestBlock.OutputBlock}, test.LatestBlock.OutputErr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `mp.On("LogsWithSigs", mock.Anything, fc.InputStart, fc.InputEnd, upkeepStateEvents, test.Address).Return(fc.OutputLogs, fc.OutputErr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `chT.Stop()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `outputLogCount++` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `mp.AssertExpectations(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `.UpkeepIdentifier("8")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `.UpkeepIdentifier("9")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `.UpkeepIdentifier("3")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `.UpkeepIdentifier("1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `.Run(test.Name, func(t *testing.T) { actives := make(map[string]activeUpkeep) for _, id := range test.ActiveIDs { idNum := big.NewInt(0) idNum.SetString(id, 10) actives[id] = activeUpkeep{ID: idNum} } mht := htmocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) rg := &EvmRegistry{ HeadProvider: HeadProvider{ ht: mht, }, active: actives, } keys, err := rg.GetActiveUpkeepIDs(testutils.Context(t)) if test.ExpectedErr != nil { assert.ErrorIs(t, err, test.ExpectedErr) } else { assert.Nil(t, err) } if len(test.ExpectedKeys) > 0 { for _, key := range keys { assert.Contains(t, test.ExpectedKeys, key) } } else { assert.Equal(t, test.ExpectedKeys, keys) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `.NewInt(0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `.SetString(id, 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `.GetActiveUpkeepIDs(testutils.Context(t))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `.BigToAddress(big.NewInt(1))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `.BigToAddress(big.NewInt(1))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `.New(big.NewInt(5))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `.NewInt(5)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `.New(big.NewInt(6))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `.NewInt(6)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `.Run(test.Name, func(t *testing.T) { ctx := testutils.Context(t) mp := new(mocks.LogPoller) if test.LatestBlock != nil { mp.On("LatestBlock", mock.Anything). Return(logpoller.LogPollerBlock{BlockNumber: test.LatestBlock.OutputBlock}, test.LatestBlock.OutputErr) } if test.LogsWithSigs != nil { fc := test.LogsWithSigs mp.On("LogsWithSigs", mock.Anything, fc.InputStart, fc.InputEnd, upkeepStateEvents, test.Address).Return(fc.OutputLogs, fc.OutputErr) } rg := &EvmRegistry{ addr: test.Address, lastPollBlock: test.LastPoll, poller: mp, chLog: make(chan logpoller.Log, 10), } err := rg.pollLogs(ctx) assert.Equal(t, test.ExpectedLastPoll, rg.lastPollBlock) if test.ExpectedErr != nil { assert.ErrorIs(t, err, test.ExpectedErr) } else { assert.Nil(t, err) } var outputLogCount int CheckLoop: for { chT := time.NewTimer(20 * time.Millisecond) select { case l := <-rg.chLog: chT.Stop() if test.LogsWithSigs == nil { assert.FailNow(t, "logs detected but no logs were expected") } outputLogCount++ assert.Contains(t, test.LogsWithSigs.OutputLogs, l) case <-chT.C: break CheckLoop } } if test.LogsWithSigs != nil { assert.Equal(t, len(test.LogsWithSigs.OutputLogs), outputLogCount) } mp.AssertExpectations(t) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `.On("LatestBlock", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `. Return(logpoller.LogPollerBlock{BlockNumber: test.LatestBlock.OutputBlock}, test.LatestBlock.OutputErr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `.On("LogsWithSigs", mock.Anything, fc.InputStart, fc.InputEnd, upkeepStateEvents, test.Address)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `.Return(fc.OutputLogs, fc.OutputErr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `.pollLogs(ctx)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `.NewTimer(20 * time.Millisecond)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `.Stop()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go: `.AssertExpectations(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `t.Run(tc.name, func(t *testing.T) { al := NewActiveUpkeepList() al.Reset(tc.initial...) require.Equal(t, len(tc.initial), al.Size()) for _, id := range tc.initial { require.True(t, al.IsActive(id)) } al.Add(tc.add...) for _, id := range tc.add { require.True(t, al.IsActive(id)) } al.Remove(tc.remove...) for _, id := range tc.remove { require.False(t, al.IsActive(id)) } logIds := al.View(types.LogTrigger) require.Equal(t, len(tc.expectedLogIds), len(logIds)) sort.Slice(logIds, func(i, j int) bool { return logIds[i].Cmp(logIds[j]) < 0 }) for i := range logIds { require.Equal(t, tc.expectedLogIds[i], logIds[i]) } conditionalIds := al.View(types.ConditionTrigger) require.Equal(t, len(tc.expectedConditionalIds), len(conditionalIds)) sort.Slice(conditionalIds, func(i, j int) bool { return conditionalIds[i].Cmp(conditionalIds[j]) < 0 }) for i := range conditionalIds { require.Equal(t, tc.expectedConditionalIds[i], conditionalIds[i]) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `al.Reset(tc.initial...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `al.Add(tc.add...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `al.Remove(tc.remove...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `sort.Slice(logIds, func(i, j int) bool { return logIds[i].Cmp(logIds[j]) < 0 })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `sort.Slice(conditionalIds, func(i, j int) bool { return conditionalIds[i].Cmp(conditionalIds[j]) < 0 })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `al.items = make(map[string]bool)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `al.items["not a number"] = true` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `al.items["-1"] = true` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `al.items["100"] = true` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.GenUpkeepID(types.LogTrigger, "0")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.GenUpkeepID(types.LogTrigger, "1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.GenUpkeepID(types.LogTrigger, "2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.GenUpkeepID(types.LogTrigger, "3")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.GenUpkeepID(types.LogTrigger, "4")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.GenUpkeepID(types.ConditionTrigger, "0")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.GenUpkeepID(types.ConditionTrigger, "1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.GenUpkeepID(types.ConditionTrigger, "2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.GenUpkeepID(types.ConditionTrigger, "3")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.GenUpkeepID(types.ConditionTrigger, "4")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.Run(tc.name, func(t *testing.T) { al := NewActiveUpkeepList() al.Reset(tc.initial...) require.Equal(t, len(tc.initial), al.Size()) for _, id := range tc.initial { require.True(t, al.IsActive(id)) } al.Add(tc.add...) for _, id := range tc.add { require.True(t, al.IsActive(id)) } al.Remove(tc.remove...) for _, id := range tc.remove { require.False(t, al.IsActive(id)) } logIds := al.View(types.LogTrigger) require.Equal(t, len(tc.expectedLogIds), len(logIds)) sort.Slice(logIds, func(i, j int) bool { return logIds[i].Cmp(logIds[j]) < 0 }) for i := range logIds { require.Equal(t, tc.expectedLogIds[i], logIds[i]) } conditionalIds := al.View(types.ConditionTrigger) require.Equal(t, len(tc.expectedConditionalIds), len(conditionalIds)) sort.Slice(conditionalIds, func(i, j int) bool { return conditionalIds[i].Cmp(conditionalIds[j]) < 0 }) for i := range conditionalIds { require.Equal(t, tc.expectedConditionalIds[i], conditionalIds[i]) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.Reset(tc.initial...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.Add(tc.add...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.Remove(tc.remove...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.View(types.LogTrigger)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.Slice(logIds, func(i, j int) bool { return logIds[i].Cmp(logIds[j]) < 0 })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.Cmp(logIds[j])` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.View(types.ConditionTrigger)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.Slice(conditionalIds, func(i, j int) bool { return conditionalIds[i].Cmp(conditionalIds[j]) < 0 })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.Cmp(conditionalIds[j])` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/active_list_test.go: `.View(types.ConditionTrigger)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/autotelemetry21/custom_telemetry_test.go: `service.monitoringEndpoint.SendLog([]byte("test"))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/autotelemetry21/custom_telemetry_test.go: `service.monitoringEndpoint.SendLog([]byte("test2"))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/autotelemetry21/custom_telemetry_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/autotelemetry21/custom_telemetry_test.go: `.NewBlockSubscriber(hb, lp, finality, lggr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/autotelemetry21/custom_telemetry_test.go: `.monitoringEndpoint.SendLog([]byte("test"))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/autotelemetry21/custom_telemetry_test.go: `.monitoringEndpoint.SendLog([]byte("test2"))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `bs.blockHistorySize = historySize` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `bs.blockSize = blockSize` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `subId, _, err = bs.Subscribe()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `subId, _, err = bs.Subscribe()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `bs.blockHistorySize = historySize` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `bs.blockSize = blockSize` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `subId, _, err = bs.Subscribe()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `err = bs.Unsubscribe(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `bs.blockHistorySize = historySize` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `bs.blockSize = blockSize` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `t.Run(tc.Name, func(t *testing.T) { lp := new(mocks.LogPoller) lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: tc.LatestBlock}, tc.LatestBlockErr) bs := NewBlockSubscriber(hb, lp, finality, lggr) bs.blockHistorySize = historySize bs.blockSize = blockSize blocks, err := bs.getBlockRange(testutils.Context(t)) if tc.LatestBlockErr != nil { assert.Equal(t, tc.LatestBlockErr.Error(), err.Error()) } else { assert.Equal(t, tc.ExpectedBlocks, blocks) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: tc.LatestBlock}, tc.LatestBlockErr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `bs.blockHistorySize = historySize` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `bs.blockSize = blockSize` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `t.Run(tc.Name, func(t *testing.T) { lp := new(mocks.LogPoller) lp.On("GetBlocksRange", mock.Anything, tc.Blocks).Return(tc.PollerBlocks, tc.Error) bs := NewBlockSubscriber(hb, lp, finality, lggr) bs.blockHistorySize = historySize bs.blockSize = blockSize err := bs.initializeBlocks(testutils.Context(t), tc.Blocks) if tc.Error != nil { assert.Equal(t, tc.Error.Error(), err.Error()) } else { for _, b := range tc.PollerBlocks { h, ok := bs.blocks[b.BlockNumber] assert.True(t, ok) assert.Equal(t, b.BlockHash.Hex(), h) } assert.Equal(t, tc.LastClearedBlock, bs.lastClearedBlock) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `lp.On("GetBlocksRange", mock.Anything, tc.Blocks).Return(tc.PollerBlocks, tc.Error)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `bs.blockHistorySize = historySize` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `bs.blockSize = blockSize` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `t.Run(tc.Name, func(t *testing.T) { bs := NewBlockSubscriber(hb, lp, finality, lggr) bs.blockHistorySize = historySize bs.blockSize = blockSize bs.blocks = tc.Blocks history := bs.buildHistory(tc.Block) assert.Equal(t, history, tc.ExpectedHistory) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `bs.blockHistorySize = historySize` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `bs.blockSize = blockSize` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `bs.blocks = tc.Blocks` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `t.Run(tc.Name, func(t *testing.T) { bs := NewBlockSubscriber(hb, lp, finality, lggr) bs.blockHistorySize = historySize bs.blockSize = blockSize bs.blocks = tc.Blocks bs.lastClearedBlock = tc.LastClearedBlock bs.lastSentBlock = tc.LastSentBlock bs.cleanup() assert.Equal(t, tc.ExpectedLastClearedBlock, bs.lastClearedBlock) assert.Equal(t, tc.ExpectedBlocks, bs.blocks) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `bs.blockHistorySize = historySize` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `bs.blockSize = blockSize` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `bs.blocks = tc.Blocks` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `bs.lastClearedBlock = tc.LastClearedBlock` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `bs.lastSentBlock = tc.LastSentBlock` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `bs.cleanup()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `hb.On("Subscribe", mock.Anything).Return(&evmtypes.Head{Number: 42}, func() {})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: 100}, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `lp.On("GetBlocksRange", mock.Anything, blocks).Return(pollerBlocks, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `bs.blockHistorySize = historySize` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `bs.blockSize = blockSize` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `bs.headC <- &h100` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `time.Sleep(100 * time.Millisecond)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `bs.headC <- h101` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `time.Sleep(100 * time.Millisecond)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `bs.headC <- new102` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `time.Sleep(100 * time.Millisecond)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `bk1 = <-c1` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.Subscribe()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.Subscribe()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.Subscribe()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.Subscribe()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.Subscribe()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.Unsubscribe(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.Unsubscribe(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.Run(tc.Name, func(t *testing.T) { lp := new(mocks.LogPoller) lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: tc.LatestBlock}, tc.LatestBlockErr) bs := NewBlockSubscriber(hb, lp, finality, lggr) bs.blockHistorySize = historySize bs.blockSize = blockSize blocks, err := bs.getBlockRange(testutils.Context(t)) if tc.LatestBlockErr != nil { assert.Equal(t, tc.LatestBlockErr.Error(), err.Error()) } else { assert.Equal(t, tc.ExpectedBlocks, blocks) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.On("LatestBlock", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.Return(logpoller.LogPollerBlock{BlockNumber: tc.LatestBlock}, tc.LatestBlockErr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.getBlockRange(testutils.Context(t))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.HexToHash("0x5e7fadfc14e1cfa9c05a91128c16a20c6cbc3be38b4723c3d482d44bf9c0e07b")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.HexToHash("0xaf3f8b36a27837e9f1ea3b4da7cdbf2ce0bdf7ef4e87d23add83b19438a2fcba")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.HexToHash("0xa7ac5bbc905b81f3a2ad9fb8ef1fe45f4a95768df456736952e4ec6c21296abe")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.HexToHash("0xa7ac5bbc905b81f3a2ad9fb8ef1fe45f4a95768df456736952e4ec6c21296abe")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.Run(tc.Name, func(t *testing.T) { lp := new(mocks.LogPoller) lp.On("GetBlocksRange", mock.Anything, tc.Blocks).Return(tc.PollerBlocks, tc.Error) bs := NewBlockSubscriber(hb, lp, finality, lggr) bs.blockHistorySize = historySize bs.blockSize = blockSize err := bs.initializeBlocks(testutils.Context(t), tc.Blocks) if tc.Error != nil { assert.Equal(t, tc.Error.Error(), err.Error()) } else { for _, b := range tc.PollerBlocks { h, ok := bs.blocks[b.BlockNumber] assert.True(t, ok) assert.Equal(t, b.BlockHash.Hex(), h) } assert.Equal(t, tc.LastClearedBlock, bs.lastClearedBlock) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.On("GetBlocksRange", mock.Anything, tc.Blocks)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.Return(tc.PollerBlocks, tc.Error)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.initializeBlocks(testutils.Context(t), tc.Blocks)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.HexToHash("0xaf3f8b36a27837e9f1ea3b4da7cdbf2ce0bdf7ef4e87d23add83b19438a2fcba")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.HexToHash("0xc20c7b47466c081a44a3b168994e89affe85cb894547845d938f923b67c633c0")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.HexToHash("0xa7ac5bbc905b81f3a2ad9fb8ef1fe45f4a95768df456736952e4ec6c21296abe")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.Run(tc.Name, func(t *testing.T) { bs := NewBlockSubscriber(hb, lp, finality, lggr) bs.blockHistorySize = historySize bs.blockSize = blockSize bs.blocks = tc.Blocks history := bs.buildHistory(tc.Block) assert.Equal(t, history, tc.ExpectedHistory) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.buildHistory(tc.Block)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.Run(tc.Name, func(t *testing.T) { bs := NewBlockSubscriber(hb, lp, finality, lggr) bs.blockHistorySize = historySize bs.blockSize = blockSize bs.blocks = tc.Blocks bs.lastClearedBlock = tc.LastClearedBlock bs.lastSentBlock = tc.LastSentBlock bs.cleanup() assert.Equal(t, tc.ExpectedLastClearedBlock, bs.lastClearedBlock) assert.Equal(t, tc.ExpectedBlocks, bs.blocks) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.cleanup()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.On("Subscribe", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.Return(&evmtypes.Head{Number: 42}, func() {})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.On("LatestBlock", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.Return(logpoller.LogPollerBlock{BlockNumber: 100}, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.HexToHash("0xda2f9d1359eadd7b93338703adc07d942021a78195564038321ef53f23f87333")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.HexToHash("0xc20c7b47466c081a44a3b168994e89affe85cb894547845d938f923b67c633c0")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.HexToHash("0x9bc2b51e147f9cad05f1614b7f1d8181cb24c544cbcf841f3155e54e752a3b44")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.HexToHash("0x5e7fadfc14e1cfa9c05a91128c16a20c6cbc3be38b4723c3d482d44bf9c0e07b")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.On("GetBlocksRange", mock.Anything, blocks)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.Return(pollerBlocks, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.Start(testutils.Context(t))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.HexToHash("0xda2f9d1359eadd7b93338703adc07d942021a78195564038321ef53f23f87333")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.HexToHash("0xc20c7b47466c081a44a3b168994e89affe85cb894547845d938f923b67c633c0")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.HexToHash("0x9bc2b51e147f9cad05f1614b7f1d8181cb24c544cbcf841f3155e54e752a3b44")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.HexToHash("0x5e7fadfc14e1cfa9c05a91128c16a20c6cbc3be38b4723c3d482d44bf9c0e07b")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.Sleep(100 * time.Millisecond)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.Subscribe()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.HexToHash("0xc20c7b47466c081a44a3b168994e89affe85cb894547845d938f923b67c633c0")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.Sleep(100 * time.Millisecond)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.Subscribe()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.HexToHash("0x70c03acc4ddbfb253ba41a25dc13fb21b25da8b63bcd1aa7fb55713d33a36c71")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.HexToHash("0x8a876b62d252e63e16cf3487db3486c0a7c0a8e06bc3792a3b116c5ca480503f")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.HexToHash("0x41b5842b8847dcf834e39556d2ac51cc7d960a7de9471ec504673d0038fd6c8e")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.HexToHash("0x9ac1ebc307554cf1bcfcc2a49462278e89d6878d613a33df38a64d0aeac971b5")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go: `.Sleep(100 * time.Millisecond)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/payload_test.go: `t.Run(tc.name, func(t *testing.T) { // Convert the string to a big.Int var id big.Int _, success := id.SetString(tc.upkeepID, 10) if !success { t.Fatal("Invalid big integer value") } uid := &ocr2keepers.UpkeepIdentifier{} ok := uid.FromBigInt(&id) if !ok { t.Fatal("Invalid upkeep identifier") } res := UpkeepWorkID(*uid, tc.trigger) assert.Equal(t, tc.expected, res, "UpkeepWorkID mismatch") })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/payload_test.go: `t.Run(tc.name, func(t *testing.T) { payload, err := NewUpkeepPayload( tc.upkeepID, tc.trigger, tc.check, ) if tc.errored { assert.Error(t, err) return } assert.NoError(t, err) assert.Equal(t, tc.workID, payload.WorkID) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/payload_test.go: `.HexToHash("0xabcdef")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/payload_test.go: `.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/payload_test.go: `.HexToHash("0xabcdef")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/payload_test.go: `.HexToHash("0x12345")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/payload_test.go: `.HexToHash("0xabcdef")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/payload_test.go: `.HexToHash("0xb41258d18cd44ebf7a0d70de011f2bc4a67c9b68e8b6dada864045d8543bb020")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/payload_test.go: `.HexToHash("0x44079b1b33aff337dbf17b9e12c5724ecab979c50c8201a9814a488ff3e22384")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/payload_test.go: `.HexToHash("0xb41258d18cd44ebf7a0d70de011f2bc4a67c9b68e8b6dada864045d8543bb020")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/payload_test.go: `.HexToHash("0xabcdef")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/payload_test.go: `.Run(tc.name, func(t *testing.T) { // Convert the string to a big.Int var id big.Int _, success := id.SetString(tc.upkeepID, 10) if !success { t.Fatal("Invalid big integer value") } uid := &ocr2keepers.UpkeepIdentifier{} ok := uid.FromBigInt(&id) if !ok { t.Fatal("Invalid upkeep identifier") } res := UpkeepWorkID(*uid, tc.trigger) assert.Equal(t, tc.expected, res, "UpkeepWorkID mismatch") })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/payload_test.go: `.SetString(tc.upkeepID, 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/payload_test.go: `.FromBigInt(&id)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/payload_test.go: `.NewInt(111)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/payload_test.go: `.HexToHash("0x11111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/payload_test.go: `.NewInt(111)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/payload_test.go: `.HexToHash("0x11111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/payload_test.go: `.HexToHash("0x11111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/payload_test.go: `.Run(tc.name, func(t *testing.T) { payload, err := NewUpkeepPayload( tc.upkeepID, tc.trigger, tc.check, ) if tc.errored { assert.Error(t, err) return } assert.NoError(t, err) assert.Equal(t, tc.workID, payload.WorkID) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/trigger_test.go: `t.Run(tc.name, func(t *testing.T) { var idBytes [32]byte copy(idBytes[:], tc.id) id := ocr2keepers.UpkeepIdentifier(idBytes) encoded, err := PackTrigger(id.BigInt(), tc.trigger) if tc.err != nil { assert.EqualError(t, err, tc.err.Error()) } else { assert.NoError(t, err) assert.Equal(t, tc.encoded, encoded) decoded, err := UnpackTrigger(id.BigInt(), encoded) assert.NoError(t, err) assert.Equal(t, tc.trigger.BlockNum, decoded.BlockNum) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/trigger_test.go: `copy(idBytes[:], tc.id)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/trigger_test.go: `t.Run("unpacking invalid trigger", func(t *testing.T) { _, err := UnpackTrigger(big.NewInt(0), []byte{1, 2, 3}) assert.Error(t, err) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/trigger_test.go: `copy(idBytes[:], uid)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/trigger_test.go: `.LeftPadBytes([]byte{1}, 15)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/trigger_test.go: `.HexToHash("0x01111111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/trigger_test.go: `.HexToHash("0x01111111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/trigger_test.go: `.HexToHash("0x01111abc")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/trigger_test.go: `.Decode("0x0000000000000000000000000000000000000000000000000000000001111abc0000000000000000000000000000000000000000000000000000000001111111000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001111111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/trigger_test.go: `.LeftPadBytes([]byte{0}, 15)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/trigger_test.go: `.HexToHash("0x01111111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/trigger_test.go: `.Decode("0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001111111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/trigger_test.go: `.LeftPadBytes([]byte{8}, 15)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/trigger_test.go: `.HexToHash("0x01111111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/trigger_test.go: `.Run(tc.name, func(t *testing.T) { var idBytes [32]byte copy(idBytes[:], tc.id) id := ocr2keepers.UpkeepIdentifier(idBytes) encoded, err := PackTrigger(id.BigInt(), tc.trigger) if tc.err != nil { assert.EqualError(t, err, tc.err.Error()) } else { assert.NoError(t, err) assert.Equal(t, tc.encoded, encoded) decoded, err := UnpackTrigger(id.BigInt(), encoded) assert.NoError(t, err) assert.Equal(t, tc.trigger.BlockNum, decoded.BlockNum) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/trigger_test.go: `.UpkeepIdentifier(idBytes)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/trigger_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/trigger_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/trigger_test.go: `.Run("unpacking invalid trigger", func(t *testing.T) { _, err := UnpackTrigger(big.NewInt(0), []byte{1, 2, 3}) assert.Error(t, err) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/trigger_test.go: `.NewInt(0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/trigger_test.go: `.LeftPadBytes([]byte{8}, 15)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/trigger_test.go: `.UpkeepIdentifier(idBytes)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/trigger_test.go: `.Decode("0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001111111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/trigger_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/type_test.go: `t.Run(tc.name, func(t *testing.T) { uid := ocr2keepers.UpkeepIdentifier{} copy(uid[:], tc.upkeepID) assert.Equal(t, tc.upkeepType, GetUpkeepType(uid)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/type_test.go: `copy(uid[:], tc.upkeepID)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/type_test.go: `.NewInt(0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/type_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/type_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/type_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/type_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/type_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/type_test.go: `.NewInt(0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/type_test.go: `.SetString("32329108151019397958065800113404894502874153543356521479058624064899121404671", 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/type_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/type_test.go: `.Run(tc.name, func(t *testing.T) { uid := ocr2keepers.UpkeepIdentifier{} copy(uid[:], tc.upkeepID) assert.Equal(t, tc.upkeepType, GetUpkeepType(uid)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/utils_test.go: `client.On("CallContext", mock.Anything, mock.Anything, "eth_getTransactionReceipt", tt.txHash). Return(tt.ethCallError).Run(func(args mock.Arguments) { receipt := tt.receipt if receipt != nil { res := args.Get(1).(*types.Receipt) res.Status = receipt.Status res.TxHash = receipt.TxHash res.BlockNumber = receipt.BlockNumber res.BlockHash = receipt.BlockHash } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/utils_test.go: `res.Status = receipt.Status` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/utils_test.go: `res.TxHash = receipt.TxHash` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/utils_test.go: `res.BlockNumber = receipt.BlockNumber` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/utils_test.go: `res.BlockHash = receipt.BlockHash` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/utils_test.go: `.HexToHash("0xc48fbf05edaf18f6aaa7de24de28528546b874bb03728d624ca407b8fed582a3")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/utils_test.go: `.NewInt(2000)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/utils_test.go: `.HexToHash("0xc48fbf05edaf18f6aaa7de24de28528546b874bb03728d624ca407b8fed582a3")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/utils_test.go: `.HexToHash("0xc48fbf05edaf18f6aaa7de24de28528546b874bb03728d624ca407b8fed582a3")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/utils_test.go: `.On("CallContext", mock.Anything, mock.Anything, "eth_getTransactionReceipt", tt.txHash)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/utils_test.go: `. Return(tt.ethCallError)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/utils_test.go: `.Run(func(args mock.Arguments) { receipt := tt.receipt if receipt != nil { res := args.Get(1).(*types.Receipt) res.Status = receipt.Status res.TxHash = receipt.TxHash res.BlockNumber = receipt.BlockNumber res.BlockHash = receipt.BlockHash } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/utils_test.go: `.Get(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/utils_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/encoder_test.go: `t.Run(tc.name, func(t *testing.T) { b, err := encoder.Encode(tc.results...) if tc.expectedErr != nil { assert.Equal(t, tc.expectedErr, err) return } assert.Nil(t, err) assert.Len(t, b, tc.reportSize) results, err := encoder.Extract(b) assert.Nil(t, err) assert.Len(t, results, len(tc.results)) for i, r := range results { assert.Equal(t, r.UpkeepID, tc.results[i].UpkeepID) assert.Equal(t, r.WorkID, tc.results[i].WorkID) assert.Equal(t, r.Trigger, tc.results[i].Trigger) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/encoder_test.go: `.GenUpkeepID(types.LogTrigger, "123")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/encoder_test.go: `.GenUpkeepID(types.LogTrigger, "10")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/encoder_test.go: `.GenUpkeepID(types.ConditionTrigger, "20")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/encoder_test.go: `.GenUpkeepID(types.ConditionTrigger, "30")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/encoder_test.go: `.GenUpkeepID(types.ConditionTrigger, "30")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/encoder_test.go: `.GenUpkeepID(types.ConditionTrigger, "20")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/encoder_test.go: `.GenUpkeepID(types.LogTrigger, "10")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/encoder_test.go: `.Run(tc.name, func(t *testing.T) { b, err := encoder.Encode(tc.results...) if tc.expectedErr != nil { assert.Equal(t, tc.expectedErr, err) return } assert.Nil(t, err) assert.Len(t, b, tc.reportSize) results, err := encoder.Extract(b) assert.Nil(t, err) assert.Len(t, results, len(tc.results)) for i, r := range results { assert.Equal(t, r.UpkeepID, tc.results[i].UpkeepID) assert.Equal(t, r.WorkID, tc.results[i].WorkID) assert.Equal(t, r.Trigger, tc.results[i].Trigger) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/encoder_test.go: `.Encode(tc.results...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/encoder_test.go: `.Extract(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/encoder_test.go: `.GenUpkeepID(types.LogTrigger, "10")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/encoder_test.go: `.GenUpkeepID(types.ConditionTrigger, "20")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/encoder_test.go: `.Encode(results...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/encoder_test.go: `.Equal(encoded, expectedEncodedReport)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `t.Run(tc.name, func(t *testing.T) { packer := NewAbiPacker() bytes, err := packer.PackReport(tc.report) if tc.expectsErr { assert.Error(t, err) assert.Equal(t, tc.wantErr.Error(), err.Error()) } else { assert.NoError(t, err) assert.Equal(t, tc.wantBytes, len(bytes)) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `upkeepId.FromBigInt(uid)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `t.Run(test.Name, func(t *testing.T) { packer := NewAbiPacker() rs, err := packer.UnpackCheckResult(test.Payload, test.RawData) if test.ExpectedError != nil { assert.Equal(t, test.ExpectedError.Error(), err.Error()) } else { assert.Nil(t, err) } assert.Equal(t, test.ExpectedResult.UpkeepID, rs.UpkeepID) assert.Equal(t, test.ExpectedResult.Eligible, rs.Eligible) assert.Equal(t, test.ExpectedResult.Trigger, rs.Trigger) assert.Equal(t, test.ExpectedResult.WorkID, rs.WorkID) assert.Equal(t, test.ExpectedResult.IneligibilityReason, rs.IneligibilityReason) assert.Equal(t, test.ExpectedResult.PipelineExecutionState, rs.PipelineExecutionState) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `t.Run(test.Name, func(t *testing.T) { packer := NewAbiPacker() state, rs, err := packer.UnpackPerformResult(test.RawData) assert.Nil(t, err) assert.True(t, rs) assert.Equal(t, test.State, state) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `t.Run(tc.name, func(t *testing.T) { packer := NewAbiPacker() res, err := packer.UnpackLogTriggerConfig(tc.raw) if tc.errored { assert.Error(t, err) } else { assert.NoError(t, err) assert.Equal(t, tc.res, res) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(3)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(4)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(4)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(3)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(3)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(4)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(3)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(4)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.Run(tc.name, func(t *testing.T) { packer := NewAbiPacker() bytes, err := packer.PackReport(tc.report) if tc.expectsErr { assert.Error(t, err) assert.Equal(t, tc.wantErr.Error(), err.Error()) } else { assert.NoError(t, err) assert.Equal(t, tc.wantBytes, len(bytes)) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.PackReport(tc.report)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.SetString("1843548457736589226156809205796175506139185429616502850435279853710366065936", 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.FromBigInt(uid)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewUpkeepPayload(uid, ocr2keepers.NewTrigger(19447615, common.HexToHash("0x0")), []byte{})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewTrigger(19447615, common.HexToHash("0x0"))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.HexToHash("0x0")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewUpkeepPayload(uid, ocr2keepers.NewTrigger(19448272, common.HexToHash("0x0")), []byte{})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewTrigger(19448272, common.HexToHash("0x0"))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.HexToHash("0x0")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewLogTrigger(ocr2keepers.BlockNumber(19447615), [32]byte{}, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.BlockNumber(19447615)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(1000000000)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(3532383906411401)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewLogTrigger(ocr2keepers.BlockNumber(19448272), [32]byte{}, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.BlockNumber(19448272)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(1000000000)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(3532383906411401)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.Run(test.Name, func(t *testing.T) { packer := NewAbiPacker() rs, err := packer.UnpackCheckResult(test.Payload, test.RawData) if test.ExpectedError != nil { assert.Equal(t, test.ExpectedError.Error(), err.Error()) } else { assert.Nil(t, err) } assert.Equal(t, test.ExpectedResult.UpkeepID, rs.UpkeepID) assert.Equal(t, test.ExpectedResult.Eligible, rs.Eligible) assert.Equal(t, test.ExpectedResult.Trigger, rs.Trigger) assert.Equal(t, test.ExpectedResult.WorkID, rs.WorkID) assert.Equal(t, test.ExpectedResult.IneligibilityReason, rs.IneligibilityReason) assert.Equal(t, test.ExpectedResult.PipelineExecutionState, rs.PipelineExecutionState) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.UnpackCheckResult(test.Payload, test.RawData)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.Run(test.Name, func(t *testing.T) { packer := NewAbiPacker() state, rs, err := packer.UnpackPerformResult(test.RawData) assert.Nil(t, err) assert.True(t, rs) assert.Equal(t, test.State, state) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.UnpackPerformResult(test.RawData)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.Decode("0x0000000000000000000000007456fadf415b7c34b1182bd20b0537977e945e3e00000000000000000000000000000000000000000000000000000000000000003d53a39550e04688065827f3bb86584cb007ab9ebca7ebd528e7301c9c31eb5d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.HexToAddress("0x7456FadF415b7c34B1182Bd20B0537977e945e3E")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.Decode("0x000000000000000000000000b1182bd20b0537977e945e3e00000000000000000000000000000000000000000000000000000000000000003d53a39550e04688065827f3bb86584cb007ab9ebca7ebd528e7301c9c31eb5d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.Run(tc.name, func(t *testing.T) { packer := NewAbiPacker() res, err := packer.UnpackLogTriggerConfig(tc.raw) if tc.errored { assert.Error(t, err) } else { assert.NoError(t, err) assert.Equal(t, tc.res, res) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.UnpackLogTriggerConfig(tc.raw)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(100)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.NewInt(200)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.PackReport(report)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.UnpackReport(res)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding/packer_test.go: `.Encode(res)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `t.Run(test.Name, func(t *testing.T) { ctx := testutils.Context(t) ge := gasMocks.NewEvmFeeEstimator(t) if test.FailedToGetFee { ge.On("GetFee", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return( gas.EvmFee{}, feeLimit, errors.New("failed to retrieve gas price"), ) } else if test.CurrentLegacyGasPrice != nil { ge.On("GetFee", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return( gas.EvmFee{ Legacy: assets.NewWei(test.CurrentLegacyGasPrice), }, feeLimit, nil, ) } else if test.CurrentDynamicGasPrice != nil { ge.On("GetFee", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return( gas.EvmFee{ DynamicFeeCap: assets.NewWei(test.CurrentDynamicGasPrice), DynamicTipCap: assets.NewWei(big.NewInt(1_000_000_000)), }, feeLimit, nil, ) } var oc []byte if test.ParsingFailed { oc, _ = cbor.Marshal(WrongOffchainConfig{MaxGasPrice1: []int{1, 2, 3}}) if len(oc) > 0 { oc[len(oc)-1] = 0x99 } } else if test.NotConfigured { oc = []byte{1, 2, 3, 4} // parsing this will set maxGasPrice field to nil } else if test.MaxGasPrice != nil { oc, _ = cbor.Marshal(UpkeepOffchainConfig{MaxGasPrice: test.MaxGasPrice}) } fr := CheckGasPrice(ctx, uid, oc, ge, lggr) assert.Equal(t, test.ExpectedResult, fr) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `ge.On("GetFee", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return( gas.EvmFee{}, feeLimit, errors.New("failed to retrieve gas price"), )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `ge.On("GetFee", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return( gas.EvmFee{ Legacy: assets.NewWei(test.CurrentLegacyGasPrice), }, feeLimit, nil, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `ge.On("GetFee", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return( gas.EvmFee{ DynamicFeeCap: assets.NewWei(test.CurrentDynamicGasPrice), DynamicTipCap: assets.NewWei(big.NewInt(1_000_000_000)), }, feeLimit, nil, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `oc, _ = cbor.Marshal(WrongOffchainConfig{MaxGasPrice1: []int{1, 2, 3}})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `oc[len(oc)-1] = 0x99` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `oc = []byte{1, 2, 3, 4}` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `oc, _ = cbor.Marshal(UpkeepOffchainConfig{MaxGasPrice: test.MaxGasPrice})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.SetString("1843548457736589226156809205796175506139185429616502850435279853710366065936", 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.NewInt(10_000_000_000)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.NewInt(8_000_000_000)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.NewInt(10_000_000_000)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.NewInt(18_000_000_000)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.NewInt(10_000_000_000)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.NewInt(15_000_000_000)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.NewInt(8_000_000_000)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.NewInt(5_000_000_000)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.NewInt(10_000_000_000)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.NewInt(8_000_000_000)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.Run(test.Name, func(t *testing.T) { ctx := testutils.Context(t) ge := gasMocks.NewEvmFeeEstimator(t) if test.FailedToGetFee { ge.On("GetFee", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return( gas.EvmFee{}, feeLimit, errors.New("failed to retrieve gas price"), ) } else if test.CurrentLegacyGasPrice != nil { ge.On("GetFee", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return( gas.EvmFee{ Legacy: assets.NewWei(test.CurrentLegacyGasPrice), }, feeLimit, nil, ) } else if test.CurrentDynamicGasPrice != nil { ge.On("GetFee", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return( gas.EvmFee{ DynamicFeeCap: assets.NewWei(test.CurrentDynamicGasPrice), DynamicTipCap: assets.NewWei(big.NewInt(1_000_000_000)), }, feeLimit, nil, ) } var oc []byte if test.ParsingFailed { oc, _ = cbor.Marshal(WrongOffchainConfig{MaxGasPrice1: []int{1, 2, 3}}) if len(oc) > 0 { oc[len(oc)-1] = 0x99 } } else if test.NotConfigured { oc = []byte{1, 2, 3, 4} // parsing this will set maxGasPrice field to nil } else if test.MaxGasPrice != nil { oc, _ = cbor.Marshal(UpkeepOffchainConfig{MaxGasPrice: test.MaxGasPrice}) } fr := CheckGasPrice(ctx, uid, oc, ge, lggr) assert.Equal(t, test.ExpectedResult, fr) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.NewEvmFeeEstimator(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.On("GetFee", mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.Return( gas.EvmFee{}, feeLimit, errors.New("failed to retrieve gas price"), )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.New("failed to retrieve gas price")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.On("GetFee", mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.Return( gas.EvmFee{ Legacy: assets.NewWei(test.CurrentLegacyGasPrice), }, feeLimit, nil, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.NewWei(test.CurrentLegacyGasPrice)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.On("GetFee", mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.Return( gas.EvmFee{ DynamicFeeCap: assets.NewWei(test.CurrentDynamicGasPrice), DynamicTipCap: assets.NewWei(big.NewInt(1_000_000_000)), }, feeLimit, nil, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.NewWei(test.CurrentDynamicGasPrice)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.NewWei(big.NewInt(1_000_000_000))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.NewInt(1_000_000_000)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.Marshal(WrongOffchainConfig{MaxGasPrice1: []int{1, 2, 3}})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/gasprice/gasprice_test.go: `.Marshal(UpkeepOffchainConfig{MaxGasPrice: test.MaxGasPrice})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/keyring_test.go: `t.Run("the on chain keyring wrapper gets the public key and max signature length from the wrapped keyring", func(t *testing.T) { onchainKeyring := &mockOnchainKeyring{ MaxSignatureLengthFn: func() int { return 123 }, PublicKeyFn: func() types.OnchainPublicKey { return types.OnchainPublicKey([]byte("abcdef")) }, } keyring := NewOnchainKeyringV3Wrapper(onchainKeyring) assert.Equal(t, 123, keyring.MaxSignatureLength()) assert.Equal(t, types.OnchainPublicKey([]byte("abcdef")), keyring.PublicKey()) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/keyring_test.go: `t.Run("a report context is created and the wrapped keyring signs the report", func(t *testing.T) { onchainKeyring := &mockOnchainKeyring{ SignFn: func(context types.ReportContext, report types.Report) (signature []byte, err error) { assert.Equal(t, types.ReportContext{ ReportTimestamp: types.ReportTimestamp{ ConfigDigest: types.ConfigDigest([32]byte{1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4}), Epoch: 101, Round: 0, }, ExtraHash: [32]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, }, context) assert.Equal(t, types.Report([]byte("a report to sign")), report) return []byte("signature"), err }, } keyring := NewOnchainKeyringV3Wrapper(onchainKeyring) signed, err := keyring.Sign( types.ConfigDigest([32]byte{1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4}), 101, ocr3types.ReportWithInfo[plugin.AutomationReportInfo]{ Report: []byte("a report to sign"), Info: plugin.AutomationReportInfo{}, }, ) assert.NoError(t, err) assert.Equal(t, []byte("signature"), signed) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/keyring_test.go: `.Run("the on chain keyring wrapper gets the public key and max signature length from the wrapped keyring", func(t *testing.T) { onchainKeyring := &mockOnchainKeyring{ MaxSignatureLengthFn: func() int { return 123 }, PublicKeyFn: func() types.OnchainPublicKey { return types.OnchainPublicKey([]byte("abcdef")) }, } keyring := NewOnchainKeyringV3Wrapper(onchainKeyring) assert.Equal(t, 123, keyring.MaxSignatureLength()) assert.Equal(t, types.OnchainPublicKey([]byte("abcdef")), keyring.PublicKey()) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/keyring_test.go: `.OnchainPublicKey([]byte("abcdef"))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/keyring_test.go: `.Run("a report context is created and the wrapped keyring signs the report", func(t *testing.T) { onchainKeyring := &mockOnchainKeyring{ SignFn: func(context types.ReportContext, report types.Report) (signature []byte, err error) { assert.Equal(t, types.ReportContext{ ReportTimestamp: types.ReportTimestamp{ ConfigDigest: types.ConfigDigest([32]byte{1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4}), Epoch: 101, Round: 0, }, ExtraHash: [32]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, }, context) assert.Equal(t, types.Report([]byte("a report to sign")), report) return []byte("signature"), err }, } keyring := NewOnchainKeyringV3Wrapper(onchainKeyring) signed, err := keyring.Sign( types.ConfigDigest([32]byte{1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4}), 101, ocr3types.ReportWithInfo[plugin.AutomationReportInfo]{ Report: []byte("a report to sign"), Info: plugin.AutomationReportInfo{}, }, ) assert.NoError(t, err) assert.Equal(t, []byte("signature"), signed) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/keyring_test.go: `.Sign( types.ConfigDigest([32]byte{1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4}), 101, ocr3types.ReportWithInfo[plugin.AutomationReportInfo]{ Report: []byte("a report to sign"), Info: plugin.AutomationReportInfo{}, }, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/keyring_test.go: `.ConfigDigest([32]byte{1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/keyring_test.go: `.Verify( types.OnchainPublicKey([]byte("key")), types.ConfigDigest([32]byte{1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4}), 999, ocr3types.ReportWithInfo[plugin.AutomationReportInfo]{ Report: []byte("a report to sign"), Info: plugin.AutomationReportInfo{}, }, []byte("signature"), )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/keyring_test.go: `.OnchainPublicKey([]byte("key"))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/keyring_test.go: `.ConfigDigest([32]byte{1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/block_time_test.go: `t.Run(tc.name, func(t *testing.T) { ctx := testutils.Context(t) lp := new(lpmocks.LogPoller) resolver := newBlockTimeResolver(lp) lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: tc.latestBlock}, tc.latestBlockErr) lp.On("GetBlocksRange", mock.Anything, mock.Anything).Return(tc.blocksRange, tc.blocksRangeErr) blockTime, err := resolver.BlockTime(ctx, tc.blockSampleSize) if tc.blockTimeErr != nil { require.Error(t, err) return } require.Equal(t, tc.blockTime, blockTime) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/block_time_test.go: `lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: tc.latestBlock}, tc.latestBlockErr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/block_time_test.go: `lp.On("GetBlocksRange", mock.Anything, mock.Anything).Return(tc.blocksRange, tc.blocksRangeErr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/block_time_test.go: `.Now()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/block_time_test.go: `.Add(-time.Second * (2 * 4))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/block_time_test.go: `.Run(tc.name, func(t *testing.T) { ctx := testutils.Context(t) lp := new(lpmocks.LogPoller) resolver := newBlockTimeResolver(lp) lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: tc.latestBlock}, tc.latestBlockErr) lp.On("GetBlocksRange", mock.Anything, mock.Anything).Return(tc.blocksRange, tc.blocksRangeErr) blockTime, err := resolver.BlockTime(ctx, tc.blockSampleSize) if tc.blockTimeErr != nil { require.Error(t, err) return } require.Equal(t, tc.blockTime, blockTime) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/block_time_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/block_time_test.go: `.On("LatestBlock", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/block_time_test.go: `.Return(logpoller.LogPollerBlock{BlockNumber: tc.latestBlock}, tc.latestBlockErr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/block_time_test.go: `.On("GetBlocksRange", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/block_time_test.go: `.Return(tc.blocksRange, tc.blocksRangeErr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/block_time_test.go: `.BlockTime(ctx, tc.blockSampleSize)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 0}, logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x3"), LogIndex: 0}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `buf.enqueue(big.NewInt(2), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 2}, logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x3"), LogIndex: 2}, logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x1"), LogIndex: 1}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `t.Run(tc.name, func(t *testing.T) { blocks := buf.getBlocksInRange(int(tc.from), int(tc.to)) require.Equal(t, tc.want, len(blocks)) if tc.want > 0 { from := tc.from require.Equal(t, from, blocks[0].blockNumber) to := tc.to if to >= maxSeenBlock { to = maxSeenBlock } require.Equal(t, to, blocks[len(blocks)-1].blockNumber) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `to = maxSeenBlock` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `t.Run(tc.name, func(t *testing.T) { blocks := buf.getBlocksInRange(int(tc.from), int(tc.to)) require.Equal(t, len(tc.expectedBlocks), len(blocks)) expectedBlockNumbers := map[int64]bool{} for _, b := range tc.expectedBlocks { expectedBlockNumbers[b] = false } for _, b := range blocks { expectedBlockNumbers[b.blockNumber] = true } for k, v := range expectedBlockNumbers { require.True(t, v, "missing block %d", k) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `expectedBlockNumbers[b] = false` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `expectedBlockNumbers[b.blockNumber] = true` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `t.Run("dequeue empty", func(t *testing.T) { buf := newLogEventBuffer(logger.TestLogger(t), 3, 10, 10) results := buf.peekRange(int64(1), int64(2)) require.Equal(t, 0, len(results)) results = buf.peek(2) require.Equal(t, 0, len(results)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `results = buf.peek(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `t.Run("enqueue", func(t *testing.T) { buf := newLogEventBuffer(logger.TestLogger(t), 3, 10, 10) buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 1}, ) buf.lock.Lock() require.Equal(t, 2, len(buf.blocks[0].logs)) buf.lock.Unlock() })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 1}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `buf.lock.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `buf.lock.Unlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `t.Run("enqueue logs overflow", func(t *testing.T) { buf := newLogEventBuffer(logger.TestLogger(t), 2, 2, 2) require.Equal(t, 2, buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 1}, logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 2}, )) buf.lock.Lock() require.Equal(t, 2, len(buf.blocks[0].logs)) buf.lock.Unlock() })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `buf.lock.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `buf.lock.Unlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `t.Run("enqueue logs overflow with dynamic limits", func(t *testing.T) { buf := newLogEventBuffer(logger.TestLogger(t), 2, 10, 2) require.Equal(t, 2, buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 1}, logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 2}, )) buf.SetLimits(10, 3) require.Equal(t, 3, buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x21"), LogIndex: 0}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x21"), LogIndex: 1}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x21"), LogIndex: 2}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x21"), LogIndex: 3}, )) buf.lock.Lock() defer buf.lock.Unlock() require.Equal(t, 2, len(buf.blocks[0].logs)) require.Equal(t, 3, len(buf.blocks[1].logs)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `buf.SetLimits(10, 3)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `buf.lock.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `t.Run("enqueue logs overflow with dynamic limits", func(t *testing.T) { buf := newLogEventBuffer(logger.TestLogger(t), 2, 10, 2) require.Equal(t, 2, buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 1}, logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 2}, logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 3}, )) buf.SetLimits(10, 3) require.Equal(t, 3, buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x21"), LogIndex: 0}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x21"), LogIndex: 1}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x21"), LogIndex: 2}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x21"), LogIndex: 3}, )) buf.lock.Lock() defer buf.lock.Unlock() require.Equal(t, 2, len(buf.blocks[0].logs)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `buf.SetLimits(10, 3)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `buf.lock.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `t.Run("enqueue block overflow", func(t *testing.T) { buf := newLogEventBuffer(logger.TestLogger(t), 3, 2, 10) require.Equal(t, 5, buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 0}, logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x3"), LogIndex: 0}, logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x4"), LogIndex: 0}, logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x4"), LogIndex: 1}, )) buf.lock.Lock() require.Equal(t, 2, len(buf.blocks[0].logs)) buf.lock.Unlock() })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `buf.lock.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `buf.lock.Unlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `t.Run("enqueue upkeep block overflow", func(t *testing.T) { buf := newLogEventBuffer(logger.TestLogger(t), 10, 10, 2) require.Equal(t, 2, buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 1}, logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 2}, logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 3}, )) buf.lock.Lock() require.Equal(t, 2, len(buf.blocks[0].logs)) buf.lock.Unlock() })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `buf.lock.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `buf.lock.Unlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `t.Run("peek range after dequeue", func(t *testing.T) { buf := newLogEventBuffer(logger.TestLogger(t), 3, 10, 10) require.Equal(t, buf.enqueue(big.NewInt(10), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 10}, logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x1"), LogIndex: 11}, ), 2) require.Equal(t, buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x1"), LogIndex: 1}, ), 2) results := buf.peekRange(int64(1), int64(2)) require.Equal(t, 2, len(results)) verifyBlockNumbers(t, results, 1, 2) removed := buf.dequeueRange(int64(1), int64(2), 2, 10) require.Equal(t, 2, len(removed)) results = buf.peekRange(int64(1), int64(2)) require.Equal(t, 0, len(results)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `verifyBlockNumbers(t, results, 1, 2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `results = buf.peekRange(int64(1), int64(2))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `t.Run("enqueue peek and dequeue", func(t *testing.T) { buf := newLogEventBuffer(logger.TestLogger(t), 4, 10, 10) require.Equal(t, buf.enqueue(big.NewInt(10), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 10}, logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x1"), LogIndex: 11}, ), 2) require.Equal(t, buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x1"), LogIndex: 1}, ), 2) results := buf.peek(8) require.Equal(t, 4, len(results)) verifyBlockNumbers(t, results, 1, 2, 3, 3) removed := buf.dequeueRange(1, 3, 5, 5) require.Equal(t, 4, len(removed)) buf.lock.Lock() require.Equal(t, 0, len(buf.blocks[0].logs)) require.Equal(t, int64(2), buf.blocks[1].blockNumber) require.Equal(t, 1, len(buf.blocks[1].visited)) buf.lock.Unlock() })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `verifyBlockNumbers(t, results, 1, 2, 3, 3)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `buf.lock.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `buf.lock.Unlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `t.Run("enqueue and peek range circular", func(t *testing.T) { buf := newLogEventBuffer(logger.TestLogger(t), 3, 10, 10) require.Equal(t, buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 0}, logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x3"), LogIndex: 0}, ), 3) require.Equal(t, buf.enqueue(big.NewInt(10), logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x1"), LogIndex: 10}, logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x1"), LogIndex: 11}, ), 2) results := buf.peekRange(int64(1), int64(1)) require.Equal(t, 0, len(results)) results = buf.peekRange(int64(3), int64(5)) require.Equal(t, 3, len(results)) verifyBlockNumbers(t, results, 3, 4, 4) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `results = buf.peekRange(int64(3), int64(5))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `verifyBlockNumbers(t, results, 3, 4, 4)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `t.Run("doesnt enqueue old blocks", func(t *testing.T) { buf := newLogEventBuffer(logger.TestLogger(t), 3, 5, 10) require.Equal(t, buf.enqueue(big.NewInt(10), logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x1"), LogIndex: 10}, logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x1"), LogIndex: 11}, ), 2) require.Equal(t, buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 0}, logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x3"), LogIndex: 0}, ), 2) results := buf.peekRange(int64(1), int64(5)) fmt.Println(results) verifyBlockNumbers(t, results, 2, 3, 4, 4) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `fmt.Println(results)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `verifyBlockNumbers(t, results, 2, 3, 4, 4)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `t.Run("dequeue with limits returns latest block logs", func(t *testing.T) { buf := newLogEventBuffer(logger.TestLogger(t), 3, 5, 10) require.Equal(t, buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 0}, logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x3"), LogIndex: 0}, logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x4"), LogIndex: 0}, logpoller.Log{BlockNumber: 5, TxHash: common.HexToHash("0x5"), LogIndex: 0}, ), 5) logs := buf.dequeueRange(1, 5, 2, 10) require.Equal(t, 2, len(logs)) require.Equal(t, int64(5), logs[0].log.BlockNumber) require.Equal(t, int64(4), logs[1].log.BlockNumber) require.Equal(t, buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x4"), LogIndex: 1}, logpoller.Log{BlockNumber: 5, TxHash: common.HexToHash("0x5"), LogIndex: 1}, ), 2) logs = buf.dequeueRange(1, 5, 3, 2) require.Equal(t, 2, len(logs)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `logs = buf.dequeueRange(1, 5, 3, 2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `fmt.Println(logs)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `logs = buf.dequeueRange(3, 3, 2, 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `fmt.Println(logs)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `t.Run(tc.name, func(t *testing.T) { lggr := logger.TestLogger(t) b := fetchedBlock{ blockNumber: tc.blockNumber, logs: make([]fetchedLog, len(tc.logs)), visited: make([]fetchedLog, len(tc.visited)), } copy(b.logs, tc.logs) copy(b.visited, tc.visited) for _, args := range tc.toAdd { dropped, added := b.Append(lggr, args.fl, args.maxBlockLogs, args.maxUpkeepLogs) require.Equal(t, args.added, added) if args.dropped { require.NotNil(t, dropped.upkeepID) } else { require.Nil(t, dropped.upkeepID) } } // clear cached logIDs for i := range b.logs { b.logs[i].cachedLogID = "" } require.Equal(t, tc.expected, b.logs) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `copy(b.logs, tc.logs)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `copy(b.visited, tc.visited)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `b.logs[i].cachedLogID = ""` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `t.Run(tc.name, func(t *testing.T) { b := fetchedBlock{ blockNumber: tc.blockNumber, logs: make([]fetchedLog, len(tc.logs)), } if tc.iterations == 0 { tc.iterations = 1 } // performing the same multiple times should yield the same result // default is one iteration for i := 0; i < tc.iterations; i++ { copy(b.logs, tc.logs) logIDs := getLogIds(b) require.Equal(t, len(tc.beforeSort), len(logIDs)) require.Equal(t, tc.beforeSort, logIDs) b.Sort() logIDsAfterSort := getLogIds(b) require.Equal(t, len(tc.afterSort), len(logIDsAfterSort)) require.Equal(t, tc.afterSort, logIDsAfterSort) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `tc.iterations = 1` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `copy(b.logs, tc.logs)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `b.Sort()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `b1.blockNumber = 2` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `b1.logs[0].log.BlockNumber = 2` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 0}, logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x3"), LogIndex: 0}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x3")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.enqueue(big.NewInt(2), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 2}, logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x3"), LogIndex: 2}, logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x1"), LogIndex: 1}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x3")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.Run(tc.name, func(t *testing.T) { blocks := buf.getBlocksInRange(int(tc.from), int(tc.to)) require.Equal(t, tc.want, len(blocks)) if tc.want > 0 { from := tc.from require.Equal(t, from, blocks[0].blockNumber) to := tc.to if to >= maxSeenBlock { to = maxSeenBlock } require.Equal(t, to, blocks[len(blocks)-1].blockNumber) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.getBlocksInRange(int(tc.from), int(tc.to))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.Run(tc.name, func(t *testing.T) { blocks := buf.getBlocksInRange(int(tc.from), int(tc.to)) require.Equal(t, len(tc.expectedBlocks), len(blocks)) expectedBlockNumbers := map[int64]bool{} for _, b := range tc.expectedBlocks { expectedBlockNumbers[b] = false } for _, b := range blocks { expectedBlockNumbers[b.blockNumber] = true } for k, v := range expectedBlockNumbers { require.True(t, v, "missing block %d", k) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.getBlocksInRange(int(tc.from), int(tc.to))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.Run("dequeue empty", func(t *testing.T) { buf := newLogEventBuffer(logger.TestLogger(t), 3, 10, 10) results := buf.peekRange(int64(1), int64(2)) require.Equal(t, 0, len(results)) results = buf.peek(2) require.Equal(t, 0, len(results)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.peekRange(int64(1), int64(2))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.peek(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.Run("enqueue", func(t *testing.T) { buf := newLogEventBuffer(logger.TestLogger(t), 3, 10, 10) buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 1}, ) buf.lock.Lock() require.Equal(t, 2, len(buf.blocks[0].logs)) buf.lock.Unlock() })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 1}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.lock.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.lock.Unlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.Run("enqueue logs overflow", func(t *testing.T) { buf := newLogEventBuffer(logger.TestLogger(t), 2, 2, 2) require.Equal(t, 2, buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 1}, logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 2}, )) buf.lock.Lock() require.Equal(t, 2, len(buf.blocks[0].logs)) buf.lock.Unlock() })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.lock.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.lock.Unlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.Run("enqueue logs overflow with dynamic limits", func(t *testing.T) { buf := newLogEventBuffer(logger.TestLogger(t), 2, 10, 2) require.Equal(t, 2, buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 1}, logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 2}, )) buf.SetLimits(10, 3) require.Equal(t, 3, buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x21"), LogIndex: 0}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x21"), LogIndex: 1}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x21"), LogIndex: 2}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x21"), LogIndex: 3}, )) buf.lock.Lock() defer buf.lock.Unlock() require.Equal(t, 2, len(buf.blocks[0].logs)) require.Equal(t, 3, len(buf.blocks[1].logs)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.SetLimits(10, 3)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.lock.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.lock.Unlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.Run("enqueue logs overflow with dynamic limits", func(t *testing.T) { buf := newLogEventBuffer(logger.TestLogger(t), 2, 10, 2) require.Equal(t, 2, buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 1}, logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 2}, logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 3}, )) buf.SetLimits(10, 3) require.Equal(t, 3, buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x21"), LogIndex: 0}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x21"), LogIndex: 1}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x21"), LogIndex: 2}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x21"), LogIndex: 3}, )) buf.lock.Lock() defer buf.lock.Unlock() require.Equal(t, 2, len(buf.blocks[0].logs)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.SetLimits(10, 3)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.lock.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.lock.Unlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.Run("enqueue block overflow", func(t *testing.T) { buf := newLogEventBuffer(logger.TestLogger(t), 3, 2, 10) require.Equal(t, 5, buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 0}, logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x3"), LogIndex: 0}, logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x4"), LogIndex: 0}, logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x4"), LogIndex: 1}, )) buf.lock.Lock() require.Equal(t, 2, len(buf.blocks[0].logs)) buf.lock.Unlock() })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.lock.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.lock.Unlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.Run("enqueue upkeep block overflow", func(t *testing.T) { buf := newLogEventBuffer(logger.TestLogger(t), 10, 10, 2) require.Equal(t, 2, buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 1}, logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 2}, logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 3}, )) buf.lock.Lock() require.Equal(t, 2, len(buf.blocks[0].logs)) buf.lock.Unlock() })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.lock.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.lock.Unlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.Run("peek range after dequeue", func(t *testing.T) { buf := newLogEventBuffer(logger.TestLogger(t), 3, 10, 10) require.Equal(t, buf.enqueue(big.NewInt(10), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 10}, logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x1"), LogIndex: 11}, ), 2) require.Equal(t, buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x1"), LogIndex: 1}, ), 2) results := buf.peekRange(int64(1), int64(2)) require.Equal(t, 2, len(results)) verifyBlockNumbers(t, results, 1, 2) removed := buf.dequeueRange(int64(1), int64(2), 2, 10) require.Equal(t, 2, len(removed)) results = buf.peekRange(int64(1), int64(2)) require.Equal(t, 0, len(results)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.peekRange(int64(1), int64(2))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.dequeueRange(int64(1), int64(2), 2, 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.peekRange(int64(1), int64(2))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.Run("enqueue peek and dequeue", func(t *testing.T) { buf := newLogEventBuffer(logger.TestLogger(t), 4, 10, 10) require.Equal(t, buf.enqueue(big.NewInt(10), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 10}, logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x1"), LogIndex: 11}, ), 2) require.Equal(t, buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x1"), LogIndex: 1}, ), 2) results := buf.peek(8) require.Equal(t, 4, len(results)) verifyBlockNumbers(t, results, 1, 2, 3, 3) removed := buf.dequeueRange(1, 3, 5, 5) require.Equal(t, 4, len(removed)) buf.lock.Lock() require.Equal(t, 0, len(buf.blocks[0].logs)) require.Equal(t, int64(2), buf.blocks[1].blockNumber) require.Equal(t, 1, len(buf.blocks[1].visited)) buf.lock.Unlock() })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.peek(8)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.dequeueRange(1, 3, 5, 5)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.lock.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.lock.Unlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.Run("enqueue and peek range circular", func(t *testing.T) { buf := newLogEventBuffer(logger.TestLogger(t), 3, 10, 10) require.Equal(t, buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 0}, logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x3"), LogIndex: 0}, ), 3) require.Equal(t, buf.enqueue(big.NewInt(10), logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x1"), LogIndex: 10}, logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x1"), LogIndex: 11}, ), 2) results := buf.peekRange(int64(1), int64(1)) require.Equal(t, 0, len(results)) results = buf.peekRange(int64(3), int64(5)) require.Equal(t, 3, len(results)) verifyBlockNumbers(t, results, 3, 4, 4) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.peekRange(int64(1), int64(1))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.peekRange(int64(3), int64(5))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.Run("doesnt enqueue old blocks", func(t *testing.T) { buf := newLogEventBuffer(logger.TestLogger(t), 3, 5, 10) require.Equal(t, buf.enqueue(big.NewInt(10), logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x1"), LogIndex: 10}, logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x1"), LogIndex: 11}, ), 2) require.Equal(t, buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 0}, logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x3"), LogIndex: 0}, ), 2) results := buf.peekRange(int64(1), int64(5)) fmt.Println(results) verifyBlockNumbers(t, results, 2, 3, 4, 4) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.peekRange(int64(1), int64(5))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.Println(results)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.Run("dequeue with limits returns latest block logs", func(t *testing.T) { buf := newLogEventBuffer(logger.TestLogger(t), 3, 5, 10) require.Equal(t, buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 0}, logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x3"), LogIndex: 0}, logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x4"), LogIndex: 0}, logpoller.Log{BlockNumber: 5, TxHash: common.HexToHash("0x5"), LogIndex: 0}, ), 5) logs := buf.dequeueRange(1, 5, 2, 10) require.Equal(t, 2, len(logs)) require.Equal(t, int64(5), logs[0].log.BlockNumber) require.Equal(t, int64(4), logs[1].log.BlockNumber) require.Equal(t, buf.enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x4"), LogIndex: 1}, logpoller.Log{BlockNumber: 5, TxHash: common.HexToHash("0x5"), LogIndex: 1}, ), 2) logs = buf.dequeueRange(1, 5, 3, 2) require.Equal(t, 2, len(logs)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.dequeueRange(1, 5, 2, 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.dequeueRange(1, 5, 3, 2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.dequeueRange(3, 3, 2, 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.Println(logs)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.dequeueRange(3, 3, 2, 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.Println(logs)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.GenUpkeepID(types.LogTrigger, "111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.GenUpkeepID(types.LogTrigger, "111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.GenUpkeepID(types.LogTrigger, "111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.GenUpkeepID(types.LogTrigger, "111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.GenUpkeepID(types.LogTrigger, "111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.GenUpkeepID(types.LogTrigger, "111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.GenUpkeepID(types.LogTrigger, "111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.GenUpkeepID(types.LogTrigger, "111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.GenUpkeepID(types.LogTrigger, "111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.GenUpkeepID(types.LogTrigger, "111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.GenUpkeepID(types.LogTrigger, "111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.GenUpkeepID(types.LogTrigger, "111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.GenUpkeepID(types.LogTrigger, "111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.GenUpkeepID(types.LogTrigger, "111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.GenUpkeepID(types.LogTrigger, "111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.GenUpkeepID(types.LogTrigger, "111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.GenUpkeepID(types.LogTrigger, "111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.Run(tc.name, func(t *testing.T) { lggr := logger.TestLogger(t) b := fetchedBlock{ blockNumber: tc.blockNumber, logs: make([]fetchedLog, len(tc.logs)), visited: make([]fetchedLog, len(tc.visited)), } copy(b.logs, tc.logs) copy(b.visited, tc.visited) for _, args := range tc.toAdd { dropped, added := b.Append(lggr, args.fl, args.maxBlockLogs, args.maxUpkeepLogs) require.Equal(t, args.added, added) if args.dropped { require.NotNil(t, dropped.upkeepID) } else { require.Nil(t, dropped.upkeepID) } } // clear cached logIDs for i := range b.logs { b.logs[i].cachedLogID = "" } require.Equal(t, tc.expected, b.logs) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.Append(lggr, args.fl, args.maxBlockLogs, args.maxUpkeepLogs)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0xa25ebae1099f3fbae2525ebae279f3ae25e")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0xb711bd1103927611ee41152aa8ae27f3330")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.GenUpkeepID(types.LogTrigger, "111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0xa25ebae1099f3fbae2525ebae279f3ae25e")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0xa651bd1109922111ee411525ebae27f3fb6")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.GenUpkeepID(types.LogTrigger, "222")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0xa25ebae1099f3fbae2525ebae279f3ae25e")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0xa651bd1109922111ee411525ebae27f3fb6")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.GenUpkeepID(types.LogTrigger, "111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0xa25ebae1099f3fbae2525ebae279f3ae25e")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0xa651bd1109922111ee411525ebae27f3fb6")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.GenUpkeepID(types.LogTrigger, "222")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0xa25ebae1099f3fbae2525ebae279f3ae25e")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0xa651bd1109922111ee411525ebae27f3fb6")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.GenUpkeepID(types.LogTrigger, "111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0xa25ebae1099f3fbae2525ebae279f3ae25e")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0xa651bd1109922111ee411525ebae27f3fb6")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.GenUpkeepID(types.LogTrigger, "111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0xa25ebae1099f3fbae2525ebae279f3ae25e")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0xa651bd1109922111ee411525ebae27f3fb6")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.GenUpkeepID(types.LogTrigger, "111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0xa25ebae1099f3fbae2525ebae279f3ae25e")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0xa651bd1109922111ee411525ebae27f3fb6")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.GenUpkeepID(types.LogTrigger, "111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.Run(tc.name, func(t *testing.T) { b := fetchedBlock{ blockNumber: tc.blockNumber, logs: make([]fetchedLog, len(tc.logs)), } if tc.iterations == 0 { tc.iterations = 1 } // performing the same multiple times should yield the same result // default is one iteration for i := 0; i < tc.iterations; i++ { copy(b.logs, tc.logs) logIDs := getLogIds(b) require.Equal(t, len(tc.beforeSort), len(logIDs)) require.Equal(t, tc.beforeSort, logIDs) b.Sort() logIDsAfterSort := getLogIds(b) require.Equal(t, len(tc.afterSort), len(logIDsAfterSort)) require.Equal(t, tc.afterSort, logIDsAfterSort) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.Sort()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.GenUpkeepID(types.LogTrigger, "111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.GenUpkeepID(types.LogTrigger, "111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go: `.Clone()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `buf.Enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 1}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `buf.Enqueue(big.NewInt(2), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 0}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 2}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `results, remaining = buf.Dequeue(int64(1), 10, 1, 2, DefaultUpkeepSelector)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `buf.Enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 1}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `buf.Enqueue(big.NewInt(2), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 0}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 2}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `filterStore.AddActiveUpkeeps(upkeepFilter{upkeepID: big.NewInt(1)})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `t.Run("enqueuing logs for a block older than latest seen logs a message", func(t *testing.T) { logReceived := false readableLogger := &readableLogger{ DebugwFn: func(msg string, keysAndValues ...interface{}) { if msg == "enqueuing logs from a block older than latest seen block" { logReceived = true assert.Equal(t, "logBlock", keysAndValues[0]) assert.Equal(t, int64(1), keysAndValues[1]) assert.Equal(t, "lastBlockSeen", keysAndValues[2]) assert.Equal(t, int64(2), keysAndValues[3]) } }, } logBufferV1 := NewLogBuffer(readableLogger, 10, 20, 1) buf := logBufferV1.(*logBuffer) buf.Enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 1}, ) buf.Enqueue(big.NewInt(2), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x2"), LogIndex: 0}, ) assert.Equal(t, 1, buf.enqueuedBlocks[2]["1"]) assert.Equal(t, 1, buf.enqueuedBlocks[1]["2"]) assert.True(t, true, logReceived) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `logReceived = true` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `buf.Enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 1}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `buf.Enqueue(big.NewInt(2), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x2"), LogIndex: 0}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `logReceived = true` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `buf.Enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 1}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `buf.Enqueue(big.NewInt(2), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 0}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `buf.Enqueue(big.NewInt(3), logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x3a"), LogIndex: 0}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `buf.Enqueue(big.NewInt(3), logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x3b"), LogIndex: 0}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `t.Run(tc.name, func(t *testing.T) { buf := NewLogBuffer(logger.TestLogger(t), uint32(tc.lookback), uint32(tc.args.blockRate), uint32(tc.args.upkeepLimit)) for id, logs := range tc.logsInBuffer { added, dropped := buf.Enqueue(id, logs...) require.Equal(t, len(logs), added+dropped) } results, remaining := buf.Dequeue(tc.args.block, tc.args.blockRate, tc.args.upkeepLimit, tc.args.maxResults, tc.args.upkeepSelector) require.Equal(t, len(tc.results), len(results)) require.Equal(t, tc.remaining, remaining) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `t.Run(tc.name, func(t *testing.T) { buf := NewLogBuffer(logger.TestLogger(t), tc.lookback, tc.blockRate, tc.upkeepLimit) for id, logs := range tc.logsToAdd { added, dropped := buf.Enqueue(id, logs...) sid := id.String() if _, ok := tc.added[sid]; !ok { tc.added[sid] = 0 } if _, ok := tc.dropped[sid]; !ok { tc.dropped[sid] = 0 } require.Equal(t, tc.added[sid], added) require.Equal(t, tc.dropped[sid], dropped) } for id, size := range tc.sizeOfRange { q, ok := buf.(*logBuffer).getUpkeepQueue(id) require.True(t, ok) require.Equal(t, size, q.sizeOfRange(tc.rangeStart, tc.rangeEnd)) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `tc.added[sid] = 0` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `tc.dropped[sid] = 0` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `t.Run("enqueue dequeue", func(t *testing.T) { q := newUpkeepLogQueue(logger.TestLogger(t), big.NewInt(1), newLogBufferOptions(10, 1, 1)) added, dropped := q.enqueue(10, logpoller.Log{BlockNumber: 20, TxHash: common.HexToHash("0x1"), LogIndex: 0}) require.Equal(t, 0, dropped) require.Equal(t, 1, added) require.Equal(t, 1, q.sizeOfRange(1, 20)) logs, remaining := q.dequeue(19, 21, 10) require.Equal(t, 1, len(logs)) require.Equal(t, 0, remaining) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `t.Run("enqueue with limits", func(t *testing.T) { q := newUpkeepLogQueue(logger.TestLogger(t), big.NewInt(1), newLogBufferOptions(10, 1, 1)) added, dropped := q.enqueue(10, createDummyLogSequence(15, 0, 20, common.HexToHash("0x20"))..., ) require.Equal(t, 5, dropped) require.Equal(t, 15, added) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `t.Run("empty", func(t *testing.T) { q := newUpkeepLogQueue(logger.TestLogger(t), big.NewInt(1), newLogBufferOptions(10, 1, 1)) require.Equal(t, 0, q.sizeOfRange(1, 10)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `t.Run("empty", func(t *testing.T) { q := newUpkeepLogQueue(logger.TestLogger(t), big.NewInt(1), newLogBufferOptions(10, 1, 1)) q.clean(10) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `q.clean(10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `buf.Enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 1}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `buf.Enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 11, TxHash: common.HexToHash("0x111"), LogIndex: 0}, logpoller.Log{BlockNumber: 11, TxHash: common.HexToHash("0x111"), LogIndex: 1}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `buf.Enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 17, TxHash: common.HexToHash("0x171"), LogIndex: 0}, logpoller.Log{BlockNumber: 17, TxHash: common.HexToHash("0x171"), LogIndex: 1}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `q.lock.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `t.Run(tc.name, func(t *testing.T) { start, end := getBlockWindow(tc.block, tc.blockRate) require.Equal(t, tc.wantStart, start) require.Equal(t, tc.wantEnd, end) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `logBuffer.trackBlockNumbersForUpkeep(tc.uid, tc.uniqueBlocks)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.Enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 1}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.Enqueue(big.NewInt(2), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 0}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 2}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.Dequeue(int64(1), 10, 1, 2, DefaultUpkeepSelector)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.Dequeue(int64(1), 10, 1, 2, DefaultUpkeepSelector)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.Enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 1}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.Enqueue(big.NewInt(2), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 0}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 2}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.AddActiveUpkeeps(upkeepFilter{upkeepID: big.NewInt(1)})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NumOfUpkeeps()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.Run("enqueuing logs for a block older than latest seen logs a message", func(t *testing.T) { logReceived := false readableLogger := &readableLogger{ DebugwFn: func(msg string, keysAndValues ...interface{}) { if msg == "enqueuing logs from a block older than latest seen block" { logReceived = true assert.Equal(t, "logBlock", keysAndValues[0]) assert.Equal(t, int64(1), keysAndValues[1]) assert.Equal(t, "lastBlockSeen", keysAndValues[2]) assert.Equal(t, int64(2), keysAndValues[3]) } }, } logBufferV1 := NewLogBuffer(readableLogger, 10, 20, 1) buf := logBufferV1.(*logBuffer) buf.Enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 1}, ) buf.Enqueue(big.NewInt(2), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x2"), LogIndex: 0}, ) assert.Equal(t, 1, buf.enqueuedBlocks[2]["1"]) assert.Equal(t, 1, buf.enqueuedBlocks[1]["2"]) assert.True(t, true, logReceived) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.Enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 1}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.Enqueue(big.NewInt(2), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x2"), LogIndex: 0}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.Enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 1}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.Enqueue(big.NewInt(2), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 0}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.Enqueue(big.NewInt(3), logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x3a"), LogIndex: 0}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(3)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x3a")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.Enqueue(big.NewInt(3), logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x3b"), LogIndex: 0}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(3)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x3b")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x12")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x15")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x12")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x12")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x13")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x13")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x14")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x14")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x12")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x12")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x13")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x13")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x14")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x14")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x12")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x13")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x12")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x13")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x12")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x15")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.Run(tc.name, func(t *testing.T) { buf := NewLogBuffer(logger.TestLogger(t), uint32(tc.lookback), uint32(tc.args.blockRate), uint32(tc.args.upkeepLimit)) for id, logs := range tc.logsInBuffer { added, dropped := buf.Enqueue(id, logs...) require.Equal(t, len(logs), added+dropped) } results, remaining := buf.Dequeue(tc.args.block, tc.args.blockRate, tc.args.upkeepLimit, tc.args.maxResults, tc.args.upkeepSelector) require.Equal(t, len(tc.results), len(results)) require.Equal(t, tc.remaining, remaining) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.Enqueue(id, logs...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.Dequeue(tc.args.block, tc.args.blockRate, tc.args.upkeepLimit, tc.args.maxResults, tc.args.upkeepSelector)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x12")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x15")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x12")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x12")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x12")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.Run(tc.name, func(t *testing.T) { buf := NewLogBuffer(logger.TestLogger(t), tc.lookback, tc.blockRate, tc.upkeepLimit) for id, logs := range tc.logsToAdd { added, dropped := buf.Enqueue(id, logs...) sid := id.String() if _, ok := tc.added[sid]; !ok { tc.added[sid] = 0 } if _, ok := tc.dropped[sid]; !ok { tc.dropped[sid] = 0 } require.Equal(t, tc.added[sid], added) require.Equal(t, tc.dropped[sid], dropped) } for id, size := range tc.sizeOfRange { q, ok := buf.(*logBuffer).getUpkeepQueue(id) require.True(t, ok) require.Equal(t, size, q.sizeOfRange(tc.rangeStart, tc.rangeEnd)) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.Enqueue(id, logs...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.getUpkeepQueue(id)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.Run("enqueue dequeue", func(t *testing.T) { q := newUpkeepLogQueue(logger.TestLogger(t), big.NewInt(1), newLogBufferOptions(10, 1, 1)) added, dropped := q.enqueue(10, logpoller.Log{BlockNumber: 20, TxHash: common.HexToHash("0x1"), LogIndex: 0}) require.Equal(t, 0, dropped) require.Equal(t, 1, added) require.Equal(t, 1, q.sizeOfRange(1, 20)) logs, remaining := q.dequeue(19, 21, 10) require.Equal(t, 1, len(logs)) require.Equal(t, 0, remaining) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.enqueue(10, logpoller.Log{BlockNumber: 20, TxHash: common.HexToHash("0x1"), LogIndex: 0})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.dequeue(19, 21, 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.Run("enqueue with limits", func(t *testing.T) { q := newUpkeepLogQueue(logger.TestLogger(t), big.NewInt(1), newLogBufferOptions(10, 1, 1)) added, dropped := q.enqueue(10, createDummyLogSequence(15, 0, 20, common.HexToHash("0x20"))..., ) require.Equal(t, 5, dropped) require.Equal(t, 15, added) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.enqueue(10, createDummyLogSequence(15, 0, 20, common.HexToHash("0x20"))..., )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x20")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.enqueue(10, logpoller.Log{BlockNumber: 20, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 20, TxHash: common.HexToHash("0x1"), LogIndex: 1}, logpoller.Log{BlockNumber: 20, TxHash: common.HexToHash("0x1"), LogIndex: 10}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.dequeue(19, 21, 2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.Run("empty", func(t *testing.T) { q := newUpkeepLogQueue(logger.TestLogger(t), big.NewInt(1), newLogBufferOptions(10, 1, 1)) require.Equal(t, 0, q.sizeOfRange(1, 10)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.enqueue(10, logpoller.Log{BlockNumber: 20, TxHash: common.HexToHash("0x1"), LogIndex: 0})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.Run("empty", func(t *testing.T) { q := newUpkeepLogQueue(logger.TestLogger(t), big.NewInt(1), newLogBufferOptions(10, 1, 1)) q.clean(10) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.clean(10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.Enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 0}, logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 1}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.Enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 11, TxHash: common.HexToHash("0x111"), LogIndex: 0}, logpoller.Log{BlockNumber: 11, TxHash: common.HexToHash("0x111"), LogIndex: 1}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.getUpkeepQueue(big.NewInt(1))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.Enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 17, TxHash: common.HexToHash("0x171"), LogIndex: 0}, logpoller.Log{BlockNumber: 17, TxHash: common.HexToHash("0x171"), LogIndex: 1}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x171")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.HexToHash("0x171")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.lock.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.lock.Unlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.Run(tc.name, func(t *testing.T) { start, end := getBlockWindow(tc.block, tc.blockRate) require.Equal(t, tc.wantStart, start) require.Equal(t, tc.wantEnd, end) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go: `.trackBlockNumbersForUpkeep(tc.uid, tc.uniqueBlocks)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `t.Run(tc.name, func(t *testing.T) { s := NewUpkeepFilterStore() s.AddActiveUpkeeps(tc.initial...) require.Equal(t, len(tc.initial), len(s.GetIDs(nil))) s.AddActiveUpkeeps(tc.toAdd...) require.Equal(t, len(tc.expectedPostAdd), s.Size()) filters := s.GetFilters(func(f upkeepFilter) bool { return true }) require.Equal(t, len(tc.expectedPostAdd), len(filters)) if len(filters) > 0 { sort.Slice(filters, func(i, j int) bool { return filters[i].upkeepID.Cmp(filters[j].upkeepID) < 0 }) for i, f := range filters { require.Equal(t, tc.expectedPostAdd[i].upkeepID, f.upkeepID) } } s.RemoveActiveUpkeeps(tc.toRemove...) require.Equal(t, len(tc.expectedPostRemove), len(s.GetIDs(func(upkeepFilter) bool { return true }))) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `s.AddActiveUpkeeps(tc.initial...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `s.AddActiveUpkeeps(tc.toAdd...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `sort.Slice(filters, func(i, j int) bool { return filters[i].upkeepID.Cmp(filters[j].upkeepID) < 0 })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `s.RemoveActiveUpkeeps(tc.toRemove...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `wg.Add(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `s.AddActiveUpkeeps(upkeepFilter{upkeepID: big.NewInt(1)})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `s.AddActiveUpkeeps(upkeepFilter{upkeepID: big.NewInt(2)})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `wg.Add(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `s.AddActiveUpkeeps(upkeepFilter{upkeepID: big.NewInt(2)})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `_ = s.GetIDs(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `wg.Wait()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.Run(tc.name, func(t *testing.T) { s := NewUpkeepFilterStore() s.AddActiveUpkeeps(tc.initial...) require.Equal(t, len(tc.initial), len(s.GetIDs(nil))) s.AddActiveUpkeeps(tc.toAdd...) require.Equal(t, len(tc.expectedPostAdd), s.Size()) filters := s.GetFilters(func(f upkeepFilter) bool { return true }) require.Equal(t, len(tc.expectedPostAdd), len(filters)) if len(filters) > 0 { sort.Slice(filters, func(i, j int) bool { return filters[i].upkeepID.Cmp(filters[j].upkeepID) < 0 }) for i, f := range filters { require.Equal(t, tc.expectedPostAdd[i].upkeepID, f.upkeepID) } } s.RemoveActiveUpkeeps(tc.toRemove...) require.Equal(t, len(tc.expectedPostRemove), len(s.GetIDs(func(upkeepFilter) bool { return true }))) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.AddActiveUpkeeps(tc.initial...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.AddActiveUpkeeps(tc.toAdd...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.GetFilters(func(f upkeepFilter) bool { return true })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.Slice(filters, func(i, j int) bool { return filters[i].upkeepID.Cmp(filters[j].upkeepID) < 0 })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.upkeepID.Cmp(filters[j].upkeepID)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.RemoveActiveUpkeeps(tc.toRemove...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.Add(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.Done()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.AddActiveUpkeeps(upkeepFilter{upkeepID: big.NewInt(1)})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.AddActiveUpkeeps(upkeepFilter{upkeepID: big.NewInt(2)})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.Add(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.Done()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.AddActiveUpkeeps(upkeepFilter{upkeepID: big.NewInt(2)})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.GetIDs(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.Wait()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_store_test.go: `.Size()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `t.Run(tc.name, func(t *testing.T) { filteredLogs := tc.filter.Select(tc.logs...) assert.Equal(t, tc.expectedLogs, filteredLogs) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.BytesToHash(zeroBytes[:])` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.HexToAddress("0xB9F3af0c2CbfE108efd0E23F7b0a151Ea42f764E")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.NewInt(123456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.MustDecode(topic10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.MustDecode(topic20)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.MustDecode(topic30)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.MustDecode(topic11)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.MustDecode(topic21)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.MustDecode(topic31)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.MustDecode(topic11)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.MustDecode(topic20)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.MustDecode(topic31)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.MustDecode(topic10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.MustDecode(topic21)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.MustDecode(topic31)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.MustDecode(topic10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.MustDecode(topic20)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.MustDecode(topic30)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.BytesToHash(contractAddress.Bytes())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.BytesToHash(contractAddress.Bytes())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.HexToHash(topic10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.BytesToHash(contractAddress.Bytes())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.HexToHash(topic21)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.BytesToHash(contractAddress.Bytes())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.HexToHash(topic10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.HexToHash(topic21)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.BytesToHash(contractAddress.Bytes())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.HexToHash(topic31)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.BytesToHash(contractAddress.Bytes())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.HexToHash(topic11)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.HexToHash(topic31)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.BytesToHash(contractAddress.Bytes())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.HexToHash(topic10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.HexToHash(topic20)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.HexToHash(topic30)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.Run(tc.name, func(t *testing.T) { filteredLogs := tc.filter.Select(tc.logs...) assert.Equal(t, tc.expectedLogs, filteredLogs) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go: `.filter.Select(tc.logs...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `t.Run(tc.name, func(t *testing.T) { ctx, cancel := context.WithCancel(testutils.Context(t)) defer cancel() backend, stopMining, accounts := setupBackend(t) defer stopMining() carrol := accounts[2] db := setupDB(t) defer db.Close() opts := logprovider.NewOptions(200, big.NewInt(1)) opts.ReadInterval = time.Second / 2 opts.BufferVersion = bufferVersion opts.LogLimit = logLimit lp, ethClient := setupDependencies(t, db, backend) filterStore := logprovider.NewUpkeepFilterStore() provider, _ := setup(logger.TestLogger(t), lp, nil, nil, filterStore, &opts) logProvider := provider.(logprovider.LogEventProviderTest) n := 10 backend.Commit() lp.PollAndSaveLogs(ctx, 1) // Ensure log poller has a latest block ids, addrs, contracts := deployUpkeepCounter(ctx, t, n, ethClient, backend, carrol, logProvider) lp.PollAndSaveLogs(ctx, int64(n)) go func() { if err := logProvider.Start(ctx); err != nil { t.Logf("error starting log provider: %s", err) t.Fail() } }() defer logProvider.Close() logsRounds := 10 poll := pollFn(ctx, t, lp, ethClient) triggerEvents(ctx, t, backend, carrol, logsRounds, poll, contracts...) poll(backend.Commit()) waitLogPoller(ctx, t, backend, lp, ethClient) waitLogProvider(ctx, t, logProvider, 3) allPayloads := collectPayloads(ctx, t, logProvider, n, logsRounds/2) require.GreaterOrEqual(t, len(allPayloads), n, "failed to get logs after restart") t.Run("Restart", func(t *testing.T) { t.Log("restarting log provider") // assuming that our service was closed and restarted, // we should be able to backfill old logs and fetch new ones filterStore := logprovider.NewUpkeepFilterStore() logProvider2 := logprovider.NewLogProvider(logger.TestLogger(t), lp, big.NewInt(1), logprovider.NewLogEventsPacker(), filterStore, opts) poll(backend.Commit()) go func() { if err2 := logProvider2.Start(ctx); err2 != nil { t.Logf("error starting log provider: %s", err2) t.Fail() } }() defer logProvider2.Close() // re-register filters for i, id := range ids { err := logProvider2.RegisterFilter(ctx, logprovider.FilterOptions{ UpkeepID: id, TriggerConfig: newPlainLogTriggerConfig(addrs[i]), // using block number at which the upkeep was registered, // before we emitted any logs UpdateBlock: uint64(n), }) require.NoError(t, err) } waitLogProvider(ctx, t, logProvider2, 2) t.Log("getting logs after restart") logsAfterRestart := collectPayloads(ctx, t, logProvider2, n, 5) require.GreaterOrEqual(t, len(logsAfterRestart), n, "failed to get logs after restart") }) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `opts.ReadInterval = time.Second / 2` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `opts.BufferVersion = bufferVersion` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `opts.LogLimit = logLimit` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `backend.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `lp.PollAndSaveLogs(ctx, 1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `lp.PollAndSaveLogs(ctx, int64(n))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `triggerEvents(ctx, t, backend, carrol, logsRounds, poll, contracts...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `poll(backend.Commit())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `waitLogPoller(ctx, t, backend, lp, ethClient)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `waitLogProvider(ctx, t, logProvider, 3)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `t.Run("Restart", func(t *testing.T) { t.Log("restarting log provider") // assuming that our service was closed and restarted, // we should be able to backfill old logs and fetch new ones filterStore := logprovider.NewUpkeepFilterStore() logProvider2 := logprovider.NewLogProvider(logger.TestLogger(t), lp, big.NewInt(1), logprovider.NewLogEventsPacker(), filterStore, opts) poll(backend.Commit()) go func() { if err2 := logProvider2.Start(ctx); err2 != nil { t.Logf("error starting log provider: %s", err2) t.Fail() } }() defer logProvider2.Close() // re-register filters for i, id := range ids { err := logProvider2.RegisterFilter(ctx, logprovider.FilterOptions{ UpkeepID: id, TriggerConfig: newPlainLogTriggerConfig(addrs[i]), // using block number at which the upkeep was registered, // before we emitted any logs UpdateBlock: uint64(n), }) require.NoError(t, err) } waitLogProvider(ctx, t, logProvider2, 2) t.Log("getting logs after restart") logsAfterRestart := collectPayloads(ctx, t, logProvider2, n, 5) require.GreaterOrEqual(t, len(logsAfterRestart), n, "failed to get logs after restart") })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `poll(backend.Commit())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `waitLogProvider(ctx, t, logProvider2, 2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `backend.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `lp.PollAndSaveLogs(ctx, 1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `lp.PollAndSaveLogs(ctx, int64(5))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `t.Run("update filter config", func(t *testing.T) { upkeepID := evmregistry21.GenUpkeepID(types.LogTrigger, "111") id := upkeepID.BigInt() cfg := newPlainLogTriggerConfig(addrs[0]) b, err := ethClient.BlockByHash(ctx, backend.Commit()) require.NoError(t, err) bn := b.Number() err = logProvider.RegisterFilter(ctx, logprovider.FilterOptions{ UpkeepID: id, TriggerConfig: cfg, UpdateBlock: bn.Uint64(), }) require.NoError(t, err) // old block err = logProvider.RegisterFilter(ctx, logprovider.FilterOptions{ UpkeepID: id, TriggerConfig: cfg, UpdateBlock: bn.Uint64() - 1, }) require.Error(t, err) // new block b, err = ethClient.BlockByHash(ctx, backend.Commit()) require.NoError(t, err) bn = b.Number() err = logProvider.RegisterFilter(ctx, logprovider.FilterOptions{ UpkeepID: id, TriggerConfig: cfg, UpdateBlock: bn.Uint64(), }) require.NoError(t, err) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `err = logProvider.RegisterFilter(ctx, logprovider.FilterOptions{ UpkeepID: id, TriggerConfig: cfg, UpdateBlock: bn.Uint64(), })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `err = logProvider.RegisterFilter(ctx, logprovider.FilterOptions{ UpkeepID: id, TriggerConfig: cfg, UpdateBlock: bn.Uint64() - 1, })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `b, err = ethClient.BlockByHash(ctx, backend.Commit())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `bn = b.Number()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `err = logProvider.RegisterFilter(ctx, logprovider.FilterOptions{ UpkeepID: id, TriggerConfig: cfg, UpdateBlock: bn.Uint64(), })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `err = logProvider.RegisterFilter(ctx, logprovider.FilterOptions{ UpkeepID: id, TriggerConfig: cfg, UpdateBlock: bn.Uint64(), })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `t.Run(tc.name, func(t *testing.T) { ctx, cancel := context.WithTimeout(testutils.Context(t), time.Second*60) defer cancel() backend, stopMining, accounts := setupBackend(t) defer stopMining() carrol := accounts[2] db := setupDB(t) defer db.Close() opts := logprovider.NewOptions(200, big.NewInt(1)) opts.ReadInterval = time.Second / 4 opts.BufferVersion = bufferVersion opts.LogLimit = limitLow lp, ethClient := setupDependencies(t, db, backend) filterStore := logprovider.NewUpkeepFilterStore() provider, _ := setup(logger.TestLogger(t), lp, nil, nil, filterStore, &opts) logProvider := provider.(logprovider.LogEventProviderTest) n := 10 backend.Commit() lp.PollAndSaveLogs(ctx, 1) // Ensure log poller has a latest block _, _, contracts := deployUpkeepCounter(ctx, t, n, ethClient, backend, carrol, logProvider) poll := pollFn(ctx, t, lp, ethClient) rounds := 8 for i := 0; i < rounds; i++ { poll(backend.Commit()) triggerEvents(ctx, t, backend, carrol, n, poll, contracts...) poll(backend.Commit()) } waitLogPoller(ctx, t, backend, lp, ethClient) // starting the log provider should backfill logs go func() { if startErr := logProvider.Start(ctx); startErr != nil { t.Logf("error starting log provider: %s", startErr) t.Fail() } }() defer logProvider.Close() waitLogProvider(ctx, t, logProvider, 3) allPayloads := collectPayloads(ctx, t, logProvider, n*rounds, 5) require.GreaterOrEqual(t, len(allPayloads), len(contracts), "failed to backfill logs") })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `opts.ReadInterval = time.Second / 4` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `opts.BufferVersion = bufferVersion` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `opts.LogLimit = limitLow` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `backend.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `lp.PollAndSaveLogs(ctx, 1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `poll(backend.Commit())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `triggerEvents(ctx, t, backend, carrol, n, poll, contracts...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `poll(backend.Commit())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `waitLogPoller(ctx, t, backend, lp, ethClient)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `waitLogProvider(ctx, t, logProvider, 3)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `logprovider.RecoveryInterval = time.Millisecond * 200` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `logprovider.RecoveryInterval = origDefaultRecoveryInterval` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `backend.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `lp.PollAndSaveLogs(ctx, 1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `triggerEvents(ctx, t, backend, carrol, n, poll, contracts...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `poll(backend.Commit())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `poll(backend.Commit())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `waitLogPoller(ctx, t, backend, lp, ethClient)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `blockNumber = bn.Int64()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `poll(backend.Commit())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `allProposals = append(allProposals, proposals...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Run(tc.name, func(t *testing.T) { ctx, cancel := context.WithCancel(testutils.Context(t)) defer cancel() backend, stopMining, accounts := setupBackend(t) defer stopMining() carrol := accounts[2] db := setupDB(t) defer db.Close() opts := logprovider.NewOptions(200, big.NewInt(1)) opts.ReadInterval = time.Second / 2 opts.BufferVersion = bufferVersion opts.LogLimit = logLimit lp, ethClient := setupDependencies(t, db, backend) filterStore := logprovider.NewUpkeepFilterStore() provider, _ := setup(logger.TestLogger(t), lp, nil, nil, filterStore, &opts) logProvider := provider.(logprovider.LogEventProviderTest) n := 10 backend.Commit() lp.PollAndSaveLogs(ctx, 1) // Ensure log poller has a latest block ids, addrs, contracts := deployUpkeepCounter(ctx, t, n, ethClient, backend, carrol, logProvider) lp.PollAndSaveLogs(ctx, int64(n)) go func() { if err := logProvider.Start(ctx); err != nil { t.Logf("error starting log provider: %s", err) t.Fail() } }() defer logProvider.Close() logsRounds := 10 poll := pollFn(ctx, t, lp, ethClient) triggerEvents(ctx, t, backend, carrol, logsRounds, poll, contracts...) poll(backend.Commit()) waitLogPoller(ctx, t, backend, lp, ethClient) waitLogProvider(ctx, t, logProvider, 3) allPayloads := collectPayloads(ctx, t, logProvider, n, logsRounds/2) require.GreaterOrEqual(t, len(allPayloads), n, "failed to get logs after restart") t.Run("Restart", func(t *testing.T) { t.Log("restarting log provider") // assuming that our service was closed and restarted, // we should be able to backfill old logs and fetch new ones filterStore := logprovider.NewUpkeepFilterStore() logProvider2 := logprovider.NewLogProvider(logger.TestLogger(t), lp, big.NewInt(1), logprovider.NewLogEventsPacker(), filterStore, opts) poll(backend.Commit()) go func() { if err2 := logProvider2.Start(ctx); err2 != nil { t.Logf("error starting log provider: %s", err2) t.Fail() } }() defer logProvider2.Close() // re-register filters for i, id := range ids { err := logProvider2.RegisterFilter(ctx, logprovider.FilterOptions{ UpkeepID: id, TriggerConfig: newPlainLogTriggerConfig(addrs[i]), // using block number at which the upkeep was registered, // before we emitted any logs UpdateBlock: uint64(n), }) require.NoError(t, err) } waitLogProvider(ctx, t, logProvider2, 2) t.Log("getting logs after restart") logsAfterRestart := collectPayloads(ctx, t, logProvider2, n, 5) require.GreaterOrEqual(t, len(logsAfterRestart), n, "failed to get logs after restart") }) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.NewOptions(200, big.NewInt(1))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.NewUpkeepFilterStore()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.PollAndSaveLogs(ctx, 1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.PollAndSaveLogs(ctx, int64(n))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Start(ctx)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Run("Restart", func(t *testing.T) { t.Log("restarting log provider") // assuming that our service was closed and restarted, // we should be able to backfill old logs and fetch new ones filterStore := logprovider.NewUpkeepFilterStore() logProvider2 := logprovider.NewLogProvider(logger.TestLogger(t), lp, big.NewInt(1), logprovider.NewLogEventsPacker(), filterStore, opts) poll(backend.Commit()) go func() { if err2 := logProvider2.Start(ctx); err2 != nil { t.Logf("error starting log provider: %s", err2) t.Fail() } }() defer logProvider2.Close() // re-register filters for i, id := range ids { err := logProvider2.RegisterFilter(ctx, logprovider.FilterOptions{ UpkeepID: id, TriggerConfig: newPlainLogTriggerConfig(addrs[i]), // using block number at which the upkeep was registered, // before we emitted any logs UpdateBlock: uint64(n), }) require.NoError(t, err) } waitLogProvider(ctx, t, logProvider2, 2) t.Log("getting logs after restart") logsAfterRestart := collectPayloads(ctx, t, logProvider2, n, 5) require.GreaterOrEqual(t, len(logsAfterRestart), n, "failed to get logs after restart") })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.NewUpkeepFilterStore()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.NewLogProvider(logger.TestLogger(t), lp, big.NewInt(1), logprovider.NewLogEventsPacker(), filterStore, opts)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.NewLogEventsPacker()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Start(ctx)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.RegisterFilter(ctx, logprovider.FilterOptions{ UpkeepID: id, TriggerConfig: newPlainLogTriggerConfig(addrs[i]), // using block number at which the upkeep was registered, // before we emitted any logs UpdateBlock: uint64(n), })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.NewUpkeepFilterStore()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.PollAndSaveLogs(ctx, 1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.PollAndSaveLogs(ctx, int64(5))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Run("update filter config", func(t *testing.T) { upkeepID := evmregistry21.GenUpkeepID(types.LogTrigger, "111") id := upkeepID.BigInt() cfg := newPlainLogTriggerConfig(addrs[0]) b, err := ethClient.BlockByHash(ctx, backend.Commit()) require.NoError(t, err) bn := b.Number() err = logProvider.RegisterFilter(ctx, logprovider.FilterOptions{ UpkeepID: id, TriggerConfig: cfg, UpdateBlock: bn.Uint64(), }) require.NoError(t, err) // old block err = logProvider.RegisterFilter(ctx, logprovider.FilterOptions{ UpkeepID: id, TriggerConfig: cfg, UpdateBlock: bn.Uint64() - 1, }) require.Error(t, err) // new block b, err = ethClient.BlockByHash(ctx, backend.Commit()) require.NoError(t, err) bn = b.Number() err = logProvider.RegisterFilter(ctx, logprovider.FilterOptions{ UpkeepID: id, TriggerConfig: cfg, UpdateBlock: bn.Uint64(), }) require.NoError(t, err) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.GenUpkeepID(types.LogTrigger, "111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.BlockByHash(ctx, backend.Commit())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Number()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.RegisterFilter(ctx, logprovider.FilterOptions{ UpkeepID: id, TriggerConfig: cfg, UpdateBlock: bn.Uint64(), })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Uint64()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.RegisterFilter(ctx, logprovider.FilterOptions{ UpkeepID: id, TriggerConfig: cfg, UpdateBlock: bn.Uint64() - 1, })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Uint64()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.BlockByHash(ctx, backend.Commit())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Number()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.RegisterFilter(ctx, logprovider.FilterOptions{ UpkeepID: id, TriggerConfig: cfg, UpdateBlock: bn.Uint64(), })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Uint64()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.GenUpkeepID(types.LogTrigger, "222")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.BlockByHash(ctx, backend.Commit())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Number()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.RegisterFilter(ctx, logprovider.FilterOptions{ UpkeepID: id, TriggerConfig: cfg, UpdateBlock: bn.Uint64(), })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Uint64()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Run(tc.name, func(t *testing.T) { ctx, cancel := context.WithTimeout(testutils.Context(t), time.Second*60) defer cancel() backend, stopMining, accounts := setupBackend(t) defer stopMining() carrol := accounts[2] db := setupDB(t) defer db.Close() opts := logprovider.NewOptions(200, big.NewInt(1)) opts.ReadInterval = time.Second / 4 opts.BufferVersion = bufferVersion opts.LogLimit = limitLow lp, ethClient := setupDependencies(t, db, backend) filterStore := logprovider.NewUpkeepFilterStore() provider, _ := setup(logger.TestLogger(t), lp, nil, nil, filterStore, &opts) logProvider := provider.(logprovider.LogEventProviderTest) n := 10 backend.Commit() lp.PollAndSaveLogs(ctx, 1) // Ensure log poller has a latest block _, _, contracts := deployUpkeepCounter(ctx, t, n, ethClient, backend, carrol, logProvider) poll := pollFn(ctx, t, lp, ethClient) rounds := 8 for i := 0; i < rounds; i++ { poll(backend.Commit()) triggerEvents(ctx, t, backend, carrol, n, poll, contracts...) poll(backend.Commit()) } waitLogPoller(ctx, t, backend, lp, ethClient) // starting the log provider should backfill logs go func() { if startErr := logProvider.Start(ctx); startErr != nil { t.Logf("error starting log provider: %s", startErr) t.Fail() } }() defer logProvider.Close() waitLogProvider(ctx, t, logProvider, 3) allPayloads := collectPayloads(ctx, t, logProvider, n*rounds, 5) require.GreaterOrEqual(t, len(allPayloads), len(contracts), "failed to backfill logs") })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.WithTimeout(testutils.Context(t), time.Second*60)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.NewOptions(200, big.NewInt(1))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.NewUpkeepFilterStore()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.PollAndSaveLogs(ctx, 1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Start(ctx)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.NewUpkeepFilterStore()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.PollAndSaveLogs(ctx, 1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.BlockByHash(ctx, backend.Commit())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Number()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Int64()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Start(ctx)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.GetRecoveryProposals(ctx)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.Done()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go: `.After(100 * time.Millisecond)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log_test.go: `t.Run(tc.name, func(t *testing.T) { require.Equal(t, tc.wantCmp, LogComparator(tc.a, tc.b)) require.Equal(t, tc.wantSort, LogSorter(tc.a, tc.b)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log_test.go: `.HexToHash("0x21")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log_test.go: `.HexToHash("0x4")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log_test.go: `.Run(tc.name, func(t *testing.T) { require.Equal(t, tc.wantCmp, LogComparator(tc.a, tc.b)) require.Equal(t, tc.wantSort, LogSorter(tc.a, tc.b)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `t.Run(tc.name, func(t *testing.T) { ctx := testutils.Context(t) if tc.mockPoller { lp := new(mocks.LogPoller) lp.On("RegisterFilter", mock.Anything, mock.Anything).Return(nil) lp.On("UnregisterFilter", mock.Anything, mock.Anything).Return(nil) lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{}, nil) hasFitlerTimes := 1 if tc.unregister { hasFitlerTimes = 2 } lp.On("HasFilter", p.filterName(tc.upkeepID)).Return(tc.hasFilter).Times(hasFitlerTimes) if tc.replyed { lp.On("ReplayAsync", mock.Anything).Return(nil).Times(1) } else { lp.On("ReplayAsync", mock.Anything).Return(nil).Times(0) } p.lock.Lock() p.poller = lp p.lock.Unlock() } err := p.RegisterFilter(ctx, FilterOptions{ UpkeepID: tc.upkeepID, TriggerConfig: tc.upkeepCfg, UpdateBlock: tc.cfgUpdateBlock, }) if tc.errored { require.Error(t, err) } else { require.NoError(t, err) if tc.unregister { require.NoError(t, p.UnregisterFilter(ctx, tc.upkeepID)) } } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `lp.On("RegisterFilter", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `lp.On("UnregisterFilter", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{}, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `hasFitlerTimes = 2` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `lp.On("HasFilter", p.filterName(tc.upkeepID)).Return(tc.hasFilter).Times(hasFitlerTimes)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `lp.On("ReplayAsync", mock.Anything).Return(nil).Times(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `lp.On("ReplayAsync", mock.Anything).Return(nil).Times(0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `p.lock.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `p.poller = lp` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `p.lock.Unlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `mp.On("RegisterFilter", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `mp.On("UnregisterFilter", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `mp.On("HasFilter", mock.Anything).Return(false)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `mp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{}, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `mp.On("ReplayAsync", mock.Anything).Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `mp.On("HasFilter", p.filterName(core.GenUpkeepID(types.LogTrigger, "2222").BigInt())).Return(true)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `newIds, err = p.RefreshActiveUpkeeps( ctx, core.GenUpkeepID(types.LogTrigger, "2222").BigInt(), core.GenUpkeepID(types.LogTrigger, "1234").BigInt(), core.GenUpkeepID(types.LogTrigger, "123").BigInt())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `t.Run(tc.name, func(t *testing.T) { err := p.validateLogTriggerConfig(tc.cfg) assert.Equal(t, tc.expectedErr, err) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.NewInt(111)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.BytesToAddress(common.LeftPadBytes([]byte{1, 2, 3, 4}, 20))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.LeftPadBytes([]byte{1, 2, 3, 4}, 20)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.BytesToHash(common.LeftPadBytes([]byte{1, 2, 3, 4}, 32))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.LeftPadBytes([]byte{1, 2, 3, 4}, 32)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.NewInt(111)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.NewInt(111)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.BytesToAddress(common.LeftPadBytes([]byte{}, 20))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.LeftPadBytes([]byte{}, 20)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.BytesToHash(common.LeftPadBytes([]byte{}, 32))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.LeftPadBytes([]byte{}, 32)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.NewInt(111)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.BytesToAddress(common.LeftPadBytes([]byte{1, 2, 3, 4}, 20))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.LeftPadBytes([]byte{1, 2, 3, 4}, 20)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.BytesToHash(common.LeftPadBytes([]byte{1, 2, 3, 4}, 32))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.LeftPadBytes([]byte{1, 2, 3, 4}, 32)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.NewInt(111)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.BytesToAddress(common.LeftPadBytes([]byte{1, 2, 3, 4}, 20))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.LeftPadBytes([]byte{1, 2, 3, 4}, 20)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.BytesToHash(common.LeftPadBytes([]byte{1, 2, 3, 4}, 32))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.LeftPadBytes([]byte{1, 2, 3, 4}, 32)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.Run(tc.name, func(t *testing.T) { ctx := testutils.Context(t) if tc.mockPoller { lp := new(mocks.LogPoller) lp.On("RegisterFilter", mock.Anything, mock.Anything).Return(nil) lp.On("UnregisterFilter", mock.Anything, mock.Anything).Return(nil) lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{}, nil) hasFitlerTimes := 1 if tc.unregister { hasFitlerTimes = 2 } lp.On("HasFilter", p.filterName(tc.upkeepID)).Return(tc.hasFilter).Times(hasFitlerTimes) if tc.replyed { lp.On("ReplayAsync", mock.Anything).Return(nil).Times(1) } else { lp.On("ReplayAsync", mock.Anything).Return(nil).Times(0) } p.lock.Lock() p.poller = lp p.lock.Unlock() } err := p.RegisterFilter(ctx, FilterOptions{ UpkeepID: tc.upkeepID, TriggerConfig: tc.upkeepCfg, UpdateBlock: tc.cfgUpdateBlock, }) if tc.errored { require.Error(t, err) } else { require.NoError(t, err) if tc.unregister { require.NoError(t, p.UnregisterFilter(ctx, tc.upkeepID)) } } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.On("RegisterFilter", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.On("UnregisterFilter", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.On("LatestBlock", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.Return(logpoller.LogPollerBlock{}, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.On("HasFilter", p.filterName(tc.upkeepID))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.filterName(tc.upkeepID)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.Return(tc.hasFilter)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.Times(hasFitlerTimes)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.On("ReplayAsync", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.Times(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.On("ReplayAsync", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.Times(0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.lock.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.lock.Unlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.RegisterFilter(ctx, FilterOptions{ UpkeepID: tc.upkeepID, TriggerConfig: tc.upkeepCfg, UpdateBlock: tc.cfgUpdateBlock, })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.On("RegisterFilter", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.On("UnregisterFilter", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.On("HasFilter", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.Return(false)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.On("LatestBlock", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.Return(logpoller.LogPollerBlock{}, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.On("ReplayAsync", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.RefreshActiveUpkeeps(ctx)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.On("HasFilter", p.filterName(core.GenUpkeepID(types.LogTrigger, "2222").BigInt()))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.filterName(core.GenUpkeepID(types.LogTrigger, "2222").BigInt())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.GenUpkeepID(types.LogTrigger, "2222")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.Return(true)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.RefreshActiveUpkeeps( ctx, core.GenUpkeepID(types.LogTrigger, "2222").BigInt(), core.GenUpkeepID(types.LogTrigger, "1234").BigInt(), core.GenUpkeepID(types.LogTrigger, "123").BigInt())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.GenUpkeepID(types.LogTrigger, "2222")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.GenUpkeepID(types.LogTrigger, "1234")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.GenUpkeepID(types.LogTrigger, "123")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.filterStore.Size()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.HexToAddress("0xB9F3af0c2CbfE108efd0E23F7b0a151Ea42f764E")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.HexToHash("0x3bdab8bffae631cfee411525ebae27f3fb61b10c662c09ec2a7dbb5854c87e8c")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.Run(tc.name, func(t *testing.T) { err := p.validateLogTriggerConfig(tc.cfg) assert.Equal(t, tc.expectedErr, err) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go: `.validateLogTriggerConfig(tc.cfg)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `p.filterStore.AddActiveUpkeeps(f)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `t.Run("no filters", func(t *testing.T) { filters := p.getFilters(0, big.NewInt(0)) require.Len(t, filters, 1) require.Equal(t, len(filters[0].addr), 0) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `t.Run("has filter with lower lastPollBlock", func(t *testing.T) { filters := p.getFilters(0, f.upkeepID) require.Len(t, filters, 1) require.Greater(t, len(filters[0].addr), 0) filters = p.getFilters(10, f.upkeepID) require.Len(t, filters, 1) require.Greater(t, len(filters[0].addr), 0) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `filters = p.getFilters(10, f.upkeepID)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `t.Run("has filter with higher lastPollBlock", func(t *testing.T) { _, f := newEntry(p, 2) f.lastPollBlock = 3 p.filterStore.AddActiveUpkeeps(f) filters := p.getFilters(1, f.upkeepID) require.Len(t, filters, 1) require.Equal(t, len(filters[0].addr), 0) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `f.lastPollBlock = 3` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `p.filterStore.AddActiveUpkeeps(f)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `f.configUpdateBlock = 3` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `p.filterStore.AddActiveUpkeeps(f)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `p.filterStore.AddActiveUpkeeps(f)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `t.Run("no entries", func(t *testing.T) { _, f := newEntry(p, n*2) f.lastPollBlock = 10 p.updateFiltersLastPoll([]upkeepFilter{f}) filters := p.filterStore.GetFilters(nil) for _, f := range filters { require.Equal(t, int64(0), f.lastPollBlock) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `f.lastPollBlock = 10` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `p.updateFiltersLastPoll([]upkeepFilter{f})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `f2.lastPollBlock = 10` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `f1.lastPollBlock = 10` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `p.updateFiltersLastPoll([]upkeepFilter{f1, f2})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `p.filterStore.RangeFiltersByIDs(func(_ int, f upkeepFilter) { require.Equal(t, int64(10), f.lastPollBlock) }, f1.upkeepID, f2.upkeepID)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `p.updateFiltersLastPoll([]upkeepFilter{f1})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `p.filterStore.RangeFiltersByIDs(func(_ int, f upkeepFilter) { require.Equal(t, int64(0), f.lastPollBlock) }, f.upkeepID)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `t.Run(tc.name, func(t *testing.T) { ctx := testutils.Context(t) readInterval := 10 * time.Millisecond opts := NewOptions(200, big.NewInt(1)) opts.ReadInterval = readInterval p := NewLogProvider(logger.TestLogger(t), mp, big.NewInt(1), &mockedPacker{}, NewUpkeepFilterStore(), opts) var ids []*big.Int for i, id := range tc.ids { _, f := newEntry(p, id, tc.addrs[i]) p.filterStore.AddActiveUpkeeps(f) ids = append(ids, f.upkeepID) } reads := make(chan []*big.Int, 100) go func(ctx context.Context) { p.scheduleReadJobs(ctx, func(ids []*big.Int) { select { case reads <- ids: default: t.Log("dropped ids") } }) }(ctx) batches := (len(tc.ids) / tc.maxBatchSize) + 1 timeoutTicker := time.NewTicker(readInterval * time.Duration(batches*10)) defer timeoutTicker.Stop() got := map[string]int{} readLoop: for { select { case <-timeoutTicker.C: break readLoop case batch := <-reads: for _, id := range batch { got[id.String()]++ } case <-ctx.Done(): break readLoop default: if p.CurrentPartitionIdx() > uint64(batches+1) { break readLoop } } runtime.Gosched() } require.Equal(t, len(ids), len(got)) for _, id := range ids { _, ok := got[id.String()] require.True(t, ok, "id not found %s", id.String()) require.GreaterOrEqual(t, got[id.String()], 1, "id don't have schdueled job %s", id.String()) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `opts.ReadInterval = readInterval` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `p.filterStore.AddActiveUpkeeps(f)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `ids = append(ids, f.upkeepID)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `p.scheduleReadJobs(ctx, func(ids []*big.Int) { select { case reads <- ids: default: t.Log("dropped ids") } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `got[id.String()]++` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `runtime.Gosched()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `mp.On("RegisterFilter", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `mp.On("ReplayAsync", mock.Anything).Return()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `mp.On("HasFilter", mock.Anything).Return(false)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `mp.On("UnregisterFilter", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `mp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: int64(1)}, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `mp.On("LogsWithSigs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]logpoller.Log{ { BlockNumber: 1, TxHash: common.HexToHash("0x1"), }, }, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `ids = append(ids, f.upkeepID)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `t.Run("no entries", func(t *testing.T) { require.NoError(t, p.ReadLogs(ctx, big.NewInt(999999))) logs := p.buffer.peek(10) require.Len(t, logs, 0) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `filterStore.RangeFiltersByIDs(func(i int, f upkeepFilter) { updatedFilters = append(updatedFilters, f.Clone()) }, ids[:2]...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `updatedFilters = append(updatedFilters, f.Clone())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.filterStore.AddActiveUpkeeps(f)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.Run("no filters", func(t *testing.T) { filters := p.getFilters(0, big.NewInt(0)) require.Len(t, filters, 1) require.Equal(t, len(filters[0].addr), 0) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.getFilters(0, big.NewInt(0))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.NewInt(0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.Run("has filter with lower lastPollBlock", func(t *testing.T) { filters := p.getFilters(0, f.upkeepID) require.Len(t, filters, 1) require.Greater(t, len(filters[0].addr), 0) filters = p.getFilters(10, f.upkeepID) require.Len(t, filters, 1) require.Greater(t, len(filters[0].addr), 0) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.getFilters(0, f.upkeepID)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.getFilters(10, f.upkeepID)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.Run("has filter with higher lastPollBlock", func(t *testing.T) { _, f := newEntry(p, 2) f.lastPollBlock = 3 p.filterStore.AddActiveUpkeeps(f) filters := p.getFilters(1, f.upkeepID) require.Len(t, filters, 1) require.Equal(t, len(filters[0].addr), 0) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.filterStore.AddActiveUpkeeps(f)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.getFilters(1, f.upkeepID)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.filterStore.AddActiveUpkeeps(f)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.getFilters(1, f.upkeepID)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.filterStore.AddActiveUpkeeps(f)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.Run("no entries", func(t *testing.T) { _, f := newEntry(p, n*2) f.lastPollBlock = 10 p.updateFiltersLastPoll([]upkeepFilter{f}) filters := p.filterStore.GetFilters(nil) for _, f := range filters { require.Equal(t, int64(0), f.lastPollBlock) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.updateFiltersLastPoll([]upkeepFilter{f})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.filterStore.GetFilters(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.updateFiltersLastPoll([]upkeepFilter{f1, f2})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.filterStore.RangeFiltersByIDs(func(_ int, f upkeepFilter) { require.Equal(t, int64(10), f.lastPollBlock) }, f1.upkeepID, f2.upkeepID)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.updateFiltersLastPoll([]upkeepFilter{f1})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.filterStore.RangeFiltersByIDs(func(_ int, f upkeepFilter) { require.Equal(t, int64(0), f.lastPollBlock) }, f.upkeepID)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.Run(tc.name, func(t *testing.T) { ctx := testutils.Context(t) readInterval := 10 * time.Millisecond opts := NewOptions(200, big.NewInt(1)) opts.ReadInterval = readInterval p := NewLogProvider(logger.TestLogger(t), mp, big.NewInt(1), &mockedPacker{}, NewUpkeepFilterStore(), opts) var ids []*big.Int for i, id := range tc.ids { _, f := newEntry(p, id, tc.addrs[i]) p.filterStore.AddActiveUpkeeps(f) ids = append(ids, f.upkeepID) } reads := make(chan []*big.Int, 100) go func(ctx context.Context) { p.scheduleReadJobs(ctx, func(ids []*big.Int) { select { case reads <- ids: default: t.Log("dropped ids") } }) }(ctx) batches := (len(tc.ids) / tc.maxBatchSize) + 1 timeoutTicker := time.NewTicker(readInterval * time.Duration(batches*10)) defer timeoutTicker.Stop() got := map[string]int{} readLoop: for { select { case <-timeoutTicker.C: break readLoop case batch := <-reads: for _, id := range batch { got[id.String()]++ } case <-ctx.Done(): break readLoop default: if p.CurrentPartitionIdx() > uint64(batches+1) { break readLoop } } runtime.Gosched() } require.Equal(t, len(ids), len(got)) for _, id := range ids { _, ok := got[id.String()] require.True(t, ok, "id not found %s", id.String()) require.GreaterOrEqual(t, got[id.String()], 1, "id don't have schdueled job %s", id.String()) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.filterStore.AddActiveUpkeeps(f)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.scheduleReadJobs(ctx, func(ids []*big.Int) { select { case reads <- ids: default: t.Log("dropped ids") } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.NewTicker(readInterval * time.Duration(batches*10))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.Duration(batches*10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.Stop()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.Done()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.CurrentPartitionIdx()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.Gosched()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.On("RegisterFilter", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.On("ReplayAsync", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.Return()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.On("HasFilter", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.Return(false)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.On("UnregisterFilter", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.On("LatestBlock", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.Return(logpoller.LogPollerBlock{BlockNumber: int64(1)}, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.On("LogsWithSigs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.Return([]logpoller.Log{ { BlockNumber: 1, TxHash: common.HexToHash("0x1"), }, }, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.Run("no entries", func(t *testing.T) { require.NoError(t, p.ReadLogs(ctx, big.NewInt(999999))) logs := p.buffer.peek(10) require.Len(t, logs, 0) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.buffer.peek(10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.buffer.peek(10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.RangeFiltersByIDs(func(i int, f upkeepFilter) { updatedFilters = append(updatedFilters, f.Clone()) }, ids[:2]...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go: `.Clone()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: 100}, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `t.Run(tc.name, func(t *testing.T) { r.lock.Lock() r.pending = tc.pending r.lock.Unlock() got, err := r.GetRecoveryProposals(ctx) if tc.wantErr { require.Error(t, err) } else { require.NoError(t, err) } require.Len(t, got, len(tc.want)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `r.lock.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `r.pending = tc.pending` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `r.lock.Unlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `t.Run(tc.name, func(t *testing.T) { ctx, cancel := context.WithCancel(testutils.Context(t)) defer cancel() lookbackBlocks := int64(100) r, _, lp, statesReader := setupTestRecoverer(t, time.Millisecond*50, lookbackBlocks) start, _ := r.getRecoveryWindow(0) block24h := int64(math.Abs(float64(start))) lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: block24h + oldLogsOffset}, nil) statesReader.On("SelectByWorkIDs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.states, nil) r.lock.Lock() r.pending = tc.pending r.visited = tc.visited r.lock.Unlock() r.clean(ctx) r.lock.RLock() defer r.lock.RUnlock() pending := r.pending require.Equal(t, len(tc.wantPending), len(pending)) sort.Slice(pending, func(i, j int) bool { return pending[i].WorkID < pending[j].WorkID }) for i := range pending { require.Equal(t, tc.wantPending[i].WorkID, pending[i].WorkID) } require.Equal(t, len(tc.wantVisited), len(r.visited)) for _, id := range tc.wantVisited { _, ok := r.visited[id] require.True(t, ok) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: block24h + oldLogsOffset}, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `statesReader.On("SelectByWorkIDs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.states, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `r.lock.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `r.pending = tc.pending` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `r.visited = tc.visited` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `r.lock.Unlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `r.clean(ctx)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `r.lock.RLock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `sort.Slice(pending, func(i, j int) bool { return pending[i].WorkID < pending[j].WorkID })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `t.Run(tc.name, func(t *testing.T) { lookbackBlocks := int64(100) recoverer, filterStore, lp, statesReader := setupTestRecoverer(t, time.Millisecond*50, lookbackBlocks) filterStore.AddActiveUpkeeps(tc.active...) lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: tc.latestBlock}, tc.latestBlockErr) lp.On("LogsWithSigs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.logs, tc.logsErr) statesReader.On("SelectByWorkIDs", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.states, tc.statesErr) err := recoverer.recover(ctx) if tc.recoverErr != nil { require.Error(t, err) return } require.NoError(t, err) for i, active := range tc.active { filters := filterStore.GetFilters(func(f upkeepFilter) bool { return f.upkeepID.String() == active.upkeepID.String() }) require.Equal(t, 1, len(filters)) require.Equal(t, tc.lastRePollBlocks[i], filters[0].lastRePollBlock) } proposals, err := recoverer.GetRecoveryProposals(ctx) require.NoError(t, err) require.Equal(t, len(tc.proposalsWorkIDs), len(proposals)) if len(proposals) > 0 { sort.Slice(proposals, func(i, j int) bool { return proposals[i].WorkID < proposals[j].WorkID }) } for i := range proposals { require.Equal(t, tc.proposalsWorkIDs[i], proposals[i].WorkID) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `filterStore.AddActiveUpkeeps(tc.active...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: tc.latestBlock}, tc.latestBlockErr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `lp.On("LogsWithSigs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.logs, tc.logsErr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `statesReader.On("SelectByWorkIDs", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.states, tc.statesErr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `sort.Slice(proposals, func(i, j int) bool { return proposals[i].WorkID < proposals[j].WorkID })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `filters = append(filters, upkeepFilter{ upkeepID: big.NewInt(int64(i)), })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `batch = recoverer.selectFilterBatch(filters[:recoveryBatchSize/2])` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `t.Run(tc.name, func(t *testing.T) { recoverer, filterStore, _, _ := setupTestRecoverer(t, time.Millisecond*50, int64(100)) filterStore.AddActiveUpkeeps(tc.filters...) batch := recoverer.getFilterBatch(tc.offsetBlock) require.Equal(t, tc.want, len(batch)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `filterStore.AddActiveUpkeeps(tc.filters...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `t.Run(tc.name, func(t *testing.T) { recoverer, _, _, _ := setupTestRecoverer(t, time.Millisecond*50, int64(100)) state := recoverer.filterFinalizedStates(upkeepFilter{}, tc.logs, tc.states) require.Equal(t, len(tc.want), len(state)) for i := range state { require.Equal(t, tc.want[i].LogIndex, state[i].LogIndex) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `receipt.Status = 1` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `receipt.BlockNumber = big.NewInt(200)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `receipt.Status = 1` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `receipt.BlockNumber = big.NewInt(200)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `receipt.Status = 1` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `receipt.BlockNumber = big.NewInt(200)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `receipt.BlockHash = common.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `receipt.Status = 1` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `receipt.BlockNumber = big.NewInt(80)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `receipt.Status = 1` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `receipt.BlockNumber = big.NewInt(80)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `receipt.Status = 1` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `receipt.BlockNumber = big.NewInt(80)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `receipt.Status = 1` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `receipt.BlockNumber = big.NewInt(80)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `receipt.Status = 1` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `receipt.BlockNumber = big.NewInt(80)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `t.LogTriggerExtension = &ocr2keepers.LogTriggerExtension{ TxHash: [32]byte{2}, Index: uint32(3), BlockHash: [32]byte{1}, BlockNumber: ocr2keepers.BlockNumber(80), }` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `receipt.Status = 1` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `receipt.BlockNumber = big.NewInt(80)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `receipt.BlockHash = [32]byte{1}` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `t.LogTriggerExtension = &ocr2keepers.LogTriggerExtension{ TxHash: [32]byte{2}, Index: uint32(3), BlockHash: [32]byte{1}, BlockNumber: ocr2keepers.BlockNumber(80), }` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `receipt.Status = 1` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `receipt.BlockNumber = big.NewInt(80)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `receipt.BlockHash = [32]byte{1}` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `t.Run(tc.name, func(t *testing.T) { recoverer, filterStore, _, _ := setupTestRecoverer(t, time.Second, 10) if !tc.skipFilter { filterStore.AddActiveUpkeeps(upkeepFilter{ addr: []byte("test"), topics: []common.Hash{common.HexToHash("0x1"), common.HexToHash("0x2"), common.HexToHash("0x3"), common.HexToHash("0x4")}, upkeepID: core.GenUpkeepID(types2.LogTrigger, "123").BigInt(), }) } if tc.filterStore != nil { recoverer.filterStore = tc.filterStore } if tc.logPoller != nil { recoverer.poller = tc.logPoller } if tc.client != nil { recoverer.client = tc.client } if tc.stateReader != nil { recoverer.states = tc.stateReader } b, err := recoverer.GetProposalData(testutils.Context(t), tc.proposal) if tc.expectErr { assert.Error(t, err) assert.Equal(t, tc.wantErr.Error(), err.Error()) } else { assert.NoError(t, err) assert.Equal(t, tc.wantBytes, b) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `filterStore.AddActiveUpkeeps(upkeepFilter{ addr: []byte("test"), topics: []common.Hash{common.HexToHash("0x1"), common.HexToHash("0x2"), common.HexToHash("0x3"), common.HexToHash("0x4")}, upkeepID: core.GenUpkeepID(types2.LogTrigger, "123").BigInt(), })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `recoverer.filterStore = tc.filterStore` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `recoverer.poller = tc.logPoller` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `recoverer.client = tc.client` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `recoverer.states = tc.stateReader` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `t.Run(tc.name, func(t *testing.T) { origMaxPendingPayloadsPerUpkeep := maxPendingPayloadsPerUpkeep maxPendingPayloadsPerUpkeep = tc.maxPerUpkeep defer func() { maxPendingPayloadsPerUpkeep = origMaxPendingPayloadsPerUpkeep }() r := NewLogRecoverer(logger.TestLogger(t), nil, nil, nil, nil, nil, NewOptions(200, big.NewInt(1))) r.lock.Lock() r.pending = tc.exist for i, p := range tc.new { err := r.addPending(p) if tc.errored[i] { require.Error(t, err) continue } require.NoError(t, err) } pending := r.pending require.GreaterOrEqual(t, len(pending), len(tc.new)) require.Equal(t, len(tc.want), len(pending)) sort.Slice(pending, func(i, j int) bool { return pending[i].WorkID < pending[j].WorkID }) for i := range pending { require.Equal(t, tc.want[i].WorkID, pending[i].WorkID) } r.lock.Unlock() for _, p := range tc.want { r.removePending(p.WorkID) } r.lock.Lock() defer r.lock.Unlock() require.Equal(t, 0, len(r.pending)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `maxPendingPayloadsPerUpkeep = tc.maxPerUpkeep` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `maxPendingPayloadsPerUpkeep = origMaxPendingPayloadsPerUpkeep` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `r.lock.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `r.pending = tc.exist` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `sort.Slice(pending, func(i, j int) bool { return pending[i].WorkID < pending[j].WorkID })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `r.lock.Unlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `r.removePending(p.WorkID)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `r.lock.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.On("LatestBlock", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Return(logpoller.LogPollerBlock{BlockNumber: 100}, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Run(tc.name, func(t *testing.T) { r.lock.Lock() r.pending = tc.pending r.lock.Unlock() got, err := r.GetRecoveryProposals(ctx) if tc.wantErr { require.Error(t, err) } else { require.NoError(t, err) } require.Len(t, got, len(tc.want)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.lock.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.lock.Unlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GetRecoveryProposals(ctx)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "3")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Now()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.BlockNumber(oldLogsOffset * 2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Now()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.BlockNumber(oldLogsOffset * 2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Now()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Add(-time.Hour)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.BlockNumber(oldLogsOffset - 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Now()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Add(-time.Hour)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.BlockNumber(oldLogsOffset + 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "4")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Run(tc.name, func(t *testing.T) { ctx, cancel := context.WithCancel(testutils.Context(t)) defer cancel() lookbackBlocks := int64(100) r, _, lp, statesReader := setupTestRecoverer(t, time.Millisecond*50, lookbackBlocks) start, _ := r.getRecoveryWindow(0) block24h := int64(math.Abs(float64(start))) lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: block24h + oldLogsOffset}, nil) statesReader.On("SelectByWorkIDs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.states, nil) r.lock.Lock() r.pending = tc.pending r.visited = tc.visited r.lock.Unlock() r.clean(ctx) r.lock.RLock() defer r.lock.RUnlock() pending := r.pending require.Equal(t, len(tc.wantPending), len(pending)) sort.Slice(pending, func(i, j int) bool { return pending[i].WorkID < pending[j].WorkID }) for i := range pending { require.Equal(t, tc.wantPending[i].WorkID, pending[i].WorkID) } require.Equal(t, len(tc.wantVisited), len(r.visited)) for _, id := range tc.wantVisited { _, ok := r.visited[id] require.True(t, ok) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.getRecoveryWindow(0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Abs(float64(start))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.On("LatestBlock", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Return(logpoller.LogPollerBlock{BlockNumber: block24h + oldLogsOffset}, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.On("SelectByWorkIDs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Return(tc.states, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.lock.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.lock.Unlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.clean(ctx)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.lock.RLock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.lock.RUnlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Slice(pending, func(i, j int) bool { return pending[i].WorkID < pending[j].WorkID })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToAddress("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToHash("0x111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToHash("0x2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToAddress("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToAddress("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToAddress("0x2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToHash("0x2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.NewInt(3)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToAddress("0x2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToHash("0x2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToHash("0x111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToHash("0x2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToAddress("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToHash("0x111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToHash("0x2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToAddress("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToHash("0x111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToHash("0x2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Run(tc.name, func(t *testing.T) { lookbackBlocks := int64(100) recoverer, filterStore, lp, statesReader := setupTestRecoverer(t, time.Millisecond*50, lookbackBlocks) filterStore.AddActiveUpkeeps(tc.active...) lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: tc.latestBlock}, tc.latestBlockErr) lp.On("LogsWithSigs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.logs, tc.logsErr) statesReader.On("SelectByWorkIDs", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.states, tc.statesErr) err := recoverer.recover(ctx) if tc.recoverErr != nil { require.Error(t, err) return } require.NoError(t, err) for i, active := range tc.active { filters := filterStore.GetFilters(func(f upkeepFilter) bool { return f.upkeepID.String() == active.upkeepID.String() }) require.Equal(t, 1, len(filters)) require.Equal(t, tc.lastRePollBlocks[i], filters[0].lastRePollBlock) } proposals, err := recoverer.GetRecoveryProposals(ctx) require.NoError(t, err) require.Equal(t, len(tc.proposalsWorkIDs), len(proposals)) if len(proposals) > 0 { sort.Slice(proposals, func(i, j int) bool { return proposals[i].WorkID < proposals[j].WorkID }) } for i := range proposals { require.Equal(t, tc.proposalsWorkIDs[i], proposals[i].WorkID) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.AddActiveUpkeeps(tc.active...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.On("LatestBlock", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Return(logpoller.LogPollerBlock{BlockNumber: tc.latestBlock}, tc.latestBlockErr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.On("LogsWithSigs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Return(tc.logs, tc.logsErr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.On("SelectByWorkIDs", mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Return(tc.states, tc.statesErr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.recover(ctx)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GetFilters(func(f upkeepFilter) bool { return f.upkeepID.String() == active.upkeepID.String() })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.upkeepID.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.upkeepID.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GetRecoveryProposals(ctx)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Slice(proposals, func(i, j int) bool { return proposals[i].WorkID < proposals[j].WorkID })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.NewInt(int64(i))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.selectFilterBatch(filters)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.selectFilterBatch(filters[:recoveryBatchSize/2])` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToAddress("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToAddress("0x2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.NewInt(3)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToAddress("0x3")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Run(tc.name, func(t *testing.T) { recoverer, filterStore, _, _ := setupTestRecoverer(t, time.Millisecond*50, int64(100)) filterStore.AddActiveUpkeeps(tc.filters...) batch := recoverer.getFilterBatch(tc.offsetBlock) require.Equal(t, tc.want, len(batch)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.AddActiveUpkeeps(tc.filters...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.getFilterBatch(tc.offsetBlock)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Run(tc.name, func(t *testing.T) { recoverer, _, _, _ := setupTestRecoverer(t, time.Millisecond*50, int64(100)) state := recoverer.filterFinalizedStates(upkeepFilter{}, tc.logs, tc.states) require.Equal(t, len(tc.want), len(state)) for i := range state { require.Equal(t, tc.want[i].LogIndex, state[i].LogIndex) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.filterFinalizedStates(upkeepFilter{}, tc.logs, tc.states)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.New("not a log trigger upkeep ID")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "123")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.New("filter not found for upkeep 452312848583266388373324160190187140457511065560374322131410487042692349952")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "123")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.New("latest block boom")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.New("latest block boom")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "123")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.New("tx receipt boom")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.New("tx receipt boom")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "123")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.New("failed to get tx block")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "123")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.NewInt(200)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.New("log block is not recoverable")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "123")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.NewInt(200)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.New("log block is not recoverable")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "123")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToHash("0x2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.NewInt(200)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.New("log tx reorged")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "123")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.New("upkeep state boom")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.NewInt(80)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.New("upkeep state boom")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "123")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.NewInt(80)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.New("upkeep state is not recoverable")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "123")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.NewInt(80)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.New("invalid filter found for upkeepID 452312848583266388373324160190187140457511065560374322131410487042692349952")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "123")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.New("logs with sigs boom")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.NewInt(80)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.New("could not read logs: logs with sigs boom")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "123")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.NewInt(80)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.New(`no log found for upkeepID 452312848583266388373324160190187140457511065560374322131410487042692349952 and trigger {"BlockNumber":0,"BlockHash":"0000000000000000000000000000000000000000000000000000000000000000","LogTriggerExtension":{"BlockHash":"0000000000000000000000000000000000000000000000000000000000000000","BlockNumber":80,"Index":0,"TxHash":"0000000000000000000000000000000000000000000000000000000000000000"}}`)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "123")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.NewTrigger( ocr2keepers.BlockNumber(80), [32]byte{1}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.BlockNumber(80)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.BlockNumber(80)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.NewInt(80)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "123")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.NewTrigger( ocr2keepers.BlockNumber(80), [32]byte{1}, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.BlockNumber(80)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.BlockNumber(80)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.New(big.NewInt(1))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Date(2022, 1, 1, 1, 1, 1, 1, time.UTC)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToHash("abc")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Date(2022, 1, 1, 1, 1, 1, 1, time.UTC)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.NewInt(80)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Run(tc.name, func(t *testing.T) { recoverer, filterStore, _, _ := setupTestRecoverer(t, time.Second, 10) if !tc.skipFilter { filterStore.AddActiveUpkeeps(upkeepFilter{ addr: []byte("test"), topics: []common.Hash{common.HexToHash("0x1"), common.HexToHash("0x2"), common.HexToHash("0x3"), common.HexToHash("0x4")}, upkeepID: core.GenUpkeepID(types2.LogTrigger, "123").BigInt(), }) } if tc.filterStore != nil { recoverer.filterStore = tc.filterStore } if tc.logPoller != nil { recoverer.poller = tc.logPoller } if tc.client != nil { recoverer.client = tc.client } if tc.stateReader != nil { recoverer.states = tc.stateReader } b, err := recoverer.GetProposalData(testutils.Context(t), tc.proposal) if tc.expectErr { assert.Error(t, err) assert.Equal(t, tc.wantErr.Error(), err.Error()) } else { assert.NoError(t, err) assert.Equal(t, tc.wantBytes, b) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.AddActiveUpkeeps(upkeepFilter{ addr: []byte("test"), topics: []common.Hash{common.HexToHash("0x1"), common.HexToHash("0x2"), common.HexToHash("0x3"), common.HexToHash("0x4")}, upkeepID: core.GenUpkeepID(types2.LogTrigger, "123").BigInt(), })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToHash("0x2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToHash("0x3")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.HexToHash("0x4")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "123")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GetProposalData(testutils.Context(t), tc.proposal)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.GenUpkeepID(types2.LogTrigger, "1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Run(tc.name, func(t *testing.T) { origMaxPendingPayloadsPerUpkeep := maxPendingPayloadsPerUpkeep maxPendingPayloadsPerUpkeep = tc.maxPerUpkeep defer func() { maxPendingPayloadsPerUpkeep = origMaxPendingPayloadsPerUpkeep }() r := NewLogRecoverer(logger.TestLogger(t), nil, nil, nil, nil, nil, NewOptions(200, big.NewInt(1))) r.lock.Lock() r.pending = tc.exist for i, p := range tc.new { err := r.addPending(p) if tc.errored[i] { require.Error(t, err) continue } require.NoError(t, err) } pending := r.pending require.GreaterOrEqual(t, len(pending), len(tc.new)) require.Equal(t, len(tc.want), len(pending)) sort.Slice(pending, func(i, j int) bool { return pending[i].WorkID < pending[j].WorkID }) for i := range pending { require.Equal(t, tc.want[i].WorkID, pending[i].WorkID) } r.lock.Unlock() for _, p := range tc.want { r.removePending(p.WorkID) } r.lock.Lock() defer r.lock.Unlock() require.Equal(t, 0, len(r.pending)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.lock.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.addPending(p)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.Slice(pending, func(i, j int) bool { return pending[i].WorkID < pending[j].WorkID })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.lock.Unlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.removePending(p.WorkID)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.lock.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go: `.lock.Unlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `t.Run(tc.name, func(t *testing.T) { result := GenerateHMACFn(tc.method, tc.path, tc.body, tc.clientId, tc.secret, tc.ts) if result != tc.expected { t.Errorf("Expected: %s, Got: %s", tc.expected, result) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `t.Run(tt.name, func(t *testing.T) { packer := NewAbiPacker() fl, err := packer.DecodeStreamsLookupRequest(tt.data) assert.Equal(t, tt.expected, fl) if tt.err != nil { assert.Equal(t, tt.err.Error(), err.Error()) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `t.Run(test.name, func(t *testing.T) { packer := NewAbiPacker() b, err := packer.UnpackGetUpkeepPrivilegeConfig(test.raw) if !test.errored { require.NoError(t, err, "should unpack bytes from abi encoded value") // the actual struct to unmarshal into is not available to this // package so basic json encoding is the limit of the following test var data map[string]interface{} err = json.Unmarshal(b, &data) assert.NoError(t, err, "packed data should unmarshal using json encoding") assert.Equal(t, []byte(`{"mercuryEnabled":true}`), b) } else { assert.NotNil(t, err, "error expected from unpack function") } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `err = json.Unmarshal(b, &data)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `t.Run(test.name, func(t *testing.T) { packer := NewAbiPacker() b, err := packer.PackGetUpkeepPrivilegeConfig(test.upkeepId) if !test.errored { require.NoError(t, err, "no error expected from packing") assert.Equal(t, test.raw, b, "raw bytes for output should match expected") } else { assert.NotNil(t, err, "error expected from packing function") } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `t.Run(test.Name, func(t *testing.T) { packer := NewAbiPacker() state, needed, pd, failureReason, gasUsed, err := packer.UnpackCheckCallbackResult(test.CallbackResp) if test.ErrorString != "" { assert.EqualError(t, err, test.ErrorString+hexutil.Encode(test.CallbackResp)) } else { assert.Nil(t, err) } assert.Equal(t, test.UpkeepNeeded, needed) assert.Equal(t, test.PerformData, pd) assert.Equal(t, test.FailureReason, failureReason) assert.Equal(t, test.GasUsed, gasUsed) assert.Equal(t, test.State, state) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `t.Run(test.name, func(t *testing.T) { packer := NewAbiPacker() b, err := packer.PackUserCheckErrorHandler(test.errCode, test.extraData) if !test.errored { require.NoError(t, err, "no error expected from packing") assert.Equal(t, test.rawOutput, b, "raw bytes for output should match expected") } else { assert.NotNil(t, err, "error expected from packing function") } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `t.Run(tc.name, func(t *testing.T) { cfg := newMercuryConfigMock() var result time.Duration for i := 0; i < tc.times; i++ { result = CalculateStreamsRetryConfigFn(tc.upkeepType, "prk", cfg) } assert.Equal(t, tc.expected, result) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `result = CalculateStreamsRetryConfigFn(tc.upkeepType, "prk", cfg)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `.Run(tc.name, func(t *testing.T) { result := GenerateHMACFn(tc.method, tc.path, tc.body, tc.clientId, tc.secret, tc.ts) if result != tc.expected { t.Errorf("Expected: %s, Got: %s", tc.expected, result) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `.MustDecode("0xf055e4a200000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000002435eb50000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000966656564496448657800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000423078343535343438326435353533343432643431353234323439353435323535346432643534343535333534346534353534303030303030303030303030303030300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042307834323534343332643535353334343264343135323432343935343532353534643264353434353533353434653435353430303030303030303030303030303030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b626c6f636b4e756d62657200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000064000000000000000000000000")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `.NewInt(37969589)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `.New("unpack error: invalid identifier, have 0x01020304 want 0xf055e4a2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `.Run(tt.name, func(t *testing.T) { packer := NewAbiPacker() fl, err := packer.DecodeStreamsLookupRequest(tt.data) assert.Equal(t, tt.expected, fl) if tt.err != nil { assert.Equal(t, tt.err.Error(), err.Error()) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `.DecodeStreamsLookupRequest(tt.data)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `.Decode("0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000177b226d657263757279456e61626c6564223a747275657d000000000000000000")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `.Decode("0x")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `.Run(test.name, func(t *testing.T) { packer := NewAbiPacker() b, err := packer.UnpackGetUpkeepPrivilegeConfig(test.raw) if !test.errored { require.NoError(t, err, "should unpack bytes from abi encoded value") // the actual struct to unmarshal into is not available to this // package so basic json encoding is the limit of the following test var data map[string]interface{} err = json.Unmarshal(b, &data) assert.NoError(t, err, "packed data should unmarshal using json encoding") assert.Equal(t, []byte(`{"mercuryEnabled":true}`), b) } else { assert.NotNil(t, err, "error expected from unpack function") } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `.UnpackGetUpkeepPrivilegeConfig(test.raw)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `.Unmarshal(b, &data)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `.SetString("52236098515066839510538748191966098678939830769967377496848891145101407612976", 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `.Decode("0x19d97a94737c9583000000000000000000000001ea8ed6d0617dd5b3b87374020efaf030")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `.Run(test.name, func(t *testing.T) { packer := NewAbiPacker() b, err := packer.PackGetUpkeepPrivilegeConfig(test.upkeepId) if !test.errored { require.NoError(t, err, "no error expected from packing") assert.Equal(t, test.raw, b, "raw bytes for output should match expected") } else { assert.NotNil(t, err, "error expected from packing function") } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `.PackGetUpkeepPrivilegeConfig(test.upkeepId)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `.NewInt(11796)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `.NewInt(13008)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `.Run(test.Name, func(t *testing.T) { packer := NewAbiPacker() state, needed, pd, failureReason, gasUsed, err := packer.UnpackCheckCallbackResult(test.CallbackResp) if test.ErrorString != "" { assert.EqualError(t, err, test.ErrorString+hexutil.Encode(test.CallbackResp)) } else { assert.Nil(t, err) } assert.Equal(t, test.UpkeepNeeded, needed) assert.Equal(t, test.PerformData, pd) assert.Equal(t, test.FailureReason, failureReason) assert.Equal(t, test.GasUsed, gasUsed) assert.Equal(t, test.State, state) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `.UnpackCheckCallbackResult(test.CallbackResp)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `.Decode("0x19d97a94737c9583000000000000000000000001ea8ed6d0617dd5b3b87374020efaf030")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `.Run(test.name, func(t *testing.T) { packer := NewAbiPacker() b, err := packer.PackUserCheckErrorHandler(test.errCode, test.extraData) if !test.errored { require.NoError(t, err, "no error expected from packing") assert.Equal(t, test.rawOutput, b, "raw bytes for output should match expected") } else { assert.NotNil(t, err, "error expected from packing function") } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `.PackUserCheckErrorHandler(test.errCode, test.extraData)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/mercury_test.go: `.Run(tc.name, func(t *testing.T) { cfg := newMercuryConfigMock() var result time.Duration for i := 0; i < tc.times; i++ { result = CalculateStreamsRetryConfigFn(tc.upkeepType, "prk", cfg) } assert.Equal(t, tc.expected, result) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `t.Run(tt.name, func(t *testing.T) { client := new(evmClientMocks.Client) s := setupStreams(t) defer s.Close() userPayload, err := s.packer.PackUserCheckErrorHandler(tt.errCode, tt.lookup.ExtraData) require.Nil(t, err) payload, err := s.abi.Pack("executeCallback", tt.lookup.UpkeepId, userPayload) require.Nil(t, err) args := map[string]interface{}{ "from": zeroAddress, "to": s.registry.Address().Hex(), "data": hexutil.Bytes(payload), } client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", args, hexutil.EncodeUint64(tt.lookup.Block)).Return(tt.callbackErr). Run(func(args mock.Arguments) { by := args.Get(1).(*hexutil.Bytes) *by = tt.callbackResp }).Once() s.client = client err = s.CheckErrorHandler(testutils.Context(t), tt.errCode, tt.lookup, tt.checkResults, 0) tt.wantErr(t, err, fmt.Sprintf("Error assertion failed: %v", tt.name)) assert.Equal(t, uint8(tt.state), tt.checkResults[0].PipelineExecutionState) assert.Equal(t, tt.retryable, tt.checkResults[0].Retryable) assert.Equal(t, tt.upkeepNeeded, tt.checkResults[0].Eligible) assert.Equal(t, tt.performData, tt.checkResults[0].PerformData) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", args, hexutil.EncodeUint64(tt.lookup.Block)).Return(tt.callbackErr). Run(func(args mock.Arguments) { by := args.Get(1).(*hexutil.Bytes) *by = tt.callbackResp }).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `*by = tt.callbackResp` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `s.client = client` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `err = s.CheckErrorHandler(testutils.Context(t), tt.errCode, tt.lookup, tt.checkResults, 0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `tt.wantErr(t, err, fmt.Sprintf("Error assertion failed: %v", tt.name))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `t.Run(tt.name, func(t *testing.T) { client := new(evmClientMocks.Client) s := setupStreams(t) defer s.Close() payload, err := s.abi.Pack("checkCallback", tt.lookup.UpkeepId, values, tt.lookup.ExtraData) require.Nil(t, err) args := map[string]interface{}{ "from": zeroAddress, "to": s.registry.Address().Hex(), "data": hexutil.Bytes(payload), } client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", args, hexutil.EncodeUint64(tt.lookup.Block)).Return(tt.callbackErr). Run(func(args mock.Arguments) { by := args.Get(1).(*hexutil.Bytes) *by = tt.callbackResp }).Once() s.client = client err = s.CheckCallback(testutils.Context(t), tt.values, tt.lookup, tt.input, 0) tt.wantErr(t, err, fmt.Sprintf("Error assertion failed: %v", tt.name)) assert.Equal(t, uint8(tt.state), tt.input[0].PipelineExecutionState) assert.Equal(t, tt.retryable, tt.input[0].Retryable) assert.Equal(t, tt.upkeepNeeded, tt.input[0].Eligible) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", args, hexutil.EncodeUint64(tt.lookup.Block)).Return(tt.callbackErr). Run(func(args mock.Arguments) { by := args.Get(1).(*hexutil.Bytes) *by = tt.callbackResp }).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `*by = tt.callbackResp` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `s.client = client` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `err = s.CheckCallback(testutils.Context(t), tt.values, tt.lookup, tt.input, 0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `tt.wantErr(t, err, fmt.Sprintf("Error assertion failed: %v", tt.name))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `t.Run(tt.name, func(t *testing.T) { s := setupStreams(t) defer s.Close() s.registry = tt.registry client := new(evmClientMocks.Client) s.client = client mc := new(MockMercuryConfigProvider) mc.On("IsUpkeepAllowed", mock.Anything).Return(tt.allowed, tt.cached).Once() mc.On("SetUpkeepAllowed", mock.Anything, mock.Anything, mock.Anything).Return().Once() s.mercuryConfig = mc if !tt.cached { if tt.err != nil { bContractCfg, err := s.abi.Methods["getUpkeepPrivilegeConfig"].Outputs.PackValues([]interface{}{tt.config}) require.Nil(t, err) payload, err := s.abi.Pack("getUpkeepPrivilegeConfig", upkeepId) require.Nil(t, err) args := map[string]interface{}{ "to": s.registry.Address().Hex(), "data": hexutil.Bytes(payload), } client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", args, mock.AnythingOfType("string")). Return(tt.ethCallErr). Run(func(args mock.Arguments) { b := args.Get(1).(*hexutil.Bytes) *b = bContractCfg }).Once() } else { cfg := UpkeepPrivilegeConfig{MercuryEnabled: tt.allowed} bCfg, err := json.Marshal(cfg) require.Nil(t, err) bContractCfg, err := s.abi.Methods["getUpkeepPrivilegeConfig"].Outputs.PackValues([]interface{}{bCfg}) require.Nil(t, err) payload, err := s.abi.Pack("getUpkeepPrivilegeConfig", upkeepId) require.Nil(t, err) args := map[string]interface{}{ "to": s.registry.Address().Hex(), "data": hexutil.Bytes(payload), } client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", args, mock.AnythingOfType("string")).Return(nil). Run(func(args mock.Arguments) { b := args.Get(1).(*hexutil.Bytes) *b = bContractCfg }).Once() } } opts := &bind.CallOpts{ BlockNumber: big.NewInt(10), } state, reason, retryable, allowed, err := s.AllowedToUseMercury(opts, upkeepId) assert.Equal(t, tt.err, err) assert.Equal(t, tt.allowed, allowed) assert.Equal(t, tt.state, state) assert.Equal(t, tt.reason, reason) assert.Equal(t, tt.retryable, retryable) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `s.registry = tt.registry` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `s.client = client` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `mc.On("IsUpkeepAllowed", mock.Anything).Return(tt.allowed, tt.cached).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `mc.On("SetUpkeepAllowed", mock.Anything, mock.Anything, mock.Anything).Return().Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `s.mercuryConfig = mc` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", args, mock.AnythingOfType("string")). Return(tt.ethCallErr). Run(func(args mock.Arguments) { b := args.Get(1).(*hexutil.Bytes) *b = bContractCfg }).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `*b = bContractCfg` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", args, mock.AnythingOfType("string")).Return(nil). Run(func(args mock.Arguments) { b := args.Get(1).(*hexutil.Bytes) *b = bContractCfg }).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `*b = bContractCfg` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `copy(upkeepIdentifier[:], upkeepId.Bytes())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `t.Run(tt.name, func(t *testing.T) { s := setupStreams(t) defer s.Close() s.registry = tt.registry client := new(evmClientMocks.Client) s.client = client mc := new(MockMercuryConfigProvider) mc.On("IsUpkeepAllowed", mock.Anything).Return(tt.hasPermission, tt.cachedAdminCfg).Once() mc.On("SetUpkeepAllowed", mock.Anything, mock.Anything, mock.Anything).Return().Once() s.mercuryConfig = mc if !tt.cachedAdminCfg && !tt.hasError { cfg := UpkeepPrivilegeConfig{MercuryEnabled: tt.hasPermission} bCfg, err := json.Marshal(cfg) require.Nil(t, err) bContractCfg, err := s.abi.Methods["getUpkeepPrivilegeConfig"].Outputs.PackValues([]interface{}{bCfg}) require.Nil(t, err) payload, err := s.abi.Pack("getUpkeepPrivilegeConfig", upkeepId) require.Nil(t, err) args := map[string]interface{}{ "to": s.registry.Address().Hex(), "data": hexutil.Bytes(payload), } client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", args, mock.AnythingOfType("string")).Return(nil). Run(func(args mock.Arguments) { b := args.Get(1).(*hexutil.Bytes) *b = bContractCfg }).Once() } if len(tt.blobs) > 0 { if tt.v3 { hc03 := new(MockHttpClient) v03HttpClient := v03.NewClient(s.mercuryConfig, hc03, s.threadCtrl, s.lggr) s.v03Client = v03HttpClient mr1 := v03.MercuryV03Response{ Reports: []v03.MercuryV03Report{{FullReport: tt.blobs["0x4554482d5553442d415242495452554d2d544553544e45540000000000000000"]}, {FullReport: tt.blobs["0x4254432d5553442d415242495452554d2d544553544e45540000000000000000"]}}} b1, err := json.Marshal(mr1) assert.Nil(t, err) resp1 := &http.Response{ StatusCode: http.StatusOK, Body: io.NopCloser(bytes.NewReader(b1)), } hc03.On("Do", mock.Anything).Return(resp1, nil).Once() } else { hc02 := new(MockHttpClient) v02HttpClient := v02.NewClient(s.mercuryConfig, hc02, s.threadCtrl, s.lggr) s.v02Client = v02HttpClient mr1 := v02.MercuryV02Response{ChainlinkBlob: tt.blobs["0x4554482d5553442d415242495452554d2d544553544e45540000000000000000"]} b1, err := json.Marshal(mr1) assert.Nil(t, err) resp1 := &http.Response{ StatusCode: http.StatusOK, Body: io.NopCloser(bytes.NewReader(b1)), } mr2 := v02.MercuryV02Response{ChainlinkBlob: tt.blobs["0x4254432d5553442d415242495452554d2d544553544e45540000000000000000"]} b2, err := json.Marshal(mr2) assert.Nil(t, err) resp2 := &http.Response{ StatusCode: http.StatusOK, Body: io.NopCloser(bytes.NewReader(b2)), } hc02.On("Do", mock.MatchedBy(func(req *http.Request) bool { return strings.Contains(req.URL.String(), "0x4254432d5553442d415242495452554d2d544553544e45540000000000000000") })).Return(resp2, nil).Once() hc02.On("Do", mock.MatchedBy(func(req *http.Request) bool { return strings.Contains(req.URL.String(), "0x4554482d5553442d415242495452554d2d544553544e45540000000000000000") })).Return(resp1, nil).Once() } } if tt.callbackNeeded { payload, err := s.abi.Pack("checkCallback", upkeepId, tt.values, tt.extraData) require.Nil(t, err) args := map[string]interface{}{ "from": zeroAddress, "to": s.registry.Address().Hex(), "data": hexutil.Bytes(payload), } client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", args, hexutil.EncodeUint64(uint64(blockNum))).Return(nil). Run(func(args mock.Arguments) { b := args.Get(1).(*hexutil.Bytes) *b = tt.checkCallbackResp }).Once() } got := s.Lookup(testutils.Context(t), tt.input) assert.Equal(t, tt.expectedResults, got, tt.name) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `s.registry = tt.registry` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `s.client = client` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `mc.On("IsUpkeepAllowed", mock.Anything).Return(tt.hasPermission, tt.cachedAdminCfg).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `mc.On("SetUpkeepAllowed", mock.Anything, mock.Anything, mock.Anything).Return().Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `s.mercuryConfig = mc` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", args, mock.AnythingOfType("string")).Return(nil). Run(func(args mock.Arguments) { b := args.Get(1).(*hexutil.Bytes) *b = bContractCfg }).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `*b = bContractCfg` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `s.v03Client = v03HttpClient` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `hc03.On("Do", mock.Anything).Return(resp1, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `s.v02Client = v02HttpClient` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `hc02.On("Do", mock.MatchedBy(func(req *http.Request) bool { return strings.Contains(req.URL.String(), "0x4254432d5553442d415242495452554d2d544553544e45540000000000000000") })).Return(resp2, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `hc02.On("Do", mock.MatchedBy(func(req *http.Request) bool { return strings.Contains(req.URL.String(), "0x4554482d5553442d415242495452554d2d544553544e45540000000000000000") })).Return(resp1, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", args, hexutil.EncodeUint64(uint64(blockNum))).Return(nil). Run(func(args mock.Arguments) { b := args.Get(1).(*hexutil.Bytes) *b = tt.checkCallbackResp }).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `*b = tt.checkCallbackResp` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.NewInt(123456789)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.NewInt(100)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.NewInt(18952430)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.NewInt(100)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.New("bad response")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.NewInt(100)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Run(tt.name, func(t *testing.T) { client := new(evmClientMocks.Client) s := setupStreams(t) defer s.Close() userPayload, err := s.packer.PackUserCheckErrorHandler(tt.errCode, tt.lookup.ExtraData) require.Nil(t, err) payload, err := s.abi.Pack("executeCallback", tt.lookup.UpkeepId, userPayload) require.Nil(t, err) args := map[string]interface{}{ "from": zeroAddress, "to": s.registry.Address().Hex(), "data": hexutil.Bytes(payload), } client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", args, hexutil.EncodeUint64(tt.lookup.Block)).Return(tt.callbackErr). Run(func(args mock.Arguments) { by := args.Get(1).(*hexutil.Bytes) *by = tt.callbackResp }).Once() s.client = client err = s.CheckErrorHandler(testutils.Context(t), tt.errCode, tt.lookup, tt.checkResults, 0) tt.wantErr(t, err, fmt.Sprintf("Error assertion failed: %v", tt.name)) assert.Equal(t, uint8(tt.state), tt.checkResults[0].PipelineExecutionState) assert.Equal(t, tt.retryable, tt.checkResults[0].Retryable) assert.Equal(t, tt.upkeepNeeded, tt.checkResults[0].Eligible) assert.Equal(t, tt.performData, tt.checkResults[0].PerformData) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.packer.PackUserCheckErrorHandler(tt.errCode, tt.lookup.ExtraData)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.abi.Pack("executeCallback", tt.lookup.UpkeepId, userPayload)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.registry.Address()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Hex()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Bytes(payload)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", args, hexutil.EncodeUint64(tt.lookup.Block))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.AnythingOfType("*hexutil.Bytes")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.EncodeUint64(tt.lookup.Block)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Return(tt.callbackErr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `. Run(func(args mock.Arguments) { by := args.Get(1).(*hexutil.Bytes) *by = tt.callbackResp })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Get(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.CheckErrorHandler(testutils.Context(t), tt.errCode, tt.lookup, tt.checkResults, 0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.wantErr(t, err, fmt.Sprintf("Error assertion failed: %v", tt.name))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Sprintf("Error assertion failed: %v", tt.name)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.NewInt(123456789)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.NewInt(100)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.NewInt(18952430)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.NewInt(100)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.New("bad response")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.New("bad response")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Run(tt.name, func(t *testing.T) { client := new(evmClientMocks.Client) s := setupStreams(t) defer s.Close() payload, err := s.abi.Pack("checkCallback", tt.lookup.UpkeepId, values, tt.lookup.ExtraData) require.Nil(t, err) args := map[string]interface{}{ "from": zeroAddress, "to": s.registry.Address().Hex(), "data": hexutil.Bytes(payload), } client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", args, hexutil.EncodeUint64(tt.lookup.Block)).Return(tt.callbackErr). Run(func(args mock.Arguments) { by := args.Get(1).(*hexutil.Bytes) *by = tt.callbackResp }).Once() s.client = client err = s.CheckCallback(testutils.Context(t), tt.values, tt.lookup, tt.input, 0) tt.wantErr(t, err, fmt.Sprintf("Error assertion failed: %v", tt.name)) assert.Equal(t, uint8(tt.state), tt.input[0].PipelineExecutionState) assert.Equal(t, tt.retryable, tt.input[0].Retryable) assert.Equal(t, tt.upkeepNeeded, tt.input[0].Eligible) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.abi.Pack("checkCallback", tt.lookup.UpkeepId, values, tt.lookup.ExtraData)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.registry.Address()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Hex()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Bytes(payload)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", args, hexutil.EncodeUint64(tt.lookup.Block))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.AnythingOfType("*hexutil.Bytes")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.EncodeUint64(tt.lookup.Block)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Return(tt.callbackErr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `. Run(func(args mock.Arguments) { by := args.Get(1).(*hexutil.Bytes) *by = tt.callbackResp })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Get(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.CheckCallback(testutils.Context(t), tt.values, tt.lookup, tt.input, 0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.wantErr(t, err, fmt.Sprintf("Error assertion failed: %v", tt.name))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Sprintf("Error assertion failed: %v", tt.name)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.SetString("71022726777042968814359024671382968091267501884371696415772139504780367423725", 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.New("flaky RPC")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Run(tt.name, func(t *testing.T) { s := setupStreams(t) defer s.Close() s.registry = tt.registry client := new(evmClientMocks.Client) s.client = client mc := new(MockMercuryConfigProvider) mc.On("IsUpkeepAllowed", mock.Anything).Return(tt.allowed, tt.cached).Once() mc.On("SetUpkeepAllowed", mock.Anything, mock.Anything, mock.Anything).Return().Once() s.mercuryConfig = mc if !tt.cached { if tt.err != nil { bContractCfg, err := s.abi.Methods["getUpkeepPrivilegeConfig"].Outputs.PackValues([]interface{}{tt.config}) require.Nil(t, err) payload, err := s.abi.Pack("getUpkeepPrivilegeConfig", upkeepId) require.Nil(t, err) args := map[string]interface{}{ "to": s.registry.Address().Hex(), "data": hexutil.Bytes(payload), } client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", args, mock.AnythingOfType("string")). Return(tt.ethCallErr). Run(func(args mock.Arguments) { b := args.Get(1).(*hexutil.Bytes) *b = bContractCfg }).Once() } else { cfg := UpkeepPrivilegeConfig{MercuryEnabled: tt.allowed} bCfg, err := json.Marshal(cfg) require.Nil(t, err) bContractCfg, err := s.abi.Methods["getUpkeepPrivilegeConfig"].Outputs.PackValues([]interface{}{bCfg}) require.Nil(t, err) payload, err := s.abi.Pack("getUpkeepPrivilegeConfig", upkeepId) require.Nil(t, err) args := map[string]interface{}{ "to": s.registry.Address().Hex(), "data": hexutil.Bytes(payload), } client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", args, mock.AnythingOfType("string")).Return(nil). Run(func(args mock.Arguments) { b := args.Get(1).(*hexutil.Bytes) *b = bContractCfg }).Once() } } opts := &bind.CallOpts{ BlockNumber: big.NewInt(10), } state, reason, retryable, allowed, err := s.AllowedToUseMercury(opts, upkeepId) assert.Equal(t, tt.err, err) assert.Equal(t, tt.allowed, allowed) assert.Equal(t, tt.state, state) assert.Equal(t, tt.reason, reason) assert.Equal(t, tt.retryable, retryable) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.On("IsUpkeepAllowed", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Return(tt.allowed, tt.cached)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.On("SetUpkeepAllowed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Return()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Outputs.PackValues([]interface{}{tt.config})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.abi.Pack("getUpkeepPrivilegeConfig", upkeepId)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.registry.Address()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Hex()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Bytes(payload)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", args, mock.AnythingOfType("string"))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.AnythingOfType("*hexutil.Bytes")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.AnythingOfType("string")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `. Return(tt.ethCallErr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `. Run(func(args mock.Arguments) { b := args.Get(1).(*hexutil.Bytes) *b = bContractCfg })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Get(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Marshal(cfg)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Outputs.PackValues([]interface{}{bCfg})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.abi.Pack("getUpkeepPrivilegeConfig", upkeepId)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.registry.Address()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Hex()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Bytes(payload)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", args, mock.AnythingOfType("string"))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.AnythingOfType("*hexutil.Bytes")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.AnythingOfType("string")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `. Run(func(args mock.Arguments) { b := args.Get(1).(*hexutil.Bytes) *b = bContractCfg })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Get(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.NewInt(10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.AllowedToUseMercury(opts, upkeepId)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.SetString("71022726777042968814359024671382968091267501884371696415772139504780367423725", 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.BlockNumber(37974374)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.MustDecode("0xf055e4a200000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000024371660000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000966656564496448657800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000423078343535343438326435353533343432643431353234323439353435323535346432643534343535333534346534353534303030303030303030303030303030300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042307834323534343332643535353334343264343135323432343935343532353534643264353434353533353434653435353430303030303030303030303030303030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b626c6f636b4e756d62657200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000064000000000000000000000000")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.MustDecode("0x0000000000000000000000000000000000000064")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.MustDecode("0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063a400000000000000000000000000000000000000000000000000000000000006e0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002e000066dfcd1ed2d95b18c948dbc5bd64c687afe93e4ca7d663ddec14c20090ad80000000000000000000000000000000000000000000000000000000004555638000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000280010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001204554482d5553442d415242495452554d2d544553544e455400000000000000000000000000000000000000000000000000000000000000000000000064f0d4a0000000000000000000000000000000000000000000000000000000269ecbb83b000000000000000000000000000000000000000000000000000000269e4a4e14000000000000000000000000000000000000000000000000000000269f4d0edb000000000000000000000000000000000000000000000000000000000243716664b42d20423a47fb13ad3098b49b37f667548e6745fff958b663afe25a845f6100000000000000000000000000000000000000000000000000000000024371660000000000000000000000000000000000000000000000000000000064f0d4a00000000000000000000000000000000000000000000000000000000000000002381e91cffa9502c20de1ddcee350db3f715a5ab449448e3184a5b03c682356c6e2115f20663b3731e373cf33465a96da26f2876debb548f281e62e48f64c374200000000000000000000000000000000000000000000000000000000000000027db99e34135098d4e0bb9ae143ec9cd72fd63150c6d0cc5b38f4aa1aa42408377e8fe8e5ac489c9b7f62ff5aa7b05d2e892e7dee4cac631097247969b3b03fa300000000000000000000000000000000000000000000000000000000000002e00006da4a86c4933dd4a87b21dd2871aea29f706bcde43c70039355ac5b664fb5000000000000000000000000000000000000000000000000000000000454d118000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000280000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001204254432d5553442d415242495452554d2d544553544e455400000000000000000000000000000000000000000000000000000000000000000000000064f0d4a0000000000000000000000000000000000000000000000000000002645f00877a000000000000000000000000000000000000000000000000000002645e1e1010000000000000000000000000000000000000000000000000000002645fe2fee4000000000000000000000000000000000000000000000000000000000243716664b42d20423a47fb13ad3098b49b37f667548e6745fff958b663afe25a845f6100000000000000000000000000000000000000000000000000000000024371660000000000000000000000000000000000000000000000000000000064f0d4a00000000000000000000000000000000000000000000000000000000000000002a0373c0bce7393673f819eb9681cac2773c2d718ce933eb858252195b17a9c832d7b0bee173c02c3c25fb65912b8b13b9302ede8423bab3544cb7a8928d5eb3600000000000000000000000000000000000000000000000000000000000000027d7b79d7646383a5dbf51edf14d53bd3ad0a9f3ca8affab3165e89d3ddce9cb17b58e892fafe4ecb24d2fde07c6a756029e752a5114c33c173df4e7d309adb4d00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000064000000000000000000000000")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.MustDecode("0x00066dfcd1ed2d95b18c948dbc5bd64c687afe93e4ca7d663ddec14c20090ad80000000000000000000000000000000000000000000000000000000004555638000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000280010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001204554482d5553442d415242495452554d2d544553544e455400000000000000000000000000000000000000000000000000000000000000000000000064f0d4a0000000000000000000000000000000000000000000000000000000269ecbb83b000000000000000000000000000000000000000000000000000000269e4a4e14000000000000000000000000000000000000000000000000000000269f4d0edb000000000000000000000000000000000000000000000000000000000243716664b42d20423a47fb13ad3098b49b37f667548e6745fff958b663afe25a845f6100000000000000000000000000000000000000000000000000000000024371660000000000000000000000000000000000000000000000000000000064f0d4a00000000000000000000000000000000000000000000000000000000000000002381e91cffa9502c20de1ddcee350db3f715a5ab449448e3184a5b03c682356c6e2115f20663b3731e373cf33465a96da26f2876debb548f281e62e48f64c374200000000000000000000000000000000000000000000000000000000000000027db99e34135098d4e0bb9ae143ec9cd72fd63150c6d0cc5b38f4aa1aa42408377e8fe8e5ac489c9b7f62ff5aa7b05d2e892e7dee4cac631097247969b3b03fa3")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.MustDecode("0x0006da4a86c4933dd4a87b21dd2871aea29f706bcde43c70039355ac5b664fb5000000000000000000000000000000000000000000000000000000000454d118000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000280000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001204254432d5553442d415242495452554d2d544553544e455400000000000000000000000000000000000000000000000000000000000000000000000064f0d4a0000000000000000000000000000000000000000000000000000002645f00877a000000000000000000000000000000000000000000000000000002645e1e1010000000000000000000000000000000000000000000000000000002645fe2fee4000000000000000000000000000000000000000000000000000000000243716664b42d20423a47fb13ad3098b49b37f667548e6745fff958b663afe25a845f6100000000000000000000000000000000000000000000000000000000024371660000000000000000000000000000000000000000000000000000000064f0d4a00000000000000000000000000000000000000000000000000000000000000002a0373c0bce7393673f819eb9681cac2773c2d718ce933eb858252195b17a9c832d7b0bee173c02c3c25fb65912b8b13b9302ede8423bab3544cb7a8928d5eb3600000000000000000000000000000000000000000000000000000000000000027d7b79d7646383a5dbf51edf14d53bd3ad0a9f3ca8affab3165e89d3ddce9cb17b58e892fafe4ecb24d2fde07c6a756029e752a5114c33c173df4e7d309adb4d")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.MustDecode("0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002e000066dfcd1ed2d95b18c948dbc5bd64c687afe93e4ca7d663ddec14c20090ad80000000000000000000000000000000000000000000000000000000004555638000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000280010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001204554482d5553442d415242495452554d2d544553544e455400000000000000000000000000000000000000000000000000000000000000000000000064f0d4a0000000000000000000000000000000000000000000000000000000269ecbb83b000000000000000000000000000000000000000000000000000000269e4a4e14000000000000000000000000000000000000000000000000000000269f4d0edb000000000000000000000000000000000000000000000000000000000243716664b42d20423a47fb13ad3098b49b37f667548e6745fff958b663afe25a845f6100000000000000000000000000000000000000000000000000000000024371660000000000000000000000000000000000000000000000000000000064f0d4a00000000000000000000000000000000000000000000000000000000000000002381e91cffa9502c20de1ddcee350db3f715a5ab449448e3184a5b03c682356c6e2115f20663b3731e373cf33465a96da26f2876debb548f281e62e48f64c374200000000000000000000000000000000000000000000000000000000000000027db99e34135098d4e0bb9ae143ec9cd72fd63150c6d0cc5b38f4aa1aa42408377e8fe8e5ac489c9b7f62ff5aa7b05d2e892e7dee4cac631097247969b3b03fa300000000000000000000000000000000000000000000000000000000000002e00006da4a86c4933dd4a87b21dd2871aea29f706bcde43c70039355ac5b664fb5000000000000000000000000000000000000000000000000000000000454d118000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000280000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001204254432d5553442d415242495452554d2d544553544e455400000000000000000000000000000000000000000000000000000000000000000000000064f0d4a0000000000000000000000000000000000000000000000000000002645f00877a000000000000000000000000000000000000000000000000000002645e1e1010000000000000000000000000000000000000000000000000000002645fe2fee4000000000000000000000000000000000000000000000000000000000243716664b42d20423a47fb13ad3098b49b37f667548e6745fff958b663afe25a845f6100000000000000000000000000000000000000000000000000000000024371660000000000000000000000000000000000000000000000000000000064f0d4a00000000000000000000000000000000000000000000000000000000000000002a0373c0bce7393673f819eb9681cac2773c2d718ce933eb858252195b17a9c832d7b0bee173c02c3c25fb65912b8b13b9302ede8423bab3544cb7a8928d5eb3600000000000000000000000000000000000000000000000000000000000000027d7b79d7646383a5dbf51edf14d53bd3ad0a9f3ca8affab3165e89d3ddce9cb17b58e892fafe4ecb24d2fde07c6a756029e752a5114c33c173df4e7d309adb4d00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000064000000000000000000000000")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.MustDecode("0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002e000066dfcd1ed2d95b18c948dbc5bd64c687afe93e4ca7d663ddec14c20090ad80000000000000000000000000000000000000000000000000000000004555638000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000280010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001204554482d5553442d415242495452554d2d544553544e455400000000000000000000000000000000000000000000000000000000000000000000000064f0d4a0000000000000000000000000000000000000000000000000000000269ecbb83b000000000000000000000000000000000000000000000000000000269e4a4e14000000000000000000000000000000000000000000000000000000269f4d0edb000000000000000000000000000000000000000000000000000000000243716664b42d20423a47fb13ad3098b49b37f667548e6745fff958b663afe25a845f6100000000000000000000000000000000000000000000000000000000024371660000000000000000000000000000000000000000000000000000000064f0d4a00000000000000000000000000000000000000000000000000000000000000002381e91cffa9502c20de1ddcee350db3f715a5ab449448e3184a5b03c682356c6e2115f20663b3731e373cf33465a96da26f2876debb548f281e62e48f64c374200000000000000000000000000000000000000000000000000000000000000027db99e34135098d4e0bb9ae143ec9cd72fd63150c6d0cc5b38f4aa1aa42408377e8fe8e5ac489c9b7f62ff5aa7b05d2e892e7dee4cac631097247969b3b03fa300000000000000000000000000000000000000000000000000000000000002e00006da4a86c4933dd4a87b21dd2871aea29f706bcde43c70039355ac5b664fb5000000000000000000000000000000000000000000000000000000000454d118000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000280000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001204254432d5553442d415242495452554d2d544553544e455400000000000000000000000000000000000000000000000000000000000000000000000064f0d4a0000000000000000000000000000000000000000000000000000002645f00877a000000000000000000000000000000000000000000000000000002645e1e1010000000000000000000000000000000000000000000000000000002645fe2fee4000000000000000000000000000000000000000000000000000000000243716664b42d20423a47fb13ad3098b49b37f667548e6745fff958b663afe25a845f6100000000000000000000000000000000000000000000000000000000024371660000000000000000000000000000000000000000000000000000000064f0d4a00000000000000000000000000000000000000000000000000000000000000002a0373c0bce7393673f819eb9681cac2773c2d718ce933eb858252195b17a9c832d7b0bee173c02c3c25fb65912b8b13b9302ede8423bab3544cb7a8928d5eb3600000000000000000000000000000000000000000000000000000000000000027d7b79d7646383a5dbf51edf14d53bd3ad0a9f3ca8affab3165e89d3ddce9cb17b58e892fafe4ecb24d2fde07c6a756029e752a5114c33c173df4e7d309adb4d00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000064000000000000000000000000")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.MustDecode("0xf055e4a200000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000024371660000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000966656564496448657800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000423078343535343438326435353533343432643431353234323439353435323535346432643534343535333534346534353534303030303030303030303030303030300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042307834323534343332643535353334343264343135323432343935343532353534643264353434353533353434653435353430303030303030303030303030303030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b626c6f636b4e756d62657200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000064000000000000000000000000")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.MustDecode("0x0000000000000000000000000000000000000064")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.MustDecode("0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063a400000000000000000000000000000000000000000000000000000000000006e0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002e000066dfcd1ed2d95b18c948dbc5bd64c687afe93e4ca7d663ddec14c20090ad80000000000000000000000000000000000000000000000000000000004555638000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000280010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001204554482d5553442d415242495452554d2d544553544e455400000000000000000000000000000000000000000000000000000000000000000000000064f0d4a0000000000000000000000000000000000000000000000000000000269ecbb83b000000000000000000000000000000000000000000000000000000269e4a4e14000000000000000000000000000000000000000000000000000000269f4d0edb000000000000000000000000000000000000000000000000000000000243716664b42d20423a47fb13ad3098b49b37f667548e6745fff958b663afe25a845f6100000000000000000000000000000000000000000000000000000000024371660000000000000000000000000000000000000000000000000000000064f0d4a00000000000000000000000000000000000000000000000000000000000000002381e91cffa9502c20de1ddcee350db3f715a5ab449448e3184a5b03c682356c6e2115f20663b3731e373cf33465a96da26f2876debb548f281e62e48f64c374200000000000000000000000000000000000000000000000000000000000000027db99e34135098d4e0bb9ae143ec9cd72fd63150c6d0cc5b38f4aa1aa42408377e8fe8e5ac489c9b7f62ff5aa7b05d2e892e7dee4cac631097247969b3b03fa300000000000000000000000000000000000000000000000000000000000002e00006da4a86c4933dd4a87b21dd2871aea29f706bcde43c70039355ac5b664fb5000000000000000000000000000000000000000000000000000000000454d118000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000280000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001204254432d5553442d415242495452554d2d544553544e455400000000000000000000000000000000000000000000000000000000000000000000000064f0d4a0000000000000000000000000000000000000000000000000000002645f00877a000000000000000000000000000000000000000000000000000002645e1e1010000000000000000000000000000000000000000000000000000002645fe2fee4000000000000000000000000000000000000000000000000000000000243716664b42d20423a47fb13ad3098b49b37f667548e6745fff958b663afe25a845f6100000000000000000000000000000000000000000000000000000000024371660000000000000000000000000000000000000000000000000000000064f0d4a00000000000000000000000000000000000000000000000000000000000000002a0373c0bce7393673f819eb9681cac2773c2d718ce933eb858252195b17a9c832d7b0bee173c02c3c25fb65912b8b13b9302ede8423bab3544cb7a8928d5eb3600000000000000000000000000000000000000000000000000000000000000027d7b79d7646383a5dbf51edf14d53bd3ad0a9f3ca8affab3165e89d3ddce9cb17b58e892fafe4ecb24d2fde07c6a756029e752a5114c33c173df4e7d309adb4d00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000064000000000000000000000000")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.MustDecode("0x00066dfcd1ed2d95b18c948dbc5bd64c687afe93e4ca7d663ddec14c20090ad80000000000000000000000000000000000000000000000000000000004555638000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000280010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001204554482d5553442d415242495452554d2d544553544e455400000000000000000000000000000000000000000000000000000000000000000000000064f0d4a0000000000000000000000000000000000000000000000000000000269ecbb83b000000000000000000000000000000000000000000000000000000269e4a4e14000000000000000000000000000000000000000000000000000000269f4d0edb000000000000000000000000000000000000000000000000000000000243716664b42d20423a47fb13ad3098b49b37f667548e6745fff958b663afe25a845f6100000000000000000000000000000000000000000000000000000000024371660000000000000000000000000000000000000000000000000000000064f0d4a00000000000000000000000000000000000000000000000000000000000000002381e91cffa9502c20de1ddcee350db3f715a5ab449448e3184a5b03c682356c6e2115f20663b3731e373cf33465a96da26f2876debb548f281e62e48f64c374200000000000000000000000000000000000000000000000000000000000000027db99e34135098d4e0bb9ae143ec9cd72fd63150c6d0cc5b38f4aa1aa42408377e8fe8e5ac489c9b7f62ff5aa7b05d2e892e7dee4cac631097247969b3b03fa3")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.MustDecode("0x0006da4a86c4933dd4a87b21dd2871aea29f706bcde43c70039355ac5b664fb5000000000000000000000000000000000000000000000000000000000454d118000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000280000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001204254432d5553442d415242495452554d2d544553544e455400000000000000000000000000000000000000000000000000000000000000000000000064f0d4a0000000000000000000000000000000000000000000000000000002645f00877a000000000000000000000000000000000000000000000000000002645e1e1010000000000000000000000000000000000000000000000000000002645fe2fee4000000000000000000000000000000000000000000000000000000000243716664b42d20423a47fb13ad3098b49b37f667548e6745fff958b663afe25a845f6100000000000000000000000000000000000000000000000000000000024371660000000000000000000000000000000000000000000000000000000064f0d4a00000000000000000000000000000000000000000000000000000000000000002a0373c0bce7393673f819eb9681cac2773c2d718ce933eb858252195b17a9c832d7b0bee173c02c3c25fb65912b8b13b9302ede8423bab3544cb7a8928d5eb3600000000000000000000000000000000000000000000000000000000000000027d7b79d7646383a5dbf51edf14d53bd3ad0a9f3ca8affab3165e89d3ddce9cb17b58e892fafe4ecb24d2fde07c6a756029e752a5114c33c173df4e7d309adb4d")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.MustDecode("0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002e000066dfcd1ed2d95b18c948dbc5bd64c687afe93e4ca7d663ddec14c20090ad80000000000000000000000000000000000000000000000000000000004555638000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000280010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001204554482d5553442d415242495452554d2d544553544e455400000000000000000000000000000000000000000000000000000000000000000000000064f0d4a0000000000000000000000000000000000000000000000000000000269ecbb83b000000000000000000000000000000000000000000000000000000269e4a4e14000000000000000000000000000000000000000000000000000000269f4d0edb000000000000000000000000000000000000000000000000000000000243716664b42d20423a47fb13ad3098b49b37f667548e6745fff958b663afe25a845f6100000000000000000000000000000000000000000000000000000000024371660000000000000000000000000000000000000000000000000000000064f0d4a00000000000000000000000000000000000000000000000000000000000000002381e91cffa9502c20de1ddcee350db3f715a5ab449448e3184a5b03c682356c6e2115f20663b3731e373cf33465a96da26f2876debb548f281e62e48f64c374200000000000000000000000000000000000000000000000000000000000000027db99e34135098d4e0bb9ae143ec9cd72fd63150c6d0cc5b38f4aa1aa42408377e8fe8e5ac489c9b7f62ff5aa7b05d2e892e7dee4cac631097247969b3b03fa300000000000000000000000000000000000000000000000000000000000002e00006da4a86c4933dd4a87b21dd2871aea29f706bcde43c70039355ac5b664fb5000000000000000000000000000000000000000000000000000000000454d118000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000280000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001204254432d5553442d415242495452554d2d544553544e455400000000000000000000000000000000000000000000000000000000000000000000000064f0d4a0000000000000000000000000000000000000000000000000000002645f00877a000000000000000000000000000000000000000000000000000002645e1e1010000000000000000000000000000000000000000000000000000002645fe2fee4000000000000000000000000000000000000000000000000000000000243716664b42d20423a47fb13ad3098b49b37f667548e6745fff958b663afe25a845f6100000000000000000000000000000000000000000000000000000000024371660000000000000000000000000000000000000000000000000000000064f0d4a00000000000000000000000000000000000000000000000000000000000000002a0373c0bce7393673f819eb9681cac2773c2d718ce933eb858252195b17a9c832d7b0bee173c02c3c25fb65912b8b13b9302ede8423bab3544cb7a8928d5eb3600000000000000000000000000000000000000000000000000000000000000027d7b79d7646383a5dbf51edf14d53bd3ad0a9f3ca8affab3165e89d3ddce9cb17b58e892fafe4ecb24d2fde07c6a756029e752a5114c33c173df4e7d309adb4d00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000064000000000000000000000000")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.MustDecode("0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002e000066dfcd1ed2d95b18c948dbc5bd64c687afe93e4ca7d663ddec14c20090ad80000000000000000000000000000000000000000000000000000000004555638000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000280010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001204554482d5553442d415242495452554d2d544553544e455400000000000000000000000000000000000000000000000000000000000000000000000064f0d4a0000000000000000000000000000000000000000000000000000000269ecbb83b000000000000000000000000000000000000000000000000000000269e4a4e14000000000000000000000000000000000000000000000000000000269f4d0edb000000000000000000000000000000000000000000000000000000000243716664b42d20423a47fb13ad3098b49b37f667548e6745fff958b663afe25a845f6100000000000000000000000000000000000000000000000000000000024371660000000000000000000000000000000000000000000000000000000064f0d4a00000000000000000000000000000000000000000000000000000000000000002381e91cffa9502c20de1ddcee350db3f715a5ab449448e3184a5b03c682356c6e2115f20663b3731e373cf33465a96da26f2876debb548f281e62e48f64c374200000000000000000000000000000000000000000000000000000000000000027db99e34135098d4e0bb9ae143ec9cd72fd63150c6d0cc5b38f4aa1aa42408377e8fe8e5ac489c9b7f62ff5aa7b05d2e892e7dee4cac631097247969b3b03fa300000000000000000000000000000000000000000000000000000000000002e00006da4a86c4933dd4a87b21dd2871aea29f706bcde43c70039355ac5b664fb5000000000000000000000000000000000000000000000000000000000454d118000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000280000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001204254432d5553442d415242495452554d2d544553544e455400000000000000000000000000000000000000000000000000000000000000000000000064f0d4a0000000000000000000000000000000000000000000000000000002645f00877a000000000000000000000000000000000000000000000000000002645e1e1010000000000000000000000000000000000000000000000000000002645fe2fee4000000000000000000000000000000000000000000000000000000000243716664b42d20423a47fb13ad3098b49b37f667548e6745fff958b663afe25a845f6100000000000000000000000000000000000000000000000000000000024371660000000000000000000000000000000000000000000000000000000064f0d4a00000000000000000000000000000000000000000000000000000000000000002a0373c0bce7393673f819eb9681cac2773c2d718ce933eb858252195b17a9c832d7b0bee173c02c3c25fb65912b8b13b9302ede8423bab3544cb7a8928d5eb3600000000000000000000000000000000000000000000000000000000000000027d7b79d7646383a5dbf51edf14d53bd3ad0a9f3ca8affab3165e89d3ddce9cb17b58e892fafe4ecb24d2fde07c6a756029e752a5114c33c173df4e7d309adb4d00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000064000000000000000000000000")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.MustDecode("0xf055e4a200000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000024371660000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000766656564494473000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000423078343535343438326435353533343432643431353234323439353435323535346432643534343535333534346534353534303030303030303030303030303030300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042307834323534343332643535353334343264343135323432343935343532353534643264353434353533353434653435353430303030303030303030303030303030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b626c6f636b4e756d62657200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000064000000000000000000000000")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.MustDecode("0x0000000000000000000000000000000000000064")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.MustDecode("0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063a400000000000000000000000000000000000000000000000000000000000006e0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002e000066dfcd1ed2d95b18c948dbc5bd64c687afe93e4ca7d663ddec14c20090ad80000000000000000000000000000000000000000000000000000000004555638000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000280010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001204554482d5553442d415242495452554d2d544553544e455400000000000000000000000000000000000000000000000000000000000000000000000064f0d4a0000000000000000000000000000000000000000000000000000000269ecbb83b000000000000000000000000000000000000000000000000000000269e4a4e14000000000000000000000000000000000000000000000000000000269f4d0edb000000000000000000000000000000000000000000000000000000000243716664b42d20423a47fb13ad3098b49b37f667548e6745fff958b663afe25a845f6100000000000000000000000000000000000000000000000000000000024371660000000000000000000000000000000000000000000000000000000064f0d4a00000000000000000000000000000000000000000000000000000000000000002381e91cffa9502c20de1ddcee350db3f715a5ab449448e3184a5b03c682356c6e2115f20663b3731e373cf33465a96da26f2876debb548f281e62e48f64c374200000000000000000000000000000000000000000000000000000000000000027db99e34135098d4e0bb9ae143ec9cd72fd63150c6d0cc5b38f4aa1aa42408377e8fe8e5ac489c9b7f62ff5aa7b05d2e892e7dee4cac631097247969b3b03fa300000000000000000000000000000000000000000000000000000000000002e00006da4a86c4933dd4a87b21dd2871aea29f706bcde43c70039355ac5b664fb5000000000000000000000000000000000000000000000000000000000454d118000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000280000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001204254432d5553442d415242495452554d2d544553544e455400000000000000000000000000000000000000000000000000000000000000000000000064f0d4a0000000000000000000000000000000000000000000000000000002645f00877a000000000000000000000000000000000000000000000000000002645e1e1010000000000000000000000000000000000000000000000000000002645fe2fee4000000000000000000000000000000000000000000000000000000000243716664b42d20423a47fb13ad3098b49b37f667548e6745fff958b663afe25a845f6100000000000000000000000000000000000000000000000000000000024371660000000000000000000000000000000000000000000000000000000064f0d4a00000000000000000000000000000000000000000000000000000000000000002a0373c0bce7393673f819eb9681cac2773c2d718ce933eb858252195b17a9c832d7b0bee173c02c3c25fb65912b8b13b9302ede8423bab3544cb7a8928d5eb3600000000000000000000000000000000000000000000000000000000000000027d7b79d7646383a5dbf51edf14d53bd3ad0a9f3ca8affab3165e89d3ddce9cb17b58e892fafe4ecb24d2fde07c6a756029e752a5114c33c173df4e7d309adb4d00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000064000000000000000000000000")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.MustDecode("0x00066dfcd1ed2d95b18c948dbc5bd64c687afe93e4ca7d663ddec14c20090ad80000000000000000000000000000000000000000000000000000000004555638000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000280010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001204554482d5553442d415242495452554d2d544553544e455400000000000000000000000000000000000000000000000000000000000000000000000064f0d4a0000000000000000000000000000000000000000000000000000000269ecbb83b000000000000000000000000000000000000000000000000000000269e4a4e14000000000000000000000000000000000000000000000000000000269f4d0edb000000000000000000000000000000000000000000000000000000000243716664b42d20423a47fb13ad3098b49b37f667548e6745fff958b663afe25a845f6100000000000000000000000000000000000000000000000000000000024371660000000000000000000000000000000000000000000000000000000064f0d4a00000000000000000000000000000000000000000000000000000000000000002381e91cffa9502c20de1ddcee350db3f715a5ab449448e3184a5b03c682356c6e2115f20663b3731e373cf33465a96da26f2876debb548f281e62e48f64c374200000000000000000000000000000000000000000000000000000000000000027db99e34135098d4e0bb9ae143ec9cd72fd63150c6d0cc5b38f4aa1aa42408377e8fe8e5ac489c9b7f62ff5aa7b05d2e892e7dee4cac631097247969b3b03fa3")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.MustDecode("0x0006da4a86c4933dd4a87b21dd2871aea29f706bcde43c70039355ac5b664fb5000000000000000000000000000000000000000000000000000000000454d118000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000280000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001204254432d5553442d415242495452554d2d544553544e455400000000000000000000000000000000000000000000000000000000000000000000000064f0d4a0000000000000000000000000000000000000000000000000000002645f00877a000000000000000000000000000000000000000000000000000002645e1e1010000000000000000000000000000000000000000000000000000002645fe2fee4000000000000000000000000000000000000000000000000000000000243716664b42d20423a47fb13ad3098b49b37f667548e6745fff958b663afe25a845f6100000000000000000000000000000000000000000000000000000000024371660000000000000000000000000000000000000000000000000000000064f0d4a00000000000000000000000000000000000000000000000000000000000000002a0373c0bce7393673f819eb9681cac2773c2d718ce933eb858252195b17a9c832d7b0bee173c02c3c25fb65912b8b13b9302ede8423bab3544cb7a8928d5eb3600000000000000000000000000000000000000000000000000000000000000027d7b79d7646383a5dbf51edf14d53bd3ad0a9f3ca8affab3165e89d3ddce9cb17b58e892fafe4ecb24d2fde07c6a756029e752a5114c33c173df4e7d309adb4d")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.MustDecode("0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002e000066dfcd1ed2d95b18c948dbc5bd64c687afe93e4ca7d663ddec14c20090ad80000000000000000000000000000000000000000000000000000000004555638000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000280010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001204554482d5553442d415242495452554d2d544553544e455400000000000000000000000000000000000000000000000000000000000000000000000064f0d4a0000000000000000000000000000000000000000000000000000000269ecbb83b000000000000000000000000000000000000000000000000000000269e4a4e14000000000000000000000000000000000000000000000000000000269f4d0edb000000000000000000000000000000000000000000000000000000000243716664b42d20423a47fb13ad3098b49b37f667548e6745fff958b663afe25a845f6100000000000000000000000000000000000000000000000000000000024371660000000000000000000000000000000000000000000000000000000064f0d4a00000000000000000000000000000000000000000000000000000000000000002381e91cffa9502c20de1ddcee350db3f715a5ab449448e3184a5b03c682356c6e2115f20663b3731e373cf33465a96da26f2876debb548f281e62e48f64c374200000000000000000000000000000000000000000000000000000000000000027db99e34135098d4e0bb9ae143ec9cd72fd63150c6d0cc5b38f4aa1aa42408377e8fe8e5ac489c9b7f62ff5aa7b05d2e892e7dee4cac631097247969b3b03fa300000000000000000000000000000000000000000000000000000000000002e00006da4a86c4933dd4a87b21dd2871aea29f706bcde43c70039355ac5b664fb5000000000000000000000000000000000000000000000000000000000454d118000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000280000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001204254432d5553442d415242495452554d2d544553544e455400000000000000000000000000000000000000000000000000000000000000000000000064f0d4a0000000000000000000000000000000000000000000000000000002645f00877a000000000000000000000000000000000000000000000000000002645e1e1010000000000000000000000000000000000000000000000000000002645fe2fee4000000000000000000000000000000000000000000000000000000000243716664b42d20423a47fb13ad3098b49b37f667548e6745fff958b663afe25a845f6100000000000000000000000000000000000000000000000000000000024371660000000000000000000000000000000000000000000000000000000064f0d4a00000000000000000000000000000000000000000000000000000000000000002a0373c0bce7393673f819eb9681cac2773c2d718ce933eb858252195b17a9c832d7b0bee173c02c3c25fb65912b8b13b9302ede8423bab3544cb7a8928d5eb3600000000000000000000000000000000000000000000000000000000000000027d7b79d7646383a5dbf51edf14d53bd3ad0a9f3ca8affab3165e89d3ddce9cb17b58e892fafe4ecb24d2fde07c6a756029e752a5114c33c173df4e7d309adb4d00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000064000000000000000000000000")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.MustDecode("0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002e000066dfcd1ed2d95b18c948dbc5bd64c687afe93e4ca7d663ddec14c20090ad80000000000000000000000000000000000000000000000000000000004555638000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000280010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001204554482d5553442d415242495452554d2d544553544e455400000000000000000000000000000000000000000000000000000000000000000000000064f0d4a0000000000000000000000000000000000000000000000000000000269ecbb83b000000000000000000000000000000000000000000000000000000269e4a4e14000000000000000000000000000000000000000000000000000000269f4d0edb000000000000000000000000000000000000000000000000000000000243716664b42d20423a47fb13ad3098b49b37f667548e6745fff958b663afe25a845f6100000000000000000000000000000000000000000000000000000000024371660000000000000000000000000000000000000000000000000000000064f0d4a00000000000000000000000000000000000000000000000000000000000000002381e91cffa9502c20de1ddcee350db3f715a5ab449448e3184a5b03c682356c6e2115f20663b3731e373cf33465a96da26f2876debb548f281e62e48f64c374200000000000000000000000000000000000000000000000000000000000000027db99e34135098d4e0bb9ae143ec9cd72fd63150c6d0cc5b38f4aa1aa42408377e8fe8e5ac489c9b7f62ff5aa7b05d2e892e7dee4cac631097247969b3b03fa300000000000000000000000000000000000000000000000000000000000002e00006da4a86c4933dd4a87b21dd2871aea29f706bcde43c70039355ac5b664fb5000000000000000000000000000000000000000000000000000000000454d118000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000280000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001204254432d5553442d415242495452554d2d544553544e455400000000000000000000000000000000000000000000000000000000000000000000000064f0d4a0000000000000000000000000000000000000000000000000000002645f00877a000000000000000000000000000000000000000000000000000002645e1e1010000000000000000000000000000000000000000000000000000002645fe2fee4000000000000000000000000000000000000000000000000000000000243716664b42d20423a47fb13ad3098b49b37f667548e6745fff958b663afe25a845f6100000000000000000000000000000000000000000000000000000000024371660000000000000000000000000000000000000000000000000000000064f0d4a00000000000000000000000000000000000000000000000000000000000000002a0373c0bce7393673f819eb9681cac2773c2d718ce933eb858252195b17a9c832d7b0bee173c02c3c25fb65912b8b13b9302ede8423bab3544cb7a8928d5eb3600000000000000000000000000000000000000000000000000000000000000027d7b79d7646383a5dbf51edf14d53bd3ad0a9f3ca8affab3165e89d3ddce9cb17b58e892fafe4ecb24d2fde07c6a756029e752a5114c33c173df4e7d309adb4d00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000064000000000000000000000000")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.MustDecode("0xf055e4a200000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000166665656449644865783a52616e646f6d537472696e670000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000074554442d5553440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074254432d45544800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b626c6f636b4e756d62657200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043078303000000000000000000000000000000000000000000000000000000000")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.MustDecode("0xf055e4a200000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000166665656449644865783a52616e646f6d537472696e670000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000074554442d5553440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074254432d45544800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b626c6f636b4e756d62657200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043078303000000000000000000000000000000000000000000000000000000000")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Run(tt.name, func(t *testing.T) { s := setupStreams(t) defer s.Close() s.registry = tt.registry client := new(evmClientMocks.Client) s.client = client mc := new(MockMercuryConfigProvider) mc.On("IsUpkeepAllowed", mock.Anything).Return(tt.hasPermission, tt.cachedAdminCfg).Once() mc.On("SetUpkeepAllowed", mock.Anything, mock.Anything, mock.Anything).Return().Once() s.mercuryConfig = mc if !tt.cachedAdminCfg && !tt.hasError { cfg := UpkeepPrivilegeConfig{MercuryEnabled: tt.hasPermission} bCfg, err := json.Marshal(cfg) require.Nil(t, err) bContractCfg, err := s.abi.Methods["getUpkeepPrivilegeConfig"].Outputs.PackValues([]interface{}{bCfg}) require.Nil(t, err) payload, err := s.abi.Pack("getUpkeepPrivilegeConfig", upkeepId) require.Nil(t, err) args := map[string]interface{}{ "to": s.registry.Address().Hex(), "data": hexutil.Bytes(payload), } client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", args, mock.AnythingOfType("string")).Return(nil). Run(func(args mock.Arguments) { b := args.Get(1).(*hexutil.Bytes) *b = bContractCfg }).Once() } if len(tt.blobs) > 0 { if tt.v3 { hc03 := new(MockHttpClient) v03HttpClient := v03.NewClient(s.mercuryConfig, hc03, s.threadCtrl, s.lggr) s.v03Client = v03HttpClient mr1 := v03.MercuryV03Response{ Reports: []v03.MercuryV03Report{{FullReport: tt.blobs["0x4554482d5553442d415242495452554d2d544553544e45540000000000000000"]}, {FullReport: tt.blobs["0x4254432d5553442d415242495452554d2d544553544e45540000000000000000"]}}} b1, err := json.Marshal(mr1) assert.Nil(t, err) resp1 := &http.Response{ StatusCode: http.StatusOK, Body: io.NopCloser(bytes.NewReader(b1)), } hc03.On("Do", mock.Anything).Return(resp1, nil).Once() } else { hc02 := new(MockHttpClient) v02HttpClient := v02.NewClient(s.mercuryConfig, hc02, s.threadCtrl, s.lggr) s.v02Client = v02HttpClient mr1 := v02.MercuryV02Response{ChainlinkBlob: tt.blobs["0x4554482d5553442d415242495452554d2d544553544e45540000000000000000"]} b1, err := json.Marshal(mr1) assert.Nil(t, err) resp1 := &http.Response{ StatusCode: http.StatusOK, Body: io.NopCloser(bytes.NewReader(b1)), } mr2 := v02.MercuryV02Response{ChainlinkBlob: tt.blobs["0x4254432d5553442d415242495452554d2d544553544e45540000000000000000"]} b2, err := json.Marshal(mr2) assert.Nil(t, err) resp2 := &http.Response{ StatusCode: http.StatusOK, Body: io.NopCloser(bytes.NewReader(b2)), } hc02.On("Do", mock.MatchedBy(func(req *http.Request) bool { return strings.Contains(req.URL.String(), "0x4254432d5553442d415242495452554d2d544553544e45540000000000000000") })).Return(resp2, nil).Once() hc02.On("Do", mock.MatchedBy(func(req *http.Request) bool { return strings.Contains(req.URL.String(), "0x4554482d5553442d415242495452554d2d544553544e45540000000000000000") })).Return(resp1, nil).Once() } } if tt.callbackNeeded { payload, err := s.abi.Pack("checkCallback", upkeepId, tt.values, tt.extraData) require.Nil(t, err) args := map[string]interface{}{ "from": zeroAddress, "to": s.registry.Address().Hex(), "data": hexutil.Bytes(payload), } client.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", args, hexutil.EncodeUint64(uint64(blockNum))).Return(nil). Run(func(args mock.Arguments) { b := args.Get(1).(*hexutil.Bytes) *b = tt.checkCallbackResp }).Once() } got := s.Lookup(testutils.Context(t), tt.input) assert.Equal(t, tt.expectedResults, got, tt.name) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.On("IsUpkeepAllowed", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Return(tt.hasPermission, tt.cachedAdminCfg)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.On("SetUpkeepAllowed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Return()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Marshal(cfg)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Outputs.PackValues([]interface{}{bCfg})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.abi.Pack("getUpkeepPrivilegeConfig", upkeepId)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.registry.Address()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Hex()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Bytes(payload)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", args, mock.AnythingOfType("string"))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.AnythingOfType("*hexutil.Bytes")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.AnythingOfType("string")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `. Run(func(args mock.Arguments) { b := args.Get(1).(*hexutil.Bytes) *b = bContractCfg })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Get(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.NewClient(s.mercuryConfig, hc03, s.threadCtrl, s.lggr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Marshal(mr1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.NopCloser(bytes.NewReader(b1))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.NewReader(b1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Return(resp1, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.NewClient(s.mercuryConfig, hc02, s.threadCtrl, s.lggr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Marshal(mr1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.NopCloser(bytes.NewReader(b1))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.NewReader(b1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Marshal(mr2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.NopCloser(bytes.NewReader(b2))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.NewReader(b2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.On("Do", mock.MatchedBy(func(req *http.Request) bool { return strings.Contains(req.URL.String(), "0x4254432d5553442d415242495452554d2d544553544e45540000000000000000") }))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.MatchedBy(func(req *http.Request) bool { return strings.Contains(req.URL.String(), "0x4254432d5553442d415242495452554d2d544553544e45540000000000000000") })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Contains(req.URL.String(), "0x4254432d5553442d415242495452554d2d544553544e45540000000000000000")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.URL.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Return(resp2, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.On("Do", mock.MatchedBy(func(req *http.Request) bool { return strings.Contains(req.URL.String(), "0x4554482d5553442d415242495452554d2d544553544e45540000000000000000") }))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.MatchedBy(func(req *http.Request) bool { return strings.Contains(req.URL.String(), "0x4554482d5553442d415242495452554d2d544553544e45540000000000000000") })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Contains(req.URL.String(), "0x4554482d5553442d415242495452554d2d544553544e45540000000000000000")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.URL.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Return(resp1, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.abi.Pack("checkCallback", upkeepId, tt.values, tt.extraData)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.registry.Address()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Hex()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Bytes(payload)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.On("CallContext", mock.Anything, mock.AnythingOfType("*hexutil.Bytes"), "eth_call", args, hexutil.EncodeUint64(uint64(blockNum)))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.AnythingOfType("*hexutil.Bytes")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.EncodeUint64(uint64(blockNum))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `. Run(func(args mock.Arguments) { b := args.Get(1).(*hexutil.Bytes) *b = tt.checkCallbackResp })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Get(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Lookup(testutils.Context(t), tt.input)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `t.Run(tt.name, func(t *testing.T) { c := setupClient(t) defer c.Close() hc := new(MockHttpClient) mr := MercuryV02Response{ChainlinkBlob: tt.blob} b, err := json.Marshal(mr) assert.Nil(t, err) if tt.responseBytes != "" { b = []byte(tt.responseBytes) } if tt.retryNumber == 0 { if tt.errorMessage != "" { resp := &http.Response{ StatusCode: tt.statusCode, Body: io.NopCloser(bytes.NewReader(b)), } hc.On("Do", mock.Anything).Return(resp, nil).Once() } else { resp := &http.Response{ StatusCode: http.StatusOK, Body: io.NopCloser(bytes.NewReader(b)), } hc.On("Do", mock.Anything).Return(resp, nil).Once() } } else if tt.retryNumber > 0 && tt.retryNumber < totalAttempt { retryResp := &http.Response{ StatusCode: tt.statusCode, Body: io.NopCloser(bytes.NewReader(b)), } hc.On("Do", mock.Anything).Return(retryResp, nil).Times(tt.retryNumber) resp := &http.Response{ StatusCode: tt.lastStatusCode, Body: io.NopCloser(bytes.NewReader(b)), } hc.On("Do", mock.Anything).Return(resp, nil).Once() } else { resp := &http.Response{ StatusCode: tt.statusCode, Body: io.NopCloser(bytes.NewReader(b)), } hc.On("Do", mock.Anything).Return(resp, nil).Times(tt.retryNumber) } c.httpClient = hc ch := make(chan mercury.MercuryData, 1) c.singleFeedRequest(testutils.Context(t), ch, tt.index, tt.lookup) m := <-ch assert.Equal(t, tt.index, m.Index) assert.Equal(t, tt.retryable, m.Retryable) assert.Equal(t, tt.state, m.State) if tt.streamsErrCode != encoding.ErrCodeNil { assert.Equal(t, tt.streamsErrCode, m.ErrCode) assert.Equal(t, [][]byte(nil), m.Bytes) } else if tt.retryNumber >= totalAttempt || tt.errorMessage != "" { assert.Equal(t, tt.errorMessage, m.Error.Error()) assert.Equal(t, [][]byte(nil), m.Bytes) } else { blobBytes, err := hexutil.Decode(tt.blob) assert.Nil(t, err) assert.Nil(t, m.Error) assert.Equal(t, [][]byte{blobBytes}, m.Bytes) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `b = []byte(tt.responseBytes)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `hc.On("Do", mock.Anything).Return(resp, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `hc.On("Do", mock.Anything).Return(resp, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `hc.On("Do", mock.Anything).Return(retryResp, nil).Times(tt.retryNumber)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `hc.On("Do", mock.Anything).Return(resp, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `hc.On("Do", mock.Anything).Return(resp, nil).Times(tt.retryNumber)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `c.httpClient = hc` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `c.singleFeedRequest(testutils.Context(t), ch, tt.index, tt.lookup)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `t.Run(tt.name, func(t *testing.T) { c := setupClient(t) defer c.Close() if tt.pluginRetries != 0 { c.mercuryConfig.SetPluginRetry(pluginRetryKey, tt.pluginRetries, cache.DefaultExpiration) } hc := new(MockHttpClient) for _, blob := range tt.mockChainlinkBlobs { mr := MercuryV02Response{ChainlinkBlob: blob} b, err := json.Marshal(mr) assert.Nil(t, err) resp := &http.Response{ StatusCode: tt.mockHttpStatusCode, Body: io.NopCloser(bytes.NewReader(b)), } if tt.expectedErrCode != encoding.ErrCodeNil { hc.On("Do", mock.Anything).Return(resp, nil).Times(totalAttempt) } else { hc.On("Do", mock.Anything).Return(resp, nil).Once() } } c.httpClient = hc state, values, errCode, retryable, retryInterval, reqErr := c.DoRequest(testutils.Context(t), tt.lookup, tt.upkeepType, pluginRetryKey) assert.Equal(t, tt.expectedValues, values) assert.Equal(t, tt.expectedRetryable, retryable) if retryable { newRetries, _ := c.mercuryConfig.GetPluginRetry(pluginRetryKey) assert.Equal(t, tt.pluginRetries+1, newRetries.(int)) } assert.Equal(t, tt.expectedRetryInterval, retryInterval) assert.Equal(t, tt.expectedErrCode, errCode) assert.Equal(t, tt.expectedState, state) if tt.expectedError != nil { assert.True(t, strings.HasPrefix(reqErr.Error(), "failed to request feed for 0x4554482d5553442d415242495452554d2d544553544e45540000000000000000")) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `c.mercuryConfig.SetPluginRetry(pluginRetryKey, tt.pluginRetries, cache.DefaultExpiration)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `hc.On("Do", mock.Anything).Return(resp, nil).Times(totalAttempt)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `hc.On("Do", mock.Anything).Return(resp, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `c.httpClient = hc` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `c.mercuryConfig.SetPluginRetry(pluginRetryKey, 0, cache.DefaultExpiration)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `hc.On("Do", mock.Anything).Return(resp, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `c.httpClient = hc` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `c.mercuryConfig.SetPluginRetry(pluginRetryKey, 0, cache.DefaultExpiration)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `hc.On("Do", mock.Anything).Return(resp, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `hc.On("Do", mock.Anything).Run(func(args mock.Arguments) { time.Sleep(serverTimeout) }).Return(resp2, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `time.Sleep(serverTimeout)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `c.httpClient = hc` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `c.mercuryConfig.SetPluginRetry(pluginRetryKey, 0, cache.DefaultExpiration)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `hc.On("Do", mock.Anything).Return(resp, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `resp = &http.Response{ StatusCode: http.StatusServiceUnavailable, Body: io.NopCloser(bytes.NewReader(b)), }` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `hc.On("Do", mock.Anything).Return(resp, nil).Times(totalAttempt)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `c.httpClient = hc` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `c.mercuryConfig.SetPluginRetry(pluginRetryKey, 0, cache.DefaultExpiration)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `hc.On("Do", mock.Anything).Return(resp, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `resp = &http.Response{ StatusCode: http.StatusOK, Body: io.NopCloser(bytes.NewReader([]byte{})), }` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `hc.On("Do", mock.Anything).Return(resp, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `c.httpClient = hc` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `c.mercuryConfig.SetPluginRetry(pluginRetryKey, 0, cache.DefaultExpiration)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `hc.On("Do", mock.Anything).Return(resp, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `resp = &http.Response{ StatusCode: http.StatusGatewayTimeout, Body: io.NopCloser(bytes.NewReader(b)), }` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `hc.On("Do", mock.Anything).Return(resp, nil).Times(totalAttempt)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `c.httpClient = hc` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewInt(123456789)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewInt(123456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewInt(123456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewInt(123456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewInt(123456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewInt(123456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewInt(123456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewInt(123456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewInt(123456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewInt(123456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewInt(123456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewInt(123456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Run(tt.name, func(t *testing.T) { c := setupClient(t) defer c.Close() hc := new(MockHttpClient) mr := MercuryV02Response{ChainlinkBlob: tt.blob} b, err := json.Marshal(mr) assert.Nil(t, err) if tt.responseBytes != "" { b = []byte(tt.responseBytes) } if tt.retryNumber == 0 { if tt.errorMessage != "" { resp := &http.Response{ StatusCode: tt.statusCode, Body: io.NopCloser(bytes.NewReader(b)), } hc.On("Do", mock.Anything).Return(resp, nil).Once() } else { resp := &http.Response{ StatusCode: http.StatusOK, Body: io.NopCloser(bytes.NewReader(b)), } hc.On("Do", mock.Anything).Return(resp, nil).Once() } } else if tt.retryNumber > 0 && tt.retryNumber < totalAttempt { retryResp := &http.Response{ StatusCode: tt.statusCode, Body: io.NopCloser(bytes.NewReader(b)), } hc.On("Do", mock.Anything).Return(retryResp, nil).Times(tt.retryNumber) resp := &http.Response{ StatusCode: tt.lastStatusCode, Body: io.NopCloser(bytes.NewReader(b)), } hc.On("Do", mock.Anything).Return(resp, nil).Once() } else { resp := &http.Response{ StatusCode: tt.statusCode, Body: io.NopCloser(bytes.NewReader(b)), } hc.On("Do", mock.Anything).Return(resp, nil).Times(tt.retryNumber) } c.httpClient = hc ch := make(chan mercury.MercuryData, 1) c.singleFeedRequest(testutils.Context(t), ch, tt.index, tt.lookup) m := <-ch assert.Equal(t, tt.index, m.Index) assert.Equal(t, tt.retryable, m.Retryable) assert.Equal(t, tt.state, m.State) if tt.streamsErrCode != encoding.ErrCodeNil { assert.Equal(t, tt.streamsErrCode, m.ErrCode) assert.Equal(t, [][]byte(nil), m.Bytes) } else if tt.retryNumber >= totalAttempt || tt.errorMessage != "" { assert.Equal(t, tt.errorMessage, m.Error.Error()) assert.Equal(t, [][]byte(nil), m.Bytes) } else { blobBytes, err := hexutil.Decode(tt.blob) assert.Nil(t, err) assert.Nil(t, m.Error) assert.Equal(t, [][]byte{blobBytes}, m.Bytes) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Marshal(mr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NopCloser(bytes.NewReader(b))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewReader(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Return(resp, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NopCloser(bytes.NewReader(b))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewReader(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Return(resp, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NopCloser(bytes.NewReader(b))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewReader(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Return(retryResp, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Times(tt.retryNumber)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NopCloser(bytes.NewReader(b))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewReader(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Return(resp, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NopCloser(bytes.NewReader(b))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewReader(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Return(resp, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Times(tt.retryNumber)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.singleFeedRequest(testutils.Context(t), ch, tt.index, tt.lookup)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Decode(tt.blob)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.SetString("88786950015966611018675766524283132478093844178961698330929478019253453382042", 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewInt(25880526)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewInt(25880526)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewInt(25880526)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewInt(25880526)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.New("failed to request feed for 0x4554482d5553442d415242495452554d2d544553544e45540000000000000000: All attempts fail:\n#1: 500\n#2: 500\n#3: 500")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewInt(25880526)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.New("failed to request feed for 0x4554482d5553442d415242495452554d2d544553544e45540000000000000000: All attempts fail:\n#1: 500\n#2: 500\n#3: 500")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewInt(25880526)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewInt(25880526)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewInt(25880526)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewInt(25880526)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Run(tt.name, func(t *testing.T) { c := setupClient(t) defer c.Close() if tt.pluginRetries != 0 { c.mercuryConfig.SetPluginRetry(pluginRetryKey, tt.pluginRetries, cache.DefaultExpiration) } hc := new(MockHttpClient) for _, blob := range tt.mockChainlinkBlobs { mr := MercuryV02Response{ChainlinkBlob: blob} b, err := json.Marshal(mr) assert.Nil(t, err) resp := &http.Response{ StatusCode: tt.mockHttpStatusCode, Body: io.NopCloser(bytes.NewReader(b)), } if tt.expectedErrCode != encoding.ErrCodeNil { hc.On("Do", mock.Anything).Return(resp, nil).Times(totalAttempt) } else { hc.On("Do", mock.Anything).Return(resp, nil).Once() } } c.httpClient = hc state, values, errCode, retryable, retryInterval, reqErr := c.DoRequest(testutils.Context(t), tt.lookup, tt.upkeepType, pluginRetryKey) assert.Equal(t, tt.expectedValues, values) assert.Equal(t, tt.expectedRetryable, retryable) if retryable { newRetries, _ := c.mercuryConfig.GetPluginRetry(pluginRetryKey) assert.Equal(t, tt.pluginRetries+1, newRetries.(int)) } assert.Equal(t, tt.expectedRetryInterval, retryInterval) assert.Equal(t, tt.expectedErrCode, errCode) assert.Equal(t, tt.expectedState, state) if tt.expectedError != nil { assert.True(t, strings.HasPrefix(reqErr.Error(), "failed to request feed for 0x4554482d5553442d415242495452554d2d544553544e45540000000000000000")) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.mercuryConfig.SetPluginRetry(pluginRetryKey, tt.pluginRetries, cache.DefaultExpiration)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Marshal(mr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NopCloser(bytes.NewReader(b))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewReader(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Return(resp, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Times(totalAttempt)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Return(resp, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.DoRequest(testutils.Context(t), tt.lookup, tt.upkeepType, pluginRetryKey)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.mercuryConfig.GetPluginRetry(pluginRetryKey)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.SetString("88786950015966611018675766524283132478093844178961698330929478019253453382042", 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.mercuryConfig.SetPluginRetry(pluginRetryKey, 0, cache.DefaultExpiration)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Marshal(mr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NopCloser(bytes.NewReader(b))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewReader(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Return(resp, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewInt(25880526)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.DoRequest(testutils.Context(t), lookup, automationTypes.ConditionTrigger, pluginRetryKey)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.SetString("88786950015966611018675766524283132478093844178961698330929478019253453382042", 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.mercuryConfig.SetPluginRetry(pluginRetryKey, 0, cache.DefaultExpiration)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Marshal(mr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NopCloser(bytes.NewReader(b))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewReader(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Return(resp, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NopCloser(bytes.NewReader([]byte{}))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewReader([]byte{})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Run(func(args mock.Arguments) { time.Sleep(serverTimeout) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Sleep(serverTimeout)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Return(resp2, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewInt(25880526)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Now()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.DoRequest(testutils.Context(t), lookup, automationTypes.ConditionTrigger, pluginRetryKey)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Since(start)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.SetString("88786950015966611018675766524283132478093844178961698330929478019253453382042", 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.mercuryConfig.SetPluginRetry(pluginRetryKey, 0, cache.DefaultExpiration)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Marshal(mr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NopCloser(bytes.NewReader(b))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewReader(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Return(resp, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NopCloser(bytes.NewReader(b))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewReader(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Return(resp, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Times(totalAttempt)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewInt(25880526)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.DoRequest(testutils.Context(t), lookup, automationTypes.LogTrigger, pluginRetryKey)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.SetString("88786950015966611018675766524283132478093844178961698330929478019253453382042", 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.mercuryConfig.SetPluginRetry(pluginRetryKey, 0, cache.DefaultExpiration)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Marshal(mr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NopCloser(bytes.NewReader(b))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewReader(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Return(resp, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NopCloser(bytes.NewReader([]byte{}))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewReader([]byte{})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Return(resp, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewInt(25880526)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.DoRequest(testutils.Context(t), lookup, automationTypes.LogTrigger, pluginRetryKey)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.SetString("88786950015966611018675766524283132478093844178961698330929478019253453382042", 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.mercuryConfig.SetPluginRetry(pluginRetryKey, 0, cache.DefaultExpiration)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Marshal(mr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NopCloser(bytes.NewReader(b))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewReader(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Return(resp, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NopCloser(bytes.NewReader(b))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewReader(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Return(resp, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Times(totalAttempt)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.NewInt(25880526)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.DoRequest(testutils.Context(t), lookup, automationTypes.ConditionTrigger, pluginRetryKey)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `t.Run(tt.name, func(t *testing.T) { c := setupClient(t) defer c.Close() hc := mocks.NewHttpClient(t) mr := MercuryV03Response{} for i, blob := range tt.mockChainlinkBlobs { r := MercuryV03Report{ FeedID: tt.lookup.Feeds[i], ValidFromTimestamp: 0, ObservationsTimestamp: 0, FullReport: blob, } mr.Reports = append(mr.Reports, r) } b, err := json.Marshal(mr) assert.Nil(t, err) resp := &http.Response{ StatusCode: tt.mockHttpStatusCode, Body: io.NopCloser(bytes.NewReader(b)), } if tt.expectedError != nil && tt.expectedRetryable { hc.On("Do", mock.Anything).Return(resp, nil).Times(totalAttempt) } else { hc.On("Do", mock.Anything).Return(resp, nil).Once() } c.httpClient = hc state, values, errCode, retryable, retryInterval, reqErr := c.DoRequest(testutils.Context(t), tt.lookup, automationTypes.ConditionTrigger, tt.pluginRetryKey) assert.Equal(t, tt.expectedValues, values) assert.Equal(t, tt.expectedRetryable, retryable) assert.Equal(t, tt.expectedRetryInterval, retryInterval) assert.Equal(t, tt.state, state) assert.Equal(t, tt.expectedErrCode, errCode) if tt.expectedError != nil { assert.Equal(t, tt.expectedError.Error(), reqErr.Error()) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `mr.Reports = append(mr.Reports, r)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `hc.On("Do", mock.Anything).Return(resp, nil).Times(totalAttempt)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `hc.On("Do", mock.Anything).Return(resp, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `c.httpClient = hc` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `c.mercuryConfig.SetPluginRetry(pluginRetryKey, 0, cache.DefaultExpiration)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `hc.On("Do", mock.Anything).Return(resp, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `c.httpClient = hc` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `c.mercuryConfig.SetPluginRetry(pluginRetryKey, 0, cache.DefaultExpiration)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `hc.On("Do", mock.Anything).Run(func(args mock.Arguments) { time.Sleep(serverTimeout) }).Return(resp, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `time.Sleep(serverTimeout)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `c.httpClient = hc` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `c.mercuryConfig.SetPluginRetry(pluginRetryKey, 0, cache.DefaultExpiration)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `hc.On("Do", mock.Anything).Return(resp, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `resp = &http.Response{ StatusCode: http.StatusBadGateway, Body: io.NopCloser(bytes.NewReader(b)), }` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `hc.On("Do", mock.Anything).Return(resp, nil).Times(totalAttempt)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `c.httpClient = hc` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `c.mercuryConfig.SetPluginRetry(pluginRetryKey, 0, cache.DefaultExpiration)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `hc.On("Do", mock.Anything).Return(resp, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `b, err = json.Marshal(invalidResponse)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `resp = &http.Response{ StatusCode: http.StatusOK, Body: io.NopCloser(bytes.NewReader(b)), }` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `hc.On("Do", mock.Anything).Return(resp, nil).Times(totalAttempt)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `c.httpClient = hc` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `t.Run(tt.name, func(t *testing.T) { c := setupClient(t) defer c.Close() if tt.pluginRetries != 0 { c.mercuryConfig.SetPluginRetry(tt.pluginRetryKey, tt.pluginRetries, cache.DefaultExpiration) } hc := new(MockHttpClient) b, err := json.Marshal(tt.response) assert.Nil(t, err) if tt.retryNumber == 0 { resp := &http.Response{ StatusCode: tt.statusCode, Body: io.NopCloser(bytes.NewReader(b)), } hc.On("Do", mock.Anything).Return(resp, nil).Once() } else if tt.retryNumber < totalAttempt { if tt.firstResponse != nil && tt.response != nil { b0, err := json.Marshal(tt.firstResponse) assert.Nil(t, err) resp0 := &http.Response{ StatusCode: tt.statusCode, Body: io.NopCloser(bytes.NewReader(b0)), } b1, err := json.Marshal(tt.response) assert.Nil(t, err) resp1 := &http.Response{ StatusCode: tt.lastStatusCode, Body: io.NopCloser(bytes.NewReader(b1)), } hc.On("Do", mock.Anything).Return(resp0, nil).Once().On("Do", mock.Anything).Return(resp1, nil).Once() } else { retryResp := &http.Response{ StatusCode: tt.statusCode, Body: io.NopCloser(bytes.NewReader(b)), } hc.On("Do", mock.Anything).Return(retryResp, nil).Times(tt.retryNumber) resp := &http.Response{ StatusCode: tt.lastStatusCode, Body: io.NopCloser(bytes.NewReader(b)), } hc.On("Do", mock.Anything).Return(resp, nil).Once() } } else { for i := 1; i <= tt.retryNumber; i++ { resp := &http.Response{ StatusCode: tt.statusCode, Body: io.NopCloser(bytes.NewReader(b)), } hc.On("Do", mock.Anything).Return(resp, nil).Once() } } c.httpClient = hc ch := make(chan mercury.MercuryData, 1) c.multiFeedsRequest(testutils.Context(t), ch, tt.lookup) m := <-ch assert.Equal(t, 0, m.Index) assert.Equal(t, tt.retryable, m.Retryable) if tt.streamsErrCode != encoding.ErrCodeNil { assert.Equal(t, tt.streamsErrCode, m.ErrCode) assert.Equal(t, tt.state, m.State) assert.Equal(t, [][]byte(nil), m.Bytes) } else if tt.retryNumber >= totalAttempt || tt.errorMessage != "" { assert.Equal(t, tt.errorMessage, m.Error.Error()) assert.Equal(t, [][]byte(nil), m.Bytes) } else { assert.Nil(t, m.Error) var reports [][]byte for _, rsp := range tt.response.Reports { b, _ := hexutil.Decode(rsp.FullReport) reports = append(reports, b) } assert.Equal(t, reports, m.Bytes) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `c.mercuryConfig.SetPluginRetry(tt.pluginRetryKey, tt.pluginRetries, cache.DefaultExpiration)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `hc.On("Do", mock.Anything).Return(resp, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `hc.On("Do", mock.Anything).Return(resp0, nil).Once().On("Do", mock.Anything).Return(resp1, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `hc.On("Do", mock.Anything).Return(retryResp, nil).Times(tt.retryNumber)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `hc.On("Do", mock.Anything).Return(resp, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `hc.On("Do", mock.Anything).Return(resp, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `c.httpClient = hc` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `c.multiFeedsRequest(testutils.Context(t), ch, tt.lookup)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `reports = append(reports, b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.SetString("88786950015966611018675766524283132478093844178961698330929478019253453382042", 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewInt(25880526)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Run(tt.name, func(t *testing.T) { c := setupClient(t) defer c.Close() hc := mocks.NewHttpClient(t) mr := MercuryV03Response{} for i, blob := range tt.mockChainlinkBlobs { r := MercuryV03Report{ FeedID: tt.lookup.Feeds[i], ValidFromTimestamp: 0, ObservationsTimestamp: 0, FullReport: blob, } mr.Reports = append(mr.Reports, r) } b, err := json.Marshal(mr) assert.Nil(t, err) resp := &http.Response{ StatusCode: tt.mockHttpStatusCode, Body: io.NopCloser(bytes.NewReader(b)), } if tt.expectedError != nil && tt.expectedRetryable { hc.On("Do", mock.Anything).Return(resp, nil).Times(totalAttempt) } else { hc.On("Do", mock.Anything).Return(resp, nil).Once() } c.httpClient = hc state, values, errCode, retryable, retryInterval, reqErr := c.DoRequest(testutils.Context(t), tt.lookup, automationTypes.ConditionTrigger, tt.pluginRetryKey) assert.Equal(t, tt.expectedValues, values) assert.Equal(t, tt.expectedRetryable, retryable) assert.Equal(t, tt.expectedRetryInterval, retryInterval) assert.Equal(t, tt.state, state) assert.Equal(t, tt.expectedErrCode, errCode) if tt.expectedError != nil { assert.Equal(t, tt.expectedError.Error(), reqErr.Error()) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewHttpClient(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Marshal(mr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NopCloser(bytes.NewReader(b))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewReader(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Return(resp, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Times(totalAttempt)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Return(resp, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.DoRequest(testutils.Context(t), tt.lookup, automationTypes.ConditionTrigger, tt.pluginRetryKey)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.SetString("88786950015966611018675766524283132478093844178961698330929478019253453382042", 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.mercuryConfig.SetPluginRetry(pluginRetryKey, 0, cache.DefaultExpiration)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Marshal(mr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NopCloser(bytes.NewReader(b))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewReader(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Return(resp, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewInt(25880526)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.DoRequest(testutils.Context(t), lookup, automationTypes.ConditionTrigger, pluginRetryKey)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.SetString("88786950015966611018675766524283132478093844178961698330929478019253453382042", 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.mercuryConfig.SetPluginRetry(pluginRetryKey, 0, cache.DefaultExpiration)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Marshal(mr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NopCloser(bytes.NewReader(b))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewReader(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Run(func(args mock.Arguments) { time.Sleep(serverTimeout) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Sleep(serverTimeout)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Return(resp, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewInt(25880526)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Now()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.DoRequest(testutils.Context(t), lookup, automationTypes.ConditionTrigger, pluginRetryKey)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Since(start)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.SetString("88786950015966611018675766524283132478093844178961698330929478019253453382042", 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.mercuryConfig.SetPluginRetry(pluginRetryKey, 0, cache.DefaultExpiration)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Marshal(mr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NopCloser(bytes.NewReader(b))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewReader(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Return(resp, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NopCloser(bytes.NewReader(b))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewReader(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Return(resp, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Times(totalAttempt)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewInt(25880526)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.DoRequest(testutils.Context(t), lookup, automationTypes.LogTrigger, pluginRetryKey)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.SetString("88786950015966611018675766524283132478093844178961698330929478019253453382042", 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.mercuryConfig.SetPluginRetry(pluginRetryKey, 0, cache.DefaultExpiration)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Marshal(mr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NopCloser(bytes.NewReader(b))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewReader(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Return(resp, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Marshal(invalidResponse)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NopCloser(bytes.NewReader(b))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewReader(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Return(resp, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Times(totalAttempt)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewInt(25880526)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.DoRequest(testutils.Context(t), lookup, automationTypes.LogTrigger, pluginRetryKey)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewInt(123456789)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewInt(123456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewInt(123456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewInt(123456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewInt(123456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewInt(123456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewInt(123456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewInt(123456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewInt(123456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewInt(123456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewInt(123456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewInt(123456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewInt(123456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewInt(123456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewInt(123456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewInt(123456)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Run(tt.name, func(t *testing.T) { c := setupClient(t) defer c.Close() if tt.pluginRetries != 0 { c.mercuryConfig.SetPluginRetry(tt.pluginRetryKey, tt.pluginRetries, cache.DefaultExpiration) } hc := new(MockHttpClient) b, err := json.Marshal(tt.response) assert.Nil(t, err) if tt.retryNumber == 0 { resp := &http.Response{ StatusCode: tt.statusCode, Body: io.NopCloser(bytes.NewReader(b)), } hc.On("Do", mock.Anything).Return(resp, nil).Once() } else if tt.retryNumber < totalAttempt { if tt.firstResponse != nil && tt.response != nil { b0, err := json.Marshal(tt.firstResponse) assert.Nil(t, err) resp0 := &http.Response{ StatusCode: tt.statusCode, Body: io.NopCloser(bytes.NewReader(b0)), } b1, err := json.Marshal(tt.response) assert.Nil(t, err) resp1 := &http.Response{ StatusCode: tt.lastStatusCode, Body: io.NopCloser(bytes.NewReader(b1)), } hc.On("Do", mock.Anything).Return(resp0, nil).Once().On("Do", mock.Anything).Return(resp1, nil).Once() } else { retryResp := &http.Response{ StatusCode: tt.statusCode, Body: io.NopCloser(bytes.NewReader(b)), } hc.On("Do", mock.Anything).Return(retryResp, nil).Times(tt.retryNumber) resp := &http.Response{ StatusCode: tt.lastStatusCode, Body: io.NopCloser(bytes.NewReader(b)), } hc.On("Do", mock.Anything).Return(resp, nil).Once() } } else { for i := 1; i <= tt.retryNumber; i++ { resp := &http.Response{ StatusCode: tt.statusCode, Body: io.NopCloser(bytes.NewReader(b)), } hc.On("Do", mock.Anything).Return(resp, nil).Once() } } c.httpClient = hc ch := make(chan mercury.MercuryData, 1) c.multiFeedsRequest(testutils.Context(t), ch, tt.lookup) m := <-ch assert.Equal(t, 0, m.Index) assert.Equal(t, tt.retryable, m.Retryable) if tt.streamsErrCode != encoding.ErrCodeNil { assert.Equal(t, tt.streamsErrCode, m.ErrCode) assert.Equal(t, tt.state, m.State) assert.Equal(t, [][]byte(nil), m.Bytes) } else if tt.retryNumber >= totalAttempt || tt.errorMessage != "" { assert.Equal(t, tt.errorMessage, m.Error.Error()) assert.Equal(t, [][]byte(nil), m.Bytes) } else { assert.Nil(t, m.Error) var reports [][]byte for _, rsp := range tt.response.Reports { b, _ := hexutil.Decode(rsp.FullReport) reports = append(reports, b) } assert.Equal(t, reports, m.Bytes) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.mercuryConfig.SetPluginRetry(tt.pluginRetryKey, tt.pluginRetries, cache.DefaultExpiration)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Marshal(tt.response)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NopCloser(bytes.NewReader(b))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewReader(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Return(resp, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Marshal(tt.firstResponse)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NopCloser(bytes.NewReader(b0))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewReader(b0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Marshal(tt.response)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NopCloser(bytes.NewReader(b1))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewReader(b1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Return(resp0, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Return(resp1, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NopCloser(bytes.NewReader(b))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewReader(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Return(retryResp, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Times(tt.retryNumber)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NopCloser(bytes.NewReader(b))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewReader(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Return(resp, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NopCloser(bytes.NewReader(b))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.NewReader(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.On("Do", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Return(resp, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.multiFeedsRequest(testutils.Context(t), ch, tt.lookup)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/v03_request_test.go: `.Decode(rsp.FullReport)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/payload_builder_test.go: `t.Run(tc.name, func(t *testing.T) { lggr, _ := logger.NewLogger() builder := NewPayloadBuilder(tc.activeList, tc.recoverer, lggr) payloads, err := builder.BuildPayloads(testutils.Context(t), tc.proposals...) assert.NoError(t, err) assert.Equal(t, tc.wantPayloads, payloads) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/payload_builder_test.go: `.GenUpkeepID(types2.LogTrigger, "abc")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/payload_builder_test.go: `.GenUpkeepID(types2.LogTrigger, "def")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/payload_builder_test.go: `.GenUpkeepID(types2.LogTrigger, "abc")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/payload_builder_test.go: `.GenUpkeepID(types2.LogTrigger, "def")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/payload_builder_test.go: `.GenUpkeepID(types2.LogTrigger, "ghi")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/payload_builder_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/payload_builder_test.go: `.Cmp(id)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/payload_builder_test.go: `.GenUpkeepID(types2.LogTrigger, "abc")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/payload_builder_test.go: `.GenUpkeepID(types2.LogTrigger, "def")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/payload_builder_test.go: `.GenUpkeepID(types2.LogTrigger, "ghi")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/payload_builder_test.go: `.GenUpkeepID(types2.LogTrigger, "abc")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/payload_builder_test.go: `.GenUpkeepID(types2.LogTrigger, "def")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/payload_builder_test.go: `.GenUpkeepID(types2.LogTrigger, "abc")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/payload_builder_test.go: `.New("recoverer boom")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/payload_builder_test.go: `.GenUpkeepID(types2.ConditionTrigger, "def")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/payload_builder_test.go: `.GenUpkeepID(types2.ConditionTrigger, "def")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/payload_builder_test.go: `.Run(tc.name, func(t *testing.T) { lggr, _ := logger.NewLogger() builder := NewPayloadBuilder(tc.activeList, tc.recoverer, lggr) payloads, err := builder.BuildPayloads(testutils.Context(t), tc.proposals...) assert.NoError(t, err) assert.Equal(t, tc.wantPayloads, payloads) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/payload_builder_test.go: `.NewLogger()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/payload_builder_test.go: `.BuildPayloads(testutils.Context(t), tc.proposals...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/payload_builder_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `t.Run(tc.name, func(t *testing.T) { block, _, upkeep := r.getBlockAndUpkeepId(tc.input.UpkeepID, tc.input.Trigger) assert.Equal(t, tc.wantBlock, block) assert.Equal(t, tc.wantUpkeep.String(), upkeep.String()) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `upkeepId.FromBigInt(big.NewInt(12345))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `t.Run(tc.name, func(t *testing.T) { bs := &BlockSubscriber{ latestBlock: atomic.Pointer[ocr2keepers.BlockKey]{}, blocks: tc.blocks, } bs.latestBlock.Store(tc.latestBlock) e := &EvmRegistry{ lggr: lggr, bs: bs, poller: tc.poller, } if tc.makeEthCall { client := new(evmClientMocks.Client) client.On("BlockByNumber", mock.Anything, tc.checkBlock).Return(nil, fmt.Errorf("error")) e.client = client } state, retryable := e.verifyCheckBlock(testutils.Context(t), tc.checkBlock, tc.upkeepId, tc.checkHash) assert.Equal(t, tc.state, state) assert.Equal(t, tc.retryable, retryable) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `bs.latestBlock.Store(tc.latestBlock)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `client.On("BlockByNumber", mock.Anything, tc.checkBlock).Return(nil, fmt.Errorf("error"))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `e.client = client` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `upkeepId.FromBigInt(big.NewInt(12345))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `t.Run(tc.name, func(t *testing.T) { ctx := testutils.Context(t) bs := &BlockSubscriber{ blocks: tc.blocks, } e := &EvmRegistry{ lggr: lggr, bs: bs, } if tc.makeEthCall { client := new(evmClientMocks.Client) client.On("CallContext", mock.Anything, mock.Anything, "eth_getTransactionReceipt", common.BytesToHash(tc.payload.Trigger.LogTriggerExtension.TxHash[:])). Return(tc.ethCallErr).Run(func(args mock.Arguments) { if tc.receipt != nil { res := args.Get(1).(*types.Receipt) res.Status = tc.receipt.Status res.TxHash = tc.receipt.TxHash res.BlockNumber = tc.receipt.BlockNumber res.BlockHash = tc.receipt.BlockHash } }) e.client = client } reason, state, retryable := e.verifyLogExists(ctx, tc.upkeepId, tc.payload) assert.Equal(t, tc.reason, reason) assert.Equal(t, tc.state, state) assert.Equal(t, tc.retryable, retryable) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `client.On("CallContext", mock.Anything, mock.Anything, "eth_getTransactionReceipt", common.BytesToHash(tc.payload.Trigger.LogTriggerExtension.TxHash[:])). Return(tc.ethCallErr).Run(func(args mock.Arguments) { if tc.receipt != nil { res := args.Get(1).(*types.Receipt) res.Status = tc.receipt.Status res.TxHash = tc.receipt.TxHash res.BlockNumber = tc.receipt.BlockNumber res.BlockHash = tc.receipt.BlockHash } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `res.Status = tc.receipt.Status` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `res.TxHash = tc.receipt.TxHash` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `res.BlockNumber = tc.receipt.BlockNumber` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `res.BlockHash = tc.receipt.BlockHash` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `e.client = client` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `t.Run(tc.name, func(t *testing.T) { bs := &BlockSubscriber{ latestBlock: atomic.Pointer[ocr2keepers.BlockKey]{}, blocks: tc.blocks, } bs.latestBlock.Store(tc.latestBlock) e := &EvmRegistry{ lggr: lggr, bs: bs, poller: tc.poller, } client := new(evmClientMocks.Client) for _, i := range tc.inputs { uid := i.UpkeepID.String() if tc.ethCalls[uid] { client.On("CallContext", mock.Anything, mock.Anything, "eth_getTransactionReceipt", common.HexToHash("0xc8def8abdcf3a4eaaf6cc13bff3e4e2a7168d86ea41dbbf97451235aa76c3651")). Return(tc.ethCallErrors[uid]).Run(func(args mock.Arguments) { receipt := tc.receipts[uid] if receipt != nil { res := args.Get(1).(*types.Receipt) res.Status = receipt.Status res.TxHash = receipt.TxHash res.BlockNumber = receipt.BlockNumber res.BlockHash = receipt.BlockHash } }) } } e.client = client results, err := e.checkUpkeeps(testutils.Context(t), tc.inputs) assert.Equal(t, tc.results, results) assert.Equal(t, tc.err, err) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `bs.latestBlock.Store(tc.latestBlock)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `client.On("CallContext", mock.Anything, mock.Anything, "eth_getTransactionReceipt", common.HexToHash("0xc8def8abdcf3a4eaaf6cc13bff3e4e2a7168d86ea41dbbf97451235aa76c3651")). Return(tc.ethCallErrors[uid]).Run(func(args mock.Arguments) { receipt := tc.receipts[uid] if receipt != nil { res := args.Get(1).(*types.Receipt) res.Status = receipt.Status res.TxHash = receipt.TxHash res.BlockNumber = receipt.BlockNumber res.BlockHash = receipt.BlockHash } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `res.Status = receipt.Status` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `res.TxHash = receipt.TxHash` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `res.BlockNumber = receipt.BlockNumber` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `res.BlockHash = receipt.BlockHash` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `e.client = client` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `t.Run(tc.name, func(t *testing.T) { e := setupEVMRegistry(t) client := new(evmClientMocks.Client) client.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_call" && b[1].Method == "eth_call" })).Return(nil). Run(func(args mock.Arguments) { be := args.Get(1).([]rpc.BatchElem) be[0].Error = fmt.Errorf("error") res := "0x0001" be[1].Result = res }).Once() e.client = client mockReg := mocks.NewRegistry(t) mockReg.On("GetUpkeep", mock.Anything, mock.Anything).Return( encoding.UpkeepInfo{OffchainConfig: make([]byte, 0)}, nil, ).Times(2) e.registry = mockReg results, err := e.simulatePerformUpkeeps(testutils.Context(t), tc.inputs) assert.Equal(t, tc.results, results) assert.Equal(t, tc.err, err) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `client.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_call" && b[1].Method == "eth_call" })).Return(nil). Run(func(args mock.Arguments) { be := args.Get(1).([]rpc.BatchElem) be[0].Error = fmt.Errorf("error") res := "0x0001" be[1].Result = res }).Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `be[0].Error = fmt.Errorf("error")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `be[1].Result = res` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `e.client = client` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `mockReg.On("GetUpkeep", mock.Anything, mock.Anything).Return( encoding.UpkeepInfo{OffchainConfig: make([]byte, 0)}, nil, ).Times(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `e.registry = mockReg` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.UpkeepIDFromInt("10")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.UpkeepIDFromInt("10")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(10)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.Run(tc.name, func(t *testing.T) { block, _, upkeep := r.getBlockAndUpkeepId(tc.input.UpkeepID, tc.input.Trigger) assert.Equal(t, tc.wantBlock, block) assert.Equal(t, tc.wantUpkeep.String(), upkeep.String()) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.getBlockAndUpkeepId(tc.input.UpkeepID, tc.input.Trigger)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.FromBigInt(big.NewInt(12345))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(12345)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(500)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(12345)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x5bff03de234fe771ac0d685f9ee0fb0b757ea02ec9e6f10e8e2ee806db1b6b83")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewTrigger(500, common.HexToHash("0x5bff03de234fe771ac0d685f9ee0fb0b757ea02ec9e6f10e8e2ee806db1b6b83"))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x5bff03de234fe771ac0d685f9ee0fb0b757ea02ec9e6f10e8e2ee806db1b6b83")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("abcdef")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(500)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(12345)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x5bff03de234fe771ac0d685f9ee0fb0b757ea02ec9e6f10e8e2ee806db1b6b83")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewTrigger(500, common.HexToHash("0x5bff03de234fe771ac0d685f9ee0fb0b757ea02ec9e6f10e8e2ee806db1b6b83"))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x5bff03de234fe771ac0d685f9ee0fb0b757ea02ec9e6f10e8e2ee806db1b6b83")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x5bff03de234fe771ac0d685f9ee0fb0b757ea02ec9e6f10e8e2ee806db1b6b83")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(500)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(12345)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x5bff03de234fe771ac0d685f9ee0fb0b757ea02ec9e6f10e8e2ee806db1b6b83")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewTrigger(500, common.HexToHash("0x5bff03de234fe771ac0d685f9ee0fb0b757ea02ec9e6f10e8e2ee806db1b6b83"))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x5bff03de234fe771ac0d685f9ee0fb0b757ea02ec9e6f10e8e2ee806db1b6b83")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0xcba5cf9e2bb32373c76015384e1098912d9510a72481c78057fcb088209167de")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(500)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(12345)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x5bff03de234fe771ac0d685f9ee0fb0b757ea02ec9e6f10e8e2ee806db1b6b83")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewTrigger(500, common.HexToHash("0x5bff03de234fe771ac0d685f9ee0fb0b757ea02ec9e6f10e8e2ee806db1b6b83"))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x5bff03de234fe771ac0d685f9ee0fb0b757ea02ec9e6f10e8e2ee806db1b6b83")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.Run(tc.name, func(t *testing.T) { bs := &BlockSubscriber{ latestBlock: atomic.Pointer[ocr2keepers.BlockKey]{}, blocks: tc.blocks, } bs.latestBlock.Store(tc.latestBlock) e := &EvmRegistry{ lggr: lggr, bs: bs, poller: tc.poller, } if tc.makeEthCall { client := new(evmClientMocks.Client) client.On("BlockByNumber", mock.Anything, tc.checkBlock).Return(nil, fmt.Errorf("error")) e.client = client } state, retryable := e.verifyCheckBlock(testutils.Context(t), tc.checkBlock, tc.upkeepId, tc.checkHash) assert.Equal(t, tc.state, state) assert.Equal(t, tc.retryable, retryable) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.latestBlock.Store(tc.latestBlock)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.On("BlockByNumber", mock.Anything, tc.checkBlock)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.Return(nil, fmt.Errorf("error"))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.verifyCheckBlock(testutils.Context(t), tc.checkBlock, tc.upkeepId, tc.checkHash)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.FromBigInt(big.NewInt(12345))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(12345)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0xc8def8abdcf3a4eaaf6cc13bff3e4e2a7168d86ea41dbbf97451235aa76c3651")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x3df0e926f3e21ec1195ffe007a2899214905eb02e768aa89ce0b94accd7f3d71")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0xc8def8abdcf3a4eaaf6cc13bff3e4e2a7168d86ea41dbbf97451235aa76c3651")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x3df0e926f3e21ec1195ffe007a2899214905eb02e768aa89ce0b94accd7f3d71")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(12345)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewLogTrigger(550, common.HexToHash("0x5bff03de234fe771ac0d685f9ee0fb0b757ea02ec9e6f10e8e2ee806db1b6b83"), extension)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x5bff03de234fe771ac0d685f9ee0fb0b757ea02ec9e6f10e8e2ee806db1b6b83")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(12345)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewLogTrigger(550, common.HexToHash("0x5bff03de234fe771ac0d685f9ee0fb0b757ea02ec9e6f10e8e2ee806db1b6b83"), extension)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x5bff03de234fe771ac0d685f9ee0fb0b757ea02ec9e6f10e8e2ee806db1b6b83")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(12345)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewLogTrigger(550, common.HexToHash("0x5bff03de234fe771ac0d685f9ee0fb0b757ea02ec9e6f10e8e2ee806db1b6b83"), extension1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x5bff03de234fe771ac0d685f9ee0fb0b757ea02ec9e6f10e8e2ee806db1b6b83")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(550)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x5bff03de234fe771ac0d685f9ee0fb0b757ea02ec9e6f10e8e2ee806db1b6b83")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(12345)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewLogTrigger(550, common.HexToHash("0x5bff03de234fe771ac0d685f9ee0fb0b757ea02ec9e6f10e8e2ee806db1b6b83"), extension1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x5bff03de234fe771ac0d685f9ee0fb0b757ea02ec9e6f10e8e2ee806db1b6b83")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(550)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x3df0e926f3e21ec1195ffe007a2899214905eb02e768aa89ce0b94accd7f3d71")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(12345)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewLogTrigger(550, common.HexToHash("0x5bff03de234fe771ac0d685f9ee0fb0b757ea02ec9e6f10e8e2ee806db1b6b83"), extension)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x5bff03de234fe771ac0d685f9ee0fb0b757ea02ec9e6f10e8e2ee806db1b6b83")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.Run(tc.name, func(t *testing.T) { ctx := testutils.Context(t) bs := &BlockSubscriber{ blocks: tc.blocks, } e := &EvmRegistry{ lggr: lggr, bs: bs, } if tc.makeEthCall { client := new(evmClientMocks.Client) client.On("CallContext", mock.Anything, mock.Anything, "eth_getTransactionReceipt", common.BytesToHash(tc.payload.Trigger.LogTriggerExtension.TxHash[:])). Return(tc.ethCallErr).Run(func(args mock.Arguments) { if tc.receipt != nil { res := args.Get(1).(*types.Receipt) res.Status = tc.receipt.Status res.TxHash = tc.receipt.TxHash res.BlockNumber = tc.receipt.BlockNumber res.BlockHash = tc.receipt.BlockHash } }) e.client = client } reason, state, retryable := e.verifyLogExists(ctx, tc.upkeepId, tc.payload) assert.Equal(t, tc.reason, reason) assert.Equal(t, tc.state, state) assert.Equal(t, tc.retryable, retryable) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.On("CallContext", mock.Anything, mock.Anything, "eth_getTransactionReceipt", common.BytesToHash(tc.payload.Trigger.LogTriggerExtension.TxHash[:]))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.BytesToHash(tc.payload.Trigger.LogTriggerExtension.TxHash[:])` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `. Return(tc.ethCallErr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.Run(func(args mock.Arguments) { if tc.receipt != nil { res := args.Get(1).(*types.Receipt) res.Status = tc.receipt.Status res.TxHash = tc.receipt.TxHash res.BlockNumber = tc.receipt.BlockNumber res.BlockHash = tc.receipt.BlockHash } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.Get(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.verifyLogExists(ctx, tc.upkeepId, tc.payload)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.GenUpkeepID(types3.UpkeepType(0), "p0")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.UpkeepType(0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.GenUpkeepID(types3.UpkeepType(1), "p1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.UpkeepType(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.GenUpkeepID(types3.UpkeepType(1), "p2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.UpkeepType(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0xc8def8abdcf3a4eaaf6cc13bff3e4e2a7168d86ea41dbbf97451235aa76c3651")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x0919c83363b439ea634ce2b576cf3e30db26b340fb7a12058c2fcc401bd04ba0")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0xc8def8abdcf3a4eaaf6cc13bff3e4e2a7168d86ea41dbbf97451235aa76c3651")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x9840e5b709bfccf6a1b44f34c884bc39403f57923f3f5ead6243cc090546b857")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewTrigger(575, common.HexToHash("0x1c77db0abe32327cf3ea9de2aadf79876f9e6b6dfcee9d4719a8a2dc8ca289d0"))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x1c77db0abe32327cf3ea9de2aadf79876f9e6b6dfcee9d4719a8a2dc8ca289d0")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewLogTrigger(560, common.HexToHash("0x9840e5b709bfccf6a1b44f34c884bc39403f57923f3f5ead6243cc090546b857"), extension1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x9840e5b709bfccf6a1b44f34c884bc39403f57923f3f5ead6243cc090546b857")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewLogTrigger(570, common.HexToHash("0x1222d75217e2dd461cc77e4091c37abe76277430d97f1963a822b4e94ebb83fc"), extension2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x1222d75217e2dd461cc77e4091c37abe76277430d97f1963a822b4e94ebb83fc")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0xcba5cf9e2bb32373c76015384e1098912d9510a72481c78057fcb088209167de")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.Run(tc.name, func(t *testing.T) { bs := &BlockSubscriber{ latestBlock: atomic.Pointer[ocr2keepers.BlockKey]{}, blocks: tc.blocks, } bs.latestBlock.Store(tc.latestBlock) e := &EvmRegistry{ lggr: lggr, bs: bs, poller: tc.poller, } client := new(evmClientMocks.Client) for _, i := range tc.inputs { uid := i.UpkeepID.String() if tc.ethCalls[uid] { client.On("CallContext", mock.Anything, mock.Anything, "eth_getTransactionReceipt", common.HexToHash("0xc8def8abdcf3a4eaaf6cc13bff3e4e2a7168d86ea41dbbf97451235aa76c3651")). Return(tc.ethCallErrors[uid]).Run(func(args mock.Arguments) { receipt := tc.receipts[uid] if receipt != nil { res := args.Get(1).(*types.Receipt) res.Status = receipt.Status res.TxHash = receipt.TxHash res.BlockNumber = receipt.BlockNumber res.BlockHash = receipt.BlockHash } }) } } e.client = client results, err := e.checkUpkeeps(testutils.Context(t), tc.inputs) assert.Equal(t, tc.results, results) assert.Equal(t, tc.err, err) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.latestBlock.Store(tc.latestBlock)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.UpkeepID.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.On("CallContext", mock.Anything, mock.Anything, "eth_getTransactionReceipt", common.HexToHash("0xc8def8abdcf3a4eaaf6cc13bff3e4e2a7168d86ea41dbbf97451235aa76c3651"))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0xc8def8abdcf3a4eaaf6cc13bff3e4e2a7168d86ea41dbbf97451235aa76c3651")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `. Return(tc.ethCallErrors[uid])` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.Run(func(args mock.Arguments) { receipt := tc.receipts[uid] if receipt != nil { res := args.Get(1).(*types.Receipt) res.Status = receipt.Status res.TxHash = receipt.TxHash res.BlockNumber = receipt.BlockNumber res.BlockHash = receipt.BlockHash } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.Get(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.checkUpkeeps(testutils.Context(t), tc.inputs)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.GenUpkeepID(types3.UpkeepType(0), "p0")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.UpkeepType(0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.GenUpkeepID(types3.UpkeepType(1), "p1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.UpkeepType(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.GenUpkeepID(types3.UpkeepType(1), "p2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.UpkeepType(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0xc8def8abdcf3a4eaaf6cc13bff3e4e2a7168d86ea41dbbf97451235aa76c3651")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x9840e5b709bfccf6a1b44f34c884bc39403f57923f3f5ead6243cc090546b857")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewTrigger(150, common.HexToHash("0x1c77db0abe32327cf3ea9de2aadf79876f9e6b6dfcee9d4719a8a2dc8ca289d0"))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x1c77db0abe32327cf3ea9de2aadf79876f9e6b6dfcee9d4719a8a2dc8ca289d0")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewLogTrigger(570, common.HexToHash("0x1222d75217e2dd461cc77e4091c37abe76277430d97f1963a822b4e94ebb83fc"), extension1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x1222d75217e2dd461cc77e4091c37abe76277430d97f1963a822b4e94ebb83fc")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewLogTrigger(570, common.HexToHash("0x1222d75217e2dd461cc77e4091c37abe76277430d97f1963a822b4e94ebb83fc"), extension1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.HexToHash("0x1222d75217e2dd461cc77e4091c37abe76277430d97f1963a822b4e94ebb83fc")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(0)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(20000)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(20000)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(20000)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(20000)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(20000)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(20000)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(20000)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewInt(20000)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.Run(tc.name, func(t *testing.T) { e := setupEVMRegistry(t) client := new(evmClientMocks.Client) client.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_call" && b[1].Method == "eth_call" })).Return(nil). Run(func(args mock.Arguments) { be := args.Get(1).([]rpc.BatchElem) be[0].Error = fmt.Errorf("error") res := "0x0001" be[1].Result = res }).Once() e.client = client mockReg := mocks.NewRegistry(t) mockReg.On("GetUpkeep", mock.Anything, mock.Anything).Return( encoding.UpkeepInfo{OffchainConfig: make([]byte, 0)}, nil, ).Times(2) e.registry = mockReg results, err := e.simulatePerformUpkeeps(testutils.Context(t), tc.inputs) assert.Equal(t, tc.results, results) assert.Equal(t, tc.err, err) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.On("BatchCallContext", mock.Anything, mock.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_call" && b[1].Method == "eth_call" }))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.MatchedBy(func(b []rpc.BatchElem) bool { return len(b) == 2 && b[0].Method == "eth_call" && b[1].Method == "eth_call" })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `. Run(func(args mock.Arguments) { be := args.Get(1).([]rpc.BatchElem) be[0].Error = fmt.Errorf("error") res := "0x0001" be[1].Result = res })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.Get(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.NewRegistry(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.On("GetUpkeep", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.Return( encoding.UpkeepInfo{OffchainConfig: make([]byte, 0)}, nil, )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.Times(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.simulatePerformUpkeeps(testutils.Context(t), tc.inputs)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `t.Run(test.Name, func(t *testing.T) { mockConfig := NewMercuryConfig(&types.MercuryCredentials{ URL: test.URL, LegacyURL: test.LegacyURL, Username: "user", Password: "pass", }, core.StreamsCompatibleABI) result := mockConfig.Credentials() // Assert that trailing slashes are removed assert.Equal(t, "http://example.com", result.URL) assert.Equal(t, "http://legacy.example.com", result.LegacyURL) assert.Equal(t, "user", result.Username) assert.Equal(t, "pass", result.Password) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `t.Run(test.Name, func(t *testing.T) { ctx := testutils.Context(t) mp := new(mocks.LogPoller) if test.LatestBlock != nil { mp.On("LatestBlock", mock.Anything). Return(logpoller.LogPollerBlock{BlockNumber: test.LatestBlock.OutputBlock}, test.LatestBlock.OutputErr) } if test.LogsWithSigs != nil { fc := test.LogsWithSigs mp.On("LogsWithSigs", mock.Anything, fc.InputStart, fc.InputEnd, upkeepStateEvents, test.Address).Return(fc.OutputLogs, fc.OutputErr) } rg := &EvmRegistry{ addr: test.Address, lastPollBlock: test.LastPoll, poller: mp, chLog: make(chan logpoller.Log, 10), } err := rg.pollUpkeepStateLogs(ctx) assert.Equal(t, test.ExpectedLastPoll, rg.lastPollBlock) if test.ExpectedErr != nil { assert.ErrorIs(t, err, test.ExpectedErr) } else { assert.Nil(t, err) } var outputLogCount int CheckLoop: for { chT := time.NewTimer(20 * time.Millisecond) select { case l := <-rg.chLog: chT.Stop() if test.LogsWithSigs == nil { assert.FailNow(t, "logs detected but no logs were expected") } outputLogCount++ assert.Contains(t, test.LogsWithSigs.OutputLogs, l) case <-chT.C: break CheckLoop } } if test.LogsWithSigs != nil { assert.Equal(t, len(test.LogsWithSigs.OutputLogs), outputLogCount) } mp.AssertExpectations(t) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `mp.On("LatestBlock", mock.Anything). Return(logpoller.LogPollerBlock{BlockNumber: test.LatestBlock.OutputBlock}, test.LatestBlock.OutputErr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `mp.On("LogsWithSigs", mock.Anything, fc.InputStart, fc.InputEnd, upkeepStateEvents, test.Address).Return(fc.OutputLogs, fc.OutputErr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `chT.Stop()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `outputLogCount++` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `mp.AssertExpectations(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `res = append(res, core.GenUpkeepID(types2.LogTrigger, fmt.Sprintf("%d", i)).BigInt())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `res = append(res, core.GenUpkeepID(types2.LogTrigger, fmt.Sprintf("%d", i)).BigInt())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `t.Run(tc.name, func(t *testing.T) { ctx := tests.Context(t) lggr := logger.TestLogger(t) var hb types3.HeadBroadcaster var lp logpoller.LogPoller bs := NewBlockSubscriber(hb, lp, 1000, lggr) registry := &EvmRegistry{ addr: common.BigToAddress(big.NewInt(1)), poller: tc.poller, logEventProvider: tc.logEventProvider, chLog: make(chan logpoller.Log, 10), bs: bs, registry: tc.registry, packer: tc.packer, lggr: lggr, } err := registry.refreshLogTriggerUpkeeps(ctx, tc.ids) if tc.expectsErr { assert.Error(t, err) assert.Equal(t, err.Error(), tc.wantErr.Error()) } else { assert.NoError(t, err) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.Run(test.Name, func(t *testing.T) { mockConfig := NewMercuryConfig(&types.MercuryCredentials{ URL: test.URL, LegacyURL: test.LegacyURL, Username: "user", Password: "pass", }, core.StreamsCompatibleABI) result := mockConfig.Credentials() // Assert that trailing slashes are removed assert.Equal(t, "http://example.com", result.URL) assert.Equal(t, "http://legacy.example.com", result.LegacyURL) assert.Equal(t, "user", result.Username) assert.Equal(t, "pass", result.Password) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.Credentials()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.BigToAddress(big.NewInt(1))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.BigToAddress(big.NewInt(1))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.New(big.NewInt(5))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.NewInt(5)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.New(big.NewInt(6))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.NewInt(6)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.Run(test.Name, func(t *testing.T) { ctx := testutils.Context(t) mp := new(mocks.LogPoller) if test.LatestBlock != nil { mp.On("LatestBlock", mock.Anything). Return(logpoller.LogPollerBlock{BlockNumber: test.LatestBlock.OutputBlock}, test.LatestBlock.OutputErr) } if test.LogsWithSigs != nil { fc := test.LogsWithSigs mp.On("LogsWithSigs", mock.Anything, fc.InputStart, fc.InputEnd, upkeepStateEvents, test.Address).Return(fc.OutputLogs, fc.OutputErr) } rg := &EvmRegistry{ addr: test.Address, lastPollBlock: test.LastPoll, poller: mp, chLog: make(chan logpoller.Log, 10), } err := rg.pollUpkeepStateLogs(ctx) assert.Equal(t, test.ExpectedLastPoll, rg.lastPollBlock) if test.ExpectedErr != nil { assert.ErrorIs(t, err, test.ExpectedErr) } else { assert.Nil(t, err) } var outputLogCount int CheckLoop: for { chT := time.NewTimer(20 * time.Millisecond) select { case l := <-rg.chLog: chT.Stop() if test.LogsWithSigs == nil { assert.FailNow(t, "logs detected but no logs were expected") } outputLogCount++ assert.Contains(t, test.LogsWithSigs.OutputLogs, l) case <-chT.C: break CheckLoop } } if test.LogsWithSigs != nil { assert.Equal(t, len(test.LogsWithSigs.OutputLogs), outputLogCount) } mp.AssertExpectations(t) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.On("LatestBlock", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `. Return(logpoller.LogPollerBlock{BlockNumber: test.LatestBlock.OutputBlock}, test.LatestBlock.OutputErr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.On("LogsWithSigs", mock.Anything, fc.InputStart, fc.InputEnd, upkeepStateEvents, test.Address)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.Return(fc.OutputLogs, fc.OutputErr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.pollUpkeepStateLogs(ctx)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.NewTimer(20 * time.Millisecond)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.Stop()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.AssertExpectations(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.GenUpkeepID(types2.LogTrigger, "abc")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.Topic()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.New("indexed logs boom")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.New("indexed logs boom")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.GenUpkeepID(types2.LogTrigger, "abc")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.GenUpkeepID(types2.ConditionTrigger, "abc")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.NewInt(-1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.Topic()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.New("indexed logs boom")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.New("indexed logs boom")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.GenUpkeepID(types2.LogTrigger, "abc")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.GenUpkeepID(types2.ConditionTrigger, "abc")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.NewInt(-1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.New("parse log boom")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.New("parse log boom")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.GenUpkeepID(types2.LogTrigger, "abc")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.GenUpkeepID(types2.ConditionTrigger, "abc")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.NewInt(-1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.New("register filter boom")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.GenUpkeepID(types2.LogTrigger, "abc")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.GenUpkeepID(types2.LogTrigger, "abc")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.New("failed to update trigger config for upkeep id 452312848583266388373324160190187140521564213162920931037143039228013182976: failed to register log filter: register filter boom")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.GenUpkeepID(types2.LogTrigger, "abc")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.GenUpkeepID(types2.LogTrigger, "def")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.GenUpkeepID(types2.ConditionTrigger, "abc")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.NewInt(-1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.GenUpkeepID(types2.LogTrigger, "abc")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.GenUpkeepID(types2.LogTrigger, "def")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.GenUpkeepID(types2.LogTrigger, fmt.Sprintf("%d", i))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.Sprintf("%d", i)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.GenUpkeepID(types2.LogTrigger, "abc")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.GenUpkeepID(types2.LogTrigger, "def")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.GenUpkeepID(types2.LogTrigger, fmt.Sprintf("%d", i))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.Sprintf("%d", i)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.GenUpkeepID(types2.LogTrigger, "abc")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.GenUpkeepID(types2.LogTrigger, "def")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.Run(tc.name, func(t *testing.T) { ctx := tests.Context(t) lggr := logger.TestLogger(t) var hb types3.HeadBroadcaster var lp logpoller.LogPoller bs := NewBlockSubscriber(hb, lp, 1000, lggr) registry := &EvmRegistry{ addr: common.BigToAddress(big.NewInt(1)), poller: tc.poller, logEventProvider: tc.logEventProvider, chLog: make(chan logpoller.Log, 10), bs: bs, registry: tc.registry, packer: tc.packer, lggr: lggr, } err := registry.refreshLogTriggerUpkeeps(ctx, tc.ids) if tc.expectsErr { assert.Error(t, err) assert.Equal(t, err.Error(), tc.wantErr.Error()) } else { assert.NoError(t, err) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.BigToAddress(big.NewInt(1))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go: `.refreshLogTriggerUpkeeps(ctx, tc.ids)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/cache_test.go: `t.Run(tc.name, func(t *testing.T) { c := newTransmitEventCache(tc.cap) require.Equal(t, len(tc.eventsToAdd), len(tc.logIDsToAdd)) for i, e := range tc.eventsToAdd { c.add(tc.logIDsToAdd[i], e) } require.Equal(t, len(tc.toGet), len(tc.blocksToGet)) for i, logID := range tc.toGet { e, exist := c.get(ocr2keepers.BlockNumber(tc.blocksToGet[i]), logID) expected, ok := tc.expected[logID] if !ok { require.False(t, exist, "expected not to find logID %s", logID) continue } require.True(t, exist, "expected to find logID %s", logID) require.Equal(t, expected.WorkID, e.WorkID) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/cache_test.go: `c.add(tc.logIDsToAdd[i], e)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/cache_test.go: `.Run(tc.name, func(t *testing.T) { c := newTransmitEventCache(tc.cap) require.Equal(t, len(tc.eventsToAdd), len(tc.logIDsToAdd)) for i, e := range tc.eventsToAdd { c.add(tc.logIDsToAdd[i], e) } require.Equal(t, len(tc.toGet), len(tc.blocksToGet)) for i, logID := range tc.toGet { e, exist := c.get(ocr2keepers.BlockNumber(tc.blocksToGet[i]), logID) expected, ok := tc.expected[logID] if !ok { require.False(t, exist, "expected not to find logID %s", logID) continue } require.True(t, exist, "expected to find logID %s", logID) require.Equal(t, expected.WorkID, e.WorkID) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/cache_test.go: `.add(tc.logIDsToAdd[i], e)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/cache_test.go: `.get(ocr2keepers.BlockNumber(tc.blocksToGet[i]), logID)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/cache_test.go: `.BlockNumber(tc.blocksToGet[i])` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/encoding_test.go: `t.Run(tc.name, func(t *testing.T) { if tc.log.Id() != nil { require.Equal(t, uid.BigInt().Int64(), tc.log.Id().Int64()) require.Equal(t, []byte{0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8}, tc.log.Trigger()) } require.Equal(t, tc.etype, tc.log.TransmitEventType()) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/encoding_test.go: `.GenUpkeepID(types.ConditionTrigger, "111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/encoding_test.go: `.HexToHash("0x010203040")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/encoding_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/encoding_test.go: `.HexToHash("0x010203040")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/encoding_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/encoding_test.go: `.HexToHash("0x010203040")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/encoding_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/encoding_test.go: `.HexToHash("0x010203040")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/encoding_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/encoding_test.go: `.HexToHash("0x010203040")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/encoding_test.go: `.Run(tc.name, func(t *testing.T) { if tc.log.Id() != nil { require.Equal(t, uid.BigInt().Int64(), tc.log.Id().Int64()) require.Equal(t, []byte{0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8}, tc.log.Trigger()) } require.Equal(t, tc.etype, tc.log.TransmitEventType()) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/encoding_test.go: `.log.Id()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `lp.On("RegisterFilter", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `runtime.Gosched()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `t.Run(tc.name, func(t *testing.T) { lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: tc.latestBlock}, nil) lp.On("LogsWithSigs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.logs, nil) res, err := provider.GetLatestEvents(ctx) require.Equal(t, tc.errored, err != nil) require.Len(t, res, tc.resultsLen) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: tc.latestBlock}, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `lp.On("LogsWithSigs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.logs, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `lp.On("RegisterFilter", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `t.Run(tc.name, func(t *testing.T) { parseResults := make(map[string]transmitEventLog, len(tc.parsedPerformed)) performedLogs := make([]logpoller.Log, len(tc.parsedPerformed)) for i, l := range tc.parsedPerformed { performedLogs[i] = l.Log if _, ok := parseResults[provider.logKey(l.Log)]; ok { continue } parseResults[provider.logKey(l.Log)] = l } provider.mu.Lock() provider.cache = newTransmitEventCache(provider.cache.cap) provider.parseLog = func(registry *ac.IAutomationV21PlusCommon, log logpoller.Log) (transmitEventLog, error) { return parseResults[provider.logKey(log)], nil } provider.mu.Unlock() results, err := provider.processLogs(tc.latestBlock, performedLogs...) require.Equal(t, tc.errored, err != nil) require.Len(t, results, len(tc.want)) for i, res := range results { require.Equal(t, tc.want[i].Type, res.Type) require.Equal(t, tc.want[i].UpkeepID, res.UpkeepID) require.Equal(t, tc.want[i].CheckBlock, res.CheckBlock) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `performedLogs[i] = l.Log` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `parseResults[provider.logKey(l.Log)] = l` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `provider.mu.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `provider.cache = newTransmitEventCache(provider.cache.cap)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `provider.mu.Unlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.On("RegisterFilter", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.HexToAddress("0x")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.NewNullClient(big.NewInt(1), logger.TestLogger(t))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.HealthReport()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.Start(ctx)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.Err()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.Ready()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.Gosched()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.HealthReport()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.HexToAddress("0x1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.Topic()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.Topic()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.Run(tc.name, func(t *testing.T) { lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: tc.latestBlock}, nil) lp.On("LogsWithSigs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.logs, nil) res, err := provider.GetLatestEvents(ctx) require.Equal(t, tc.errored, err != nil) require.Len(t, res, tc.resultsLen) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.On("LatestBlock", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.Return(logpoller.LogPollerBlock{BlockNumber: tc.latestBlock}, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.On("LogsWithSigs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.Return(tc.logs, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.GetLatestEvents(ctx)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.On("RegisterFilter", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.NewClient(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.HexToAddress("0x")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.GenUpkeepID(types.LogTrigger, "1111111111111111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.HexToHash("0x0102030405060708010203040506070801020304050607080102030405060708")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.Decode("0x0000000000000000000000000000000000000000000000000000000001111abc0000000000000000000000000000000000000000000000000000000001111111000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001111111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.BlockNumber(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.HexToHash("0x0102030405060708010203040506070801020304050607080102030405060708")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.Decode("0x0000000000000000000000000000000000000000000000000000000001111abc0000000000000000000000000000000000000000000000000000000001111111000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001111111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.HexToHash("0x0102030405060708010203040506070801020304050607080102030405060708")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.BigInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.Decode("0x0000000000000000000000000000000000000000000000000000000001111abc0000000000000000000000000000000000000000000000000000000001111111000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001111111")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.BlockNumber(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.BlockNumber(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.Run(tc.name, func(t *testing.T) { parseResults := make(map[string]transmitEventLog, len(tc.parsedPerformed)) performedLogs := make([]logpoller.Log, len(tc.parsedPerformed)) for i, l := range tc.parsedPerformed { performedLogs[i] = l.Log if _, ok := parseResults[provider.logKey(l.Log)]; ok { continue } parseResults[provider.logKey(l.Log)] = l } provider.mu.Lock() provider.cache = newTransmitEventCache(provider.cache.cap) provider.parseLog = func(registry *ac.IAutomationV21PlusCommon, log logpoller.Log) (transmitEventLog, error) { return parseResults[provider.logKey(log)], nil } provider.mu.Unlock() results, err := provider.processLogs(tc.latestBlock, performedLogs...) require.Equal(t, tc.errored, err != nil) require.Len(t, results, len(tc.want)) for i, res := range results { require.Equal(t, tc.want[i].Type, res.Type) require.Equal(t, tc.want[i].UpkeepID, res.UpkeepID) require.Equal(t, tc.want[i].CheckBlock, res.CheckBlock) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.logKey(l.Log)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.logKey(l.Log)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.mu.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.logKey(log)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.mu.Unlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go: `.processLogs(tc.latestBlock, performedLogs...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeep_provider_test.go: `t.Run(tc.name, func(t *testing.T) { bs := &BlockSubscriber{ latestBlock: atomic.Pointer[ocr2keepers.BlockKey]{}, } bs.latestBlock.Store(tc.latestBlock) p := NewUpkeepProvider(tc.active, bs, lp) got, err := p.GetActiveUpkeeps(ctx) if tc.wantErr { require.Error(t, err) return } require.NoError(t, err) require.Len(t, got, len(tc.want)) require.Equal(t, tc.want, got) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeep_provider_test.go: `bs.latestBlock.Store(tc.latestBlock)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeep_provider_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeep_provider_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeep_provider_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeep_provider_test.go: `.UpkeepIDFromInt("1")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeep_provider_test.go: `.NewTrigger(ocr2keepers.BlockNumber(1), [32]byte{})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeep_provider_test.go: `.BlockNumber(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeep_provider_test.go: `.UpkeepIDFromInt("2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeep_provider_test.go: `.NewTrigger(ocr2keepers.BlockNumber(1), [32]byte{})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeep_provider_test.go: `.BlockNumber(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeep_provider_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeep_provider_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeep_provider_test.go: `.Run(tc.name, func(t *testing.T) { bs := &BlockSubscriber{ latestBlock: atomic.Pointer[ocr2keepers.BlockKey]{}, } bs.latestBlock.Store(tc.latestBlock) p := NewUpkeepProvider(tc.active, bs, lp) got, err := p.GetActiveUpkeeps(ctx) if tc.wantErr { require.Error(t, err) return } require.NoError(t, err) require.Len(t, got, len(tc.want)) require.Equal(t, tc.want, got) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeep_provider_test.go: `.latestBlock.Store(tc.latestBlock)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeep_provider_test.go: `.GetActiveUpkeeps(ctx)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/orm_test.go: `err = orm.DeleteExpired(ctx, time.Now())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/orm_test.go: `states, err = orm.SelectStatesByWorkIDs(ctx, []string{"0x1"})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/orm_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/orm_test.go: `.New(big.NewInt(2))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/orm_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/orm_test.go: `.Now()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/orm_test.go: `.BatchInsertRecords(ctx, inserted)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/orm_test.go: `.SelectStatesByWorkIDs(ctx, []string{"0x1"})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/orm_test.go: `.DeleteExpired(ctx, time.Now())` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/orm_test.go: `.Now()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/orm_test.go: `.SelectStatesByWorkIDs(ctx, []string{"0x1"})` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `t.Run(tc.name, func(t *testing.T) { mp := new(mocks.LogPoller) mp.On("RegisterFilter", mock.Anything, mock.Anything).Return(nil) mp.On("UnregisterFilter", mock.Anything, mock.Anything).Return(nil) scanner := NewPerformedEventsScanner(lggr, mp, registryAddr, 100) go func() { _ = scanner.Start(ctx) }() defer func() { _ = scanner.Close() }() mp.On("IndexedLogs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.pollerResults, tc.pollerErr) results, err := scanner.ScanWorkIDs(ctx, tc.workIDs...) if tc.errored { require.Error(t, err) return } require.NoError(t, err) require.Equal(t, len(tc.scannerResults), len(results)) for _, result := range results { require.Contains(t, tc.scannerResults, result) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `mp.On("RegisterFilter", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `mp.On("UnregisterFilter", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `_ = scanner.Start(ctx)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `_ = scanner.Close()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `mp.On("IndexedLogs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.pollerResults, tc.pollerErr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `lp.On("IndexedLogs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]logpoller.Log{ { BlockNumber: 1, Address: registryAddr, Topics: convertTopics([]common.Hash{ ac.IAutomationV21PlusCommonDedupKeyAdded{}.Topic(), common.HexToHash("0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563"), }), }, }, nil).Times(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `lp.On("IndexedLogs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]logpoller.Log{ { BlockNumber: 3, Address: registryAddr, Topics: convertTopics([]common.Hash{ ac.IAutomationV21PlusCommonDedupKeyAdded{}.Topic(), common.HexToHash("0x331decd9548b62a8d603457658386fc84ba6bc95888008f6362f93160ef3b663"), }), }, }, nil).Times(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `workIDsBatchSize = 8` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `workIDsBatchSize = origWorkIDsBatchSize` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `sort.Slice(ids, func(i, j int) bool { return ids[i] < ids[j] })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.HexToAddress("0x12345")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.Topic()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.HexToHash("0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.Topic()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.Run(tc.name, func(t *testing.T) { mp := new(mocks.LogPoller) mp.On("RegisterFilter", mock.Anything, mock.Anything).Return(nil) mp.On("UnregisterFilter", mock.Anything, mock.Anything).Return(nil) scanner := NewPerformedEventsScanner(lggr, mp, registryAddr, 100) go func() { _ = scanner.Start(ctx) }() defer func() { _ = scanner.Close() }() mp.On("IndexedLogs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.pollerResults, tc.pollerErr) results, err := scanner.ScanWorkIDs(ctx, tc.workIDs...) if tc.errored { require.Error(t, err) return } require.NoError(t, err) require.Equal(t, len(tc.scannerResults), len(results)) for _, result := range results { require.Contains(t, tc.scannerResults, result) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.On("RegisterFilter", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.On("UnregisterFilter", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.Return(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.Start(ctx)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.On("IndexedLogs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.Return(tc.pollerResults, tc.pollerErr)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.ScanWorkIDs(ctx, tc.workIDs...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.HexToAddress("0x12345")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.On("IndexedLogs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.Return([]logpoller.Log{ { BlockNumber: 1, Address: registryAddr, Topics: convertTopics([]common.Hash{ ac.IAutomationV21PlusCommonDedupKeyAdded{}.Topic(), common.HexToHash("0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563"), }), }, }, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.Topic()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.HexToHash("0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.Times(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.On("IndexedLogs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.Return([]logpoller.Log{ { BlockNumber: 3, Address: registryAddr, Topics: convertTopics([]common.Hash{ ac.IAutomationV21PlusCommonDedupKeyAdded{}.Topic(), common.HexToHash("0x331decd9548b62a8d603457658386fc84ba6bc95888008f6362f93160ef3b663"), }), }, }, nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.Topic()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.HexToHash("0x331decd9548b62a8d603457658386fc84ba6bc95888008f6362f93160ef3b663")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.Times(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.ScanWorkIDs(ctx, "290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563", "1111", "2222", "3333", "4444", "5555", "6666", "7777", "8888", "9999", "331decd9548b62a8d603457658386fc84ba6bc95888008f6362f93160ef3b663", )` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go: `.Slice(ids, func(i, j int) bool { return ids[i] < ids[j] })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `t.Run(tc.name, func(t *testing.T) { ctx := testutils.Context(t) lggr := logger.TestLogger(t) scanner := &mockScanner{} scanner.addWorkID(tc.workIDsFromScanner...) scanner.setErr(tc.errScanner) orm := &mockORM{} orm.addRecords(tc.recordsFromDB...) orm.setErr(tc.errDB) store := NewUpkeepStateStore(orm, lggr, scanner) for _, insert := range tc.inserts { assert.NoError(t, store.SetUpkeepState(ctx, insert, ocr2keepers.Performed)) } states, err := store.SelectByWorkIDs(ctx, tc.workIDsSelect...) if tc.errored { assert.Error(t, err) return } assert.NoError(t, err) assert.Equal(t, len(tc.expected), len(states)) for i, state := range states { assert.Equal(t, tc.expected[i], state) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `scanner.addWorkID(tc.workIDsFromScanner...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `scanner.setErr(tc.errScanner)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `orm.addRecords(tc.recordsFromDB...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `orm.setErr(tc.errDB)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `_ = uid.FromBigInt(big.NewInt(id))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `t.Run(test.name, func(t *testing.T) { ctx := testutils.Context(t) tickerCh := make(chan time.Time) oldNewTickerFn := newTickerFn oldFlushSize := batchSize newTickerFn = func(d time.Duration) *time.Ticker { t := time.NewTicker(d) t.C = tickerCh return t } batchSize = test.flushSize defer func() { newTickerFn = oldNewTickerFn batchSize = oldFlushSize }() lggr, observedLogs := logger.TestLoggerObserved(t, zapcore.ErrorLevel) chainID := testutils.FixtureChainID db := pgtest.NewSqlxDB(t) realORM := NewORM(chainID, db) insertFinished := make(chan struct{}, 1) orm := &wrappedORM{ BatchInsertRecordsFn: func(ctx context.Context, records []persistedStateRecord) error { err := realORM.BatchInsertRecords(ctx, records) insertFinished <- struct{}{} return err }, SelectStatesByWorkIDsFn: realORM.SelectStatesByWorkIDs, DeleteExpiredFn: realORM.DeleteExpired, } scanner := &mockScanner{} store := NewUpkeepStateStore(orm, lggr, scanner) servicetest.Run(t, store) t.Cleanup(func() { t.Log("cleaning up database") if _, err := db.Exec(`DELETE FROM evm.upkeep_states`); err != nil { t.Logf("error in cleanup: %s", err) } }) for _, insert := range test.storedValues { require.NoError(t, store.SetUpkeepState(ctx, insert.result, insert.state), "storing states should not produce an error") } tickerCh <- time.Now() // if this test inserts data, wait for the insert to complete before proceeding for i := 0; i < test.expectedWrites; i++ { <-insertFinished } // empty the cache before doing selects to force a db lookup store.cache = make(map[string]*upkeepStateRecord) states, err := store.SelectByWorkIDs(ctx, test.queryIDs...) require.NoError(t, err, "no error expected from selecting states") assert.Equal(t, test.expected, states, "upkeep state values should match expected") observedLogs.TakeAll() require.Equal(t, 0, observedLogs.Len()) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `t.C = tickerCh` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `batchSize = test.flushSize` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `newTickerFn = oldNewTickerFn` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `batchSize = oldFlushSize` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `insertFinished <- struct{}{}` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `servicetest.Run(t, store)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `t.Cleanup(func() { t.Log("cleaning up database") if _, err := db.Exec(`DELETE FROM evm.upkeep_states`); err != nil { t.Logf("error in cleanup: %s", err) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `tickerCh <- time.Now()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `<-insertFinished` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `store.cache = make(map[string]*upkeepStateRecord)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `observedLogs.TakeAll()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `insertFinished <- struct{}{}` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `observedLogs.TakeAll()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `<-time.After(10 * time.Millisecond)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `res.Trigger.BlockNumber = ocr2keepers.BlockNumber(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `store.mu.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `store.mu.Unlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `store.retention = 500 * time.Millisecond` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `store.cleanCadence = 100 * time.Millisecond` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `servicetest.Run(t, store)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `time.Sleep(110 * time.Millisecond)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `time.Sleep(700 * time.Millisecond)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `values, err = store.SelectByWorkIDs(ctx, "0x2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.BlockNumber(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.BlockNumber(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.BlockNumber(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.BlockNumber(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.Now()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.BlockNumber(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.BlockNumber(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.BlockNumber(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.Run(tc.name, func(t *testing.T) { ctx := testutils.Context(t) lggr := logger.TestLogger(t) scanner := &mockScanner{} scanner.addWorkID(tc.workIDsFromScanner...) scanner.setErr(tc.errScanner) orm := &mockORM{} orm.addRecords(tc.recordsFromDB...) orm.setErr(tc.errDB) store := NewUpkeepStateStore(orm, lggr, scanner) for _, insert := range tc.inserts { assert.NoError(t, store.SetUpkeepState(ctx, insert, ocr2keepers.Performed)) } states, err := store.SelectByWorkIDs(ctx, tc.workIDsSelect...) if tc.errored { assert.Error(t, err) return } assert.NoError(t, err) assert.Equal(t, len(tc.expected), len(states)) for i, state := range states { assert.Equal(t, tc.expected[i], state) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.addWorkID(tc.workIDsFromScanner...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.setErr(tc.errScanner)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.addRecords(tc.recordsFromDB...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.setErr(tc.errDB)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.SelectByWorkIDs(ctx, tc.workIDsSelect...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.Short()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.FromBigInt(big.NewInt(id))` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.NewInt(id)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.BlockNumber(block)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.Run(test.name, func(t *testing.T) { ctx := testutils.Context(t) tickerCh := make(chan time.Time) oldNewTickerFn := newTickerFn oldFlushSize := batchSize newTickerFn = func(d time.Duration) *time.Ticker { t := time.NewTicker(d) t.C = tickerCh return t } batchSize = test.flushSize defer func() { newTickerFn = oldNewTickerFn batchSize = oldFlushSize }() lggr, observedLogs := logger.TestLoggerObserved(t, zapcore.ErrorLevel) chainID := testutils.FixtureChainID db := pgtest.NewSqlxDB(t) realORM := NewORM(chainID, db) insertFinished := make(chan struct{}, 1) orm := &wrappedORM{ BatchInsertRecordsFn: func(ctx context.Context, records []persistedStateRecord) error { err := realORM.BatchInsertRecords(ctx, records) insertFinished <- struct{}{} return err }, SelectStatesByWorkIDsFn: realORM.SelectStatesByWorkIDs, DeleteExpiredFn: realORM.DeleteExpired, } scanner := &mockScanner{} store := NewUpkeepStateStore(orm, lggr, scanner) servicetest.Run(t, store) t.Cleanup(func() { t.Log("cleaning up database") if _, err := db.Exec(`DELETE FROM evm.upkeep_states`); err != nil { t.Logf("error in cleanup: %s", err) } }) for _, insert := range test.storedValues { require.NoError(t, store.SetUpkeepState(ctx, insert.result, insert.state), "storing states should not produce an error") } tickerCh <- time.Now() // if this test inserts data, wait for the insert to complete before proceeding for i := 0; i < test.expectedWrites; i++ { <-insertFinished } // empty the cache before doing selects to force a db lookup store.cache = make(map[string]*upkeepStateRecord) states, err := store.SelectByWorkIDs(ctx, test.queryIDs...) require.NoError(t, err, "no error expected from selecting states") assert.Equal(t, test.expected, states, "upkeep state values should match expected") observedLogs.TakeAll() require.Equal(t, 0, observedLogs.Len()) })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.NewTicker(d)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.TestLoggerObserved(t, zapcore.ErrorLevel)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.NewSqlxDB(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.BatchInsertRecords(ctx, records)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.Run(t, store)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.Cleanup(func() { t.Log("cleaning up database") if _, err := db.Exec(`DELETE FROM evm.upkeep_states`); err != nil { t.Logf("error in cleanup: %s", err) } })` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.Exec(`DELETE FROM evm.upkeep_states`)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.Now()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.SelectByWorkIDs(ctx, test.queryIDs...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.TakeAll()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.TestLoggerObserved(t, zapcore.ErrorLevel)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.NewSqlxDB(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.BatchInsertRecords(ctx, records)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.SelectByWorkIDs(testutils.Context(t), []string{"0x1", "0x2", "0x3", "0x4"}...)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.TakeAll()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.NewSqlxDB(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.BlockNumber(1)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.After(10 * time.Millisecond)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.BlockNumber(2)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.Now()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.mu.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.mu.Unlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.After(addedAt)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.Run(t, store)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.Sleep(110 * time.Millisecond)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.SelectByWorkIDs(ctx, "0x2")` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.Sleep(700 * time.Millisecond)` $DIR/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/store_test.go: `.SelectByWorkIDs(ctx, "0x2")` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `spec = &job.OCR2OracleSpec{ PluginType: types.OCR2Keeper, ContractID: "0x5431", // invalid contract addr }` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `_, err = ocr2keeper.FilterNamesFromSpec21(spec)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `nodeKeys[i] = cltest.MustGenerateRandomKey(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `genesisData[nodeKeys[i].Address] = core.GenesisAccount{Balance: assets.Ether(1000).ToInt()}` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `setupNodes(t, nodeKeys, registry, backend, steve, false)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `<-time.After(time.Second * 5)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `_, err = linkToken.Transfer(sergey, carrol.From, big.NewInt(0).Mul(oneHunEth, big.NewInt(int64(upkeeps+1))))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `backend.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `_, err = linkToken.Transfer(sergey, carrol.From, oneHunEth)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `_, err = linkToken.Approve(carrol, registry.Address(), oneHunEth)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `_, err = registry.AddFunds(carrol, upkeepID, oneHunEth)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `backend.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `_, err = upkeepContract.SetBytesToSend(carrol, payload1)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `_, err = upkeepContract.SetShouldPerformUpkeep(carrol, true)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `backend.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `lggr.Infow("Upkeep registered and funded", "upkeepID", upkeepID.String())` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `g.Eventually(receivedBytes, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.Equal(payload1))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `_, err = upkeepContract.SetBytesToSend(carrol, payload2)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `_, err = upkeepContract.SetShouldPerformUpkeep(carrol, true)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `t.Run(tc.name, func(t *testing.T) { g := gomega.NewWithT(t) // setup blockchain sergey := testutils.MustNewSimTransactor(t) // owns all the link steve := testutils.MustNewSimTransactor(t) // registry owner carrol := testutils.MustNewSimTransactor(t) // upkeep owner genesisData := core.GenesisAlloc{ sergey.From: {Balance: assets.Ether(10000).ToInt()}, steve.From: {Balance: assets.Ether(10000).ToInt()}, carrol.From: {Balance: assets.Ether(10000).ToInt()}, } // Generate 5 keys for nodes (1 bootstrap + 4 ocr nodes) and fund them with ether var nodeKeys [5]ethkey.KeyV2 for i := int64(0); i < 5; i++ { nodeKeys[i] = cltest.MustGenerateRandomKey(t) genesisData[nodeKeys[i].Address] = core.GenesisAccount{Balance: assets.Ether(1000).ToInt()} } backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil)) stopMining := cltest.Mine(backend, 3*time.Second) // Should be greater than deltaRound since we cannot access old blocks on simulated blockchain defer stopMining() // Deploy registry linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(sergey, backend) require.NoError(t, err) gasFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(60000000000)) require.NoError(t, err) linkFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(2000000000000000000)) require.NoError(t, err) registry := deployKeeper21Registry(t, steve, backend, linkAddr, linkFeedAddr, gasFeedAddr) setupNodes(t, nodeKeys, registry, backend, steve, tc.logBufferVersion == logprovider.BufferVersionV1) upkeeps := 1 _, err = linkToken.Transfer(sergey, carrol.From, big.NewInt(0).Mul(oneHunEth, big.NewInt(int64(upkeeps+1)))) require.NoError(t, err) backend.Commit() ids, addrs, contracts := deployUpkeeps(t, backend, carrol, steve, linkToken, registry, upkeeps) require.Equal(t, upkeeps, len(ids)) require.Equal(t, len(ids), len(contracts)) require.Equal(t, len(ids), len(addrs)) backend.Commit() emits := 1 go emitEvents(testutils.Context(t), t, emits, contracts, carrol, func() { backend.Commit() }) listener, done := listenPerformed(t, backend, registry, ids, int64(1)) g.Eventually(listener, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.BeTrue()) done() t.Run("recover logs", func(t *testing.T) { addr, contract := addrs[0], contracts[0] upkeepID := registerUpkeep(t, registry, addr, carrol, steve, backend) backend.Commit() t.Logf("Registered new upkeep %s for address %s", upkeepID.String(), addr.String()) // Emit 100 logs in a burst recoverEmits := 100 i := 0 emitEvents(testutils.Context(t), t, 100, []*log_upkeep_counter_wrapper.LogUpkeepCounter{contract}, carrol, func() { i++ if i%(recoverEmits/4) == 0 { backend.Commit() time.Sleep(time.Millisecond * 250) // otherwise we get "invalid transaction nonce" errors } }) beforeDummyBlocks := backend.Blockchain().CurrentBlock().Number.Uint64() // Mine enough blocks to ensure these logs don't fall into log provider range dummyBlocks := 500 for i := 0; i < dummyBlocks; i++ { backend.Commit() time.Sleep(time.Millisecond * 10) } t.Logf("Mined %d blocks, waiting for logs to be recovered", dummyBlocks) listener, done := listenPerformedN(t, backend, registry, ids, int64(beforeDummyBlocks), recoverEmits) defer done() g.Eventually(listener, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.BeTrue()) }) })` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `nodeKeys[i] = cltest.MustGenerateRandomKey(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `genesisData[nodeKeys[i].Address] = core.GenesisAccount{Balance: assets.Ether(1000).ToInt()}` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `setupNodes(t, nodeKeys, registry, backend, steve, tc.logBufferVersion == logprovider.BufferVersionV1)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `_, err = linkToken.Transfer(sergey, carrol.From, big.NewInt(0).Mul(oneHunEth, big.NewInt(int64(upkeeps+1))))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `backend.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `backend.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `backend.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `g.Eventually(listener, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.BeTrue())` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `done()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `t.Run("recover logs", func(t *testing.T) { addr, contract := addrs[0], contracts[0] upkeepID := registerUpkeep(t, registry, addr, carrol, steve, backend) backend.Commit() t.Logf("Registered new upkeep %s for address %s", upkeepID.String(), addr.String()) // Emit 100 logs in a burst recoverEmits := 100 i := 0 emitEvents(testutils.Context(t), t, 100, []*log_upkeep_counter_wrapper.LogUpkeepCounter{contract}, carrol, func() { i++ if i%(recoverEmits/4) == 0 { backend.Commit() time.Sleep(time.Millisecond * 250) // otherwise we get "invalid transaction nonce" errors } }) beforeDummyBlocks := backend.Blockchain().CurrentBlock().Number.Uint64() // Mine enough blocks to ensure these logs don't fall into log provider range dummyBlocks := 500 for i := 0; i < dummyBlocks; i++ { backend.Commit() time.Sleep(time.Millisecond * 10) } t.Logf("Mined %d blocks, waiting for logs to be recovered", dummyBlocks) listener, done := listenPerformedN(t, backend, registry, ids, int64(beforeDummyBlocks), recoverEmits) defer done() g.Eventually(listener, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.BeTrue()) })` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `backend.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `emitEvents(testutils.Context(t), t, 100, []*log_upkeep_counter_wrapper.LogUpkeepCounter{contract}, carrol, func() { i++ if i%(recoverEmits/4) == 0 { backend.Commit() time.Sleep(time.Millisecond * 250) // otherwise we get "invalid transaction nonce" errors } })` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `i++` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `backend.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `time.Sleep(time.Millisecond * 250)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `backend.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `time.Sleep(time.Millisecond * 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `g.Eventually(listener, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.BeTrue())` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `t.Run(tc.name, func(t *testing.T) { g := gomega.NewWithT(t) // setup blockchain linkOwner := testutils.MustNewSimTransactor(t) // owns all the link registryOwner := testutils.MustNewSimTransactor(t) // registry owner upkeepOwner := testutils.MustNewSimTransactor(t) // upkeep owner genesisData := core.GenesisAlloc{ linkOwner.From: {Balance: assets.Ether(10000).ToInt()}, registryOwner.From: {Balance: assets.Ether(10000).ToInt()}, upkeepOwner.From: {Balance: assets.Ether(10000).ToInt()}, } // Generate 5 keys for nodes (1 bootstrap + 4 ocr nodes) and fund them with ether var nodeKeys [5]ethkey.KeyV2 for i := int64(0); i < 5; i++ { nodeKeys[i] = cltest.MustGenerateRandomKey(t) genesisData[nodeKeys[i].Address] = core.GenesisAccount{Balance: assets.Ether(1000).ToInt()} } backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil)) stopMining := cltest.Mine(backend, 3*time.Second) // Should be greater than deltaRound since we cannot access old blocks on simulated blockchain defer stopMining() // Deploy registry linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(linkOwner, backend) require.NoError(t, err) gasFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(registryOwner, backend, 18, big.NewInt(60000000000)) require.NoError(t, err) linkFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(registryOwner, backend, 18, big.NewInt(2000000000000000000)) require.NoError(t, err) registry := deployKeeper21Registry(t, registryOwner, backend, linkAddr, linkFeedAddr, gasFeedAddr) _, mercuryServer := setupNodes(t, nodeKeys, registry, backend, registryOwner, tc.logBufferVersion == logprovider.BufferVersionV1) const upkeepCount = 10 const mercuryFailCount = upkeepCount * 3 * 2 // testing with the mercury server involves mocking responses. currently, // there is not a way to connect a mercury call to an upkeep id (though we // could add custom headers) so the test must be fairly basic and just // count calls before switching to successes var ( mu sync.Mutex count int ) mercuryServer.RegisterHandler(func(w http.ResponseWriter, r *http.Request) { mu.Lock() defer mu.Unlock() count++ _ = r.ParseForm() t.Logf("MercuryHTTPServe:RequestURI: %s", r.RequestURI) for key, value := range r.Form { t.Logf("MercuryHTTPServe:FormValue: key: %s; value: %s;", key, value) } // the streams lookup retries against the remote server 3 times before // returning a result as retryable. // the simulation here should force the streams lookup process to return // retryable 2 times. // the total count of failures should be (upkeepCount * 3 * tryCount) if count <= mercuryFailCount { w.WriteHeader(http.StatusNotFound) return } // start sending success messages output := `{"chainlinkBlob":"0x0001c38d71fed6c320b90e84b6f559459814d068e2a1700adc931ca9717d4fe70000000000000000000000000000000000000000000000000000000001a80b52b4bf1233f9cb71144a253a1791b202113c4ab4a92fa1b176d684b4959666ff8200000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001004254432d5553442d415242495452554d2d544553544e4554000000000000000000000000000000000000000000000000000000000000000000000000645570be000000000000000000000000000000000000000000000000000002af2b818dc5000000000000000000000000000000000000000000000000000002af2426faf3000000000000000000000000000000000000000000000000000002af32dc209700000000000000000000000000000000000000000000000000000000012130f8df0a9745bb6ad5e2df605e158ba8ad8a33ef8a0acf9851f0f01668a3a3f2b68600000000000000000000000000000000000000000000000000000000012130f60000000000000000000000000000000000000000000000000000000000000002c4a7958dce105089cf5edb68dad7dcfe8618d7784eb397f97d5a5fade78c11a58275aebda478968e545f7e3657aba9dcbe8d44605e4c6fde3e24edd5e22c94270000000000000000000000000000000000000000000000000000000000000002459c12d33986018a8959566d145225f0c4a4e61a9a3f50361ccff397899314f0018162cf10cd89897635a0bb62a822355bd199d09f4abe76e4d05261bb44733d"}` w.WriteHeader(http.StatusOK) _, _ = w.Write([]byte(output)) }) defer mercuryServer.Stop() _, err = linkToken.Transfer(linkOwner, upkeepOwner.From, big.NewInt(0).Mul(oneHunEth, big.NewInt(int64(upkeepCount+1)))) require.NoError(t, err) backend.Commit() feeds, err := newFeedLookupUpkeepController(backend, registryOwner) require.NoError(t, err, "no error expected from creating a feed lookup controller") // deploy multiple upkeeps that listen to a log emitter and need to be // performed for each log event _ = feeds.DeployUpkeeps(t, backend, upkeepOwner, upkeepCount, func(int) bool { return false }) _ = feeds.RegisterAndFund(t, registry, registryOwner, backend, linkToken) _ = feeds.EnableMercury(t, backend, registry, registryOwner) _ = feeds.VerifyEnv(t, backend, registry, registryOwner) // start emitting events in a separate go-routine // feed lookup relies on a single contract event log to perform multiple // listener contracts go func() { // only 1 event is necessary to make all 10 upkeeps eligible _ = feeds.EmitEvents(t, backend, 1, func() { // pause per emit for expected block production time time.Sleep(3 * time.Second) }) }() listener, done := listenPerformed(t, backend, registry, feeds.UpkeepsIds(), int64(1)) defer done() g.Eventually(listener, testutils.WaitTimeout(t)-(5*time.Second), cltest.DBPollingInterval).Should(gomega.BeTrue()) })` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `nodeKeys[i] = cltest.MustGenerateRandomKey(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `genesisData[nodeKeys[i].Address] = core.GenesisAccount{Balance: assets.Ether(1000).ToInt()}` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `mercuryServer.RegisterHandler(func(w http.ResponseWriter, r *http.Request) { mu.Lock() defer mu.Unlock() count++ _ = r.ParseForm() t.Logf("MercuryHTTPServe:RequestURI: %s", r.RequestURI) for key, value := range r.Form { t.Logf("MercuryHTTPServe:FormValue: key: %s; value: %s;", key, value) } // the streams lookup retries against the remote server 3 times before // returning a result as retryable. // the simulation here should force the streams lookup process to return // retryable 2 times. // the total count of failures should be (upkeepCount * 3 * tryCount) if count <= mercuryFailCount { w.WriteHeader(http.StatusNotFound) return } // start sending success messages output := `{"chainlinkBlob":"0x0001c38d71fed6c320b90e84b6f559459814d068e2a1700adc931ca9717d4fe70000000000000000000000000000000000000000000000000000000001a80b52b4bf1233f9cb71144a253a1791b202113c4ab4a92fa1b176d684b4959666ff8200000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001004254432d5553442d415242495452554d2d544553544e4554000000000000000000000000000000000000000000000000000000000000000000000000645570be000000000000000000000000000000000000000000000000000002af2b818dc5000000000000000000000000000000000000000000000000000002af2426faf3000000000000000000000000000000000000000000000000000002af32dc209700000000000000000000000000000000000000000000000000000000012130f8df0a9745bb6ad5e2df605e158ba8ad8a33ef8a0acf9851f0f01668a3a3f2b68600000000000000000000000000000000000000000000000000000000012130f60000000000000000000000000000000000000000000000000000000000000002c4a7958dce105089cf5edb68dad7dcfe8618d7784eb397f97d5a5fade78c11a58275aebda478968e545f7e3657aba9dcbe8d44605e4c6fde3e24edd5e22c94270000000000000000000000000000000000000000000000000000000000000002459c12d33986018a8959566d145225f0c4a4e61a9a3f50361ccff397899314f0018162cf10cd89897635a0bb62a822355bd199d09f4abe76e4d05261bb44733d"}` w.WriteHeader(http.StatusOK) _, _ = w.Write([]byte(output)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `mu.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `count++` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `_ = r.ParseForm()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `w.WriteHeader(http.StatusNotFound)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `w.WriteHeader(http.StatusOK)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `_, _ = w.Write([]byte(output))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `_, err = linkToken.Transfer(linkOwner, upkeepOwner.From, big.NewInt(0).Mul(oneHunEth, big.NewInt(int64(upkeepCount+1))))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `backend.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `_ = feeds.RegisterAndFund(t, registry, registryOwner, backend, linkToken)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `_ = feeds.EnableMercury(t, backend, registry, registryOwner)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `_ = feeds.VerifyEnv(t, backend, registry, registryOwner)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `time.Sleep(3 * time.Second)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `g.Eventually(listener, testutils.WaitTimeout(t)-(5*time.Second), cltest.DBPollingInterval).Should(gomega.BeTrue())` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `t.Run(tc.name, func(t *testing.T) { g := gomega.NewWithT(t) // setup blockchain linkOwner := testutils.MustNewSimTransactor(t) // owns all the link registryOwner := testutils.MustNewSimTransactor(t) // registry owner upkeepOwner := testutils.MustNewSimTransactor(t) // upkeep owner genesisData := core.GenesisAlloc{ linkOwner.From: {Balance: assets.Ether(10000).ToInt()}, registryOwner.From: {Balance: assets.Ether(10000).ToInt()}, upkeepOwner.From: {Balance: assets.Ether(10000).ToInt()}, } // Generate 5 keys for nodes (1 bootstrap + 4 ocr nodes) and fund them with ether var nodeKeys [5]ethkey.KeyV2 for i := int64(0); i < 5; i++ { nodeKeys[i] = cltest.MustGenerateRandomKey(t) genesisData[nodeKeys[i].Address] = core.GenesisAccount{Balance: assets.Ether(1000).ToInt()} } backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil)) stopMining := cltest.Mine(backend, 3*time.Second) // Should be greater than deltaRound since we cannot access old blocks on simulated blockchain defer stopMining() // Deploy registry linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(linkOwner, backend) require.NoError(t, err) gasFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(registryOwner, backend, 18, big.NewInt(60000000000)) require.NoError(t, err) linkFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(registryOwner, backend, 18, big.NewInt(2000000000000000000)) require.NoError(t, err) registry := deployKeeper21Registry(t, registryOwner, backend, linkAddr, linkFeedAddr, gasFeedAddr) _, mercuryServer := setupNodes(t, nodeKeys, registry, backend, registryOwner, tc.logBufferVersion == logprovider.BufferVersionV1) upkeepCount := 10 errResponses := []int{ http.StatusUnauthorized, http.StatusBadRequest, http.StatusInternalServerError, http.StatusNotFound, http.StatusNotFound, http.StatusNotFound, http.StatusUnauthorized, } startMercuryServer(t, mercuryServer, func(i int) (int, []byte) { var resp int if i < len(errResponses) { resp = errResponses[i] } if resp == 0 { resp = http.StatusNotFound } return resp, nil }) defer mercuryServer.Stop() _, err = linkToken.Transfer(linkOwner, upkeepOwner.From, big.NewInt(0).Mul(oneHunEth, big.NewInt(int64(upkeepCount+1)))) require.NoError(t, err) backend.Commit() feeds, err := newFeedLookupUpkeepController(backend, registryOwner) require.NoError(t, err, "no error expected from creating a feed lookup controller") // deploy multiple upkeeps that listen to a log emitter and need to be // performed for each log event checkResultsProvider := func(i int) bool { return i%2 == 1 } require.NoError(t, feeds.DeployUpkeeps(t, backend, upkeepOwner, upkeepCount, checkResultsProvider)) require.NoError(t, feeds.RegisterAndFund(t, registry, registryOwner, backend, linkToken)) require.NoError(t, feeds.EnableMercury(t, backend, registry, registryOwner)) require.NoError(t, feeds.VerifyEnv(t, backend, registry, registryOwner)) startBlock := backend.Blockchain().CurrentBlock().Number.Int64() // start emitting events in a separate go-routine // feed lookup relies on a single contract event log to perform multiple // listener contracts go func() { // only 1 event is necessary to make all 10 upkeeps eligible _ = feeds.EmitEvents(t, backend, 1, func() { // pause per emit for expected block production time time.Sleep(3 * time.Second) }) }() go makeDummyBlocks(t, backend, 3*time.Second, 1000) idsToCheck := make([]*big.Int, 0) for i, uid := range feeds.UpkeepsIds() { if checkResultsProvider(i) { idsToCheck = append(idsToCheck, uid) } } listener, done := listenPerformed(t, backend, registry, idsToCheck, startBlock) defer done() g.Eventually(listener, testutils.WaitTimeout(t)-(5*time.Second), cltest.DBPollingInterval).Should(gomega.BeTrue()) })` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `nodeKeys[i] = cltest.MustGenerateRandomKey(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `genesisData[nodeKeys[i].Address] = core.GenesisAccount{Balance: assets.Ether(1000).ToInt()}` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `startMercuryServer(t, mercuryServer, func(i int) (int, []byte) { var resp int if i < len(errResponses) { resp = errResponses[i] } if resp == 0 { resp = http.StatusNotFound } return resp, nil })` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `resp = errResponses[i]` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `resp = http.StatusNotFound` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `_, err = linkToken.Transfer(linkOwner, upkeepOwner.From, big.NewInt(0).Mul(oneHunEth, big.NewInt(int64(upkeepCount+1))))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `backend.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `time.Sleep(3 * time.Second)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `go makeDummyBlocks(t, backend, 3*time.Second, 1000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `idsToCheck = append(idsToCheck, uid)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `g.Eventually(listener, testutils.WaitTimeout(t)-(5*time.Second), cltest.DBPollingInterval).Should(gomega.BeTrue())` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Read(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.HexToAddress(hexutil.Encode(b))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Encode(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.FilterNamesFromSpec21(spec)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.FilterNamesFromSpec21(spec)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.NewWithT(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Ether(10000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.ToInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Ether(10000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.ToInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Ether(10000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.ToInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Ether(1000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.ToInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Mine(backend, 3*time.Second)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.DeployLinkToken(sergey, backend)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(60000000000))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.NewInt(60000000000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(2000000000000000000))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.NewInt(2000000000000000000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.After(time.Second * 5)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Transfer(sergey, carrol.From, big.NewInt(0).Mul(oneHunEth, big.NewInt(int64(upkeeps+1))))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.NewInt(0)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Mul(oneHunEth, big.NewInt(int64(upkeeps+1)))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.NewInt(int64(upkeeps+1))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.DeployBasicUpkeepContract(carrol, backend)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.RegisterUpkeep(steve, upkeepAddr, 2_500_000, carrol.From, 0, []byte{}, []byte{}, []byte{})` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Transfer(sergey, carrol.From, oneHunEth)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Approve(carrol, registry.Address(), oneHunEth)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Address()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.AddFunds(carrol, upkeepID, oneHunEth)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.SetBytesToSend(carrol, payload1)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.SetShouldPerformUpkeep(carrol, true)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Infow("Upkeep registered and funded", "upkeepID", upkeepID.String())` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.ReceivedBytes(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Eventually(receivedBytes, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Should(gomega.Equal(payload1))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Equal(payload1)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.SetBytesToSend(carrol, payload2)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.SetShouldPerformUpkeep(carrol, true)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Eventually(receivedBytes, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Equal(payload2)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Run(tc.name, func(t *testing.T) { g := gomega.NewWithT(t) // setup blockchain sergey := testutils.MustNewSimTransactor(t) // owns all the link steve := testutils.MustNewSimTransactor(t) // registry owner carrol := testutils.MustNewSimTransactor(t) // upkeep owner genesisData := core.GenesisAlloc{ sergey.From: {Balance: assets.Ether(10000).ToInt()}, steve.From: {Balance: assets.Ether(10000).ToInt()}, carrol.From: {Balance: assets.Ether(10000).ToInt()}, } // Generate 5 keys for nodes (1 bootstrap + 4 ocr nodes) and fund them with ether var nodeKeys [5]ethkey.KeyV2 for i := int64(0); i < 5; i++ { nodeKeys[i] = cltest.MustGenerateRandomKey(t) genesisData[nodeKeys[i].Address] = core.GenesisAccount{Balance: assets.Ether(1000).ToInt()} } backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil)) stopMining := cltest.Mine(backend, 3*time.Second) // Should be greater than deltaRound since we cannot access old blocks on simulated blockchain defer stopMining() // Deploy registry linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(sergey, backend) require.NoError(t, err) gasFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(60000000000)) require.NoError(t, err) linkFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(2000000000000000000)) require.NoError(t, err) registry := deployKeeper21Registry(t, steve, backend, linkAddr, linkFeedAddr, gasFeedAddr) setupNodes(t, nodeKeys, registry, backend, steve, tc.logBufferVersion == logprovider.BufferVersionV1) upkeeps := 1 _, err = linkToken.Transfer(sergey, carrol.From, big.NewInt(0).Mul(oneHunEth, big.NewInt(int64(upkeeps+1)))) require.NoError(t, err) backend.Commit() ids, addrs, contracts := deployUpkeeps(t, backend, carrol, steve, linkToken, registry, upkeeps) require.Equal(t, upkeeps, len(ids)) require.Equal(t, len(ids), len(contracts)) require.Equal(t, len(ids), len(addrs)) backend.Commit() emits := 1 go emitEvents(testutils.Context(t), t, emits, contracts, carrol, func() { backend.Commit() }) listener, done := listenPerformed(t, backend, registry, ids, int64(1)) g.Eventually(listener, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.BeTrue()) done() t.Run("recover logs", func(t *testing.T) { addr, contract := addrs[0], contracts[0] upkeepID := registerUpkeep(t, registry, addr, carrol, steve, backend) backend.Commit() t.Logf("Registered new upkeep %s for address %s", upkeepID.String(), addr.String()) // Emit 100 logs in a burst recoverEmits := 100 i := 0 emitEvents(testutils.Context(t), t, 100, []*log_upkeep_counter_wrapper.LogUpkeepCounter{contract}, carrol, func() { i++ if i%(recoverEmits/4) == 0 { backend.Commit() time.Sleep(time.Millisecond * 250) // otherwise we get "invalid transaction nonce" errors } }) beforeDummyBlocks := backend.Blockchain().CurrentBlock().Number.Uint64() // Mine enough blocks to ensure these logs don't fall into log provider range dummyBlocks := 500 for i := 0; i < dummyBlocks; i++ { backend.Commit() time.Sleep(time.Millisecond * 10) } t.Logf("Mined %d blocks, waiting for logs to be recovered", dummyBlocks) listener, done := listenPerformedN(t, backend, registry, ids, int64(beforeDummyBlocks), recoverEmits) defer done() g.Eventually(listener, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.BeTrue()) }) })` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.NewWithT(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Ether(10000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.ToInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Ether(10000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.ToInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Ether(10000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.ToInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Ether(1000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.ToInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Mine(backend, 3*time.Second)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.DeployLinkToken(sergey, backend)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(60000000000))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.NewInt(60000000000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(2000000000000000000))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.NewInt(2000000000000000000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Transfer(sergey, carrol.From, big.NewInt(0).Mul(oneHunEth, big.NewInt(int64(upkeeps+1))))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.NewInt(0)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Mul(oneHunEth, big.NewInt(int64(upkeeps+1)))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.NewInt(int64(upkeeps+1))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Eventually(listener, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Should(gomega.BeTrue())` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.BeTrue()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Run("recover logs", func(t *testing.T) { addr, contract := addrs[0], contracts[0] upkeepID := registerUpkeep(t, registry, addr, carrol, steve, backend) backend.Commit() t.Logf("Registered new upkeep %s for address %s", upkeepID.String(), addr.String()) // Emit 100 logs in a burst recoverEmits := 100 i := 0 emitEvents(testutils.Context(t), t, 100, []*log_upkeep_counter_wrapper.LogUpkeepCounter{contract}, carrol, func() { i++ if i%(recoverEmits/4) == 0 { backend.Commit() time.Sleep(time.Millisecond * 250) // otherwise we get "invalid transaction nonce" errors } }) beforeDummyBlocks := backend.Blockchain().CurrentBlock().Number.Uint64() // Mine enough blocks to ensure these logs don't fall into log provider range dummyBlocks := 500 for i := 0; i < dummyBlocks; i++ { backend.Commit() time.Sleep(time.Millisecond * 10) } t.Logf("Mined %d blocks, waiting for logs to be recovered", dummyBlocks) listener, done := listenPerformedN(t, backend, registry, ids, int64(beforeDummyBlocks), recoverEmits) defer done() g.Eventually(listener, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.BeTrue()) })` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Sleep(time.Millisecond * 250)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Blockchain()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.CurrentBlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Number.Uint64()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Sleep(time.Millisecond * 10)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Eventually(listener, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Should(gomega.BeTrue())` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.BeTrue()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Run(tc.name, func(t *testing.T) { g := gomega.NewWithT(t) // setup blockchain linkOwner := testutils.MustNewSimTransactor(t) // owns all the link registryOwner := testutils.MustNewSimTransactor(t) // registry owner upkeepOwner := testutils.MustNewSimTransactor(t) // upkeep owner genesisData := core.GenesisAlloc{ linkOwner.From: {Balance: assets.Ether(10000).ToInt()}, registryOwner.From: {Balance: assets.Ether(10000).ToInt()}, upkeepOwner.From: {Balance: assets.Ether(10000).ToInt()}, } // Generate 5 keys for nodes (1 bootstrap + 4 ocr nodes) and fund them with ether var nodeKeys [5]ethkey.KeyV2 for i := int64(0); i < 5; i++ { nodeKeys[i] = cltest.MustGenerateRandomKey(t) genesisData[nodeKeys[i].Address] = core.GenesisAccount{Balance: assets.Ether(1000).ToInt()} } backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil)) stopMining := cltest.Mine(backend, 3*time.Second) // Should be greater than deltaRound since we cannot access old blocks on simulated blockchain defer stopMining() // Deploy registry linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(linkOwner, backend) require.NoError(t, err) gasFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(registryOwner, backend, 18, big.NewInt(60000000000)) require.NoError(t, err) linkFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(registryOwner, backend, 18, big.NewInt(2000000000000000000)) require.NoError(t, err) registry := deployKeeper21Registry(t, registryOwner, backend, linkAddr, linkFeedAddr, gasFeedAddr) _, mercuryServer := setupNodes(t, nodeKeys, registry, backend, registryOwner, tc.logBufferVersion == logprovider.BufferVersionV1) const upkeepCount = 10 const mercuryFailCount = upkeepCount * 3 * 2 // testing with the mercury server involves mocking responses. currently, // there is not a way to connect a mercury call to an upkeep id (though we // could add custom headers) so the test must be fairly basic and just // count calls before switching to successes var ( mu sync.Mutex count int ) mercuryServer.RegisterHandler(func(w http.ResponseWriter, r *http.Request) { mu.Lock() defer mu.Unlock() count++ _ = r.ParseForm() t.Logf("MercuryHTTPServe:RequestURI: %s", r.RequestURI) for key, value := range r.Form { t.Logf("MercuryHTTPServe:FormValue: key: %s; value: %s;", key, value) } // the streams lookup retries against the remote server 3 times before // returning a result as retryable. // the simulation here should force the streams lookup process to return // retryable 2 times. // the total count of failures should be (upkeepCount * 3 * tryCount) if count <= mercuryFailCount { w.WriteHeader(http.StatusNotFound) return } // start sending success messages output := `{"chainlinkBlob":"0x0001c38d71fed6c320b90e84b6f559459814d068e2a1700adc931ca9717d4fe70000000000000000000000000000000000000000000000000000000001a80b52b4bf1233f9cb71144a253a1791b202113c4ab4a92fa1b176d684b4959666ff8200000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001004254432d5553442d415242495452554d2d544553544e4554000000000000000000000000000000000000000000000000000000000000000000000000645570be000000000000000000000000000000000000000000000000000002af2b818dc5000000000000000000000000000000000000000000000000000002af2426faf3000000000000000000000000000000000000000000000000000002af32dc209700000000000000000000000000000000000000000000000000000000012130f8df0a9745bb6ad5e2df605e158ba8ad8a33ef8a0acf9851f0f01668a3a3f2b68600000000000000000000000000000000000000000000000000000000012130f60000000000000000000000000000000000000000000000000000000000000002c4a7958dce105089cf5edb68dad7dcfe8618d7784eb397f97d5a5fade78c11a58275aebda478968e545f7e3657aba9dcbe8d44605e4c6fde3e24edd5e22c94270000000000000000000000000000000000000000000000000000000000000002459c12d33986018a8959566d145225f0c4a4e61a9a3f50361ccff397899314f0018162cf10cd89897635a0bb62a822355bd199d09f4abe76e4d05261bb44733d"}` w.WriteHeader(http.StatusOK) _, _ = w.Write([]byte(output)) }) defer mercuryServer.Stop() _, err = linkToken.Transfer(linkOwner, upkeepOwner.From, big.NewInt(0).Mul(oneHunEth, big.NewInt(int64(upkeepCount+1)))) require.NoError(t, err) backend.Commit() feeds, err := newFeedLookupUpkeepController(backend, registryOwner) require.NoError(t, err, "no error expected from creating a feed lookup controller") // deploy multiple upkeeps that listen to a log emitter and need to be // performed for each log event _ = feeds.DeployUpkeeps(t, backend, upkeepOwner, upkeepCount, func(int) bool { return false }) _ = feeds.RegisterAndFund(t, registry, registryOwner, backend, linkToken) _ = feeds.EnableMercury(t, backend, registry, registryOwner) _ = feeds.VerifyEnv(t, backend, registry, registryOwner) // start emitting events in a separate go-routine // feed lookup relies on a single contract event log to perform multiple // listener contracts go func() { // only 1 event is necessary to make all 10 upkeeps eligible _ = feeds.EmitEvents(t, backend, 1, func() { // pause per emit for expected block production time time.Sleep(3 * time.Second) }) }() listener, done := listenPerformed(t, backend, registry, feeds.UpkeepsIds(), int64(1)) defer done() g.Eventually(listener, testutils.WaitTimeout(t)-(5*time.Second), cltest.DBPollingInterval).Should(gomega.BeTrue()) })` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.NewWithT(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Ether(10000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.ToInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Ether(10000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.ToInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Ether(10000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.ToInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Ether(1000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.ToInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Mine(backend, 3*time.Second)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.DeployLinkToken(linkOwner, backend)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.DeployMockV3AggregatorContract(registryOwner, backend, 18, big.NewInt(60000000000))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.NewInt(60000000000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.DeployMockV3AggregatorContract(registryOwner, backend, 18, big.NewInt(2000000000000000000))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.NewInt(2000000000000000000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.RegisterHandler(func(w http.ResponseWriter, r *http.Request) { mu.Lock() defer mu.Unlock() count++ _ = r.ParseForm() t.Logf("MercuryHTTPServe:RequestURI: %s", r.RequestURI) for key, value := range r.Form { t.Logf("MercuryHTTPServe:FormValue: key: %s; value: %s;", key, value) } // the streams lookup retries against the remote server 3 times before // returning a result as retryable. // the simulation here should force the streams lookup process to return // retryable 2 times. // the total count of failures should be (upkeepCount * 3 * tryCount) if count <= mercuryFailCount { w.WriteHeader(http.StatusNotFound) return } // start sending success messages output := `{"chainlinkBlob":"0x0001c38d71fed6c320b90e84b6f559459814d068e2a1700adc931ca9717d4fe70000000000000000000000000000000000000000000000000000000001a80b52b4bf1233f9cb71144a253a1791b202113c4ab4a92fa1b176d684b4959666ff8200000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001004254432d5553442d415242495452554d2d544553544e4554000000000000000000000000000000000000000000000000000000000000000000000000645570be000000000000000000000000000000000000000000000000000002af2b818dc5000000000000000000000000000000000000000000000000000002af2426faf3000000000000000000000000000000000000000000000000000002af32dc209700000000000000000000000000000000000000000000000000000000012130f8df0a9745bb6ad5e2df605e158ba8ad8a33ef8a0acf9851f0f01668a3a3f2b68600000000000000000000000000000000000000000000000000000000012130f60000000000000000000000000000000000000000000000000000000000000002c4a7958dce105089cf5edb68dad7dcfe8618d7784eb397f97d5a5fade78c11a58275aebda478968e545f7e3657aba9dcbe8d44605e4c6fde3e24edd5e22c94270000000000000000000000000000000000000000000000000000000000000002459c12d33986018a8959566d145225f0c4a4e61a9a3f50361ccff397899314f0018162cf10cd89897635a0bb62a822355bd199d09f4abe76e4d05261bb44733d"}` w.WriteHeader(http.StatusOK) _, _ = w.Write([]byte(output)) })` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Lock()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Unlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.ParseForm()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.WriteHeader(http.StatusNotFound)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.WriteHeader(http.StatusOK)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Write([]byte(output))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Stop()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Transfer(linkOwner, upkeepOwner.From, big.NewInt(0).Mul(oneHunEth, big.NewInt(int64(upkeepCount+1))))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.NewInt(0)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Mul(oneHunEth, big.NewInt(int64(upkeepCount+1)))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.NewInt(int64(upkeepCount+1))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.DeployUpkeeps(t, backend, upkeepOwner, upkeepCount, func(int) bool { return false })` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.RegisterAndFund(t, registry, registryOwner, backend, linkToken)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.EnableMercury(t, backend, registry, registryOwner)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.VerifyEnv(t, backend, registry, registryOwner)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.EmitEvents(t, backend, 1, func() { // pause per emit for expected block production time time.Sleep(3 * time.Second) })` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Sleep(3 * time.Second)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.UpkeepsIds()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Eventually(listener, testutils.WaitTimeout(t)-(5*time.Second), cltest.DBPollingInterval)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Should(gomega.BeTrue())` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.BeTrue()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Run(tc.name, func(t *testing.T) { g := gomega.NewWithT(t) // setup blockchain linkOwner := testutils.MustNewSimTransactor(t) // owns all the link registryOwner := testutils.MustNewSimTransactor(t) // registry owner upkeepOwner := testutils.MustNewSimTransactor(t) // upkeep owner genesisData := core.GenesisAlloc{ linkOwner.From: {Balance: assets.Ether(10000).ToInt()}, registryOwner.From: {Balance: assets.Ether(10000).ToInt()}, upkeepOwner.From: {Balance: assets.Ether(10000).ToInt()}, } // Generate 5 keys for nodes (1 bootstrap + 4 ocr nodes) and fund them with ether var nodeKeys [5]ethkey.KeyV2 for i := int64(0); i < 5; i++ { nodeKeys[i] = cltest.MustGenerateRandomKey(t) genesisData[nodeKeys[i].Address] = core.GenesisAccount{Balance: assets.Ether(1000).ToInt()} } backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil)) stopMining := cltest.Mine(backend, 3*time.Second) // Should be greater than deltaRound since we cannot access old blocks on simulated blockchain defer stopMining() // Deploy registry linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(linkOwner, backend) require.NoError(t, err) gasFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(registryOwner, backend, 18, big.NewInt(60000000000)) require.NoError(t, err) linkFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(registryOwner, backend, 18, big.NewInt(2000000000000000000)) require.NoError(t, err) registry := deployKeeper21Registry(t, registryOwner, backend, linkAddr, linkFeedAddr, gasFeedAddr) _, mercuryServer := setupNodes(t, nodeKeys, registry, backend, registryOwner, tc.logBufferVersion == logprovider.BufferVersionV1) upkeepCount := 10 errResponses := []int{ http.StatusUnauthorized, http.StatusBadRequest, http.StatusInternalServerError, http.StatusNotFound, http.StatusNotFound, http.StatusNotFound, http.StatusUnauthorized, } startMercuryServer(t, mercuryServer, func(i int) (int, []byte) { var resp int if i < len(errResponses) { resp = errResponses[i] } if resp == 0 { resp = http.StatusNotFound } return resp, nil }) defer mercuryServer.Stop() _, err = linkToken.Transfer(linkOwner, upkeepOwner.From, big.NewInt(0).Mul(oneHunEth, big.NewInt(int64(upkeepCount+1)))) require.NoError(t, err) backend.Commit() feeds, err := newFeedLookupUpkeepController(backend, registryOwner) require.NoError(t, err, "no error expected from creating a feed lookup controller") // deploy multiple upkeeps that listen to a log emitter and need to be // performed for each log event checkResultsProvider := func(i int) bool { return i%2 == 1 } require.NoError(t, feeds.DeployUpkeeps(t, backend, upkeepOwner, upkeepCount, checkResultsProvider)) require.NoError(t, feeds.RegisterAndFund(t, registry, registryOwner, backend, linkToken)) require.NoError(t, feeds.EnableMercury(t, backend, registry, registryOwner)) require.NoError(t, feeds.VerifyEnv(t, backend, registry, registryOwner)) startBlock := backend.Blockchain().CurrentBlock().Number.Int64() // start emitting events in a separate go-routine // feed lookup relies on a single contract event log to perform multiple // listener contracts go func() { // only 1 event is necessary to make all 10 upkeeps eligible _ = feeds.EmitEvents(t, backend, 1, func() { // pause per emit for expected block production time time.Sleep(3 * time.Second) }) }() go makeDummyBlocks(t, backend, 3*time.Second, 1000) idsToCheck := make([]*big.Int, 0) for i, uid := range feeds.UpkeepsIds() { if checkResultsProvider(i) { idsToCheck = append(idsToCheck, uid) } } listener, done := listenPerformed(t, backend, registry, idsToCheck, startBlock) defer done() g.Eventually(listener, testutils.WaitTimeout(t)-(5*time.Second), cltest.DBPollingInterval).Should(gomega.BeTrue()) })` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.NewWithT(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Ether(10000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.ToInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Ether(10000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.ToInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Ether(10000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.ToInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Ether(1000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.ToInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Mine(backend, 3*time.Second)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.DeployLinkToken(linkOwner, backend)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.DeployMockV3AggregatorContract(registryOwner, backend, 18, big.NewInt(60000000000))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.NewInt(60000000000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.DeployMockV3AggregatorContract(registryOwner, backend, 18, big.NewInt(2000000000000000000))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.NewInt(2000000000000000000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Stop()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Transfer(linkOwner, upkeepOwner.From, big.NewInt(0).Mul(oneHunEth, big.NewInt(int64(upkeepCount+1))))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.NewInt(0)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Mul(oneHunEth, big.NewInt(int64(upkeepCount+1)))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.NewInt(int64(upkeepCount+1))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Blockchain()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.CurrentBlock()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Number.Int64()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.EmitEvents(t, backend, 1, func() { // pause per emit for expected block production time time.Sleep(3 * time.Second) })` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Sleep(3 * time.Second)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.UpkeepsIds()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Eventually(listener, testutils.WaitTimeout(t)-(5*time.Second), cltest.DBPollingInterval)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.Should(gomega.BeTrue())` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go: `.BeTrue()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `nodeKeys[i] = cltest.MustGenerateRandomKey(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `genesisData[nodeKeys[i].Address] = core.GenesisAccount{Balance: assets.Ether(1000).ToInt()}` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `nodes = append(nodes, Node{ app, transmitter, kb, })` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `oracles = append(oracles, confighelper.OracleIdentityExtra{ OracleIdentity: confighelper.OracleIdentity{ OnchainPublicKey: offchainPublicKey, TransmitAccount: ocrTypes.Account(transmitter.String()), OffchainPublicKey: kb.OffchainPublicKey(), PeerID: peerID, }, ConfigEncryptionPublicKey: kb.ConfigEncryptionPublicKey(), })` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `bootstrapNode.AddBootstrapJob(t, fmt.Sprintf(` type = "bootstrap" relay = "evm" schemaVersion = 1 name = "boot" contractID = "%s" contractConfigTrackerPollInterval = "15s" [relayConfig] chainID = 1337 `, registry.Address()))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `node.AddJob(t, fmt.Sprintf(` type = "offchainreporting2" pluginType = "ocr2automation" relay = "evm" name = "ocr2keepers-%d" schemaVersion = 1 contractID = "%s" contractConfigTrackerPollInterval = "15s" ocrKeyBundleID = "%s" transmitterID = "%s" p2pv2Bootstrappers = [ "%s" ] [relayConfig] chainID = 1337 [pluginConfig] maxServiceWorkers = 100 cacheEvictionInterval = "1s" mercuryCredentialName = "%s" `, i, registry.Address(), node.KeyBundle.ID(), node.Transmitter, fmt.Sprintf("%s@127.0.0.1:%d", bootstrapPeerID, bootstrapNodePort), MercuryCredName))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `lggr.Infow("Setting Config on Oracle Contract", "signerAddresses", signerAddresses, "transmitterAddresses", transmitterAddresses, "threshold", threshold, "onchainConfig", onchainConfig, "encodedConfigVersion", offchainConfigVersion, "offchainConfig", offchainConfig, )` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `_, err = registry.SetConfig( steve, signerAddresses, transmitterAddresses, threshold, onchainConfig, offchainConfigVersion, offchainConfig, )` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `backend.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `backend.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `_, err = linkToken.Transfer(sergey, carrol.From, oneHunEth)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `_, err = linkToken.Approve(carrol, registry.Address(), oneHunEth)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `_, err = registry.AddFunds(carrol, upkeepID, oneHunEth)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `backend.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `_, err = upkeepContract.SetBytesToSend(carrol, payload1)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `_, err = upkeepContract.SetShouldPerformUpkeep(carrol, true)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `backend.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `lggr.Infow("Upkeep registered and funded", "upkeepID", upkeepID.String())` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `g.Eventually(receivedBytes, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.Equal(payload1))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `_, err = upkeepContract.SetBytesToSend(carrol, payload2)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `_, err = upkeepContract.SetShouldPerformUpkeep(carrol, true)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `nodeKeys[i] = cltest.MustGenerateRandomKey(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `genesisData[nodeKeys[i].Address] = core.GenesisAccount{Balance: assets.Ether(1000).ToInt()}` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `effectiveTransmitters = append(effectiveTransmitters, nodeForwarder)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `nodes = append(nodes, Node{ app, transmitter, kb, })` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `oracles = append(oracles, confighelper.OracleIdentityExtra{ OracleIdentity: confighelper.OracleIdentity{ OnchainPublicKey: offchainPublicKey, TransmitAccount: ocrTypes.Account(nodeForwarder.String()), OffchainPublicKey: kb.OffchainPublicKey(), PeerID: peerID, }, ConfigEncryptionPublicKey: kb.ConfigEncryptionPublicKey(), })` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `bootstrapNode.AddBootstrapJob(t, fmt.Sprintf(` type = "bootstrap" relay = "evm" schemaVersion = 1 name = "boot" contractID = "%s" contractConfigTrackerPollInterval = "15s" [relayConfig] chainID = 1337 `, registry.Address()))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `node.AddJob(t, fmt.Sprintf(` type = "offchainreporting2" pluginType = "ocr2automation" relay = "evm" name = "ocr2keepers-%d" schemaVersion = 1 contractID = "%s" contractConfigTrackerPollInterval = "15s" ocrKeyBundleID = "%s" transmitterID = "%s" p2pv2Bootstrappers = [ "%s" ] forwardingAllowed = true [relayConfig] chainID = 1337 [pluginConfig] cacheEvictionInterval = "1s" maxServiceWorkers = 100 mercuryCredentialName = "%s" `, i, registry.Address(), node.KeyBundle.ID(), node.Transmitter, fmt.Sprintf("%s@127.0.0.1:%d", bootstrapPeerID, bootstrapNodePort), MercuryCredName))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `eoaList = append(eoaList, n.Transmitter)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `lggr.Infow("Setting Config on Oracle Contract", "signerAddresses", signerAddresses, "transmitterAddresses", transmitterAddresses, "threshold", threshold, "onchainConfig", onchainConfig, "encodedConfigVersion", offchainConfigVersion, "offchainConfig", offchainConfig, )` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `_, err = registry.SetConfig( steve, signerAddresses, transmitterAddresses, threshold, onchainConfig, offchainConfigVersion, offchainConfig, )` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `backend.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `backend.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `_, err = linkToken.Transfer(sergey, carrol.From, oneHunEth)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `_, err = linkToken.Approve(carrol, registry.Address(), oneHunEth)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `_, err = registry.AddFunds(carrol, upkeepID, oneHunEth)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `backend.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `_, err = upkeepContract.SetBytesToSend(carrol, payload1)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `_, err = upkeepContract.SetShouldPerformUpkeep(carrol, true)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `backend.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `lggr.Infow("Upkeep registered and funded")` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `g.Eventually(receivedBytes, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.Equal(payload1))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `_, err = upkeepContract.SetBytesToSend(carrol, payload2)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `_, err = upkeepContract.SetShouldPerformUpkeep(carrol, true)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `spec = &job.OCR2OracleSpec{ PluginType: types.OCR2Keeper, ContractID: "0x5431", // invalid contract addr }` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `_, err = ocr2keeper.FilterNamesFromSpec20(spec)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.NewWithT(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Ether(1000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.ToInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Ether(1000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.ToInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Ether(1000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.ToInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Ether(1000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.ToInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Mine(backend, 3*time.Second)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.DeployLinkToken(sergey, backend)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(60000000000))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.NewInt(60000000000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(2000000000000000000))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.NewInt(2000000000000000000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.GetOne(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.NewSimulatedMercuryServer()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.GetN(t, 4)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Sprintf("127.0.0.1:%d", bootstrapNodePort)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.NewSimulatedMercuryServer()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.DecodeString(strings.TrimPrefix(kb.OnChainPublicKey(), "0x"))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.TrimPrefix(kb.OnChainPublicKey(), "0x")` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.OnChainPublicKey()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Account(transmitter.String())` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.OffchainPublicKey()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.ConfigEncryptionPublicKey()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.AddBootstrapJob(t, fmt.Sprintf(` type = "bootstrap" relay = "evm" schemaVersion = 1 name = "boot" contractID = "%s" contractConfigTrackerPollInterval = "15s" [relayConfig] chainID = 1337 `, registry.Address()))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Sprintf(` type = "bootstrap" relay = "evm" schemaVersion = 1 name = "boot" contractID = "%s" contractConfigTrackerPollInterval = "15s" [relayConfig] chainID = 1337 `, registry.Address())` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Address()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.AddJob(t, fmt.Sprintf(` type = "offchainreporting2" pluginType = "ocr2automation" relay = "evm" name = "ocr2keepers-%d" schemaVersion = 1 contractID = "%s" contractConfigTrackerPollInterval = "15s" ocrKeyBundleID = "%s" transmitterID = "%s" p2pv2Bootstrappers = [ "%s" ] [relayConfig] chainID = 1337 [pluginConfig] maxServiceWorkers = 100 cacheEvictionInterval = "1s" mercuryCredentialName = "%s" `, i, registry.Address(), node.KeyBundle.ID(), node.Transmitter, fmt.Sprintf("%s@127.0.0.1:%d", bootstrapPeerID, bootstrapNodePort), MercuryCredName))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Sprintf(` type = "offchainreporting2" pluginType = "ocr2automation" relay = "evm" name = "ocr2keepers-%d" schemaVersion = 1 contractID = "%s" contractConfigTrackerPollInterval = "15s" ocrKeyBundleID = "%s" transmitterID = "%s" p2pv2Bootstrappers = [ "%s" ] [relayConfig] chainID = 1337 [pluginConfig] maxServiceWorkers = 100 cacheEvictionInterval = "1s" mercuryCredentialName = "%s" `, i, registry.Address(), node.KeyBundle.ID(), node.Transmitter, fmt.Sprintf("%s@127.0.0.1:%d", bootstrapPeerID, bootstrapNodePort), MercuryCredName)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Address()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.KeyBundle.ID()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Sprintf("%s@127.0.0.1:%d", bootstrapPeerID, bootstrapNodePort)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.MustNewType("tuple(uint32 paymentPremiumPPB,uint32 flatFeeMicroLink,uint32 checkGasLimit,uint24 stalenessSeconds,uint16 gasCeilingMultiplier,uint96 minUpkeepSpend,uint32 maxPerformGas,uint32 maxCheckDataSize,uint32 maxPerformDataSize,uint256 fallbackGasPrice,uint256 fallbackLinkPrice,address transcoder,address registrar)")` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Encode(map[string]interface{}{ "paymentPremiumPPB": uint32(0), "flatFeeMicroLink": uint32(0), "checkGasLimit": uint32(6500000), "stalenessSeconds": uint32(90000), "gasCeilingMultiplier": uint16(2), "minUpkeepSpend": uint32(0), "maxPerformGas": uint32(5000000), "maxCheckDataSize": uint32(5000), "maxPerformDataSize": uint32(5000), "fallbackGasPrice": big.NewInt(60000000000), "fallbackLinkPrice": big.NewInt(2000000000000000000), "transcoder": testutils.NewAddress(), "registrar": testutils.NewAddress(), }, configType)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.NewInt(60000000000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.NewInt(2000000000000000000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.NewAddress()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.NewAddress()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Marshal(config.OffchainConfig{ PerformLockoutWindow: 100 * 3 * 1000, // ~100 block lockout (on goerli) MinConfirmations: 1, })` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.ContractSetConfigArgsForTests( 10*time.Second, // deltaProgress time.Duration, 10*time.Second, // deltaResend time.Duration, 2500*time.Millisecond, // deltaRound time.Duration, 40*time.Millisecond, // deltaGrace time.Duration, 15*time.Second, // deltaStage time.Duration, 3, // rMax uint8, []int{1, 1, 1, 1}, oracles, offC, // reportingPluginConfig []byte, 20*time.Millisecond, // Max duration query 1600*time.Millisecond, // Max duration observation 800*time.Millisecond, 20*time.Millisecond, 20*time.Millisecond, 1, // f onchainConfig, )` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.OnchainPublicKeyToAddress(signers)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Infow("Setting Config on Oracle Contract", "signerAddresses", signerAddresses, "transmitterAddresses", transmitterAddresses, "threshold", threshold, "onchainConfig", onchainConfig, "encodedConfigVersion", offchainConfigVersion, "offchainConfig", offchainConfig, )` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.SetConfig( steve, signerAddresses, transmitterAddresses, threshold, onchainConfig, offchainConfigVersion, offchainConfig, )` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.DeployBasicUpkeepContract(carrol, backend)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.RegisterUpkeep(steve, upkeepAddr, 2_500_000, carrol.From, []byte{}, []byte{})` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Transfer(sergey, carrol.From, oneHunEth)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Approve(carrol, registry.Address(), oneHunEth)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Address()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.AddFunds(carrol, upkeepID, oneHunEth)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.SetBytesToSend(carrol, payload1)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.SetShouldPerformUpkeep(carrol, true)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Infow("Upkeep registered and funded", "upkeepID", upkeepID.String())` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.ReceivedBytes(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Eventually(receivedBytes, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Should(gomega.Equal(payload1))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Equal(payload1)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.SetBytesToSend(carrol, payload2)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.SetShouldPerformUpkeep(carrol, true)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Eventually(receivedBytes, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Equal(payload2)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.NewWithT(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Ether(1000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.ToInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Ether(1000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.ToInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Ether(1000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.ToInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Ether(1000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.ToInt()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Mine(backend, 6*time.Second)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.DeployLinkToken(sergey, backend)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(60000000000))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.NewInt(60000000000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(2000000000000000000))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.NewInt(2000000000000000000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.GetOne(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.NewSimulatedMercuryServer()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.GetN(t, 4)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Sprintf("127.0.0.1:%d", bootstrapNodePort)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.NewSimulatedMercuryServer()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.DecodeString(strings.TrimPrefix(kb.OnChainPublicKey(), "0x"))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.TrimPrefix(kb.OnChainPublicKey(), "0x")` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.OnChainPublicKey()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Account(nodeForwarder.String())` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.OffchainPublicKey()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.ConfigEncryptionPublicKey()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.AddBootstrapJob(t, fmt.Sprintf(` type = "bootstrap" relay = "evm" schemaVersion = 1 name = "boot" contractID = "%s" contractConfigTrackerPollInterval = "15s" [relayConfig] chainID = 1337 `, registry.Address()))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Sprintf(` type = "bootstrap" relay = "evm" schemaVersion = 1 name = "boot" contractID = "%s" contractConfigTrackerPollInterval = "15s" [relayConfig] chainID = 1337 `, registry.Address())` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Address()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.AddJob(t, fmt.Sprintf(` type = "offchainreporting2" pluginType = "ocr2automation" relay = "evm" name = "ocr2keepers-%d" schemaVersion = 1 contractID = "%s" contractConfigTrackerPollInterval = "15s" ocrKeyBundleID = "%s" transmitterID = "%s" p2pv2Bootstrappers = [ "%s" ] forwardingAllowed = true [relayConfig] chainID = 1337 [pluginConfig] cacheEvictionInterval = "1s" maxServiceWorkers = 100 mercuryCredentialName = "%s" `, i, registry.Address(), node.KeyBundle.ID(), node.Transmitter, fmt.Sprintf("%s@127.0.0.1:%d", bootstrapPeerID, bootstrapNodePort), MercuryCredName))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Sprintf(` type = "offchainreporting2" pluginType = "ocr2automation" relay = "evm" name = "ocr2keepers-%d" schemaVersion = 1 contractID = "%s" contractConfigTrackerPollInterval = "15s" ocrKeyBundleID = "%s" transmitterID = "%s" p2pv2Bootstrappers = [ "%s" ] forwardingAllowed = true [relayConfig] chainID = 1337 [pluginConfig] cacheEvictionInterval = "1s" maxServiceWorkers = 100 mercuryCredentialName = "%s" `, i, registry.Address(), node.KeyBundle.ID(), node.Transmitter, fmt.Sprintf("%s@127.0.0.1:%d", bootstrapPeerID, bootstrapNodePort), MercuryCredName)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Address()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.KeyBundle.ID()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Sprintf("%s@127.0.0.1:%d", bootstrapPeerID, bootstrapNodePort)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.MustNewType("tuple(uint32 paymentPremiumPPB,uint32 flatFeeMicroLink,uint32 checkGasLimit,uint24 stalenessSeconds,uint16 gasCeilingMultiplier,uint96 minUpkeepSpend,uint32 maxPerformGas,uint32 maxCheckDataSize,uint32 maxPerformDataSize,uint256 fallbackGasPrice,uint256 fallbackLinkPrice,address transcoder,address registrar)")` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Encode(map[string]interface{}{ "paymentPremiumPPB": uint32(0), "flatFeeMicroLink": uint32(0), "checkGasLimit": uint32(6500000), "stalenessSeconds": uint32(90000), "gasCeilingMultiplier": uint16(2), "minUpkeepSpend": uint32(0), "maxPerformGas": uint32(5000000), "maxCheckDataSize": uint32(5000), "maxPerformDataSize": uint32(5000), "fallbackGasPrice": big.NewInt(60000000000), "fallbackLinkPrice": big.NewInt(2000000000000000000), "transcoder": testutils.NewAddress(), "registrar": testutils.NewAddress(), }, configType)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.NewInt(60000000000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.NewInt(2000000000000000000)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.NewAddress()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.NewAddress()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Marshal(config.OffchainConfig{ PerformLockoutWindow: 100 * 12 * 1000, // ~100 block lockout (on goerli) })` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.ContractSetConfigArgsForTests( 10*time.Second, // deltaProgress time.Duration, 10*time.Second, // deltaResend time.Duration, 5*time.Second, // deltaRound time.Duration, 500*time.Millisecond, // deltaGrace time.Duration, 2*time.Second, // deltaStage time.Duration, 3, // rMax uint8, []int{1, 1, 1, 1}, oracles, offC, // reportingPluginConfig []byte, 50*time.Millisecond, // Max duration query 1*time.Second, // Max duration observation 1*time.Second, 1*time.Second, 1*time.Second, 1, // f onchainConfig, )` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.OnchainPublicKeyToAddress(signers)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Infow("Setting Config on Oracle Contract", "signerAddresses", signerAddresses, "transmitterAddresses", transmitterAddresses, "threshold", threshold, "onchainConfig", onchainConfig, "encodedConfigVersion", offchainConfigVersion, "offchainConfig", offchainConfig, )` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.SetConfig( steve, signerAddresses, transmitterAddresses, threshold, onchainConfig, offchainConfigVersion, offchainConfig, )` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.DeployBasicUpkeepContract(carrol, backend)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.RegisterUpkeep(steve, upkeepAddr, 2_500_000, carrol.From, []byte{}, []byte{})` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Transfer(sergey, carrol.From, oneHunEth)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Approve(carrol, registry.Address(), oneHunEth)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Address()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.AddFunds(carrol, upkeepID, oneHunEth)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.SetBytesToSend(carrol, payload1)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.SetShouldPerformUpkeep(carrol, true)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Commit()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Infow("Upkeep registered and funded")` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.ReceivedBytes(nil)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Eventually(receivedBytes, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Should(gomega.Equal(payload1))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Equal(payload1)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.SetBytesToSend(carrol, payload2)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.SetShouldPerformUpkeep(carrol, true)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Eventually(receivedBytes, testutils.WaitTimeout(t), cltest.DBPollingInterval)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Equal(payload2)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Read(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.HexToAddress(hexutil.Encode(b))` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.Encode(b)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.String()` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.FilterNamesFromSpec20(spec)` $DIR/core/services/ocr2/plugins/ocr2keeper/integration_test.go: `.FilterNamesFromSpec20(spec)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `t.Run("valid output", func(t *testing.T) { onchainRouter := mocks.NewVRFBeaconCoordinator(t) onchainRouter. On("IBeaconPeriodBlocks", mock.Anything). Return(big.NewInt(10), nil) c := &coordinator{ onchainRouter: onchainRouter, } period, err := c.BeaconPeriod(testutils.Context(t)) assert.NoError(t, err) assert.Equal(t, uint16(10), period) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `onchainRouter. On("IBeaconPeriodBlocks", mock.Anything). Return(big.NewInt(10), nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `onchainRouter. On("IBeaconPeriodBlocks", mock.Anything). Return(nil, errors.New("rpc error"))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `evmClient.On("ConfiguredChainID").Return(big.NewInt(1))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `t.Run("happy path", func(t *testing.T) { // In this test the DKG and VRF committees have the same signers and // transmitters. This may (?) be different in practice. lp := lp_mocks.NewLogPoller(t) tp := newTopics() coordinatorAddress := newAddress(t) beaconAddress := newAddress(t) dkgAddress := newAddress(t) lp.On("LatestLogByEventSigWithConfs", mock.Anything, tp.configSetTopic, beaconAddress, evmtypes.Confirmations(10)). Return(&logpoller.Log{ Data: hexutil.MustDecode("0x0000000000000000000000000000000000000000000000000000000000a6fca200010576e704b4a519484d6239ef17f1f5b4a82e330b0daf827ed4dc2789971b0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000a8cbea12a06869d3ec432ab9682dab6c761d591000000000000000000000000f4f9db7bb1d16b7cdfb18ec68994c26964f5985300000000000000000000000022fb3f90c539457f00d8484438869135e604a65500000000000000000000000033cbcedccb11c9773ad78e214ba342e979255ab30000000000000000000000006ffaa96256fbc1012325cca88c79f725c33eed80000000000000000000000000000000000000000000000000000000000000000500000000000000000000000074103cf8b436465870b26aa9fa2f62ad62b22e3500000000000000000000000038a6cb196f805cc3041f6645a5a6cec27b64430d00000000000000000000000047d7095cfebf8285bdaa421bc8268d0db87d933c000000000000000000000000a8842be973800ff61d80d2d53fa62c3a685380eb0000000000000000000000003750e31321aee8c024751877070e8d5f704ce98700000000000000000000000000000000000000000000000000000000000000206f3b82406688b8ddb944c6f2e6d808f014c8fa8d568d639c25019568c715fbf000000000000000000000000000000000000000000000000000000000000004220880d88ee16f1080c8afa0251880c8afa025208090dfc04a288090dfc04a30033a05010101010142206c5ca6f74b532222ac927dd3de235d46a943e372c0563393a33b01dcfd3f371c4220855114d25c2ef5e85fffe4f20a365672d8f2dba3b2ec82333f494168a2039c0442200266e835634db00977cbc1caa4db10e1676c1a4c0fcbc6ba7f09300f0d1831824220980cd91f7a73f20f4b0d51d00cd4e00373dc2beafbb299ca3c609757ab98c8304220eb6d36e2af8922085ff510bbe1eb8932a0e3295ca9f047fef25d90e69c52948f4a34313244334b6f6f574463364b7232644542684b59326b336e685057694676544565325331703978544532544b74344d7572716f684a34313244334b6f6f574b436e4367724b637743324a3577576a626e355435335068646b6b6f57454e534a39546537544b7836366f4a4a34313244334b6f6f575239616f675948786b357a38636b624c4c56346e426f7a777a747871664a7050586671336d4a7232796452474a34313244334b6f6f5744695444635565675637776b313133473366476a69616259756f54436f3157726f6f53656741343263556f544a34313244334b6f6f574e64687072586b5472665370354d5071736270467a70364167394a53787358694341434442676454424c656652820300050e416c74424e2d3132382047e282810e86e8cf899ae9a1b43e023bbe8825b103659bb8d6d4e54f6a3cfae7b106069c216a812d7616e47f0bd38fa4863f48fbcda6a38af4c58d2233dfa7cf79620947042d09f923e0a2f7a2270391e8b058d8bdb8f79fe082b7b627f025651c7290382fdff97c3181d15d162c146ce87ff752499d2acc2b26011439a12e29571a6f1e1defb1751c3be4258c493984fd9f0f6b4a26c539870b5f15bfed3d8ffac92499eb62dbd2beb7c1524275a8019022f6ce6a7e86c9e65e3099452a2b96fc2432b127a112970e1adf615f823b2b2180754c2f0ee01f1b389e56df55ca09702cd0401b66ff71779d2dd67222503a85ab921b28c329cc1832800b192d0b0247c0776e1b9653dc00df48daa6364287c84c0382f5165e7269fef06d10bc67c1bba252305d1af0dc7bb0fe92558eb4c5f38c23163dee1cfb34a72020669dbdfe337c16f3307472616e736c61746f722066726f6d20416c74424e2d3132382047e2828120746f20416c74424e2d3132382047e282825880ade2046080c8afa0256880c8afa0257080ade204788094ebdc0382019e010a205034214e0bd4373f38e162cf9fc9133e2f3b71441faa4c3d1ac01c1877f1cd2712200e03e975b996f911abba2b79d2596c2150bc94510963c40a1137a03df6edacdb1a107dee1cdb894163813bb3da604c9c133c1a10bb33302eeafbd55d352e35dcc5d2b3311a10d2c658b6b93d74a02d467849b6fe75251a10fea5308cc1fea69e7246eafe7ca8a3a51a1048efe1ad873b6f025ac0243bdef715f8000000000000000000000000000000000000000000000000000000000000"), }, nil) lp.On("LatestLogByEventSigWithConfs", mock.Anything, tp.configSetTopic, dkgAddress, evmtypes.Confirmations(10)). Return(&logpoller.Log{ Data: hexutil.MustDecode("0x0000000000000000000000000000000000000000000000000000000000a6fca200010576e704b4a519484d6239ef17f1f5b4a82e330b0daf827ed4dc2789971b0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000a8cbea12a06869d3ec432ab9682dab6c761d591000000000000000000000000f4f9db7bb1d16b7cdfb18ec68994c26964f5985300000000000000000000000022fb3f90c539457f00d8484438869135e604a65500000000000000000000000033cbcedccb11c9773ad78e214ba342e979255ab30000000000000000000000006ffaa96256fbc1012325cca88c79f725c33eed80000000000000000000000000000000000000000000000000000000000000000500000000000000000000000074103cf8b436465870b26aa9fa2f62ad62b22e3500000000000000000000000038a6cb196f805cc3041f6645a5a6cec27b64430d00000000000000000000000047d7095cfebf8285bdaa421bc8268d0db87d933c000000000000000000000000a8842be973800ff61d80d2d53fa62c3a685380eb0000000000000000000000003750e31321aee8c024751877070e8d5f704ce98700000000000000000000000000000000000000000000000000000000000000206f3b82406688b8ddb944c6f2e6d808f014c8fa8d568d639c25019568c715fbf000000000000000000000000000000000000000000000000000000000000004220880d88ee16f1080c8afa0251880c8afa025208090dfc04a288090dfc04a30033a05010101010142206c5ca6f74b532222ac927dd3de235d46a943e372c0563393a33b01dcfd3f371c4220855114d25c2ef5e85fffe4f20a365672d8f2dba3b2ec82333f494168a2039c0442200266e835634db00977cbc1caa4db10e1676c1a4c0fcbc6ba7f09300f0d1831824220980cd91f7a73f20f4b0d51d00cd4e00373dc2beafbb299ca3c609757ab98c8304220eb6d36e2af8922085ff510bbe1eb8932a0e3295ca9f047fef25d90e69c52948f4a34313244334b6f6f574463364b7232644542684b59326b336e685057694676544565325331703978544532544b74344d7572716f684a34313244334b6f6f574b436e4367724b637743324a3577576a626e355435335068646b6b6f57454e534a39546537544b7836366f4a4a34313244334b6f6f575239616f675948786b357a38636b624c4c56346e426f7a777a747871664a7050586671336d4a7232796452474a34313244334b6f6f5744695444635565675637776b313133473366476a69616259756f54436f3157726f6f53656741343263556f544a34313244334b6f6f574e64687072586b5472665370354d5071736270467a70364167394a53787358694341434442676454424c656652820300050e416c74424e2d3132382047e282810e86e8cf899ae9a1b43e023bbe8825b103659bb8d6d4e54f6a3cfae7b106069c216a812d7616e47f0bd38fa4863f48fbcda6a38af4c58d2233dfa7cf79620947042d09f923e0a2f7a2270391e8b058d8bdb8f79fe082b7b627f025651c7290382fdff97c3181d15d162c146ce87ff752499d2acc2b26011439a12e29571a6f1e1defb1751c3be4258c493984fd9f0f6b4a26c539870b5f15bfed3d8ffac92499eb62dbd2beb7c1524275a8019022f6ce6a7e86c9e65e3099452a2b96fc2432b127a112970e1adf615f823b2b2180754c2f0ee01f1b389e56df55ca09702cd0401b66ff71779d2dd67222503a85ab921b28c329cc1832800b192d0b0247c0776e1b9653dc00df48daa6364287c84c0382f5165e7269fef06d10bc67c1bba252305d1af0dc7bb0fe92558eb4c5f38c23163dee1cfb34a72020669dbdfe337c16f3307472616e736c61746f722066726f6d20416c74424e2d3132382047e2828120746f20416c74424e2d3132382047e282825880ade2046080c8afa0256880c8afa0257080ade204788094ebdc0382019e010a205034214e0bd4373f38e162cf9fc9133e2f3b71441faa4c3d1ac01c1877f1cd2712200e03e975b996f911abba2b79d2596c2150bc94510963c40a1137a03df6edacdb1a107dee1cdb894163813bb3da604c9c133c1a10bb33302eeafbd55d352e35dcc5d2b3311a10d2c658b6b93d74a02d467849b6fe75251a10fea5308cc1fea69e7246eafe7ca8a3a51a1048efe1ad873b6f025ac0243bdef715f8000000000000000000000000000000000000000000000000000000000000"), }, nil) expectedDKGVRF := ocr2vrftypes.OCRCommittee{ Signers: []common.Address{ common.HexToAddress("0x0A8cbEA12a06869d3EC432aB9682DAb6C761D591"), common.HexToAddress("0xF4f9db7BB1d16b7CDfb18Ec68994c26964F59853"), common.HexToAddress("0x22fB3F90C539457f00d8484438869135E604a655"), common.HexToAddress("0x33CbCedccb11c9773AD78e214Ba342E979255ab3"), common.HexToAddress("0x6ffaA96256fbC1012325cca88C79F725c33eED80"), }, Transmitters: []common.Address{ common.HexToAddress("0x74103Cf8b436465870b26aa9Fa2F62AD62b22E35"), common.HexToAddress("0x38A6Cb196f805cC3041F6645a5A6CEC27B64430D"), common.HexToAddress("0x47d7095CFEBF8285BdAa421Bc8268D0DB87D933C"), common.HexToAddress("0xa8842BE973800fF61D80d2d53fa62C3a685380eB"), common.HexToAddress("0x3750e31321aEE8c024751877070E8d5F704cE987"), }, } c := &coordinator{ lp: lp, lggr: logger.TestLogger(t), topics: tp, beaconAddress: beaconAddress, coordinatorAddress: coordinatorAddress, dkgAddress: dkgAddress, finalityDepth: 10, evmClient: evmClient, } actualDKG, actualVRF, err := c.DKGVRFCommittees(testutils.Context(t)) assert.NoError(t, err) assert.ElementsMatch(t, expectedDKGVRF.Signers, actualDKG.Signers) assert.ElementsMatch(t, expectedDKGVRF.Transmitters, actualDKG.Transmitters) assert.ElementsMatch(t, expectedDKGVRF.Signers, actualVRF.Signers) assert.ElementsMatch(t, expectedDKGVRF.Transmitters, actualVRF.Transmitters) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lp.On("LatestLogByEventSigWithConfs", mock.Anything, tp.configSetTopic, beaconAddress, evmtypes.Confirmations(10)). Return(&logpoller.Log{ Data: hexutil.MustDecode("0x0000000000000000000000000000000000000000000000000000000000a6fca200010576e704b4a519484d6239ef17f1f5b4a82e330b0daf827ed4dc2789971b0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000a8cbea12a06869d3ec432ab9682dab6c761d591000000000000000000000000f4f9db7bb1d16b7cdfb18ec68994c26964f5985300000000000000000000000022fb3f90c539457f00d8484438869135e604a65500000000000000000000000033cbcedccb11c9773ad78e214ba342e979255ab30000000000000000000000006ffaa96256fbc1012325cca88c79f725c33eed80000000000000000000000000000000000000000000000000000000000000000500000000000000000000000074103cf8b436465870b26aa9fa2f62ad62b22e3500000000000000000000000038a6cb196f805cc3041f6645a5a6cec27b64430d00000000000000000000000047d7095cfebf8285bdaa421bc8268d0db87d933c000000000000000000000000a8842be973800ff61d80d2d53fa62c3a685380eb0000000000000000000000003750e31321aee8c024751877070e8d5f704ce98700000000000000000000000000000000000000000000000000000000000000206f3b82406688b8ddb944c6f2e6d808f014c8fa8d568d639c25019568c715fbf000000000000000000000000000000000000000000000000000000000000004220880d88ee16f1080c8afa0251880c8afa025208090dfc04a288090dfc04a30033a05010101010142206c5ca6f74b532222ac927dd3de235d46a943e372c0563393a33b01dcfd3f371c4220855114d25c2ef5e85fffe4f20a365672d8f2dba3b2ec82333f494168a2039c0442200266e835634db00977cbc1caa4db10e1676c1a4c0fcbc6ba7f09300f0d1831824220980cd91f7a73f20f4b0d51d00cd4e00373dc2beafbb299ca3c609757ab98c8304220eb6d36e2af8922085ff510bbe1eb8932a0e3295ca9f047fef25d90e69c52948f4a34313244334b6f6f574463364b7232644542684b59326b336e685057694676544565325331703978544532544b74344d7572716f684a34313244334b6f6f574b436e4367724b637743324a3577576a626e355435335068646b6b6f57454e534a39546537544b7836366f4a4a34313244334b6f6f575239616f675948786b357a38636b624c4c56346e426f7a777a747871664a7050586671336d4a7232796452474a34313244334b6f6f5744695444635565675637776b313133473366476a69616259756f54436f3157726f6f53656741343263556f544a34313244334b6f6f574e64687072586b5472665370354d5071736270467a70364167394a53787358694341434442676454424c656652820300050e416c74424e2d3132382047e282810e86e8cf899ae9a1b43e023bbe8825b103659bb8d6d4e54f6a3cfae7b106069c216a812d7616e47f0bd38fa4863f48fbcda6a38af4c58d2233dfa7cf79620947042d09f923e0a2f7a2270391e8b058d8bdb8f79fe082b7b627f025651c7290382fdff97c3181d15d162c146ce87ff752499d2acc2b26011439a12e29571a6f1e1defb1751c3be4258c493984fd9f0f6b4a26c539870b5f15bfed3d8ffac92499eb62dbd2beb7c1524275a8019022f6ce6a7e86c9e65e3099452a2b96fc2432b127a112970e1adf615f823b2b2180754c2f0ee01f1b389e56df55ca09702cd0401b66ff71779d2dd67222503a85ab921b28c329cc1832800b192d0b0247c0776e1b9653dc00df48daa6364287c84c0382f5165e7269fef06d10bc67c1bba252305d1af0dc7bb0fe92558eb4c5f38c23163dee1cfb34a72020669dbdfe337c16f3307472616e736c61746f722066726f6d20416c74424e2d3132382047e2828120746f20416c74424e2d3132382047e282825880ade2046080c8afa0256880c8afa0257080ade204788094ebdc0382019e010a205034214e0bd4373f38e162cf9fc9133e2f3b71441faa4c3d1ac01c1877f1cd2712200e03e975b996f911abba2b79d2596c2150bc94510963c40a1137a03df6edacdb1a107dee1cdb894163813bb3da604c9c133c1a10bb33302eeafbd55d352e35dcc5d2b3311a10d2c658b6b93d74a02d467849b6fe75251a10fea5308cc1fea69e7246eafe7ca8a3a51a1048efe1ad873b6f025ac0243bdef715f8000000000000000000000000000000000000000000000000000000000000"), }, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lp.On("LatestLogByEventSigWithConfs", mock.Anything, tp.configSetTopic, dkgAddress, evmtypes.Confirmations(10)). Return(&logpoller.Log{ Data: hexutil.MustDecode("0x0000000000000000000000000000000000000000000000000000000000a6fca200010576e704b4a519484d6239ef17f1f5b4a82e330b0daf827ed4dc2789971b0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000a8cbea12a06869d3ec432ab9682dab6c761d591000000000000000000000000f4f9db7bb1d16b7cdfb18ec68994c26964f5985300000000000000000000000022fb3f90c539457f00d8484438869135e604a65500000000000000000000000033cbcedccb11c9773ad78e214ba342e979255ab30000000000000000000000006ffaa96256fbc1012325cca88c79f725c33eed80000000000000000000000000000000000000000000000000000000000000000500000000000000000000000074103cf8b436465870b26aa9fa2f62ad62b22e3500000000000000000000000038a6cb196f805cc3041f6645a5a6cec27b64430d00000000000000000000000047d7095cfebf8285bdaa421bc8268d0db87d933c000000000000000000000000a8842be973800ff61d80d2d53fa62c3a685380eb0000000000000000000000003750e31321aee8c024751877070e8d5f704ce98700000000000000000000000000000000000000000000000000000000000000206f3b82406688b8ddb944c6f2e6d808f014c8fa8d568d639c25019568c715fbf000000000000000000000000000000000000000000000000000000000000004220880d88ee16f1080c8afa0251880c8afa025208090dfc04a288090dfc04a30033a05010101010142206c5ca6f74b532222ac927dd3de235d46a943e372c0563393a33b01dcfd3f371c4220855114d25c2ef5e85fffe4f20a365672d8f2dba3b2ec82333f494168a2039c0442200266e835634db00977cbc1caa4db10e1676c1a4c0fcbc6ba7f09300f0d1831824220980cd91f7a73f20f4b0d51d00cd4e00373dc2beafbb299ca3c609757ab98c8304220eb6d36e2af8922085ff510bbe1eb8932a0e3295ca9f047fef25d90e69c52948f4a34313244334b6f6f574463364b7232644542684b59326b336e685057694676544565325331703978544532544b74344d7572716f684a34313244334b6f6f574b436e4367724b637743324a3577576a626e355435335068646b6b6f57454e534a39546537544b7836366f4a4a34313244334b6f6f575239616f675948786b357a38636b624c4c56346e426f7a777a747871664a7050586671336d4a7232796452474a34313244334b6f6f5744695444635565675637776b313133473366476a69616259756f54436f3157726f6f53656741343263556f544a34313244334b6f6f574e64687072586b5472665370354d5071736270467a70364167394a53787358694341434442676454424c656652820300050e416c74424e2d3132382047e282810e86e8cf899ae9a1b43e023bbe8825b103659bb8d6d4e54f6a3cfae7b106069c216a812d7616e47f0bd38fa4863f48fbcda6a38af4c58d2233dfa7cf79620947042d09f923e0a2f7a2270391e8b058d8bdb8f79fe082b7b627f025651c7290382fdff97c3181d15d162c146ce87ff752499d2acc2b26011439a12e29571a6f1e1defb1751c3be4258c493984fd9f0f6b4a26c539870b5f15bfed3d8ffac92499eb62dbd2beb7c1524275a8019022f6ce6a7e86c9e65e3099452a2b96fc2432b127a112970e1adf615f823b2b2180754c2f0ee01f1b389e56df55ca09702cd0401b66ff71779d2dd67222503a85ab921b28c329cc1832800b192d0b0247c0776e1b9653dc00df48daa6364287c84c0382f5165e7269fef06d10bc67c1bba252305d1af0dc7bb0fe92558eb4c5f38c23163dee1cfb34a72020669dbdfe337c16f3307472616e736c61746f722066726f6d20416c74424e2d3132382047e2828120746f20416c74424e2d3132382047e282825880ade2046080c8afa0256880c8afa0257080ade204788094ebdc0382019e010a205034214e0bd4373f38e162cf9fc9133e2f3b71441faa4c3d1ac01c1877f1cd2712200e03e975b996f911abba2b79d2596c2150bc94510963c40a1137a03df6edacdb1a107dee1cdb894163813bb3da604c9c133c1a10bb33302eeafbd55d352e35dcc5d2b3311a10d2c658b6b93d74a02d467849b6fe75251a10fea5308cc1fea69e7246eafe7ca8a3a51a1048efe1ad873b6f025ac0243bdef715f8000000000000000000000000000000000000000000000000000000000000"), }, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `t.Run("vrf log poll fails", func(t *testing.T) { lp := lp_mocks.NewLogPoller(t) tp := newTopics() beaconAddress := newAddress(t) lp.On("LatestLogByEventSigWithConfs", mock.Anything, tp.configSetTopic, beaconAddress, evmtypes.Confirmations(10)). Return(nil, errors.New("rpc error")) c := &coordinator{ lp: lp, lggr: logger.TestLogger(t), topics: tp, beaconAddress: beaconAddress, finalityDepth: 10, evmClient: evmClient, } _, _, err := c.DKGVRFCommittees(testutils.Context(t)) assert.Error(t, err) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lp.On("LatestLogByEventSigWithConfs", mock.Anything, tp.configSetTopic, beaconAddress, evmtypes.Confirmations(10)). Return(nil, errors.New("rpc error"))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lp.On("LatestLogByEventSigWithConfs", mock.Anything, tp.configSetTopic, beaconAddress, evmtypes.Confirmations(10)). Return(&logpoller.Log{ Data: hexutil.MustDecode("0x0000000000000000000000000000000000000000000000000000000000a6fca200010576e704b4a519484d6239ef17f1f5b4a82e330b0daf827ed4dc2789971b0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000a8cbea12a06869d3ec432ab9682dab6c761d591000000000000000000000000f4f9db7bb1d16b7cdfb18ec68994c26964f5985300000000000000000000000022fb3f90c539457f00d8484438869135e604a65500000000000000000000000033cbcedccb11c9773ad78e214ba342e979255ab30000000000000000000000006ffaa96256fbc1012325cca88c79f725c33eed80000000000000000000000000000000000000000000000000000000000000000500000000000000000000000074103cf8b436465870b26aa9fa2f62ad62b22e3500000000000000000000000038a6cb196f805cc3041f6645a5a6cec27b64430d00000000000000000000000047d7095cfebf8285bdaa421bc8268d0db87d933c000000000000000000000000a8842be973800ff61d80d2d53fa62c3a685380eb0000000000000000000000003750e31321aee8c024751877070e8d5f704ce98700000000000000000000000000000000000000000000000000000000000000206f3b82406688b8ddb944c6f2e6d808f014c8fa8d568d639c25019568c715fbf000000000000000000000000000000000000000000000000000000000000004220880d88ee16f1080c8afa0251880c8afa025208090dfc04a288090dfc04a30033a05010101010142206c5ca6f74b532222ac927dd3de235d46a943e372c0563393a33b01dcfd3f371c4220855114d25c2ef5e85fffe4f20a365672d8f2dba3b2ec82333f494168a2039c0442200266e835634db00977cbc1caa4db10e1676c1a4c0fcbc6ba7f09300f0d1831824220980cd91f7a73f20f4b0d51d00cd4e00373dc2beafbb299ca3c609757ab98c8304220eb6d36e2af8922085ff510bbe1eb8932a0e3295ca9f047fef25d90e69c52948f4a34313244334b6f6f574463364b7232644542684b59326b336e685057694676544565325331703978544532544b74344d7572716f684a34313244334b6f6f574b436e4367724b637743324a3577576a626e355435335068646b6b6f57454e534a39546537544b7836366f4a4a34313244334b6f6f575239616f675948786b357a38636b624c4c56346e426f7a777a747871664a7050586671336d4a7232796452474a34313244334b6f6f5744695444635565675637776b313133473366476a69616259756f54436f3157726f6f53656741343263556f544a34313244334b6f6f574e64687072586b5472665370354d5071736270467a70364167394a53787358694341434442676454424c656652820300050e416c74424e2d3132382047e282810e86e8cf899ae9a1b43e023bbe8825b103659bb8d6d4e54f6a3cfae7b106069c216a812d7616e47f0bd38fa4863f48fbcda6a38af4c58d2233dfa7cf79620947042d09f923e0a2f7a2270391e8b058d8bdb8f79fe082b7b627f025651c7290382fdff97c3181d15d162c146ce87ff752499d2acc2b26011439a12e29571a6f1e1defb1751c3be4258c493984fd9f0f6b4a26c539870b5f15bfed3d8ffac92499eb62dbd2beb7c1524275a8019022f6ce6a7e86c9e65e3099452a2b96fc2432b127a112970e1adf615f823b2b2180754c2f0ee01f1b389e56df55ca09702cd0401b66ff71779d2dd67222503a85ab921b28c329cc1832800b192d0b0247c0776e1b9653dc00df48daa6364287c84c0382f5165e7269fef06d10bc67c1bba252305d1af0dc7bb0fe92558eb4c5f38c23163dee1cfb34a72020669dbdfe337c16f3307472616e736c61746f722066726f6d20416c74424e2d3132382047e2828120746f20416c74424e2d3132382047e282825880ade2046080c8afa0256880c8afa0257080ade204788094ebdc0382019e010a205034214e0bd4373f38e162cf9fc9133e2f3b71441faa4c3d1ac01c1877f1cd2712200e03e975b996f911abba2b79d2596c2150bc94510963c40a1137a03df6edacdb1a107dee1cdb894163813bb3da604c9c133c1a10bb33302eeafbd55d352e35dcc5d2b3311a10d2c658b6b93d74a02d467849b6fe75251a10fea5308cc1fea69e7246eafe7ca8a3a51a1048efe1ad873b6f025ac0243bdef715f8000000000000000000000000000000000000000000000000000000000000"), }, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lp.On("LatestLogByEventSigWithConfs", mock.Anything, tp.configSetTopic, dkgAddress, evmtypes.Confirmations(10)). Return(nil, errors.New("rpc error"))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `t.Run("valid output", func(t *testing.T) { h := crypto.Keccak256Hash([]byte("hello world")) var expected [32]byte copy(expected[:], h.Bytes()) onchainRouter := mocks.NewVRFBeaconCoordinator(t) onchainRouter. On("SProvingKeyHash", mock.Anything). Return(expected, nil) c := &coordinator{ onchainRouter: onchainRouter, } provingKeyHash, err := c.ProvingKeyHash(testutils.Context(t)) assert.NoError(t, err) assert.ElementsMatch(t, expected[:], provingKeyHash[:]) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `copy(expected[:], h.Bytes())` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `onchainRouter. On("SProvingKeyHash", mock.Anything). Return(expected, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `onchainRouter. On("SProvingKeyHash", mock.Anything). Return([32]byte{}, errors.New("rpc error"))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `evmClient.On("ConfiguredChainID").Return(big.NewInt(1))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `t.Run("happy path, beacon requests", func(t *testing.T) { beaconAddress := newAddress(t) coordinatorAddress := newAddress(t) latestHeadNumber := uint64(200) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) require.NoError(t, err) tp := newTopics() lookbackBlocks := uint64(5) lp := getLogPoller(t, []uint64{195}, latestHeadNumber, true, true, lookbackBlocks) lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{ newRandomnessRequestedLog(t, 3, 195, 191, 0, coordinatorAddress), newRandomnessRequestedLog(t, 3, 195, 192, 1, coordinatorAddress), newRandomnessRequestedLog(t, 3, 195, 193, 2, coordinatorAddress), }, nil).Once() c := &coordinator{ onchainRouter: onchainRouter, beaconAddress: beaconAddress, coordinatorAddress: coordinatorAddress, lp: lp, lggr: logger.TestLogger(t), topics: tp, evmClient: evmClient, toBeTransmittedBlocks: NewBlockCache[blockInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), toBeTransmittedCallbacks: NewBlockCache[callbackInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), coordinatorConfig: newCoordinatorConfig(lookbackBlocks), blockhashLookback: lookbackBlocks, } blocks, callbacks, recentHeightStart, recentBlocks, err := c.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused ) assert.NoError(t, err) assert.Len(t, blocks, 1) assert.Len(t, callbacks, 0) assert.Equal(t, latestHeadNumber-lookbackBlocks+1, recentHeightStart) assert.Len(t, recentBlocks, int(lookbackBlocks)) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{ newRandomnessRequestedLog(t, 3, 195, 191, 0, coordinatorAddress), newRandomnessRequestedLog(t, 3, 195, 192, 1, coordinatorAddress), newRandomnessRequestedLog(t, 3, 195, 193, 2, coordinatorAddress), }, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `t.Run("happy path, callback requests", func(t *testing.T) { beaconAddress := newAddress(t) coordinatorAddress := newAddress(t) latestHeadNumber := uint64(200) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) require.NoError(t, err) tp := newTopics() lookbackBlocks := uint64(5) lp := getLogPoller(t, []uint64{195}, latestHeadNumber, true, true, lookbackBlocks) lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{ newRandomnessFulfillmentRequestedLog(t, 3, 195, 191, 1, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 192, 2, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 193, 3, 1000, coordinatorAddress), }, nil).Once() c := &coordinator{ onchainRouter: onchainRouter, beaconAddress: beaconAddress, coordinatorAddress: coordinatorAddress, lp: lp, lggr: logger.TestLogger(t), topics: tp, evmClient: evmClient, toBeTransmittedBlocks: NewBlockCache[blockInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), toBeTransmittedCallbacks: NewBlockCache[callbackInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), coordinatorConfig: newCoordinatorConfig(lookbackBlocks), blockhashLookback: lookbackBlocks, } blocks, callbacks, recentHeightStart, recentBlocks, err := c.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused ) assert.NoError(t, err) assert.Len(t, blocks, 1) for _, b := range blocks { assert.False(t, b.ShouldStore) } assert.Len(t, callbacks, 3) assert.Equal(t, latestHeadNumber-lookbackBlocks+1, recentHeightStart) assert.Len(t, recentBlocks, int(lookbackBlocks)) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{ newRandomnessFulfillmentRequestedLog(t, 3, 195, 191, 1, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 192, 2, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 193, 3, 1000, coordinatorAddress), }, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `t.Run("happy path, beacon requests, beacon fulfillments", func(t *testing.T) { beaconAddress := newAddress(t) coordinatorAddress := newAddress(t) latestHeadNumber := uint64(200) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) require.NoError(t, err) tp := newTopics() lookbackBlocks := uint64(5) lp := getLogPoller(t, []uint64{195}, latestHeadNumber, true, true, lookbackBlocks) lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{ newRandomnessRequestedLog(t, 3, 195, 191, 0, coordinatorAddress), newRandomnessRequestedLog(t, 3, 195, 192, 1, coordinatorAddress), newRandomnessRequestedLog(t, 3, 195, 193, 2, coordinatorAddress), newOutputsServedLog(t, []vrf_coordinator.VRFBeaconTypesOutputServed{ { Height: 195, ConfirmationDelay: big.NewInt(3), ProofG1X: proofG1X, ProofG1Y: proofG1Y, }, }, coordinatorAddress), }, nil).Once() c := &coordinator{ onchainRouter: onchainRouter, beaconAddress: beaconAddress, coordinatorAddress: coordinatorAddress, lp: lp, lggr: logger.TestLogger(t), topics: tp, evmClient: evmClient, toBeTransmittedBlocks: NewBlockCache[blockInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), toBeTransmittedCallbacks: NewBlockCache[callbackInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), coordinatorConfig: newCoordinatorConfig(lookbackBlocks), blockhashLookback: lookbackBlocks, } blocks, callbacks, recentHeightStart, recentBlocks, err := c.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused ) assert.NoError(t, err) assert.Len(t, blocks, 0) assert.Len(t, callbacks, 0) assert.Equal(t, latestHeadNumber-lookbackBlocks+1, recentHeightStart) assert.Len(t, recentBlocks, int(lookbackBlocks)) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{ newRandomnessRequestedLog(t, 3, 195, 191, 0, coordinatorAddress), newRandomnessRequestedLog(t, 3, 195, 192, 1, coordinatorAddress), newRandomnessRequestedLog(t, 3, 195, 193, 2, coordinatorAddress), newOutputsServedLog(t, []vrf_coordinator.VRFBeaconTypesOutputServed{ { Height: 195, ConfirmationDelay: big.NewInt(3), ProofG1X: proofG1X, ProofG1Y: proofG1Y, }, }, coordinatorAddress), }, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `t.Run("happy path, callback requests, callback fulfillments", func(t *testing.T) { beaconAddress := newAddress(t) coordinatorAddress := newAddress(t) latestHeadNumber := uint64(200) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) require.NoError(t, err) tp := newTopics() lookbackBlocks := uint64(5) lp := getLogPoller(t, []uint64{195}, latestHeadNumber, true, true, lookbackBlocks) // Both RandomWordsFulfilled and NewTransmission events are emitted // when a VRF fulfillment happens on chain. lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{ newRandomnessFulfillmentRequestedLog(t, 3, 195, 191, 1, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 192, 2, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 193, 3, 1000, coordinatorAddress), // Regardless of success or failure, if the fulfillment has been tried once do not report again. newRandomWordsFulfilledLog(t, []*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)}, []byte{1, 0, 0}, coordinatorAddress), newOutputsServedLog(t, []vrf_coordinator.VRFBeaconTypesOutputServed{ { Height: 195, ConfirmationDelay: big.NewInt(3), ProofG1X: proofG1X, ProofG1Y: proofG1Y, }, }, coordinatorAddress), }, nil).Once() c := &coordinator{ onchainRouter: onchainRouter, beaconAddress: beaconAddress, coordinatorAddress: coordinatorAddress, lp: lp, lggr: logger.TestLogger(t), topics: tp, evmClient: evmClient, toBeTransmittedBlocks: NewBlockCache[blockInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), toBeTransmittedCallbacks: NewBlockCache[callbackInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), coordinatorConfig: newCoordinatorConfig(lookbackBlocks), blockhashLookback: lookbackBlocks, } blocks, callbacks, recentHeightStart, recentBlocks, err := c.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused ) assert.NoError(t, err) assert.Len(t, blocks, 0) assert.Len(t, callbacks, 0) assert.Equal(t, latestHeadNumber-lookbackBlocks+1, recentHeightStart) assert.Len(t, recentBlocks, int(lookbackBlocks)) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{ newRandomnessFulfillmentRequestedLog(t, 3, 195, 191, 1, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 192, 2, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 193, 3, 1000, coordinatorAddress), // Regardless of success or failure, if the fulfillment has been tried once do not report again. newRandomWordsFulfilledLog(t, []*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)}, []byte{1, 0, 0}, coordinatorAddress), newOutputsServedLog(t, []vrf_coordinator.VRFBeaconTypesOutputServed{ { Height: 195, ConfirmationDelay: big.NewInt(3), ProofG1X: proofG1X, ProofG1Y: proofG1Y, }, }, coordinatorAddress), }, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `t.Run("happy path, only beacon fulfillment", func(t *testing.T) { beaconAddress := newAddress(t) coordinatorAddress := newAddress(t) latestHeadNumber := uint64(200) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) require.NoError(t, err) tp := newTopics() lookbackBlocks := uint64(5) lp := getLogPoller(t, []uint64{}, latestHeadNumber, true, true, lookbackBlocks) lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{newOutputsServedLog(t, []vrf_coordinator.VRFBeaconTypesOutputServed{ { Height: 195, ConfirmationDelay: big.NewInt(3), ProofG1X: proofG1X, ProofG1Y: proofG1Y, }, }, coordinatorAddress)}, nil).Once() c := &coordinator{ onchainRouter: onchainRouter, beaconAddress: beaconAddress, coordinatorAddress: coordinatorAddress, lp: lp, lggr: logger.TestLogger(t), topics: tp, evmClient: evmClient, toBeTransmittedBlocks: NewBlockCache[blockInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), toBeTransmittedCallbacks: NewBlockCache[callbackInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), coordinatorConfig: newCoordinatorConfig(lookbackBlocks), blockhashLookback: lookbackBlocks, } blocks, callbacks, recentHeightStart, recentBlocks, err := c.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused ) assert.NoError(t, err) assert.Len(t, blocks, 0) assert.Len(t, callbacks, 0) assert.Equal(t, latestHeadNumber-lookbackBlocks+1, recentHeightStart) assert.Len(t, recentBlocks, int(lookbackBlocks)) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{newOutputsServedLog(t, []vrf_coordinator.VRFBeaconTypesOutputServed{ { Height: 195, ConfirmationDelay: big.NewInt(3), ProofG1X: proofG1X, ProofG1Y: proofG1Y, }, }, coordinatorAddress)}, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `t.Run("happy path, callback requests & callback fulfillments in-flight", func(t *testing.T) { beaconAddress := newAddress(t) coordinatorAddress := newAddress(t) latestHeadNumber := uint64(200) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) require.NoError(t, err) tp := newTopics() lookbackBlocks := uint64(5) // Do not include latestHeadNumber in "GetBlocksRange" call for initial "ReportWillBeTransmitted." // Do not include recent blockhashes in range either. lp := getLogPoller(t, []uint64{195}, latestHeadNumber, false, false /* includeLatestHeadInRange */, 0) c := &coordinator{ onchainRouter: onchainRouter, beaconAddress: beaconAddress, coordinatorAddress: coordinatorAddress, lp: lp, lggr: logger.TestLogger(t), topics: tp, evmClient: evmClient, toBeTransmittedBlocks: NewBlockCache[blockInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), toBeTransmittedCallbacks: NewBlockCache[callbackInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), coordinatorConfig: newCoordinatorConfig(lookbackBlocks), blockhashLookback: lookbackBlocks, } report := ocr2vrftypes.AbstractReport{ RecentBlockHeight: 195, RecentBlockHash: common.HexToHash("0x001"), Outputs: []ocr2vrftypes.AbstractVRFOutput{ { BlockHeight: 195, ConfirmationDelay: 195, Callbacks: []ocr2vrftypes.AbstractCostedCallbackRequest{ { RequestID: big.NewInt(1), BeaconHeight: 195, }, { RequestID: big.NewInt(2), BeaconHeight: 195, }, { RequestID: big.NewInt(3), BeaconHeight: 195, }, }, }, }, } err = c.ReportWillBeTransmitted(testutils.Context(t), report) require.NoError(t, err) // Include latestHeadNumber in "GetBlocksRange" call for "ReportBlocks" call. // Include recent blockhashes in range. lp = getLogPoller(t, []uint64{195}, latestHeadNumber, true, true /* includeLatestHeadInRange */, lookbackBlocks) c.lp = lp lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{ newRandomnessFulfillmentRequestedLog(t, 3, 195, 191, 1, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 192, 2, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 193, 3, 1000, coordinatorAddress), newOutputsServedLog(t, []vrf_coordinator.VRFBeaconTypesOutputServed{ { Height: 195, ConfirmationDelay: big.NewInt(3), ProofG1X: proofG1X, ProofG1Y: proofG1Y, }, }, coordinatorAddress), }, nil).Once() blocks, callbacks, recentHeightStart, recentBlocks, err := c.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused ) assert.NoError(t, err) assert.Len(t, blocks, 0) assert.Len(t, callbacks, 0) assert.Equal(t, latestHeadNumber-lookbackBlocks+1, recentHeightStart) assert.Len(t, recentBlocks, int(lookbackBlocks)) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `err = c.ReportWillBeTransmitted(testutils.Context(t), report)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lp = getLogPoller(t, []uint64{195}, latestHeadNumber, true, true /* includeLatestHeadInRange */, lookbackBlocks)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `c.lp = lp` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{ newRandomnessFulfillmentRequestedLog(t, 3, 195, 191, 1, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 192, 2, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 193, 3, 1000, coordinatorAddress), newOutputsServedLog(t, []vrf_coordinator.VRFBeaconTypesOutputServed{ { Height: 195, ConfirmationDelay: big.NewInt(3), ProofG1X: proofG1X, ProofG1Y: proofG1Y, }, }, coordinatorAddress), }, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `t.Run("happy path, blocks requested hits batch gas limit", func(t *testing.T) { coordinatorAddress := newAddress(t) beaconAddress := newAddress(t) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) require.NoError(t, err) latestHeadNumber := uint64(400) lookbackBlocks := uint64(400) blockhashLookback := uint64(256) tp := newTopics() logs := []logpoller.Log{} requestedBlocks := []uint64{} // Populate 200 request blocks. for i := 0; i < 400; i += 2 { logs = append(logs, newRandomnessRequestedLog(t, 1, uint64(i), 0, int64(i), coordinatorAddress)) requestedBlocks = append(requestedBlocks, uint64(i)) } lp := getLogPoller(t, requestedBlocks, latestHeadNumber, true, true, blockhashLookback) lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return(logs, nil) c := &coordinator{ onchainRouter: onchainRouter, beaconAddress: beaconAddress, coordinatorAddress: coordinatorAddress, lp: lp, lggr: logger.TestLogger(t), topics: tp, evmClient: evmClient, toBeTransmittedBlocks: NewBlockCache[blockInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), toBeTransmittedCallbacks: NewBlockCache[callbackInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), coordinatorConfig: newCoordinatorConfig(lookbackBlocks), blockhashLookback: blockhashLookback, } blocks, callbacks, recentHeightStart, recentBlocks, err := c.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{1: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused ) // Coordinator should allow 99 blocks, i.e 100 blocks - 1 block's worth of gas // for the coordinator overhead. assert.NoError(t, err) assert.Len(t, blocks, 99) for _, b := range blocks { assert.True(t, b.ShouldStore) } assert.Len(t, callbacks, 0) assert.Equal(t, latestHeadNumber-blockhashLookback+1, recentHeightStart) assert.Len(t, recentBlocks, int(blockhashLookback)) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `logs = append(logs, newRandomnessRequestedLog(t, 1, uint64(i), 0, int64(i), coordinatorAddress))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `requestedBlocks = append(requestedBlocks, uint64(i))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return(logs, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `t.Run("happy path, last callback hits batch gas limit", func(t *testing.T) { coordinatorAddress := newAddress(t) beaconAddress := newAddress(t) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) require.NoError(t, err) latestHeadNumber := uint64(200) lookbackBlocks := uint64(5) tp := newTopics() requestedBlocks := []uint64{195} lp := getLogPoller(t, requestedBlocks, latestHeadNumber, true, true, lookbackBlocks) lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{ newRandomnessRequestedLog(t, 3, 195, 191, 0, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 191, 1, 2_000_000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 192, 2, 2_900_000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 193, 3, 1, coordinatorAddress), }, nil) c := &coordinator{ onchainRouter: onchainRouter, beaconAddress: beaconAddress, coordinatorAddress: coordinatorAddress, lp: lp, lggr: logger.TestLogger(t), topics: tp, evmClient: evmClient, toBeTransmittedBlocks: NewBlockCache[blockInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), toBeTransmittedCallbacks: NewBlockCache[callbackInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), coordinatorConfig: newCoordinatorConfig(lookbackBlocks), blockhashLookback: lookbackBlocks, } blocks, callbacks, recentHeightStart, recentBlocks, err := c.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused ) // Should allow the first two callbacks, which add up to 4_950_000 + 50_000 (1 block) = 5_000_000, // then reject the last callback for being out of gas. assert.NoError(t, err) assert.Len(t, blocks, 1) for _, b := range blocks { assert.True(t, b.ShouldStore) } assert.Len(t, callbacks, 2) assert.Equal(t, latestHeadNumber-lookbackBlocks+1, recentHeightStart) assert.Len(t, recentBlocks, int(lookbackBlocks)) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{ newRandomnessRequestedLog(t, 3, 195, 191, 0, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 191, 1, 2_000_000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 192, 2, 2_900_000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 193, 3, 1, coordinatorAddress), }, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `t.Run("happy path, sandwiched callbacks hit batch gas limit", func(t *testing.T) { coordinatorAddress := newAddress(t) beaconAddress := newAddress(t) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) require.NoError(t, err) latestHeadNumber := uint64(200) lookbackBlocks := uint64(5) tp := newTopics() requestedBlocks := []uint64{195} lp := getLogPoller(t, requestedBlocks, latestHeadNumber, true, true, lookbackBlocks) lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{ newRandomnessRequestedLog(t, 3, 195, 191, 0, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 191, 1, 10_000_000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 192, 2, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 193, 3, 10_000_000, coordinatorAddress), }, nil) c := &coordinator{ onchainRouter: onchainRouter, beaconAddress: beaconAddress, coordinatorAddress: coordinatorAddress, lp: lp, lggr: logger.TestLogger(t), topics: tp, evmClient: evmClient, toBeTransmittedBlocks: NewBlockCache[blockInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), toBeTransmittedCallbacks: NewBlockCache[callbackInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), coordinatorConfig: newCoordinatorConfig(lookbackBlocks), blockhashLookback: lookbackBlocks, } blocks, callbacks, recentHeightStart, recentBlocks, err := c.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused ) // Should allow the middle callback, with an acceptable gas allowance, to be processed. assert.NoError(t, err) assert.Len(t, blocks, 1) assert.Len(t, callbacks, 1) assert.Equal(t, latestHeadNumber-lookbackBlocks+1, recentHeightStart) assert.Len(t, recentBlocks, int(lookbackBlocks)) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{ newRandomnessRequestedLog(t, 3, 195, 191, 0, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 191, 1, 10_000_000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 192, 2, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 193, 3, 10_000_000, coordinatorAddress), }, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `t.Run("happy path, sandwiched callbacks with valid callback in next block hit batch gas limit", func(t *testing.T) { coordinatorAddress := newAddress(t) beaconAddress := newAddress(t) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) require.NoError(t, err) latestHeadNumber := uint64(200) lookbackBlocks := uint64(5) tp := newTopics() requestedBlocks := []uint64{195, 196} lp := getLogPoller(t, requestedBlocks, latestHeadNumber, true, true, lookbackBlocks) lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{ newRandomnessRequestedLog(t, 3, 195, 191, 0, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 191, 1, 10_000_000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 192, 2, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 193, 3, 10_000_000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 196, 194, 4, 1000, coordinatorAddress), }, nil) c := &coordinator{ onchainRouter: onchainRouter, beaconAddress: beaconAddress, coordinatorAddress: coordinatorAddress, lp: lp, lggr: logger.TestLogger(t), topics: tp, evmClient: evmClient, toBeTransmittedBlocks: NewBlockCache[blockInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), toBeTransmittedCallbacks: NewBlockCache[callbackInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), coordinatorConfig: newCoordinatorConfig(lookbackBlocks), blockhashLookback: lookbackBlocks, } blocks, callbacks, recentHeightStart, recentBlocks, err := c.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused ) // Should allow the middle callback, with an acceptable gas allowance, to be processed, // then move to the next block and find a suitable callback. Also adds the block 196 for // that callback. assert.NoError(t, err) assert.Len(t, blocks, 2) assert.Len(t, callbacks, 2) assert.Equal(t, latestHeadNumber-lookbackBlocks+1, recentHeightStart) assert.Len(t, recentBlocks, int(lookbackBlocks)) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{ newRandomnessRequestedLog(t, 3, 195, 191, 0, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 191, 1, 10_000_000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 192, 2, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 193, 3, 10_000_000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 196, 194, 4, 1000, coordinatorAddress), }, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `t.Run("correct blockhashes are retrieved with the maximum lookback", func(t *testing.T) { coordinatorAddress := newAddress(t) beaconAddress := newAddress(t) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) require.NoError(t, err) latestHeadNumber := uint64(1000) lookbackBlocks := uint64(256) tp := newTopics() requestedBlocks := []uint64{} lp := getLogPoller(t, requestedBlocks, latestHeadNumber, true, true, lookbackBlocks) lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{}, nil) c := &coordinator{ onchainRouter: onchainRouter, beaconAddress: beaconAddress, coordinatorAddress: coordinatorAddress, lp: lp, lggr: logger.TestLogger(t), topics: tp, evmClient: evmClient, toBeTransmittedBlocks: NewBlockCache[blockInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), toBeTransmittedCallbacks: NewBlockCache[callbackInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), coordinatorConfig: newCoordinatorConfig(lookbackBlocks), blockhashLookback: lookbackBlocks, } _, _, recentHeightStart, recentBlocks, err := c.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused ) assert.NoError(t, err) assert.Equal(t, latestHeadNumber-lookbackBlocks+1, recentHeightStart) assert.Equal(t, common.HexToHash(fmt.Sprintf("0x00%d", 1)), recentBlocks[0]) assert.Equal(t, common.HexToHash(fmt.Sprintf("0x00%d", lookbackBlocks)), recentBlocks[len(recentBlocks)-1]) assert.Len(t, recentBlocks, int(lookbackBlocks)) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{}, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `t.Run("correct blockhashes are retrieved with a capped lookback (close to genesis block)", func(t *testing.T) { coordinatorAddress := newAddress(t) beaconAddress := newAddress(t) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) require.NoError(t, err) latestHeadNumber := uint64(100) lookbackBlocks := uint64(100) tp := newTopics() requestedBlocks := []uint64{} lp := getLogPoller(t, requestedBlocks, latestHeadNumber, true, true, lookbackBlocks) lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{}, nil) c := &coordinator{ onchainRouter: onchainRouter, beaconAddress: beaconAddress, coordinatorAddress: coordinatorAddress, lp: lp, lggr: logger.TestLogger(t), topics: tp, evmClient: evmClient, toBeTransmittedBlocks: NewBlockCache[blockInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), toBeTransmittedCallbacks: NewBlockCache[callbackInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), coordinatorConfig: newCoordinatorConfig(lookbackBlocks), blockhashLookback: lookbackBlocks, } _, _, recentHeightStart, recentBlocks, err := c.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused ) assert.NoError(t, err) assert.Equal(t, latestHeadNumber-lookbackBlocks+1, recentHeightStart) assert.Equal(t, common.HexToHash(fmt.Sprintf("0x00%d", 1)), recentBlocks[0]) assert.Equal(t, common.HexToHash(fmt.Sprintf("0x00%d", lookbackBlocks)), recentBlocks[len(recentBlocks)-1]) assert.Len(t, recentBlocks, int(lookbackBlocks)) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{}, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lp.On("LatestBlock", mock.Anything). Return(logpoller.LogPollerBlock{BlockNumber: int64(latestHeadNumber)}, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lp.On("GetBlocksRange", mock.Anything, append(requestedBlocks, latestHeadNumber-lookbackBlocks+1, latestHeadNumber)). Return(nil, errors.New("GetBlocks error"))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{ newRandomnessRequestedLog(t, 3, 195, 191, 0, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 191, 1, 10_000_000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 192, 2, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 193, 3, 10_000_000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 196, 194, 4, 1000, coordinatorAddress), }, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `evmClient.On("ConfiguredChainID").Return(big.NewInt(1))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `t.Run("happy path", func(t *testing.T) { lookbackBlocks := uint64(0) lp := getLogPoller(t, []uint64{199}, 200, false, false, 0) c := &coordinator{ lp: lp, lggr: logger.TestLogger(t), toBeTransmittedBlocks: NewBlockCache[blockInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), toBeTransmittedCallbacks: NewBlockCache[callbackInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), coordinatorConfig: newCoordinatorConfig(lookbackBlocks), evmClient: evmClient, } assert.NoError(t, c.ReportWillBeTransmitted(testutils.Context(t), ocr2vrftypes.AbstractReport{ RecentBlockHeight: 199, RecentBlockHash: common.HexToHash("0x001"), })) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lg = newRandomnessFulfillmentRequestedLog(t, 3, 1500, 1450, 1, 1000, coordinatorAddress)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lg = newNewTransmissionLog(t, beaconAddress, configDigest)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lg = newRandomWordsFulfilledLog(t, []*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)}, []byte{1, 1, 1}, coordinatorAddress)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lg = newOutputsServedLog(t, []vrf_coordinator.VRFBeaconTypesOutputServed{ { Height: 1500, ConfirmationDelay: big.NewInt(3), ProofG1X: proofG1X, ProofG1Y: proofG1Y, }, { Height: 1505, ConfirmationDelay: big.NewInt(4), ProofG1X: proofG1X, ProofG1Y: proofG1Y, }, }, coordinatorAddress)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `evmClient.On("ConfiguredChainID").Return(big.NewInt(1))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `t.Run("report is on-chain", func(t *testing.T) { tp := newTopics() beaconAddress := newAddress(t) coordinatorAddress := newAddress(t) lggr := logger.TestLogger(t) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) assert.NoError(t, err) epoch := uint32(20) round := uint8(3) epochAndRound := toEpochAndRoundUint40(epoch, round) enrTopic := common.BytesToHash(common.LeftPadBytes(epochAndRound.Bytes(), 32)) lp := lp_mocks.NewLogPoller(t) configDigest := common.BigToHash(big.NewInt(1337)) log := newNewTransmissionLog(t, beaconAddress, configDigest) log.BlockNumber = 195 lp.On("IndexedLogs", mock.Anything, tp.newTransmissionTopic, beaconAddress, 2, []common.Hash{ enrTopic, }, evmtypes.Confirmations(1)).Return([]logpoller.Log{log}, nil) c := &coordinator{ lp: lp, onchainRouter: onchainRouter, lggr: logger.TestLogger(t), beaconAddress: beaconAddress, topics: tp, evmClient: evmClient, } present, err := c.ReportIsOnchain(testutils.Context(t), epoch, round, configDigest) assert.NoError(t, err) assert.True(t, present) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `log.BlockNumber = 195` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lp.On("IndexedLogs", mock.Anything, tp.newTransmissionTopic, beaconAddress, 2, []common.Hash{ enrTopic, }, evmtypes.Confirmations(1)).Return([]logpoller.Log{log}, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `t.Run("report is on-chain for old config digest", func(t *testing.T) { tp := newTopics() beaconAddress := newAddress(t) coordinatorAddress := newAddress(t) lggr := logger.TestLogger(t) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) assert.NoError(t, err) epoch := uint32(20) round := uint8(3) epochAndRound := toEpochAndRoundUint40(epoch, round) enrTopic := common.BytesToHash(common.LeftPadBytes(epochAndRound.Bytes(), 32)) lp := lp_mocks.NewLogPoller(t) oldConfigDigest := common.BigToHash(big.NewInt(1337)) newConfigDigest := common.BigToHash(big.NewInt(8888)) log := newNewTransmissionLog(t, beaconAddress, oldConfigDigest) log.BlockNumber = 195 lp.On("IndexedLogs", mock.Anything, tp.newTransmissionTopic, beaconAddress, 2, []common.Hash{ enrTopic, }, evmtypes.Confirmations(1)).Return([]logpoller.Log{log}, nil) c := &coordinator{ lp: lp, onchainRouter: onchainRouter, lggr: logger.TestLogger(t), beaconAddress: beaconAddress, topics: tp, evmClient: evmClient, } present, err := c.ReportIsOnchain(testutils.Context(t), epoch, round, newConfigDigest) assert.NoError(t, err) assert.False(t, present) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `log.BlockNumber = 195` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lp.On("IndexedLogs", mock.Anything, tp.newTransmissionTopic, beaconAddress, 2, []common.Hash{ enrTopic, }, evmtypes.Confirmations(1)).Return([]logpoller.Log{log}, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `lp.On("IndexedLogs", mock.Anything, tp.newTransmissionTopic, beaconAddress, 2, []common.Hash{ enrTopic, }, evmtypes.Confirmations(1)).Return([]logpoller.Log{}, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `t.Run("valid output", func(t *testing.T) { expected := [8]uint32{1, 2, 3, 4, 5, 6, 7, 8} ret := [8]*big.Int{} for i, delay := range expected { ret[i] = big.NewInt(int64(delay)) } onchainRouter := mocks.NewVRFBeaconCoordinator(t) onchainRouter. On("GetConfirmationDelays", mock.Anything). Return(ret, nil) c := &coordinator{ onchainRouter: onchainRouter, } confDelays, err := c.ConfirmationDelays(testutils.Context(t)) assert.NoError(t, err) assert.Equal(t, expected[:], confDelays[:]) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `ret[i] = big.NewInt(int64(delay))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `onchainRouter. On("GetConfirmationDelays", mock.Anything). Return(ret, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `onchainRouter. On("GetConfirmationDelays", mock.Anything). Return([8]*big.Int{}, errors.New("rpc error"))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `t.Run("valid output", func(t *testing.T) { var keyIDBytes [32]byte keyIDBytes[0] = 1 expected := dkg.KeyID(keyIDBytes) onchainRouter := mocks.NewVRFBeaconCoordinator(t) onchainRouter. On("SKeyID", mock.Anything). Return(keyIDBytes, nil) c := &coordinator{ onchainRouter: onchainRouter, } keyID, err := c.KeyID(testutils.Context(t)) assert.NoError(t, err) assert.Equal(t, expected[:], keyID[:]) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `keyIDBytes[0] = 1` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `onchainRouter. On("SKeyID", mock.Anything). Return(keyIDBytes, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `onchainRouter. On("SKeyID", mock.Anything). Return(emptyBytes, errors.New("rpc error"))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `t.Run("valid binary", func(t *testing.T) { c := &coordinator{coordinatorConfig: newCoordinatorConfig(10), lggr: logger.TestLogger(t)} cacheEvictionWindowSeconds := int64(60) cacheEvictionWindow := time.Duration(cacheEvictionWindowSeconds * int64(time.Second)) c.toBeTransmittedBlocks = NewBlockCache[blockInReport](cacheEvictionWindow) c.toBeTransmittedCallbacks = NewBlockCache[callbackInReport](cacheEvictionWindow) newCoordinatorConfig := &ocr2vrftypes.CoordinatorConfig{ CacheEvictionWindowSeconds: 30, BatchGasLimit: 1_000_000, CoordinatorOverhead: 10_000, CallbackOverhead: 10_000, BlockGasOverhead: 10_000, LookbackBlocks: 1_000, } require.Equal(t, cacheEvictionWindow, c.toBeTransmittedBlocks.evictionWindow) require.Equal(t, cacheEvictionWindow, c.toBeTransmittedCallbacks.evictionWindow) expectedConfigDigest := ocr2Types.ConfigDigest(common.HexToHash("asd")) expectedOracleID := commontypes.OracleID(3) err := c.UpdateConfiguration(ocr2vrf.OffchainConfig(newCoordinatorConfig), expectedConfigDigest, expectedOracleID) newCacheEvictionWindow := time.Duration(newCoordinatorConfig.CacheEvictionWindowSeconds * int64(time.Second)) require.NoError(t, err) require.Equal(t, newCoordinatorConfig.CacheEvictionWindowSeconds, c.coordinatorConfig.CacheEvictionWindowSeconds) require.Equal(t, newCoordinatorConfig.BatchGasLimit, c.coordinatorConfig.BatchGasLimit) require.Equal(t, newCoordinatorConfig.CoordinatorOverhead, c.coordinatorConfig.CoordinatorOverhead) require.Equal(t, newCoordinatorConfig.CallbackOverhead, c.coordinatorConfig.CallbackOverhead) require.Equal(t, newCoordinatorConfig.BlockGasOverhead, c.coordinatorConfig.BlockGasOverhead) require.Equal(t, newCoordinatorConfig.LookbackBlocks, c.coordinatorConfig.LookbackBlocks) require.Equal(t, newCacheEvictionWindow, c.toBeTransmittedBlocks.evictionWindow) require.Equal(t, newCacheEvictionWindow, c.toBeTransmittedCallbacks.evictionWindow) require.Equal(t, expectedConfigDigest, c.configDigest) require.Equal(t, expectedOracleID, c.oracleID) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `c.toBeTransmittedBlocks = NewBlockCache[blockInReport](cacheEvictionWindow)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `c.toBeTransmittedCallbacks = NewBlockCache[callbackInReport](cacheEvictionWindow)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `spec = &job.OCR2OracleSpec{ PluginType: types.OCR2VRF, ContractID: beaconAddress.String(), PluginConfig: nil, // missing coordinator & dkg addresses }` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `_, err = FilterNamesFromSpec(spec)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Run("valid output", func(t *testing.T) { onchainRouter := mocks.NewVRFBeaconCoordinator(t) onchainRouter. On("IBeaconPeriodBlocks", mock.Anything). Return(big.NewInt(10), nil) c := &coordinator{ onchainRouter: onchainRouter, } period, err := c.BeaconPeriod(testutils.Context(t)) assert.NoError(t, err) assert.Equal(t, uint16(10), period) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewVRFBeaconCoordinator(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `. On("IBeaconPeriodBlocks", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `. Return(big.NewInt(10), nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(10)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.BeaconPeriod(testutils.Context(t))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewVRFBeaconCoordinator(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `. On("IBeaconPeriodBlocks", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `. Return(nil, errors.New("rpc error"))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.New("rpc error")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.BeaconPeriod(testutils.Context(t))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewClient(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.On("ConfiguredChainID")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Return(big.NewInt(1))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Run("happy path", func(t *testing.T) { // In this test the DKG and VRF committees have the same signers and // transmitters. This may (?) be different in practice. lp := lp_mocks.NewLogPoller(t) tp := newTopics() coordinatorAddress := newAddress(t) beaconAddress := newAddress(t) dkgAddress := newAddress(t) lp.On("LatestLogByEventSigWithConfs", mock.Anything, tp.configSetTopic, beaconAddress, evmtypes.Confirmations(10)). Return(&logpoller.Log{ Data: hexutil.MustDecode("0x0000000000000000000000000000000000000000000000000000000000a6fca200010576e704b4a519484d6239ef17f1f5b4a82e330b0daf827ed4dc2789971b0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000a8cbea12a06869d3ec432ab9682dab6c761d591000000000000000000000000f4f9db7bb1d16b7cdfb18ec68994c26964f5985300000000000000000000000022fb3f90c539457f00d8484438869135e604a65500000000000000000000000033cbcedccb11c9773ad78e214ba342e979255ab30000000000000000000000006ffaa96256fbc1012325cca88c79f725c33eed80000000000000000000000000000000000000000000000000000000000000000500000000000000000000000074103cf8b436465870b26aa9fa2f62ad62b22e3500000000000000000000000038a6cb196f805cc3041f6645a5a6cec27b64430d00000000000000000000000047d7095cfebf8285bdaa421bc8268d0db87d933c000000000000000000000000a8842be973800ff61d80d2d53fa62c3a685380eb0000000000000000000000003750e31321aee8c024751877070e8d5f704ce98700000000000000000000000000000000000000000000000000000000000000206f3b82406688b8ddb944c6f2e6d808f014c8fa8d568d639c25019568c715fbf000000000000000000000000000000000000000000000000000000000000004220880d88ee16f1080c8afa0251880c8afa025208090dfc04a288090dfc04a30033a05010101010142206c5ca6f74b532222ac927dd3de235d46a943e372c0563393a33b01dcfd3f371c4220855114d25c2ef5e85fffe4f20a365672d8f2dba3b2ec82333f494168a2039c0442200266e835634db00977cbc1caa4db10e1676c1a4c0fcbc6ba7f09300f0d1831824220980cd91f7a73f20f4b0d51d00cd4e00373dc2beafbb299ca3c609757ab98c8304220eb6d36e2af8922085ff510bbe1eb8932a0e3295ca9f047fef25d90e69c52948f4a34313244334b6f6f574463364b7232644542684b59326b336e685057694676544565325331703978544532544b74344d7572716f684a34313244334b6f6f574b436e4367724b637743324a3577576a626e355435335068646b6b6f57454e534a39546537544b7836366f4a4a34313244334b6f6f575239616f675948786b357a38636b624c4c56346e426f7a777a747871664a7050586671336d4a7232796452474a34313244334b6f6f5744695444635565675637776b313133473366476a69616259756f54436f3157726f6f53656741343263556f544a34313244334b6f6f574e64687072586b5472665370354d5071736270467a70364167394a53787358694341434442676454424c656652820300050e416c74424e2d3132382047e282810e86e8cf899ae9a1b43e023bbe8825b103659bb8d6d4e54f6a3cfae7b106069c216a812d7616e47f0bd38fa4863f48fbcda6a38af4c58d2233dfa7cf79620947042d09f923e0a2f7a2270391e8b058d8bdb8f79fe082b7b627f025651c7290382fdff97c3181d15d162c146ce87ff752499d2acc2b26011439a12e29571a6f1e1defb1751c3be4258c493984fd9f0f6b4a26c539870b5f15bfed3d8ffac92499eb62dbd2beb7c1524275a8019022f6ce6a7e86c9e65e3099452a2b96fc2432b127a112970e1adf615f823b2b2180754c2f0ee01f1b389e56df55ca09702cd0401b66ff71779d2dd67222503a85ab921b28c329cc1832800b192d0b0247c0776e1b9653dc00df48daa6364287c84c0382f5165e7269fef06d10bc67c1bba252305d1af0dc7bb0fe92558eb4c5f38c23163dee1cfb34a72020669dbdfe337c16f3307472616e736c61746f722066726f6d20416c74424e2d3132382047e2828120746f20416c74424e2d3132382047e282825880ade2046080c8afa0256880c8afa0257080ade204788094ebdc0382019e010a205034214e0bd4373f38e162cf9fc9133e2f3b71441faa4c3d1ac01c1877f1cd2712200e03e975b996f911abba2b79d2596c2150bc94510963c40a1137a03df6edacdb1a107dee1cdb894163813bb3da604c9c133c1a10bb33302eeafbd55d352e35dcc5d2b3311a10d2c658b6b93d74a02d467849b6fe75251a10fea5308cc1fea69e7246eafe7ca8a3a51a1048efe1ad873b6f025ac0243bdef715f8000000000000000000000000000000000000000000000000000000000000"), }, nil) lp.On("LatestLogByEventSigWithConfs", mock.Anything, tp.configSetTopic, dkgAddress, evmtypes.Confirmations(10)). Return(&logpoller.Log{ Data: hexutil.MustDecode("0x0000000000000000000000000000000000000000000000000000000000a6fca200010576e704b4a519484d6239ef17f1f5b4a82e330b0daf827ed4dc2789971b0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000a8cbea12a06869d3ec432ab9682dab6c761d591000000000000000000000000f4f9db7bb1d16b7cdfb18ec68994c26964f5985300000000000000000000000022fb3f90c539457f00d8484438869135e604a65500000000000000000000000033cbcedccb11c9773ad78e214ba342e979255ab30000000000000000000000006ffaa96256fbc1012325cca88c79f725c33eed80000000000000000000000000000000000000000000000000000000000000000500000000000000000000000074103cf8b436465870b26aa9fa2f62ad62b22e3500000000000000000000000038a6cb196f805cc3041f6645a5a6cec27b64430d00000000000000000000000047d7095cfebf8285bdaa421bc8268d0db87d933c000000000000000000000000a8842be973800ff61d80d2d53fa62c3a685380eb0000000000000000000000003750e31321aee8c024751877070e8d5f704ce98700000000000000000000000000000000000000000000000000000000000000206f3b82406688b8ddb944c6f2e6d808f014c8fa8d568d639c25019568c715fbf000000000000000000000000000000000000000000000000000000000000004220880d88ee16f1080c8afa0251880c8afa025208090dfc04a288090dfc04a30033a05010101010142206c5ca6f74b532222ac927dd3de235d46a943e372c0563393a33b01dcfd3f371c4220855114d25c2ef5e85fffe4f20a365672d8f2dba3b2ec82333f494168a2039c0442200266e835634db00977cbc1caa4db10e1676c1a4c0fcbc6ba7f09300f0d1831824220980cd91f7a73f20f4b0d51d00cd4e00373dc2beafbb299ca3c609757ab98c8304220eb6d36e2af8922085ff510bbe1eb8932a0e3295ca9f047fef25d90e69c52948f4a34313244334b6f6f574463364b7232644542684b59326b336e685057694676544565325331703978544532544b74344d7572716f684a34313244334b6f6f574b436e4367724b637743324a3577576a626e355435335068646b6b6f57454e534a39546537544b7836366f4a4a34313244334b6f6f575239616f675948786b357a38636b624c4c56346e426f7a777a747871664a7050586671336d4a7232796452474a34313244334b6f6f5744695444635565675637776b313133473366476a69616259756f54436f3157726f6f53656741343263556f544a34313244334b6f6f574e64687072586b5472665370354d5071736270467a70364167394a53787358694341434442676454424c656652820300050e416c74424e2d3132382047e282810e86e8cf899ae9a1b43e023bbe8825b103659bb8d6d4e54f6a3cfae7b106069c216a812d7616e47f0bd38fa4863f48fbcda6a38af4c58d2233dfa7cf79620947042d09f923e0a2f7a2270391e8b058d8bdb8f79fe082b7b627f025651c7290382fdff97c3181d15d162c146ce87ff752499d2acc2b26011439a12e29571a6f1e1defb1751c3be4258c493984fd9f0f6b4a26c539870b5f15bfed3d8ffac92499eb62dbd2beb7c1524275a8019022f6ce6a7e86c9e65e3099452a2b96fc2432b127a112970e1adf615f823b2b2180754c2f0ee01f1b389e56df55ca09702cd0401b66ff71779d2dd67222503a85ab921b28c329cc1832800b192d0b0247c0776e1b9653dc00df48daa6364287c84c0382f5165e7269fef06d10bc67c1bba252305d1af0dc7bb0fe92558eb4c5f38c23163dee1cfb34a72020669dbdfe337c16f3307472616e736c61746f722066726f6d20416c74424e2d3132382047e2828120746f20416c74424e2d3132382047e282825880ade2046080c8afa0256880c8afa0257080ade204788094ebdc0382019e010a205034214e0bd4373f38e162cf9fc9133e2f3b71441faa4c3d1ac01c1877f1cd2712200e03e975b996f911abba2b79d2596c2150bc94510963c40a1137a03df6edacdb1a107dee1cdb894163813bb3da604c9c133c1a10bb33302eeafbd55d352e35dcc5d2b3311a10d2c658b6b93d74a02d467849b6fe75251a10fea5308cc1fea69e7246eafe7ca8a3a51a1048efe1ad873b6f025ac0243bdef715f8000000000000000000000000000000000000000000000000000000000000"), }, nil) expectedDKGVRF := ocr2vrftypes.OCRCommittee{ Signers: []common.Address{ common.HexToAddress("0x0A8cbEA12a06869d3EC432aB9682DAb6C761D591"), common.HexToAddress("0xF4f9db7BB1d16b7CDfb18Ec68994c26964F59853"), common.HexToAddress("0x22fB3F90C539457f00d8484438869135E604a655"), common.HexToAddress("0x33CbCedccb11c9773AD78e214Ba342E979255ab3"), common.HexToAddress("0x6ffaA96256fbC1012325cca88C79F725c33eED80"), }, Transmitters: []common.Address{ common.HexToAddress("0x74103Cf8b436465870b26aa9Fa2F62AD62b22E35"), common.HexToAddress("0x38A6Cb196f805cC3041F6645a5A6CEC27B64430D"), common.HexToAddress("0x47d7095CFEBF8285BdAa421Bc8268D0DB87D933C"), common.HexToAddress("0xa8842BE973800fF61D80d2d53fa62C3a685380eB"), common.HexToAddress("0x3750e31321aEE8c024751877070E8d5F704cE987"), }, } c := &coordinator{ lp: lp, lggr: logger.TestLogger(t), topics: tp, beaconAddress: beaconAddress, coordinatorAddress: coordinatorAddress, dkgAddress: dkgAddress, finalityDepth: 10, evmClient: evmClient, } actualDKG, actualVRF, err := c.DKGVRFCommittees(testutils.Context(t)) assert.NoError(t, err) assert.ElementsMatch(t, expectedDKGVRF.Signers, actualDKG.Signers) assert.ElementsMatch(t, expectedDKGVRF.Transmitters, actualDKG.Transmitters) assert.ElementsMatch(t, expectedDKGVRF.Signers, actualVRF.Signers) assert.ElementsMatch(t, expectedDKGVRF.Transmitters, actualVRF.Transmitters) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewLogPoller(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.On("LatestLogByEventSigWithConfs", mock.Anything, tp.configSetTopic, beaconAddress, evmtypes.Confirmations(10))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Confirmations(10)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `. Return(&logpoller.Log{ Data: hexutil.MustDecode("0x0000000000000000000000000000000000000000000000000000000000a6fca200010576e704b4a519484d6239ef17f1f5b4a82e330b0daf827ed4dc2789971b0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000a8cbea12a06869d3ec432ab9682dab6c761d591000000000000000000000000f4f9db7bb1d16b7cdfb18ec68994c26964f5985300000000000000000000000022fb3f90c539457f00d8484438869135e604a65500000000000000000000000033cbcedccb11c9773ad78e214ba342e979255ab30000000000000000000000006ffaa96256fbc1012325cca88c79f725c33eed80000000000000000000000000000000000000000000000000000000000000000500000000000000000000000074103cf8b436465870b26aa9fa2f62ad62b22e3500000000000000000000000038a6cb196f805cc3041f6645a5a6cec27b64430d00000000000000000000000047d7095cfebf8285bdaa421bc8268d0db87d933c000000000000000000000000a8842be973800ff61d80d2d53fa62c3a685380eb0000000000000000000000003750e31321aee8c024751877070e8d5f704ce98700000000000000000000000000000000000000000000000000000000000000206f3b82406688b8ddb944c6f2e6d808f014c8fa8d568d639c25019568c715fbf000000000000000000000000000000000000000000000000000000000000004220880d88ee16f1080c8afa0251880c8afa025208090dfc04a288090dfc04a30033a05010101010142206c5ca6f74b532222ac927dd3de235d46a943e372c0563393a33b01dcfd3f371c4220855114d25c2ef5e85fffe4f20a365672d8f2dba3b2ec82333f494168a2039c0442200266e835634db00977cbc1caa4db10e1676c1a4c0fcbc6ba7f09300f0d1831824220980cd91f7a73f20f4b0d51d00cd4e00373dc2beafbb299ca3c609757ab98c8304220eb6d36e2af8922085ff510bbe1eb8932a0e3295ca9f047fef25d90e69c52948f4a34313244334b6f6f574463364b7232644542684b59326b336e685057694676544565325331703978544532544b74344d7572716f684a34313244334b6f6f574b436e4367724b637743324a3577576a626e355435335068646b6b6f57454e534a39546537544b7836366f4a4a34313244334b6f6f575239616f675948786b357a38636b624c4c56346e426f7a777a747871664a7050586671336d4a7232796452474a34313244334b6f6f5744695444635565675637776b313133473366476a69616259756f54436f3157726f6f53656741343263556f544a34313244334b6f6f574e64687072586b5472665370354d5071736270467a70364167394a53787358694341434442676454424c656652820300050e416c74424e2d3132382047e282810e86e8cf899ae9a1b43e023bbe8825b103659bb8d6d4e54f6a3cfae7b106069c216a812d7616e47f0bd38fa4863f48fbcda6a38af4c58d2233dfa7cf79620947042d09f923e0a2f7a2270391e8b058d8bdb8f79fe082b7b627f025651c7290382fdff97c3181d15d162c146ce87ff752499d2acc2b26011439a12e29571a6f1e1defb1751c3be4258c493984fd9f0f6b4a26c539870b5f15bfed3d8ffac92499eb62dbd2beb7c1524275a8019022f6ce6a7e86c9e65e3099452a2b96fc2432b127a112970e1adf615f823b2b2180754c2f0ee01f1b389e56df55ca09702cd0401b66ff71779d2dd67222503a85ab921b28c329cc1832800b192d0b0247c0776e1b9653dc00df48daa6364287c84c0382f5165e7269fef06d10bc67c1bba252305d1af0dc7bb0fe92558eb4c5f38c23163dee1cfb34a72020669dbdfe337c16f3307472616e736c61746f722066726f6d20416c74424e2d3132382047e2828120746f20416c74424e2d3132382047e282825880ade2046080c8afa0256880c8afa0257080ade204788094ebdc0382019e010a205034214e0bd4373f38e162cf9fc9133e2f3b71441faa4c3d1ac01c1877f1cd2712200e03e975b996f911abba2b79d2596c2150bc94510963c40a1137a03df6edacdb1a107dee1cdb894163813bb3da604c9c133c1a10bb33302eeafbd55d352e35dcc5d2b3311a10d2c658b6b93d74a02d467849b6fe75251a10fea5308cc1fea69e7246eafe7ca8a3a51a1048efe1ad873b6f025ac0243bdef715f8000000000000000000000000000000000000000000000000000000000000"), }, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.MustDecode("0x0000000000000000000000000000000000000000000000000000000000a6fca200010576e704b4a519484d6239ef17f1f5b4a82e330b0daf827ed4dc2789971b0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000a8cbea12a06869d3ec432ab9682dab6c761d591000000000000000000000000f4f9db7bb1d16b7cdfb18ec68994c26964f5985300000000000000000000000022fb3f90c539457f00d8484438869135e604a65500000000000000000000000033cbcedccb11c9773ad78e214ba342e979255ab30000000000000000000000006ffaa96256fbc1012325cca88c79f725c33eed80000000000000000000000000000000000000000000000000000000000000000500000000000000000000000074103cf8b436465870b26aa9fa2f62ad62b22e3500000000000000000000000038a6cb196f805cc3041f6645a5a6cec27b64430d00000000000000000000000047d7095cfebf8285bdaa421bc8268d0db87d933c000000000000000000000000a8842be973800ff61d80d2d53fa62c3a685380eb0000000000000000000000003750e31321aee8c024751877070e8d5f704ce98700000000000000000000000000000000000000000000000000000000000000206f3b82406688b8ddb944c6f2e6d808f014c8fa8d568d639c25019568c715fbf000000000000000000000000000000000000000000000000000000000000004220880d88ee16f1080c8afa0251880c8afa025208090dfc04a288090dfc04a30033a05010101010142206c5ca6f74b532222ac927dd3de235d46a943e372c0563393a33b01dcfd3f371c4220855114d25c2ef5e85fffe4f20a365672d8f2dba3b2ec82333f494168a2039c0442200266e835634db00977cbc1caa4db10e1676c1a4c0fcbc6ba7f09300f0d1831824220980cd91f7a73f20f4b0d51d00cd4e00373dc2beafbb299ca3c609757ab98c8304220eb6d36e2af8922085ff510bbe1eb8932a0e3295ca9f047fef25d90e69c52948f4a34313244334b6f6f574463364b7232644542684b59326b336e685057694676544565325331703978544532544b74344d7572716f684a34313244334b6f6f574b436e4367724b637743324a3577576a626e355435335068646b6b6f57454e534a39546537544b7836366f4a4a34313244334b6f6f575239616f675948786b357a38636b624c4c56346e426f7a777a747871664a7050586671336d4a7232796452474a34313244334b6f6f5744695444635565675637776b313133473366476a69616259756f54436f3157726f6f53656741343263556f544a34313244334b6f6f574e64687072586b5472665370354d5071736270467a70364167394a53787358694341434442676454424c656652820300050e416c74424e2d3132382047e282810e86e8cf899ae9a1b43e023bbe8825b103659bb8d6d4e54f6a3cfae7b106069c216a812d7616e47f0bd38fa4863f48fbcda6a38af4c58d2233dfa7cf79620947042d09f923e0a2f7a2270391e8b058d8bdb8f79fe082b7b627f025651c7290382fdff97c3181d15d162c146ce87ff752499d2acc2b26011439a12e29571a6f1e1defb1751c3be4258c493984fd9f0f6b4a26c539870b5f15bfed3d8ffac92499eb62dbd2beb7c1524275a8019022f6ce6a7e86c9e65e3099452a2b96fc2432b127a112970e1adf615f823b2b2180754c2f0ee01f1b389e56df55ca09702cd0401b66ff71779d2dd67222503a85ab921b28c329cc1832800b192d0b0247c0776e1b9653dc00df48daa6364287c84c0382f5165e7269fef06d10bc67c1bba252305d1af0dc7bb0fe92558eb4c5f38c23163dee1cfb34a72020669dbdfe337c16f3307472616e736c61746f722066726f6d20416c74424e2d3132382047e2828120746f20416c74424e2d3132382047e282825880ade2046080c8afa0256880c8afa0257080ade204788094ebdc0382019e010a205034214e0bd4373f38e162cf9fc9133e2f3b71441faa4c3d1ac01c1877f1cd2712200e03e975b996f911abba2b79d2596c2150bc94510963c40a1137a03df6edacdb1a107dee1cdb894163813bb3da604c9c133c1a10bb33302eeafbd55d352e35dcc5d2b3311a10d2c658b6b93d74a02d467849b6fe75251a10fea5308cc1fea69e7246eafe7ca8a3a51a1048efe1ad873b6f025ac0243bdef715f8000000000000000000000000000000000000000000000000000000000000")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.On("LatestLogByEventSigWithConfs", mock.Anything, tp.configSetTopic, dkgAddress, evmtypes.Confirmations(10))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Confirmations(10)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `. Return(&logpoller.Log{ Data: hexutil.MustDecode("0x0000000000000000000000000000000000000000000000000000000000a6fca200010576e704b4a519484d6239ef17f1f5b4a82e330b0daf827ed4dc2789971b0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000a8cbea12a06869d3ec432ab9682dab6c761d591000000000000000000000000f4f9db7bb1d16b7cdfb18ec68994c26964f5985300000000000000000000000022fb3f90c539457f00d8484438869135e604a65500000000000000000000000033cbcedccb11c9773ad78e214ba342e979255ab30000000000000000000000006ffaa96256fbc1012325cca88c79f725c33eed80000000000000000000000000000000000000000000000000000000000000000500000000000000000000000074103cf8b436465870b26aa9fa2f62ad62b22e3500000000000000000000000038a6cb196f805cc3041f6645a5a6cec27b64430d00000000000000000000000047d7095cfebf8285bdaa421bc8268d0db87d933c000000000000000000000000a8842be973800ff61d80d2d53fa62c3a685380eb0000000000000000000000003750e31321aee8c024751877070e8d5f704ce98700000000000000000000000000000000000000000000000000000000000000206f3b82406688b8ddb944c6f2e6d808f014c8fa8d568d639c25019568c715fbf000000000000000000000000000000000000000000000000000000000000004220880d88ee16f1080c8afa0251880c8afa025208090dfc04a288090dfc04a30033a05010101010142206c5ca6f74b532222ac927dd3de235d46a943e372c0563393a33b01dcfd3f371c4220855114d25c2ef5e85fffe4f20a365672d8f2dba3b2ec82333f494168a2039c0442200266e835634db00977cbc1caa4db10e1676c1a4c0fcbc6ba7f09300f0d1831824220980cd91f7a73f20f4b0d51d00cd4e00373dc2beafbb299ca3c609757ab98c8304220eb6d36e2af8922085ff510bbe1eb8932a0e3295ca9f047fef25d90e69c52948f4a34313244334b6f6f574463364b7232644542684b59326b336e685057694676544565325331703978544532544b74344d7572716f684a34313244334b6f6f574b436e4367724b637743324a3577576a626e355435335068646b6b6f57454e534a39546537544b7836366f4a4a34313244334b6f6f575239616f675948786b357a38636b624c4c56346e426f7a777a747871664a7050586671336d4a7232796452474a34313244334b6f6f5744695444635565675637776b313133473366476a69616259756f54436f3157726f6f53656741343263556f544a34313244334b6f6f574e64687072586b5472665370354d5071736270467a70364167394a53787358694341434442676454424c656652820300050e416c74424e2d3132382047e282810e86e8cf899ae9a1b43e023bbe8825b103659bb8d6d4e54f6a3cfae7b106069c216a812d7616e47f0bd38fa4863f48fbcda6a38af4c58d2233dfa7cf79620947042d09f923e0a2f7a2270391e8b058d8bdb8f79fe082b7b627f025651c7290382fdff97c3181d15d162c146ce87ff752499d2acc2b26011439a12e29571a6f1e1defb1751c3be4258c493984fd9f0f6b4a26c539870b5f15bfed3d8ffac92499eb62dbd2beb7c1524275a8019022f6ce6a7e86c9e65e3099452a2b96fc2432b127a112970e1adf615f823b2b2180754c2f0ee01f1b389e56df55ca09702cd0401b66ff71779d2dd67222503a85ab921b28c329cc1832800b192d0b0247c0776e1b9653dc00df48daa6364287c84c0382f5165e7269fef06d10bc67c1bba252305d1af0dc7bb0fe92558eb4c5f38c23163dee1cfb34a72020669dbdfe337c16f3307472616e736c61746f722066726f6d20416c74424e2d3132382047e2828120746f20416c74424e2d3132382047e282825880ade2046080c8afa0256880c8afa0257080ade204788094ebdc0382019e010a205034214e0bd4373f38e162cf9fc9133e2f3b71441faa4c3d1ac01c1877f1cd2712200e03e975b996f911abba2b79d2596c2150bc94510963c40a1137a03df6edacdb1a107dee1cdb894163813bb3da604c9c133c1a10bb33302eeafbd55d352e35dcc5d2b3311a10d2c658b6b93d74a02d467849b6fe75251a10fea5308cc1fea69e7246eafe7ca8a3a51a1048efe1ad873b6f025ac0243bdef715f8000000000000000000000000000000000000000000000000000000000000"), }, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.MustDecode("0x0000000000000000000000000000000000000000000000000000000000a6fca200010576e704b4a519484d6239ef17f1f5b4a82e330b0daf827ed4dc2789971b0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000a8cbea12a06869d3ec432ab9682dab6c761d591000000000000000000000000f4f9db7bb1d16b7cdfb18ec68994c26964f5985300000000000000000000000022fb3f90c539457f00d8484438869135e604a65500000000000000000000000033cbcedccb11c9773ad78e214ba342e979255ab30000000000000000000000006ffaa96256fbc1012325cca88c79f725c33eed80000000000000000000000000000000000000000000000000000000000000000500000000000000000000000074103cf8b436465870b26aa9fa2f62ad62b22e3500000000000000000000000038a6cb196f805cc3041f6645a5a6cec27b64430d00000000000000000000000047d7095cfebf8285bdaa421bc8268d0db87d933c000000000000000000000000a8842be973800ff61d80d2d53fa62c3a685380eb0000000000000000000000003750e31321aee8c024751877070e8d5f704ce98700000000000000000000000000000000000000000000000000000000000000206f3b82406688b8ddb944c6f2e6d808f014c8fa8d568d639c25019568c715fbf000000000000000000000000000000000000000000000000000000000000004220880d88ee16f1080c8afa0251880c8afa025208090dfc04a288090dfc04a30033a05010101010142206c5ca6f74b532222ac927dd3de235d46a943e372c0563393a33b01dcfd3f371c4220855114d25c2ef5e85fffe4f20a365672d8f2dba3b2ec82333f494168a2039c0442200266e835634db00977cbc1caa4db10e1676c1a4c0fcbc6ba7f09300f0d1831824220980cd91f7a73f20f4b0d51d00cd4e00373dc2beafbb299ca3c609757ab98c8304220eb6d36e2af8922085ff510bbe1eb8932a0e3295ca9f047fef25d90e69c52948f4a34313244334b6f6f574463364b7232644542684b59326b336e685057694676544565325331703978544532544b74344d7572716f684a34313244334b6f6f574b436e4367724b637743324a3577576a626e355435335068646b6b6f57454e534a39546537544b7836366f4a4a34313244334b6f6f575239616f675948786b357a38636b624c4c56346e426f7a777a747871664a7050586671336d4a7232796452474a34313244334b6f6f5744695444635565675637776b313133473366476a69616259756f54436f3157726f6f53656741343263556f544a34313244334b6f6f574e64687072586b5472665370354d5071736270467a70364167394a53787358694341434442676454424c656652820300050e416c74424e2d3132382047e282810e86e8cf899ae9a1b43e023bbe8825b103659bb8d6d4e54f6a3cfae7b106069c216a812d7616e47f0bd38fa4863f48fbcda6a38af4c58d2233dfa7cf79620947042d09f923e0a2f7a2270391e8b058d8bdb8f79fe082b7b627f025651c7290382fdff97c3181d15d162c146ce87ff752499d2acc2b26011439a12e29571a6f1e1defb1751c3be4258c493984fd9f0f6b4a26c539870b5f15bfed3d8ffac92499eb62dbd2beb7c1524275a8019022f6ce6a7e86c9e65e3099452a2b96fc2432b127a112970e1adf615f823b2b2180754c2f0ee01f1b389e56df55ca09702cd0401b66ff71779d2dd67222503a85ab921b28c329cc1832800b192d0b0247c0776e1b9653dc00df48daa6364287c84c0382f5165e7269fef06d10bc67c1bba252305d1af0dc7bb0fe92558eb4c5f38c23163dee1cfb34a72020669dbdfe337c16f3307472616e736c61746f722066726f6d20416c74424e2d3132382047e2828120746f20416c74424e2d3132382047e282825880ade2046080c8afa0256880c8afa0257080ade204788094ebdc0382019e010a205034214e0bd4373f38e162cf9fc9133e2f3b71441faa4c3d1ac01c1877f1cd2712200e03e975b996f911abba2b79d2596c2150bc94510963c40a1137a03df6edacdb1a107dee1cdb894163813bb3da604c9c133c1a10bb33302eeafbd55d352e35dcc5d2b3311a10d2c658b6b93d74a02d467849b6fe75251a10fea5308cc1fea69e7246eafe7ca8a3a51a1048efe1ad873b6f025ac0243bdef715f8000000000000000000000000000000000000000000000000000000000000")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.HexToAddress("0x0A8cbEA12a06869d3EC432aB9682DAb6C761D591")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.HexToAddress("0xF4f9db7BB1d16b7CDfb18Ec68994c26964F59853")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.HexToAddress("0x22fB3F90C539457f00d8484438869135E604a655")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.HexToAddress("0x33CbCedccb11c9773AD78e214Ba342E979255ab3")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.HexToAddress("0x6ffaA96256fbC1012325cca88C79F725c33eED80")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.HexToAddress("0x74103Cf8b436465870b26aa9Fa2F62AD62b22E35")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.HexToAddress("0x38A6Cb196f805cC3041F6645a5A6CEC27B64430D")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.HexToAddress("0x47d7095CFEBF8285BdAa421Bc8268D0DB87D933C")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.HexToAddress("0xa8842BE973800fF61D80d2d53fa62C3a685380eB")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.HexToAddress("0x3750e31321aEE8c024751877070E8d5F704cE987")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.DKGVRFCommittees(testutils.Context(t))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Run("vrf log poll fails", func(t *testing.T) { lp := lp_mocks.NewLogPoller(t) tp := newTopics() beaconAddress := newAddress(t) lp.On("LatestLogByEventSigWithConfs", mock.Anything, tp.configSetTopic, beaconAddress, evmtypes.Confirmations(10)). Return(nil, errors.New("rpc error")) c := &coordinator{ lp: lp, lggr: logger.TestLogger(t), topics: tp, beaconAddress: beaconAddress, finalityDepth: 10, evmClient: evmClient, } _, _, err := c.DKGVRFCommittees(testutils.Context(t)) assert.Error(t, err) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewLogPoller(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.On("LatestLogByEventSigWithConfs", mock.Anything, tp.configSetTopic, beaconAddress, evmtypes.Confirmations(10))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Confirmations(10)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `. Return(nil, errors.New("rpc error"))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.New("rpc error")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.DKGVRFCommittees(testutils.Context(t))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewLogPoller(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.On("LatestLogByEventSigWithConfs", mock.Anything, tp.configSetTopic, beaconAddress, evmtypes.Confirmations(10))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Confirmations(10)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `. Return(&logpoller.Log{ Data: hexutil.MustDecode("0x0000000000000000000000000000000000000000000000000000000000a6fca200010576e704b4a519484d6239ef17f1f5b4a82e330b0daf827ed4dc2789971b0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000a8cbea12a06869d3ec432ab9682dab6c761d591000000000000000000000000f4f9db7bb1d16b7cdfb18ec68994c26964f5985300000000000000000000000022fb3f90c539457f00d8484438869135e604a65500000000000000000000000033cbcedccb11c9773ad78e214ba342e979255ab30000000000000000000000006ffaa96256fbc1012325cca88c79f725c33eed80000000000000000000000000000000000000000000000000000000000000000500000000000000000000000074103cf8b436465870b26aa9fa2f62ad62b22e3500000000000000000000000038a6cb196f805cc3041f6645a5a6cec27b64430d00000000000000000000000047d7095cfebf8285bdaa421bc8268d0db87d933c000000000000000000000000a8842be973800ff61d80d2d53fa62c3a685380eb0000000000000000000000003750e31321aee8c024751877070e8d5f704ce98700000000000000000000000000000000000000000000000000000000000000206f3b82406688b8ddb944c6f2e6d808f014c8fa8d568d639c25019568c715fbf000000000000000000000000000000000000000000000000000000000000004220880d88ee16f1080c8afa0251880c8afa025208090dfc04a288090dfc04a30033a05010101010142206c5ca6f74b532222ac927dd3de235d46a943e372c0563393a33b01dcfd3f371c4220855114d25c2ef5e85fffe4f20a365672d8f2dba3b2ec82333f494168a2039c0442200266e835634db00977cbc1caa4db10e1676c1a4c0fcbc6ba7f09300f0d1831824220980cd91f7a73f20f4b0d51d00cd4e00373dc2beafbb299ca3c609757ab98c8304220eb6d36e2af8922085ff510bbe1eb8932a0e3295ca9f047fef25d90e69c52948f4a34313244334b6f6f574463364b7232644542684b59326b336e685057694676544565325331703978544532544b74344d7572716f684a34313244334b6f6f574b436e4367724b637743324a3577576a626e355435335068646b6b6f57454e534a39546537544b7836366f4a4a34313244334b6f6f575239616f675948786b357a38636b624c4c56346e426f7a777a747871664a7050586671336d4a7232796452474a34313244334b6f6f5744695444635565675637776b313133473366476a69616259756f54436f3157726f6f53656741343263556f544a34313244334b6f6f574e64687072586b5472665370354d5071736270467a70364167394a53787358694341434442676454424c656652820300050e416c74424e2d3132382047e282810e86e8cf899ae9a1b43e023bbe8825b103659bb8d6d4e54f6a3cfae7b106069c216a812d7616e47f0bd38fa4863f48fbcda6a38af4c58d2233dfa7cf79620947042d09f923e0a2f7a2270391e8b058d8bdb8f79fe082b7b627f025651c7290382fdff97c3181d15d162c146ce87ff752499d2acc2b26011439a12e29571a6f1e1defb1751c3be4258c493984fd9f0f6b4a26c539870b5f15bfed3d8ffac92499eb62dbd2beb7c1524275a8019022f6ce6a7e86c9e65e3099452a2b96fc2432b127a112970e1adf615f823b2b2180754c2f0ee01f1b389e56df55ca09702cd0401b66ff71779d2dd67222503a85ab921b28c329cc1832800b192d0b0247c0776e1b9653dc00df48daa6364287c84c0382f5165e7269fef06d10bc67c1bba252305d1af0dc7bb0fe92558eb4c5f38c23163dee1cfb34a72020669dbdfe337c16f3307472616e736c61746f722066726f6d20416c74424e2d3132382047e2828120746f20416c74424e2d3132382047e282825880ade2046080c8afa0256880c8afa0257080ade204788094ebdc0382019e010a205034214e0bd4373f38e162cf9fc9133e2f3b71441faa4c3d1ac01c1877f1cd2712200e03e975b996f911abba2b79d2596c2150bc94510963c40a1137a03df6edacdb1a107dee1cdb894163813bb3da604c9c133c1a10bb33302eeafbd55d352e35dcc5d2b3311a10d2c658b6b93d74a02d467849b6fe75251a10fea5308cc1fea69e7246eafe7ca8a3a51a1048efe1ad873b6f025ac0243bdef715f8000000000000000000000000000000000000000000000000000000000000"), }, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.MustDecode("0x0000000000000000000000000000000000000000000000000000000000a6fca200010576e704b4a519484d6239ef17f1f5b4a82e330b0daf827ed4dc2789971b0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000a8cbea12a06869d3ec432ab9682dab6c761d591000000000000000000000000f4f9db7bb1d16b7cdfb18ec68994c26964f5985300000000000000000000000022fb3f90c539457f00d8484438869135e604a65500000000000000000000000033cbcedccb11c9773ad78e214ba342e979255ab30000000000000000000000006ffaa96256fbc1012325cca88c79f725c33eed80000000000000000000000000000000000000000000000000000000000000000500000000000000000000000074103cf8b436465870b26aa9fa2f62ad62b22e3500000000000000000000000038a6cb196f805cc3041f6645a5a6cec27b64430d00000000000000000000000047d7095cfebf8285bdaa421bc8268d0db87d933c000000000000000000000000a8842be973800ff61d80d2d53fa62c3a685380eb0000000000000000000000003750e31321aee8c024751877070e8d5f704ce98700000000000000000000000000000000000000000000000000000000000000206f3b82406688b8ddb944c6f2e6d808f014c8fa8d568d639c25019568c715fbf000000000000000000000000000000000000000000000000000000000000004220880d88ee16f1080c8afa0251880c8afa025208090dfc04a288090dfc04a30033a05010101010142206c5ca6f74b532222ac927dd3de235d46a943e372c0563393a33b01dcfd3f371c4220855114d25c2ef5e85fffe4f20a365672d8f2dba3b2ec82333f494168a2039c0442200266e835634db00977cbc1caa4db10e1676c1a4c0fcbc6ba7f09300f0d1831824220980cd91f7a73f20f4b0d51d00cd4e00373dc2beafbb299ca3c609757ab98c8304220eb6d36e2af8922085ff510bbe1eb8932a0e3295ca9f047fef25d90e69c52948f4a34313244334b6f6f574463364b7232644542684b59326b336e685057694676544565325331703978544532544b74344d7572716f684a34313244334b6f6f574b436e4367724b637743324a3577576a626e355435335068646b6b6f57454e534a39546537544b7836366f4a4a34313244334b6f6f575239616f675948786b357a38636b624c4c56346e426f7a777a747871664a7050586671336d4a7232796452474a34313244334b6f6f5744695444635565675637776b313133473366476a69616259756f54436f3157726f6f53656741343263556f544a34313244334b6f6f574e64687072586b5472665370354d5071736270467a70364167394a53787358694341434442676454424c656652820300050e416c74424e2d3132382047e282810e86e8cf899ae9a1b43e023bbe8825b103659bb8d6d4e54f6a3cfae7b106069c216a812d7616e47f0bd38fa4863f48fbcda6a38af4c58d2233dfa7cf79620947042d09f923e0a2f7a2270391e8b058d8bdb8f79fe082b7b627f025651c7290382fdff97c3181d15d162c146ce87ff752499d2acc2b26011439a12e29571a6f1e1defb1751c3be4258c493984fd9f0f6b4a26c539870b5f15bfed3d8ffac92499eb62dbd2beb7c1524275a8019022f6ce6a7e86c9e65e3099452a2b96fc2432b127a112970e1adf615f823b2b2180754c2f0ee01f1b389e56df55ca09702cd0401b66ff71779d2dd67222503a85ab921b28c329cc1832800b192d0b0247c0776e1b9653dc00df48daa6364287c84c0382f5165e7269fef06d10bc67c1bba252305d1af0dc7bb0fe92558eb4c5f38c23163dee1cfb34a72020669dbdfe337c16f3307472616e736c61746f722066726f6d20416c74424e2d3132382047e2828120746f20416c74424e2d3132382047e282825880ade2046080c8afa0256880c8afa0257080ade204788094ebdc0382019e010a205034214e0bd4373f38e162cf9fc9133e2f3b71441faa4c3d1ac01c1877f1cd2712200e03e975b996f911abba2b79d2596c2150bc94510963c40a1137a03df6edacdb1a107dee1cdb894163813bb3da604c9c133c1a10bb33302eeafbd55d352e35dcc5d2b3311a10d2c658b6b93d74a02d467849b6fe75251a10fea5308cc1fea69e7246eafe7ca8a3a51a1048efe1ad873b6f025ac0243bdef715f8000000000000000000000000000000000000000000000000000000000000")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.On("LatestLogByEventSigWithConfs", mock.Anything, tp.configSetTopic, dkgAddress, evmtypes.Confirmations(10))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Confirmations(10)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `. Return(nil, errors.New("rpc error"))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.New("rpc error")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.DKGVRFCommittees(testutils.Context(t))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Run("valid output", func(t *testing.T) { h := crypto.Keccak256Hash([]byte("hello world")) var expected [32]byte copy(expected[:], h.Bytes()) onchainRouter := mocks.NewVRFBeaconCoordinator(t) onchainRouter. On("SProvingKeyHash", mock.Anything). Return(expected, nil) c := &coordinator{ onchainRouter: onchainRouter, } provingKeyHash, err := c.ProvingKeyHash(testutils.Context(t)) assert.NoError(t, err) assert.ElementsMatch(t, expected[:], provingKeyHash[:]) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Keccak256Hash([]byte("hello world"))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewVRFBeaconCoordinator(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `. On("SProvingKeyHash", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `. Return(expected, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ProvingKeyHash(testutils.Context(t))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewVRFBeaconCoordinator(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `. On("SProvingKeyHash", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `. Return([32]byte{}, errors.New("rpc error"))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.New("rpc error")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ProvingKeyHash(testutils.Context(t))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewClient(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.On("ConfiguredChainID")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Return(big.NewInt(1))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Run("happy path, beacon requests", func(t *testing.T) { beaconAddress := newAddress(t) coordinatorAddress := newAddress(t) latestHeadNumber := uint64(200) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) require.NoError(t, err) tp := newTopics() lookbackBlocks := uint64(5) lp := getLogPoller(t, []uint64{195}, latestHeadNumber, true, true, lookbackBlocks) lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{ newRandomnessRequestedLog(t, 3, 195, 191, 0, coordinatorAddress), newRandomnessRequestedLog(t, 3, 195, 192, 1, coordinatorAddress), newRandomnessRequestedLog(t, 3, 195, 193, 2, coordinatorAddress), }, nil).Once() c := &coordinator{ onchainRouter: onchainRouter, beaconAddress: beaconAddress, coordinatorAddress: coordinatorAddress, lp: lp, lggr: logger.TestLogger(t), topics: tp, evmClient: evmClient, toBeTransmittedBlocks: NewBlockCache[blockInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), toBeTransmittedCallbacks: NewBlockCache[callbackInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), coordinatorConfig: newCoordinatorConfig(lookbackBlocks), blockhashLookback: lookbackBlocks, } blocks, callbacks, recentHeightStart, recentBlocks, err := c.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused ) assert.NoError(t, err) assert.Len(t, blocks, 1) assert.Len(t, callbacks, 0) assert.Equal(t, latestHeadNumber-lookbackBlocks+1, recentHeightStart) assert.Len(t, recentBlocks, int(lookbackBlocks)) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, )` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Return([]logpoller.Log{ newRandomnessRequestedLog(t, 3, 195, 191, 0, coordinatorAddress), newRandomnessRequestedLog(t, 3, 195, 192, 1, coordinatorAddress), newRandomnessRequestedLog(t, 3, 195, 193, 2, coordinatorAddress), }, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused )` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(0)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Run("happy path, callback requests", func(t *testing.T) { beaconAddress := newAddress(t) coordinatorAddress := newAddress(t) latestHeadNumber := uint64(200) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) require.NoError(t, err) tp := newTopics() lookbackBlocks := uint64(5) lp := getLogPoller(t, []uint64{195}, latestHeadNumber, true, true, lookbackBlocks) lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{ newRandomnessFulfillmentRequestedLog(t, 3, 195, 191, 1, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 192, 2, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 193, 3, 1000, coordinatorAddress), }, nil).Once() c := &coordinator{ onchainRouter: onchainRouter, beaconAddress: beaconAddress, coordinatorAddress: coordinatorAddress, lp: lp, lggr: logger.TestLogger(t), topics: tp, evmClient: evmClient, toBeTransmittedBlocks: NewBlockCache[blockInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), toBeTransmittedCallbacks: NewBlockCache[callbackInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), coordinatorConfig: newCoordinatorConfig(lookbackBlocks), blockhashLookback: lookbackBlocks, } blocks, callbacks, recentHeightStart, recentBlocks, err := c.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused ) assert.NoError(t, err) assert.Len(t, blocks, 1) for _, b := range blocks { assert.False(t, b.ShouldStore) } assert.Len(t, callbacks, 3) assert.Equal(t, latestHeadNumber-lookbackBlocks+1, recentHeightStart) assert.Len(t, recentBlocks, int(lookbackBlocks)) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, )` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Return([]logpoller.Log{ newRandomnessFulfillmentRequestedLog(t, 3, 195, 191, 1, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 192, 2, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 193, 3, 1000, coordinatorAddress), }, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused )` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(0)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Run("happy path, beacon requests, beacon fulfillments", func(t *testing.T) { beaconAddress := newAddress(t) coordinatorAddress := newAddress(t) latestHeadNumber := uint64(200) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) require.NoError(t, err) tp := newTopics() lookbackBlocks := uint64(5) lp := getLogPoller(t, []uint64{195}, latestHeadNumber, true, true, lookbackBlocks) lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{ newRandomnessRequestedLog(t, 3, 195, 191, 0, coordinatorAddress), newRandomnessRequestedLog(t, 3, 195, 192, 1, coordinatorAddress), newRandomnessRequestedLog(t, 3, 195, 193, 2, coordinatorAddress), newOutputsServedLog(t, []vrf_coordinator.VRFBeaconTypesOutputServed{ { Height: 195, ConfirmationDelay: big.NewInt(3), ProofG1X: proofG1X, ProofG1Y: proofG1Y, }, }, coordinatorAddress), }, nil).Once() c := &coordinator{ onchainRouter: onchainRouter, beaconAddress: beaconAddress, coordinatorAddress: coordinatorAddress, lp: lp, lggr: logger.TestLogger(t), topics: tp, evmClient: evmClient, toBeTransmittedBlocks: NewBlockCache[blockInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), toBeTransmittedCallbacks: NewBlockCache[callbackInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), coordinatorConfig: newCoordinatorConfig(lookbackBlocks), blockhashLookback: lookbackBlocks, } blocks, callbacks, recentHeightStart, recentBlocks, err := c.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused ) assert.NoError(t, err) assert.Len(t, blocks, 0) assert.Len(t, callbacks, 0) assert.Equal(t, latestHeadNumber-lookbackBlocks+1, recentHeightStart) assert.Len(t, recentBlocks, int(lookbackBlocks)) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, )` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Return([]logpoller.Log{ newRandomnessRequestedLog(t, 3, 195, 191, 0, coordinatorAddress), newRandomnessRequestedLog(t, 3, 195, 192, 1, coordinatorAddress), newRandomnessRequestedLog(t, 3, 195, 193, 2, coordinatorAddress), newOutputsServedLog(t, []vrf_coordinator.VRFBeaconTypesOutputServed{ { Height: 195, ConfirmationDelay: big.NewInt(3), ProofG1X: proofG1X, ProofG1Y: proofG1Y, }, }, coordinatorAddress), }, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(3)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused )` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(0)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Run("happy path, callback requests, callback fulfillments", func(t *testing.T) { beaconAddress := newAddress(t) coordinatorAddress := newAddress(t) latestHeadNumber := uint64(200) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) require.NoError(t, err) tp := newTopics() lookbackBlocks := uint64(5) lp := getLogPoller(t, []uint64{195}, latestHeadNumber, true, true, lookbackBlocks) // Both RandomWordsFulfilled and NewTransmission events are emitted // when a VRF fulfillment happens on chain. lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{ newRandomnessFulfillmentRequestedLog(t, 3, 195, 191, 1, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 192, 2, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 193, 3, 1000, coordinatorAddress), // Regardless of success or failure, if the fulfillment has been tried once do not report again. newRandomWordsFulfilledLog(t, []*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)}, []byte{1, 0, 0}, coordinatorAddress), newOutputsServedLog(t, []vrf_coordinator.VRFBeaconTypesOutputServed{ { Height: 195, ConfirmationDelay: big.NewInt(3), ProofG1X: proofG1X, ProofG1Y: proofG1Y, }, }, coordinatorAddress), }, nil).Once() c := &coordinator{ onchainRouter: onchainRouter, beaconAddress: beaconAddress, coordinatorAddress: coordinatorAddress, lp: lp, lggr: logger.TestLogger(t), topics: tp, evmClient: evmClient, toBeTransmittedBlocks: NewBlockCache[blockInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), toBeTransmittedCallbacks: NewBlockCache[callbackInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), coordinatorConfig: newCoordinatorConfig(lookbackBlocks), blockhashLookback: lookbackBlocks, } blocks, callbacks, recentHeightStart, recentBlocks, err := c.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused ) assert.NoError(t, err) assert.Len(t, blocks, 0) assert.Len(t, callbacks, 0) assert.Equal(t, latestHeadNumber-lookbackBlocks+1, recentHeightStart) assert.Len(t, recentBlocks, int(lookbackBlocks)) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, )` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Return([]logpoller.Log{ newRandomnessFulfillmentRequestedLog(t, 3, 195, 191, 1, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 192, 2, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 193, 3, 1000, coordinatorAddress), // Regardless of success or failure, if the fulfillment has been tried once do not report again. newRandomWordsFulfilledLog(t, []*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)}, []byte{1, 0, 0}, coordinatorAddress), newOutputsServedLog(t, []vrf_coordinator.VRFBeaconTypesOutputServed{ { Height: 195, ConfirmationDelay: big.NewInt(3), ProofG1X: proofG1X, ProofG1Y: proofG1Y, }, }, coordinatorAddress), }, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(3)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(3)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused )` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(0)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Run("happy path, only beacon fulfillment", func(t *testing.T) { beaconAddress := newAddress(t) coordinatorAddress := newAddress(t) latestHeadNumber := uint64(200) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) require.NoError(t, err) tp := newTopics() lookbackBlocks := uint64(5) lp := getLogPoller(t, []uint64{}, latestHeadNumber, true, true, lookbackBlocks) lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{newOutputsServedLog(t, []vrf_coordinator.VRFBeaconTypesOutputServed{ { Height: 195, ConfirmationDelay: big.NewInt(3), ProofG1X: proofG1X, ProofG1Y: proofG1Y, }, }, coordinatorAddress)}, nil).Once() c := &coordinator{ onchainRouter: onchainRouter, beaconAddress: beaconAddress, coordinatorAddress: coordinatorAddress, lp: lp, lggr: logger.TestLogger(t), topics: tp, evmClient: evmClient, toBeTransmittedBlocks: NewBlockCache[blockInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), toBeTransmittedCallbacks: NewBlockCache[callbackInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), coordinatorConfig: newCoordinatorConfig(lookbackBlocks), blockhashLookback: lookbackBlocks, } blocks, callbacks, recentHeightStart, recentBlocks, err := c.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused ) assert.NoError(t, err) assert.Len(t, blocks, 0) assert.Len(t, callbacks, 0) assert.Equal(t, latestHeadNumber-lookbackBlocks+1, recentHeightStart) assert.Len(t, recentBlocks, int(lookbackBlocks)) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, )` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Return([]logpoller.Log{newOutputsServedLog(t, []vrf_coordinator.VRFBeaconTypesOutputServed{ { Height: 195, ConfirmationDelay: big.NewInt(3), ProofG1X: proofG1X, ProofG1Y: proofG1Y, }, }, coordinatorAddress)}, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(3)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused )` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(0)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Run("happy path, callback requests & callback fulfillments in-flight", func(t *testing.T) { beaconAddress := newAddress(t) coordinatorAddress := newAddress(t) latestHeadNumber := uint64(200) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) require.NoError(t, err) tp := newTopics() lookbackBlocks := uint64(5) // Do not include latestHeadNumber in "GetBlocksRange" call for initial "ReportWillBeTransmitted." // Do not include recent blockhashes in range either. lp := getLogPoller(t, []uint64{195}, latestHeadNumber, false, false /* includeLatestHeadInRange */, 0) c := &coordinator{ onchainRouter: onchainRouter, beaconAddress: beaconAddress, coordinatorAddress: coordinatorAddress, lp: lp, lggr: logger.TestLogger(t), topics: tp, evmClient: evmClient, toBeTransmittedBlocks: NewBlockCache[blockInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), toBeTransmittedCallbacks: NewBlockCache[callbackInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), coordinatorConfig: newCoordinatorConfig(lookbackBlocks), blockhashLookback: lookbackBlocks, } report := ocr2vrftypes.AbstractReport{ RecentBlockHeight: 195, RecentBlockHash: common.HexToHash("0x001"), Outputs: []ocr2vrftypes.AbstractVRFOutput{ { BlockHeight: 195, ConfirmationDelay: 195, Callbacks: []ocr2vrftypes.AbstractCostedCallbackRequest{ { RequestID: big.NewInt(1), BeaconHeight: 195, }, { RequestID: big.NewInt(2), BeaconHeight: 195, }, { RequestID: big.NewInt(3), BeaconHeight: 195, }, }, }, }, } err = c.ReportWillBeTransmitted(testutils.Context(t), report) require.NoError(t, err) // Include latestHeadNumber in "GetBlocksRange" call for "ReportBlocks" call. // Include recent blockhashes in range. lp = getLogPoller(t, []uint64{195}, latestHeadNumber, true, true /* includeLatestHeadInRange */, lookbackBlocks) c.lp = lp lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{ newRandomnessFulfillmentRequestedLog(t, 3, 195, 191, 1, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 192, 2, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 193, 3, 1000, coordinatorAddress), newOutputsServedLog(t, []vrf_coordinator.VRFBeaconTypesOutputServed{ { Height: 195, ConfirmationDelay: big.NewInt(3), ProofG1X: proofG1X, ProofG1Y: proofG1Y, }, }, coordinatorAddress), }, nil).Once() blocks, callbacks, recentHeightStart, recentBlocks, err := c.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused ) assert.NoError(t, err) assert.Len(t, blocks, 0) assert.Len(t, callbacks, 0) assert.Equal(t, latestHeadNumber-lookbackBlocks+1, recentHeightStart) assert.Len(t, recentBlocks, int(lookbackBlocks)) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.HexToHash("0x001")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(3)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ReportWillBeTransmitted(testutils.Context(t), report)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, )` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Return([]logpoller.Log{ newRandomnessFulfillmentRequestedLog(t, 3, 195, 191, 1, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 192, 2, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 193, 3, 1000, coordinatorAddress), newOutputsServedLog(t, []vrf_coordinator.VRFBeaconTypesOutputServed{ { Height: 195, ConfirmationDelay: big.NewInt(3), ProofG1X: proofG1X, ProofG1Y: proofG1Y, }, }, coordinatorAddress), }, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(3)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused )` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(0)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Run("happy path, blocks requested hits batch gas limit", func(t *testing.T) { coordinatorAddress := newAddress(t) beaconAddress := newAddress(t) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) require.NoError(t, err) latestHeadNumber := uint64(400) lookbackBlocks := uint64(400) blockhashLookback := uint64(256) tp := newTopics() logs := []logpoller.Log{} requestedBlocks := []uint64{} // Populate 200 request blocks. for i := 0; i < 400; i += 2 { logs = append(logs, newRandomnessRequestedLog(t, 1, uint64(i), 0, int64(i), coordinatorAddress)) requestedBlocks = append(requestedBlocks, uint64(i)) } lp := getLogPoller(t, requestedBlocks, latestHeadNumber, true, true, blockhashLookback) lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return(logs, nil) c := &coordinator{ onchainRouter: onchainRouter, beaconAddress: beaconAddress, coordinatorAddress: coordinatorAddress, lp: lp, lggr: logger.TestLogger(t), topics: tp, evmClient: evmClient, toBeTransmittedBlocks: NewBlockCache[blockInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), toBeTransmittedCallbacks: NewBlockCache[callbackInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), coordinatorConfig: newCoordinatorConfig(lookbackBlocks), blockhashLookback: blockhashLookback, } blocks, callbacks, recentHeightStart, recentBlocks, err := c.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{1: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused ) // Coordinator should allow 99 blocks, i.e 100 blocks - 1 block's worth of gas // for the coordinator overhead. assert.NoError(t, err) assert.Len(t, blocks, 99) for _, b := range blocks { assert.True(t, b.ShouldStore) } assert.Len(t, callbacks, 0) assert.Equal(t, latestHeadNumber-blockhashLookback+1, recentHeightStart) assert.Len(t, recentBlocks, int(blockhashLookback)) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, )` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Return(logs, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{1: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused )` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(0)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Run("happy path, last callback hits batch gas limit", func(t *testing.T) { coordinatorAddress := newAddress(t) beaconAddress := newAddress(t) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) require.NoError(t, err) latestHeadNumber := uint64(200) lookbackBlocks := uint64(5) tp := newTopics() requestedBlocks := []uint64{195} lp := getLogPoller(t, requestedBlocks, latestHeadNumber, true, true, lookbackBlocks) lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{ newRandomnessRequestedLog(t, 3, 195, 191, 0, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 191, 1, 2_000_000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 192, 2, 2_900_000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 193, 3, 1, coordinatorAddress), }, nil) c := &coordinator{ onchainRouter: onchainRouter, beaconAddress: beaconAddress, coordinatorAddress: coordinatorAddress, lp: lp, lggr: logger.TestLogger(t), topics: tp, evmClient: evmClient, toBeTransmittedBlocks: NewBlockCache[blockInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), toBeTransmittedCallbacks: NewBlockCache[callbackInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), coordinatorConfig: newCoordinatorConfig(lookbackBlocks), blockhashLookback: lookbackBlocks, } blocks, callbacks, recentHeightStart, recentBlocks, err := c.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused ) // Should allow the first two callbacks, which add up to 4_950_000 + 50_000 (1 block) = 5_000_000, // then reject the last callback for being out of gas. assert.NoError(t, err) assert.Len(t, blocks, 1) for _, b := range blocks { assert.True(t, b.ShouldStore) } assert.Len(t, callbacks, 2) assert.Equal(t, latestHeadNumber-lookbackBlocks+1, recentHeightStart) assert.Len(t, recentBlocks, int(lookbackBlocks)) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, )` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Return([]logpoller.Log{ newRandomnessRequestedLog(t, 3, 195, 191, 0, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 191, 1, 2_000_000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 192, 2, 2_900_000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 193, 3, 1, coordinatorAddress), }, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused )` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(0)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Run("happy path, sandwiched callbacks hit batch gas limit", func(t *testing.T) { coordinatorAddress := newAddress(t) beaconAddress := newAddress(t) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) require.NoError(t, err) latestHeadNumber := uint64(200) lookbackBlocks := uint64(5) tp := newTopics() requestedBlocks := []uint64{195} lp := getLogPoller(t, requestedBlocks, latestHeadNumber, true, true, lookbackBlocks) lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{ newRandomnessRequestedLog(t, 3, 195, 191, 0, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 191, 1, 10_000_000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 192, 2, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 193, 3, 10_000_000, coordinatorAddress), }, nil) c := &coordinator{ onchainRouter: onchainRouter, beaconAddress: beaconAddress, coordinatorAddress: coordinatorAddress, lp: lp, lggr: logger.TestLogger(t), topics: tp, evmClient: evmClient, toBeTransmittedBlocks: NewBlockCache[blockInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), toBeTransmittedCallbacks: NewBlockCache[callbackInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), coordinatorConfig: newCoordinatorConfig(lookbackBlocks), blockhashLookback: lookbackBlocks, } blocks, callbacks, recentHeightStart, recentBlocks, err := c.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused ) // Should allow the middle callback, with an acceptable gas allowance, to be processed. assert.NoError(t, err) assert.Len(t, blocks, 1) assert.Len(t, callbacks, 1) assert.Equal(t, latestHeadNumber-lookbackBlocks+1, recentHeightStart) assert.Len(t, recentBlocks, int(lookbackBlocks)) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, )` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Return([]logpoller.Log{ newRandomnessRequestedLog(t, 3, 195, 191, 0, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 191, 1, 10_000_000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 192, 2, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 193, 3, 10_000_000, coordinatorAddress), }, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused )` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(0)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Run("happy path, sandwiched callbacks with valid callback in next block hit batch gas limit", func(t *testing.T) { coordinatorAddress := newAddress(t) beaconAddress := newAddress(t) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) require.NoError(t, err) latestHeadNumber := uint64(200) lookbackBlocks := uint64(5) tp := newTopics() requestedBlocks := []uint64{195, 196} lp := getLogPoller(t, requestedBlocks, latestHeadNumber, true, true, lookbackBlocks) lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{ newRandomnessRequestedLog(t, 3, 195, 191, 0, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 191, 1, 10_000_000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 192, 2, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 193, 3, 10_000_000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 196, 194, 4, 1000, coordinatorAddress), }, nil) c := &coordinator{ onchainRouter: onchainRouter, beaconAddress: beaconAddress, coordinatorAddress: coordinatorAddress, lp: lp, lggr: logger.TestLogger(t), topics: tp, evmClient: evmClient, toBeTransmittedBlocks: NewBlockCache[blockInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), toBeTransmittedCallbacks: NewBlockCache[callbackInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), coordinatorConfig: newCoordinatorConfig(lookbackBlocks), blockhashLookback: lookbackBlocks, } blocks, callbacks, recentHeightStart, recentBlocks, err := c.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused ) // Should allow the middle callback, with an acceptable gas allowance, to be processed, // then move to the next block and find a suitable callback. Also adds the block 196 for // that callback. assert.NoError(t, err) assert.Len(t, blocks, 2) assert.Len(t, callbacks, 2) assert.Equal(t, latestHeadNumber-lookbackBlocks+1, recentHeightStart) assert.Len(t, recentBlocks, int(lookbackBlocks)) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, )` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Return([]logpoller.Log{ newRandomnessRequestedLog(t, 3, 195, 191, 0, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 191, 1, 10_000_000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 192, 2, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 193, 3, 10_000_000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 196, 194, 4, 1000, coordinatorAddress), }, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused )` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(0)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Run("correct blockhashes are retrieved with the maximum lookback", func(t *testing.T) { coordinatorAddress := newAddress(t) beaconAddress := newAddress(t) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) require.NoError(t, err) latestHeadNumber := uint64(1000) lookbackBlocks := uint64(256) tp := newTopics() requestedBlocks := []uint64{} lp := getLogPoller(t, requestedBlocks, latestHeadNumber, true, true, lookbackBlocks) lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{}, nil) c := &coordinator{ onchainRouter: onchainRouter, beaconAddress: beaconAddress, coordinatorAddress: coordinatorAddress, lp: lp, lggr: logger.TestLogger(t), topics: tp, evmClient: evmClient, toBeTransmittedBlocks: NewBlockCache[blockInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), toBeTransmittedCallbacks: NewBlockCache[callbackInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), coordinatorConfig: newCoordinatorConfig(lookbackBlocks), blockhashLookback: lookbackBlocks, } _, _, recentHeightStart, recentBlocks, err := c.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused ) assert.NoError(t, err) assert.Equal(t, latestHeadNumber-lookbackBlocks+1, recentHeightStart) assert.Equal(t, common.HexToHash(fmt.Sprintf("0x00%d", 1)), recentBlocks[0]) assert.Equal(t, common.HexToHash(fmt.Sprintf("0x00%d", lookbackBlocks)), recentBlocks[len(recentBlocks)-1]) assert.Len(t, recentBlocks, int(lookbackBlocks)) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, )` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Return([]logpoller.Log{}, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused )` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(0)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Run("correct blockhashes are retrieved with a capped lookback (close to genesis block)", func(t *testing.T) { coordinatorAddress := newAddress(t) beaconAddress := newAddress(t) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) require.NoError(t, err) latestHeadNumber := uint64(100) lookbackBlocks := uint64(100) tp := newTopics() requestedBlocks := []uint64{} lp := getLogPoller(t, requestedBlocks, latestHeadNumber, true, true, lookbackBlocks) lp.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, ).Return([]logpoller.Log{}, nil) c := &coordinator{ onchainRouter: onchainRouter, beaconAddress: beaconAddress, coordinatorAddress: coordinatorAddress, lp: lp, lggr: logger.TestLogger(t), topics: tp, evmClient: evmClient, toBeTransmittedBlocks: NewBlockCache[blockInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), toBeTransmittedCallbacks: NewBlockCache[callbackInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), coordinatorConfig: newCoordinatorConfig(lookbackBlocks), blockhashLookback: lookbackBlocks, } _, _, recentHeightStart, recentBlocks, err := c.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused ) assert.NoError(t, err) assert.Equal(t, latestHeadNumber-lookbackBlocks+1, recentHeightStart) assert.Equal(t, common.HexToHash(fmt.Sprintf("0x00%d", 1)), recentBlocks[0]) assert.Equal(t, common.HexToHash(fmt.Sprintf("0x00%d", lookbackBlocks)), recentBlocks[len(recentBlocks)-1]) assert.Len(t, recentBlocks, int(lookbackBlocks)) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, )` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Return([]logpoller.Log{}, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused )` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(0)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewLogPoller(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.On("LatestBlock", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `. Return(logpoller.LogPollerBlock{BlockNumber: int64(latestHeadNumber)}, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.On("GetBlocksRange", mock.Anything, append(requestedBlocks, latestHeadNumber-lookbackBlocks+1, latestHeadNumber))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `. Return(nil, errors.New("GetBlocks error"))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.New("GetBlocks error")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.On( "LogsWithSigs", mock.Anything, int64(latestHeadNumber-lookbackBlocks), int64(latestHeadNumber), []common.Hash{ tp.randomnessRequestedTopic, tp.randomnessFulfillmentRequestedTopic, tp.randomWordsFulfilledTopic, tp.outputsServedTopic, }, coordinatorAddress, )` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Return([]logpoller.Log{ newRandomnessRequestedLog(t, 3, 195, 191, 0, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 191, 1, 10_000_000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 192, 2, 1000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 195, 193, 3, 10_000_000, coordinatorAddress), newRandomnessFulfillmentRequestedLog(t, 3, 196, 194, 4, 1000, coordinatorAddress), }, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ReportBlocks( testutils.Context(t), 0, // slotInterval: unused map[uint32]struct{}{3: {}}, time.Duration(0), 100, // maxBlocks: unused 100, // maxCallbacks: unused )` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(0)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewClient(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.On("ConfiguredChainID")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Return(big.NewInt(1))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Run("happy path", func(t *testing.T) { lookbackBlocks := uint64(0) lp := getLogPoller(t, []uint64{199}, 200, false, false, 0) c := &coordinator{ lp: lp, lggr: logger.TestLogger(t), toBeTransmittedBlocks: NewBlockCache[blockInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), toBeTransmittedCallbacks: NewBlockCache[callbackInReport](time.Duration(int64(lookbackBlocks) * int64(time.Second))), coordinatorConfig: newCoordinatorConfig(lookbackBlocks), evmClient: evmClient, } assert.NoError(t, c.ReportWillBeTransmitted(testutils.Context(t), ocr2vrftypes.AbstractReport{ RecentBlockHeight: 199, RecentBlockHash: common.HexToHash("0x001"), })) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(int64(lookbackBlocks) * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewClient(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ParseLog(toGethLog(lg))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ParseLog(toGethLog(lg))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.BigToHash(big.NewInt(10))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(10)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ParseLog(toGethLog(lg))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(2)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(3)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ParseLog(toGethLog(lg))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(3)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(4)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ParseLog(toGethLog(lg))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ConfirmationDelay.Int64()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewClient(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.On("ConfiguredChainID")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Return(big.NewInt(1))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Run("report is on-chain", func(t *testing.T) { tp := newTopics() beaconAddress := newAddress(t) coordinatorAddress := newAddress(t) lggr := logger.TestLogger(t) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) assert.NoError(t, err) epoch := uint32(20) round := uint8(3) epochAndRound := toEpochAndRoundUint40(epoch, round) enrTopic := common.BytesToHash(common.LeftPadBytes(epochAndRound.Bytes(), 32)) lp := lp_mocks.NewLogPoller(t) configDigest := common.BigToHash(big.NewInt(1337)) log := newNewTransmissionLog(t, beaconAddress, configDigest) log.BlockNumber = 195 lp.On("IndexedLogs", mock.Anything, tp.newTransmissionTopic, beaconAddress, 2, []common.Hash{ enrTopic, }, evmtypes.Confirmations(1)).Return([]logpoller.Log{log}, nil) c := &coordinator{ lp: lp, onchainRouter: onchainRouter, lggr: logger.TestLogger(t), beaconAddress: beaconAddress, topics: tp, evmClient: evmClient, } present, err := c.ReportIsOnchain(testutils.Context(t), epoch, round, configDigest) assert.NoError(t, err) assert.True(t, present) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.BytesToHash(common.LeftPadBytes(epochAndRound.Bytes(), 32))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.LeftPadBytes(epochAndRound.Bytes(), 32)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewLogPoller(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.BigToHash(big.NewInt(1337))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(1337)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.On("IndexedLogs", mock.Anything, tp.newTransmissionTopic, beaconAddress, 2, []common.Hash{ enrTopic, }, evmtypes.Confirmations(1))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Confirmations(1)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Return([]logpoller.Log{log}, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ReportIsOnchain(testutils.Context(t), epoch, round, configDigest)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Run("report is on-chain for old config digest", func(t *testing.T) { tp := newTopics() beaconAddress := newAddress(t) coordinatorAddress := newAddress(t) lggr := logger.TestLogger(t) onchainRouter, err := newRouter(lggr, beaconAddress, coordinatorAddress, evmClient) assert.NoError(t, err) epoch := uint32(20) round := uint8(3) epochAndRound := toEpochAndRoundUint40(epoch, round) enrTopic := common.BytesToHash(common.LeftPadBytes(epochAndRound.Bytes(), 32)) lp := lp_mocks.NewLogPoller(t) oldConfigDigest := common.BigToHash(big.NewInt(1337)) newConfigDigest := common.BigToHash(big.NewInt(8888)) log := newNewTransmissionLog(t, beaconAddress, oldConfigDigest) log.BlockNumber = 195 lp.On("IndexedLogs", mock.Anything, tp.newTransmissionTopic, beaconAddress, 2, []common.Hash{ enrTopic, }, evmtypes.Confirmations(1)).Return([]logpoller.Log{log}, nil) c := &coordinator{ lp: lp, onchainRouter: onchainRouter, lggr: logger.TestLogger(t), beaconAddress: beaconAddress, topics: tp, evmClient: evmClient, } present, err := c.ReportIsOnchain(testutils.Context(t), epoch, round, newConfigDigest) assert.NoError(t, err) assert.False(t, present) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.BytesToHash(common.LeftPadBytes(epochAndRound.Bytes(), 32))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.LeftPadBytes(epochAndRound.Bytes(), 32)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewLogPoller(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.BigToHash(big.NewInt(1337))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(1337)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.BigToHash(big.NewInt(8888))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(8888)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.On("IndexedLogs", mock.Anything, tp.newTransmissionTopic, beaconAddress, 2, []common.Hash{ enrTopic, }, evmtypes.Confirmations(1))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Confirmations(1)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Return([]logpoller.Log{log}, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ReportIsOnchain(testutils.Context(t), epoch, round, newConfigDigest)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.BytesToHash(common.LeftPadBytes(epochAndRound.Bytes(), 32))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.LeftPadBytes(epochAndRound.Bytes(), 32)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewLogPoller(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.On("IndexedLogs", mock.Anything, tp.newTransmissionTopic, beaconAddress, 2, []common.Hash{ enrTopic, }, evmtypes.Confirmations(1))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Confirmations(1)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Return([]logpoller.Log{}, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.BigToHash(big.NewInt(0))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(0)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ReportIsOnchain(testutils.Context(t), epoch, round, configDigest)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Run("valid output", func(t *testing.T) { expected := [8]uint32{1, 2, 3, 4, 5, 6, 7, 8} ret := [8]*big.Int{} for i, delay := range expected { ret[i] = big.NewInt(int64(delay)) } onchainRouter := mocks.NewVRFBeaconCoordinator(t) onchainRouter. On("GetConfirmationDelays", mock.Anything). Return(ret, nil) c := &coordinator{ onchainRouter: onchainRouter, } confDelays, err := c.ConfirmationDelays(testutils.Context(t)) assert.NoError(t, err) assert.Equal(t, expected[:], confDelays[:]) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewInt(int64(delay))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewVRFBeaconCoordinator(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `. On("GetConfirmationDelays", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `. Return(ret, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ConfirmationDelays(testutils.Context(t))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewVRFBeaconCoordinator(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `. On("GetConfirmationDelays", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `. Return([8]*big.Int{}, errors.New("rpc error"))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.New("rpc error")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ConfirmationDelays(testutils.Context(t))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Run("valid output", func(t *testing.T) { var keyIDBytes [32]byte keyIDBytes[0] = 1 expected := dkg.KeyID(keyIDBytes) onchainRouter := mocks.NewVRFBeaconCoordinator(t) onchainRouter. On("SKeyID", mock.Anything). Return(keyIDBytes, nil) c := &coordinator{ onchainRouter: onchainRouter, } keyID, err := c.KeyID(testutils.Context(t)) assert.NoError(t, err) assert.Equal(t, expected[:], keyID[:]) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.KeyID(keyIDBytes)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewVRFBeaconCoordinator(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `. On("SKeyID", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `. Return(keyIDBytes, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.KeyID(testutils.Context(t))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.NewVRFBeaconCoordinator(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `. On("SKeyID", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `. Return(emptyBytes, errors.New("rpc error"))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.New("rpc error")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.KeyID(testutils.Context(t))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Topic()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Topic()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Run("valid binary", func(t *testing.T) { c := &coordinator{coordinatorConfig: newCoordinatorConfig(10), lggr: logger.TestLogger(t)} cacheEvictionWindowSeconds := int64(60) cacheEvictionWindow := time.Duration(cacheEvictionWindowSeconds * int64(time.Second)) c.toBeTransmittedBlocks = NewBlockCache[blockInReport](cacheEvictionWindow) c.toBeTransmittedCallbacks = NewBlockCache[callbackInReport](cacheEvictionWindow) newCoordinatorConfig := &ocr2vrftypes.CoordinatorConfig{ CacheEvictionWindowSeconds: 30, BatchGasLimit: 1_000_000, CoordinatorOverhead: 10_000, CallbackOverhead: 10_000, BlockGasOverhead: 10_000, LookbackBlocks: 1_000, } require.Equal(t, cacheEvictionWindow, c.toBeTransmittedBlocks.evictionWindow) require.Equal(t, cacheEvictionWindow, c.toBeTransmittedCallbacks.evictionWindow) expectedConfigDigest := ocr2Types.ConfigDigest(common.HexToHash("asd")) expectedOracleID := commontypes.OracleID(3) err := c.UpdateConfiguration(ocr2vrf.OffchainConfig(newCoordinatorConfig), expectedConfigDigest, expectedOracleID) newCacheEvictionWindow := time.Duration(newCoordinatorConfig.CacheEvictionWindowSeconds * int64(time.Second)) require.NoError(t, err) require.Equal(t, newCoordinatorConfig.CacheEvictionWindowSeconds, c.coordinatorConfig.CacheEvictionWindowSeconds) require.Equal(t, newCoordinatorConfig.BatchGasLimit, c.coordinatorConfig.BatchGasLimit) require.Equal(t, newCoordinatorConfig.CoordinatorOverhead, c.coordinatorConfig.CoordinatorOverhead) require.Equal(t, newCoordinatorConfig.CallbackOverhead, c.coordinatorConfig.CallbackOverhead) require.Equal(t, newCoordinatorConfig.BlockGasOverhead, c.coordinatorConfig.BlockGasOverhead) require.Equal(t, newCoordinatorConfig.LookbackBlocks, c.coordinatorConfig.LookbackBlocks) require.Equal(t, newCacheEvictionWindow, c.toBeTransmittedBlocks.evictionWindow) require.Equal(t, newCacheEvictionWindow, c.toBeTransmittedCallbacks.evictionWindow) require.Equal(t, expectedConfigDigest, c.configDigest) require.Equal(t, expectedOracleID, c.oracleID) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(cacheEvictionWindowSeconds * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.ConfigDigest(common.HexToHash("asd"))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.HexToHash("asd")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.OracleID(3)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.UpdateConfiguration(ocr2vrf.OffchainConfig(newCoordinatorConfig), expectedConfigDigest, expectedOracleID)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.OffchainConfig(newCoordinatorConfig)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.Duration(newCoordinatorConfig.CacheEvictionWindowSeconds * int64(time.Second))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.UpdateConfiguration([]byte{123}, ocr2Types.ConfigDigest{}, commontypes.OracleID(0))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.OracleID(0)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.String()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.String()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.String()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator_test.go: `.String()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `t.Run("Happy path, no overwrites.", func(t *testing.T) { now := time.Now().UTC() tests := []struct { Key common.Hash Value int }{ {Key: common.HexToHash("0x0"), Value: 1}, {Key: common.HexToHash("0x1"), Value: 2}, {Key: common.HexToHash("0x2"), Value: 3}, {Key: common.HexToHash("0x3"), Value: 4}, {Key: common.HexToHash("0x4"), Value: 5}, } c := NewBlockCache[int](100 * time.Second) // Populate cache with ordered items. for i, test := range tests { c.CacheItem(test.Value, test.Key, getSecondsAfterNow(now, i)) item := c.GetItem(test.Key) assert.Equal(t, test.Value, *item) } // Ensure cache has 5 items, with the newest and oldest pointers correct. assert.Equal(t, 5, len(c.cache), "cache should contain 5 keys") // Evict all items. evictionTime := getSecondsAfterNow(now, 105) c.EvictExpiredItems(evictionTime) assert.Equal(t, 0, len(c.cache), "cache should contain 0 keys") // Cache a new item. c.CacheItem(tests[0].Value, tests[0].Key, getSecondsAfterNow(now, 10)) item := c.GetItem(tests[0].Key) assert.Equal(t, tests[0].Value, *item) // Attempting a new eviction should have no effect. c.EvictExpiredItems(evictionTime) assert.Equal(t, 1, len(c.cache), "cache should contain 1 key") // Reduce eviction window. c.SetEvictonWindow(time.Second * 50) // Attempting a new eviction will remove the added item. c.EvictExpiredItems(evictionTime) assert.Equal(t, 0, len(c.cache), "cache should contain 0 keys") })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `c.CacheItem(test.Value, test.Key, getSecondsAfterNow(now, i))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `c.EvictExpiredItems(evictionTime)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `c.CacheItem(tests[0].Value, tests[0].Key, getSecondsAfterNow(now, 10))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `c.EvictExpiredItems(evictionTime)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `c.SetEvictonWindow(time.Second * 50)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `c.EvictExpiredItems(evictionTime)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `t.Run("Happy path, override middle item.", func(t *testing.T) { now := time.Now().UTC() tests := []struct { Key common.Hash Value int }{ {Key: common.HexToHash("0x0"), Value: 1}, {Key: common.HexToHash("0x1"), Value: 2}, {Key: common.HexToHash("0x2"), Value: 3}, {Key: common.HexToHash("0x3"), Value: 4}, {Key: common.HexToHash("0x1"), Value: 5}, } c := NewBlockCache[int](100 * time.Second) // Populate cache with items. for i, test := range tests { c.CacheItem(test.Value, test.Key, getSecondsAfterNow(now, i)) item := c.GetItem(test.Key) assert.Equal(t, test.Value, *item) } // Ensure cache has 4 items, with the newest and oldest pointers correct. assert.Equal(t, 4, len(c.cache), "cache should contain 4 keys") // Evict all but two items. c.EvictExpiredItems(getSecondsAfterNow(now, 103)) assert.Equal(t, 2, len(c.cache), "cache should contain 2 keys") // Evict all but one items. c.EvictExpiredItems(getSecondsAfterNow(now, 104)) assert.Equal(t, 1, len(c.cache), "cache should contain 1 keys") // Evict remaining item. c.EvictExpiredItems(getSecondsAfterNow(now, 105)) assert.Equal(t, 0, len(c.cache), "cache should contain 0 keys") })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `c.CacheItem(test.Value, test.Key, getSecondsAfterNow(now, i))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `c.EvictExpiredItems(getSecondsAfterNow(now, 103))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `c.EvictExpiredItems(getSecondsAfterNow(now, 104))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `c.EvictExpiredItems(getSecondsAfterNow(now, 105))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `c.CacheItem(test.Value, test.Key, getSecondsAfterNow(now, i))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `c.EvictExpiredItems(getSecondsAfterNow(now, 104))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `c.CacheItem(tests[1].Value, tests[1].Key, getSecondsAfterNow(now, 110))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `c.CacheItem(tests[0].Value, tests[0].Key, getSecondsAfterNow(now, 111))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `item = c.GetItem(tests[0].Key)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `c.CacheItem(tests[0].Value, tests[0].Key, getSecondsAfterNow(now, 112))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `item = c.GetItem(tests[0].Key)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.Run("Happy path, no overwrites.", func(t *testing.T) { now := time.Now().UTC() tests := []struct { Key common.Hash Value int }{ {Key: common.HexToHash("0x0"), Value: 1}, {Key: common.HexToHash("0x1"), Value: 2}, {Key: common.HexToHash("0x2"), Value: 3}, {Key: common.HexToHash("0x3"), Value: 4}, {Key: common.HexToHash("0x4"), Value: 5}, } c := NewBlockCache[int](100 * time.Second) // Populate cache with ordered items. for i, test := range tests { c.CacheItem(test.Value, test.Key, getSecondsAfterNow(now, i)) item := c.GetItem(test.Key) assert.Equal(t, test.Value, *item) } // Ensure cache has 5 items, with the newest and oldest pointers correct. assert.Equal(t, 5, len(c.cache), "cache should contain 5 keys") // Evict all items. evictionTime := getSecondsAfterNow(now, 105) c.EvictExpiredItems(evictionTime) assert.Equal(t, 0, len(c.cache), "cache should contain 0 keys") // Cache a new item. c.CacheItem(tests[0].Value, tests[0].Key, getSecondsAfterNow(now, 10)) item := c.GetItem(tests[0].Key) assert.Equal(t, tests[0].Value, *item) // Attempting a new eviction should have no effect. c.EvictExpiredItems(evictionTime) assert.Equal(t, 1, len(c.cache), "cache should contain 1 key") // Reduce eviction window. c.SetEvictonWindow(time.Second * 50) // Attempting a new eviction will remove the added item. c.EvictExpiredItems(evictionTime) assert.Equal(t, 0, len(c.cache), "cache should contain 0 keys") })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.Now()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.UTC()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.HexToHash("0x0")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.HexToHash("0x2")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.HexToHash("0x3")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.HexToHash("0x4")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.CacheItem(test.Value, test.Key, getSecondsAfterNow(now, i))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.GetItem(test.Key)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.EvictExpiredItems(evictionTime)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.CacheItem(tests[0].Value, tests[0].Key, getSecondsAfterNow(now, 10))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.GetItem(tests[0].Key)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.EvictExpiredItems(evictionTime)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.SetEvictonWindow(time.Second * 50)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.EvictExpiredItems(evictionTime)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.Run("Happy path, override middle item.", func(t *testing.T) { now := time.Now().UTC() tests := []struct { Key common.Hash Value int }{ {Key: common.HexToHash("0x0"), Value: 1}, {Key: common.HexToHash("0x1"), Value: 2}, {Key: common.HexToHash("0x2"), Value: 3}, {Key: common.HexToHash("0x3"), Value: 4}, {Key: common.HexToHash("0x1"), Value: 5}, } c := NewBlockCache[int](100 * time.Second) // Populate cache with items. for i, test := range tests { c.CacheItem(test.Value, test.Key, getSecondsAfterNow(now, i)) item := c.GetItem(test.Key) assert.Equal(t, test.Value, *item) } // Ensure cache has 4 items, with the newest and oldest pointers correct. assert.Equal(t, 4, len(c.cache), "cache should contain 4 keys") // Evict all but two items. c.EvictExpiredItems(getSecondsAfterNow(now, 103)) assert.Equal(t, 2, len(c.cache), "cache should contain 2 keys") // Evict all but one items. c.EvictExpiredItems(getSecondsAfterNow(now, 104)) assert.Equal(t, 1, len(c.cache), "cache should contain 1 keys") // Evict remaining item. c.EvictExpiredItems(getSecondsAfterNow(now, 105)) assert.Equal(t, 0, len(c.cache), "cache should contain 0 keys") })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.Now()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.UTC()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.HexToHash("0x0")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.HexToHash("0x2")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.HexToHash("0x3")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.CacheItem(test.Value, test.Key, getSecondsAfterNow(now, i))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.GetItem(test.Key)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.EvictExpiredItems(getSecondsAfterNow(now, 103))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.EvictExpiredItems(getSecondsAfterNow(now, 104))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.EvictExpiredItems(getSecondsAfterNow(now, 105))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.Now()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.UTC()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.HexToHash("0x0")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.HexToHash("0x1")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.HexToHash("0x2")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.HexToHash("0x3")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.HexToHash("0x0")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.CacheItem(test.Value, test.Key, getSecondsAfterNow(now, i))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.GetItem(test.Key)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.EvictExpiredItems(getSecondsAfterNow(now, 104))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.CacheItem(tests[1].Value, tests[1].Key, getSecondsAfterNow(now, 110))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.GetItem(tests[1].Key)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.CacheItem(tests[0].Value, tests[0].Key, getSecondsAfterNow(now, 111))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.GetItem(tests[0].Key)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.CacheItem(tests[0].Value, tests[0].Key, getSecondsAfterNow(now, 112))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/ocr_cache_test.go: `.GetItem(tests[0].Key)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `beacon.On("SProvingKeyHash", mock.Anything).Return(keyHash, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `beacon.On("SKeyID", mock.Anything).Return(keyID, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `coordinator.On("IBeaconPeriodBlocks", mock.Anything).Return(periodBlocks, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `coordinator.On("GetConfirmationDelays", mock.Anything).Return(confDelays, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `t.Run("parse beacon log", func(t *testing.T) { addr := newAddress(t) log := types.Log{ Address: addr, } parsedLog := vrf_beacon.VRFBeaconNewTransmission{} beacon := mocks.NewVRFBeaconInterface(t) router := vrfRouter{ beacon: beacon, } beacon.On("Address").Return(addr).Once() beacon.On("ParseLog", log).Return(parsedLog, nil).Once() result, err := router.ParseLog(log) assert.NoError(t, err) assert.Equal(t, result, parsedLog) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `beacon.On("Address").Return(addr).Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `beacon.On("ParseLog", log).Return(parsedLog, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `t.Run("parse coordinator log", func(t *testing.T) { addr := newAddress(t) log := types.Log{ Address: addr, } parsedLog := vrf_coordinator.VRFCoordinatorRandomnessRequested{} beacon := mocks.NewVRFBeaconInterface(t) coordinator := mocks.NewVRFCoordinatorInterface(t) router := vrfRouter{ beacon: beacon, coordinator: coordinator, } beacon.On("Address").Return(newAddress(t)).Once() coordinator.On("Address").Return(addr).Once() coordinator.On("ParseLog", log).Return(parsedLog, nil).Once() result, err := router.ParseLog(log) assert.NoError(t, err) assert.Equal(t, result, parsedLog) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `beacon.On("Address").Return(newAddress(t)).Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `coordinator.On("Address").Return(addr).Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `coordinator.On("ParseLog", log).Return(parsedLog, nil).Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `beacon.On("Address").Return(newAddress(t)).Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `coordinator.On("Address").Return(newAddress(t)).Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.NewVRFBeaconInterface(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.On("SProvingKeyHash", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.Return(keyHash, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.SProvingKeyHash(nilOpts)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.NewVRFBeaconInterface(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.On("SKeyID", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.Return(keyID, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.SKeyID(nilOpts)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.NewVRFCoordinatorInterface(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.NewInt(3)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.On("IBeaconPeriodBlocks", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.Return(periodBlocks, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.IBeaconPeriodBlocks(nilOpts)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.NewVRFCoordinatorInterface(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.NewInt(4)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.On("GetConfirmationDelays", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.Return(confDelays, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.GetConfirmationDelays(nilOpts)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.Run("parse beacon log", func(t *testing.T) { addr := newAddress(t) log := types.Log{ Address: addr, } parsedLog := vrf_beacon.VRFBeaconNewTransmission{} beacon := mocks.NewVRFBeaconInterface(t) router := vrfRouter{ beacon: beacon, } beacon.On("Address").Return(addr).Once() beacon.On("ParseLog", log).Return(parsedLog, nil).Once() result, err := router.ParseLog(log) assert.NoError(t, err) assert.Equal(t, result, parsedLog) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.NewVRFBeaconInterface(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.On("Address")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.Return(addr)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.On("ParseLog", log)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.Return(parsedLog, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.ParseLog(log)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.Run("parse coordinator log", func(t *testing.T) { addr := newAddress(t) log := types.Log{ Address: addr, } parsedLog := vrf_coordinator.VRFCoordinatorRandomnessRequested{} beacon := mocks.NewVRFBeaconInterface(t) coordinator := mocks.NewVRFCoordinatorInterface(t) router := vrfRouter{ beacon: beacon, coordinator: coordinator, } beacon.On("Address").Return(newAddress(t)).Once() coordinator.On("Address").Return(addr).Once() coordinator.On("ParseLog", log).Return(parsedLog, nil).Once() result, err := router.ParseLog(log) assert.NoError(t, err) assert.Equal(t, result, parsedLog) })` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.NewVRFBeaconInterface(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.NewVRFCoordinatorInterface(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.On("Address")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.Return(newAddress(t))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.On("Address")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.Return(addr)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.On("ParseLog", log)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.Return(parsedLog, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.ParseLog(log)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.NewVRFBeaconInterface(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.NewVRFCoordinatorInterface(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.On("Address")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.Return(newAddress(t))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.On("Address")` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.Return(newAddress(t))` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.Once()` $DIR/core/services/ocr2/plugins/ocr2vrf/coordinator/router_test.go: `.ParseLog(log)` $DIR/core/services/ocr2/plugins/ocr2vrf/internal/ocr2vrf_integration_test.go: `testutils.SkipFlakey(t, "https://smartcontract-it.atlassian.net/browse/VRF-688")` $DIR/core/services/ocr2/plugins/ocr2vrf/internal/ocr2vrf_integration_test.go: `testutils.SkipFlakey(t, "https://smartcontract-it.atlassian.net/browse/VRF-688")` $DIR/core/services/ocr2/plugins/ocr2vrf/internal/ocr2vrf_integration_test.go: `.SkipFlakey(t, "https://smartcontract-it.atlassian.net/browse/VRF-688")` $DIR/core/services/ocr2/plugins/ocr2vrf/internal/ocr2vrf_integration_test.go: `.SkipFlakey(t, "https://smartcontract-it.atlassian.net/browse/VRF-688")` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `t.Run("returns juels per fee coin", func(t *testing.T) { mockAggregator := mocks.NewAggregatorV3Interface(t) latestRoundData := aggregator_v3_interface.LatestRoundData{Answer: big.NewInt(10000)} mockAggregator.On("LatestRoundData", mock.Anything).Return(latestRoundData, nil) // Start linkEthPriceProvider. provider := &linkEthPriceProvider{ aggregator: mockAggregator, timeout: time.Second / 2, interval: time.Second, stop: make(chan struct{}), currentJuelsPerFeeCoin: big.NewInt(0), lggr: logger.TestLogger(t), } go provider.run() t.Cleanup(func() { close(provider.stop) }) // Assert correct initial price. price, err := provider.JuelsPerFeeCoin() require.NoError(t, err) assert.Equal(t, int64(0), price.Int64()) // Wait until the price is updated. time.Sleep(2 * time.Second) // Ensure the correct price is returned. price, err = provider.JuelsPerFeeCoin() require.NoError(t, err) assert.Equal(t, int64(10000), price.Int64()) })` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `mockAggregator.On("LatestRoundData", mock.Anything).Return(latestRoundData, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `go provider.run()` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `t.Cleanup(func() { close(provider.stop) })` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `close(provider.stop)` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `time.Sleep(2 * time.Second)` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `price, err = provider.JuelsPerFeeCoin()` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `t.Run("returns juels per fee coin (error updating)", func(t *testing.T) { mockAggregator := mocks.NewAggregatorV3Interface(t) mockAggregator.On("LatestRoundData", mock.Anything).Return(aggregator_v3_interface.LatestRoundData{}, errors.New("could not fetch")) // Start linkEthPriceProvider. provider := &linkEthPriceProvider{ aggregator: mockAggregator, timeout: time.Second / 2, interval: time.Second, stop: make(chan struct{}), currentJuelsPerFeeCoin: big.NewInt(0), lggr: logger.TestLogger(t), } go provider.run() t.Cleanup(func() { close(provider.stop) }) // Assert correct initial price. price, err := provider.JuelsPerFeeCoin() require.NoError(t, err) assert.Equal(t, int64(0), price.Int64()) // Wait until the price is updated. time.Sleep(2 * time.Second) // Ensure the correct price is returned. price, err = provider.JuelsPerFeeCoin() require.NoError(t, err) assert.Equal(t, int64(0), price.Int64()) })` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `mockAggregator.On("LatestRoundData", mock.Anything).Return(aggregator_v3_interface.LatestRoundData{}, errors.New("could not fetch"))` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `go provider.run()` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `t.Cleanup(func() { close(provider.stop) })` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `close(provider.stop)` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `time.Sleep(2 * time.Second)` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `price, err = provider.JuelsPerFeeCoin()` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `.Run("returns juels per fee coin", func(t *testing.T) { mockAggregator := mocks.NewAggregatorV3Interface(t) latestRoundData := aggregator_v3_interface.LatestRoundData{Answer: big.NewInt(10000)} mockAggregator.On("LatestRoundData", mock.Anything).Return(latestRoundData, nil) // Start linkEthPriceProvider. provider := &linkEthPriceProvider{ aggregator: mockAggregator, timeout: time.Second / 2, interval: time.Second, stop: make(chan struct{}), currentJuelsPerFeeCoin: big.NewInt(0), lggr: logger.TestLogger(t), } go provider.run() t.Cleanup(func() { close(provider.stop) }) // Assert correct initial price. price, err := provider.JuelsPerFeeCoin() require.NoError(t, err) assert.Equal(t, int64(0), price.Int64()) // Wait until the price is updated. time.Sleep(2 * time.Second) // Ensure the correct price is returned. price, err = provider.JuelsPerFeeCoin() require.NoError(t, err) assert.Equal(t, int64(10000), price.Int64()) })` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `.NewAggregatorV3Interface(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `.NewInt(10000)` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `.On("LatestRoundData", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `.Return(latestRoundData, nil)` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `.NewInt(0)` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `.run()` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `.Cleanup(func() { close(provider.stop) })` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `.JuelsPerFeeCoin()` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `.Sleep(2 * time.Second)` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `.JuelsPerFeeCoin()` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `.Run("returns juels per fee coin (error updating)", func(t *testing.T) { mockAggregator := mocks.NewAggregatorV3Interface(t) mockAggregator.On("LatestRoundData", mock.Anything).Return(aggregator_v3_interface.LatestRoundData{}, errors.New("could not fetch")) // Start linkEthPriceProvider. provider := &linkEthPriceProvider{ aggregator: mockAggregator, timeout: time.Second / 2, interval: time.Second, stop: make(chan struct{}), currentJuelsPerFeeCoin: big.NewInt(0), lggr: logger.TestLogger(t), } go provider.run() t.Cleanup(func() { close(provider.stop) }) // Assert correct initial price. price, err := provider.JuelsPerFeeCoin() require.NoError(t, err) assert.Equal(t, int64(0), price.Int64()) // Wait until the price is updated. time.Sleep(2 * time.Second) // Ensure the correct price is returned. price, err = provider.JuelsPerFeeCoin() require.NoError(t, err) assert.Equal(t, int64(0), price.Int64()) })` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `.NewAggregatorV3Interface(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `.On("LatestRoundData", mock.Anything)` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `.Return(aggregator_v3_interface.LatestRoundData{}, errors.New("could not fetch"))` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `.New("could not fetch")` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `.NewInt(0)` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `.run()` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `.Cleanup(func() { close(provider.stop) })` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `.JuelsPerFeeCoin()` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `.Sleep(2 * time.Second)` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `.JuelsPerFeeCoin()` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `.NewClient(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/juelsfeecoin/link_eth_price_provider_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/ocr2vrf/reasonablegasprice/reasonable_gas_price_test.go: `.GWei(100)` $DIR/core/services/ocr2/plugins/ocr2vrf/reasonablegasprice/reasonable_gas_price_test.go: `.ReasonableGasPrice()` $DIR/core/services/ocr2/plugins/ocr2vrf/reportserializer/report_serializer_test.go: `.NewReportSerializer(altbn128Suite.G1())` $DIR/core/services/ocr2/plugins/ocr2vrf/reportserializer/report_serializer_test.go: `.G1()` $DIR/core/services/ocr2/plugins/ocr2vrf/reportserializer/report_serializer_test.go: `.NewInt(10)` $DIR/core/services/ocr2/plugins/ocr2vrf/reportserializer/report_serializer_test.go: `.HexToHash("0x002")` $DIR/core/services/ocr2/plugins/ocr2vrf/reportserializer/report_serializer_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/ocr2vrf/reportserializer/report_serializer_test.go: `.HexToAddress("0x03")` $DIR/core/services/ocr2/plugins/ocr2vrf/reportserializer/report_serializer_test.go: `.NewInt(5)` $DIR/core/services/ocr2/plugins/ocr2vrf/reportserializer/report_serializer_test.go: `.NewInt(6)` $DIR/core/services/ocr2/plugins/ocr2vrf/reportserializer/report_serializer_test.go: `.NewInt(7)` $DIR/core/services/ocr2/plugins/ocr2vrf/reportserializer/report_serializer_test.go: `.NewInt(0)` $DIR/core/services/ocr2/plugins/ocr2vrf/reportserializer/report_serializer_test.go: `.NewInt(0)` $DIR/core/services/ocr2/plugins/ocr2vrf/reportserializer/report_serializer_test.go: `.SerializeReport(unserializedReport)` $DIR/core/services/ocr2/plugins/ocr2vrf/reportserializer/report_serializer_test.go: `.ReportLength(unserializedReport)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `promPlugin = New(reportingPlugin, "test-2", "EVM", big.NewInt(1), types.ReportingPluginConfig{}, backend)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `backend.On("SetQueryDuration", mock.Anything, mock.Anything).Run(func(args mock.Arguments) { labelValues := args[0].([]string) duration := time.Duration(args[1].(float64)) assertCorrectLabelValues(labelValues) require.Greater(t, duration, qDuration) require.Less(t, duration, oDuration) }).Return()` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `assertCorrectLabelValues(labelValues)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `backend.On("SetObservationDuration", mock.Anything, mock.Anything).Run(func(args mock.Arguments) { labelValues := args[0].([]string) duration := time.Duration(args[1].(float64)) assertCorrectLabelValues(labelValues) require.Greater(t, duration, oDuration) require.Less(t, duration, rDuration) }).Return()` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `assertCorrectLabelValues(labelValues)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `backend.On("SetReportDuration", mock.Anything, mock.Anything).Run(func(args mock.Arguments) { labelValues := args[0].([]string) duration := time.Duration(args[1].(float64)) assertCorrectLabelValues(labelValues) require.Greater(t, duration, rDuration) require.Less(t, duration, aDuration) }).Return()` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `assertCorrectLabelValues(labelValues)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `backend.On("SetShouldAcceptFinalizedReportDuration", mock.Anything, mock.Anything).Run(func(args mock.Arguments) { labelValues := args[0].([]string) duration := time.Duration(args[1].(float64)) assertCorrectLabelValues(labelValues) require.Greater(t, duration, aDuration) require.Less(t, duration, tDuration) }).Return()` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `assertCorrectLabelValues(labelValues)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `backend.On("SetShouldTransmitAcceptedReportDuration", mock.Anything, mock.Anything).Run(func(args mock.Arguments) { labelValues := args[0].([]string) duration := time.Duration(args[1].(float64)) assertCorrectLabelValues(labelValues) require.Greater(t, duration, tDuration) require.Less(t, duration, cDuration) }).Return()` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `assertCorrectLabelValues(labelValues)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `backend.On("SetQueryToObservationLatency", mock.Anything, mock.Anything).Run(func(args mock.Arguments) { labelValues := args[0].([]string) latency := time.Duration(args[1].(float64)) assertCorrectLabelValues(labelValues) require.Greater(t, latency, qToOLatency) require.Less(t, latency, oToRLatency) }).Return()` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `assertCorrectLabelValues(labelValues)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `backend.On("SetObservationToReportLatency", mock.Anything, mock.Anything).Run(func(args mock.Arguments) { labelValues := args[0].([]string) latency := time.Duration(args[1].(float64)) assertCorrectLabelValues(labelValues) require.Greater(t, latency, oToRLatency) require.Less(t, latency, rToALatency) }).Return()` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `assertCorrectLabelValues(labelValues)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `backend.On("SetReportToAcceptFinalizedReportLatency", mock.Anything, mock.Anything).Run(func(args mock.Arguments) { labelValues := args[0].([]string) latency := time.Duration(args[1].(float64)) assertCorrectLabelValues(labelValues) require.Greater(t, latency, rToALatency) require.Less(t, latency, aToTLatency) }).Return()` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `assertCorrectLabelValues(labelValues)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `backend.On("SetAcceptFinalizedReportToTransmitAcceptedReportLatency", mock.Anything, mock.Anything).Run(func(args mock.Arguments) { labelValues := args[0].([]string) latency := time.Duration(args[1].(float64)) assertCorrectLabelValues(labelValues) require.Greater(t, latency, aToTLatency) require.Less(t, latency, cDuration) }).Return()` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `assertCorrectLabelValues(labelValues)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `backend.On("SetCloseDuration", mock.Anything, mock.Anything).Run(func(args mock.Arguments) { labelValues := args[0].([]string) latency := time.Duration(args[1].(float64)) require.Equal( t, []string{ "EVM", "1", "test-plugin", "0", common.Bytes2Hex(configDigest[:]), }, labelValues) require.Greater(t, latency, cDuration) require.Less(t, latency, ceiling) }).Return()` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `time.Sleep(qToOLatency)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `_, err = promPlugin.Observation(ctx, reportTimestamp, nil)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `_, ok = promPlugin.queryEndTimes.Load(reportTimestamp)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `_, ok = promPlugin.observationEndTimes.Load(reportTimestamp)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `time.Sleep(oToRLatency)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `_, _, err = promPlugin.Report(ctx, reportTimestamp, nil, nil)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `_, ok = promPlugin.observationEndTimes.Load(reportTimestamp)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `_, ok = promPlugin.reportEndTimes.Load(reportTimestamp)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `time.Sleep(rToALatency)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `_, err = promPlugin.ShouldAcceptFinalizedReport(ctx, reportTimestamp, nil)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `_, ok = promPlugin.reportEndTimes.Load(reportTimestamp)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `_, ok = promPlugin.acceptFinalizedReportEndTimes.Load(reportTimestamp)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `time.Sleep(aToTLatency)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `_, err = promPlugin.ShouldTransmitAcceptedReport(ctx, reportTimestamp, nil)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `_, ok = promPlugin.acceptFinalizedReportEndTimes.Load(reportTimestamp)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `err = promPlugin.Close()` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.NewPrometheusBackend(t)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.BytesToHash(crypto.Keccak256([]byte("foobar")))` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Keccak256([]byte("foobar"))` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.ConfigDigest(configDigest)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.NewPrometheusBackend(t)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.On("SetQueryDuration", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Run(func(args mock.Arguments) { labelValues := args[0].([]string) duration := time.Duration(args[1].(float64)) assertCorrectLabelValues(labelValues) require.Greater(t, duration, qDuration) require.Less(t, duration, oDuration) })` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Duration(args[1].(float64))` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Return()` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.On("SetObservationDuration", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Run(func(args mock.Arguments) { labelValues := args[0].([]string) duration := time.Duration(args[1].(float64)) assertCorrectLabelValues(labelValues) require.Greater(t, duration, oDuration) require.Less(t, duration, rDuration) })` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Duration(args[1].(float64))` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Return()` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.On("SetReportDuration", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Run(func(args mock.Arguments) { labelValues := args[0].([]string) duration := time.Duration(args[1].(float64)) assertCorrectLabelValues(labelValues) require.Greater(t, duration, rDuration) require.Less(t, duration, aDuration) })` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Duration(args[1].(float64))` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Return()` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.On("SetShouldAcceptFinalizedReportDuration", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Run(func(args mock.Arguments) { labelValues := args[0].([]string) duration := time.Duration(args[1].(float64)) assertCorrectLabelValues(labelValues) require.Greater(t, duration, aDuration) require.Less(t, duration, tDuration) })` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Duration(args[1].(float64))` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Return()` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.On("SetShouldTransmitAcceptedReportDuration", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Run(func(args mock.Arguments) { labelValues := args[0].([]string) duration := time.Duration(args[1].(float64)) assertCorrectLabelValues(labelValues) require.Greater(t, duration, tDuration) require.Less(t, duration, cDuration) })` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Duration(args[1].(float64))` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Return()` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.On("SetQueryToObservationLatency", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Run(func(args mock.Arguments) { labelValues := args[0].([]string) latency := time.Duration(args[1].(float64)) assertCorrectLabelValues(labelValues) require.Greater(t, latency, qToOLatency) require.Less(t, latency, oToRLatency) })` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Duration(args[1].(float64))` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Return()` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.On("SetObservationToReportLatency", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Run(func(args mock.Arguments) { labelValues := args[0].([]string) latency := time.Duration(args[1].(float64)) assertCorrectLabelValues(labelValues) require.Greater(t, latency, oToRLatency) require.Less(t, latency, rToALatency) })` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Duration(args[1].(float64))` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Return()` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.On("SetReportToAcceptFinalizedReportLatency", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Run(func(args mock.Arguments) { labelValues := args[0].([]string) latency := time.Duration(args[1].(float64)) assertCorrectLabelValues(labelValues) require.Greater(t, latency, rToALatency) require.Less(t, latency, aToTLatency) })` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Duration(args[1].(float64))` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Return()` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.On("SetAcceptFinalizedReportToTransmitAcceptedReportLatency", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Run(func(args mock.Arguments) { labelValues := args[0].([]string) latency := time.Duration(args[1].(float64)) assertCorrectLabelValues(labelValues) require.Greater(t, latency, aToTLatency) require.Less(t, latency, cDuration) })` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Duration(args[1].(float64))` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Return()` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.On("SetCloseDuration", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Run(func(args mock.Arguments) { labelValues := args[0].([]string) latency := time.Duration(args[1].(float64)) require.Equal( t, []string{ "EVM", "1", "test-plugin", "0", common.Bytes2Hex(configDigest[:]), }, labelValues) require.Greater(t, latency, cDuration) require.Less(t, latency, ceiling) })` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Duration(args[1].(float64))` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Return()` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.NewInt(1)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Query(ctx, reportTimestamp)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.queryEndTimes.Load(reportTimestamp)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Sleep(qToOLatency)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Observation(ctx, reportTimestamp, nil)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.queryEndTimes.Load(reportTimestamp)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.observationEndTimes.Load(reportTimestamp)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Sleep(oToRLatency)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Report(ctx, reportTimestamp, nil, nil)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.observationEndTimes.Load(reportTimestamp)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.reportEndTimes.Load(reportTimestamp)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Sleep(rToALatency)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.ShouldAcceptFinalizedReport(ctx, reportTimestamp, nil)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.reportEndTimes.Load(reportTimestamp)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.acceptFinalizedReportEndTimes.Load(reportTimestamp)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.Sleep(aToTLatency)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.ShouldTransmitAcceptedReport(ctx, reportTimestamp, nil)` $DIR/core/services/ocr2/plugins/promwrapper/plugin_test.go: `.acceptFinalizedReportEndTimes.Load(reportTimestamp)` $DIR/core/services/ocr2/plugins/s4/factory_test.go: `.NewOCRWrapper(logger.TestLogger(t), true, func(msg string) {})` $DIR/core/services/ocr2/plugins/s4/factory_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/s4/factory_test.go: `.NewORM(t)` $DIR/core/services/ocr2/plugins/s4/factory_test.go: `.NewReportingPlugin(rpConfig)` $DIR/core/services/ocr2/plugins/s4/factory_test.go: `.New("some error")` $DIR/core/services/ocr2/plugins/s4/factory_test.go: `.NewReportingPlugin(rpConfig)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `checkNoErrors(t, errors)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `checkNoUnconfirmedRows(ctx, t, don.orms[i], 10)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `checkNoErrors(t, errors)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `checkNoUnconfirmedRows(ctx, t, don.orms[i], 10)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `rows[0].Signature = rows[1].Signature` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `checkNoErrors(t, errors)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `config.MaxObservationEntries = 5` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `checkNoErrors(t, errors)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `config.MaxObservationEntries = 5` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `time.Sleep(testutils.TestInterval)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `checkNoErrors(t, errors)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `config.NSnapshotShards = 4` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `checkNoErrors(t, errors)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `checkNoUnconfirmedRows(ctx, t, don.orms[i], 1000)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `checkNoErrors(t, errors)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `users[i] = user{pk, big.New(addr.Big())}` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `row.Signature = sig` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `err = don.orms[o].Update(ctx, row)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `checkNoErrors(t, errors)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `checkNoUnconfirmedRows(ctx, t, don.orms[0], 1000)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `checkNoUnconfirmedRows(ctx, t, don.orms[i], 1000)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.Update(ctx, row)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.GetSnapshot(ctx, s4_svc.NewFullAddressRange())` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.NewFullAddressRange()` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.simulateOCR(ctx, 1)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.GetSnapshot(ctx, s4_svc.NewFullAddressRange())` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.NewFullAddressRange()` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.Update(ctx, row)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.simulateOCR(ctx, 1)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.GetSnapshot(ctx, s4_svc.NewFullAddressRange())` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.NewFullAddressRange()` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.GetSnapshot(ctx, s4_svc.NewFullAddressRange())` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.NewFullAddressRange()` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.Update(ctx, row)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.GetSnapshot(ctx, s4_svc.NewFullAddressRange())` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.NewFullAddressRange()` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.Address.Cmp(rows[0].Address)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.simulateOCR(ctx, 1)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.GetSnapshot(ctx, s4_svc.NewFullAddressRange())` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.NewFullAddressRange()` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.GetUnconfirmedRows(ctx, 10)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.Update(ctx, row)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.GetSnapshot(ctx, s4_svc.NewFullAddressRange())` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.NewFullAddressRange()` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.simulateOCR(ctx, 2)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.GetSnapshot(ctx, s4_svc.NewFullAddressRange())` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.NewFullAddressRange()` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.Update(ctx, row)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.Sleep(testutils.TestInterval)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.simulateOCR(ctx, 1)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.GetSnapshot(ctx, s4_svc.NewFullAddressRange())` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.NewFullAddressRange()` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.Update(ctx, row)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.GetSnapshot(ctx, s4_svc.NewFullAddressRange())` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.NewFullAddressRange()` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.simulateOCR(ctx, 1)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.GetSnapshot(ctx, s4_svc.NewFullAddressRange())` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.NewFullAddressRange()` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.Update(ctx, row)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.simulateOCR(ctx, 4)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.GetSnapshot(ctx, s4_svc.NewFullAddressRange())` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.NewFullAddressRange()` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.GetSnapshot(ctx, s4_svc.NewFullAddressRange())` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.NewFullAddressRange()` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.NewPrivateKeyAndAddress(t)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.New(addr.Big())` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.Big()` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.Intn(don.size)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.Intn(2)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.Now()` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.UTC()` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.Add(time.Minute)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.UnixMilli()` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.MustRandomBytes(t, 64)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.BytesToAddress(user.address.Bytes())` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.address.Bytes()` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.Sign(user.privateKey)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.Update(ctx, row)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.simulateOCR(ctx, 4)` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.GetSnapshot(ctx, s4_svc.NewFullAddressRange())` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.NewFullAddressRange()` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.GetSnapshot(ctx, s4_svc.NewFullAddressRange())` $DIR/core/services/ocr2/plugins/s4/integration_test.go: `.NewFullAddressRange()` $DIR/core/services/ocr2/plugins/s4/messages_test.go: `snapshot[i] = &s4.SnapshotRow{ Address: v.Address.Bytes(), Slotid: uint32(v.SlotId), Version: v.Version, }` $DIR/core/services/ocr2/plugins/s4/messages_test.go: `rows[1].Signature[0] = ^rows[1].Signature[0]` $DIR/core/services/ocr2/plugins/s4/messages_test.go: `err = rows[1].VerifySignature()` $DIR/core/services/ocr2/plugins/s4/messages_test.go: `t.Run("address with leading zeros", func(t *testing.T) { pk, addr := testutils.NewPrivateKeyAndAddress(t) for addr[0] != 0 { pk, addr = testutils.NewPrivateKeyAndAddress(t) } row := generateTestRows(t, 1, time.Minute)[0] row.Address = addr.Big().Bytes() signRow(t, row, addr, pk) require.NoError(t, row.VerifySignature()) sameRow := marshalUnmarshal(t, row) require.NoError(t, sameRow.VerifySignature()) })` $DIR/core/services/ocr2/plugins/s4/messages_test.go: `pk, addr = testutils.NewPrivateKeyAndAddress(t)` $DIR/core/services/ocr2/plugins/s4/messages_test.go: `row.Address = addr.Big().Bytes()` $DIR/core/services/ocr2/plugins/s4/messages_test.go: `signRow(t, row, addr, pk)` $DIR/core/services/ocr2/plugins/s4/messages_test.go: `row.Payload = []byte{}` $DIR/core/services/ocr2/plugins/s4/messages_test.go: `row.Address = addr.Big().Bytes()` $DIR/core/services/ocr2/plugins/s4/messages_test.go: `signRow(t, row, addr, pk)` $DIR/core/services/ocr2/plugins/s4/messages_test.go: `.MarshalRows(rows)` $DIR/core/services/ocr2/plugins/s4/messages_test.go: `.UnmarshalRows(data)` $DIR/core/services/ocr2/plugins/s4/messages_test.go: `.MarshalRows(rr)` $DIR/core/services/ocr2/plugins/s4/messages_test.go: `.Address.Bytes()` $DIR/core/services/ocr2/plugins/s4/messages_test.go: `.NewFullAddressRange()` $DIR/core/services/ocr2/plugins/s4/messages_test.go: `.MarshalQuery(snapshot, addressRange)` $DIR/core/services/ocr2/plugins/s4/messages_test.go: `.UnmarshalQuery(data)` $DIR/core/services/ocr2/plugins/s4/messages_test.go: `.VerifySignature()` $DIR/core/services/ocr2/plugins/s4/messages_test.go: `.VerifySignature()` $DIR/core/services/ocr2/plugins/s4/messages_test.go: `.Run("address with leading zeros", func(t *testing.T) { pk, addr := testutils.NewPrivateKeyAndAddress(t) for addr[0] != 0 { pk, addr = testutils.NewPrivateKeyAndAddress(t) } row := generateTestRows(t, 1, time.Minute)[0] row.Address = addr.Big().Bytes() signRow(t, row, addr, pk) require.NoError(t, row.VerifySignature()) sameRow := marshalUnmarshal(t, row) require.NoError(t, sameRow.VerifySignature()) })` $DIR/core/services/ocr2/plugins/s4/messages_test.go: `.NewPrivateKeyAndAddress(t)` $DIR/core/services/ocr2/plugins/s4/messages_test.go: `.NewPrivateKeyAndAddress(t)` $DIR/core/services/ocr2/plugins/s4/messages_test.go: `.Big()` $DIR/core/services/ocr2/plugins/s4/messages_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/s4/messages_test.go: `.NewPrivateKeyAndAddress(t)` $DIR/core/services/ocr2/plugins/s4/messages_test.go: `.Big()` $DIR/core/services/ocr2/plugins/s4/messages_test.go: `.Bytes()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `t.Run("ErrInvalidIntervals", func(t *testing.T) { config := createPluginConfig(1) config.NSnapshotShards = 0 _, err := s4.NewReportingPlugin(logger, config, orm) assert.ErrorIs(t, err, s4_svc.ErrInvalidIntervals) })` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `config.NSnapshotShards = 0` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `t.Run("MaxObservationEntries is zero", func(t *testing.T) { config := createPluginConfig(1) config.MaxObservationEntries = 0 _, err := s4.NewReportingPlugin(logger, config, orm) assert.ErrorContains(t, err, "max number of observation entries cannot be zero") })` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `config.MaxObservationEntries = 0` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `t.Run("MaxReportEntries is zero", func(t *testing.T) { config := createPluginConfig(1) config.MaxReportEntries = 0 _, err := s4.NewReportingPlugin(logger, config, orm) assert.ErrorContains(t, err, "max number of report entries cannot be zero") })` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `config.MaxReportEntries = 0` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `t.Run("MaxDeleteExpiredEntries is zero", func(t *testing.T) { config := createPluginConfig(1) config.MaxDeleteExpiredEntries = 0 _, err := s4.NewReportingPlugin(logger, config, orm) assert.ErrorContains(t, err, "max number of delete expired entries cannot be zero") })` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `config.MaxDeleteExpiredEntries = 0` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `err = plugin.Close()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `t.Run("happy", func(t *testing.T) { ormRows := make([]*s4_svc.Row, 0) rows := generateTestRows(t, 10, time.Minute) orm.On("Update", mock.Anything, mock.Anything).Run(func(args mock.Arguments) { updateRow := args.Get(1).(*s4_svc.Row) ormRows = append(ormRows, updateRow) }).Return(nil).Times(10) report, err := proto.Marshal(&s4.Rows{ Rows: rows, }) assert.NoError(t, err) should, err := plugin.ShouldAcceptFinalizedReport(testutils.Context(t), types.ReportTimestamp{}, report) assert.NoError(t, err) assert.False(t, should) assert.Equal(t, 10, len(ormRows)) compareRows(t, rows, ormRows) })` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `orm.On("Update", mock.Anything, mock.Anything).Run(func(args mock.Arguments) { updateRow := args.Get(1).(*s4_svc.Row) ormRows = append(ormRows, updateRow) }).Return(nil).Times(10)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `ormRows = append(ormRows, updateRow)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `compareRows(t, rows, ormRows)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `t.Run("error", func(t *testing.T) { testErr := errors.New("some error") rows := generateTestRows(t, 1, time.Minute) orm.On("Update", mock.Anything, mock.Anything).Return(testErr).Once() report, err := proto.Marshal(&s4.Rows{ Rows: rows, }) assert.NoError(t, err) should, err := plugin.ShouldAcceptFinalizedReport(testutils.Context(t), types.ReportTimestamp{}, report) assert.NoError(t, err) // errors just logged assert.False(t, should) })` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `orm.On("Update", mock.Anything, mock.Anything).Return(testErr).Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `t.Run("happy", func(t *testing.T) { ormRows := generateTestOrmRows(t, 10, time.Minute) rows := rowsToShapshotRows(ormRows) orm.On("GetSnapshot", mock.Anything, mock.Anything).Return(rows, nil).Once() queryBytes, err := plugin.Query(testutils.Context(t), types.ReportTimestamp{}) assert.NoError(t, err) query := &s4.Query{} err = proto.Unmarshal(queryBytes, query) assert.NoError(t, err) assert.Equal(t, s4_svc.MinAddress, s4.UnmarshalAddress(query.AddressRange.MinAddress)) assert.Equal(t, s4_svc.MaxAddress, s4.UnmarshalAddress(query.AddressRange.MaxAddress)) compareSnapshotRows(t, query.Rows, rows) })` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `orm.On("GetSnapshot", mock.Anything, mock.Anything).Return(rows, nil).Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `err = proto.Unmarshal(queryBytes, query)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `compareSnapshotRows(t, query.Rows, rows)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `t.Run("empty", func(t *testing.T) { empty := make([]*s4_svc.SnapshotRow, 0) orm.On("GetSnapshot", mock.Anything, mock.Anything).Return(empty, nil).Once() query, err := plugin.Query(testutils.Context(t), types.ReportTimestamp{}) assert.NoError(t, err) assert.NotNil(t, query) })` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `orm.On("GetSnapshot", mock.Anything, mock.Anything).Return(empty, nil).Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `config.NSnapshotShards = 16` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `thisAddress[0] = byte(i)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `ormRows[i].Address = big.New(thisAddress.Big())` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `from = 0` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `to = 16` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `orm.On("GetSnapshot", mock.Anything, mock.Anything).Return(versions[from:to], nil).Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `err = proto.Unmarshal(query, qq)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `ar.Advance()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `t.Run("all unconfirmed", func(t *testing.T) { ormRows := generateTestOrmRows(t, int(config.MaxObservationEntries), time.Minute) for _, or := range ormRows { or.Confirmed = false } orm.On("DeleteExpired", mock.Anything, uint(10), mock.Anything, mock.Anything).Return(int64(10), nil).Once() orm.On("GetUnconfirmedRows", mock.Anything, config.MaxObservationEntries).Return(ormRows, nil).Once() observation, err := plugin.Observation(testutils.Context(t), types.ReportTimestamp{}, []byte{}) assert.NoError(t, err) rows := &s4.Rows{} err = proto.Unmarshal(observation, rows) assert.NoError(t, err) assert.Len(t, rows.Rows, int(config.MaxObservationEntries)) })` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `or.Confirmed = false` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `orm.On("DeleteExpired", mock.Anything, uint(10), mock.Anything, mock.Anything).Return(int64(10), nil).Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `orm.On("GetUnconfirmedRows", mock.Anything, config.MaxObservationEntries).Return(ormRows, nil).Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `err = proto.Unmarshal(observation, rows)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `t.Run("unconfirmed with query", func(t *testing.T) { numUnconfirmed := int(config.MaxObservationEntries / 2) ormRows := generateTestOrmRows(t, int(config.MaxObservationEntries), time.Minute) snapshot := make([]*s4_svc.SnapshotRow, len(ormRows)) for i, or := range ormRows { or.Confirmed = i < numUnconfirmed // First half are confirmed or.Version = uint64(i) snapshot[i] = &s4_svc.SnapshotRow{ Address: or.Address, SlotId: or.SlotId, Version: or.Version, Confirmed: or.Confirmed, } } orm.On("DeleteExpired", mock.Anything, uint(10), mock.Anything, mock.Anything).Return(int64(10), nil).Once() orm.On("GetUnconfirmedRows", mock.Anything, config.MaxObservationEntries).Return(ormRows[numUnconfirmed:], nil).Once() orm.On("GetSnapshot", mock.Anything, mock.Anything).Return(snapshot, nil).Once() snapshotRows := rowsToShapshotRows(ormRows) query := &s4.Query{ Rows: make([]*s4.SnapshotRow, len(snapshotRows)), } numHigherVersion := 2 for i, v := range snapshotRows { query.Rows[i] = &s4.SnapshotRow{ Address: v.Address.Bytes(), Slotid: uint32(v.SlotId), Version: v.Version, } if i < numHigherVersion { ormRows[i].Version++ snapshot[i].Version++ orm.On("Get", mock.Anything, v.Address, v.SlotId).Return(ormRows[i], nil).Once() } } queryBytes, err := proto.Marshal(query) assert.NoError(t, err) observation, err := plugin.Observation(testutils.Context(t), types.ReportTimestamp{}, queryBytes) assert.NoError(t, err) rows := &s4.Rows{} err = proto.Unmarshal(observation, rows) assert.NoError(t, err) assert.Len(t, rows.Rows, numUnconfirmed+numHigherVersion) for i := 0; i < numUnconfirmed; i++ { assert.Equal(t, ormRows[numUnconfirmed+i].Version, rows.Rows[i].Version) } for i := 0; i < numHigherVersion; i++ { assert.Equal(t, ormRows[i].Version, rows.Rows[numUnconfirmed+i].Version) } })` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `or.Confirmed = i < numUnconfirmed` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `or.Version = uint64(i)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `snapshot[i] = &s4_svc.SnapshotRow{ Address: or.Address, SlotId: or.SlotId, Version: or.Version, Confirmed: or.Confirmed, }` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `orm.On("DeleteExpired", mock.Anything, uint(10), mock.Anything, mock.Anything).Return(int64(10), nil).Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `orm.On("GetUnconfirmedRows", mock.Anything, config.MaxObservationEntries).Return(ormRows[numUnconfirmed:], nil).Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `orm.On("GetSnapshot", mock.Anything, mock.Anything).Return(snapshot, nil).Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `query.Rows[i] = &s4.SnapshotRow{ Address: v.Address.Bytes(), Slotid: uint32(v.SlotId), Version: v.Version, }` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `ormRows[i].Version++` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `snapshot[i].Version++` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `orm.On("Get", mock.Anything, v.Address, v.SlotId).Return(ormRows[i], nil).Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `err = proto.Unmarshal(observation, rows)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `or.Confirmed = true` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `or.Version = vHigh` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `snapshot[i] = &s4_svc.SnapshotRow{ Address: or.Address, SlotId: or.SlotId, Version: or.Version, Confirmed: or.Confirmed, }` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `orm.On("DeleteExpired", mock.Anything, uint(10), mock.Anything, mock.Anything).Return(int64(10), nil).Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `orm.On("GetUnconfirmedRows", mock.Anything, config.MaxObservationEntries).Return([]*s4_svc.Row{}, nil).Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `orm.On("GetSnapshot", mock.Anything, mock.Anything).Return(snapshot, nil).Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `orm.On("Get", mock.Anything, snapshot[1].Address, snapshot[1].SlotId).Return(ormRows[1], nil).Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `orm.On("Get", mock.Anything, snapshot[2].Address, snapshot[2].SlotId).Return(ormRows[2], nil).Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `err = proto.Unmarshal(observation, rows)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `err = proto.Unmarshal(report, reportRows)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `err = proto.Unmarshal(report2, reportRows2)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.NewOCRWrapper(logger.TestLogger(t), true, func(msg string) {})` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.NewORM(t)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Run("ErrInvalidIntervals", func(t *testing.T) { config := createPluginConfig(1) config.NSnapshotShards = 0 _, err := s4.NewReportingPlugin(logger, config, orm) assert.ErrorIs(t, err, s4_svc.ErrInvalidIntervals) })` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.NewReportingPlugin(logger, config, orm)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Run("MaxObservationEntries is zero", func(t *testing.T) { config := createPluginConfig(1) config.MaxObservationEntries = 0 _, err := s4.NewReportingPlugin(logger, config, orm) assert.ErrorContains(t, err, "max number of observation entries cannot be zero") })` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.NewReportingPlugin(logger, config, orm)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Run("MaxReportEntries is zero", func(t *testing.T) { config := createPluginConfig(1) config.MaxReportEntries = 0 _, err := s4.NewReportingPlugin(logger, config, orm) assert.ErrorContains(t, err, "max number of report entries cannot be zero") })` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.NewReportingPlugin(logger, config, orm)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Run("MaxDeleteExpiredEntries is zero", func(t *testing.T) { config := createPluginConfig(1) config.MaxDeleteExpiredEntries = 0 _, err := s4.NewReportingPlugin(logger, config, orm) assert.ErrorContains(t, err, "max number of delete expired entries cannot be zero") })` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.NewReportingPlugin(logger, config, orm)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.NewReportingPlugin(logger, config, orm)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.NewOCRWrapper(logger.TestLogger(t), true, func(msg string) {})` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.NewORM(t)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.NewReportingPlugin(logger, config, orm)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.NewOCRWrapper(logger.TestLogger(t), true, func(msg string) {})` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.NewORM(t)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.NewReportingPlugin(logger, config, orm)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.ShouldTransmitAcceptedReport(testutils.Context(t), types.ReportTimestamp{}, nil)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.NewOCRWrapper(logger.TestLogger(t), true, func(msg string) {})` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.NewORM(t)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.NewReportingPlugin(logger, config, orm)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Run("happy", func(t *testing.T) { ormRows := make([]*s4_svc.Row, 0) rows := generateTestRows(t, 10, time.Minute) orm.On("Update", mock.Anything, mock.Anything).Run(func(args mock.Arguments) { updateRow := args.Get(1).(*s4_svc.Row) ormRows = append(ormRows, updateRow) }).Return(nil).Times(10) report, err := proto.Marshal(&s4.Rows{ Rows: rows, }) assert.NoError(t, err) should, err := plugin.ShouldAcceptFinalizedReport(testutils.Context(t), types.ReportTimestamp{}, report) assert.NoError(t, err) assert.False(t, should) assert.Equal(t, 10, len(ormRows)) compareRows(t, rows, ormRows) })` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.On("Update", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Run(func(args mock.Arguments) { updateRow := args.Get(1).(*s4_svc.Row) ormRows = append(ormRows, updateRow) })` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Get(1)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Return(nil)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Times(10)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Marshal(&s4.Rows{ Rows: rows, })` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.ShouldAcceptFinalizedReport(testutils.Context(t), types.ReportTimestamp{}, report)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Run("error", func(t *testing.T) { testErr := errors.New("some error") rows := generateTestRows(t, 1, time.Minute) orm.On("Update", mock.Anything, mock.Anything).Return(testErr).Once() report, err := proto.Marshal(&s4.Rows{ Rows: rows, }) assert.NoError(t, err) should, err := plugin.ShouldAcceptFinalizedReport(testutils.Context(t), types.ReportTimestamp{}, report) assert.NoError(t, err) // errors just logged assert.False(t, should) })` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.New("some error")` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.On("Update", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Return(testErr)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Marshal(&s4.Rows{ Rows: rows, })` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.ShouldAcceptFinalizedReport(testutils.Context(t), types.ReportTimestamp{}, report)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Marshal(&s4.Rows{ Rows: rows, })` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.ShouldAcceptFinalizedReport(testutils.Context(t), types.ReportTimestamp{}, report)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.NewOCRWrapper(logger.TestLogger(t), true, func(msg string) {})` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.NewORM(t)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.NewReportingPlugin(logger, config, orm)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Run("happy", func(t *testing.T) { ormRows := generateTestOrmRows(t, 10, time.Minute) rows := rowsToShapshotRows(ormRows) orm.On("GetSnapshot", mock.Anything, mock.Anything).Return(rows, nil).Once() queryBytes, err := plugin.Query(testutils.Context(t), types.ReportTimestamp{}) assert.NoError(t, err) query := &s4.Query{} err = proto.Unmarshal(queryBytes, query) assert.NoError(t, err) assert.Equal(t, s4_svc.MinAddress, s4.UnmarshalAddress(query.AddressRange.MinAddress)) assert.Equal(t, s4_svc.MaxAddress, s4.UnmarshalAddress(query.AddressRange.MaxAddress)) compareSnapshotRows(t, query.Rows, rows) })` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.On("GetSnapshot", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Return(rows, nil)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Query(testutils.Context(t), types.ReportTimestamp{})` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Unmarshal(queryBytes, query)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Run("empty", func(t *testing.T) { empty := make([]*s4_svc.SnapshotRow, 0) orm.On("GetSnapshot", mock.Anything, mock.Anything).Return(empty, nil).Once() query, err := plugin.Query(testutils.Context(t), types.ReportTimestamp{}) assert.NoError(t, err) assert.NotNil(t, query) })` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.On("GetSnapshot", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Return(empty, nil)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Query(testutils.Context(t), types.ReportTimestamp{})` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.New(thisAddress.Big())` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Big()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.NewInitialAddressRangeForIntervals(config.NSnapshotShards)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.On("GetSnapshot", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Return(versions[from:to], nil)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Query(testutils.Context(t), types.ReportTimestamp{})` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Unmarshal(query, qq)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.UnmarshalAddress(r.Address)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Advance()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.NewOCRWrapper(logger.TestLogger(t), true, func(msg string) {})` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.NewORM(t)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.NewReportingPlugin(logger, config, orm)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Run("all unconfirmed", func(t *testing.T) { ormRows := generateTestOrmRows(t, int(config.MaxObservationEntries), time.Minute) for _, or := range ormRows { or.Confirmed = false } orm.On("DeleteExpired", mock.Anything, uint(10), mock.Anything, mock.Anything).Return(int64(10), nil).Once() orm.On("GetUnconfirmedRows", mock.Anything, config.MaxObservationEntries).Return(ormRows, nil).Once() observation, err := plugin.Observation(testutils.Context(t), types.ReportTimestamp{}, []byte{}) assert.NoError(t, err) rows := &s4.Rows{} err = proto.Unmarshal(observation, rows) assert.NoError(t, err) assert.Len(t, rows.Rows, int(config.MaxObservationEntries)) })` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.On("DeleteExpired", mock.Anything, uint(10), mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Return(int64(10), nil)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.On("GetUnconfirmedRows", mock.Anything, config.MaxObservationEntries)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Return(ormRows, nil)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Observation(testutils.Context(t), types.ReportTimestamp{}, []byte{})` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Unmarshal(observation, rows)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Run("unconfirmed with query", func(t *testing.T) { numUnconfirmed := int(config.MaxObservationEntries / 2) ormRows := generateTestOrmRows(t, int(config.MaxObservationEntries), time.Minute) snapshot := make([]*s4_svc.SnapshotRow, len(ormRows)) for i, or := range ormRows { or.Confirmed = i < numUnconfirmed // First half are confirmed or.Version = uint64(i) snapshot[i] = &s4_svc.SnapshotRow{ Address: or.Address, SlotId: or.SlotId, Version: or.Version, Confirmed: or.Confirmed, } } orm.On("DeleteExpired", mock.Anything, uint(10), mock.Anything, mock.Anything).Return(int64(10), nil).Once() orm.On("GetUnconfirmedRows", mock.Anything, config.MaxObservationEntries).Return(ormRows[numUnconfirmed:], nil).Once() orm.On("GetSnapshot", mock.Anything, mock.Anything).Return(snapshot, nil).Once() snapshotRows := rowsToShapshotRows(ormRows) query := &s4.Query{ Rows: make([]*s4.SnapshotRow, len(snapshotRows)), } numHigherVersion := 2 for i, v := range snapshotRows { query.Rows[i] = &s4.SnapshotRow{ Address: v.Address.Bytes(), Slotid: uint32(v.SlotId), Version: v.Version, } if i < numHigherVersion { ormRows[i].Version++ snapshot[i].Version++ orm.On("Get", mock.Anything, v.Address, v.SlotId).Return(ormRows[i], nil).Once() } } queryBytes, err := proto.Marshal(query) assert.NoError(t, err) observation, err := plugin.Observation(testutils.Context(t), types.ReportTimestamp{}, queryBytes) assert.NoError(t, err) rows := &s4.Rows{} err = proto.Unmarshal(observation, rows) assert.NoError(t, err) assert.Len(t, rows.Rows, numUnconfirmed+numHigherVersion) for i := 0; i < numUnconfirmed; i++ { assert.Equal(t, ormRows[numUnconfirmed+i].Version, rows.Rows[i].Version) } for i := 0; i < numHigherVersion; i++ { assert.Equal(t, ormRows[i].Version, rows.Rows[numUnconfirmed+i].Version) } })` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.On("DeleteExpired", mock.Anything, uint(10), mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Return(int64(10), nil)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.On("GetUnconfirmedRows", mock.Anything, config.MaxObservationEntries)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Return(ormRows[numUnconfirmed:], nil)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.On("GetSnapshot", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Return(snapshot, nil)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Address.Bytes()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.On("Get", mock.Anything, v.Address, v.SlotId)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Return(ormRows[i], nil)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Marshal(query)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Observation(testutils.Context(t), types.ReportTimestamp{}, queryBytes)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Unmarshal(observation, rows)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Address.Bytes()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Address.Bytes()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Marshal(query)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.On("DeleteExpired", mock.Anything, uint(10), mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Return(int64(10), nil)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.On("GetUnconfirmedRows", mock.Anything, config.MaxObservationEntries)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Return([]*s4_svc.Row{}, nil)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.On("GetSnapshot", mock.Anything, mock.Anything)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Return(snapshot, nil)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.On("Get", mock.Anything, snapshot[1].Address, snapshot[1].SlotId)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Return(ormRows[1], nil)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.On("Get", mock.Anything, snapshot[2].Address, snapshot[2].SlotId)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Return(ormRows[2], nil)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Once()` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Observation(testutils.Context(t), types.ReportTimestamp{}, queryBytes)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Unmarshal(observation, rows)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.NewOCRWrapper(logger.TestLogger(t), true, func(msg string) {})` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.NewORM(t)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.NewReportingPlugin(logger, config, orm)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Marshal(&s4.Rows{Rows: rows})` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Report(testutils.Context(t), types.ReportTimestamp{}, nil, aos)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Unmarshal(report, reportRows)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Report(testutils.Context(t), types.ReportTimestamp{}, nil, aos)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/s4/plugin_test.go: `.Unmarshal(report2, reportRows2)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `waitForPendingRequestToBeAdded(t, dq, []byte("1"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `dq.SetResult([]byte("1"), []byte("decrypted"), nil)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `waitForPendingRequestToBeAdded(t, dq, []byte("1"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `waitForPendingRequestToBeAdded(t, dq, []byte("4"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `waitForPendingRequestToBeAdded(t, dq, []byte("5"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `waitForPendingRequestToBeAdded(t, dq, []byte("6"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `waitForPendingRequestToBeAdded(t, dq, []byte("7"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `dq.SetResult([]byte("9"), []byte("decrypted"), nil)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `dq.SetResult([]byte("9"), []byte("decrypted"), nil)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `waitForCompletedRequestToBeAdded(t, dq, []byte("9"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `dq.SetResult([]byte("10"), []byte("decrypted"), nil)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `waitForPendingRequestToBeAdded(t, dq, ciphertextId)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `dq.SetResult(ciphertextId, nil, decryptionPlugin.ErrAggregation)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `waitForPendingRequestToBeAdded(t, dq, ciphertextId)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `close(dq.pendingRequests[string(ciphertextId)].chPlaintext)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `waitForPendingRequestToBeAdded(t, dq, []byte("11"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `waitForPendingRequestToBeAdded(t, dq, []byte("12"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `waitForPendingRequestToBeAdded(t, dq, []byte("13"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `waitForPendingRequestToBeAdded(t, dq, []byte("11"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `waitForPendingRequestToBeAdded(t, dq, []byte("12"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `waitForPendingRequestToBeAdded(t, dq, []byte("13"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `waitForPendingRequestToBeAdded(t, dq, []byte("11"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `waitForPendingRequestToBeAdded(t, dq, []byte("11"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `cancel()` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `waitForPendingRequestToBeRemoved(t, dq, []byte("11"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `dq.SetResult([]byte("14"), []byte("decrypted"), nil)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Duration(1002)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.SetResult([]byte("1"), []byte("decrypted"), nil)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Decrypt(ctx, []byte("1"), []byte("encrypted"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.DeepEqual(pt, []byte("decrypted"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Decrypt(ctx, []byte("largeCiphertextId"), []byte("ciphertext"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Decrypt(ctx, []byte(""), []byte("ciphertext"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Decrypt(ctx, []byte("1"), []byte("largeciphertext"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Decrypt(ctx, []byte("1"), []byte(""))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Decrypt(ctx, []byte("1"), []byte("encrypted"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Decrypt(ctx, []byte("1"), []byte("encrypted"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WithTimeout(testutils.Context(t), time.Duration(100)*time.Millisecond)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Duration(100)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Decrypt(ctx, []byte("2"), []byte("encrypted"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Decrypt(ctx1, []byte("4"), []byte("encrypted"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Decrypt(ctx2, []byte("3"), []byte("encrypted"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Decrypt(ctx1, []byte("5"), []byte("encrypted"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Decrypt(ctx2, []byte("6"), []byte("encrypted"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.GetRequests(2, 1000)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.DeepEqual(requests, expected)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Decrypt(ctx, []byte("7"), []byte("encrypted"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.GetCiphertext([]byte("7"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.DeepEqual(ct, []byte("encrypted"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.GetCiphertext([]byte{0xa5})` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Is(err, decryptionPlugin.ErrNotFound)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.SetResult([]byte("9"), []byte("decrypted"), nil)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Decrypt(ctx, []byte("9"), []byte("encrypted"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.DeepEqual(pt, []byte("decrypted"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.SetResult([]byte("9"), []byte("decrypted"), nil)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WithTimeout(testutils.Context(t), time.Duration(100)*time.Millisecond)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Duration(100)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Decrypt(ctx, []byte("9"), []byte("encrypted"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.SetResult([]byte("10"), []byte("decrypted"), nil)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Decrypt(ctx1, []byte("10"), []byte("encrypted"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WithTimeout(testutils.Context(t), time.Duration(100)*time.Millisecond)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Duration(100)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Decrypt(ctx2, []byte("10"), []byte("encrypted"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.SetResult(ciphertextId, nil, decryptionPlugin.ErrAggregation)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Decrypt(ctx, ciphertextId, []byte("encrypted"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Decrypt(ctx, ciphertextId, []byte("encrypted"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Decrypt(ctx1, []byte("11"), []byte("encrypted"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Decrypt(ctx2, []byte("12"), []byte("encrypted"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Decrypt(ctx3, []byte("13"), []byte("encrypted"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.GetRequests(2, 1000)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.DeepEqual(requests, expected)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Decrypt(ctx1, []byte("11"), []byte("encrypted"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Decrypt(ctx2, []byte("12"), []byte("encrypted"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Decrypt(ctx3, []byte("13"), []byte("encrypted"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.GetRequests(4, 30)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.DeepEqual(requests, expected)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Decrypt(ctx, []byte("11"), []byte("encrypted"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.GetRequests(2, 1000)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.DeepEqual(requests, expected)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Decrypt(ctx, []byte("11"), []byte("encrypted"))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.GetRequests(2, 1000)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.DeepEqual(requests, expected)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Context(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.Start(ctx)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.TestLogger(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.WaitTimeout(t)` $DIR/core/services/ocr2/plugins/threshold/decryption_queue_test.go: `.SetResult([]byte("14"), []byte("decrypted"), nil)` $DIR/core/services/ocr2/validate/validate_test.go: `err = jsonapi.Unmarshal(b, &r)` $DIR/core/services/ocr2/validate/validate_test.go: `c.OCR2.DatabaseTimeout = commonconfig.MustNewDuration(20 * time.Minute)` $DIR/core/services/ocr2/validate/validate_test.go: `err = jsonapi.Unmarshal(b, &r)` $DIR/core/services/ocr2/validate/validate_test.go: `t.Run(tc.name, func(t *testing.T) { c := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Insecure.OCRDevelopmentMode = testutils.Ptr(false) // tests run with OCRDevelopmentMode by default. if tc.overrides != nil { tc.overrides(c, s) } }) s, err := validate.ValidatedOracleSpecToml(testutils.Context(t), c.OCR2(), c.Insecure(), tc.toml, nil) tc.assertion(t, s, err) })` $DIR/core/services/ocr2/validate/validate_test.go: `c.Insecure.OCRDevelopmentMode = testutils.Ptr(false)` $DIR/core/services/ocr2/validate/validate_test.go: `tc.overrides(c, s)` $DIR/core/services/ocr2/validate/validate_test.go: `tc.assertion(t, s, err)` $DIR/core/services/ocr2/validate/validate_test.go: `err = tree.Unmarshal(&o)` $DIR/core/services/ocr2/validate/validate_test.go: `err = json.Unmarshal(b, e)` $DIR/core/services/ocr2/validate/validate_test.go: `err = tree.Unmarshal(&o)` $DIR/core/services/ocr2/validate/validate_test.go: `err = json.Unmarshal(b, oss)` $DIR/core/services/ocr2/validate/validate_test.go: `.Marshal(os.OCR2OracleSpec)` $DIR/core/services/ocr2/validate/validate_test.go: `.Unmarshal(b, &r)` $DIR/core/services/ocr2/validate/validate_test.go: `.MustDecode("0x2222220d5c22223b22225c0d21222222")` $DIR/core/services/ocr2/validate/validate_test.go: `.MustNewDuration(20 * time.Minute)` $DIR/core/services/ocr2/validate/validate_test.go: `.Marshal(os.OCR2OracleSpec)` $DIR/core/services/ocr2/validate/validate_test.go: `.Unmarshal(b, &r)` $DIR/core/services/ocr2/validate/validate_test.go: `.Run(tc.name, func(t *testing.T) { c := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Insecure.OCRDevelopmentMode = testutils.Ptr(false) // tests run with OCRDevelopmentMode by default. if tc.overrides != nil { tc.overrides(c, s) } }) s, err := validate.ValidatedOracleSpecToml(testutils.Context(t), c.OCR2(), c.Insecure(), tc.toml, nil) tc.assertion(t, s, err) })` $DIR/core/services/ocr2/validate/validate_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Insecure.OCRDevelopmentMode = testutils.Ptr(false) // tests run with OCRDevelopmentMode by default. if tc.overrides != nil { tc.overrides(c, s) } })` $DIR/core/services/ocr2/validate/validate_test.go: `.Ptr(false)` $DIR/core/services/ocr2/validate/validate_test.go: `.overrides(c, s)` $DIR/core/services/ocr2/validate/validate_test.go: `.ValidatedOracleSpecToml(testutils.Context(t), c.OCR2(), c.Insecure(), tc.toml, nil)` $DIR/core/services/ocr2/validate/validate_test.go: `.Context(t)` $DIR/core/services/ocr2/validate/validate_test.go: `.OCR2()` $DIR/core/services/ocr2/validate/validate_test.go: `.Insecure()` $DIR/core/services/ocr2/validate/validate_test.go: `.assertion(t, s, err)` $DIR/core/services/ocr2/validate/validate_test.go: `.Load(payload)` $DIR/core/services/ocr2/validate/validate_test.go: `.Unmarshal(&o)` $DIR/core/services/ocr2/validate/validate_test.go: `.Marshal(o)` $DIR/core/services/ocr2/validate/validate_test.go: `.Unmarshal(b, e)` $DIR/core/services/ocr2/validate/validate_test.go: `.Load(payload)` $DIR/core/services/ocr2/validate/validate_test.go: `.Unmarshal(&o)` $DIR/core/services/ocr2/validate/validate_test.go: `.Marshal(o)` $DIR/core/services/ocr2/validate/validate_test.go: `.Unmarshal(b, oss)` $DIR/core/services/ocr2/validate/validate_test.go: `.OnchainSigningStrategy.PublicKey()` $DIR/core/services/ocr2/validate/validate_test.go: `.OnchainSigningStrategy.KeyBundleID("evm")` $DIR/core/services/ocrbootstrap/database_test.go: `t.Run("reads and writes config", func(t *testing.T) { db := ocrbootstrap.NewDB(sqlDB, spec.ID, lggr) err := db.WriteConfig(testutils.Context(t), config) require.NoError(t, err) readConfig, err := db.ReadConfig(testutils.Context(t)) require.NoError(t, err) require.Equal(t, &config, readConfig) })` $DIR/core/services/ocrbootstrap/database_test.go: `t.Run("updates config", func(t *testing.T) { db := ocrbootstrap.NewDB(sqlDB, spec.ID, lggr) newConfig := ocrtypes.ContractConfig{ ConfigDigest: testhelpers.MakeConfigDigest(t), Signers: []ocrtypes.OnchainPublicKey{{0x03}}, Transmitters: []ocrtypes.Account{"test"}, } err := db.WriteConfig(testutils.Context(t), newConfig) require.NoError(t, err) readConfig, err := db.ReadConfig(testutils.Context(t)) require.NoError(t, err) require.Equal(t, &newConfig, readConfig) })` $DIR/core/services/ocrbootstrap/database_test.go: `db = ocrbootstrap.NewDB(sqlDB, -1, lggr)` $DIR/core/services/ocrbootstrap/database_test.go: `.MakeConfigDigest(t)` $DIR/core/services/ocrbootstrap/database_test.go: `.TestLogger(t)` $DIR/core/services/ocrbootstrap/database_test.go: `.Run("reads and writes config", func(t *testing.T) { db := ocrbootstrap.NewDB(sqlDB, spec.ID, lggr) err := db.WriteConfig(testutils.Context(t), config) require.NoError(t, err) readConfig, err := db.ReadConfig(testutils.Context(t)) require.NoError(t, err) require.Equal(t, &config, readConfig) })` $DIR/core/services/ocrbootstrap/database_test.go: `.NewDB(sqlDB, spec.ID, lggr)` $DIR/core/services/ocrbootstrap/database_test.go: `.WriteConfig(testutils.Context(t), config)` $DIR/core/services/ocrbootstrap/database_test.go: `.Context(t)` $DIR/core/services/ocrbootstrap/database_test.go: `.ReadConfig(testutils.Context(t))` $DIR/core/services/ocrbootstrap/database_test.go: `.Context(t)` $DIR/core/services/ocrbootstrap/database_test.go: `.Run("updates config", func(t *testing.T) { db := ocrbootstrap.NewDB(sqlDB, spec.ID, lggr) newConfig := ocrtypes.ContractConfig{ ConfigDigest: testhelpers.MakeConfigDigest(t), Signers: []ocrtypes.OnchainPublicKey{{0x03}}, Transmitters: []ocrtypes.Account{"test"}, } err := db.WriteConfig(testutils.Context(t), newConfig) require.NoError(t, err) readConfig, err := db.ReadConfig(testutils.Context(t)) require.NoError(t, err) require.Equal(t, &newConfig, readConfig) })` $DIR/core/services/ocrbootstrap/database_test.go: `.NewDB(sqlDB, spec.ID, lggr)` $DIR/core/services/ocrbootstrap/database_test.go: `.MakeConfigDigest(t)` $DIR/core/services/ocrbootstrap/database_test.go: `.WriteConfig(testutils.Context(t), newConfig)` $DIR/core/services/ocrbootstrap/database_test.go: `.Context(t)` $DIR/core/services/ocrbootstrap/database_test.go: `.ReadConfig(testutils.Context(t))` $DIR/core/services/ocrbootstrap/database_test.go: `.Context(t)` $DIR/core/services/ocrbootstrap/database_test.go: `.NewDB(sqlDB, spec.ID, lggr)` $DIR/core/services/ocrbootstrap/database_test.go: `.WriteConfig(testutils.Context(t), config)` $DIR/core/services/ocrbootstrap/database_test.go: `.Context(t)` $DIR/core/services/ocrbootstrap/database_test.go: `.NewDB(sqlDB, -1, lggr)` $DIR/core/services/ocrbootstrap/database_test.go: `.ReadConfig(testutils.Context(t))` $DIR/core/services/ocrbootstrap/database_test.go: `.Context(t)` $DIR/core/services/ocrbootstrap/validate_test.go: `t.Run(tc.name, func(t *testing.T) { s, err := ValidatedBootstrapSpecToml(tc.toml) tc.assertion(t, s, err) })` $DIR/core/services/ocrbootstrap/validate_test.go: `tc.assertion(t, s, err)` $DIR/core/services/ocrbootstrap/validate_test.go: `.Run(tc.name, func(t *testing.T) { s, err := ValidatedBootstrapSpecToml(tc.toml) tc.assertion(t, s, err) })` $DIR/core/services/ocrbootstrap/validate_test.go: `.assertion(t, s, err)` $DIR/core/services/ocrcommon/adapters_test.go: `err = tree.Unmarshal(&o)` $DIR/core/services/ocrcommon/adapters_test.go: `err = json.Unmarshal(b, oss)` $DIR/core/services/ocrcommon/adapters_test.go: `reportInfo.Info = infoB` $DIR/core/services/ocrcommon/adapters_test.go: `ks.On("Get", "pub-key").Return(fakeKey, nil)` $DIR/core/services/ocrcommon/adapters_test.go: `ks.On("Get", "08d14c6eed757414d72055d28de6caf06535806c6a14e450f3a2f1c854420e17").Return(fakeKey, nil)` $DIR/core/services/ocrcommon/adapters_test.go: `keyBundles[name] = os` $DIR/core/services/ocrcommon/adapters_test.go: `_, err = ocrcommon.NewOCR3OnchainKeyringMultiChainAdapter(map[string]ocr2key.KeyBundle{}, logger.TestLogger(t))` $DIR/core/services/ocrcommon/adapters_test.go: `.NewOCR3OnchainKeyringAdapter(fakeOnchainKeyring{})` $DIR/core/services/ocrcommon/adapters_test.go: `.Sign(configDigest, seqNr, rwi)` $DIR/core/services/ocrcommon/adapters_test.go: `.MaxSignatureLength()` $DIR/core/services/ocrcommon/adapters_test.go: `.Load(payload)` $DIR/core/services/ocrcommon/adapters_test.go: `.Unmarshal(&o)` $DIR/core/services/ocrcommon/adapters_test.go: `.Marshal(o)` $DIR/core/services/ocrcommon/adapters_test.go: `.Unmarshal(b, oss)` $DIR/core/services/ocrcommon/adapters_test.go: `.NewStruct(map[string]interface{}{ "keyBundleName": "evm", })` $DIR/core/services/ocrcommon/adapters_test.go: `.Marshal(info)` $DIR/core/services/ocrcommon/adapters_test.go: `.NewOCR2(t)` $DIR/core/services/ocrcommon/adapters_test.go: `.MustNewInsecure(keystest.NewRandReaderFromSeed(1), "evm")` $DIR/core/services/ocrcommon/adapters_test.go: `.NewRandReaderFromSeed(1)` $DIR/core/services/ocrcommon/adapters_test.go: `.PublicKey()` $DIR/core/services/ocrcommon/adapters_test.go: `.On("Get", "pub-key")` $DIR/core/services/ocrcommon/adapters_test.go: `.Return(fakeKey, nil)` $DIR/core/services/ocrcommon/adapters_test.go: `.On("Get", "08d14c6eed757414d72055d28de6caf06535806c6a14e450f3a2f1c854420e17")` $DIR/core/services/ocrcommon/adapters_test.go: `.Return(fakeKey, nil)` $DIR/core/services/ocrcommon/adapters_test.go: `.OnchainSigningStrategy.ConfigCopy()` $DIR/core/services/ocrcommon/adapters_test.go: `.OnchainSigningStrategy.KeyBundleID(name)` $DIR/core/services/ocrcommon/adapters_test.go: `.Get(kbID)` $DIR/core/services/ocrcommon/adapters_test.go: `.NewOCR3OnchainKeyringMultiChainAdapter(keyBundles, logger.TestLogger(t))` $DIR/core/services/ocrcommon/adapters_test.go: `.TestLogger(t)` $DIR/core/services/ocrcommon/adapters_test.go: `.NewOCR3OnchainKeyringMultiChainAdapter(map[string]ocr2key.KeyBundle{}, logger.TestLogger(t))` $DIR/core/services/ocrcommon/adapters_test.go: `.TestLogger(t)` $DIR/core/services/ocrcommon/adapters_test.go: `.Sign(configDigest, seqNr, reportInfo)` $DIR/core/services/ocrcommon/adapters_test.go: `.MaxSignatureLength()` $DIR/core/services/ocrcommon/adapters_test.go: `.MaxSignatureLength()` $DIR/core/services/ocrcommon/adapters_test.go: `.NewOCR3ContractTransmitterAdapter(fakeContractTransmitter{})` $DIR/core/services/ocrcommon/adapters_test.go: `.FromAccount()` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `t.Run("returns range of current to nil if target is above current block number", func(t *testing.T) { client := evmtest.NewEthClientMock(t) abt := ocrcommon.NewArbitrumBlockTranslator(client, lggr) ctx := testutils.Context(t) var changedInL1Block int64 = 5541 latestBlock := blocks[1000] client.On("HeadByNumber", ctx, (*big.Int)(nil)).Return(&latestBlock, nil).Once() from, to, err := abt.BinarySearch(ctx, changedInL1Block) require.NoError(t, err) assert.Equal(t, big.NewInt(1000), from) assert.Equal(t, (*big.Int)(nil), to) })` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `client.On("HeadByNumber", ctx, (*big.Int)(nil)).Return(&latestBlock, nil).Once()` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `t.Run("returns error if changedInL1Block is less than the lowest possible L1 block on the L2 chain", func(t *testing.T) { client := evmtest.NewEthClientMock(t) abt := ocrcommon.NewArbitrumBlockTranslator(client, lggr) ctx := testutils.Context(t) var changedInL1Block int64 = 42 latestBlock := blocks[1000] client.On("HeadByNumber", ctx, (*big.Int)(nil)).Return(&latestBlock, nil).Once() tmp := new(evmtypes.Head) client.On("HeadByNumber", ctx, mock.AnythingOfType("*big.Int")).Return(tmp, nil).Run(func(args mock.Arguments) { *tmp = blocks[args[1].(*big.Int).Int64()] }) _, _, err := abt.BinarySearch(ctx, changedInL1Block) assert.EqualError(t, err, "target L1 block number 42 is not represented by any L2 block") })` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `client.On("HeadByNumber", ctx, (*big.Int)(nil)).Return(&latestBlock, nil).Once()` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `client.On("HeadByNumber", ctx, mock.AnythingOfType("*big.Int")).Return(tmp, nil).Run(func(args mock.Arguments) { *tmp = blocks[args[1].(*big.Int).Int64()] })` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `*tmp = blocks[args[1].(*big.Int).Int64()]` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `t.Run("returns error if L1 block number does not exist for any range of L2 blocks", func(t *testing.T) { client := evmtest.NewEthClientMock(t) abt := ocrcommon.NewArbitrumBlockTranslator(client, lggr) ctx := testutils.Context(t) var changedInL1Block int64 = 5043 latestBlock := blocks[1000] client.On("HeadByNumber", ctx, (*big.Int)(nil)).Return(&latestBlock, nil).Once() tmp := new(evmtypes.Head) client.On("HeadByNumber", ctx, mock.AnythingOfType("*big.Int")).Return(tmp, nil).Run(func(args mock.Arguments) { *tmp = blocks[args[1].(*big.Int).Int64()] }) _, _, err := abt.BinarySearch(ctx, changedInL1Block) assert.EqualError(t, err, "target L1 block number 5043 is not represented by any L2 block") })` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `client.On("HeadByNumber", ctx, (*big.Int)(nil)).Return(&latestBlock, nil).Once()` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `client.On("HeadByNumber", ctx, mock.AnythingOfType("*big.Int")).Return(tmp, nil).Run(func(args mock.Arguments) { *tmp = blocks[args[1].(*big.Int).Int64()] })` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `*tmp = blocks[args[1].(*big.Int).Int64()]` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `t.Run("returns correct range of L2 blocks that encompasses all possible blocks that might contain the given L1 block number", func(t *testing.T) { client := evmtest.NewEthClientMock(t) abt := ocrcommon.NewArbitrumBlockTranslator(client, lggr) ctx := testutils.Context(t) var changedInL1Block int64 = 5042 latestBlock := blocks[1000] client.On("HeadByNumber", ctx, (*big.Int)(nil)).Return(&latestBlock, nil).Once() tmp := new(evmtypes.Head) client.On("HeadByNumber", ctx, mock.AnythingOfType("*big.Int")).Return(tmp, nil).Run(func(args mock.Arguments) { h := blocks[args[1].(*big.Int).Int64()] *tmp = h }) from, to, err := abt.BinarySearch(ctx, changedInL1Block) require.NoError(t, err) assert.Equal(t, big.NewInt(98), from) assert.Equal(t, big.NewInt(137), to) })` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `client.On("HeadByNumber", ctx, (*big.Int)(nil)).Return(&latestBlock, nil).Once()` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `client.On("HeadByNumber", ctx, mock.AnythingOfType("*big.Int")).Return(tmp, nil).Run(func(args mock.Arguments) { h := blocks[args[1].(*big.Int).Int64()] *tmp = h })` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `*tmp = h` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `t.Run("handles edge case where L1 is the smallest possible value", func(t *testing.T) { client := evmtest.NewEthClientMock(t) abt := ocrcommon.NewArbitrumBlockTranslator(client, lggr) ctx := testutils.Context(t) var changedInL1Block int64 = 5000 latestBlock := blocks[1000] client.On("HeadByNumber", ctx, (*big.Int)(nil)).Return(&latestBlock, nil).Once() tmp := new(evmtypes.Head) client.On("HeadByNumber", ctx, mock.AnythingOfType("*big.Int")).Return(tmp, nil).Run(func(args mock.Arguments) { h := blocks[args[1].(*big.Int).Int64()] *tmp = h }) from, to, err := abt.BinarySearch(ctx, changedInL1Block) require.NoError(t, err) assert.Equal(t, big.NewInt(0), from) assert.Equal(t, big.NewInt(16), to) })` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `client.On("HeadByNumber", ctx, (*big.Int)(nil)).Return(&latestBlock, nil).Once()` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `client.On("HeadByNumber", ctx, mock.AnythingOfType("*big.Int")).Return(tmp, nil).Run(func(args mock.Arguments) { h := blocks[args[1].(*big.Int).Int64()] *tmp = h })` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `*tmp = h` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `t.Run("leaves upper bound unbounded where L1 is the largest possible value", func(t *testing.T) { client := evmtest.NewEthClientMock(t) abt := ocrcommon.NewArbitrumBlockTranslator(client, lggr) ctx := testutils.Context(t) var changedInL1Block int64 = 5540 latestBlock := blocks[1000] client.On("HeadByNumber", ctx, (*big.Int)(nil)).Return(&latestBlock, nil).Once() tmp := new(evmtypes.Head) client.On("HeadByNumber", ctx, mock.AnythingOfType("*big.Int")).Return(tmp, nil).Run(func(args mock.Arguments) { h := blocks[args[1].(*big.Int).Int64()] *tmp = h }) from, to, err := abt.BinarySearch(ctx, changedInL1Block) require.NoError(t, err) assert.Equal(t, big.NewInt(986), from) assert.Equal(t, (*big.Int)(nil), to) })` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `client.On("HeadByNumber", ctx, (*big.Int)(nil)).Return(&latestBlock, nil).Once()` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `client.On("HeadByNumber", ctx, mock.AnythingOfType("*big.Int")).Return(tmp, nil).Run(func(args mock.Arguments) { h := blocks[args[1].(*big.Int).Int64()] *tmp = h })` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `*tmp = h` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `client.On("HeadByNumber", ctx, (*big.Int)(nil)).Return(&latestBlock, nil).Once()` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `client.On("HeadByNumber", ctx, mock.AnythingOfType("*big.Int")).Times(20+18+14).Return(tmp, nil).Run(func(args mock.Arguments) { h := blocks[args[1].(*big.Int).Int64()] *tmp = h })` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `*tmp = h` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `from, to, err = abt.BinarySearch(ctx, changedInL1Block2)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `from, to, err = abt.BinarySearch(ctx, changedInL1Block3)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `t.Run("falls back to whole range on error", func(t *testing.T) { client := evmtest.NewEthClientMock(t) abt := ocrcommon.NewArbitrumBlockTranslator(client, lggr) ctx := testutils.Context(t) var changedInL1Block uint64 = 5042 client.On("HeadByNumber", ctx, (*big.Int)(nil)).Return(nil, errors.New("something exploded")).Once() from, to := abt.NumberToQueryRange(ctx, changedInL1Block) assert.Equal(t, big.NewInt(0), from) assert.Equal(t, (*big.Int)(nil), to) })` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `client.On("HeadByNumber", ctx, (*big.Int)(nil)).Return(nil, errors.New("something exploded")).Once()` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `client.On("HeadByNumber", ctx, (*big.Int)(nil)).Return(nil, nil).Once()` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.TestLogger(t)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Run("returns range of current to nil if target is above current block number", func(t *testing.T) { client := evmtest.NewEthClientMock(t) abt := ocrcommon.NewArbitrumBlockTranslator(client, lggr) ctx := testutils.Context(t) var changedInL1Block int64 = 5541 latestBlock := blocks[1000] client.On("HeadByNumber", ctx, (*big.Int)(nil)).Return(&latestBlock, nil).Once() from, to, err := abt.BinarySearch(ctx, changedInL1Block) require.NoError(t, err) assert.Equal(t, big.NewInt(1000), from) assert.Equal(t, (*big.Int)(nil), to) })` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.NewEthClientMock(t)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.NewArbitrumBlockTranslator(client, lggr)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Context(t)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.On("HeadByNumber", ctx, (*big.Int)(nil))` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Return(&latestBlock, nil)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Once()` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.BinarySearch(ctx, changedInL1Block)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Run("returns error if changedInL1Block is less than the lowest possible L1 block on the L2 chain", func(t *testing.T) { client := evmtest.NewEthClientMock(t) abt := ocrcommon.NewArbitrumBlockTranslator(client, lggr) ctx := testutils.Context(t) var changedInL1Block int64 = 42 latestBlock := blocks[1000] client.On("HeadByNumber", ctx, (*big.Int)(nil)).Return(&latestBlock, nil).Once() tmp := new(evmtypes.Head) client.On("HeadByNumber", ctx, mock.AnythingOfType("*big.Int")).Return(tmp, nil).Run(func(args mock.Arguments) { *tmp = blocks[args[1].(*big.Int).Int64()] }) _, _, err := abt.BinarySearch(ctx, changedInL1Block) assert.EqualError(t, err, "target L1 block number 42 is not represented by any L2 block") })` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.NewEthClientMock(t)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.NewArbitrumBlockTranslator(client, lggr)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Context(t)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.On("HeadByNumber", ctx, (*big.Int)(nil))` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Return(&latestBlock, nil)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Once()` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.On("HeadByNumber", ctx, mock.AnythingOfType("*big.Int"))` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.AnythingOfType("*big.Int")` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Return(tmp, nil)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Run(func(args mock.Arguments) { *tmp = blocks[args[1].(*big.Int).Int64()] })` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Int64()` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.BinarySearch(ctx, changedInL1Block)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Run("returns error if L1 block number does not exist for any range of L2 blocks", func(t *testing.T) { client := evmtest.NewEthClientMock(t) abt := ocrcommon.NewArbitrumBlockTranslator(client, lggr) ctx := testutils.Context(t) var changedInL1Block int64 = 5043 latestBlock := blocks[1000] client.On("HeadByNumber", ctx, (*big.Int)(nil)).Return(&latestBlock, nil).Once() tmp := new(evmtypes.Head) client.On("HeadByNumber", ctx, mock.AnythingOfType("*big.Int")).Return(tmp, nil).Run(func(args mock.Arguments) { *tmp = blocks[args[1].(*big.Int).Int64()] }) _, _, err := abt.BinarySearch(ctx, changedInL1Block) assert.EqualError(t, err, "target L1 block number 5043 is not represented by any L2 block") })` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.NewEthClientMock(t)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.NewArbitrumBlockTranslator(client, lggr)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Context(t)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.On("HeadByNumber", ctx, (*big.Int)(nil))` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Return(&latestBlock, nil)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Once()` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.On("HeadByNumber", ctx, mock.AnythingOfType("*big.Int"))` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.AnythingOfType("*big.Int")` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Return(tmp, nil)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Run(func(args mock.Arguments) { *tmp = blocks[args[1].(*big.Int).Int64()] })` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Int64()` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.BinarySearch(ctx, changedInL1Block)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Run("returns correct range of L2 blocks that encompasses all possible blocks that might contain the given L1 block number", func(t *testing.T) { client := evmtest.NewEthClientMock(t) abt := ocrcommon.NewArbitrumBlockTranslator(client, lggr) ctx := testutils.Context(t) var changedInL1Block int64 = 5042 latestBlock := blocks[1000] client.On("HeadByNumber", ctx, (*big.Int)(nil)).Return(&latestBlock, nil).Once() tmp := new(evmtypes.Head) client.On("HeadByNumber", ctx, mock.AnythingOfType("*big.Int")).Return(tmp, nil).Run(func(args mock.Arguments) { h := blocks[args[1].(*big.Int).Int64()] *tmp = h }) from, to, err := abt.BinarySearch(ctx, changedInL1Block) require.NoError(t, err) assert.Equal(t, big.NewInt(98), from) assert.Equal(t, big.NewInt(137), to) })` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.NewEthClientMock(t)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.NewArbitrumBlockTranslator(client, lggr)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Context(t)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.On("HeadByNumber", ctx, (*big.Int)(nil))` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Return(&latestBlock, nil)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Once()` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.On("HeadByNumber", ctx, mock.AnythingOfType("*big.Int"))` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.AnythingOfType("*big.Int")` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Return(tmp, nil)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Run(func(args mock.Arguments) { h := blocks[args[1].(*big.Int).Int64()] *tmp = h })` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Int64()` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.BinarySearch(ctx, changedInL1Block)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Run("handles edge case where L1 is the smallest possible value", func(t *testing.T) { client := evmtest.NewEthClientMock(t) abt := ocrcommon.NewArbitrumBlockTranslator(client, lggr) ctx := testutils.Context(t) var changedInL1Block int64 = 5000 latestBlock := blocks[1000] client.On("HeadByNumber", ctx, (*big.Int)(nil)).Return(&latestBlock, nil).Once() tmp := new(evmtypes.Head) client.On("HeadByNumber", ctx, mock.AnythingOfType("*big.Int")).Return(tmp, nil).Run(func(args mock.Arguments) { h := blocks[args[1].(*big.Int).Int64()] *tmp = h }) from, to, err := abt.BinarySearch(ctx, changedInL1Block) require.NoError(t, err) assert.Equal(t, big.NewInt(0), from) assert.Equal(t, big.NewInt(16), to) })` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.NewEthClientMock(t)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.NewArbitrumBlockTranslator(client, lggr)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Context(t)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.On("HeadByNumber", ctx, (*big.Int)(nil))` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Return(&latestBlock, nil)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Once()` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.On("HeadByNumber", ctx, mock.AnythingOfType("*big.Int"))` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.AnythingOfType("*big.Int")` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Return(tmp, nil)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Run(func(args mock.Arguments) { h := blocks[args[1].(*big.Int).Int64()] *tmp = h })` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Int64()` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.BinarySearch(ctx, changedInL1Block)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Run("leaves upper bound unbounded where L1 is the largest possible value", func(t *testing.T) { client := evmtest.NewEthClientMock(t) abt := ocrcommon.NewArbitrumBlockTranslator(client, lggr) ctx := testutils.Context(t) var changedInL1Block int64 = 5540 latestBlock := blocks[1000] client.On("HeadByNumber", ctx, (*big.Int)(nil)).Return(&latestBlock, nil).Once() tmp := new(evmtypes.Head) client.On("HeadByNumber", ctx, mock.AnythingOfType("*big.Int")).Return(tmp, nil).Run(func(args mock.Arguments) { h := blocks[args[1].(*big.Int).Int64()] *tmp = h }) from, to, err := abt.BinarySearch(ctx, changedInL1Block) require.NoError(t, err) assert.Equal(t, big.NewInt(986), from) assert.Equal(t, (*big.Int)(nil), to) })` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.NewEthClientMock(t)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.NewArbitrumBlockTranslator(client, lggr)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Context(t)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.On("HeadByNumber", ctx, (*big.Int)(nil))` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Return(&latestBlock, nil)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Once()` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.On("HeadByNumber", ctx, mock.AnythingOfType("*big.Int"))` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.AnythingOfType("*big.Int")` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Return(tmp, nil)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Run(func(args mock.Arguments) { h := blocks[args[1].(*big.Int).Int64()] *tmp = h })` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Int64()` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.BinarySearch(ctx, changedInL1Block)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.NewEthClientMock(t)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.NewArbitrumBlockTranslator(client, lggr)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Context(t)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.On("HeadByNumber", ctx, (*big.Int)(nil))` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Return(&latestBlock, nil)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Once()` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.On("HeadByNumber", ctx, mock.AnythingOfType("*big.Int"))` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.AnythingOfType("*big.Int")` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Times(20+18+14)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Return(tmp, nil)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Run(func(args mock.Arguments) { h := blocks[args[1].(*big.Int).Int64()] *tmp = h })` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Int64()` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.BinarySearch(ctx, changedInL1Block)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.BinarySearch(ctx, changedInL1Block2)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.BinarySearch(ctx, changedInL1Block3)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.TestLogger(t)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Run("falls back to whole range on error", func(t *testing.T) { client := evmtest.NewEthClientMock(t) abt := ocrcommon.NewArbitrumBlockTranslator(client, lggr) ctx := testutils.Context(t) var changedInL1Block uint64 = 5042 client.On("HeadByNumber", ctx, (*big.Int)(nil)).Return(nil, errors.New("something exploded")).Once() from, to := abt.NumberToQueryRange(ctx, changedInL1Block) assert.Equal(t, big.NewInt(0), from) assert.Equal(t, (*big.Int)(nil), to) })` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.NewEthClientMock(t)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.NewArbitrumBlockTranslator(client, lggr)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Context(t)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.On("HeadByNumber", ctx, (*big.Int)(nil))` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Return(nil, errors.New("something exploded"))` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.New("something exploded")` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Once()` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.NumberToQueryRange(ctx, changedInL1Block)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.NewEthClientMock(t)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.NewArbitrumBlockTranslator(client, lggr)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Context(t)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.On("HeadByNumber", ctx, (*big.Int)(nil))` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Return(nil, nil)` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.Once()` $DIR/core/services/ocrcommon/arbitrum_block_translator_test.go: `.NumberToQueryRange(ctx, changedInL1Block)` $DIR/core/services/ocrcommon/block_translator_test.go: `t.Run("for L1 chains, returns the block changed argument", func(t *testing.T) { bt := ocrcommon.NewBlockTranslator(v2.ChainEthMainnet(t).EVM(), ethClient, lggr) from, to := bt.NumberToQueryRange(ctx, 42) assert.Equal(t, big.NewInt(42), from) assert.Equal(t, big.NewInt(42), to) })` $DIR/core/services/ocrcommon/block_translator_test.go: `t.Run("for optimism, uses the default translator", func(t *testing.T) { bt := ocrcommon.NewBlockTranslator(v2.ChainOptimismMainnet(t).EVM(), ethClient, lggr) from, to := bt.NumberToQueryRange(ctx, 42) assert.Equal(t, big.NewInt(42), from) assert.Equal(t, big.NewInt(42), to) })` $DIR/core/services/ocrcommon/block_translator_test.go: `bt = ocrcommon.NewBlockTranslator(v2.ChainArbitrumRinkeby(t).EVM(), ethClient, lggr)` $DIR/core/services/ocrcommon/block_translator_test.go: `.NewEthClientMock(t)` $DIR/core/services/ocrcommon/block_translator_test.go: `.Context(t)` $DIR/core/services/ocrcommon/block_translator_test.go: `.TestLogger(t)` $DIR/core/services/ocrcommon/block_translator_test.go: `.Run("for L1 chains, returns the block changed argument", func(t *testing.T) { bt := ocrcommon.NewBlockTranslator(v2.ChainEthMainnet(t).EVM(), ethClient, lggr) from, to := bt.NumberToQueryRange(ctx, 42) assert.Equal(t, big.NewInt(42), from) assert.Equal(t, big.NewInt(42), to) })` $DIR/core/services/ocrcommon/block_translator_test.go: `.NewBlockTranslator(v2.ChainEthMainnet(t).EVM(), ethClient, lggr)` $DIR/core/services/ocrcommon/block_translator_test.go: `.ChainEthMainnet(t)` $DIR/core/services/ocrcommon/block_translator_test.go: `.EVM()` $DIR/core/services/ocrcommon/block_translator_test.go: `.NumberToQueryRange(ctx, 42)` $DIR/core/services/ocrcommon/block_translator_test.go: `.Run("for optimism, uses the default translator", func(t *testing.T) { bt := ocrcommon.NewBlockTranslator(v2.ChainOptimismMainnet(t).EVM(), ethClient, lggr) from, to := bt.NumberToQueryRange(ctx, 42) assert.Equal(t, big.NewInt(42), from) assert.Equal(t, big.NewInt(42), to) })` $DIR/core/services/ocrcommon/block_translator_test.go: `.NewBlockTranslator(v2.ChainOptimismMainnet(t).EVM(), ethClient, lggr)` $DIR/core/services/ocrcommon/block_translator_test.go: `.ChainOptimismMainnet(t)` $DIR/core/services/ocrcommon/block_translator_test.go: `.EVM()` $DIR/core/services/ocrcommon/block_translator_test.go: `.NumberToQueryRange(ctx, 42)` $DIR/core/services/ocrcommon/block_translator_test.go: `.NewBlockTranslator(v2.ChainArbitrumMainnet(t).EVM(), ethClient, lggr)` $DIR/core/services/ocrcommon/block_translator_test.go: `.ChainArbitrumMainnet(t)` $DIR/core/services/ocrcommon/block_translator_test.go: `.EVM()` $DIR/core/services/ocrcommon/block_translator_test.go: `.NewBlockTranslator(v2.ChainArbitrumRinkeby(t).EVM(), ethClient, lggr)` $DIR/core/services/ocrcommon/block_translator_test.go: `.ChainArbitrumRinkeby(t)` $DIR/core/services/ocrcommon/block_translator_test.go: `.EVM()` $DIR/core/services/ocrcommon/data_source_test.go: `runner.On("ExecuteRun", mock.Anything, mock.AnythingOfType("pipeline.Spec"), mock.Anything, mock.Anything). Return(&pipeline.Run{}, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: mockValue, Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil)` $DIR/core/services/ocrcommon/data_source_test.go: `result.Error = assert.AnError` $DIR/core/services/ocrcommon/data_source_test.go: `call.Once()` $DIR/core/services/ocrcommon/data_source_test.go: `t.Run("test normal cache updater fail recovery", func(t *testing.T) { runner := pipelinemocks.NewRunner(t) ds := ocrcommon.NewInMemoryDataSource(runner, job.Job{}, pipeline.Spec{}, logger.TestLogger(t)) mockKVStore := mocks.KVStore{} mockKVStore.On("Store", mock.Anything, mock.Anything, mock.Anything).Return(nil) mockKVStore.On("Get", mock.Anything, mock.Anything).Return(nil, nil) dsCache, err := ocrcommon.NewInMemoryDataSourceCache(ds, &mockKVStore, &config.JuelsPerFeeCoinCache{UpdateInterval: models.Interval(time.Second * 2)}) require.NoError(t, err) servicetest.Run(t, dsCache) mockVal := int64(1) // Test if Observe notices that cache updater failed and can refresh the cache on its own // 1. Set initial value changeResultValue(runner, fmt.Sprint(mockVal), false, true) time.Sleep(time.Millisecond * 100) val, err := dsCache.Observe(testutils.Context(t), types.ReportTimestamp{}) require.NoError(t, err) assert.Equal(t, mockVal, val.Int64()) // 2. Set values again, but make it error in updater changeResultValue(runner, fmt.Sprint(mockVal+1), true, true) time.Sleep(time.Second*2 + time.Millisecond*100) // 3. Set value in between updates and call Observe (shouldn't flake because of huge wait time) changeResultValue(runner, fmt.Sprint(mockVal+2), false, false) val, err = dsCache.Observe(testutils.Context(t), types.ReportTimestamp{}) require.NoError(t, err) assert.Equal(t, mockVal+2, val.Int64()) })` $DIR/core/services/ocrcommon/data_source_test.go: `mockKVStore.On("Store", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/ocrcommon/data_source_test.go: `mockKVStore.On("Get", mock.Anything, mock.Anything).Return(nil, nil)` $DIR/core/services/ocrcommon/data_source_test.go: `servicetest.Run(t, dsCache)` $DIR/core/services/ocrcommon/data_source_test.go: `changeResultValue(runner, fmt.Sprint(mockVal), false, true)` $DIR/core/services/ocrcommon/data_source_test.go: `time.Sleep(time.Millisecond * 100)` $DIR/core/services/ocrcommon/data_source_test.go: `changeResultValue(runner, fmt.Sprint(mockVal+1), true, true)` $DIR/core/services/ocrcommon/data_source_test.go: `time.Sleep(time.Second*2 + time.Millisecond*100)` $DIR/core/services/ocrcommon/data_source_test.go: `changeResultValue(runner, fmt.Sprint(mockVal+2), false, false)` $DIR/core/services/ocrcommon/data_source_test.go: `val, err = dsCache.Observe(testutils.Context(t), types.ReportTimestamp{})` $DIR/core/services/ocrcommon/data_source_test.go: `t.Run("test total updater fail with persisted value recovery", func(t *testing.T) { runner := pipelinemocks.NewRunner(t) ds := ocrcommon.NewInMemoryDataSource(runner, job.Job{}, pipeline.Spec{}, logger.TestLogger(t)) mockKVStore := mocks.KVStore{} persistedVal := serializablebig.NewI(1337) result, err := json.Marshal(&ocrcommon.ResultTimePair{Result: *persistedVal, Time: time.Now()}) assert.NoError(t, err) mockKVStore.On("Get", mock.Anything, mock.Anything).Return(result, nil) // set updater to a long time so that it doesn't log errors after the test is done dsCache, err := ocrcommon.NewInMemoryDataSourceCache(ds, &mockKVStore, &config.JuelsPerFeeCoinCache{UpdateInterval: models.Interval(time.Hour * 100)}) require.NoError(t, err) changeResultValue(runner, "-1", true, false) servicetest.Run(t, dsCache) time.Sleep(time.Millisecond * 100) val, err := dsCache.Observe(testutils.Context(t), types.ReportTimestamp{}) require.NoError(t, err) assert.Equal(t, persistedVal.String(), val.String()) })` $DIR/core/services/ocrcommon/data_source_test.go: `mockKVStore.On("Get", mock.Anything, mock.Anything).Return(result, nil)` $DIR/core/services/ocrcommon/data_source_test.go: `changeResultValue(runner, "-1", true, false)` $DIR/core/services/ocrcommon/data_source_test.go: `servicetest.Run(t, dsCache)` $DIR/core/services/ocrcommon/data_source_test.go: `time.Sleep(time.Millisecond * 100)` $DIR/core/services/ocrcommon/data_source_test.go: `mockKVStore.On("Get", mock.Anything, mock.Anything).Return(nil, assert.AnError)` $DIR/core/services/ocrcommon/data_source_test.go: `changeResultValue(runner, "-1", true, false)` $DIR/core/services/ocrcommon/data_source_test.go: `servicetest.Run(t, dsCache)` $DIR/core/services/ocrcommon/data_source_test.go: `time.Sleep(time.Millisecond * 100)` $DIR/core/services/ocrcommon/data_source_test.go: `_, err = dsCache.Observe(testutils.Context(t), types.ReportTimestamp{})` $DIR/core/services/ocrcommon/data_source_test.go: `bridgeTask.BaseTask = pipeline.NewBaseTask(1, "ds1", []pipeline.TaskDependency{{ PropagateResult: true, InputTask: nil, }}, []pipeline.Task{&jsonParseTask}, 1)` $DIR/core/services/ocrcommon/data_source_test.go: `jsonParseTask.BaseTask = pipeline.NewBaseTask(2, "ds1_parse", []pipeline.TaskDependency{{ PropagateResult: false, InputTask: &bridgeTask, }}, []pipeline.Task{}, 2)` $DIR/core/services/ocrcommon/data_source_test.go: `runner.On("ExecuteRun", mock.Anything, mock.AnythingOfType("pipeline.Spec"), mock.Anything, mock.Anything). Return(&pipeline.Run{}, pipeline.TaskRunResults([]pipeline.TaskRunResult{ { Task: &bridgeTask, Result: pipeline.Result{}, }, { Result: pipeline.Result{Value: jsonParseTaskValue}, Task: &jsonParseTask, }, }), nil)` $DIR/core/services/ocrcommon/data_source_test.go: `runner.On("ExecuteRun", mock.Anything, mock.AnythingOfType("pipeline.Spec"), mock.Anything, mock.Anything). Return(&pipeline.Run{}, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: mockValue, Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil)` $DIR/core/services/ocrcommon/data_source_test.go: `runner.On("ExecuteRun", mock.Anything, mock.AnythingOfType("pipeline.Spec"), mock.Anything, mock.Anything). Return(&pipeline.Run{}, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: mockValue, Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil)` $DIR/core/services/ocrcommon/data_source_test.go: `.NewRunner(t)` $DIR/core/services/ocrcommon/data_source_test.go: `.On("ExecuteRun", mock.Anything, mock.AnythingOfType("pipeline.Spec"), mock.Anything, mock.Anything)` $DIR/core/services/ocrcommon/data_source_test.go: `.AnythingOfType("pipeline.Spec")` $DIR/core/services/ocrcommon/data_source_test.go: `. Return(&pipeline.Run{}, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: mockValue, Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil)` $DIR/core/services/ocrcommon/data_source_test.go: `.NewInMemoryDataSource(runner, job.Job{}, pipeline.Spec{}, logger.TestLogger(t))` $DIR/core/services/ocrcommon/data_source_test.go: `.TestLogger(t)` $DIR/core/services/ocrcommon/data_source_test.go: `.Observe(testutils.Context(t), types.ReportTimestamp{})` $DIR/core/services/ocrcommon/data_source_test.go: `.Context(t)` $DIR/core/services/ocrcommon/data_source_test.go: `.String()` $DIR/core/services/ocrcommon/data_source_test.go: `.On("ExecuteRun", mock.Anything, mock.AnythingOfType("pipeline.Spec"), mock.Anything, mock.Anything)` $DIR/core/services/ocrcommon/data_source_test.go: `.AnythingOfType("pipeline.Spec")` $DIR/core/services/ocrcommon/data_source_test.go: `. Return(&pipeline.Run{}, pipeline.TaskRunResults{ { Result: result, Task: &pipeline.HTTPTask{}, }, }, nil)` $DIR/core/services/ocrcommon/data_source_test.go: `.Once()` $DIR/core/services/ocrcommon/data_source_test.go: `.Run("test normal cache updater fail recovery", func(t *testing.T) { runner := pipelinemocks.NewRunner(t) ds := ocrcommon.NewInMemoryDataSource(runner, job.Job{}, pipeline.Spec{}, logger.TestLogger(t)) mockKVStore := mocks.KVStore{} mockKVStore.On("Store", mock.Anything, mock.Anything, mock.Anything).Return(nil) mockKVStore.On("Get", mock.Anything, mock.Anything).Return(nil, nil) dsCache, err := ocrcommon.NewInMemoryDataSourceCache(ds, &mockKVStore, &config.JuelsPerFeeCoinCache{UpdateInterval: models.Interval(time.Second * 2)}) require.NoError(t, err) servicetest.Run(t, dsCache) mockVal := int64(1) // Test if Observe notices that cache updater failed and can refresh the cache on its own // 1. Set initial value changeResultValue(runner, fmt.Sprint(mockVal), false, true) time.Sleep(time.Millisecond * 100) val, err := dsCache.Observe(testutils.Context(t), types.ReportTimestamp{}) require.NoError(t, err) assert.Equal(t, mockVal, val.Int64()) // 2. Set values again, but make it error in updater changeResultValue(runner, fmt.Sprint(mockVal+1), true, true) time.Sleep(time.Second*2 + time.Millisecond*100) // 3. Set value in between updates and call Observe (shouldn't flake because of huge wait time) changeResultValue(runner, fmt.Sprint(mockVal+2), false, false) val, err = dsCache.Observe(testutils.Context(t), types.ReportTimestamp{}) require.NoError(t, err) assert.Equal(t, mockVal+2, val.Int64()) })` $DIR/core/services/ocrcommon/data_source_test.go: `.NewRunner(t)` $DIR/core/services/ocrcommon/data_source_test.go: `.NewInMemoryDataSource(runner, job.Job{}, pipeline.Spec{}, logger.TestLogger(t))` $DIR/core/services/ocrcommon/data_source_test.go: `.TestLogger(t)` $DIR/core/services/ocrcommon/data_source_test.go: `.On("Store", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/ocrcommon/data_source_test.go: `.Return(nil)` $DIR/core/services/ocrcommon/data_source_test.go: `.On("Get", mock.Anything, mock.Anything)` $DIR/core/services/ocrcommon/data_source_test.go: `.Return(nil, nil)` $DIR/core/services/ocrcommon/data_source_test.go: `.NewInMemoryDataSourceCache(ds, &mockKVStore, &config.JuelsPerFeeCoinCache{UpdateInterval: models.Interval(time.Second * 2)})` $DIR/core/services/ocrcommon/data_source_test.go: `.Interval(time.Second * 2)` $DIR/core/services/ocrcommon/data_source_test.go: `.Run(t, dsCache)` $DIR/core/services/ocrcommon/data_source_test.go: `.Sprint(mockVal)` $DIR/core/services/ocrcommon/data_source_test.go: `.Sleep(time.Millisecond * 100)` $DIR/core/services/ocrcommon/data_source_test.go: `.Observe(testutils.Context(t), types.ReportTimestamp{})` $DIR/core/services/ocrcommon/data_source_test.go: `.Context(t)` $DIR/core/services/ocrcommon/data_source_test.go: `.Sprint(mockVal+1)` $DIR/core/services/ocrcommon/data_source_test.go: `.Sleep(time.Second*2 + time.Millisecond*100)` $DIR/core/services/ocrcommon/data_source_test.go: `.Sprint(mockVal+2)` $DIR/core/services/ocrcommon/data_source_test.go: `.Observe(testutils.Context(t), types.ReportTimestamp{})` $DIR/core/services/ocrcommon/data_source_test.go: `.Context(t)` $DIR/core/services/ocrcommon/data_source_test.go: `.Run("test total updater fail with persisted value recovery", func(t *testing.T) { runner := pipelinemocks.NewRunner(t) ds := ocrcommon.NewInMemoryDataSource(runner, job.Job{}, pipeline.Spec{}, logger.TestLogger(t)) mockKVStore := mocks.KVStore{} persistedVal := serializablebig.NewI(1337) result, err := json.Marshal(&ocrcommon.ResultTimePair{Result: *persistedVal, Time: time.Now()}) assert.NoError(t, err) mockKVStore.On("Get", mock.Anything, mock.Anything).Return(result, nil) // set updater to a long time so that it doesn't log errors after the test is done dsCache, err := ocrcommon.NewInMemoryDataSourceCache(ds, &mockKVStore, &config.JuelsPerFeeCoinCache{UpdateInterval: models.Interval(time.Hour * 100)}) require.NoError(t, err) changeResultValue(runner, "-1", true, false) servicetest.Run(t, dsCache) time.Sleep(time.Millisecond * 100) val, err := dsCache.Observe(testutils.Context(t), types.ReportTimestamp{}) require.NoError(t, err) assert.Equal(t, persistedVal.String(), val.String()) })` $DIR/core/services/ocrcommon/data_source_test.go: `.NewRunner(t)` $DIR/core/services/ocrcommon/data_source_test.go: `.NewInMemoryDataSource(runner, job.Job{}, pipeline.Spec{}, logger.TestLogger(t))` $DIR/core/services/ocrcommon/data_source_test.go: `.TestLogger(t)` $DIR/core/services/ocrcommon/data_source_test.go: `.NewI(1337)` $DIR/core/services/ocrcommon/data_source_test.go: `.Marshal(&ocrcommon.ResultTimePair{Result: *persistedVal, Time: time.Now()})` $DIR/core/services/ocrcommon/data_source_test.go: `.Now()` $DIR/core/services/ocrcommon/data_source_test.go: `.On("Get", mock.Anything, mock.Anything)` $DIR/core/services/ocrcommon/data_source_test.go: `.Return(result, nil)` $DIR/core/services/ocrcommon/data_source_test.go: `.NewInMemoryDataSourceCache(ds, &mockKVStore, &config.JuelsPerFeeCoinCache{UpdateInterval: models.Interval(time.Hour * 100)})` $DIR/core/services/ocrcommon/data_source_test.go: `.Interval(time.Hour * 100)` $DIR/core/services/ocrcommon/data_source_test.go: `.Run(t, dsCache)` $DIR/core/services/ocrcommon/data_source_test.go: `.Sleep(time.Millisecond * 100)` $DIR/core/services/ocrcommon/data_source_test.go: `.Observe(testutils.Context(t), types.ReportTimestamp{})` $DIR/core/services/ocrcommon/data_source_test.go: `.Context(t)` $DIR/core/services/ocrcommon/data_source_test.go: `.NewRunner(t)` $DIR/core/services/ocrcommon/data_source_test.go: `.NewInMemoryDataSource(runner, job.Job{}, pipeline.Spec{}, logger.TestLogger(t))` $DIR/core/services/ocrcommon/data_source_test.go: `.TestLogger(t)` $DIR/core/services/ocrcommon/data_source_test.go: `.On("Get", mock.Anything, mock.Anything)` $DIR/core/services/ocrcommon/data_source_test.go: `.Return(nil, assert.AnError)` $DIR/core/services/ocrcommon/data_source_test.go: `.NewInMemoryDataSourceCache(ds, &mockKVStore, &config.JuelsPerFeeCoinCache{UpdateInterval: models.Interval(time.Hour * 100)})` $DIR/core/services/ocrcommon/data_source_test.go: `.Interval(time.Hour * 100)` $DIR/core/services/ocrcommon/data_source_test.go: `.Run(t, dsCache)` $DIR/core/services/ocrcommon/data_source_test.go: `.Sleep(time.Millisecond * 100)` $DIR/core/services/ocrcommon/data_source_test.go: `.Observe(testutils.Context(t), types.ReportTimestamp{})` $DIR/core/services/ocrcommon/data_source_test.go: `.Context(t)` $DIR/core/services/ocrcommon/data_source_test.go: `.NewRunner(t)` $DIR/core/services/ocrcommon/data_source_test.go: `.NewBaseTask(1, "ds1", []pipeline.TaskDependency{{ PropagateResult: true, InputTask: nil, }}, []pipeline.Task{&jsonParseTask}, 1)` $DIR/core/services/ocrcommon/data_source_test.go: `.NewBaseTask(2, "ds1_parse", []pipeline.TaskDependency{{ PropagateResult: false, InputTask: &bridgeTask, }}, []pipeline.Task{}, 2)` $DIR/core/services/ocrcommon/data_source_test.go: `.On("ExecuteRun", mock.Anything, mock.AnythingOfType("pipeline.Spec"), mock.Anything, mock.Anything)` $DIR/core/services/ocrcommon/data_source_test.go: `.AnythingOfType("pipeline.Spec")` $DIR/core/services/ocrcommon/data_source_test.go: `. Return(&pipeline.Run{}, pipeline.TaskRunResults([]pipeline.TaskRunResult{ { Task: &bridgeTask, Result: pipeline.Result{}, }, { Result: pipeline.Result{Value: jsonParseTaskValue}, Task: &jsonParseTask, }, }), nil)` $DIR/core/services/ocrcommon/data_source_test.go: `.TaskRunResults([]pipeline.TaskRunResult{ { Task: &bridgeTask, Result: pipeline.Result{}, }, { Result: pipeline.Result{Value: jsonParseTaskValue}, Task: &jsonParseTask, }, })` $DIR/core/services/ocrcommon/data_source_test.go: `.NewInMemoryDataSource( runner, job.Job{ Type: "offchainreporting", }, pipeline.Spec{}, logger.TestLogger(t), )` $DIR/core/services/ocrcommon/data_source_test.go: `.TestLogger(t)` $DIR/core/services/ocrcommon/data_source_test.go: `.Observe(testutils.Context(t), types.ReportTimestamp{})` $DIR/core/services/ocrcommon/data_source_test.go: `.Context(t)` $DIR/core/services/ocrcommon/data_source_test.go: `.ToFloat64(jsonParseTaskValue)` $DIR/core/services/ocrcommon/data_source_test.go: `.ToFloat64(ocrcommon.PromBridgeJsonParseValues)` $DIR/core/services/ocrcommon/data_source_test.go: `.NewRunner(t)` $DIR/core/services/ocrcommon/data_source_test.go: `.On("ExecuteRun", mock.Anything, mock.AnythingOfType("pipeline.Spec"), mock.Anything, mock.Anything)` $DIR/core/services/ocrcommon/data_source_test.go: `.AnythingOfType("pipeline.Spec")` $DIR/core/services/ocrcommon/data_source_test.go: `. Return(&pipeline.Run{}, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: mockValue, Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil)` $DIR/core/services/ocrcommon/data_source_test.go: `.NewDataSourceV2(runner, job.Job{}, pipeline.Spec{}, logger.TestLogger(t), ms, nil)` $DIR/core/services/ocrcommon/data_source_test.go: `.TestLogger(t)` $DIR/core/services/ocrcommon/data_source_test.go: `.Observe(testutils.Context(t), types.ReportTimestamp{})` $DIR/core/services/ocrcommon/data_source_test.go: `.Context(t)` $DIR/core/services/ocrcommon/data_source_test.go: `.NewRunner(t)` $DIR/core/services/ocrcommon/data_source_test.go: `.On("ExecuteRun", mock.Anything, mock.AnythingOfType("pipeline.Spec"), mock.Anything, mock.Anything)` $DIR/core/services/ocrcommon/data_source_test.go: `.AnythingOfType("pipeline.Spec")` $DIR/core/services/ocrcommon/data_source_test.go: `. Return(&pipeline.Run{}, pipeline.TaskRunResults{ { Result: pipeline.Result{ Value: mockValue, Error: nil, }, Task: &pipeline.HTTPTask{}, }, }, nil)` $DIR/core/services/ocrcommon/data_source_test.go: `.NewDataSourceV1(runner, job.Job{}, pipeline.Spec{}, logger.TestLogger(t), ms, nil)` $DIR/core/services/ocrcommon/data_source_test.go: `.TestLogger(t)` $DIR/core/services/ocrcommon/data_source_test.go: `.Observe(testutils.Context(t), ocrtypes.ReportTimestamp{})` $DIR/core/services/ocrcommon/data_source_test.go: `.Context(t)` $DIR/core/services/ocrcommon/discoverer_database_test.go: `t.Run(fmt.Sprintf("%s StoreAnnouncement writes a value", tt.name), func(t *testing.T) { ann := []byte{1, 2, 3} err := dd1.StoreAnnouncement(ctx, "remote1", ann) assert.NoError(t, err) // test upsert ann = []byte{4, 5, 6} err = dd1.StoreAnnouncement(ctx, "remote1", ann) assert.NoError(t, err) // write a different value ann = []byte{7, 8, 9} err = dd1.StoreAnnouncement(ctx, "remote2", ann) assert.NoError(t, err) })` $DIR/core/services/ocrcommon/discoverer_database_test.go: `ann = []byte{4, 5, 6}` $DIR/core/services/ocrcommon/discoverer_database_test.go: `err = dd1.StoreAnnouncement(ctx, "remote1", ann)` $DIR/core/services/ocrcommon/discoverer_database_test.go: `ann = []byte{7, 8, 9}` $DIR/core/services/ocrcommon/discoverer_database_test.go: `err = dd1.StoreAnnouncement(ctx, "remote2", ann)` $DIR/core/services/ocrcommon/discoverer_database_test.go: `t.Run(fmt.Sprintf("%s ReadAnnouncements reads values filtered by given peerIDs", tt.name), func(t *testing.T) { announcements, err := dd1.ReadAnnouncements(ctx, []string{"remote1", "remote2"}) require.NoError(t, err) assert.Len(t, announcements, 2) assert.Equal(t, []byte{4, 5, 6}, announcements["remote1"]) assert.Equal(t, []byte{7, 8, 9}, announcements["remote2"]) announcements, err = dd1.ReadAnnouncements(ctx, []string{"remote1"}) require.NoError(t, err) assert.Len(t, announcements, 1) assert.Equal(t, []byte{4, 5, 6}, announcements["remote1"]) })` $DIR/core/services/ocrcommon/discoverer_database_test.go: `announcements, err = dd1.ReadAnnouncements(ctx, []string{"remote1"})` $DIR/core/services/ocrcommon/discoverer_database_test.go: `t.Run(fmt.Sprintf("%s is scoped to local peer ID", tt.name), func(t *testing.T) { ann := []byte{10, 11, 12} err := dd2.StoreAnnouncement(ctx, "remote1", ann) assert.NoError(t, err) announcements, err := dd2.ReadAnnouncements(ctx, []string{"remote1"}) require.NoError(t, err) assert.Len(t, announcements, 1) assert.Equal(t, []byte{10, 11, 12}, announcements["remote1"]) announcements, err = dd1.ReadAnnouncements(ctx, []string{"remote1"}) require.NoError(t, err) assert.Len(t, announcements, 1) assert.Equal(t, []byte{4, 5, 6}, announcements["remote1"]) })` $DIR/core/services/ocrcommon/discoverer_database_test.go: `announcements, err = dd1.ReadAnnouncements(ctx, []string{"remote1"})` $DIR/core/services/ocrcommon/discoverer_database_test.go: `t.Run(fmt.Sprintf("%s persists data across restarts", tt.name), func(t *testing.T) { dd3 := ocrcommon.NewOCRDiscovererDatabase(db, localPeerID1.Raw()) announcements, err := dd3.ReadAnnouncements(ctx, []string{"remote1"}) require.NoError(t, err) assert.Len(t, announcements, 1) assert.Equal(t, []byte{4, 5, 6}, announcements["remote1"]) })` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.NewSqlxDB(t)` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.NewOCRDiscovererDatabase(db, localPeerID1.Raw())` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.Raw()` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.NewOCRDiscovererDatabase(db, localPeerID2.Raw())` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.Raw()` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.NewDON2DONDiscovererDatabase(db, localPeerID1.Raw())` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.Raw()` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.NewDON2DONDiscovererDatabase(db, localPeerID2.Raw())` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.Raw()` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.Context(t)` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.Run(fmt.Sprintf("%s StoreAnnouncement writes a value", tt.name), func(t *testing.T) { ann := []byte{1, 2, 3} err := dd1.StoreAnnouncement(ctx, "remote1", ann) assert.NoError(t, err) // test upsert ann = []byte{4, 5, 6} err = dd1.StoreAnnouncement(ctx, "remote1", ann) assert.NoError(t, err) // write a different value ann = []byte{7, 8, 9} err = dd1.StoreAnnouncement(ctx, "remote2", ann) assert.NoError(t, err) })` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.Sprintf("%s StoreAnnouncement writes a value", tt.name)` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.StoreAnnouncement(ctx, "remote1", ann)` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.StoreAnnouncement(ctx, "remote1", ann)` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.StoreAnnouncement(ctx, "remote2", ann)` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.Run(fmt.Sprintf("%s ReadAnnouncements reads values filtered by given peerIDs", tt.name), func(t *testing.T) { announcements, err := dd1.ReadAnnouncements(ctx, []string{"remote1", "remote2"}) require.NoError(t, err) assert.Len(t, announcements, 2) assert.Equal(t, []byte{4, 5, 6}, announcements["remote1"]) assert.Equal(t, []byte{7, 8, 9}, announcements["remote2"]) announcements, err = dd1.ReadAnnouncements(ctx, []string{"remote1"}) require.NoError(t, err) assert.Len(t, announcements, 1) assert.Equal(t, []byte{4, 5, 6}, announcements["remote1"]) })` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.Sprintf("%s ReadAnnouncements reads values filtered by given peerIDs", tt.name)` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.ReadAnnouncements(ctx, []string{"remote1", "remote2"})` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.ReadAnnouncements(ctx, []string{"remote1"})` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.Run(fmt.Sprintf("%s is scoped to local peer ID", tt.name), func(t *testing.T) { ann := []byte{10, 11, 12} err := dd2.StoreAnnouncement(ctx, "remote1", ann) assert.NoError(t, err) announcements, err := dd2.ReadAnnouncements(ctx, []string{"remote1"}) require.NoError(t, err) assert.Len(t, announcements, 1) assert.Equal(t, []byte{10, 11, 12}, announcements["remote1"]) announcements, err = dd1.ReadAnnouncements(ctx, []string{"remote1"}) require.NoError(t, err) assert.Len(t, announcements, 1) assert.Equal(t, []byte{4, 5, 6}, announcements["remote1"]) })` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.Sprintf("%s is scoped to local peer ID", tt.name)` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.StoreAnnouncement(ctx, "remote1", ann)` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.ReadAnnouncements(ctx, []string{"remote1"})` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.ReadAnnouncements(ctx, []string{"remote1"})` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.Run(fmt.Sprintf("%s persists data across restarts", tt.name), func(t *testing.T) { dd3 := ocrcommon.NewOCRDiscovererDatabase(db, localPeerID1.Raw()) announcements, err := dd3.ReadAnnouncements(ctx, []string{"remote1"}) require.NoError(t, err) assert.Len(t, announcements, 1) assert.Equal(t, []byte{4, 5, 6}, announcements["remote1"]) })` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.Sprintf("%s persists data across restarts", tt.name)` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.NewOCRDiscovererDatabase(db, localPeerID1.Raw())` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.Raw()` $DIR/core/services/ocrcommon/discoverer_database_test.go: `.ReadAnnouncements(ctx, []string{"remote1"})` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `t.Run("with no p2p keys returns error", func(t *testing.T) { cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.P2P.V2.Enabled = ptr(true) }) keyStore := cltest.NewKeyStore(t, db) pw := ocrcommon.NewSingletonPeerWrapper(keyStore, cfg.P2P(), cfg.OCR(), db, logger.TestLogger(t)) require.Contains(t, pw.Start(testutils.Context(t)).Error(), "No P2P keys found in keystore. Peer wrapper will not be fully initialized") })` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `c.P2P.V2.Enabled = ptr(true)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `t.Run("with one p2p key and matching P2P.PeerID returns nil", func(t *testing.T) { ctx := testutils.Context(t) keyStore := cltest.NewKeyStore(t, db) k, err := keyStore.P2P().Create(ctx) require.NoError(t, err) cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.P2P.V2.Enabled = ptr(true) c.P2P.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", freeport.GetOne(t))} c.P2P.PeerID = ptr(k.PeerID()) }) pw := ocrcommon.NewSingletonPeerWrapper(keyStore, cfg.P2P(), cfg.OCR(), db, logger.TestLogger(t)) servicetest.Run(t, pw) require.Equal(t, k.PeerID(), pw.PeerID) })` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `c.P2P.V2.Enabled = ptr(true)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `c.P2P.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", freeport.GetOne(t))}` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `c.P2P.PeerID = ptr(k.PeerID())` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `servicetest.Run(t, pw)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `t.Run("with one p2p key and mismatching P2P.PeerID returns error", func(t *testing.T) { ctx := testutils.Context(t) cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.P2P.V2.Enabled = ptr(true) c.P2P.PeerID = ptr(p2pkey.PeerID(peerID)) }) keyStore := cltest.NewKeyStore(t, db) _, err := keyStore.P2P().Create(ctx) require.NoError(t, err) pw := ocrcommon.NewSingletonPeerWrapper(keyStore, cfg.P2P(), cfg.OCR(), db, logger.TestLogger(t)) require.Contains(t, pw.Start(testutils.Context(t)).Error(), "unable to find P2P key with id") })` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `c.P2P.V2.Enabled = ptr(true)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `c.P2P.PeerID = ptr(p2pkey.PeerID(peerID))` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `t.Run("with multiple p2p keys and valid P2P.PeerID returns nil", func(t *testing.T) { ctx := testutils.Context(t) keyStore := cltest.NewKeyStore(t, db) k2, err := keyStore.P2P().Create(ctx) require.NoError(t, err) cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.P2P.V2.Enabled = ptr(true) c.P2P.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", freeport.GetOne(t))} c.P2P.PeerID = ptr(k2.PeerID()) }) pw := ocrcommon.NewSingletonPeerWrapper(keyStore, cfg.P2P(), cfg.OCR(), db, logger.TestLogger(t)) servicetest.Run(t, pw) require.Equal(t, k2.PeerID(), pw.PeerID) })` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `c.P2P.V2.Enabled = ptr(true)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `c.P2P.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", freeport.GetOne(t))}` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `c.P2P.PeerID = ptr(k2.PeerID())` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `servicetest.Run(t, pw)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `c.P2P.V2.Enabled = ptr(true)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `c.P2P.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", freeport.GetOne(t))}` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `c.P2P.PeerID = ptr(p2pkey.PeerID(peerID))` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `c.P2P.V2.Enabled = ptr(true)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `c.P2P.PeerID = ptr(k.PeerID())` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `c.P2P.V2.DeltaDial = commonconfig.MustNewDuration(100 * time.Millisecond)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `c.P2P.V2.DeltaReconcile = commonconfig.MustNewDuration(1 * time.Second)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `c.P2P.V2.ListenAddresses = ptr(p2paddresses)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `c.P2P.V2.AnnounceAddresses = ptr(p2paddresses)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `pw = ocrcommon.NewSingletonPeerWrapper(keyStore, cfg.P2P(), cfg.OCR(), db, logger.TestLogger(t))` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.NewSqlxDB(t)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.Run("with no p2p keys returns error", func(t *testing.T) { cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.P2P.V2.Enabled = ptr(true) }) keyStore := cltest.NewKeyStore(t, db) pw := ocrcommon.NewSingletonPeerWrapper(keyStore, cfg.P2P(), cfg.OCR(), db, logger.TestLogger(t)) require.Contains(t, pw.Start(testutils.Context(t)).Error(), "No P2P keys found in keystore. Peer wrapper will not be fully initialized") })` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.P2P.V2.Enabled = ptr(true) })` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.NewKeyStore(t, db)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.NewSingletonPeerWrapper(keyStore, cfg.P2P(), cfg.OCR(), db, logger.TestLogger(t))` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.P2P()` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.OCR()` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.TestLogger(t)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.Run("with one p2p key and matching P2P.PeerID returns nil", func(t *testing.T) { ctx := testutils.Context(t) keyStore := cltest.NewKeyStore(t, db) k, err := keyStore.P2P().Create(ctx) require.NoError(t, err) cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.P2P.V2.Enabled = ptr(true) c.P2P.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", freeport.GetOne(t))} c.P2P.PeerID = ptr(k.PeerID()) }) pw := ocrcommon.NewSingletonPeerWrapper(keyStore, cfg.P2P(), cfg.OCR(), db, logger.TestLogger(t)) servicetest.Run(t, pw) require.Equal(t, k.PeerID(), pw.PeerID) })` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.Context(t)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.NewKeyStore(t, db)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.P2P()` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.Create(ctx)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.P2P.V2.Enabled = ptr(true) c.P2P.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", freeport.GetOne(t))} c.P2P.PeerID = ptr(k.PeerID()) })` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.Sprintf("127.0.0.1:%d", freeport.GetOne(t))` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.GetOne(t)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.PeerID()` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.NewSingletonPeerWrapper(keyStore, cfg.P2P(), cfg.OCR(), db, logger.TestLogger(t))` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.P2P()` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.OCR()` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.TestLogger(t)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.Run(t, pw)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.Run("with one p2p key and mismatching P2P.PeerID returns error", func(t *testing.T) { ctx := testutils.Context(t) cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.P2P.V2.Enabled = ptr(true) c.P2P.PeerID = ptr(p2pkey.PeerID(peerID)) }) keyStore := cltest.NewKeyStore(t, db) _, err := keyStore.P2P().Create(ctx) require.NoError(t, err) pw := ocrcommon.NewSingletonPeerWrapper(keyStore, cfg.P2P(), cfg.OCR(), db, logger.TestLogger(t)) require.Contains(t, pw.Start(testutils.Context(t)).Error(), "unable to find P2P key with id") })` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.Context(t)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.P2P.V2.Enabled = ptr(true) c.P2P.PeerID = ptr(p2pkey.PeerID(peerID)) })` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.PeerID(peerID)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.NewKeyStore(t, db)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.P2P()` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.Create(ctx)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.NewSingletonPeerWrapper(keyStore, cfg.P2P(), cfg.OCR(), db, logger.TestLogger(t))` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.P2P()` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.OCR()` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.TestLogger(t)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.Run("with multiple p2p keys and valid P2P.PeerID returns nil", func(t *testing.T) { ctx := testutils.Context(t) keyStore := cltest.NewKeyStore(t, db) k2, err := keyStore.P2P().Create(ctx) require.NoError(t, err) cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.P2P.V2.Enabled = ptr(true) c.P2P.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", freeport.GetOne(t))} c.P2P.PeerID = ptr(k2.PeerID()) }) pw := ocrcommon.NewSingletonPeerWrapper(keyStore, cfg.P2P(), cfg.OCR(), db, logger.TestLogger(t)) servicetest.Run(t, pw) require.Equal(t, k2.PeerID(), pw.PeerID) })` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.Context(t)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.NewKeyStore(t, db)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.P2P()` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.Create(ctx)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.P2P.V2.Enabled = ptr(true) c.P2P.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", freeport.GetOne(t))} c.P2P.PeerID = ptr(k2.PeerID()) })` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.Sprintf("127.0.0.1:%d", freeport.GetOne(t))` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.GetOne(t)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.PeerID()` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.NewSingletonPeerWrapper(keyStore, cfg.P2P(), cfg.OCR(), db, logger.TestLogger(t))` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.P2P()` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.OCR()` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.TestLogger(t)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.Run(t, pw)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.Context(t)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.P2P.V2.Enabled = ptr(true) c.P2P.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", freeport.GetOne(t))} c.P2P.PeerID = ptr(p2pkey.PeerID(peerID)) })` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.Sprintf("127.0.0.1:%d", freeport.GetOne(t))` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.GetOne(t)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.PeerID(peerID)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.NewKeyStore(t, db)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.P2P()` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.Create(ctx)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.NewSingletonPeerWrapper(keyStore, cfg.P2P(), cfg.OCR(), db, logger.TestLogger(t))` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.P2P()` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.OCR()` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.TestLogger(t)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.Context(t)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.NewSqlxDB(t)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.NewKeyStore(t, db)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.P2P()` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.Create(ctx)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.P2P.V2.Enabled = ptr(true) c.P2P.PeerID = ptr(k.PeerID()) c.P2P.V2.DeltaDial = commonconfig.MustNewDuration(100 * time.Millisecond) c.P2P.V2.DeltaReconcile = commonconfig.MustNewDuration(1 * time.Second) p2paddresses := []string{ "127.0.0.1:17193", } c.P2P.V2.ListenAddresses = ptr(p2paddresses) c.P2P.V2.AnnounceAddresses = ptr(p2paddresses) })` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.PeerID()` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.MustNewDuration(100 * time.Millisecond)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.MustNewDuration(1 * time.Second)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.NewSingletonPeerWrapper(keyStore, cfg.P2P(), cfg.OCR(), db, logger.TestLogger(t))` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.P2P()` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.OCR()` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.TestLogger(t)` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.NewSingletonPeerWrapper(keyStore, cfg.P2P(), cfg.OCR(), db, logger.TestLogger(t))` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.P2P()` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.OCR()` $DIR/core/services/ocrcommon/peer_wrapper_test.go: `.TestLogger(t)` $DIR/core/services/ocrcommon/run_saver_test.go: `servicetest.Run(t, rs)` $DIR/core/services/ocrcommon/run_saver_test.go: `pipelineRunner.On("InsertFinishedRun", mock.Anything, mock.Anything, mock.Anything, mock.Anything). Return(nil). Run(func(args mock.Arguments) { args.Get(2).(*pipeline.Run).ID = int64(d) }). Once()` $DIR/core/services/ocrcommon/run_saver_test.go: `args.Get(2).(*pipeline.Run).ID = int64(d)` $DIR/core/services/ocrcommon/run_saver_test.go: `rs.Save(&pipeline.Run{ID: int64(i)})` $DIR/core/services/ocrcommon/run_saver_test.go: `.NewRunner(t)` $DIR/core/services/ocrcommon/run_saver_test.go: `.TestLogger(t)` $DIR/core/services/ocrcommon/run_saver_test.go: `.Run(t, rs)` $DIR/core/services/ocrcommon/run_saver_test.go: `.On("InsertFinishedRun", mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/ocrcommon/run_saver_test.go: `. Return(nil)` $DIR/core/services/ocrcommon/run_saver_test.go: `. Run(func(args mock.Arguments) { args.Get(2).(*pipeline.Run).ID = int64(d) })` $DIR/core/services/ocrcommon/run_saver_test.go: `.Get(2)` $DIR/core/services/ocrcommon/run_saver_test.go: `. Once()` $DIR/core/services/ocrcommon/run_saver_test.go: `.Save(&pipeline.Run{ID: int64(i)})` $DIR/core/services/ocrcommon/telemetry_test.go: `j.Type = job.Type(pipeline.OffchainReportingJobType)` $DIR/core/services/ocrcommon/telemetry_test.go: `j.OCROracleSpec.CaptureEATelemetry = false` $DIR/core/services/ocrcommon/telemetry_test.go: `j.Type = job.Type(pipeline.OffchainReporting2JobType)` $DIR/core/services/ocrcommon/telemetry_test.go: `j.OCR2OracleSpec.CaptureEATelemetry = false` $DIR/core/services/ocrcommon/telemetry_test.go: `j.Type = job.Type(pipeline.VRFJobType)` $DIR/core/services/ocrcommon/telemetry_test.go: `j.Type = job.Type(pipeline.OffchainReportingJobType)` $DIR/core/services/ocrcommon/telemetry_test.go: `j.OCROracleSpec.ContractAddress = contractAddress` $DIR/core/services/ocrcommon/telemetry_test.go: `j.Type = job.Type(pipeline.OffchainReporting2JobType)` $DIR/core/services/ocrcommon/telemetry_test.go: `j.OCR2OracleSpec.ContractID = contractAddress.String()` $DIR/core/services/ocrcommon/telemetry_test.go: `j.Type = job.Type(pipeline.VRFJobType)` $DIR/core/services/ocrcommon/telemetry_test.go: `j.Type = job.Type(pipeline.OffchainReportingJobType)` $DIR/core/services/ocrcommon/telemetry_test.go: `j.OCROracleSpec.EVMChainID = (*ubig.Big)(big.NewInt(1234567890))` $DIR/core/services/ocrcommon/telemetry_test.go: `j.Type = job.Type(pipeline.OffchainReporting2JobType)` $DIR/core/services/ocrcommon/telemetry_test.go: `j.OCR2OracleSpec.RelayConfig = make(map[string]interface{})` $DIR/core/services/ocrcommon/telemetry_test.go: `j.OCR2OracleSpec.RelayConfig["chainID"] = "foo"` $DIR/core/services/ocrcommon/telemetry_test.go: `j.Type = job.Type(pipeline.VRFJobType)` $DIR/core/services/ocrcommon/telemetry_test.go: `_, err = parseEATelemetry(nil)` $DIR/core/services/ocrcommon/telemetry_test.go: `trrs[1].Result.Value = nil` $DIR/core/services/ocrcommon/telemetry_test.go: `resp = getJsonParsedValue(trrs[0], &trrs)` $DIR/core/services/ocrcommon/telemetry_test.go: `resp = getJsonParsedValue(trrs[1], &trrs)` $DIR/core/services/ocrcommon/telemetry_test.go: `ingressClient.On("Send", mock.Anything, mock.AnythingOfType("[]uint8"), mock.AnythingOfType("string"), mock.AnythingOfType("TelemetryType")).Return().Run(func(args mock.Arguments) { sentMessage = args[1].([]byte) wg.Done() })` $DIR/core/services/ocrcommon/telemetry_test.go: `sentMessage = args[1].([]byte)` $DIR/core/services/ocrcommon/telemetry_test.go: `wg.Done()` $DIR/core/services/ocrcommon/telemetry_test.go: `servicetest.Run(t, enhancedTelemService)` $DIR/core/services/ocrcommon/telemetry_test.go: `wg.Add(1)` $DIR/core/services/ocrcommon/telemetry_test.go: `enhancedTelemChan <- EnhancedTelemetryData{ TaskRunResults: trrs, FinalResults: fr, RepTimestamp: observationTimestamp, }` $DIR/core/services/ocrcommon/telemetry_test.go: `wg.Wait()` $DIR/core/services/ocrcommon/telemetry_test.go: `obs = e.getObservation(finalResult)` $DIR/core/services/ocrcommon/telemetry_test.go: `ingressClient.On("Send", mock.Anything, mock.AnythingOfType("[]uint8"), mock.AnythingOfType("string"), mock.AnythingOfType("TelemetryType")).Return().Run(func(args mock.Arguments) { wg.Done() })` $DIR/core/services/ocrcommon/telemetry_test.go: `wg.Done()` $DIR/core/services/ocrcommon/telemetry_test.go: `servicetest.Run(t, enhancedTelemService)` $DIR/core/services/ocrcommon/telemetry_test.go: `wg.Add(1)` $DIR/core/services/ocrcommon/telemetry_test.go: `enhancedTelemChan <- EnhancedTelemetryData{ TaskRunResults: *badTrrs, FinalResults: *finalResult, RepTimestamp: observationTimestamp, }` $DIR/core/services/ocrcommon/telemetry_test.go: `wg.Wait()` $DIR/core/services/ocrcommon/telemetry_test.go: `badTrrs = &pipeline.TaskRunResults{ pipeline.TaskRunResult{ Task: &pipeline.BridgeTask{ BaseTask: pipeline.NewBaseTask(0, "ds1", nil, nil, 0), }, Result: pipeline.Result{ Value: "[]", }, }}` $DIR/core/services/ocrcommon/telemetry_test.go: `enhancedTelemChan <- EnhancedTelemetryData{ TaskRunResults: *badTrrs, FinalResults: *finalResult, RepTimestamp: observationTimestamp, }` $DIR/core/services/ocrcommon/telemetry_test.go: `wg.Wait()` $DIR/core/services/ocrcommon/telemetry_test.go: `benchmarkPrice, bid, ask = e.getPricesFromResults(trrsMercuryV1[0], pipeline.TaskRunResults{}, 1)` $DIR/core/services/ocrcommon/telemetry_test.go: `e.getPricesFromResults(trrsMercuryV1[0], tt, 1)` $DIR/core/services/ocrcommon/telemetry_test.go: `tt = trrsMercuryV1[:3]` $DIR/core/services/ocrcommon/telemetry_test.go: `e.getPricesFromResults(trrsMercuryV1[0], tt, 1)` $DIR/core/services/ocrcommon/telemetry_test.go: `benchmarkPrice, bid, ask = e.getPricesFromResults(trrsMercuryV1[0], trrs2, 3)` $DIR/core/services/ocrcommon/telemetry_test.go: `benchmarkPrice, bid, ask = e.getPricesFromResults(trrsMercuryV1[0], trrsMercuryV2, 2)` $DIR/core/services/ocrcommon/telemetry_test.go: `j.OCR2OracleSpec.CaptureEATelemetry = false` $DIR/core/services/ocrcommon/telemetry_test.go: `j.OCR2OracleSpec.CaptureEATelemetry = true` $DIR/core/services/ocrcommon/telemetry_test.go: `j.Type = job.Type(pipeline.CronJobType)` $DIR/core/services/ocrcommon/telemetry_test.go: `ingressClient.On("Send", mock.Anything, mock.AnythingOfType("[]uint8"), mock.AnythingOfType("string"), mock.AnythingOfType("TelemetryType")).Return().Run(func(args mock.Arguments) { sentMessage = args[1].([]byte) wg.Done() })` $DIR/core/services/ocrcommon/telemetry_test.go: `sentMessage = args[1].([]byte)` $DIR/core/services/ocrcommon/telemetry_test.go: `wg.Done()` $DIR/core/services/ocrcommon/telemetry_test.go: `servicetest.Run(t, &e)` $DIR/core/services/ocrcommon/telemetry_test.go: `wg.Add(1)` $DIR/core/services/ocrcommon/telemetry_test.go: `chTelem <- EnhancedTelemetryMercuryData{ TaskRunResults: trrsMercuryV1, V1Observation: &mercuryv1.Observation{ BenchmarkPrice: mercury.ObsResult[*big.Int]{Val: big.NewInt(111111)}, Bid: mercury.ObsResult[*big.Int]{Val: big.NewInt(222222)}, Ask: mercury.ObsResult[*big.Int]{Val: big.NewInt(333333)}, CurrentBlockNum: mercury.ObsResult[int64]{Val: 123456789}, CurrentBlockHash: mercury.ObsResult[[]byte]{Val: common.HexToHash("0x123321").Bytes()}, CurrentBlockTimestamp: mercury.ObsResult[uint64]{Val: 987654321}, }, RepTimestamp: types.ReportTimestamp{ ConfigDigest: types.ConfigDigest{2}, Epoch: 11, Round: 22, }, }` $DIR/core/services/ocrcommon/telemetry_test.go: `wg.Wait()` $DIR/core/services/ocrcommon/telemetry_test.go: `chTelem <- EnhancedTelemetryMercuryData{ TaskRunResults: pipeline.TaskRunResults{ pipeline.TaskRunResult{Task: &pipeline.BridgeTask{ Name: "test-mercury-bridge-1", BaseTask: pipeline.NewBaseTask(0, "ds1", nil, nil, 0), }, Result: pipeline.Result{ Value: nil, }}, }, V1Observation: &mercuryv1.Observation{}, RepTimestamp: types.ReportTimestamp{ ConfigDigest: types.ConfigDigest{2}, Epoch: 11, Round: 22, }, }` $DIR/core/services/ocrcommon/telemetry_test.go: `wg.Add(1)` $DIR/core/services/ocrcommon/telemetry_test.go: `trrsMercuryV1[0].Result.Value = ""` $DIR/core/services/ocrcommon/telemetry_test.go: `chTelem <- EnhancedTelemetryMercuryData{ TaskRunResults: trrsMercuryV1, V1Observation: &mercuryv1.Observation{}, RepTimestamp: types.ReportTimestamp{ ConfigDigest: types.ConfigDigest{2}, Epoch: 11, Round: 22, }, }` $DIR/core/services/ocrcommon/telemetry_test.go: `wg.Wait()` $DIR/core/services/ocrcommon/telemetry_test.go: `ingressClient.On("Send", mock.Anything, mock.AnythingOfType("[]uint8"), mock.AnythingOfType("string"), mock.AnythingOfType("TelemetryType")).Return().Run(func(args mock.Arguments) { sentMessage = args[1].([]byte) wg.Done() })` $DIR/core/services/ocrcommon/telemetry_test.go: `sentMessage = args[1].([]byte)` $DIR/core/services/ocrcommon/telemetry_test.go: `wg.Done()` $DIR/core/services/ocrcommon/telemetry_test.go: `servicetest.Run(t, &e)` $DIR/core/services/ocrcommon/telemetry_test.go: `wg.Add(1)` $DIR/core/services/ocrcommon/telemetry_test.go: `chTelem <- EnhancedTelemetryMercuryData{ TaskRunResults: trrsMercuryV2, V2Observation: &mercuryv2.Observation{ BenchmarkPrice: mercury.ObsResult[*big.Int]{Val: big.NewInt(111111)}, MaxFinalizedTimestamp: mercury.ObsResult[int64]{Val: 321}, LinkPrice: mercury.ObsResult[*big.Int]{Val: big.NewInt(4321)}, NativePrice: mercury.ObsResult[*big.Int]{Val: big.NewInt(54321)}, }, RepTimestamp: types.ReportTimestamp{ ConfigDigest: types.ConfigDigest{2}, Epoch: 11, Round: 22, }, }` $DIR/core/services/ocrcommon/telemetry_test.go: `wg.Wait()` $DIR/core/services/ocrcommon/telemetry_test.go: `chTelem <- EnhancedTelemetryMercuryData{ TaskRunResults: pipeline.TaskRunResults{ pipeline.TaskRunResult{Task: &pipeline.BridgeTask{ Name: "test-mercury-bridge-2", BaseTask: pipeline.NewBaseTask(0, "ds1", nil, nil, 0), }, Result: pipeline.Result{ Value: nil, }}, }, V2Observation: &mercuryv2.Observation{}, RepTimestamp: types.ReportTimestamp{ ConfigDigest: types.ConfigDigest{2}, Epoch: 11, Round: 22, }, }` $DIR/core/services/ocrcommon/telemetry_test.go: `wg.Add(1)` $DIR/core/services/ocrcommon/telemetry_test.go: `trrsMercuryV2[0].Result.Value = ""` $DIR/core/services/ocrcommon/telemetry_test.go: `chTelem <- EnhancedTelemetryMercuryData{ TaskRunResults: trrsMercuryV2, V2Observation: &mercuryv2.Observation{}, RepTimestamp: types.ReportTimestamp{ ConfigDigest: types.ConfigDigest{2}, Epoch: 11, Round: 22, }, }` $DIR/core/services/ocrcommon/telemetry_test.go: `wg.Wait()` $DIR/core/services/ocrcommon/telemetry_test.go: `.Type(pipeline.OffchainReportingJobType)` $DIR/core/services/ocrcommon/telemetry_test.go: `.Type(pipeline.OffchainReporting2JobType)` $DIR/core/services/ocrcommon/telemetry_test.go: `.Type(pipeline.VRFJobType)` $DIR/core/services/ocrcommon/telemetry_test.go: `.EIP55Address(utils.RandomAddress().String())` $DIR/core/services/ocrcommon/telemetry_test.go: `.RandomAddress()` $DIR/core/services/ocrcommon/telemetry_test.go: `.String()` $DIR/core/services/ocrcommon/telemetry_test.go: `.Type(pipeline.OffchainReportingJobType)` $DIR/core/services/ocrcommon/telemetry_test.go: `.Type(pipeline.OffchainReporting2JobType)` $DIR/core/services/ocrcommon/telemetry_test.go: `.String()` $DIR/core/services/ocrcommon/telemetry_test.go: `.Type(pipeline.VRFJobType)` $DIR/core/services/ocrcommon/telemetry_test.go: `.getContract()` $DIR/core/services/ocrcommon/telemetry_test.go: `.Type(pipeline.OffchainReportingJobType)` $DIR/core/services/ocrcommon/telemetry_test.go: `.NewInt(1234567890)` $DIR/core/services/ocrcommon/telemetry_test.go: `.Type(pipeline.OffchainReporting2JobType)` $DIR/core/services/ocrcommon/telemetry_test.go: `.Type(pipeline.VRFJobType)` $DIR/core/services/ocrcommon/telemetry_test.go: `.getChainID()` $DIR/core/services/ocrcommon/telemetry_test.go: `.NewTelemetryService(t)` $DIR/core/services/ocrcommon/telemetry_test.go: `.NewIngressAgentWrapper(ingressClient)` $DIR/core/services/ocrcommon/telemetry_test.go: `.GenMonitoringEndpoint("test-network", "test-chainID", "0xa", synchronization.EnhancedEA)` $DIR/core/services/ocrcommon/telemetry_test.go: `.On("Send", mock.Anything, mock.AnythingOfType("[]uint8"), mock.AnythingOfType("string"), mock.AnythingOfType("TelemetryType"))` $DIR/core/services/ocrcommon/telemetry_test.go: `.AnythingOfType("[]uint8")` $DIR/core/services/ocrcommon/telemetry_test.go: `.AnythingOfType("string")` $DIR/core/services/ocrcommon/telemetry_test.go: `.AnythingOfType("TelemetryType")` $DIR/core/services/ocrcommon/telemetry_test.go: `.Return()` $DIR/core/services/ocrcommon/telemetry_test.go: `.Run(func(args mock.Arguments) { sentMessage = args[1].([]byte) wg.Done() })` $DIR/core/services/ocrcommon/telemetry_test.go: `.Done()` $DIR/core/services/ocrcommon/telemetry_test.go: `.RandomAddress()` $DIR/core/services/ocrcommon/telemetry_test.go: `.Type(pipeline.OffchainReportingJobType)` $DIR/core/services/ocrcommon/telemetry_test.go: `.EIP55AddressFromAddress(feedAddress)` $DIR/core/services/ocrcommon/telemetry_test.go: `.NewInt(9)` $DIR/core/services/ocrcommon/telemetry_test.go: `.TestLoggerObserved(t, zap.WarnLevel)` $DIR/core/services/ocrcommon/telemetry_test.go: `.Named("Enhanced Telemetry Mercury")` $DIR/core/services/ocrcommon/telemetry_test.go: `.Run(t, enhancedTelemService)` $DIR/core/services/ocrcommon/telemetry_test.go: `.NewBaseTask(0, "ds1", nil, nil, 0)` $DIR/core/services/ocrcommon/telemetry_test.go: `.NewBaseTask(1, "ds1", nil, nil, 1)` $DIR/core/services/ocrcommon/telemetry_test.go: `.Add(1)` $DIR/core/services/ocrcommon/telemetry_test.go: `.CreatedAt.UnixMilli()` $DIR/core/services/ocrcommon/telemetry_test.go: `.FinishedAt.Time.UnixMilli()` $DIR/core/services/ocrcommon/telemetry_test.go: `.String()` $DIR/core/services/ocrcommon/telemetry_test.go: `.Marshal(&expectedTelemetry)` $DIR/core/services/ocrcommon/telemetry_test.go: `.Wait()` $DIR/core/services/ocrcommon/telemetry_test.go: `.TestLoggerObserved(t, zap.WarnLevel)` $DIR/core/services/ocrcommon/telemetry_test.go: `.getObservation(&pipeline.FinalResult{})` $DIR/core/services/ocrcommon/telemetry_test.go: `.getObservation(finalResult)` $DIR/core/services/ocrcommon/telemetry_test.go: `.NewTelemetryService(t)` $DIR/core/services/ocrcommon/telemetry_test.go: `.NewIngressAgentWrapper(ingressClient)` $DIR/core/services/ocrcommon/telemetry_test.go: `.GenMonitoringEndpoint("test-network", "test-chainID", "0xa", synchronization.EnhancedEA)` $DIR/core/services/ocrcommon/telemetry_test.go: `.On("Send", mock.Anything, mock.AnythingOfType("[]uint8"), mock.AnythingOfType("string"), mock.AnythingOfType("TelemetryType"))` $DIR/core/services/ocrcommon/telemetry_test.go: `.AnythingOfType("[]uint8")` $DIR/core/services/ocrcommon/telemetry_test.go: `.AnythingOfType("string")` $DIR/core/services/ocrcommon/telemetry_test.go: `.AnythingOfType("TelemetryType")` $DIR/core/services/ocrcommon/telemetry_test.go: `.Return()` $DIR/core/services/ocrcommon/telemetry_test.go: `.Run(func(args mock.Arguments) { wg.Done() })` $DIR/core/services/ocrcommon/telemetry_test.go: `.Done()` $DIR/core/services/ocrcommon/telemetry_test.go: `.TestLoggerObserved(t, zap.WarnLevel)` $DIR/core/services/ocrcommon/telemetry_test.go: `.Type(pipeline.OffchainReportingJobType)` $DIR/core/services/ocrcommon/telemetry_test.go: `.Named("Enhanced Telemetry")` $DIR/core/services/ocrcommon/telemetry_test.go: `.Run(t, enhancedTelemService)` $DIR/core/services/ocrcommon/telemetry_test.go: `.NewBaseTask(0, "ds1", nil, nil, 0)` $DIR/core/services/ocrcommon/telemetry_test.go: `.NewBaseTask(0, "ds2", nil, nil, 0)` $DIR/core/services/ocrcommon/telemetry_test.go: `.Add(1)` $DIR/core/services/ocrcommon/telemetry_test.go: `.Wait()` $DIR/core/services/ocrcommon/telemetry_test.go: `.NewBaseTask(0, "ds1", nil, nil, 0)` $DIR/core/services/ocrcommon/telemetry_test.go: `.Wait()` $DIR/core/services/ocrcommon/telemetry_test.go: `.TestLoggerObserved(t, zap.WarnLevel)` $DIR/core/services/ocrcommon/telemetry_test.go: `.getPricesFromResults(trrsMercuryV1[0], trrsMercuryV1, 1)` $DIR/core/services/ocrcommon/telemetry_test.go: `.getPricesFromResults(trrsMercuryV1[0], pipeline.TaskRunResults{}, 1)` $DIR/core/services/ocrcommon/telemetry_test.go: `.getPricesFromResults(trrsMercuryV1[0], tt, 1)` $DIR/core/services/ocrcommon/telemetry_test.go: `.getPricesFromResults(trrsMercuryV1[0], tt, 1)` $DIR/core/services/ocrcommon/telemetry_test.go: `.NewBaseTask(0, "ds1", nil, nil, 0)` $DIR/core/services/ocrcommon/telemetry_test.go: `.NewBaseTask(1, "ds1_benchmark", nil, nil, 1)` $DIR/core/services/ocrcommon/telemetry_test.go: `.NewBaseTask(2, "ds2_bid", nil, nil, 2)` $DIR/core/services/ocrcommon/telemetry_test.go: `.NewBaseTask(3, "ds3_ask", nil, nil, 3)` $DIR/core/services/ocrcommon/telemetry_test.go: `.getPricesFromResults(trrsMercuryV1[0], trrs2, 3)` $DIR/core/services/ocrcommon/telemetry_test.go: `.getPricesFromResults(trrsMercuryV1[0], trrsMercuryV2, 2)` $DIR/core/services/ocrcommon/telemetry_test.go: `.Type(pipeline.OffchainReporting2JobType)` $DIR/core/services/ocrcommon/telemetry_test.go: `.Type(pipeline.CronJobType)` $DIR/core/services/ocrcommon/telemetry_test.go: `.getAssetSymbolFromRequestData(reqData)` $DIR/core/services/ocrcommon/telemetry_test.go: `.NewTelemetryService(t)` $DIR/core/services/ocrcommon/telemetry_test.go: `.NewIngressAgentWrapper(ingressClient)` $DIR/core/services/ocrcommon/telemetry_test.go: `.GenMonitoringEndpoint("test-network", "test-chainID", "0xa", synchronization.EnhancedEAMercury)` $DIR/core/services/ocrcommon/telemetry_test.go: `.On("Send", mock.Anything, mock.AnythingOfType("[]uint8"), mock.AnythingOfType("string"), mock.AnythingOfType("TelemetryType"))` $DIR/core/services/ocrcommon/telemetry_test.go: `.AnythingOfType("[]uint8")` $DIR/core/services/ocrcommon/telemetry_test.go: `.AnythingOfType("string")` $DIR/core/services/ocrcommon/telemetry_test.go: `.AnythingOfType("TelemetryType")` $DIR/core/services/ocrcommon/telemetry_test.go: `.Return()` $DIR/core/services/ocrcommon/telemetry_test.go: `.Run(func(args mock.Arguments) { sentMessage = args[1].([]byte) wg.Done() })` $DIR/core/services/ocrcommon/telemetry_test.go: `.Done()` $DIR/core/services/ocrcommon/telemetry_test.go: `.TestLoggerObserved(t, zap.WarnLevel)` $DIR/core/services/ocrcommon/telemetry_test.go: `.HexToHash("0x111")` $DIR/core/services/ocrcommon/telemetry_test.go: `.Type(pipeline.OffchainReporting2JobType)` $DIR/core/services/ocrcommon/telemetry_test.go: `.Run(t, &e)` $DIR/core/services/ocrcommon/telemetry_test.go: `.Add(1)` $DIR/core/services/ocrcommon/telemetry_test.go: `.NewInt(111111)` $DIR/core/services/ocrcommon/telemetry_test.go: `.NewInt(222222)` $DIR/core/services/ocrcommon/telemetry_test.go: `.NewInt(333333)` $DIR/core/services/ocrcommon/telemetry_test.go: `.HexToHash("0x123321")` $DIR/core/services/ocrcommon/telemetry_test.go: `.Bytes()` $DIR/core/services/ocrcommon/telemetry_test.go: `.HexToHash("0x123321")` $DIR/core/services/ocrcommon/telemetry_test.go: `.String()` $DIR/core/services/ocrcommon/telemetry_test.go: `.CreatedAt.UnixMilli()` $DIR/core/services/ocrcommon/telemetry_test.go: `.FinishedAt.Time.UnixMilli()` $DIR/core/services/ocrcommon/telemetry_test.go: `.HexToHash("0x111")` $DIR/core/services/ocrcommon/telemetry_test.go: `.String()` $DIR/core/services/ocrcommon/telemetry_test.go: `.Marshal(&expectedTelemetry)` $DIR/core/services/ocrcommon/telemetry_test.go: `.Wait()` $DIR/core/services/ocrcommon/telemetry_test.go: `.NewBaseTask(0, "ds1", nil, nil, 0)` $DIR/core/services/ocrcommon/telemetry_test.go: `.Add(1)` $DIR/core/services/ocrcommon/telemetry_test.go: `.Wait()` $DIR/core/services/ocrcommon/telemetry_test.go: `.NewTelemetryService(t)` $DIR/core/services/ocrcommon/telemetry_test.go: `.NewIngressAgentWrapper(ingressClient)` $DIR/core/services/ocrcommon/telemetry_test.go: `.GenMonitoringEndpoint("test-network", "test-chainID", "0xa", synchronization.EnhancedEAMercury)` $DIR/core/services/ocrcommon/telemetry_test.go: `.On("Send", mock.Anything, mock.AnythingOfType("[]uint8"), mock.AnythingOfType("string"), mock.AnythingOfType("TelemetryType"))` $DIR/core/services/ocrcommon/telemetry_test.go: `.AnythingOfType("[]uint8")` $DIR/core/services/ocrcommon/telemetry_test.go: `.AnythingOfType("string")` $DIR/core/services/ocrcommon/telemetry_test.go: `.AnythingOfType("TelemetryType")` $DIR/core/services/ocrcommon/telemetry_test.go: `.Return()` $DIR/core/services/ocrcommon/telemetry_test.go: `.Run(func(args mock.Arguments) { sentMessage = args[1].([]byte) wg.Done() })` $DIR/core/services/ocrcommon/telemetry_test.go: `.Done()` $DIR/core/services/ocrcommon/telemetry_test.go: `.TestLoggerObserved(t, zap.WarnLevel)` $DIR/core/services/ocrcommon/telemetry_test.go: `.HexToHash("0x111")` $DIR/core/services/ocrcommon/telemetry_test.go: `.Type(pipeline.OffchainReporting2JobType)` $DIR/core/services/ocrcommon/telemetry_test.go: `.Run(t, &e)` $DIR/core/services/ocrcommon/telemetry_test.go: `.Add(1)` $DIR/core/services/ocrcommon/telemetry_test.go: `.NewInt(111111)` $DIR/core/services/ocrcommon/telemetry_test.go: `.NewInt(4321)` $DIR/core/services/ocrcommon/telemetry_test.go: `.NewInt(54321)` $DIR/core/services/ocrcommon/telemetry_test.go: `.CreatedAt.UnixMilli()` $DIR/core/services/ocrcommon/telemetry_test.go: `.FinishedAt.Time.UnixMilli()` $DIR/core/services/ocrcommon/telemetry_test.go: `.HexToHash("0x111")` $DIR/core/services/ocrcommon/telemetry_test.go: `.String()` $DIR/core/services/ocrcommon/telemetry_test.go: `.Marshal(&expectedTelemetry)` $DIR/core/services/ocrcommon/telemetry_test.go: `.Wait()` $DIR/core/services/ocrcommon/telemetry_test.go: `.NewBaseTask(0, "ds1", nil, nil, 0)` $DIR/core/services/ocrcommon/telemetry_test.go: `.Add(1)` $DIR/core/services/ocrcommon/telemetry_test.go: `.Wait()` $DIR/core/services/ocrcommon/transmitter_test.go: `txm.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, ForwarderAddress: common.Address{}, Meta: nil, Strategy: strategy, }).Return(txmgr.Tx{}, nil).Once()` $DIR/core/services/ocrcommon/transmitter_test.go: `txm.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, ForwarderAddress: common.Address{}, Meta: nil, Strategy: strategy, }).Return(txmgr.Tx{}, nil).Once()` $DIR/core/services/ocrcommon/transmitter_test.go: `txm.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ FromAddress: fromAddress2, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, ForwarderAddress: common.Address{}, Meta: nil, Strategy: strategy, }).Return(txmgr.Tx{}, nil).Once()` $DIR/core/services/ocrcommon/transmitter_test.go: `.NewSqlxDB(t)` $DIR/core/services/ocrcommon/transmitter_test.go: `.NewKeyStore(t, db)` $DIR/core/services/ocrcommon/transmitter_test.go: `.Eth()` $DIR/core/services/ocrcommon/transmitter_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/services/ocrcommon/transmitter_test.go: `.NewInt(0)` $DIR/core/services/ocrcommon/transmitter_test.go: `.NewAddress()` $DIR/core/services/ocrcommon/transmitter_test.go: `.NewMockEvmTxManager(t)` $DIR/core/services/ocrcommon/transmitter_test.go: `.NewTransmitter( txm, []common.Address{fromAddress}, gasLimit, effectiveTransmitterAddress, strategy, txmgr.TransmitCheckerSpec{}, chainID, ethKeyStore, )` $DIR/core/services/ocrcommon/transmitter_test.go: `.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, ForwarderAddress: common.Address{}, Meta: nil, Strategy: strategy, })` $DIR/core/services/ocrcommon/transmitter_test.go: `.Return(txmgr.Tx{}, nil)` $DIR/core/services/ocrcommon/transmitter_test.go: `.Once()` $DIR/core/services/ocrcommon/transmitter_test.go: `.CreateEthTransaction(testutils.Context(t), toAddress, payload, nil)` $DIR/core/services/ocrcommon/transmitter_test.go: `.Context(t)` $DIR/core/services/ocrcommon/transmitter_test.go: `.NewSqlxDB(t)` $DIR/core/services/ocrcommon/transmitter_test.go: `.NewKeyStore(t, db)` $DIR/core/services/ocrcommon/transmitter_test.go: `.Eth()` $DIR/core/services/ocrcommon/transmitter_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/services/ocrcommon/transmitter_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/services/ocrcommon/transmitter_test.go: `.NewInt(0)` $DIR/core/services/ocrcommon/transmitter_test.go: `.NewAddress()` $DIR/core/services/ocrcommon/transmitter_test.go: `.NewMockEvmTxManager(t)` $DIR/core/services/ocrcommon/transmitter_test.go: `.NewTransmitter( txm, []common.Address{fromAddress, fromAddress2}, gasLimit, effectiveTransmitterAddress, strategy, txmgr.TransmitCheckerSpec{}, chainID, ethKeyStore, )` $DIR/core/services/ocrcommon/transmitter_test.go: `.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, ForwarderAddress: common.Address{}, Meta: nil, Strategy: strategy, })` $DIR/core/services/ocrcommon/transmitter_test.go: `.Return(txmgr.Tx{}, nil)` $DIR/core/services/ocrcommon/transmitter_test.go: `.Once()` $DIR/core/services/ocrcommon/transmitter_test.go: `.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ FromAddress: fromAddress2, ToAddress: toAddress, EncodedPayload: payload, FeeLimit: gasLimit, ForwarderAddress: common.Address{}, Meta: nil, Strategy: strategy, })` $DIR/core/services/ocrcommon/transmitter_test.go: `.Return(txmgr.Tx{}, nil)` $DIR/core/services/ocrcommon/transmitter_test.go: `.Once()` $DIR/core/services/ocrcommon/transmitter_test.go: `.CreateEthTransaction(testutils.Context(t), toAddress, payload, nil)` $DIR/core/services/ocrcommon/transmitter_test.go: `.Context(t)` $DIR/core/services/ocrcommon/transmitter_test.go: `.NewSqlxDB(t)` $DIR/core/services/ocrcommon/transmitter_test.go: `.NewKeyStore(t, db)` $DIR/core/services/ocrcommon/transmitter_test.go: `.Eth()` $DIR/core/services/ocrcommon/transmitter_test.go: `.NewInt(0)` $DIR/core/services/ocrcommon/transmitter_test.go: `.NewAddress()` $DIR/core/services/ocrcommon/transmitter_test.go: `.NewMockEvmTxManager(t)` $DIR/core/services/ocrcommon/transmitter_test.go: `.NewTransmitter( txm, []common.Address{fromAddress}, gasLimit, effectiveTransmitterAddress, strategy, txmgr.TransmitCheckerSpec{}, chainID, ethKeyStore, )` $DIR/core/services/ocrcommon/transmitter_test.go: `.CreateEthTransaction(testutils.Context(t), toAddress, payload, nil)` $DIR/core/services/ocrcommon/transmitter_test.go: `.Context(t)` $DIR/core/services/ocrcommon/transmitter_test.go: `.NewSqlxDB(t)` $DIR/core/services/ocrcommon/transmitter_test.go: `.NewKeyStore(t, db)` $DIR/core/services/ocrcommon/transmitter_test.go: `.Eth()` $DIR/core/services/ocrcommon/transmitter_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/services/ocrcommon/transmitter_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/services/ocrcommon/transmitter_test.go: `.NewInt(0)` $DIR/core/services/ocrcommon/transmitter_test.go: `.NewMockEvmTxManager(t)` $DIR/core/services/ocrcommon/transmitter_test.go: `.NewTransmitter( txm, []common.Address{fromAddress, fromAddress2}, gasLimit, effectiveTransmitterAddress, strategy, txmgr.TransmitCheckerSpec{}, chainID, nil, )` $DIR/core/services/p2p/counter_test.go: `g.Inc()` $DIR/core/services/p2p/counter_test.go: `g.Inc()` $DIR/core/services/p2p/counter_test.go: `.Inc()` $DIR/core/services/p2p/counter_test.go: `.Inc()` $DIR/core/services/p2p/counter_test.go: `.Bytes()` $DIR/core/services/p2p/peer_test.go: `err = peer.Start(testutils.Context(t))` $DIR/core/services/p2p/peer_test.go: `err = peer.Close()` $DIR/core/services/p2p/peer_test.go: `.TestLogger(t)` $DIR/core/services/p2p/peer_test.go: `.GetOne(t)` $DIR/core/services/p2p/peer_test.go: `.NewRegistry()` $DIR/core/services/p2p/peer_test.go: `.Sprintf("127.0.0.1:%d", port)` $DIR/core/services/p2p/peer_test.go: `.NewInMemoryDiscovererDatabase()` $DIR/core/services/p2p/peer_test.go: `.NewPeer(peerConfig, lggr)` $DIR/core/services/p2p/peer_test.go: `.Start(testutils.Context(t))` $DIR/core/services/p2p/peer_test.go: `.Context(t)` $DIR/core/services/p2p/utils_test.go: `state, err = db.ReadAnnouncements(testutils.Context(t), []string{peerID2})` $DIR/core/services/p2p/utils_test.go: `.NewInMemoryDiscovererDatabase()` $DIR/core/services/p2p/utils_test.go: `.ReadAnnouncements(testutils.Context(t), []string{peerID1, peerID2})` $DIR/core/services/p2p/utils_test.go: `.Context(t)` $DIR/core/services/p2p/utils_test.go: `.ReadAnnouncements(testutils.Context(t), []string{peerID2})` $DIR/core/services/p2p/utils_test.go: `.Context(t)` $DIR/core/services/p2p/wrapper/wrapper_test.go: `c.Capabilities.Peering.V2.Enabled = &enabled` $DIR/core/services/p2p/wrapper/wrapper_test.go: `c.Capabilities.Peering.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", port)}` $DIR/core/services/p2p/wrapper/wrapper_test.go: `keystoreP2P.On("GetOrFirst", mock.Anything).Return(key, nil)` $DIR/core/services/p2p/wrapper/wrapper_test.go: `.NewSqlxDB(t)` $DIR/core/services/p2p/wrapper/wrapper_test.go: `.TestLogger(t)` $DIR/core/services/p2p/wrapper/wrapper_test.go: `.GetOne(t)` $DIR/core/services/p2p/wrapper/wrapper_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { enabled := true c.Capabilities.Peering.V2.Enabled = &enabled c.Capabilities.Peering.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", port)} })` $DIR/core/services/p2p/wrapper/wrapper_test.go: `.Sprintf("127.0.0.1:%d", port)` $DIR/core/services/p2p/wrapper/wrapper_test.go: `.NewP2P(t)` $DIR/core/services/p2p/wrapper/wrapper_test.go: `.NewV2()` $DIR/core/services/p2p/wrapper/wrapper_test.go: `.On("GetOrFirst", mock.Anything)` $DIR/core/services/p2p/wrapper/wrapper_test.go: `.Return(key, nil)` $DIR/core/services/p2p/wrapper/wrapper_test.go: `.NewExternalPeerWrapper(keystoreP2P, cfg.Capabilities().Peering(), db, lggr)` $DIR/core/services/p2p/wrapper/wrapper_test.go: `.Capabilities()` $DIR/core/services/p2p/wrapper/wrapper_test.go: `.Peering()` $DIR/core/services/periodicbackup/backup_test.go: `.DatabaseURL.Get()` $DIR/core/services/periodicbackup/backup_test.go: `.TempDir()` $DIR/core/services/periodicbackup/backup_test.go: `.runBackup("0.9.9")` $DIR/core/services/periodicbackup/backup_test.go: `.Remove(result.path)` $DIR/core/services/periodicbackup/backup_test.go: `.Stat(result.path)` $DIR/core/services/periodicbackup/backup_test.go: `.DatabaseURL.Get()` $DIR/core/services/periodicbackup/backup_test.go: `.TempDir()` $DIR/core/services/periodicbackup/backup_test.go: `.runBackup("0.9.9")` $DIR/core/services/periodicbackup/backup_test.go: `.Remove(result.path)` $DIR/core/services/periodicbackup/backup_test.go: `.Stat(result.path)` $DIR/core/services/periodicbackup/backup_test.go: `.DatabaseURL.Get()` $DIR/core/services/periodicbackup/backup_test.go: `.TempDir()` $DIR/core/services/periodicbackup/backup_test.go: `.runBackup(static.Unset)` $DIR/core/services/periodicbackup/backup_test.go: `.Remove(result.path)` $DIR/core/services/periodicbackup/backup_test.go: `.Stat(result.path)` $DIR/core/services/periodicbackup/backup_test.go: `.Parse("postgresql://invalid:some-pass@invalid")` $DIR/core/services/periodicbackup/backup_test.go: `.DatabaseURL.Get()` $DIR/core/services/periodicbackup/backup_test.go: `.TempDir()` $DIR/core/services/periodicbackup/backup_test.go: `.runBackup("")` $DIR/core/services/periodicbackup/backup_test.go: `.DatabaseURL.Get()` $DIR/core/services/periodicbackup/backup_test.go: `.TempDir()` $DIR/core/services/periodicbackup/backup_test.go: `.frequencyIsTooSmall()` $DIR/core/services/periodicbackup/backup_test.go: `.Join(os.TempDir(), "alternative")` $DIR/core/services/periodicbackup/backup_test.go: `.TempDir()` $DIR/core/services/periodicbackup/backup_test.go: `.DatabaseURL.Get()` $DIR/core/services/periodicbackup/backup_test.go: `.TempDir()` $DIR/core/services/periodicbackup/backup_test.go: `.runBackup("0.9.9")` $DIR/core/services/periodicbackup/backup_test.go: `.Remove(result.path)` $DIR/core/services/periodicbackup/backup_test.go: `.Stat(result.path)` $DIR/core/services/pg/connection_test.go: `t.Run("when the version is too low", func(t *testing.T) { m := &mockGetter{version: 100000} err := checkVersion(m, 110000) require.Error(t, err) assert.Contains(t, err.Error(), "The minimum required Postgres server version is 11, you are running: 10") })` $DIR/core/services/pg/connection_test.go: `t.Run("when the version is at minimum", func(t *testing.T) { m := &mockGetter{version: 110000} err := checkVersion(m, 110000) require.NoError(t, err) })` $DIR/core/services/pg/connection_test.go: `t.Run("when the version is above minimum", func(t *testing.T) { m := &mockGetter{version: 110001} err := checkVersion(m, 110000) require.NoError(t, err) m = &mockGetter{version: 120000} err = checkVersion(m, 110001) require.NoError(t, err) })` $DIR/core/services/pg/connection_test.go: `m = &mockGetter{version: 120000}` $DIR/core/services/pg/connection_test.go: `err = checkVersion(m, 110001)` $DIR/core/services/pg/connection_test.go: `t.Run("ignores wildly small versions, 0 etc", func(t *testing.T) { m := &mockGetter{version: 9000} err := checkVersion(m, 110001) require.NoError(t, err) })` $DIR/core/services/pg/connection_test.go: `testutils.SkipShortDB(t)` $DIR/core/services/pg/connection_test.go: `t.Cleanup(func() { require.NoError(t, db.Close()) })` $DIR/core/services/pg/connection_test.go: `_, err = db.Exec("SET session_replication_role= 'origin'")` $DIR/core/services/pg/connection_test.go: `err = disallowReplica(db)` $DIR/core/services/pg/connection_test.go: `_, err = db.Exec("SET session_replication_role= 'replica'")` $DIR/core/services/pg/connection_test.go: `err = disallowReplica(db)` $DIR/core/services/pg/connection_test.go: `_, err = db.Exec("SET session_replication_role= 'not_valid_role'")` $DIR/core/services/pg/connection_test.go: `.Now()` $DIR/core/services/pg/connection_test.go: `.Year()` $DIR/core/services/pg/connection_test.go: `.Run("when the version is too low", func(t *testing.T) { m := &mockGetter{version: 100000} err := checkVersion(m, 110000) require.Error(t, err) assert.Contains(t, err.Error(), "The minimum required Postgres server version is 11, you are running: 10") })` $DIR/core/services/pg/connection_test.go: `.Run("when the version is at minimum", func(t *testing.T) { m := &mockGetter{version: 110000} err := checkVersion(m, 110000) require.NoError(t, err) })` $DIR/core/services/pg/connection_test.go: `.Run("when the version is above minimum", func(t *testing.T) { m := &mockGetter{version: 110001} err := checkVersion(m, 110000) require.NoError(t, err) m = &mockGetter{version: 120000} err = checkVersion(m, 110001) require.NoError(t, err) })` $DIR/core/services/pg/connection_test.go: `.Run("ignores wildly small versions, 0 etc", func(t *testing.T) { m := &mockGetter{version: 9000} err := checkVersion(m, 110001) require.NoError(t, err) })` $DIR/core/services/pg/connection_test.go: `.New("some error")` $DIR/core/services/pg/connection_test.go: `.SkipShortDB(t)` $DIR/core/services/pg/connection_test.go: `.Open(string(dialects.TransactionWrappedPostgres), uuid.New().String())` $DIR/core/services/pg/connection_test.go: `.New()` $DIR/core/services/pg/connection_test.go: `.String()` $DIR/core/services/pg/connection_test.go: `.Cleanup(func() { require.NoError(t, db.Close()) })` $DIR/core/services/pg/connection_test.go: `.Exec("SET session_replication_role= 'origin'")` $DIR/core/services/pg/connection_test.go: `.Exec("SET session_replication_role= 'replica'")` $DIR/core/services/pg/connection_test.go: `.Exec("SET session_replication_role= 'not_valid_role'")` $DIR/core/services/pg/lease_lock_test.go: `c.Database.Lock.Enabled = &t` $DIR/core/services/pg/lease_lock_test.go: `t.Run("on migrated database", func(t *testing.T) { cfg := pg.LeaseLockConfig{ DefaultQueryTimeout: cfg.Database().DefaultQueryTimeout(), LeaseDuration: 15 * time.Second, LeaseRefreshInterval: 100 * time.Millisecond, } leaseLock1 := newLeaseLock(t, db, cfg) err := leaseLock1.TakeAndHold(testutils.Context(t)) require.NoError(t, err) var clientID uuid.UUID err = db.Get(&clientID, `SELECT client_id FROM lease_lock`) require.NoError(t, err) assert.Equal(t, leaseLock1.ClientID(), clientID) started2 := make(chan struct{}) leaseLock2 := newLeaseLock(t, db, cfg) go func() { defer leaseLock2.Release() require.NoError(t, leaseLock2.TakeAndHold(testutils.Context(t))) close(started2) }() // Give it plenty of time to have a few tries at getting the lease time.Sleep(cfg.LeaseRefreshInterval * 5) leaseLock1.Release() select { case <-started2: case <-time.After(testutils.WaitTimeout(t)): t.Fatal("timed out waiting for leaseLock2 to start") } err = db.Get(&clientID, `SELECT client_id FROM lease_lock`) require.NoError(t, err) assert.Equal(t, leaseLock2.ClientID(), clientID) })` $DIR/core/services/pg/lease_lock_test.go: `err = db.Get(&clientID, `SELECT client_id FROM lease_lock`)` $DIR/core/services/pg/lease_lock_test.go: `close(started2)` $DIR/core/services/pg/lease_lock_test.go: `time.Sleep(cfg.LeaseRefreshInterval * 5)` $DIR/core/services/pg/lease_lock_test.go: `leaseLock1.Release()` $DIR/core/services/pg/lease_lock_test.go: `err = db.Get(&clientID, `SELECT client_id FROM lease_lock`)` $DIR/core/services/pg/lease_lock_test.go: `t.Run("recovers and re-opens connection if it's closed externally on initial take wait", func(t *testing.T) { cfg := pg.LeaseLockConfig{ DefaultQueryTimeout: cfg.Database().DefaultQueryTimeout(), LeaseDuration: 15 * time.Second, LeaseRefreshInterval: 100 * time.Millisecond, } leaseLock := newLeaseLock(t, db, cfg) otherAppID := uuid.New() // simulate another application holding lease to force it to retry res, err := db.Exec(`UPDATE lease_lock SET client_id=$1,expires_at=NOW()+'1 day'::interval`, otherAppID) require.NoError(t, err) rowsAffected, err := res.RowsAffected() require.NoError(t, err) require.EqualValues(t, 1, rowsAffected) conn, err := db.Connx(testutils.Context(t)) require.NoError(t, err) pg.SetConn(leaseLock, conn) // Simulate the connection being closed (leaseLock should automatically check out a new one) require.NoError(t, conn.Close()) gotLease := make(chan struct{}) go func() { errInternal := leaseLock.TakeAndHold(testutils.Context(t)) require.NoError(t, errInternal) close(gotLease) }() // Give it plenty of time to have a few tries at getting the lease time.Sleep(cfg.LeaseRefreshInterval * 5) // Release the dummy lease lock to allow the lease locker to take it now _, err = db.Exec(`DELETE FROM lease_lock WHERE client_id=$1`, otherAppID) require.NoError(t, err) select { case <-gotLease: case <-time.After(testutils.WaitTimeout(t)): t.Fatal("timed out waiting for lease lock to start") } // check that the lease lock was actually taken var exists bool err = db.Get(&exists, `SELECT EXISTS(SELECT 1 FROM lease_lock)`) require.NoError(t, err) assert.True(t, exists) leaseLock.Release() })` $DIR/core/services/pg/lease_lock_test.go: `pg.SetConn(leaseLock, conn)` $DIR/core/services/pg/lease_lock_test.go: `close(gotLease)` $DIR/core/services/pg/lease_lock_test.go: `time.Sleep(cfg.LeaseRefreshInterval * 5)` $DIR/core/services/pg/lease_lock_test.go: `_, err = db.Exec(`DELETE FROM lease_lock WHERE client_id=$1`, otherAppID)` $DIR/core/services/pg/lease_lock_test.go: `err = db.Get(&exists, `SELECT EXISTS(SELECT 1 FROM lease_lock)`)` $DIR/core/services/pg/lease_lock_test.go: `leaseLock.Release()` $DIR/core/services/pg/lease_lock_test.go: `t.Run("recovers and re-opens connection if it's closed externally while holding", func(t *testing.T) { cfg := pg.LeaseLockConfig{ DefaultQueryTimeout: cfg.Database().DefaultQueryTimeout(), LeaseDuration: 15 * time.Second, LeaseRefreshInterval: 100 * time.Millisecond, } leaseLock := newLeaseLock(t, db, cfg) err := leaseLock.TakeAndHold(testutils.Context(t)) require.NoError(t, err) defer leaseLock.Release() conn := pg.GetConn(leaseLock) var prevExpiresAt time.Time err = conn.Close() require.NoError(t, err) err = db.Get(&prevExpiresAt, `SELECT expires_at FROM lease_lock`) require.NoError(t, err) time.Sleep(cfg.LeaseRefreshInterval + 1*time.Second) var expiresAt time.Time err = db.Get(&expiresAt, `SELECT expires_at FROM lease_lock`) require.NoError(t, err) // The lease lock must have recovered and re-opened the connection if the second expires_at is later assert.Greater(t, expiresAt.Unix(), prevExpiresAt.Unix()) })` $DIR/core/services/pg/lease_lock_test.go: `err = conn.Close()` $DIR/core/services/pg/lease_lock_test.go: `err = db.Get(&prevExpiresAt, `SELECT expires_at FROM lease_lock`)` $DIR/core/services/pg/lease_lock_test.go: `time.Sleep(cfg.LeaseRefreshInterval + 1*time.Second)` $DIR/core/services/pg/lease_lock_test.go: `err = db.Get(&expiresAt, `SELECT expires_at FROM lease_lock`)` $DIR/core/services/pg/lease_lock_test.go: `t.Run("release lock with Release() func", func(t *testing.T) { cfg := pg.LeaseLockConfig{ DefaultQueryTimeout: cfg.Database().DefaultQueryTimeout(), LeaseDuration: 15 * time.Second, LeaseRefreshInterval: 100 * time.Millisecond, } leaseLock := newLeaseLock(t, db, cfg) err := leaseLock.TakeAndHold(testutils.Context(t)) require.NoError(t, err) leaseLock.Release() leaseLock2 := newLeaseLock(t, db, cfg) err = leaseLock2.TakeAndHold(testutils.Context(t)) defer leaseLock2.Release() require.NoError(t, err) })` $DIR/core/services/pg/lease_lock_test.go: `leaseLock.Release()` $DIR/core/services/pg/lease_lock_test.go: `err = leaseLock2.TakeAndHold(testutils.Context(t))` $DIR/core/services/pg/lease_lock_test.go: `t.Run("cancel TakeAndHold with ctx", func(t *testing.T) { cfg := pg.LeaseLockConfig{ DefaultQueryTimeout: cfg.Database().DefaultQueryTimeout(), LeaseDuration: 15 * time.Second, LeaseRefreshInterval: 100 * time.Millisecond, } leaseLock1 := newLeaseLock(t, db, cfg) leaseLock2 := newLeaseLock(t, db, cfg) err := leaseLock1.TakeAndHold(testutils.Context(t)) require.NoError(t, err) awaiter := cltest.NewAwaiter() go func() { ctx, cancel := context.WithCancel(testutils.Context(t)) go func() { <-time.After(3 * time.Second) cancel() }() err := leaseLock2.TakeAndHold(ctx) require.Error(t, err) awaiter.ItHappened() }() awaiter.AwaitOrFail(t) leaseLock1.Release() })` $DIR/core/services/pg/lease_lock_test.go: `<-time.After(3 * time.Second)` $DIR/core/services/pg/lease_lock_test.go: `cancel()` $DIR/core/services/pg/lease_lock_test.go: `awaiter.ItHappened()` $DIR/core/services/pg/lease_lock_test.go: `awaiter.AwaitOrFail(t)` $DIR/core/services/pg/lease_lock_test.go: `leaseLock1.Release()` $DIR/core/services/pg/lease_lock_test.go: `.FullTestDBNoFixturesV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { t := true c.Database.Lock.Enabled = &t })` $DIR/core/services/pg/lease_lock_test.go: `.Run("on migrated database", func(t *testing.T) { cfg := pg.LeaseLockConfig{ DefaultQueryTimeout: cfg.Database().DefaultQueryTimeout(), LeaseDuration: 15 * time.Second, LeaseRefreshInterval: 100 * time.Millisecond, } leaseLock1 := newLeaseLock(t, db, cfg) err := leaseLock1.TakeAndHold(testutils.Context(t)) require.NoError(t, err) var clientID uuid.UUID err = db.Get(&clientID, `SELECT client_id FROM lease_lock`) require.NoError(t, err) assert.Equal(t, leaseLock1.ClientID(), clientID) started2 := make(chan struct{}) leaseLock2 := newLeaseLock(t, db, cfg) go func() { defer leaseLock2.Release() require.NoError(t, leaseLock2.TakeAndHold(testutils.Context(t))) close(started2) }() // Give it plenty of time to have a few tries at getting the lease time.Sleep(cfg.LeaseRefreshInterval * 5) leaseLock1.Release() select { case <-started2: case <-time.After(testutils.WaitTimeout(t)): t.Fatal("timed out waiting for leaseLock2 to start") } err = db.Get(&clientID, `SELECT client_id FROM lease_lock`) require.NoError(t, err) assert.Equal(t, leaseLock2.ClientID(), clientID) })` $DIR/core/services/pg/lease_lock_test.go: `.Database()` $DIR/core/services/pg/lease_lock_test.go: `.DefaultQueryTimeout()` $DIR/core/services/pg/lease_lock_test.go: `.TakeAndHold(testutils.Context(t))` $DIR/core/services/pg/lease_lock_test.go: `.Context(t)` $DIR/core/services/pg/lease_lock_test.go: `.Get(&clientID, `SELECT client_id FROM lease_lock`)` $DIR/core/services/pg/lease_lock_test.go: `.Release()` $DIR/core/services/pg/lease_lock_test.go: `.Sleep(cfg.LeaseRefreshInterval * 5)` $DIR/core/services/pg/lease_lock_test.go: `.Release()` $DIR/core/services/pg/lease_lock_test.go: `.After(testutils.WaitTimeout(t))` $DIR/core/services/pg/lease_lock_test.go: `.WaitTimeout(t)` $DIR/core/services/pg/lease_lock_test.go: `.Get(&clientID, `SELECT client_id FROM lease_lock`)` $DIR/core/services/pg/lease_lock_test.go: `.Run("recovers and re-opens connection if it's closed externally on initial take wait", func(t *testing.T) { cfg := pg.LeaseLockConfig{ DefaultQueryTimeout: cfg.Database().DefaultQueryTimeout(), LeaseDuration: 15 * time.Second, LeaseRefreshInterval: 100 * time.Millisecond, } leaseLock := newLeaseLock(t, db, cfg) otherAppID := uuid.New() // simulate another application holding lease to force it to retry res, err := db.Exec(`UPDATE lease_lock SET client_id=$1,expires_at=NOW()+'1 day'::interval`, otherAppID) require.NoError(t, err) rowsAffected, err := res.RowsAffected() require.NoError(t, err) require.EqualValues(t, 1, rowsAffected) conn, err := db.Connx(testutils.Context(t)) require.NoError(t, err) pg.SetConn(leaseLock, conn) // Simulate the connection being closed (leaseLock should automatically check out a new one) require.NoError(t, conn.Close()) gotLease := make(chan struct{}) go func() { errInternal := leaseLock.TakeAndHold(testutils.Context(t)) require.NoError(t, errInternal) close(gotLease) }() // Give it plenty of time to have a few tries at getting the lease time.Sleep(cfg.LeaseRefreshInterval * 5) // Release the dummy lease lock to allow the lease locker to take it now _, err = db.Exec(`DELETE FROM lease_lock WHERE client_id=$1`, otherAppID) require.NoError(t, err) select { case <-gotLease: case <-time.After(testutils.WaitTimeout(t)): t.Fatal("timed out waiting for lease lock to start") } // check that the lease lock was actually taken var exists bool err = db.Get(&exists, `SELECT EXISTS(SELECT 1 FROM lease_lock)`) require.NoError(t, err) assert.True(t, exists) leaseLock.Release() })` $DIR/core/services/pg/lease_lock_test.go: `.Database()` $DIR/core/services/pg/lease_lock_test.go: `.DefaultQueryTimeout()` $DIR/core/services/pg/lease_lock_test.go: `.New()` $DIR/core/services/pg/lease_lock_test.go: `.Exec(`UPDATE lease_lock SET client_id=$1,expires_at=NOW()+'1 day'::interval`, otherAppID)` $DIR/core/services/pg/lease_lock_test.go: `.RowsAffected()` $DIR/core/services/pg/lease_lock_test.go: `.Connx(testutils.Context(t))` $DIR/core/services/pg/lease_lock_test.go: `.Context(t)` $DIR/core/services/pg/lease_lock_test.go: `.SetConn(leaseLock, conn)` $DIR/core/services/pg/lease_lock_test.go: `.TakeAndHold(testutils.Context(t))` $DIR/core/services/pg/lease_lock_test.go: `.Context(t)` $DIR/core/services/pg/lease_lock_test.go: `.Sleep(cfg.LeaseRefreshInterval * 5)` $DIR/core/services/pg/lease_lock_test.go: `.Exec(`DELETE FROM lease_lock WHERE client_id=$1`, otherAppID)` $DIR/core/services/pg/lease_lock_test.go: `.After(testutils.WaitTimeout(t))` $DIR/core/services/pg/lease_lock_test.go: `.WaitTimeout(t)` $DIR/core/services/pg/lease_lock_test.go: `.Get(&exists, `SELECT EXISTS(SELECT 1 FROM lease_lock)`)` $DIR/core/services/pg/lease_lock_test.go: `.Release()` $DIR/core/services/pg/lease_lock_test.go: `.Run("recovers and re-opens connection if it's closed externally while holding", func(t *testing.T) { cfg := pg.LeaseLockConfig{ DefaultQueryTimeout: cfg.Database().DefaultQueryTimeout(), LeaseDuration: 15 * time.Second, LeaseRefreshInterval: 100 * time.Millisecond, } leaseLock := newLeaseLock(t, db, cfg) err := leaseLock.TakeAndHold(testutils.Context(t)) require.NoError(t, err) defer leaseLock.Release() conn := pg.GetConn(leaseLock) var prevExpiresAt time.Time err = conn.Close() require.NoError(t, err) err = db.Get(&prevExpiresAt, `SELECT expires_at FROM lease_lock`) require.NoError(t, err) time.Sleep(cfg.LeaseRefreshInterval + 1*time.Second) var expiresAt time.Time err = db.Get(&expiresAt, `SELECT expires_at FROM lease_lock`) require.NoError(t, err) // The lease lock must have recovered and re-opened the connection if the second expires_at is later assert.Greater(t, expiresAt.Unix(), prevExpiresAt.Unix()) })` $DIR/core/services/pg/lease_lock_test.go: `.Database()` $DIR/core/services/pg/lease_lock_test.go: `.DefaultQueryTimeout()` $DIR/core/services/pg/lease_lock_test.go: `.TakeAndHold(testutils.Context(t))` $DIR/core/services/pg/lease_lock_test.go: `.Context(t)` $DIR/core/services/pg/lease_lock_test.go: `.Release()` $DIR/core/services/pg/lease_lock_test.go: `.GetConn(leaseLock)` $DIR/core/services/pg/lease_lock_test.go: `.Get(&prevExpiresAt, `SELECT expires_at FROM lease_lock`)` $DIR/core/services/pg/lease_lock_test.go: `.Sleep(cfg.LeaseRefreshInterval + 1*time.Second)` $DIR/core/services/pg/lease_lock_test.go: `.Get(&expiresAt, `SELECT expires_at FROM lease_lock`)` $DIR/core/services/pg/lease_lock_test.go: `.Run("release lock with Release() func", func(t *testing.T) { cfg := pg.LeaseLockConfig{ DefaultQueryTimeout: cfg.Database().DefaultQueryTimeout(), LeaseDuration: 15 * time.Second, LeaseRefreshInterval: 100 * time.Millisecond, } leaseLock := newLeaseLock(t, db, cfg) err := leaseLock.TakeAndHold(testutils.Context(t)) require.NoError(t, err) leaseLock.Release() leaseLock2 := newLeaseLock(t, db, cfg) err = leaseLock2.TakeAndHold(testutils.Context(t)) defer leaseLock2.Release() require.NoError(t, err) })` $DIR/core/services/pg/lease_lock_test.go: `.Database()` $DIR/core/services/pg/lease_lock_test.go: `.DefaultQueryTimeout()` $DIR/core/services/pg/lease_lock_test.go: `.TakeAndHold(testutils.Context(t))` $DIR/core/services/pg/lease_lock_test.go: `.Context(t)` $DIR/core/services/pg/lease_lock_test.go: `.Release()` $DIR/core/services/pg/lease_lock_test.go: `.TakeAndHold(testutils.Context(t))` $DIR/core/services/pg/lease_lock_test.go: `.Context(t)` $DIR/core/services/pg/lease_lock_test.go: `.Release()` $DIR/core/services/pg/lease_lock_test.go: `.Run("cancel TakeAndHold with ctx", func(t *testing.T) { cfg := pg.LeaseLockConfig{ DefaultQueryTimeout: cfg.Database().DefaultQueryTimeout(), LeaseDuration: 15 * time.Second, LeaseRefreshInterval: 100 * time.Millisecond, } leaseLock1 := newLeaseLock(t, db, cfg) leaseLock2 := newLeaseLock(t, db, cfg) err := leaseLock1.TakeAndHold(testutils.Context(t)) require.NoError(t, err) awaiter := cltest.NewAwaiter() go func() { ctx, cancel := context.WithCancel(testutils.Context(t)) go func() { <-time.After(3 * time.Second) cancel() }() err := leaseLock2.TakeAndHold(ctx) require.Error(t, err) awaiter.ItHappened() }() awaiter.AwaitOrFail(t) leaseLock1.Release() })` $DIR/core/services/pg/lease_lock_test.go: `.Database()` $DIR/core/services/pg/lease_lock_test.go: `.DefaultQueryTimeout()` $DIR/core/services/pg/lease_lock_test.go: `.TakeAndHold(testutils.Context(t))` $DIR/core/services/pg/lease_lock_test.go: `.Context(t)` $DIR/core/services/pg/lease_lock_test.go: `.NewAwaiter()` $DIR/core/services/pg/lease_lock_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/pg/lease_lock_test.go: `.Context(t)` $DIR/core/services/pg/lease_lock_test.go: `.After(3 * time.Second)` $DIR/core/services/pg/lease_lock_test.go: `.TakeAndHold(ctx)` $DIR/core/services/pg/lease_lock_test.go: `.ItHappened()` $DIR/core/services/pg/lease_lock_test.go: `.AwaitOrFail(t)` $DIR/core/services/pg/lease_lock_test.go: `.Release()` $DIR/core/services/pg/lease_lock_test.go: `.FullTestDBEmptyV2(t, nil)` $DIR/core/services/pg/lease_lock_test.go: `.Database()` $DIR/core/services/pg/lease_lock_test.go: `.DefaultQueryTimeout()` $DIR/core/services/pg/lease_lock_test.go: `.TakeAndHold(testutils.Context(t))` $DIR/core/services/pg/lease_lock_test.go: `.Context(t)` $DIR/core/services/pg/lease_lock_test.go: `.Release()` $DIR/core/services/pg/locked_db_test.go: `testutils.SkipShortDB(t)` $DIR/core/services/pg/locked_db_test.go: `err = ldb.Close()` $DIR/core/services/pg/locked_db_test.go: `testutils.SkipShortDB(t)` $DIR/core/services/pg/locked_db_test.go: `cancel()` $DIR/core/services/pg/locked_db_test.go: `testutils.SkipShortDB(t)` $DIR/core/services/pg/locked_db_test.go: `testutils.SkipShortDB(t)` $DIR/core/services/pg/locked_db_test.go: `err = ldb2.Open(ctx)` $DIR/core/services/pg/locked_db_test.go: `testutils.SkipShortDB(t)` $DIR/core/services/pg/locked_db_test.go: `.SkipShortDB(t)` $DIR/core/services/pg/locked_db_test.go: `.NewGeneralConfig(t, lease)` $DIR/core/services/pg/locked_db_test.go: `.TestLogger(t)` $DIR/core/services/pg/locked_db_test.go: `.NewLockedDB(config.AppID(), config.Database(), config.Database().Lock(), lggr)` $DIR/core/services/pg/locked_db_test.go: `.AppID()` $DIR/core/services/pg/locked_db_test.go: `.Database()` $DIR/core/services/pg/locked_db_test.go: `.Database()` $DIR/core/services/pg/locked_db_test.go: `.Lock()` $DIR/core/services/pg/locked_db_test.go: `.Open(testutils.Context(t))` $DIR/core/services/pg/locked_db_test.go: `.Context(t)` $DIR/core/services/pg/locked_db_test.go: `.DB()` $DIR/core/services/pg/locked_db_test.go: `.SkipShortDB(t)` $DIR/core/services/pg/locked_db_test.go: `.NewGeneralConfig(t, lease)` $DIR/core/services/pg/locked_db_test.go: `.TestLogger(t)` $DIR/core/services/pg/locked_db_test.go: `.NewLockedDB(config.AppID(), config.Database(), config.Database().Lock(), lggr)` $DIR/core/services/pg/locked_db_test.go: `.AppID()` $DIR/core/services/pg/locked_db_test.go: `.Database()` $DIR/core/services/pg/locked_db_test.go: `.Database()` $DIR/core/services/pg/locked_db_test.go: `.Lock()` $DIR/core/services/pg/locked_db_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/pg/locked_db_test.go: `.Context(t)` $DIR/core/services/pg/locked_db_test.go: `.Open(ctx)` $DIR/core/services/pg/locked_db_test.go: `.DB()` $DIR/core/services/pg/locked_db_test.go: `.SkipShortDB(t)` $DIR/core/services/pg/locked_db_test.go: `.NewGeneralConfig(t, lease)` $DIR/core/services/pg/locked_db_test.go: `.TestLogger(t)` $DIR/core/services/pg/locked_db_test.go: `.NewLockedDB(config.AppID(), config.Database(), config.Database().Lock(), lggr)` $DIR/core/services/pg/locked_db_test.go: `.AppID()` $DIR/core/services/pg/locked_db_test.go: `.Database()` $DIR/core/services/pg/locked_db_test.go: `.Database()` $DIR/core/services/pg/locked_db_test.go: `.Lock()` $DIR/core/services/pg/locked_db_test.go: `.Open(testutils.Context(t))` $DIR/core/services/pg/locked_db_test.go: `.Context(t)` $DIR/core/services/pg/locked_db_test.go: `.SkipShortDB(t)` $DIR/core/services/pg/locked_db_test.go: `.NewGeneralConfig(t, lease)` $DIR/core/services/pg/locked_db_test.go: `.TestLogger(t)` $DIR/core/services/pg/locked_db_test.go: `.NewLockedDB(config.AppID(), config.Database(), config.Database().Lock(), lggr)` $DIR/core/services/pg/locked_db_test.go: `.AppID()` $DIR/core/services/pg/locked_db_test.go: `.Database()` $DIR/core/services/pg/locked_db_test.go: `.Database()` $DIR/core/services/pg/locked_db_test.go: `.Lock()` $DIR/core/services/pg/locked_db_test.go: `.Open(testutils.Context(t))` $DIR/core/services/pg/locked_db_test.go: `.Context(t)` $DIR/core/services/pg/locked_db_test.go: `.WithTimeout(testutils.Context(t), config.Database().Lock().LeaseDuration())` $DIR/core/services/pg/locked_db_test.go: `.Context(t)` $DIR/core/services/pg/locked_db_test.go: `.Database()` $DIR/core/services/pg/locked_db_test.go: `.Lock()` $DIR/core/services/pg/locked_db_test.go: `.LeaseDuration()` $DIR/core/services/pg/locked_db_test.go: `.NewLockedDB(config.AppID(), config.Database(), config.Database().Lock(), lggr)` $DIR/core/services/pg/locked_db_test.go: `.AppID()` $DIR/core/services/pg/locked_db_test.go: `.Database()` $DIR/core/services/pg/locked_db_test.go: `.Database()` $DIR/core/services/pg/locked_db_test.go: `.Lock()` $DIR/core/services/pg/locked_db_test.go: `.Open(ctx)` $DIR/core/services/pg/locked_db_test.go: `.SkipShortDB(t)` $DIR/core/services/pg/locked_db_test.go: `.NewGeneralConfig(t, nil)` $DIR/core/services/pg/locked_db_test.go: `.OpenUnlockedDB(config.AppID(), config.Database())` $DIR/core/services/pg/locked_db_test.go: `.AppID()` $DIR/core/services/pg/locked_db_test.go: `.Database()` $DIR/core/services/pg/locked_db_test.go: `.OpenUnlockedDB(config.AppID(), config.Database())` $DIR/core/services/pg/locked_db_test.go: `.AppID()` $DIR/core/services/pg/locked_db_test.go: `.Database()` $DIR/core/services/pg/stats_test.go: `t.Run(scenario.name, func(t *testing.T) { d := newtestDbStater(t, scenario.name) d.Mock.On("Stats").Return(sql.DBStats{}) d.Mock.On("Report").Return() reporter := NewStatsReporter(d.Stats, lggr, StatsInterval(interval), StatsCustomReporterFn(d.Report), ) scenario.testFn( t, reporter, interval, expectedIntervals, ) d.AssertCalled(t, "Stats") d.AssertCalled(t, "Report") })` $DIR/core/services/pg/stats_test.go: `d.Mock.On("Stats").Return(sql.DBStats{})` $DIR/core/services/pg/stats_test.go: `d.Mock.On("Report").Return()` $DIR/core/services/pg/stats_test.go: `scenario.testFn( t, reporter, interval, expectedIntervals, )` $DIR/core/services/pg/stats_test.go: `d.AssertCalled(t, "Stats")` $DIR/core/services/pg/stats_test.go: `d.AssertCalled(t, "Report")` $DIR/core/services/pg/stats_test.go: `.TestLogger(t)` $DIR/core/services/pg/stats_test.go: `.Run(scenario.name, func(t *testing.T) { d := newtestDbStater(t, scenario.name) d.Mock.On("Stats").Return(sql.DBStats{}) d.Mock.On("Report").Return() reporter := NewStatsReporter(d.Stats, lggr, StatsInterval(interval), StatsCustomReporterFn(d.Report), ) scenario.testFn( t, reporter, interval, expectedIntervals, ) d.AssertCalled(t, "Stats") d.AssertCalled(t, "Report") })` $DIR/core/services/pg/stats_test.go: `.Mock.On("Stats")` $DIR/core/services/pg/stats_test.go: `.Return(sql.DBStats{})` $DIR/core/services/pg/stats_test.go: `.Mock.On("Report")` $DIR/core/services/pg/stats_test.go: `.Return()` $DIR/core/services/pg/stats_test.go: `.testFn( t, reporter, interval, expectedIntervals, )` $DIR/core/services/pg/stats_test.go: `.AssertCalled(t, "Stats")` $DIR/core/services/pg/stats_test.go: `.AssertCalled(t, "Report")` $DIR/core/services/pipeline/common_eth_test.go: `t.Run(fmt.Sprintf("%s:%T", tc.abiType, tc.exp), func(t *testing.T) { for _, val := range tt.vals { val := val t.Run(fmt.Sprintf("%T", val), func(t *testing.T) { got, err := convertToETHABIType(val, abiType) require.NoError(t, err) require.NotNil(t, got) require.Equal(t, tc.exp, got) }) } })` $DIR/core/services/pipeline/common_eth_test.go: `t.Run(fmt.Sprintf("%T", val), func(t *testing.T) { got, err := convertToETHABIType(val, abiType) require.NoError(t, err) require.NotNil(t, got) require.Equal(t, tc.exp, got) })` $DIR/core/services/pipeline/common_eth_test.go: `t.Run(fmt.Sprintf("%T,%s", tt.val, tt.errStr), func(t *testing.T) { _, err := convertToETHABIType(tt.val, mustABIType(t, "bytes20")) require.Error(t, err) assert.Contains(t, err.Error(), tt.errStr) })` $DIR/core/services/pipeline/common_eth_test.go: `t.Run(fmt.Sprintf("%T,%s", tt.val, tt.errStr), func(t *testing.T) { a := reflect.TypeOf([20]byte{}) b := reflect.ValueOf(tt.val) _, err := convertToETHABIBytes(a, b, 20) require.Error(t, err) assert.Contains(t, err.Error(), tt.errStr) })` $DIR/core/services/pipeline/common_eth_test.go: `.HexToHash(strings.Repeat("FF", 32))` $DIR/core/services/pipeline/common_eth_test.go: `.Repeat("FF", 32)` $DIR/core/services/pipeline/common_eth_test.go: `.HexToAddress(strings.Repeat("FF", 20))` $DIR/core/services/pipeline/common_eth_test.go: `.Repeat("FF", 20)` $DIR/core/services/pipeline/common_eth_test.go: `.Hex()` $DIR/core/services/pipeline/common_eth_test.go: `.Hex()` $DIR/core/services/pipeline/common_eth_test.go: `.Encode(emptyFunc[:])` $DIR/core/services/pipeline/common_eth_test.go: `.Hex()` $DIR/core/services/pipeline/common_eth_test.go: `.Hex()` $DIR/core/services/pipeline/common_eth_test.go: `.Encode(fullFunc[:])` $DIR/core/services/pipeline/common_eth_test.go: `.Hex()` $DIR/core/services/pipeline/common_eth_test.go: `.Hex()` $DIR/core/services/pipeline/common_eth_test.go: `.Encode(oneFunc[:])` $DIR/core/services/pipeline/common_eth_test.go: `.Run(fmt.Sprintf("%s:%T", tc.abiType, tc.exp), func(t *testing.T) { for _, val := range tt.vals { val := val t.Run(fmt.Sprintf("%T", val), func(t *testing.T) { got, err := convertToETHABIType(val, abiType) require.NoError(t, err) require.NotNil(t, got) require.Equal(t, tc.exp, got) }) } })` $DIR/core/services/pipeline/common_eth_test.go: `.Sprintf("%s:%T", tc.abiType, tc.exp)` $DIR/core/services/pipeline/common_eth_test.go: `.Run(fmt.Sprintf("%T", val), func(t *testing.T) { got, err := convertToETHABIType(val, abiType) require.NoError(t, err) require.NotNil(t, got) require.Equal(t, tc.exp, got) })` $DIR/core/services/pipeline/common_eth_test.go: `.Sprintf("%T", val)` $DIR/core/services/pipeline/common_eth_test.go: `.Run(fmt.Sprintf("%T,%s", tt.val, tt.errStr), func(t *testing.T) { _, err := convertToETHABIType(tt.val, mustABIType(t, "bytes20")) require.Error(t, err) assert.Contains(t, err.Error(), tt.errStr) })` $DIR/core/services/pipeline/common_eth_test.go: `.Sprintf("%T,%s", tt.val, tt.errStr)` $DIR/core/services/pipeline/common_eth_test.go: `.Run(fmt.Sprintf("%T,%s", tt.val, tt.errStr), func(t *testing.T) { a := reflect.TypeOf([20]byte{}) b := reflect.ValueOf(tt.val) _, err := convertToETHABIBytes(a, b, 20) require.Error(t, err) assert.Contains(t, err.Error(), tt.errStr) })` $DIR/core/services/pipeline/common_eth_test.go: `.Sprintf("%T,%s", tt.val, tt.errStr)` $DIR/core/services/pipeline/common_eth_test.go: `.TypeOf([20]byte{})` $DIR/core/services/pipeline/common_eth_test.go: `.ValueOf(tt.val)` $DIR/core/services/pipeline/common_test.go: `a = `ds1 [type=http method=GET url="https://chain.link/voter_turnout/USA-2020" requestData=<{"hi": "hello"}>];`` $DIR/core/services/pipeline/common_test.go: `p, err = pipeline.Parse(a)` $DIR/core/services/pipeline/common_test.go: `timeout, set = p.Tasks[0].TaskTimeout()` $DIR/core/services/pipeline/common_test.go: `t.Run(test.name, func(t *testing.T) { p, err := pipeline.Parse(test.spec) require.NoError(t, err) require.Len(t, p.Tasks, 1) require.Equal(t, test.retries, p.Tasks[0].TaskRetries()) require.Equal(t, test.min, p.Tasks[0].TaskMinBackoff()) require.Equal(t, test.max, p.Tasks[0].TaskMaxBackoff()) })` $DIR/core/services/pipeline/common_test.go: `t.Run("returns error if task is not the right type", func(t *testing.T) { taskMap := interface{}(nil) _, err := pipeline.UnmarshalTaskFromMap(pipeline.TaskType("http"), taskMap, 0, "foo-dot-id") require.EqualError(t, err, "UnmarshalTaskFromMap: UnmarshalTaskFromMap only accepts a map[string]interface{} or a map[string]string. Got () of type ") taskMap = struct { foo time.Time bar int }{time.Unix(42, 42), 42} _, err = pipeline.UnmarshalTaskFromMap(pipeline.TaskType("http"), taskMap, 0, "foo-dot-id") require.Error(t, err) require.Contains(t, err.Error(), "UnmarshalTaskFromMap: UnmarshalTaskFromMap only accepts a map[string]interface{} or a map[string]string") })` $DIR/core/services/pipeline/common_test.go: `taskMap = struct { foo time.Time bar int }{time.Unix(42, 42), 42}` $DIR/core/services/pipeline/common_test.go: `_, err = pipeline.UnmarshalTaskFromMap(pipeline.TaskType("http"), taskMap, 0, "foo-dot-id")` $DIR/core/services/pipeline/common_test.go: `t.Run("unknown task type", func(t *testing.T) { taskMap := map[string]string{} _, err := pipeline.UnmarshalTaskFromMap(pipeline.TaskType("xxx"), taskMap, 0, "foo-dot-id") require.EqualError(t, err, `UnmarshalTaskFromMap: unknown task type: "xxx"`) })` $DIR/core/services/pipeline/common_test.go: `t.Run(string(test.taskType), func(t *testing.T) { taskMap := map[string]string{} task, err := pipeline.UnmarshalTaskFromMap(test.taskType, taskMap, 0, "foo-dot-id") require.NoError(t, err) require.IsType(t, test.expectedTaskType, task) })` $DIR/core/services/pipeline/common_test.go: `t.Run(test.name, func(t *testing.T) { outputs, err := pipeline.CheckInputs(test.pr, test.minLen, test.maxLen, test.maxErrors) if test.err == nil { assert.NoError(t, err) assert.Equal(t, test.outputsLen, len(outputs)) } else { assert.Equal(t, test.err, errors.Cause(err)) } })` $DIR/core/services/pipeline/common_test.go: `c.EVM[0].GasEstimator.LimitDefault = ptr(uint64(999))` $DIR/core/services/pipeline/common_test.go: `c.EVM[0].GasEstimator.LimitJobType = toml.GasLimitJobType{ DR: ptr(uint32(100)), VRF: ptr(uint32(101)), FM: ptr(uint32(102)), OCR: ptr(uint32(103)), Keeper: ptr(uint32(104)), OCR2: ptr(uint32(105)), }` $DIR/core/services/pipeline/common_test.go: `t.Run("spec defined gas limit", func(t *testing.T) { var specGasLimit uint32 = 1 gasLimit := pipeline.SelectGasLimit(cfg.EVM().GasEstimator(), pipeline.DirectRequestJobType, &specGasLimit) assert.Equal(t, uint64(1), gasLimit) })` $DIR/core/services/pipeline/common_test.go: `t.Run("direct request specific gas limit", func(t *testing.T) { gasLimit := pipeline.SelectGasLimit(cfg.EVM().GasEstimator(), pipeline.DirectRequestJobType, nil) assert.Equal(t, uint64(100), gasLimit) })` $DIR/core/services/pipeline/common_test.go: `t.Run("OCR specific gas limit", func(t *testing.T) { gasLimit := pipeline.SelectGasLimit(cfg.EVM().GasEstimator(), pipeline.OffchainReportingJobType, nil) assert.Equal(t, uint64(103), gasLimit) })` $DIR/core/services/pipeline/common_test.go: `t.Run("OCR2 specific gas limit", func(t *testing.T) { gasLimit := pipeline.SelectGasLimit(cfg.EVM().GasEstimator(), pipeline.OffchainReporting2JobType, nil) assert.Equal(t, uint64(105), gasLimit) })` $DIR/core/services/pipeline/common_test.go: `t.Run("VRF specific gas limit", func(t *testing.T) { gasLimit := pipeline.SelectGasLimit(cfg.EVM().GasEstimator(), pipeline.VRFJobType, nil) assert.Equal(t, uint64(101), gasLimit) })` $DIR/core/services/pipeline/common_test.go: `t.Run("flux monitor specific gas limit", func(t *testing.T) { gasLimit := pipeline.SelectGasLimit(cfg.EVM().GasEstimator(), pipeline.FluxMonitorJobType, nil) assert.Equal(t, uint64(102), gasLimit) })` $DIR/core/services/pipeline/common_test.go: `t.Run("keeper specific gas limit", func(t *testing.T) { gasLimit := pipeline.SelectGasLimit(cfg.EVM().GasEstimator(), pipeline.KeeperJobType, nil) assert.Equal(t, uint64(104), gasLimit) })` $DIR/core/services/pipeline/common_test.go: `nextTask = trrs.GetNextTaskOf(*nextTask)` $DIR/core/services/pipeline/common_test.go: `nextTask = trrs.GetNextTaskOf(*nextTask)` $DIR/core/services/pipeline/common_test.go: `nextTask = trrs.GetNextTaskOf(*nextTask)` $DIR/core/services/pipeline/common_test.go: `.Parse(a)` $DIR/core/services/pipeline/common_test.go: `.TaskTimeout()` $DIR/core/services/pipeline/common_test.go: `.Parse(a)` $DIR/core/services/pipeline/common_test.go: `.TaskTimeout()` $DIR/core/services/pipeline/common_test.go: `.Parse(a)` $DIR/core/services/pipeline/common_test.go: `.Parse(a)` $DIR/core/services/pipeline/common_test.go: `.Base()` $DIR/core/services/pipeline/common_test.go: `.Run(test.name, func(t *testing.T) { p, err := pipeline.Parse(test.spec) require.NoError(t, err) require.Len(t, p.Tasks, 1) require.Equal(t, test.retries, p.Tasks[0].TaskRetries()) require.Equal(t, test.min, p.Tasks[0].TaskMinBackoff()) require.Equal(t, test.max, p.Tasks[0].TaskMaxBackoff()) })` $DIR/core/services/pipeline/common_test.go: `.Parse(test.spec)` $DIR/core/services/pipeline/common_test.go: `.Run("returns error if task is not the right type", func(t *testing.T) { taskMap := interface{}(nil) _, err := pipeline.UnmarshalTaskFromMap(pipeline.TaskType("http"), taskMap, 0, "foo-dot-id") require.EqualError(t, err, "UnmarshalTaskFromMap: UnmarshalTaskFromMap only accepts a map[string]interface{} or a map[string]string. Got () of type ") taskMap = struct { foo time.Time bar int }{time.Unix(42, 42), 42} _, err = pipeline.UnmarshalTaskFromMap(pipeline.TaskType("http"), taskMap, 0, "foo-dot-id") require.Error(t, err) require.Contains(t, err.Error(), "UnmarshalTaskFromMap: UnmarshalTaskFromMap only accepts a map[string]interface{} or a map[string]string") })` $DIR/core/services/pipeline/common_test.go: `.UnmarshalTaskFromMap(pipeline.TaskType("http"), taskMap, 0, "foo-dot-id")` $DIR/core/services/pipeline/common_test.go: `.TaskType("http")` $DIR/core/services/pipeline/common_test.go: `.Unix(42, 42)` $DIR/core/services/pipeline/common_test.go: `.UnmarshalTaskFromMap(pipeline.TaskType("http"), taskMap, 0, "foo-dot-id")` $DIR/core/services/pipeline/common_test.go: `.TaskType("http")` $DIR/core/services/pipeline/common_test.go: `.Run("unknown task type", func(t *testing.T) { taskMap := map[string]string{} _, err := pipeline.UnmarshalTaskFromMap(pipeline.TaskType("xxx"), taskMap, 0, "foo-dot-id") require.EqualError(t, err, `UnmarshalTaskFromMap: unknown task type: "xxx"`) })` $DIR/core/services/pipeline/common_test.go: `.UnmarshalTaskFromMap(pipeline.TaskType("xxx"), taskMap, 0, "foo-dot-id")` $DIR/core/services/pipeline/common_test.go: `.TaskType("xxx")` $DIR/core/services/pipeline/common_test.go: `.Run(string(test.taskType), func(t *testing.T) { taskMap := map[string]string{} task, err := pipeline.UnmarshalTaskFromMap(test.taskType, taskMap, 0, "foo-dot-id") require.NoError(t, err) require.IsType(t, test.expectedTaskType, task) })` $DIR/core/services/pipeline/common_test.go: `.UnmarshalTaskFromMap(test.taskType, taskMap, 0, "foo-dot-id")` $DIR/core/services/pipeline/common_test.go: `.New("bar")` $DIR/core/services/pipeline/common_test.go: `.Run(test.name, func(t *testing.T) { outputs, err := pipeline.CheckInputs(test.pr, test.minLen, test.maxLen, test.maxErrors) if test.err == nil { assert.NoError(t, err) assert.Equal(t, test.outputsLen, len(outputs)) } else { assert.Equal(t, test.err, errors.Cause(err)) } })` $DIR/core/services/pipeline/common_test.go: `.CheckInputs(test.pr, test.minLen, test.maxLen, test.maxErrors)` $DIR/core/services/pipeline/common_test.go: `.NewTime(time.Now(), true)` $DIR/core/services/pipeline/common_test.go: `.Now()` $DIR/core/services/pipeline/common_test.go: `.IsPending()` $DIR/core/services/pipeline/common_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.LimitDefault = ptr(uint64(999)) c.EVM[0].GasEstimator.LimitJobType = toml.GasLimitJobType{ DR: ptr(uint32(100)), VRF: ptr(uint32(101)), FM: ptr(uint32(102)), OCR: ptr(uint32(103)), Keeper: ptr(uint32(104)), OCR2: ptr(uint32(105)), } })` $DIR/core/services/pipeline/common_test.go: `.NewChainScopedConfig(t, gcfg)` $DIR/core/services/pipeline/common_test.go: `.Run("spec defined gas limit", func(t *testing.T) { var specGasLimit uint32 = 1 gasLimit := pipeline.SelectGasLimit(cfg.EVM().GasEstimator(), pipeline.DirectRequestJobType, &specGasLimit) assert.Equal(t, uint64(1), gasLimit) })` $DIR/core/services/pipeline/common_test.go: `.SelectGasLimit(cfg.EVM().GasEstimator(), pipeline.DirectRequestJobType, &specGasLimit)` $DIR/core/services/pipeline/common_test.go: `.EVM()` $DIR/core/services/pipeline/common_test.go: `.GasEstimator()` $DIR/core/services/pipeline/common_test.go: `.Run("direct request specific gas limit", func(t *testing.T) { gasLimit := pipeline.SelectGasLimit(cfg.EVM().GasEstimator(), pipeline.DirectRequestJobType, nil) assert.Equal(t, uint64(100), gasLimit) })` $DIR/core/services/pipeline/common_test.go: `.SelectGasLimit(cfg.EVM().GasEstimator(), pipeline.DirectRequestJobType, nil)` $DIR/core/services/pipeline/common_test.go: `.EVM()` $DIR/core/services/pipeline/common_test.go: `.GasEstimator()` $DIR/core/services/pipeline/common_test.go: `.Run("OCR specific gas limit", func(t *testing.T) { gasLimit := pipeline.SelectGasLimit(cfg.EVM().GasEstimator(), pipeline.OffchainReportingJobType, nil) assert.Equal(t, uint64(103), gasLimit) })` $DIR/core/services/pipeline/common_test.go: `.SelectGasLimit(cfg.EVM().GasEstimator(), pipeline.OffchainReportingJobType, nil)` $DIR/core/services/pipeline/common_test.go: `.EVM()` $DIR/core/services/pipeline/common_test.go: `.GasEstimator()` $DIR/core/services/pipeline/common_test.go: `.Run("OCR2 specific gas limit", func(t *testing.T) { gasLimit := pipeline.SelectGasLimit(cfg.EVM().GasEstimator(), pipeline.OffchainReporting2JobType, nil) assert.Equal(t, uint64(105), gasLimit) })` $DIR/core/services/pipeline/common_test.go: `.SelectGasLimit(cfg.EVM().GasEstimator(), pipeline.OffchainReporting2JobType, nil)` $DIR/core/services/pipeline/common_test.go: `.EVM()` $DIR/core/services/pipeline/common_test.go: `.GasEstimator()` $DIR/core/services/pipeline/common_test.go: `.Run("VRF specific gas limit", func(t *testing.T) { gasLimit := pipeline.SelectGasLimit(cfg.EVM().GasEstimator(), pipeline.VRFJobType, nil) assert.Equal(t, uint64(101), gasLimit) })` $DIR/core/services/pipeline/common_test.go: `.SelectGasLimit(cfg.EVM().GasEstimator(), pipeline.VRFJobType, nil)` $DIR/core/services/pipeline/common_test.go: `.EVM()` $DIR/core/services/pipeline/common_test.go: `.GasEstimator()` $DIR/core/services/pipeline/common_test.go: `.Run("flux monitor specific gas limit", func(t *testing.T) { gasLimit := pipeline.SelectGasLimit(cfg.EVM().GasEstimator(), pipeline.FluxMonitorJobType, nil) assert.Equal(t, uint64(102), gasLimit) })` $DIR/core/services/pipeline/common_test.go: `.SelectGasLimit(cfg.EVM().GasEstimator(), pipeline.FluxMonitorJobType, nil)` $DIR/core/services/pipeline/common_test.go: `.EVM()` $DIR/core/services/pipeline/common_test.go: `.GasEstimator()` $DIR/core/services/pipeline/common_test.go: `.Run("keeper specific gas limit", func(t *testing.T) { gasLimit := pipeline.SelectGasLimit(cfg.EVM().GasEstimator(), pipeline.KeeperJobType, nil) assert.Equal(t, uint64(104), gasLimit) })` $DIR/core/services/pipeline/common_test.go: `.SelectGasLimit(cfg.EVM().GasEstimator(), pipeline.KeeperJobType, nil)` $DIR/core/services/pipeline/common_test.go: `.EVM()` $DIR/core/services/pipeline/common_test.go: `.GasEstimator()` $DIR/core/services/pipeline/common_test.go: `.SelectGasLimit(cfg.EVM().GasEstimator(), pipeline.WebhookJobType, nil)` $DIR/core/services/pipeline/common_test.go: `.EVM()` $DIR/core/services/pipeline/common_test.go: `.GasEstimator()` $DIR/core/services/pipeline/common_test.go: `.NewBaseTask(1, "t1", nil, nil, 0)` $DIR/core/services/pipeline/common_test.go: `.NewBaseTask(2, "t2", nil, nil, 0)` $DIR/core/services/pipeline/common_test.go: `.NewBaseTask(3, "t3", nil, nil, 0)` $DIR/core/services/pipeline/common_test.go: `.NewBaseTask(4, "t4", nil, nil, 0)` $DIR/core/services/pipeline/common_test.go: `.GetNextTaskOf(firstTask)` $DIR/core/services/pipeline/common_test.go: `.GetNextTaskOf(*nextTask)` $DIR/core/services/pipeline/common_test.go: `.GetNextTaskOf(*nextTask)` $DIR/core/services/pipeline/common_test.go: `.GetNextTaskOf(*nextTask)` $DIR/core/services/pipeline/getters_test.go: `t.Run(test.expr, func(t *testing.T) { getter := pipeline.VarExpr(test.expr, vars) v, err := getter() if test.err == nil { assert.NoError(t, err) assert.Equal(t, test.result, v) } else { assert.Equal(t, test.err, errors.Cause(err)) } })` $DIR/core/services/pipeline/getters_test.go: `t.Run(test.json, func(t *testing.T) { getter := pipeline.JSONWithVarExprs(test.json, vars, test.allowErrors) v, err := getter() if test.err != nil { assert.Equal(t, test.err, errors.Cause(err)) } else { m, is := v.(map[string]interface{}) if is && test.field != "" { assert.Equal(t, test.result, m[test.field]) } else { assert.Equal(t, test.result, v) } } })` $DIR/core/services/pipeline/getters_test.go: `t.Run("returns the requested input's Value and Error if they exist", func(t *testing.T) { expectedVal := "bar" expectedErr := errors.New("some err") val, err := pipeline.Input([]pipeline.Result{{Value: "foo"}, {Value: expectedVal, Error: expectedErr}, {Value: "baz"}}, 1)() assert.Equal(t, expectedVal, val) assert.Equal(t, expectedErr, err) })` $DIR/core/services/pipeline/getters_test.go: `_, err = pipeline.Input([]pipeline.Result{{Value: "foo"}}, -1)()` $DIR/core/services/pipeline/getters_test.go: `t.Run(test.name, func(t *testing.T) { val, err := pipeline.Inputs(test.inputs)() assert.Equal(t, test.expectedErr, errors.Cause(err)) assert.Equal(t, test.expected, val) })` $DIR/core/services/pipeline/getters_test.go: `t.Run("returns any non-empty string", func(t *testing.T) { val, err := pipeline.NonemptyString("foo bar")() assert.NoError(t, err) assert.Equal(t, "foo bar", val) })` $DIR/core/services/pipeline/getters_test.go: `_, err = pipeline.NonemptyString(" ")()` $DIR/core/services/pipeline/getters_test.go: `t.Run("returns duration in seconds", func(t *testing.T) { val, err := pipeline.ValidDurationInSeconds("10s")() assert.NoError(t, err) assert.Equal(t, 10, val) val, err = pipeline.ValidDurationInSeconds("1m")() assert.NoError(t, err) assert.Equal(t, 60, val) val, err = pipeline.ValidDurationInSeconds("1h")() assert.NoError(t, err) assert.Equal(t, 3600, val) })` $DIR/core/services/pipeline/getters_test.go: `val, err = pipeline.ValidDurationInSeconds("1m")()` $DIR/core/services/pipeline/getters_test.go: `val, err = pipeline.ValidDurationInSeconds("1h")()` $DIR/core/services/pipeline/getters_test.go: `t.Run("returns ErrParameterEmpty when given an empty string (including only spaces)", func(t *testing.T) { _, err := pipeline.ValidDurationInSeconds("")() assert.Equal(t, pipeline.ErrParameterEmpty, errors.Cause(err)) _, err = pipeline.ValidDurationInSeconds(" ")() assert.Equal(t, pipeline.ErrParameterEmpty, errors.Cause(err)) })` $DIR/core/services/pipeline/getters_test.go: `_, err = pipeline.ValidDurationInSeconds(" ")()` $DIR/core/services/pipeline/getters_test.go: `_, err = pipeline.ValidDurationInSeconds("5")()` $DIR/core/services/pipeline/getters_test.go: `_, err = pipeline.ValidDurationInSeconds("!m")()` $DIR/core/services/pipeline/getters_test.go: `t.Run("no inputs", func(t *testing.T) { getters := pipeline.From() assert.Empty(t, getters) })` $DIR/core/services/pipeline/getters_test.go: `t.Run(test.name, func(t *testing.T) { getters := pipeline.From(test.input...) assert.Len(t, getters, 2) for _, getter := range getters { val, err := getter() assert.NoError(t, err) assert.Equal(t, test.expected, val) } })` $DIR/core/services/pipeline/getters_test.go: `.Run(test.expr, func(t *testing.T) { getter := pipeline.VarExpr(test.expr, vars) v, err := getter() if test.err == nil { assert.NoError(t, err) assert.Equal(t, test.result, v) } else { assert.Equal(t, test.err, errors.Cause(err)) } })` $DIR/core/services/pipeline/getters_test.go: `.VarExpr(test.expr, vars)` $DIR/core/services/pipeline/getters_test.go: `.Get("err")` $DIR/core/services/pipeline/getters_test.go: `.SetString("314159265358979323846264338327950288419716939937510582097494459", 10)` $DIR/core/services/pipeline/getters_test.go: `.Run(test.json, func(t *testing.T) { getter := pipeline.JSONWithVarExprs(test.json, vars, test.allowErrors) v, err := getter() if test.err != nil { assert.Equal(t, test.err, errors.Cause(err)) } else { m, is := v.(map[string]interface{}) if is && test.field != "" { assert.Equal(t, test.result, m[test.field]) } else { assert.Equal(t, test.result, v) } } })` $DIR/core/services/pipeline/getters_test.go: `.JSONWithVarExprs(test.json, vars, test.allowErrors)` $DIR/core/services/pipeline/getters_test.go: `.Run("returns the requested input's Value and Error if they exist", func(t *testing.T) { expectedVal := "bar" expectedErr := errors.New("some err") val, err := pipeline.Input([]pipeline.Result{{Value: "foo"}, {Value: expectedVal, Error: expectedErr}, {Value: "baz"}}, 1)() assert.Equal(t, expectedVal, val) assert.Equal(t, expectedErr, err) })` $DIR/core/services/pipeline/getters_test.go: `.New("some err")` $DIR/core/services/pipeline/getters_test.go: `.Input([]pipeline.Result{{Value: "foo"}, {Value: expectedVal, Error: expectedErr}, {Value: "baz"}}, 1)` $DIR/core/services/pipeline/getters_test.go: `.Input([]pipeline.Result{{Value: "foo"}}, 1)` $DIR/core/services/pipeline/getters_test.go: `.Input([]pipeline.Result{{Value: "foo"}}, -1)` $DIR/core/services/pipeline/getters_test.go: `.New("some issue")` $DIR/core/services/pipeline/getters_test.go: `.Run(test.name, func(t *testing.T) { val, err := pipeline.Inputs(test.inputs)() assert.Equal(t, test.expectedErr, errors.Cause(err)) assert.Equal(t, test.expected, val) })` $DIR/core/services/pipeline/getters_test.go: `.Inputs(test.inputs)` $DIR/core/services/pipeline/getters_test.go: `.Run("returns any non-empty string", func(t *testing.T) { val, err := pipeline.NonemptyString("foo bar")() assert.NoError(t, err) assert.Equal(t, "foo bar", val) })` $DIR/core/services/pipeline/getters_test.go: `.NonemptyString("foo bar")` $DIR/core/services/pipeline/getters_test.go: `.NonemptyString("")` $DIR/core/services/pipeline/getters_test.go: `.NonemptyString(" ")` $DIR/core/services/pipeline/getters_test.go: `.Run("returns duration in seconds", func(t *testing.T) { val, err := pipeline.ValidDurationInSeconds("10s")() assert.NoError(t, err) assert.Equal(t, 10, val) val, err = pipeline.ValidDurationInSeconds("1m")() assert.NoError(t, err) assert.Equal(t, 60, val) val, err = pipeline.ValidDurationInSeconds("1h")() assert.NoError(t, err) assert.Equal(t, 3600, val) })` $DIR/core/services/pipeline/getters_test.go: `.ValidDurationInSeconds("10s")` $DIR/core/services/pipeline/getters_test.go: `.ValidDurationInSeconds("1m")` $DIR/core/services/pipeline/getters_test.go: `.ValidDurationInSeconds("1h")` $DIR/core/services/pipeline/getters_test.go: `.Run("returns ErrParameterEmpty when given an empty string (including only spaces)", func(t *testing.T) { _, err := pipeline.ValidDurationInSeconds("")() assert.Equal(t, pipeline.ErrParameterEmpty, errors.Cause(err)) _, err = pipeline.ValidDurationInSeconds(" ")() assert.Equal(t, pipeline.ErrParameterEmpty, errors.Cause(err)) })` $DIR/core/services/pipeline/getters_test.go: `.ValidDurationInSeconds("")` $DIR/core/services/pipeline/getters_test.go: `.ValidDurationInSeconds(" ")` $DIR/core/services/pipeline/getters_test.go: `.ValidDurationInSeconds("1b")` $DIR/core/services/pipeline/getters_test.go: `.ValidDurationInSeconds("5")` $DIR/core/services/pipeline/getters_test.go: `.ValidDurationInSeconds("!m")` $DIR/core/services/pipeline/getters_test.go: `.Run("no inputs", func(t *testing.T) { getters := pipeline.From() assert.Empty(t, getters) })` $DIR/core/services/pipeline/getters_test.go: `.From()` $DIR/core/services/pipeline/getters_test.go: `.Run(test.name, func(t *testing.T) { getters := pipeline.From(test.input...) assert.Len(t, getters, 2) for _, getter := range getters { val, err := getter() assert.NoError(t, err) assert.Equal(t, test.expected, val) } })` $DIR/core/services/pipeline/getters_test.go: `.From(test.input...)` $DIR/core/services/pipeline/graph_test.go: `nodes[n.DOTID()] = n.ID()` $DIR/core/services/pipeline/graph_test.go: `answer1.BaseTask = pipeline.NewBaseTask( 6, "answer1", []pipeline.TaskDependency{ { PropagateResult: false, // propagateResult is false because this dependency is implicit InputTask: pipeline.Task(ds1_multiply), }, { PropagateResult: true, // propagateResult is true because this dependency is explicit in spec InputTask: pipeline.Task(ds2_multiply), }, }, nil, 0)` $DIR/core/services/pipeline/graph_test.go: `answer2.BaseTask = pipeline.NewBaseTask(7, "answer2", nil, nil, 1)` $DIR/core/services/pipeline/graph_test.go: `ds1_multiply.BaseTask = pipeline.NewBaseTask( 2, "ds1_multiply", []pipeline.TaskDependency{{PropagateResult: true, InputTask: pipeline.Task(ds1_parse)}}, []pipeline.Task{answer1}, -1)` $DIR/core/services/pipeline/graph_test.go: `ds2_multiply.BaseTask = pipeline.NewBaseTask( 5, "ds2_multiply", []pipeline.TaskDependency{{PropagateResult: true, InputTask: pipeline.Task(ds2_parse)}}, []pipeline.Task{answer1}, -1)` $DIR/core/services/pipeline/graph_test.go: `ds1_parse.BaseTask = pipeline.NewBaseTask( 1, "ds1_parse", []pipeline.TaskDependency{{PropagateResult: true, InputTask: pipeline.Task(ds1)}}, []pipeline.Task{ds1_multiply}, -1)` $DIR/core/services/pipeline/graph_test.go: `ds2_parse.BaseTask = pipeline.NewBaseTask( 4, "ds2_parse", []pipeline.TaskDependency{{PropagateResult: true, InputTask: pipeline.Task(ds2)}}, []pipeline.Task{ds2_multiply}, -1)` $DIR/core/services/pipeline/graph_test.go: `ds1.BaseTask = pipeline.NewBaseTask(0, "ds1", nil, []pipeline.Task{ds1_parse}, -1)` $DIR/core/services/pipeline/graph_test.go: `ds2.BaseTask = pipeline.NewBaseTask(3, "ds2", nil, []pipeline.Task{ds2_parse}, -1)` $DIR/core/services/pipeline/graph_test.go: `_, err = pipeline.Parse(` a [type=bridge]; b [type=multiply times=1.23]; a -> b -> a; `)` $DIR/core/services/pipeline/graph_test.go: `nodes[n.DOTID()] = n.ID()` $DIR/core/services/pipeline/graph_test.go: `t.Run(s.name, func(t *testing.T) { _, err := pipeline.Parse(s.pipeline) assert.Error(t, err) })` $DIR/core/services/pipeline/graph_test.go: `.NewGraph()` $DIR/core/services/pipeline/graph_test.go: `.UnmarshalText([]byte(pipeline.DotStr))` $DIR/core/services/pipeline/graph_test.go: `.Nodes()` $DIR/core/services/pipeline/graph_test.go: `.Next()` $DIR/core/services/pipeline/graph_test.go: `.Node()` $DIR/core/services/pipeline/graph_test.go: `.DOTID()` $DIR/core/services/pipeline/graph_test.go: `.ID()` $DIR/core/services/pipeline/graph_test.go: `.Parse(pipeline.DotStr)` $DIR/core/services/pipeline/graph_test.go: `.NewBaseTask( 6, "answer1", []pipeline.TaskDependency{ { PropagateResult: false, // propagateResult is false because this dependency is implicit InputTask: pipeline.Task(ds1_multiply), }, { PropagateResult: true, // propagateResult is true because this dependency is explicit in spec InputTask: pipeline.Task(ds2_multiply), }, }, nil, 0)` $DIR/core/services/pipeline/graph_test.go: `.Task(ds1_multiply)` $DIR/core/services/pipeline/graph_test.go: `.Task(ds2_multiply)` $DIR/core/services/pipeline/graph_test.go: `.NewBaseTask(7, "answer2", nil, nil, 1)` $DIR/core/services/pipeline/graph_test.go: `.NewBaseTask( 2, "ds1_multiply", []pipeline.TaskDependency{{PropagateResult: true, InputTask: pipeline.Task(ds1_parse)}}, []pipeline.Task{answer1}, -1)` $DIR/core/services/pipeline/graph_test.go: `.Task(ds1_parse)` $DIR/core/services/pipeline/graph_test.go: `.NewBaseTask( 5, "ds2_multiply", []pipeline.TaskDependency{{PropagateResult: true, InputTask: pipeline.Task(ds2_parse)}}, []pipeline.Task{answer1}, -1)` $DIR/core/services/pipeline/graph_test.go: `.Task(ds2_parse)` $DIR/core/services/pipeline/graph_test.go: `.NewBaseTask( 1, "ds1_parse", []pipeline.TaskDependency{{PropagateResult: true, InputTask: pipeline.Task(ds1)}}, []pipeline.Task{ds1_multiply}, -1)` $DIR/core/services/pipeline/graph_test.go: `.Task(ds1)` $DIR/core/services/pipeline/graph_test.go: `.NewBaseTask( 4, "ds2_parse", []pipeline.TaskDependency{{PropagateResult: true, InputTask: pipeline.Task(ds2)}}, []pipeline.Task{ds2_multiply}, -1)` $DIR/core/services/pipeline/graph_test.go: `.Task(ds2)` $DIR/core/services/pipeline/graph_test.go: `.NewBaseTask(0, "ds1", nil, []pipeline.Task{ds1_parse}, -1)` $DIR/core/services/pipeline/graph_test.go: `.NewBaseTask(3, "ds2", nil, []pipeline.Task{ds2_parse}, -1)` $DIR/core/services/pipeline/graph_test.go: `.Inputs()` $DIR/core/services/pipeline/graph_test.go: `.Outputs()` $DIR/core/services/pipeline/graph_test.go: `.Parse(pipeline.DotStr)` $DIR/core/services/pipeline/graph_test.go: `.Parse(` a [type=bridge]; b [type=multiply times=1.23]; a -> b -> a; `)` $DIR/core/services/pipeline/graph_test.go: `.NewGraph()` $DIR/core/services/pipeline/graph_test.go: `.UnmarshalText([]byte(` a [type=bridge]; b [type=multiply times=1.23 data="$(a.a1)" self="$(b)"]; c [type=xyz times=1.23 input="$(b)"]; d [type=xyz times=1.23 check="{\"a\": $(jobSpec.id),\"b\":$(c.p)}"]; `))` $DIR/core/services/pipeline/graph_test.go: `.Nodes()` $DIR/core/services/pipeline/graph_test.go: `.Next()` $DIR/core/services/pipeline/graph_test.go: `.Node()` $DIR/core/services/pipeline/graph_test.go: `.DOTID()` $DIR/core/services/pipeline/graph_test.go: `.ID()` $DIR/core/services/pipeline/graph_test.go: `.HasEdgeFromTo(nodes["c"], nodes["d"])` $DIR/core/services/pipeline/graph_test.go: `.Run(s.name, func(t *testing.T) { _, err := pipeline.Parse(s.pipeline) assert.Error(t, err) })` $DIR/core/services/pipeline/graph_test.go: `.Parse(s.pipeline)` $DIR/core/services/pipeline/internal/eautils/eautils_test.go: `t.Run(tt.name, func(t *testing.T) { code, ok := BestEffortExtractEAStatus(tt.arg) assert.Equal(t, tt.expectCode, code) assert.Equal(t, tt.expectOk, ok) })` $DIR/core/services/pipeline/internal/eautils/eautils_test.go: `.Run(tt.name, func(t *testing.T) { code, ok := BestEffortExtractEAStatus(tt.arg) assert.Equal(t, tt.expectCode, code) assert.Equal(t, tt.expectOk, ok) })` $DIR/core/services/pipeline/keypath_test.go: `t.Run("can be constructed from a period-delimited string", func(t *testing.T) { kp, err := pipeline.NewKeypathFromString("") assert.NoError(t, err) assert.Equal(t, pipeline.Keypath{}, kp) kp, err = pipeline.NewKeypathFromString("foo") assert.NoError(t, err) assert.Equal(t, pipeline.Keypath{[]string{"foo"}}, kp) kp, err = pipeline.NewKeypathFromString("foo.bar") assert.NoError(t, err) assert.Equal(t, pipeline.Keypath{[]string{"foo", "bar"}}, kp) kp, err = pipeline.NewKeypathFromString("a.b.c.d.e") assert.NoError(t, err) assert.Equal(t, pipeline.Keypath{[]string{"a", "b", "c", "d", "e"}}, kp) })` $DIR/core/services/pipeline/keypath_test.go: `kp, err = pipeline.NewKeypathFromString("foo")` $DIR/core/services/pipeline/keypath_test.go: `kp, err = pipeline.NewKeypathFromString("foo.bar")` $DIR/core/services/pipeline/keypath_test.go: `kp, err = pipeline.NewKeypathFromString("a.b.c.d.e")` $DIR/core/services/pipeline/keypath_test.go: `t.Run(keypath, func(t *testing.T) { _, err := pipeline.NewKeypathFromString(keypath) assert.ErrorIs(t, err, pipeline.ErrWrongKeypath) })` $DIR/core/services/pipeline/keypath_test.go: `.Run("can be constructed from a period-delimited string", func(t *testing.T) { kp, err := pipeline.NewKeypathFromString("") assert.NoError(t, err) assert.Equal(t, pipeline.Keypath{}, kp) kp, err = pipeline.NewKeypathFromString("foo") assert.NoError(t, err) assert.Equal(t, pipeline.Keypath{[]string{"foo"}}, kp) kp, err = pipeline.NewKeypathFromString("foo.bar") assert.NoError(t, err) assert.Equal(t, pipeline.Keypath{[]string{"foo", "bar"}}, kp) kp, err = pipeline.NewKeypathFromString("a.b.c.d.e") assert.NoError(t, err) assert.Equal(t, pipeline.Keypath{[]string{"a", "b", "c", "d", "e"}}, kp) })` $DIR/core/services/pipeline/keypath_test.go: `.NewKeypathFromString("")` $DIR/core/services/pipeline/keypath_test.go: `.NewKeypathFromString("foo")` $DIR/core/services/pipeline/keypath_test.go: `.NewKeypathFromString("foo.bar")` $DIR/core/services/pipeline/keypath_test.go: `.NewKeypathFromString("a.b.c.d.e")` $DIR/core/services/pipeline/keypath_test.go: `.Run(keypath, func(t *testing.T) { _, err := pipeline.NewKeypathFromString(keypath) assert.ErrorIs(t, err, pipeline.ErrWrongKeypath) })` $DIR/core/services/pipeline/keypath_test.go: `.NewKeypathFromString(keypath)` $DIR/core/services/pipeline/models_test.go: `t.Run(tc.name, func(t *testing.T) { assert.Equal(t, tc.want, tc.run.Status()) })` $DIR/core/services/pipeline/models_test.go: `runErrors = append(runErrors, null.NewString("bad thing happened", true))` $DIR/core/services/pipeline/models_test.go: `runErrors = append(runErrors, null.NewString("pretty bad thing happened", true))` $DIR/core/services/pipeline/models_test.go: `runErrors = append(runErrors, null.NewString("", false))` $DIR/core/services/pipeline/models_test.go: `t.Run("invalid outputs", func(t *testing.T) { run := &pipeline.Run{ Outputs: jsonserializable.JSONSerializable{ Valid: false, }, } outputs, err := run.StringOutputs() assert.NoError(t, err) assert.Empty(t, outputs) })` $DIR/core/services/pipeline/models_test.go: `t.Run(tc.name, func(t *testing.T) { run := &pipeline.Run{ Outputs: jsonserializable.JSONSerializable{ Valid: true, Val: []interface{}{tc.val}, }, } t.Log(tc.val) outputs, err := run.StringOutputs() assert.NoError(t, err) assert.NotNil(t, outputs) assert.Len(t, outputs, 1) assert.Equal(t, tc.want, *outputs[0]) })` $DIR/core/services/pipeline/models_test.go: `.TimeFrom(time.Now())` $DIR/core/services/pipeline/models_test.go: `.Now()` $DIR/core/services/pipeline/models_test.go: `.StringFrom(errors.New("fail").Error())` $DIR/core/services/pipeline/models_test.go: `.StringFrom(errors.New("fail").Error())` $DIR/core/services/pipeline/models_test.go: `.Run(tc.name, func(t *testing.T) { assert.Equal(t, tc.want, tc.run.Status()) })` $DIR/core/services/pipeline/models_test.go: `.NewString("bad thing happened", true)` $DIR/core/services/pipeline/models_test.go: `.NewString("pretty bad thing happened", true)` $DIR/core/services/pipeline/models_test.go: `.NewString("", false)` $DIR/core/services/pipeline/models_test.go: `.New("bad thing happened; pretty bad thing happened")` $DIR/core/services/pipeline/models_test.go: `.Run("invalid outputs", func(t *testing.T) { run := &pipeline.Run{ Outputs: jsonserializable.JSONSerializable{ Valid: false, }, } outputs, err := run.StringOutputs() assert.NoError(t, err) assert.Empty(t, outputs) })` $DIR/core/services/pipeline/models_test.go: `.StringOutputs()` $DIR/core/services/pipeline/models_test.go: `.NewInt(123)` $DIR/core/services/pipeline/models_test.go: `.Run(tc.name, func(t *testing.T) { run := &pipeline.Run{ Outputs: jsonserializable.JSONSerializable{ Valid: true, Val: []interface{}{tc.val}, }, } t.Log(tc.val) outputs, err := run.StringOutputs() assert.NoError(t, err) assert.NotNil(t, outputs) assert.Len(t, outputs, 1) assert.Equal(t, tc.want, *outputs[0]) })` $DIR/core/services/pipeline/models_test.go: `.StringOutputs()` $DIR/core/services/pipeline/orm_test.go: `err = db.Get(&actual, "SELECT * FROM pipeline_specs WHERE pipeline_specs.id = $1", id)` $DIR/core/services/pipeline/orm_test.go: `_, err = db.Exec(`SET CONSTRAINTS pipeline_runs_pipeline_spec_id_fkey DEFERRED`)` $DIR/core/services/pipeline/orm_test.go: `_, err = db.Exec(`SET CONSTRAINTS pipeline_runs_pipeline_spec_id_fkey DEFERRED`)` $DIR/core/services/pipeline/orm_test.go: `r.PipelineTaskRuns = []pipeline.TaskRun{ { ID: uuid.New(), PipelineRunID: r.ID, Type: "bridge", DotID: "ds1", CreatedAt: now, FinishedAt: null.TimeFrom(now.Add(100 * time.Millisecond)), }, { ID: uuid.New(), PipelineRunID: r.ID, Type: "median", DotID: "answer2", Output: jsonserializable.JSONSerializable{Val: 1, Valid: true}, CreatedAt: now, FinishedAt: null.TimeFrom(now.Add(200 * time.Millisecond)), }, }` $DIR/core/services/pipeline/orm_test.go: `r.FinishedAt = null.TimeFrom(now.Add(300 * time.Millisecond))` $DIR/core/services/pipeline/orm_test.go: `r.Outputs = jsonserializable.JSONSerializable{ Val: "stuff", Valid: true, }` $DIR/core/services/pipeline/orm_test.go: `r.AllErrors = append(r.AllErrors, null.NewString("", false))` $DIR/core/services/pipeline/orm_test.go: `r.State = pipeline.RunStatusCompleted` $DIR/core/services/pipeline/orm_test.go: `runs = append(runs, &r)` $DIR/core/services/pipeline/orm_test.go: `err = orm.InsertFinishedRuns(ctx, runs, true)` $DIR/core/services/pipeline/orm_test.go: `run.PipelineTaskRuns = []pipeline.TaskRun{ { ID: uuid.New(), PipelineRunID: run.ID, Type: "bridge", DotID: "ds1", CreatedAt: now, FinishedAt: null.TimeFrom(now.Add(100 * time.Millisecond)), }, { ID: uuid.New(), PipelineRunID: run.ID, Type: "median", DotID: "answer2", Output: jsonserializable.JSONSerializable{Val: 1, Valid: true}, CreatedAt: now, FinishedAt: null.TimeFrom(now.Add(200 * time.Millisecond)), }, }` $DIR/core/services/pipeline/orm_test.go: `run.FinishedAt = null.TimeFrom(now.Add(300 * time.Millisecond))` $DIR/core/services/pipeline/orm_test.go: `run.Outputs = jsonserializable.JSONSerializable{ Val: "stuff", Valid: true, }` $DIR/core/services/pipeline/orm_test.go: `run.AllErrors = append(run.AllErrors, null.NewString("", false))` $DIR/core/services/pipeline/orm_test.go: `run.State = pipeline.RunStatusCompleted` $DIR/core/services/pipeline/orm_test.go: `err = orm.InsertFinishedRunWithSpec(ctx, run, true)` $DIR/core/services/pipeline/orm_test.go: `err = db.Get(&pipelineSpec, "SELECT pipeline_specs.* FROM pipeline_specs JOIN job_pipeline_specs ON (pipeline_specs.id = job_pipeline_specs.pipeline_spec_id) WHERE job_pipeline_specs.job_id = $1 AND pipeline_specs.id = $2", jb.ID, run.PipelineSpecID)` $DIR/core/services/pipeline/orm_test.go: `err = db.Get(&jobPipelineSpec, "SELECT * FROM job_pipeline_specs WHERE job_id = $1 AND pipeline_spec_id = $2", jb.ID, pipelineSpec.ID)` $DIR/core/services/pipeline/orm_test.go: `run.PipelineTaskRuns = []pipeline.TaskRun{ // pending task { ID: uuid.New(), PipelineRunID: run.ID, Type: "bridge", DotID: "ds1", CreatedAt: now, FinishedAt: null.Time{}, }, // finished task { ID: uuid.New(), PipelineRunID: run.ID, Type: "median", DotID: "answer2", Output: jsonserializable.JSONSerializable{Val: 1, Valid: true}, CreatedAt: now, FinishedAt: null.TimeFrom(now), }, }` $DIR/core/services/pipeline/orm_test.go: `run = &r` $DIR/core/services/pipeline/orm_test.go: `run.PipelineTaskRuns = []pipeline.TaskRun{ // pending task { ID: uuid.New(), PipelineRunID: run.ID, Type: "bridge", DotID: "ds1", Output: jsonserializable.JSONSerializable{Val: 2, Valid: true}, CreatedAt: now, FinishedAt: null.TimeFrom(now), }, }` $DIR/core/services/pipeline/orm_test.go: `restart, err = orm.StoreRun(ctx, run)` $DIR/core/services/pipeline/orm_test.go: `r, err = orm.FindRun(ctx, run.ID)` $DIR/core/services/pipeline/orm_test.go: `run = &r` $DIR/core/services/pipeline/orm_test.go: `task = run.ByDotID("ds1")` $DIR/core/services/pipeline/orm_test.go: `t.Cleanup(func() { assert.NoError(t, rows.Close()) })` $DIR/core/services/pipeline/orm_test.go: `run.PipelineTaskRuns = []pipeline.TaskRun{ // pending task { ID: ds1_id, PipelineRunID: run.ID, Type: "bridge", DotID: "ds1", CreatedAt: now, FinishedAt: null.Time{}, }, // finished task { ID: uuid.New(), PipelineRunID: run.ID, Type: "median", DotID: "answer2", Output: jsonserializable.JSONSerializable{Val: 1, Valid: true}, CreatedAt: now, FinishedAt: null.TimeFrom(now), }, }` $DIR/core/services/pipeline/orm_test.go: `run.PipelineTaskRuns = []pipeline.TaskRun{ // pending task { ID: ds1_id, PipelineRunID: run.ID, Type: "bridge", DotID: "ds1", CreatedAt: now, FinishedAt: null.Time{}, }, // finished task with json output { ID: uuid.New(), PipelineRunID: run.ID, Type: "cbor_parse", DotID: "ds2", Output: jsonserializable.JSONSerializable{Val: cborOutput, Valid: true}, CreatedAt: now, FinishedAt: null.TimeFrom(now), }, // finished task { ID: uuid.New(), PipelineRunID: run.ID, Type: "median", DotID: "answer2", Output: jsonserializable.JSONSerializable{Val: 1, Valid: true}, CreatedAt: now, FinishedAt: null.TimeFrom(now), }, }` $DIR/core/services/pipeline/orm_test.go: `run = &r` $DIR/core/services/pipeline/orm_test.go: `cborOutput["contractAddress"] = "0x8bd112d3f8f92e41c861939545ad387307af9703"` $DIR/core/services/pipeline/orm_test.go: `run.PipelineTaskRuns = []pipeline.TaskRun{ // pending task { ID: uuid.New(), PipelineRunID: run.ID, Type: "bridge", DotID: "ds1", CreatedAt: now, FinishedAt: null.Time{}, }, // finished task { ID: uuid.New(), PipelineRunID: run.ID, Type: "median", DotID: "answer2", Output: jsonserializable.JSONSerializable{Val: 1, Valid: true}, CreatedAt: now, FinishedAt: null.TimeFrom(now), }, }` $DIR/core/services/pipeline/orm_test.go: `err = orm.DeleteRun(ctx, run.ID)` $DIR/core/services/pipeline/orm_test.go: `_, err = orm.FindRun(ctx, run.ID)` $DIR/core/services/pipeline/orm_test.go: `run.PipelineTaskRuns = []pipeline.TaskRun{ // finished task { ID: uuid.New(), PipelineRunID: run.ID, Type: "median", DotID: "answer2", Output: jsonserializable.JSONSerializable{Val: 1, Valid: true}, CreatedAt: now, FinishedAt: null.TimeFrom(now.Add(-1 * time.Second)), }, }` $DIR/core/services/pipeline/orm_test.go: `run.State = pipeline.RunStatusCompleted` $DIR/core/services/pipeline/orm_test.go: `run.FinishedAt = null.TimeFrom(now.Add(-1 * time.Second))` $DIR/core/services/pipeline/orm_test.go: `run.Outputs = jsonserializable.JSONSerializable{Val: 1, Valid: true}` $DIR/core/services/pipeline/orm_test.go: `run.AllErrors = pipeline.RunErrors{null.StringFrom("SOMETHING")}` $DIR/core/services/pipeline/orm_test.go: `runsIds = append(runsIds, run.ID)` $DIR/core/services/pipeline/orm_test.go: `err = porm.CreateRun(ctx, &pipeline.Run{ PipelineSpecID: keeperJob.PipelineSpecID, PruningKey: keeperJob.ID, State: pipeline.RunStatusRunning, Outputs: jsonserializable.JSONSerializable{}, CreatedAt: time.Now(), PipelineTaskRuns: []pipeline.TaskRun{{ ID: runID1, Type: pipeline.TaskTypeETHTx, Index: 0, Output: jsonserializable.JSONSerializable{}, CreatedAt: time.Now(), DotID: "perform_upkeep_tx", }}, })` $DIR/core/services/pipeline/orm_test.go: `err = porm.CreateRun(ctx, &pipeline.Run{ PipelineSpecID: keeperJob.PipelineSpecID, PruningKey: keeperJob.ID, State: pipeline.RunStatusRunning, Outputs: jsonserializable.JSONSerializable{}, CreatedAt: time.Now(), PipelineTaskRuns: []pipeline.TaskRun{{ ID: runID2, Type: pipeline.TaskTypeETHCall, Index: 1, Output: jsonserializable.JSONSerializable{}, CreatedAt: time.Now(), DotID: "check_upkeep_tx", }}, })` $DIR/core/services/pipeline/orm_test.go: `counter++` $DIR/core/services/pipeline/orm_test.go: `err = porm.CreateRun(ctx, &pipeline.Run{ PipelineSpecID: drJob.PipelineSpecID, PruningKey: drJob.ID, State: pipeline.RunStatusRunning, Outputs: jsonserializable.JSONSerializable{}, CreatedAt: time.Now(), PipelineTaskRuns: []pipeline.TaskRun{{ ID: runningID, Type: pipeline.TaskTypeHTTP, Index: 0, Output: jsonserializable.JSONSerializable{}, CreatedAt: time.Now(), DotID: "ds1", }}, })` $DIR/core/services/pipeline/orm_test.go: `err = porm.CreateRun(ctx, &pipeline.Run{ PipelineSpecID: drJob.PipelineSpecID, PruningKey: drJob.ID, State: pipeline.RunStatusSuspended, Outputs: jsonserializable.JSONSerializable{}, CreatedAt: time.Now(), PipelineTaskRuns: []pipeline.TaskRun{{ ID: uuid.New(), Type: pipeline.TaskTypeHTTP, Index: 1, Output: jsonserializable.JSONSerializable{}, CreatedAt: time.Now(), DotID: "ds1", }}, })` $DIR/core/services/pipeline/orm_test.go: `counter++` $DIR/core/services/pipeline/orm_test.go: `c.JobPipeline.MaxSuccessfulRuns = &n` $DIR/core/services/pipeline/orm_test.go: `t.Run("when there are no runs to prune, does nothing", func(t *testing.T) { ctx := tests.Context(t) porm.Prune(ctx, jobID) // no error logs; it did nothing assert.Empty(t, observed.All()) })` $DIR/core/services/pipeline/orm_test.go: `porm.Prune(ctx, jobID)` $DIR/core/services/pipeline/orm_test.go: `_, err = db.Exec(`SET CONSTRAINTS fk_pipeline_runs_pruning_key DEFERRED`)` $DIR/core/services/pipeline/orm_test.go: `cltest.MustInsertPipelineRunWithStatus(t, db, ps1.ID, pipeline.RunStatusCompleted, jobID)` $DIR/core/services/pipeline/orm_test.go: `cltest.MustInsertPipelineRunWithStatus(t, db, ps2.ID, pipeline.RunStatusCompleted, jobID2)` $DIR/core/services/pipeline/orm_test.go: `cltest.MustInsertPipelineRunWithStatus(t, db, ps2.ID, pipeline.RunStatusErrored, jobID2)` $DIR/core/services/pipeline/orm_test.go: `cltest.MustInsertPipelineRunWithStatus(t, db, ps2.ID, pipeline.RunStatusRunning, jobID2)` $DIR/core/services/pipeline/orm_test.go: `cltest.MustInsertPipelineRunWithStatus(t, db, ps2.ID, pipeline.RunStatusSuspended, jobID2)` $DIR/core/services/pipeline/orm_test.go: `porm.Prune(tests.Context(t), jobID2)` $DIR/core/services/pipeline/orm_test.go: `cnt = pgtest.MustCount(t, db, "SELECT count(*) FROM pipeline_runs WHERE pipeline_spec_id = $1 AND state = $2", ps2.ID, pipeline.RunStatusCompleted)` $DIR/core/services/pipeline/orm_test.go: `cnt = pgtest.MustCount(t, db, "SELECT count(*) FROM pipeline_runs WHERE pipeline_spec_id = $1 AND state = $2", ps2.ID, pipeline.RunStatusErrored)` $DIR/core/services/pipeline/orm_test.go: `cnt = pgtest.MustCount(t, db, "SELECT count(*) FROM pipeline_runs WHERE pipeline_spec_id = $1 AND state = $2", ps2.ID, pipeline.RunStatusRunning)` $DIR/core/services/pipeline/orm_test.go: `cnt = pgtest.MustCount(t, db, "SELECT count(*) FROM pipeline_runs WHERE pipeline_spec_id = $1 AND state = $2", ps2.ID, pipeline.RunStatusSuspended)` $DIR/core/services/pipeline/orm_test.go: `.Context(t)` $DIR/core/services/pipeline/orm_test.go: `.Interval(1 * time.Minute)` $DIR/core/services/pipeline/orm_test.go: `.CreateSpec(ctx, p, maxTaskDuration)` $DIR/core/services/pipeline/orm_test.go: `.Get(&actual, "SELECT * FROM pipeline_specs WHERE pipeline_specs.id = $1", id)` $DIR/core/services/pipeline/orm_test.go: `.Exec(`SET CONSTRAINTS fk_pipeline_runs_pruning_key DEFERRED`)` $DIR/core/services/pipeline/orm_test.go: `.Exec(`SET CONSTRAINTS pipeline_runs_pipeline_spec_id_fkey DEFERRED`)` $DIR/core/services/pipeline/orm_test.go: `.Context(t)` $DIR/core/services/pipeline/orm_test.go: `.FindRun(ctx, expected.ID)` $DIR/core/services/pipeline/orm_test.go: `.Context(t)` $DIR/core/services/pipeline/orm_test.go: `.Exec(`SET CONSTRAINTS fk_pipeline_runs_pruning_key DEFERRED`)` $DIR/core/services/pipeline/orm_test.go: `.Exec(`SET CONSTRAINTS pipeline_runs_pipeline_spec_id_fkey DEFERRED`)` $DIR/core/services/pipeline/orm_test.go: `.MustInsertPipelineSpec(t, db)` $DIR/core/services/pipeline/orm_test.go: `.Now()` $DIR/core/services/pipeline/orm_test.go: `.New()` $DIR/core/services/pipeline/orm_test.go: `.TimeFrom(now.Add(100 * time.Millisecond))` $DIR/core/services/pipeline/orm_test.go: `.Add(100 * time.Millisecond)` $DIR/core/services/pipeline/orm_test.go: `.New()` $DIR/core/services/pipeline/orm_test.go: `.TimeFrom(now.Add(200 * time.Millisecond))` $DIR/core/services/pipeline/orm_test.go: `.Add(200 * time.Millisecond)` $DIR/core/services/pipeline/orm_test.go: `.TimeFrom(now.Add(300 * time.Millisecond))` $DIR/core/services/pipeline/orm_test.go: `.Add(300 * time.Millisecond)` $DIR/core/services/pipeline/orm_test.go: `.NewString("", false)` $DIR/core/services/pipeline/orm_test.go: `.InsertFinishedRuns(ctx, runs, true)` $DIR/core/services/pipeline/orm_test.go: `.Context(t)` $DIR/core/services/pipeline/orm_test.go: `.Interval(1 * time.Minute)` $DIR/core/services/pipeline/orm_test.go: `.NewEIP55Address()` $DIR/core/services/pipeline/orm_test.go: `.CreateJob(ctx, &jb)` $DIR/core/services/pipeline/orm_test.go: `.Now()` $DIR/core/services/pipeline/orm_test.go: `.Interval(1 * time.Minute)` $DIR/core/services/pipeline/orm_test.go: `.Name.ValueOrZero()` $DIR/core/services/pipeline/orm_test.go: `.Name.ValueOrZero()` $DIR/core/services/pipeline/orm_test.go: `.Now()` $DIR/core/services/pipeline/orm_test.go: `.NewRun(spec, pipeline.NewVarsFrom(defaultVars))` $DIR/core/services/pipeline/orm_test.go: `.NewVarsFrom(defaultVars)` $DIR/core/services/pipeline/orm_test.go: `.New()` $DIR/core/services/pipeline/orm_test.go: `.TimeFrom(now.Add(100 * time.Millisecond))` $DIR/core/services/pipeline/orm_test.go: `.Add(100 * time.Millisecond)` $DIR/core/services/pipeline/orm_test.go: `.New()` $DIR/core/services/pipeline/orm_test.go: `.TimeFrom(now.Add(200 * time.Millisecond))` $DIR/core/services/pipeline/orm_test.go: `.Add(200 * time.Millisecond)` $DIR/core/services/pipeline/orm_test.go: `.TimeFrom(now.Add(300 * time.Millisecond))` $DIR/core/services/pipeline/orm_test.go: `.Add(300 * time.Millisecond)` $DIR/core/services/pipeline/orm_test.go: `.NewString("", false)` $DIR/core/services/pipeline/orm_test.go: `.InsertFinishedRunWithSpec(ctx, run, true)` $DIR/core/services/pipeline/orm_test.go: `.Get(&pipelineSpec, "SELECT pipeline_specs.* FROM pipeline_specs JOIN job_pipeline_specs ON (pipeline_specs.id = job_pipeline_specs.pipeline_spec_id) WHERE job_pipeline_specs.job_id = $1 AND pipeline_specs.id = $2", jb.ID, run.PipelineSpecID)` $DIR/core/services/pipeline/orm_test.go: `.Get(&jobPipelineSpec, "SELECT * FROM job_pipeline_specs WHERE job_id = $1 AND pipeline_spec_id = $2", jb.ID, pipelineSpec.ID)` $DIR/core/services/pipeline/orm_test.go: `.Context(t)` $DIR/core/services/pipeline/orm_test.go: `.Now()` $DIR/core/services/pipeline/orm_test.go: `.New()` $DIR/core/services/pipeline/orm_test.go: `.New()` $DIR/core/services/pipeline/orm_test.go: `.TimeFrom(now)` $DIR/core/services/pipeline/orm_test.go: `.StoreRun(ctx, run)` $DIR/core/services/pipeline/orm_test.go: `.FindRun(ctx, run.ID)` $DIR/core/services/pipeline/orm_test.go: `.ByDotID("ds1")` $DIR/core/services/pipeline/orm_test.go: `.New()` $DIR/core/services/pipeline/orm_test.go: `.TimeFrom(now)` $DIR/core/services/pipeline/orm_test.go: `.StoreRun(ctx, run)` $DIR/core/services/pipeline/orm_test.go: `.FindRun(ctx, run.ID)` $DIR/core/services/pipeline/orm_test.go: `.ByDotID("ds1")` $DIR/core/services/pipeline/orm_test.go: `.Context(t)` $DIR/core/services/pipeline/orm_test.go: `.FindRun(ctx, run.ID)` $DIR/core/services/pipeline/orm_test.go: `.Now()` $DIR/core/services/pipeline/orm_test.go: `.New()` $DIR/core/services/pipeline/orm_test.go: `.NamedQuery(` INSERT INTO pipeline_task_runs (pipeline_run_id, id, type, index, output, error, dot_id, created_at, finished_at) VALUES (:pipeline_run_id, :id, :type, :index, :output, :error, :dot_id, :created_at, :finished_at) `, pipeline.TaskRun{ ID: ds1_id, PipelineRunID: run.ID, Type: "bridge", DotID: "ds1", Output: jsonserializable.JSONSerializable{Val: 2, Valid: true}, CreatedAt: now, FinishedAt: null.TimeFrom(now), })` $DIR/core/services/pipeline/orm_test.go: `.TimeFrom(now)` $DIR/core/services/pipeline/orm_test.go: `.Cleanup(func() { assert.NoError(t, rows.Close()) })` $DIR/core/services/pipeline/orm_test.go: `.New()` $DIR/core/services/pipeline/orm_test.go: `.TimeFrom(now)` $DIR/core/services/pipeline/orm_test.go: `.StoreRun(ctx, run)` $DIR/core/services/pipeline/orm_test.go: `.ByDotID("ds1")` $DIR/core/services/pipeline/orm_test.go: `.Context(t)` $DIR/core/services/pipeline/orm_test.go: `.New()` $DIR/core/services/pipeline/orm_test.go: `.Now()` $DIR/core/services/pipeline/orm_test.go: `.DecodeString("0x8bd112d3f8f92e41c861939545ad387307af9703")` $DIR/core/services/pipeline/orm_test.go: `.New()` $DIR/core/services/pipeline/orm_test.go: `.TimeFrom(now)` $DIR/core/services/pipeline/orm_test.go: `.New()` $DIR/core/services/pipeline/orm_test.go: `.TimeFrom(now)` $DIR/core/services/pipeline/orm_test.go: `.StoreRun(ctx, run)` $DIR/core/services/pipeline/orm_test.go: `.UpdateTaskRunResult(ctx, ds1_id, pipeline.Result{Value: "foo"})` $DIR/core/services/pipeline/orm_test.go: `.ByDotID("ds1")` $DIR/core/services/pipeline/orm_test.go: `.ByDotID("ds2")` $DIR/core/services/pipeline/orm_test.go: `.Context(t)` $DIR/core/services/pipeline/orm_test.go: `.Now()` $DIR/core/services/pipeline/orm_test.go: `.New()` $DIR/core/services/pipeline/orm_test.go: `.New()` $DIR/core/services/pipeline/orm_test.go: `.TimeFrom(now)` $DIR/core/services/pipeline/orm_test.go: `.StoreRun(ctx, run)` $DIR/core/services/pipeline/orm_test.go: `.DeleteRun(ctx, run.ID)` $DIR/core/services/pipeline/orm_test.go: `.FindRun(ctx, run.ID)` $DIR/core/services/pipeline/orm_test.go: `.Context(t)` $DIR/core/services/pipeline/orm_test.go: `.Now()` $DIR/core/services/pipeline/orm_test.go: `.New()` $DIR/core/services/pipeline/orm_test.go: `.TimeFrom(now.Add(-1 * time.Second))` $DIR/core/services/pipeline/orm_test.go: `.Add(-1 * time.Second)` $DIR/core/services/pipeline/orm_test.go: `.TimeFrom(now.Add(-1 * time.Second))` $DIR/core/services/pipeline/orm_test.go: `.Add(-1 * time.Second)` $DIR/core/services/pipeline/orm_test.go: `.StringFrom("SOMETHING")` $DIR/core/services/pipeline/orm_test.go: `.StoreRun(ctx, run)` $DIR/core/services/pipeline/orm_test.go: `.DeleteRunsOlderThan(testutils.Context(t), 1*time.Second)` $DIR/core/services/pipeline/orm_test.go: `.Context(t)` $DIR/core/services/pipeline/orm_test.go: `.FindRun(ctx, runId)` $DIR/core/services/pipeline/orm_test.go: `.Context(t)` $DIR/core/services/pipeline/orm_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/orm_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/pipeline/orm_test.go: `.NewORM(db, lggr, config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/pipeline/orm_test.go: `.JobPipeline()` $DIR/core/services/pipeline/orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/pipeline/orm_test.go: `.NewORM(db)` $DIR/core/services/pipeline/orm_test.go: `.NewORM(db, porm, bridgeORM, keyStore, lggr)` $DIR/core/services/pipeline/orm_test.go: `.Now()` $DIR/core/services/pipeline/orm_test.go: `.NewEIP55Address()` $DIR/core/services/pipeline/orm_test.go: `.NewEIP55Address()` $DIR/core/services/pipeline/orm_test.go: `.MustParse("0EEC7E1D-D0D2-476C-A1A8-72DFB6633F46")` $DIR/core/services/pipeline/orm_test.go: `.StringFrom("test")` $DIR/core/services/pipeline/orm_test.go: `.Interval(1 * time.Minute)` $DIR/core/services/pipeline/orm_test.go: `.CreateJob(ctx, &keeperJob)` $DIR/core/services/pipeline/orm_test.go: `.New()` $DIR/core/services/pipeline/orm_test.go: `.New()` $DIR/core/services/pipeline/orm_test.go: `.CreateRun(ctx, &pipeline.Run{ PipelineSpecID: keeperJob.PipelineSpecID, PruningKey: keeperJob.ID, State: pipeline.RunStatusRunning, Outputs: jsonserializable.JSONSerializable{}, CreatedAt: time.Now(), PipelineTaskRuns: []pipeline.TaskRun{{ ID: runID1, Type: pipeline.TaskTypeETHTx, Index: 0, Output: jsonserializable.JSONSerializable{}, CreatedAt: time.Now(), DotID: "perform_upkeep_tx", }}, })` $DIR/core/services/pipeline/orm_test.go: `.Now()` $DIR/core/services/pipeline/orm_test.go: `.Now()` $DIR/core/services/pipeline/orm_test.go: `.CreateRun(ctx, &pipeline.Run{ PipelineSpecID: keeperJob.PipelineSpecID, PruningKey: keeperJob.ID, State: pipeline.RunStatusRunning, Outputs: jsonserializable.JSONSerializable{}, CreatedAt: time.Now(), PipelineTaskRuns: []pipeline.TaskRun{{ ID: runID2, Type: pipeline.TaskTypeETHCall, Index: 1, Output: jsonserializable.JSONSerializable{}, CreatedAt: time.Now(), DotID: "check_upkeep_tx", }}, })` $DIR/core/services/pipeline/orm_test.go: `.Now()` $DIR/core/services/pipeline/orm_test.go: `.Now()` $DIR/core/services/pipeline/orm_test.go: `.GetUnfinishedRuns(testutils.Context(t), time.Now(), func(run pipeline.Run) error { counter++ require.Equal(t, job.Keeper.String(), run.PipelineSpec.JobType) require.Equal(t, pipeline.KeepersObservationSource, run.PipelineSpec.DotDagSource) require.NotEmpty(t, run.PipelineTaskRuns) switch run.PipelineTaskRuns[0].ID { case runID1: trun := run.ByDotID("perform_upkeep_tx") require.NotNil(t, trun) case runID2: trun := run.ByDotID("check_upkeep_tx") require.NotNil(t, trun) } return nil })` $DIR/core/services/pipeline/orm_test.go: `.Context(t)` $DIR/core/services/pipeline/orm_test.go: `.Now()` $DIR/core/services/pipeline/orm_test.go: `.ByDotID("perform_upkeep_tx")` $DIR/core/services/pipeline/orm_test.go: `.ByDotID("check_upkeep_tx")` $DIR/core/services/pipeline/orm_test.go: `.Context(t)` $DIR/core/services/pipeline/orm_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/orm_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/orm_test.go: `.NewKeyStore(t, db)` $DIR/core/services/pipeline/orm_test.go: `.NewORM(db, lggr, config.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/pipeline/orm_test.go: `.JobPipeline()` $DIR/core/services/pipeline/orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/pipeline/orm_test.go: `.NewORM(db)` $DIR/core/services/pipeline/orm_test.go: `.NewORM(db, porm, bridgeORM, keyStore, lggr)` $DIR/core/services/pipeline/orm_test.go: `.Now()` $DIR/core/services/pipeline/orm_test.go: `.NewEIP55Address()` $DIR/core/services/pipeline/orm_test.go: `.MustParse("0EEC7E1D-D0D2-476C-A1A8-72DFB6633F46")` $DIR/core/services/pipeline/orm_test.go: `.StringFrom("test")` $DIR/core/services/pipeline/orm_test.go: `.Interval(1 * time.Minute)` $DIR/core/services/pipeline/orm_test.go: `.CreateJob(ctx, &drJob)` $DIR/core/services/pipeline/orm_test.go: `.New()` $DIR/core/services/pipeline/orm_test.go: `.CreateRun(ctx, &pipeline.Run{ PipelineSpecID: drJob.PipelineSpecID, PruningKey: drJob.ID, State: pipeline.RunStatusRunning, Outputs: jsonserializable.JSONSerializable{}, CreatedAt: time.Now(), PipelineTaskRuns: []pipeline.TaskRun{{ ID: runningID, Type: pipeline.TaskTypeHTTP, Index: 0, Output: jsonserializable.JSONSerializable{}, CreatedAt: time.Now(), DotID: "ds1", }}, })` $DIR/core/services/pipeline/orm_test.go: `.Now()` $DIR/core/services/pipeline/orm_test.go: `.Now()` $DIR/core/services/pipeline/orm_test.go: `.CreateRun(ctx, &pipeline.Run{ PipelineSpecID: drJob.PipelineSpecID, PruningKey: drJob.ID, State: pipeline.RunStatusSuspended, Outputs: jsonserializable.JSONSerializable{}, CreatedAt: time.Now(), PipelineTaskRuns: []pipeline.TaskRun{{ ID: uuid.New(), Type: pipeline.TaskTypeHTTP, Index: 1, Output: jsonserializable.JSONSerializable{}, CreatedAt: time.Now(), DotID: "ds1", }}, })` $DIR/core/services/pipeline/orm_test.go: `.Now()` $DIR/core/services/pipeline/orm_test.go: `.New()` $DIR/core/services/pipeline/orm_test.go: `.Now()` $DIR/core/services/pipeline/orm_test.go: `.GetUnfinishedRuns(testutils.Context(t), time.Now(), func(run pipeline.Run) error { counter++ require.Equal(t, job.DirectRequest.String(), run.PipelineSpec.JobType) require.NotEmpty(t, run.PipelineTaskRuns) require.Equal(t, runningID, run.PipelineTaskRuns[0].ID) trun := run.ByDotID("ds1") require.NotNil(t, trun) return nil })` $DIR/core/services/pipeline/orm_test.go: `.Context(t)` $DIR/core/services/pipeline/orm_test.go: `.Now()` $DIR/core/services/pipeline/orm_test.go: `.ByDotID("ds1")` $DIR/core/services/pipeline/orm_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.JobPipeline.MaxSuccessfulRuns = &n })` $DIR/core/services/pipeline/orm_test.go: `.TestLoggerObserved(t, zapcore.DebugLevel)` $DIR/core/services/pipeline/orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/orm_test.go: `.NewORM(db, lggr, cfg.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/pipeline/orm_test.go: `.JobPipeline()` $DIR/core/services/pipeline/orm_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/pipeline/orm_test.go: `.MustInsertPipelineSpec(t, db)` $DIR/core/services/pipeline/orm_test.go: `.AddJobPipelineSpecWithoutConstraints(testutils.Context(t), ps1.ID, ps1.ID)` $DIR/core/services/pipeline/orm_test.go: `.Context(t)` $DIR/core/services/pipeline/orm_test.go: `.Run("when there are no runs to prune, does nothing", func(t *testing.T) { ctx := tests.Context(t) porm.Prune(ctx, jobID) // no error logs; it did nothing assert.Empty(t, observed.All()) })` $DIR/core/services/pipeline/orm_test.go: `.Context(t)` $DIR/core/services/pipeline/orm_test.go: `.Prune(ctx, jobID)` $DIR/core/services/pipeline/orm_test.go: `.Exec(`SET CONSTRAINTS fk_pipeline_runs_pruning_key DEFERRED`)` $DIR/core/services/pipeline/orm_test.go: `.MustInsertPipelineRunWithStatus(t, db, ps1.ID, pipeline.RunStatusCompleted, jobID)` $DIR/core/services/pipeline/orm_test.go: `.MustInsertPipelineSpec(t, db)` $DIR/core/services/pipeline/orm_test.go: `.MustInsertPipelineRunWithStatus(t, db, ps2.ID, pipeline.RunStatusCompleted, jobID2)` $DIR/core/services/pipeline/orm_test.go: `.MustInsertPipelineRunWithStatus(t, db, ps2.ID, pipeline.RunStatusErrored, jobID2)` $DIR/core/services/pipeline/orm_test.go: `.MustInsertPipelineRunWithStatus(t, db, ps2.ID, pipeline.RunStatusRunning, jobID2)` $DIR/core/services/pipeline/orm_test.go: `.MustInsertPipelineRunWithStatus(t, db, ps2.ID, pipeline.RunStatusSuspended, jobID2)` $DIR/core/services/pipeline/orm_test.go: `.Prune(tests.Context(t), jobID2)` $DIR/core/services/pipeline/orm_test.go: `.Context(t)` $DIR/core/services/pipeline/orm_test.go: `.MustCount(t, db, "SELECT count(*) FROM pipeline_runs WHERE pipeline_spec_id = $1 AND state = $2", ps1.ID, pipeline.RunStatusCompleted)` $DIR/core/services/pipeline/orm_test.go: `.MustCount(t, db, "SELECT count(*) FROM pipeline_runs WHERE pipeline_spec_id = $1 AND state = $2", ps2.ID, pipeline.RunStatusCompleted)` $DIR/core/services/pipeline/orm_test.go: `.MustCount(t, db, "SELECT count(*) FROM pipeline_runs WHERE pipeline_spec_id = $1 AND state = $2", ps2.ID, pipeline.RunStatusErrored)` $DIR/core/services/pipeline/orm_test.go: `.MustCount(t, db, "SELECT count(*) FROM pipeline_runs WHERE pipeline_spec_id = $1 AND state = $2", ps2.ID, pipeline.RunStatusRunning)` $DIR/core/services/pipeline/orm_test.go: `.MustCount(t, db, "SELECT count(*) FROM pipeline_runs WHERE pipeline_spec_id = $1 AND state = $2", ps2.ID, pipeline.RunStatusSuspended)` $DIR/core/services/pipeline/runner_test.go: `btORM.On("FindBridge", mock.Anything, bt.Name).Return(*bt, nil).Once()` $DIR/core/services/pipeline/runner_test.go: `errorResults = append(errorResults, trr)` $DIR/core/services/pipeline/runner_test.go: `t.Run(test.name, func(t *testing.T) { t.Parallel() db := pgtest.NewSqlxDB(t) cfg := configtest.NewTestGeneralConfig(t) expectedRequestDS1 := map[string]interface{}{"data": test.vars["foo"]} expectedRequestDS2 := map[string]interface{}{"data": []interface{}{test.vars["bar"], test.vars["baz"]}} expectedRequestSubmit := map[string]interface{}{ "median": "9650000000000000000000", "fetchedValues": []interface{}{"9700", "9600"}, "someString": "some random string", } if test.meta != nil { expectedRequestDS1["meta"] = test.meta expectedRequestSubmit["meta"] = test.meta test.vars["jobRun"] = map[string]interface{}{"meta": test.meta} } if test.includeInputAtKey != "" { expectedRequestSubmit[test.includeInputAtKey] = "9650000000000000000000" } btORM := bridgesMocks.NewORM(t) // 1. Setup bridge ds1, bridge := makeBridge(t, db, expectedRequestDS1, map[string]interface{}{ "data": map[string]interface{}{ "result": map[string]interface{}{ "result": decimal.NewFromInt(9700), "times": "1000000000000000000", }, }, }) defer ds1.Close() btORM.On("FindBridge", mock.Anything, bridge.Name).Return(bridge, nil).Once() // 2. Setup success HTTP ds2 := httptest.NewServer(fakeExternalAdapter(t, expectedRequestDS2, map[string]interface{}{ "data": map[string]interface{}{ "result": decimal.NewFromInt(9600), "times": "1000000000000000000", }, })) defer ds2.Close() ds4 := httptest.NewServer(fakeStringResponder(t, "some random string")) defer ds4.Close() // 3. Setup final bridge task submit, submitBt := makeBridge(t, db, expectedRequestSubmit, map[string]interface{}{"ok": true}) defer submit.Close() btORM.On("FindBridge", mock.Anything, submitBt.Name).Return(submitBt, nil).Once() runner, _ := newRunner(t, db, btORM, cfg) specStr := taskRunWithVars{ bridgeName: bridge.Name.String(), ds2URL: ds2.URL, ds4URL: ds4.URL, submitBridgeName: submitBt.Name.String(), includeInputAtKey: test.includeInputAtKey, }.String() p, err := pipeline.Parse(specStr) require.NoError(t, err) spec := pipeline.Spec{ DotDagSource: specStr, } _, taskRunResults, err := runner.ExecuteRun(testutils.Context(t), spec, pipeline.NewVarsFrom(test.vars), logger.TestLogger(t)) require.NoError(t, err) require.Len(t, taskRunResults, len(p.Tasks)) expectedResults := map[string]pipeline.Result{ "ds1": {Value: `{"data":{"result":{"result":"9700","times":"1000000000000000000"}}}` + "\n"}, "ds1_parse": {Value: map[string]interface{}{"result": "9700", "times": "1000000000000000000"}}, "ds1_multiply": {Value: *mustDecimal(t, "9700000000000000000000")}, "ds2": {Value: `{"data":{"result":"9600","times":"1000000000000000000"}}` + "\n"}, "ds2_parse": {Value: map[string]interface{}{"result": "9600", "times": "1000000000000000000"}}, "ds2_multiply": {Value: *mustDecimal(t, "9600000000000000000000")}, "ds3": {Error: errors.New(`error making http request: Post "blah://test.invalid": unsupported protocol scheme "blah"`)}, "ds3_parse": {Error: pipeline.ErrTooManyErrors}, "ds3_multiply": {Error: pipeline.ErrTooManyErrors}, "ds4": {Value: "some random string"}, "median": {Value: *mustDecimal(t, "9650000000000000000000")}, "submit": {Value: `{"ok":true}` + "\n"}, } for _, r := range taskRunResults { expected := expectedResults[r.Task.DotID()] if expected.Error != nil { require.Error(t, r.Result.Error) require.Contains(t, r.Result.Error.Error(), expected.Error.Error()) } else { if d, is := expected.Value.(decimal.Decimal); is { require.Equal(t, d.String(), r.Result.Value.(decimal.Decimal).String()) } else { require.Equal(t, expected.Value, r.Result.Value) } } } })` $DIR/core/services/pipeline/runner_test.go: `expectedRequestDS1["meta"] = test.meta` $DIR/core/services/pipeline/runner_test.go: `expectedRequestSubmit["meta"] = test.meta` $DIR/core/services/pipeline/runner_test.go: `test.vars["jobRun"] = map[string]interface{}{"meta": test.meta}` $DIR/core/services/pipeline/runner_test.go: `expectedRequestSubmit[test.includeInputAtKey] = "9650000000000000000000"` $DIR/core/services/pipeline/runner_test.go: `btORM.On("FindBridge", mock.Anything, bridge.Name).Return(bridge, nil).Once()` $DIR/core/services/pipeline/runner_test.go: `btORM.On("FindBridge", mock.Anything, submitBt.Name).Return(submitBt, nil).Once()` $DIR/core/services/pipeline/runner_test.go: `t.Run("diet mode, empty CBOR", func(t *testing.T) { s := CBORDietEmpty d, err := pipeline.Parse(s) require.NoError(t, err) spec := pipeline.Spec{DotDagSource: s} global := make(map[string]interface{}) jobRun := make(map[string]interface{}) global["jobRun"] = jobRun jobRun["logData"] = hexutil.MustDecode("0x0000000000000000000000009c26cc46f57667cba75556014c8e0d5ed7c5b83d17a526ff5d8f916fa2f4a218f6ce0a6e410a0d7823f8238979f8579c2145fd6f0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000009c26cc46f57667cba75556014c8e0d5ed7c5b83d64ef935700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006148ef28000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000") jobRun["logTopics"] = []common.Hash{ common.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65"), common.HexToHash("0x3963386131316165393962363463373161663333376235643831633737353230"), } vars := pipeline.NewVarsFrom(global) lggr := logger.TestLogger(t) _, trrs, err := r.ExecuteRun(testutils.Context(t), spec, vars, lggr) require.NoError(t, err) require.Len(t, trrs, len(d.Tasks)) finalResults := trrs.FinalResult(lggr) require.Len(t, finalResults.Values, 1) assert.Equal(t, make(map[string]interface{}), finalResults.Values[0]) require.Len(t, finalResults.FatalErrors, 1) assert.Nil(t, finalResults.FatalErrors[0]) })` $DIR/core/services/pipeline/runner_test.go: `global["jobRun"] = jobRun` $DIR/core/services/pipeline/runner_test.go: `jobRun["logData"] = hexutil.MustDecode("0x0000000000000000000000009c26cc46f57667cba75556014c8e0d5ed7c5b83d17a526ff5d8f916fa2f4a218f6ce0a6e410a0d7823f8238979f8579c2145fd6f0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000009c26cc46f57667cba75556014c8e0d5ed7c5b83d64ef935700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006148ef28000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000")` $DIR/core/services/pipeline/runner_test.go: `jobRun["logTopics"] = []common.Hash{ common.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65"), common.HexToHash("0x3963386131316165393962363463373161663333376235643831633737353230"), }` $DIR/core/services/pipeline/runner_test.go: `global["jobRun"] = jobRun` $DIR/core/services/pipeline/runner_test.go: `jobRun["logData"] = hexutil.MustDecode("0x0000000000000000000000009c26cc46f57667cba75556014c8e0d5ed7c5b83d17a526ff5d8f916fa2f4a218f6ce0a6e410a0d7823f8238979f8579c2145fd6f0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000009c26cc46f57667cba75556014c8e0d5ed7c5b83d64ef935700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006148ef2800000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000463666F6F00000000000000000000000000000000000000000000000000000000")` $DIR/core/services/pipeline/runner_test.go: `jobRun["logTopics"] = []common.Hash{ common.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65"), common.HexToHash("0x3963386131316165393962363463373161663333376235643831633737353230"), }` $DIR/core/services/pipeline/runner_test.go: `time.Sleep(100 * time.Millisecond)` $DIR/core/services/pipeline/runner_test.go: `res.WriteHeader(http.StatusOK)` $DIR/core/services/pipeline/runner_test.go: `res.WriteHeader(http.StatusOK)` $DIR/core/services/pipeline/runner_test.go: `orm.On("InsertFinishedRun", mock.Anything, mock.Anything, mock.Anything). Run(func(args mock.Arguments) { args.Get(1).(*pipeline.Run).ID = 1 }). Return(nil)` $DIR/core/services/pipeline/runner_test.go: `args.Get(1).(*pipeline.Run).ID = 1` $DIR/core/services/pipeline/runner_test.go: `orm.On("InsertFinishedRunWithSpec", mock.Anything, mock.Anything, mock.Anything). Run(func(args mock.Arguments) { args.Get(1).(*pipeline.Run).ID = 1 }). Return(nil)` $DIR/core/services/pipeline/runner_test.go: `args.Get(1).(*pipeline.Run).ID = 1` $DIR/core/services/pipeline/runner_test.go: `err = json.Unmarshal(payload, &reqBody)` $DIR/core/services/pipeline/runner_test.go: `w.Header().Set("Content-Type", "application/json")` $DIR/core/services/pipeline/runner_test.go: `w.Header().Set("X-Chainlink-Pending", "true")` $DIR/core/services/pipeline/runner_test.go: `btORM.On("FindBridge", mock.Anything, bt.Name).Return(*bt, nil)` $DIR/core/services/pipeline/runner_test.go: `transactCall.Run(func(args mock.Arguments) { fn := args[1].(func(orm pipeline.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(orm)} })` $DIR/core/services/pipeline/runner_test.go: `transactCall.ReturnArguments = mock.Arguments{fn(orm)}` $DIR/core/services/pipeline/runner_test.go: `_, err = pipeline.Parse(s)` $DIR/core/services/pipeline/runner_test.go: `orm.On("CreateRun", mock.Anything, mock.AnythingOfType("*pipeline.Run")).Return(nil).Run(func(args mock.Arguments) { run := args.Get(1).(*pipeline.Run) run.ID = 1 // give it a valid "id" }).Once()` $DIR/core/services/pipeline/runner_test.go: `run.ID = 1` $DIR/core/services/pipeline/runner_test.go: `orm.On("StoreRun", mock.Anything, mock.AnythingOfType("*pipeline.Run")).Return(false, nil).Once()` $DIR/core/services/pipeline/runner_test.go: `orm.On("StoreRun", mock.Anything, mock.AnythingOfType("*pipeline.Run")).Return(false, nil).Once()` $DIR/core/services/pipeline/runner_test.go: `incomplete, err = r.Run(testutils.Context(t), run, lggr, false, nil)` $DIR/core/services/pipeline/runner_test.go: `task.Error = null.NewString("", false)` $DIR/core/services/pipeline/runner_test.go: `task.Output = jsonserializable.JSONSerializable{ Val: `{"data":{"result":"9700"}}` + "\n", Valid: true, }` $DIR/core/services/pipeline/runner_test.go: `orm.On("StoreRun", mock.Anything, mock.AnythingOfType("*pipeline.Run")).Return(false, nil).Once()` $DIR/core/services/pipeline/runner_test.go: `incomplete, err = r.Run(testutils.Context(t), run, lggr, false, nil)` $DIR/core/services/pipeline/runner_test.go: `errorResults = append(errorResults, trr)` $DIR/core/services/pipeline/runner_test.go: `err = json.Unmarshal(payload, &reqBody)` $DIR/core/services/pipeline/runner_test.go: `w.Header().Set("Content-Type", "application/json")` $DIR/core/services/pipeline/runner_test.go: `w.Header().Set("X-Chainlink-Pending", "true")` $DIR/core/services/pipeline/runner_test.go: `btORM.On("FindBridge", mock.Anything, bt.Name).Return(*bt, nil)` $DIR/core/services/pipeline/runner_test.go: `transactCall.Run(func(args mock.Arguments) { fn := args[1].(func(orm pipeline.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(orm)} })` $DIR/core/services/pipeline/runner_test.go: `transactCall.ReturnArguments = mock.Arguments{fn(orm)}` $DIR/core/services/pipeline/runner_test.go: `_, err = pipeline.Parse(s)` $DIR/core/services/pipeline/runner_test.go: `orm.On("CreateRun", mock.Anything, mock.AnythingOfType("*pipeline.Run")).Return(nil).Run(func(args mock.Arguments) { run := args.Get(1).(*pipeline.Run) run.ID = 1 // give it a valid "id" }).Once()` $DIR/core/services/pipeline/runner_test.go: `run.ID = 1` $DIR/core/services/pipeline/runner_test.go: `orm.On("StoreRun", mock.Anything, mock.AnythingOfType("*pipeline.Run")).Return(true, nil).Run(func(args mock.Arguments) { run := args.Get(1).(*pipeline.Run) // Now simulate a new result coming in while we were running task := run.ByDotID("ds1") task.Error = null.NewString("", false) task.Output = jsonserializable.JSONSerializable{ Val: `{"data":{"result":"9700"}}` + "\n", Valid: true, } }).Once()` $DIR/core/services/pipeline/runner_test.go: `task.Error = null.NewString("", false)` $DIR/core/services/pipeline/runner_test.go: `task.Output = jsonserializable.JSONSerializable{ Val: `{"data":{"result":"9700"}}` + "\n", Valid: true, }` $DIR/core/services/pipeline/runner_test.go: `orm.On("StoreRun", mock.Anything, mock.AnythingOfType("*pipeline.Run")).Return(false, nil).Once()` $DIR/core/services/pipeline/runner_test.go: `errorResults = append(errorResults, trr)` $DIR/core/services/pipeline/runner_test.go: `spec.Pipeline, err = spec.ParsePipeline()` $DIR/core/services/pipeline/runner_test.go: `spec.DotDagSource = fmt.Sprintf(template, 2)` $DIR/core/services/pipeline/runner_test.go: `_, trrs, err = r.ExecuteRun(testutils.Context(t), spec, vars, lggr)` $DIR/core/services/pipeline/runner_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/runner_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/runner_test.go: `.MustUnmarshalToMap(`{"data":{"coin":"BTC","market":"USD"}}`)` $DIR/core/services/pipeline/runner_test.go: `.NewServer(fakePriceResponder(t, btcUSDPairing, decimal.NewFromInt(9700), "", nil))` $DIR/core/services/pipeline/runner_test.go: `.NewFromInt(9700)` $DIR/core/services/pipeline/runner_test.go: `.ParseRequestURI(s1.URL)` $DIR/core/services/pipeline/runner_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{URL: bridgeFeedURL.String()})` $DIR/core/services/pipeline/runner_test.go: `.String()` $DIR/core/services/pipeline/runner_test.go: `.NewORM(t)` $DIR/core/services/pipeline/runner_test.go: `.On("FindBridge", mock.Anything, bt.Name)` $DIR/core/services/pipeline/runner_test.go: `.Return(*bt, nil)` $DIR/core/services/pipeline/runner_test.go: `.Once()` $DIR/core/services/pipeline/runner_test.go: `.NewServer(fakePriceResponder(t, btcUSDPairing, decimal.NewFromInt(9600), "", nil))` $DIR/core/services/pipeline/runner_test.go: `.NewFromInt(9600)` $DIR/core/services/pipeline/runner_test.go: `.NewServer(fakeStringResponder(t, "foo-index-1"))` $DIR/core/services/pipeline/runner_test.go: `.NewServer(fakeStringResponder(t, "bar-index-2"))` $DIR/core/services/pipeline/runner_test.go: `.Sprintf(` ds1 [type=bridge name="%s" timeout=0 requestData=<{"data": {"coin": "BTC", "market": "USD"}}>] ds1_parse [type=jsonparse lax=false path="data,result"] ds1_multiply [type=multiply times=1000000000000000000] ds2 [type=http method="GET" url="%s" requestData=<{"data": {"coin": "BTC", "market": "USD"}}>] ds2_parse [type=jsonparse lax=false path="data,result"] ds2_multiply [type=multiply times=1000000000000000000] ds3 [type=http method="GET" url="blah://test.invalid" requestData=<{"data": {"coin": "BTC", "market": "USD"}}>] ds3_parse [type=jsonparse lax=false path="data,result"] ds3_multiply [type=multiply times=1000000000000000000] ds1->ds1_parse->ds1_multiply->median; ds2->ds2_parse->ds2_multiply->median; ds3->ds3_parse->ds3_multiply->median; median [type=median index=0] ds4 [type=http method="GET" url="%s" index=1] ds5 [type=http method="GET" url="%s" index=2] `, bt.Name.String(), s2.URL, s4.URL, s5.URL)` $DIR/core/services/pipeline/runner_test.go: `.Name.String()` $DIR/core/services/pipeline/runner_test.go: `.Parse(s)` $DIR/core/services/pipeline/runner_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/runner_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/runner_test.go: `.ExecuteRun(testutils.Context(t), spec, vars, lggr)` $DIR/core/services/pipeline/runner_test.go: `.Context(t)` $DIR/core/services/pipeline/runner_test.go: `.FinalResult(lggr)` $DIR/core/services/pipeline/runner_test.go: `.IsTerminal()` $DIR/core/services/pipeline/runner_test.go: `.Run(test.name, func(t *testing.T) { t.Parallel() db := pgtest.NewSqlxDB(t) cfg := configtest.NewTestGeneralConfig(t) expectedRequestDS1 := map[string]interface{}{"data": test.vars["foo"]} expectedRequestDS2 := map[string]interface{}{"data": []interface{}{test.vars["bar"], test.vars["baz"]}} expectedRequestSubmit := map[string]interface{}{ "median": "9650000000000000000000", "fetchedValues": []interface{}{"9700", "9600"}, "someString": "some random string", } if test.meta != nil { expectedRequestDS1["meta"] = test.meta expectedRequestSubmit["meta"] = test.meta test.vars["jobRun"] = map[string]interface{}{"meta": test.meta} } if test.includeInputAtKey != "" { expectedRequestSubmit[test.includeInputAtKey] = "9650000000000000000000" } btORM := bridgesMocks.NewORM(t) // 1. Setup bridge ds1, bridge := makeBridge(t, db, expectedRequestDS1, map[string]interface{}{ "data": map[string]interface{}{ "result": map[string]interface{}{ "result": decimal.NewFromInt(9700), "times": "1000000000000000000", }, }, }) defer ds1.Close() btORM.On("FindBridge", mock.Anything, bridge.Name).Return(bridge, nil).Once() // 2. Setup success HTTP ds2 := httptest.NewServer(fakeExternalAdapter(t, expectedRequestDS2, map[string]interface{}{ "data": map[string]interface{}{ "result": decimal.NewFromInt(9600), "times": "1000000000000000000", }, })) defer ds2.Close() ds4 := httptest.NewServer(fakeStringResponder(t, "some random string")) defer ds4.Close() // 3. Setup final bridge task submit, submitBt := makeBridge(t, db, expectedRequestSubmit, map[string]interface{}{"ok": true}) defer submit.Close() btORM.On("FindBridge", mock.Anything, submitBt.Name).Return(submitBt, nil).Once() runner, _ := newRunner(t, db, btORM, cfg) specStr := taskRunWithVars{ bridgeName: bridge.Name.String(), ds2URL: ds2.URL, ds4URL: ds4.URL, submitBridgeName: submitBt.Name.String(), includeInputAtKey: test.includeInputAtKey, }.String() p, err := pipeline.Parse(specStr) require.NoError(t, err) spec := pipeline.Spec{ DotDagSource: specStr, } _, taskRunResults, err := runner.ExecuteRun(testutils.Context(t), spec, pipeline.NewVarsFrom(test.vars), logger.TestLogger(t)) require.NoError(t, err) require.Len(t, taskRunResults, len(p.Tasks)) expectedResults := map[string]pipeline.Result{ "ds1": {Value: `{"data":{"result":{"result":"9700","times":"1000000000000000000"}}}` + "\n"}, "ds1_parse": {Value: map[string]interface{}{"result": "9700", "times": "1000000000000000000"}}, "ds1_multiply": {Value: *mustDecimal(t, "9700000000000000000000")}, "ds2": {Value: `{"data":{"result":"9600","times":"1000000000000000000"}}` + "\n"}, "ds2_parse": {Value: map[string]interface{}{"result": "9600", "times": "1000000000000000000"}}, "ds2_multiply": {Value: *mustDecimal(t, "9600000000000000000000")}, "ds3": {Error: errors.New(`error making http request: Post "blah://test.invalid": unsupported protocol scheme "blah"`)}, "ds3_parse": {Error: pipeline.ErrTooManyErrors}, "ds3_multiply": {Error: pipeline.ErrTooManyErrors}, "ds4": {Value: "some random string"}, "median": {Value: *mustDecimal(t, "9650000000000000000000")}, "submit": {Value: `{"ok":true}` + "\n"}, } for _, r := range taskRunResults { expected := expectedResults[r.Task.DotID()] if expected.Error != nil { require.Error(t, r.Result.Error) require.Contains(t, r.Result.Error.Error(), expected.Error.Error()) } else { if d, is := expected.Value.(decimal.Decimal); is { require.Equal(t, d.String(), r.Result.Value.(decimal.Decimal).String()) } else { require.Equal(t, expected.Value, r.Result.Value) } } } })` $DIR/core/services/pipeline/runner_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/runner_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/runner_test.go: `.NewORM(t)` $DIR/core/services/pipeline/runner_test.go: `.NewFromInt(9700)` $DIR/core/services/pipeline/runner_test.go: `.On("FindBridge", mock.Anything, bridge.Name)` $DIR/core/services/pipeline/runner_test.go: `.Return(bridge, nil)` $DIR/core/services/pipeline/runner_test.go: `.Once()` $DIR/core/services/pipeline/runner_test.go: `.NewServer(fakeExternalAdapter(t, expectedRequestDS2, map[string]interface{}{ "data": map[string]interface{}{ "result": decimal.NewFromInt(9600), "times": "1000000000000000000", }, }))` $DIR/core/services/pipeline/runner_test.go: `.NewFromInt(9600)` $DIR/core/services/pipeline/runner_test.go: `.NewServer(fakeStringResponder(t, "some random string"))` $DIR/core/services/pipeline/runner_test.go: `.On("FindBridge", mock.Anything, submitBt.Name)` $DIR/core/services/pipeline/runner_test.go: `.Return(submitBt, nil)` $DIR/core/services/pipeline/runner_test.go: `.Once()` $DIR/core/services/pipeline/runner_test.go: `.Name.String()` $DIR/core/services/pipeline/runner_test.go: `.Name.String()` $DIR/core/services/pipeline/runner_test.go: `.String()` $DIR/core/services/pipeline/runner_test.go: `.Parse(specStr)` $DIR/core/services/pipeline/runner_test.go: `.ExecuteRun(testutils.Context(t), spec, pipeline.NewVarsFrom(test.vars), logger.TestLogger(t))` $DIR/core/services/pipeline/runner_test.go: `.Context(t)` $DIR/core/services/pipeline/runner_test.go: `.NewVarsFrom(test.vars)` $DIR/core/services/pipeline/runner_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/runner_test.go: `.New(`error making http request: Post "blah://test.invalid": unsupported protocol scheme "blah"`)` $DIR/core/services/pipeline/runner_test.go: `.Task.DotID()` $DIR/core/services/pipeline/runner_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/runner_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/runner_test.go: `.NewORM(t)` $DIR/core/services/pipeline/runner_test.go: `.Run("diet mode, empty CBOR", func(t *testing.T) { s := CBORDietEmpty d, err := pipeline.Parse(s) require.NoError(t, err) spec := pipeline.Spec{DotDagSource: s} global := make(map[string]interface{}) jobRun := make(map[string]interface{}) global["jobRun"] = jobRun jobRun["logData"] = hexutil.MustDecode("0x0000000000000000000000009c26cc46f57667cba75556014c8e0d5ed7c5b83d17a526ff5d8f916fa2f4a218f6ce0a6e410a0d7823f8238979f8579c2145fd6f0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000009c26cc46f57667cba75556014c8e0d5ed7c5b83d64ef935700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006148ef28000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000") jobRun["logTopics"] = []common.Hash{ common.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65"), common.HexToHash("0x3963386131316165393962363463373161663333376235643831633737353230"), } vars := pipeline.NewVarsFrom(global) lggr := logger.TestLogger(t) _, trrs, err := r.ExecuteRun(testutils.Context(t), spec, vars, lggr) require.NoError(t, err) require.Len(t, trrs, len(d.Tasks)) finalResults := trrs.FinalResult(lggr) require.Len(t, finalResults.Values, 1) assert.Equal(t, make(map[string]interface{}), finalResults.Values[0]) require.Len(t, finalResults.FatalErrors, 1) assert.Nil(t, finalResults.FatalErrors[0]) })` $DIR/core/services/pipeline/runner_test.go: `.Parse(s)` $DIR/core/services/pipeline/runner_test.go: `.MustDecode("0x0000000000000000000000009c26cc46f57667cba75556014c8e0d5ed7c5b83d17a526ff5d8f916fa2f4a218f6ce0a6e410a0d7823f8238979f8579c2145fd6f0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000009c26cc46f57667cba75556014c8e0d5ed7c5b83d64ef935700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006148ef28000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000")` $DIR/core/services/pipeline/runner_test.go: `.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65")` $DIR/core/services/pipeline/runner_test.go: `.HexToHash("0x3963386131316165393962363463373161663333376235643831633737353230")` $DIR/core/services/pipeline/runner_test.go: `.NewVarsFrom(global)` $DIR/core/services/pipeline/runner_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/runner_test.go: `.ExecuteRun(testutils.Context(t), spec, vars, lggr)` $DIR/core/services/pipeline/runner_test.go: `.Context(t)` $DIR/core/services/pipeline/runner_test.go: `.FinalResult(lggr)` $DIR/core/services/pipeline/runner_test.go: `.Parse(s)` $DIR/core/services/pipeline/runner_test.go: `.MustDecode("0x0000000000000000000000009c26cc46f57667cba75556014c8e0d5ed7c5b83d17a526ff5d8f916fa2f4a218f6ce0a6e410a0d7823f8238979f8579c2145fd6f0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000009c26cc46f57667cba75556014c8e0d5ed7c5b83d64ef935700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006148ef2800000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000463666F6F00000000000000000000000000000000000000000000000000000000")` $DIR/core/services/pipeline/runner_test.go: `.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65")` $DIR/core/services/pipeline/runner_test.go: `.HexToHash("0x3963386131316165393962363463373161663333376235643831633737353230")` $DIR/core/services/pipeline/runner_test.go: `.NewVarsFrom(global)` $DIR/core/services/pipeline/runner_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/runner_test.go: `.ExecuteRun(testutils.Context(t), spec, vars, lggr)` $DIR/core/services/pipeline/runner_test.go: `.Context(t)` $DIR/core/services/pipeline/runner_test.go: `.FinalResult(lggr)` $DIR/core/services/pipeline/runner_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/runner_test.go: `.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { time.Sleep(100 * time.Millisecond) res.WriteHeader(http.StatusOK) _, err := res.Write([]byte(`{"result":10}`)) assert.NoError(t, err) }))` $DIR/core/services/pipeline/runner_test.go: `.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { time.Sleep(100 * time.Millisecond) res.WriteHeader(http.StatusOK) _, err := res.Write([]byte(`{"result":10}`)) assert.NoError(t, err) })` $DIR/core/services/pipeline/runner_test.go: `.Sleep(100 * time.Millisecond)` $DIR/core/services/pipeline/runner_test.go: `.WriteHeader(http.StatusOK)` $DIR/core/services/pipeline/runner_test.go: `.Write([]byte(`{"result":10}`))` $DIR/core/services/pipeline/runner_test.go: `.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { res.WriteHeader(http.StatusOK) _, err := res.Write([]byte(`{"result":11}`)) assert.NoError(t, err) }))` $DIR/core/services/pipeline/runner_test.go: `.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { res.WriteHeader(http.StatusOK) _, err := res.Write([]byte(`{"result":11}`)) assert.NoError(t, err) })` $DIR/core/services/pipeline/runner_test.go: `.WriteHeader(http.StatusOK)` $DIR/core/services/pipeline/runner_test.go: `.Write([]byte(`{"result":11}`))` $DIR/core/services/pipeline/runner_test.go: `.Sprintf(` ds1 [type=http url="%s"]; ds1_parse [type=jsonparse path="result"]; ds1_multiply [type=multiply times=100]; ds2 [type=http url="%s"]; ds2_parse [type=jsonparse path="result"]; ds2_multiply [type=multiply times=100]; ds1 -> ds1_parse -> ds1_multiply -> answer1; ds2 -> ds2_parse -> ds2_multiply -> answer1; answer1 [type=median index=0]; `, m1.URL, m2.URL)` $DIR/core/services/pipeline/runner_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/runner_test.go: `.NewORM(t)` $DIR/core/services/pipeline/runner_test.go: `.WithTimeout(testutils.Context(t), 50*time.Millisecond)` $DIR/core/services/pipeline/runner_test.go: `.Context(t)` $DIR/core/services/pipeline/runner_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/runner_test.go: `.ExecuteRun(ctx, spec, vars, logger.TestLogger(t))` $DIR/core/services/pipeline/runner_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/runner_test.go: `.IsTerminal()` $DIR/core/services/pipeline/runner_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/runner_test.go: `.NewORM(t)` $DIR/core/services/pipeline/runner_test.go: `.NewORM(t)` $DIR/core/services/pipeline/runner_test.go: `.On("InsertFinishedRun", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/pipeline/runner_test.go: `. Run(func(args mock.Arguments) { args.Get(1).(*pipeline.Run).ID = 1 })` $DIR/core/services/pipeline/runner_test.go: `.Get(1)` $DIR/core/services/pipeline/runner_test.go: `. Return(nil)` $DIR/core/services/pipeline/runner_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/runner_test.go: `.NewKeyStore(t, db)` $DIR/core/services/pipeline/runner_test.go: `.Eth()` $DIR/core/services/pipeline/runner_test.go: `.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, GeneralConfig: cfg, KeyStore: ethKeyStore})` $DIR/core/services/pipeline/runner_test.go: `.NewLegacyChainsFromRelayerExtenders(relayExtenders)` $DIR/core/services/pipeline/runner_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/runner_test.go: `.NewRunner(orm, btORM, cfg.JobPipeline(), cfg.WebServer(), legacyChains, ethKeyStore, nil, lggr, nil, nil)` $DIR/core/services/pipeline/runner_test.go: `.JobPipeline()` $DIR/core/services/pipeline/runner_test.go: `.WebServer()` $DIR/core/services/pipeline/runner_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/runner_test.go: `.ExecuteAndInsertFinishedRun(testutils.Context(t), spec, vars, lggr, false)` $DIR/core/services/pipeline/runner_test.go: `.Context(t)` $DIR/core/services/pipeline/runner_test.go: `.FinalResult(lggr)` $DIR/core/services/pipeline/runner_test.go: `.String()` $DIR/core/services/pipeline/runner_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/runner_test.go: `.NewORM(t)` $DIR/core/services/pipeline/runner_test.go: `.NewORM(t)` $DIR/core/services/pipeline/runner_test.go: `.On("InsertFinishedRunWithSpec", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/pipeline/runner_test.go: `. Run(func(args mock.Arguments) { args.Get(1).(*pipeline.Run).ID = 1 })` $DIR/core/services/pipeline/runner_test.go: `.Get(1)` $DIR/core/services/pipeline/runner_test.go: `. Return(nil)` $DIR/core/services/pipeline/runner_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/runner_test.go: `.NewKeyStore(t, db)` $DIR/core/services/pipeline/runner_test.go: `.Eth()` $DIR/core/services/pipeline/runner_test.go: `.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, GeneralConfig: cfg, KeyStore: ethKeyStore})` $DIR/core/services/pipeline/runner_test.go: `.NewLegacyChainsFromRelayerExtenders(relayExtenders)` $DIR/core/services/pipeline/runner_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/runner_test.go: `.NewRunner(orm, btORM, cfg.JobPipeline(), cfg.WebServer(), legacyChains, ethKeyStore, nil, lggr, nil, nil)` $DIR/core/services/pipeline/runner_test.go: `.JobPipeline()` $DIR/core/services/pipeline/runner_test.go: `.WebServer()` $DIR/core/services/pipeline/runner_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/runner_test.go: `.ExecuteAndInsertFinishedRun(testutils.Context(t), spec, vars, lggr, false)` $DIR/core/services/pipeline/runner_test.go: `.Context(t)` $DIR/core/services/pipeline/runner_test.go: `.FinalResult(lggr)` $DIR/core/services/pipeline/runner_test.go: `.String()` $DIR/core/services/pipeline/runner_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/runner_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/runner_test.go: `.NewORM(t)` $DIR/core/services/pipeline/runner_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/runner_test.go: `.ExecuteRun(testutils.Context(t), pipeline.Spec{ DotDagSource: ` a [type=multiply input="$(val)" times=2] b1 [type=multiply input="$(a)" times=2] b2 [type=multiply input="$(a)" times=3] c [type=median values=<[ $(b1), $(b2) ]> index=0] a->b1->c; a->b2->c;`, }, pipeline.NewVarsFrom(input), lggr)` $DIR/core/services/pipeline/runner_test.go: `.Context(t)` $DIR/core/services/pipeline/runner_test.go: `.NewVarsFrom(input)` $DIR/core/services/pipeline/runner_test.go: `.FinalResult(lggr)` $DIR/core/services/pipeline/runner_test.go: `.SingularResult()` $DIR/core/services/pipeline/runner_test.go: `.String()` $DIR/core/services/pipeline/runner_test.go: `.String()` $DIR/core/services/pipeline/runner_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/runner_test.go: `.NewORM(t)` $DIR/core/services/pipeline/runner_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/runner_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/runner_test.go: `.ExecuteRun(testutils.Context(t), pipeline.Spec{ DotDagSource: ` a [type=multiply input="$(val)" times=2] b1 [type=multiply input="$(a)" times=2 index=0] b2 [type=multiply input="$(a)" times=3 index=1] a->b1; a->b2;`, }, pipeline.NewVarsFrom(input), lggr)` $DIR/core/services/pipeline/runner_test.go: `.Context(t)` $DIR/core/services/pipeline/runner_test.go: `.NewVarsFrom(input)` $DIR/core/services/pipeline/runner_test.go: `.FinalResult(lggr)` $DIR/core/services/pipeline/runner_test.go: `.String()` $DIR/core/services/pipeline/runner_test.go: `.String()` $DIR/core/services/pipeline/runner_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/runner_test.go: `.MustUnmarshalToMap(`{"data":{"coin":"BTC","market":"USD"}}`)` $DIR/core/services/pipeline/runner_test.go: `.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var reqBody adapterRequest payload, err := io.ReadAll(r.Body) require.NoError(t, err) defer r.Body.Close() err = json.Unmarshal(payload, &reqBody) require.NoError(t, err) // TODO: assert finding the id w.Header().Set("Content-Type", "application/json") w.Header().Set("X-Chainlink-Pending", "true") response := map[string]interface{}{} require.NoError(t, json.NewEncoder(w).Encode(response)) })` $DIR/core/services/pipeline/runner_test.go: `.ReadAll(r.Body)` $DIR/core/services/pipeline/runner_test.go: `.Unmarshal(payload, &reqBody)` $DIR/core/services/pipeline/runner_test.go: `.Header()` $DIR/core/services/pipeline/runner_test.go: `.Set("Content-Type", "application/json")` $DIR/core/services/pipeline/runner_test.go: `.Header()` $DIR/core/services/pipeline/runner_test.go: `.Set("X-Chainlink-Pending", "true")` $DIR/core/services/pipeline/runner_test.go: `.NewServer(handler)` $DIR/core/services/pipeline/runner_test.go: `.ParseRequestURI(s1.URL)` $DIR/core/services/pipeline/runner_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/runner_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{URL: bridgeFeedURL.String()})` $DIR/core/services/pipeline/runner_test.go: `.String()` $DIR/core/services/pipeline/runner_test.go: `.NewServer(fakePriceResponder(t, btcUSDPairing, decimal.NewFromInt(9600), "", nil))` $DIR/core/services/pipeline/runner_test.go: `.NewFromInt(9600)` $DIR/core/services/pipeline/runner_test.go: `.NewServer(fakeStringResponder(t, "foo-index-1"))` $DIR/core/services/pipeline/runner_test.go: `.NewServer(fakeStringResponder(t, "bar-index-2"))` $DIR/core/services/pipeline/runner_test.go: `.NewORM(t)` $DIR/core/services/pipeline/runner_test.go: `.On("FindBridge", mock.Anything, bt.Name)` $DIR/core/services/pipeline/runner_test.go: `.Return(*bt, nil)` $DIR/core/services/pipeline/runner_test.go: `.On("Transact", mock.Anything, mock.Anything)` $DIR/core/services/pipeline/runner_test.go: `.Run(func(args mock.Arguments) { fn := args[1].(func(orm pipeline.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(orm)} })` $DIR/core/services/pipeline/runner_test.go: `.Sprintf(` ds1 [type=bridge async=true name="%s" timeout=0 requestData=<{"data": {"coin": "BTC", "market": "USD"}}>] ds1_parse [type=jsonparse lax=false path="data,result"] ds1_multiply [type=multiply times=1000000000000000000] ds2 [type=http method="GET" url="%s" requestData=<{"data": {"coin": "BTC", "market": "USD"}}>] ds2_parse [type=jsonparse lax=false path="data,result"] ds2_multiply [type=multiply times=1000000000000000000] ds3 [type=http method="GET" url="blah://test.invalid" requestData=<{"data": {"coin": "BTC", "market": "USD"}}>] ds3_parse [type=jsonparse lax=false path="data,result"] ds3_multiply [type=multiply times=1000000000000000000] ds1->ds1_parse->ds1_multiply->median; ds2->ds2_parse->ds2_multiply->median; ds3->ds3_parse->ds3_multiply->median; median [type=median index=0] ds4 [type=http method="GET" url="%s" index=1] ds5 [type=http method="GET" url="%s" index=2] `, bt.Name.String(), s2.URL, s4.URL, s5.URL)` $DIR/core/services/pipeline/runner_test.go: `.Name.String()` $DIR/core/services/pipeline/runner_test.go: `.Parse(s)` $DIR/core/services/pipeline/runner_test.go: `.NewRun(spec, pipeline.NewVarsFrom(nil))` $DIR/core/services/pipeline/runner_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/runner_test.go: `.On("CreateRun", mock.Anything, mock.AnythingOfType("*pipeline.Run"))` $DIR/core/services/pipeline/runner_test.go: `.AnythingOfType("*pipeline.Run")` $DIR/core/services/pipeline/runner_test.go: `.Return(nil)` $DIR/core/services/pipeline/runner_test.go: `.Run(func(args mock.Arguments) { run := args.Get(1).(*pipeline.Run) run.ID = 1 // give it a valid "id" })` $DIR/core/services/pipeline/runner_test.go: `.Get(1)` $DIR/core/services/pipeline/runner_test.go: `.Once()` $DIR/core/services/pipeline/runner_test.go: `.On("StoreRun", mock.Anything, mock.AnythingOfType("*pipeline.Run"))` $DIR/core/services/pipeline/runner_test.go: `.AnythingOfType("*pipeline.Run")` $DIR/core/services/pipeline/runner_test.go: `.Return(false, nil)` $DIR/core/services/pipeline/runner_test.go: `.Once()` $DIR/core/services/pipeline/runner_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/runner_test.go: `.Run(testutils.Context(t), run, lggr, false, nil)` $DIR/core/services/pipeline/runner_test.go: `.Context(t)` $DIR/core/services/pipeline/runner_test.go: `.On("StoreRun", mock.Anything, mock.AnythingOfType("*pipeline.Run"))` $DIR/core/services/pipeline/runner_test.go: `.AnythingOfType("*pipeline.Run")` $DIR/core/services/pipeline/runner_test.go: `.Return(false, nil)` $DIR/core/services/pipeline/runner_test.go: `.Once()` $DIR/core/services/pipeline/runner_test.go: `.Run(testutils.Context(t), run, lggr, false, nil)` $DIR/core/services/pipeline/runner_test.go: `.Context(t)` $DIR/core/services/pipeline/runner_test.go: `.ByDotID("ds1")` $DIR/core/services/pipeline/runner_test.go: `.NewString("", false)` $DIR/core/services/pipeline/runner_test.go: `.On("StoreRun", mock.Anything, mock.AnythingOfType("*pipeline.Run"))` $DIR/core/services/pipeline/runner_test.go: `.AnythingOfType("*pipeline.Run")` $DIR/core/services/pipeline/runner_test.go: `.Return(false, nil)` $DIR/core/services/pipeline/runner_test.go: `.Once()` $DIR/core/services/pipeline/runner_test.go: `.Run(testutils.Context(t), run, lggr, false, nil)` $DIR/core/services/pipeline/runner_test.go: `.Context(t)` $DIR/core/services/pipeline/runner_test.go: `.Result()` $DIR/core/services/pipeline/runner_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/runner_test.go: `.MustUnmarshalToMap(`{"data":{"coin":"BTC","market":"USD"}}`)` $DIR/core/services/pipeline/runner_test.go: `.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var reqBody adapterRequest payload, err := io.ReadAll(r.Body) require.NoError(t, err) defer r.Body.Close() err = json.Unmarshal(payload, &reqBody) require.NoError(t, err) require.Contains(t, reqBody.ResponseURL, "http://localhost:6688/v2/resume/") w.Header().Set("Content-Type", "application/json") w.Header().Set("X-Chainlink-Pending", "true") response := map[string]interface{}{} require.NoError(t, json.NewEncoder(w).Encode(response)) })` $DIR/core/services/pipeline/runner_test.go: `.ReadAll(r.Body)` $DIR/core/services/pipeline/runner_test.go: `.Unmarshal(payload, &reqBody)` $DIR/core/services/pipeline/runner_test.go: `.Header()` $DIR/core/services/pipeline/runner_test.go: `.Set("Content-Type", "application/json")` $DIR/core/services/pipeline/runner_test.go: `.Header()` $DIR/core/services/pipeline/runner_test.go: `.Set("X-Chainlink-Pending", "true")` $DIR/core/services/pipeline/runner_test.go: `.NewServer(handler)` $DIR/core/services/pipeline/runner_test.go: `.ParseRequestURI(s1.URL)` $DIR/core/services/pipeline/runner_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/runner_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{URL: bridgeFeedURL.String()})` $DIR/core/services/pipeline/runner_test.go: `.String()` $DIR/core/services/pipeline/runner_test.go: `.NewServer(fakePriceResponder(t, btcUSDPairing, decimal.NewFromInt(9600), "", nil))` $DIR/core/services/pipeline/runner_test.go: `.NewFromInt(9600)` $DIR/core/services/pipeline/runner_test.go: `.NewServer(fakeStringResponder(t, "foo-index-1"))` $DIR/core/services/pipeline/runner_test.go: `.NewServer(fakeStringResponder(t, "bar-index-2"))` $DIR/core/services/pipeline/runner_test.go: `.NewORM(t)` $DIR/core/services/pipeline/runner_test.go: `.On("FindBridge", mock.Anything, bt.Name)` $DIR/core/services/pipeline/runner_test.go: `.Return(*bt, nil)` $DIR/core/services/pipeline/runner_test.go: `.On("Transact", mock.Anything, mock.Anything)` $DIR/core/services/pipeline/runner_test.go: `.Run(func(args mock.Arguments) { fn := args[1].(func(orm pipeline.ORM) error) transactCall.ReturnArguments = mock.Arguments{fn(orm)} })` $DIR/core/services/pipeline/runner_test.go: `.Sprintf(` ds1 [type=bridge async=true name="%s" timeout=0 requestData=<{"data": {"coin": "BTC", "market": "USD"}}>] ds1_parse [type=jsonparse lax=false path="data,result"] ds1_multiply [type=multiply times=1000000000000000000] ds2 [type=http method="GET" url="%s" requestData=<{"data": {"coin": "BTC", "market": "USD"}}>] ds2_parse [type=jsonparse lax=false path="data,result"] ds2_multiply [type=multiply times=1000000000000000000] ds3 [type=http method="GET" url="blah://test.invalid" requestData=<{"data": {"coin": "BTC", "market": "USD"}}>] ds3_parse [type=jsonparse lax=false path="data,result"] ds3_multiply [type=multiply times=1000000000000000000] ds1->ds1_parse->ds1_multiply->median; ds2->ds2_parse->ds2_multiply->median; ds3->ds3_parse->ds3_multiply->median; median [type=median index=0] ds4 [type=http method="GET" url="%s" index=1] ds5 [type=http method="GET" url="%s" index=2] `, bt.Name.String(), s2.URL, s4.URL, s5.URL)` $DIR/core/services/pipeline/runner_test.go: `.Name.String()` $DIR/core/services/pipeline/runner_test.go: `.Parse(s)` $DIR/core/services/pipeline/runner_test.go: `.NewRun(spec, pipeline.NewVarsFrom(nil))` $DIR/core/services/pipeline/runner_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/runner_test.go: `.On("CreateRun", mock.Anything, mock.AnythingOfType("*pipeline.Run"))` $DIR/core/services/pipeline/runner_test.go: `.AnythingOfType("*pipeline.Run")` $DIR/core/services/pipeline/runner_test.go: `.Return(nil)` $DIR/core/services/pipeline/runner_test.go: `.Run(func(args mock.Arguments) { run := args.Get(1).(*pipeline.Run) run.ID = 1 // give it a valid "id" })` $DIR/core/services/pipeline/runner_test.go: `.Get(1)` $DIR/core/services/pipeline/runner_test.go: `.Once()` $DIR/core/services/pipeline/runner_test.go: `.On("StoreRun", mock.Anything, mock.AnythingOfType("*pipeline.Run"))` $DIR/core/services/pipeline/runner_test.go: `.AnythingOfType("*pipeline.Run")` $DIR/core/services/pipeline/runner_test.go: `.Return(true, nil)` $DIR/core/services/pipeline/runner_test.go: `.Run(func(args mock.Arguments) { run := args.Get(1).(*pipeline.Run) // Now simulate a new result coming in while we were running task := run.ByDotID("ds1") task.Error = null.NewString("", false) task.Output = jsonserializable.JSONSerializable{ Val: `{"data":{"result":"9700"}}` + "\n", Valid: true, } })` $DIR/core/services/pipeline/runner_test.go: `.Get(1)` $DIR/core/services/pipeline/runner_test.go: `.ByDotID("ds1")` $DIR/core/services/pipeline/runner_test.go: `.NewString("", false)` $DIR/core/services/pipeline/runner_test.go: `.Once()` $DIR/core/services/pipeline/runner_test.go: `.On("StoreRun", mock.Anything, mock.AnythingOfType("*pipeline.Run"))` $DIR/core/services/pipeline/runner_test.go: `.AnythingOfType("*pipeline.Run")` $DIR/core/services/pipeline/runner_test.go: `.Return(false, nil)` $DIR/core/services/pipeline/runner_test.go: `.Once()` $DIR/core/services/pipeline/runner_test.go: `.Run(testutils.Context(t), run, logger.TestLogger(t), false, nil)` $DIR/core/services/pipeline/runner_test.go: `.Context(t)` $DIR/core/services/pipeline/runner_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/runner_test.go: `.Result()` $DIR/core/services/pipeline/runner_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/runner_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/runner_test.go: `.NewORM(t)` $DIR/core/services/pipeline/runner_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/runner_test.go: `.ExecuteRun(testutils.Context(t), pipeline.Spec{ DotDagSource: ` a [type=lowercase input="$(first)"] `, }, pipeline.NewVarsFrom(input), lggr)` $DIR/core/services/pipeline/runner_test.go: `.Context(t)` $DIR/core/services/pipeline/runner_test.go: `.NewVarsFrom(input)` $DIR/core/services/pipeline/runner_test.go: `.FinalResult(lggr)` $DIR/core/services/pipeline/runner_test.go: `.SingularResult()` $DIR/core/services/pipeline/runner_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/runner_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/runner_test.go: `.NewORM(t)` $DIR/core/services/pipeline/runner_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/runner_test.go: `.ExecuteRun(testutils.Context(t), pipeline.Spec{ DotDagSource: ` a [type=uppercase input="$(first)"] `, }, pipeline.NewVarsFrom(input), lggr)` $DIR/core/services/pipeline/runner_test.go: `.Context(t)` $DIR/core/services/pipeline/runner_test.go: `.NewVarsFrom(input)` $DIR/core/services/pipeline/runner_test.go: `.FinalResult(lggr)` $DIR/core/services/pipeline/runner_test.go: `.SingularResult()` $DIR/core/services/pipeline/runner_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/runner_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/runner_test.go: `.NewORM(t)` $DIR/core/services/pipeline/runner_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/runner_test.go: `.ExecuteRun(testutils.Context(t), pipeline.Spec{ DotDagSource: ` a [type=hexdecode input="$(astring)"] `, }, pipeline.NewVarsFrom(input), lggr)` $DIR/core/services/pipeline/runner_test.go: `.Context(t)` $DIR/core/services/pipeline/runner_test.go: `.NewVarsFrom(input)` $DIR/core/services/pipeline/runner_test.go: `.FinalResult(lggr)` $DIR/core/services/pipeline/runner_test.go: `.SingularResult()` $DIR/core/services/pipeline/runner_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/runner_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/runner_test.go: `.NewORM(t)` $DIR/core/services/pipeline/runner_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/runner_test.go: `.ExecuteRun(testutils.Context(t), pipeline.Spec{ DotDagSource: ` en [type=hexencode input="$(input_val)"] de [type=hexdecode] en->de `, }, pipeline.NewVarsFrom(input), lggr)` $DIR/core/services/pipeline/runner_test.go: `.Context(t)` $DIR/core/services/pipeline/runner_test.go: `.NewVarsFrom(input)` $DIR/core/services/pipeline/runner_test.go: `.FinalResult(lggr)` $DIR/core/services/pipeline/runner_test.go: `.SingularResult()` $DIR/core/services/pipeline/runner_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/runner_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/runner_test.go: `.NewORM(t)` $DIR/core/services/pipeline/runner_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/runner_test.go: `.ExecuteRun(testutils.Context(t), pipeline.Spec{ DotDagSource: ` a [type=base64decode input="$(astring)"] `, }, pipeline.NewVarsFrom(input), lggr)` $DIR/core/services/pipeline/runner_test.go: `.Context(t)` $DIR/core/services/pipeline/runner_test.go: `.NewVarsFrom(input)` $DIR/core/services/pipeline/runner_test.go: `.FinalResult(lggr)` $DIR/core/services/pipeline/runner_test.go: `.SingularResult()` $DIR/core/services/pipeline/runner_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/runner_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/runner_test.go: `.NewORM(t)` $DIR/core/services/pipeline/runner_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/runner_test.go: `.ExecuteRun(testutils.Context(t), pipeline.Spec{ DotDagSource: ` en [type=base64encode input="$(input_val)"] de [type=base64decode] en->de `, }, pipeline.NewVarsFrom(input), lggr)` $DIR/core/services/pipeline/runner_test.go: `.Context(t)` $DIR/core/services/pipeline/runner_test.go: `.NewVarsFrom(input)` $DIR/core/services/pipeline/runner_test.go: `.FinalResult(lggr)` $DIR/core/services/pipeline/runner_test.go: `.SingularResult()` $DIR/core/services/pipeline/runner_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/runner_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/runner_test.go: `.NewKeyStore(t, db)` $DIR/core/services/pipeline/runner_test.go: `.Eth()` $DIR/core/services/pipeline/runner_test.go: `.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, GeneralConfig: cfg, KeyStore: ethKeyStore})` $DIR/core/services/pipeline/runner_test.go: `.NewLegacyChainsFromRelayerExtenders(relayExtenders)` $DIR/core/services/pipeline/runner_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/runner_test.go: `.NewRunner(nil, nil, cfg.JobPipeline(), cfg.WebServer(), legacyChains, ethKeyStore, nil, lggr, nil, nil)` $DIR/core/services/pipeline/runner_test.go: `.JobPipeline()` $DIR/core/services/pipeline/runner_test.go: `.WebServer()` $DIR/core/services/pipeline/runner_test.go: `.Sprintf(template, 1)` $DIR/core/services/pipeline/runner_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/runner_test.go: `.ExecuteRun(testutils.Context(t), spec, vars, lggr)` $DIR/core/services/pipeline/runner_test.go: `.Context(t)` $DIR/core/services/pipeline/runner_test.go: `.ParsePipeline()` $DIR/core/services/pipeline/runner_test.go: `.Sprintf(template, 2)` $DIR/core/services/pipeline/runner_test.go: `.ExecuteRun(testutils.Context(t), spec, vars, lggr)` $DIR/core/services/pipeline/runner_test.go: `.Context(t)` $DIR/core/services/pipeline/scheduler_test.go: `go s.Run()` $DIR/core/services/pipeline/scheduler_test.go: `s.report(testutils.Context(t), TaskRunResult{ ID: uuid.New(), Task: taskRun.task, Result: event.result, FinishedAt: null.TimeFrom(now), CreatedAt: now, })` $DIR/core/services/pipeline/scheduler_test.go: `test.assertion(t, *p, s.results)` $DIR/core/services/pipeline/scheduler_test.go: `.ByDotID("b")` $DIR/core/services/pipeline/scheduler_test.go: `.ID()` $DIR/core/services/pipeline/scheduler_test.go: `.ByDotID("a")` $DIR/core/services/pipeline/scheduler_test.go: `.ID()` $DIR/core/services/pipeline/scheduler_test.go: `.ByDotID("a")` $DIR/core/services/pipeline/scheduler_test.go: `.ID()` $DIR/core/services/pipeline/scheduler_test.go: `.ByDotID("a")` $DIR/core/services/pipeline/scheduler_test.go: `.ID()` $DIR/core/services/pipeline/scheduler_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/scheduler_test.go: `.Run()` $DIR/core/services/pipeline/scheduler_test.go: `.Now()` $DIR/core/services/pipeline/scheduler_test.go: `.report(testutils.Context(t), TaskRunResult{ ID: uuid.New(), Task: taskRun.task, Result: event.result, FinishedAt: null.TimeFrom(now), CreatedAt: now, })` $DIR/core/services/pipeline/scheduler_test.go: `.Context(t)` $DIR/core/services/pipeline/scheduler_test.go: `.New()` $DIR/core/services/pipeline/scheduler_test.go: `.TimeFrom(now)` $DIR/core/services/pipeline/scheduler_test.go: `.After(time.Second)` $DIR/core/services/pipeline/scheduler_test.go: `.After(time.Second)` $DIR/core/services/pipeline/scheduler_test.go: `.assertion(t, *p, s.results)` $DIR/core/services/pipeline/task.any_test.go: `t.Run(test.name, func(t *testing.T) { task := pipeline.AnyTask{} output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { switch test.want.Value.(type) { case *decimal.Decimal: require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(*decimal.Decimal).String()) default: require.Equal(t, test.want.Value, output.Value) } require.NoError(t, output.Error) } })` $DIR/core/services/pipeline/task.any_test.go: `.New("foo")` $DIR/core/services/pipeline/task.any_test.go: `.New("foo")` $DIR/core/services/pipeline/task.any_test.go: `.New("bar")` $DIR/core/services/pipeline/task.any_test.go: `.New("foo")` $DIR/core/services/pipeline/task.any_test.go: `.New("foo")` $DIR/core/services/pipeline/task.any_test.go: `.Run(test.name, func(t *testing.T) { task := pipeline.AnyTask{} output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { switch test.want.Value.(type) { case *decimal.Decimal: require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(*decimal.Decimal).String()) default: require.Equal(t, test.want.Value, output.Value) } require.NoError(t, output.Error) } })` $DIR/core/services/pipeline/task.any_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), test.inputs)` $DIR/core/services/pipeline/task.any_test.go: `.Context(t)` $DIR/core/services/pipeline/task.any_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.any_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.base64decode_test.go: `t.Run(test.name, func(t *testing.T) { t.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.Base64DecodeTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) }) t.Run("without vars through input param", func(t *testing.T) { inputStr := fmt.Sprintf("%v", test.input) if inputStr == "" { // empty input parameter is indistinguishable from not providing it at all // in that case the task will use an input defined by the job DAG return } vars := pipeline.NewVarsFrom(nil) task := pipeline.Base64DecodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: inputStr, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.Base64DecodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) })` $DIR/core/services/pipeline/task.base64decode_test.go: `t.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.Base64DecodeTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) })` $DIR/core/services/pipeline/task.base64decode_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}}))` $DIR/core/services/pipeline/task.base64decode_test.go: `t.Run("without vars through input param", func(t *testing.T) { inputStr := fmt.Sprintf("%v", test.input) if inputStr == "" { // empty input parameter is indistinguishable from not providing it at all // in that case the task will use an input defined by the job DAG return } vars := pipeline.NewVarsFrom(nil) task := pipeline.Base64DecodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: inputStr, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.base64decode_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{}))` $DIR/core/services/pipeline/task.base64decode_test.go: `t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.Base64DecodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.base64decode_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{}))` $DIR/core/services/pipeline/task.base64decode_test.go: `.Run(test.name, func(t *testing.T) { t.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.Base64DecodeTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) }) t.Run("without vars through input param", func(t *testing.T) { inputStr := fmt.Sprintf("%v", test.input) if inputStr == "" { // empty input parameter is indistinguishable from not providing it at all // in that case the task will use an input defined by the job DAG return } vars := pipeline.NewVarsFrom(nil) task := pipeline.Base64DecodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: inputStr, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.Base64DecodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) })` $DIR/core/services/pipeline/task.base64decode_test.go: `.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.Base64DecodeTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) })` $DIR/core/services/pipeline/task.base64decode_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.base64decode_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.base64decode_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})` $DIR/core/services/pipeline/task.base64decode_test.go: `.Context(t)` $DIR/core/services/pipeline/task.base64decode_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.base64decode_test.go: `.Run("without vars through input param", func(t *testing.T) { inputStr := fmt.Sprintf("%v", test.input) if inputStr == "" { // empty input parameter is indistinguishable from not providing it at all // in that case the task will use an input defined by the job DAG return } vars := pipeline.NewVarsFrom(nil) task := pipeline.Base64DecodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: inputStr, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.base64decode_test.go: `.Sprintf("%v", test.input)` $DIR/core/services/pipeline/task.base64decode_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.base64decode_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.base64decode_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})` $DIR/core/services/pipeline/task.base64decode_test.go: `.Context(t)` $DIR/core/services/pipeline/task.base64decode_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.base64decode_test.go: `.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.Base64DecodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.base64decode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, })` $DIR/core/services/pipeline/task.base64decode_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.base64decode_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})` $DIR/core/services/pipeline/task.base64decode_test.go: `.Context(t)` $DIR/core/services/pipeline/task.base64decode_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.base64encode_test.go: `t.Run(test.name, func(t *testing.T) { t.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.Base64EncodeTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) }) t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.Base64EncodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) })` $DIR/core/services/pipeline/task.base64encode_test.go: `t.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.Base64EncodeTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) })` $DIR/core/services/pipeline/task.base64encode_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}}))` $DIR/core/services/pipeline/task.base64encode_test.go: `t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.Base64EncodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.base64encode_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{}))` $DIR/core/services/pipeline/task.base64encode_test.go: `t.Run(test.name, func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.Base64EncodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: fmt.Sprintf("%v", test.input), } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{}) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) require.NoError(t, result.Error) require.Equal(t, test.result, result.Value) })` $DIR/core/services/pipeline/task.base64encode_test.go: `.Run(test.name, func(t *testing.T) { t.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.Base64EncodeTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) }) t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.Base64EncodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) })` $DIR/core/services/pipeline/task.base64encode_test.go: `.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.Base64EncodeTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) })` $DIR/core/services/pipeline/task.base64encode_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.base64encode_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.base64encode_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})` $DIR/core/services/pipeline/task.base64encode_test.go: `.Context(t)` $DIR/core/services/pipeline/task.base64encode_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.base64encode_test.go: `.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.Base64EncodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.base64encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, })` $DIR/core/services/pipeline/task.base64encode_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.base64encode_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})` $DIR/core/services/pipeline/task.base64encode_test.go: `.Context(t)` $DIR/core/services/pipeline/task.base64encode_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.base64encode_test.go: `.Run(test.name, func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.Base64EncodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: fmt.Sprintf("%v", test.input), } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{}) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) require.NoError(t, result.Error) require.Equal(t, test.result, result.Value) })` $DIR/core/services/pipeline/task.base64encode_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.base64encode_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.base64encode_test.go: `.Sprintf("%v", test.input)` $DIR/core/services/pipeline/task.base64encode_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})` $DIR/core/services/pipeline/task.base64encode_test.go: `.Context(t)` $DIR/core/services/pipeline/task.base64encode_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `task.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `err = json.Unmarshal([]byte(result.Value.(string)), &x)` $DIR/core/services/pipeline/task.bridge_test.go: `task.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `c.WebServer.BridgeCacheTTL = commonconfig.MustNewDuration(30 * time.Second)` $DIR/core/services/pipeline/task.bridge_test.go: `task.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `_, err = db.ExecContext(ctx, `INSERT INTO bridge_last_value(dot_id, spec_id, value, finished_at) VALUES($1, $2, $3, $4) ON CONFLICT ON CONSTRAINT bridge_last_value_pkey DO UPDATE SET value = $3, finished_at = $4;`, task.DotID(), specID, big.NewInt(9700).Bytes(), time.Now().Add(-1*time.Minute))` $DIR/core/services/pipeline/task.bridge_test.go: `_, err = db.ExecContext(ctx, `INSERT INTO bridge_last_value(dot_id, spec_id, value, finished_at) VALUES($1, $2, $3, $4) ON CONFLICT ON CONSTRAINT bridge_last_value_pkey DO UPDATE SET value = $3, finished_at = $4;`, task.DotID(), specID, big.NewInt(9700).Bytes(), time.Now().Add(-10*time.Second))` $DIR/core/services/pipeline/task.bridge_test.go: `result2, _ = task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "shouldFail": true, }, }, }, ), nil)` $DIR/core/services/pipeline/task.bridge_test.go: `c.WebServer.BridgeCacheTTL = commonconfig.MustNewDuration(0 * time.Second)` $DIR/core/services/pipeline/task.bridge_test.go: `task.HelperSetDependencies(cfg2.JobPipeline(), cfg2.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `result2, _ = task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "shouldFail": true, }, }, }, ), nil)` $DIR/core/services/pipeline/task.bridge_test.go: `task2.HelperSetDependencies(cfg2.JobPipeline(), cfg2.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `_, err = db.ExecContext(ctx, `INSERT INTO bridge_last_value(dot_id, spec_id, value, finished_at) VALUES($1, $2, $3, $4) ON CONFLICT ON CONSTRAINT bridge_last_value_pkey DO UPDATE SET value = $3, finished_at = $4;`, task2.DotID(), specID, big.NewInt(9700).Bytes(), time.Now().Add(-32*time.Minute))` $DIR/core/services/pipeline/task.bridge_test.go: `result2, _ = task2.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "shouldFail": true, }, }, }, ), nil)` $DIR/core/services/pipeline/task.bridge_test.go: `_, err = db.ExecContext(ctx, `INSERT INTO bridge_last_value(dot_id, spec_id, value, finished_at) VALUES($1, $2, $3, $4) ON CONFLICT ON CONSTRAINT bridge_last_value_pkey DO UPDATE SET value = $3, finished_at = $4;`, task2.DotID(), specID, big.NewInt(9700).Bytes(), time.Now().Add(-25*time.Minute))` $DIR/core/services/pipeline/task.bridge_test.go: `result2, _ = task2.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "shouldFail": true, }, }, }, ), nil)` $DIR/core/services/pipeline/task.bridge_test.go: `err = json.Unmarshal(payload, &reqBody)` $DIR/core/services/pipeline/task.bridge_test.go: `w.Header().Set("Content-Type", "application/json")` $DIR/core/services/pipeline/task.bridge_test.go: `task.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, id, c)` $DIR/core/services/pipeline/task.bridge_test.go: `t.Run(test.name, func(t *testing.T) { t.Parallel() db := pgtest.NewSqlxDB(t) cfg := configtest.NewTestGeneralConfig(t) s1 := httptest.NewServer(fakePriceResponder(t, test.expectedRequestData, decimal.NewFromInt(9700), "", nil)) defer s1.Close() feedURL, err := url.ParseRequestURI(s1.URL) require.NoError(t, err) orm := bridges.NewORM(db) _, bridge := cltest.MustCreateBridge(t, db, cltest.BridgeOpts{URL: feedURL.String()}) task := pipeline.BridgeTask{ BaseTask: pipeline.NewBaseTask(0, "bridge", nil, nil, 0), Name: bridge.Name.String(), RequestData: test.requestData, IncludeInputAtKey: test.includeInputAtKey, } c := clhttptest.NewTestLocalOnlyHTTPClient() trORM := pipeline.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns()) specID, err := trORM.CreateSpec(testutils.Context(t), pipeline.Pipeline{}, *models.NewInterval(5 * time.Minute)) require.NoError(t, err) task.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c) result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectedErrorCause != nil { require.Equal(t, test.expectedErrorCause, errors.Cause(result.Error)) if test.expectedErrorContains != "" { require.Contains(t, result.Error.Error(), test.expectedErrorContains) } } else { require.NoError(t, result.Error) require.NotNil(t, result.Value) var x struct { Data struct { Result decimal.Decimal `json:"result"` } `json:"data"` } err = json.Unmarshal([]byte(result.Value.(string)), &x) require.NoError(t, err) require.Equal(t, decimal.NewFromInt(9700), x.Data.Result) } })` $DIR/core/services/pipeline/task.bridge_test.go: `task.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `err = json.Unmarshal([]byte(result.Value.(string)), &x)` $DIR/core/services/pipeline/task.bridge_test.go: `w.Header().Set("Content-Type", "application/json")` $DIR/core/services/pipeline/task.bridge_test.go: `httpCalled.Store(true)` $DIR/core/services/pipeline/task.bridge_test.go: `task.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `t.Run(test.name, func(t *testing.T) { db := pgtest.NewSqlxDB(t) cfg := configtest.NewTestGeneralConfig(t) s1 := httptest.NewServer(fakePriceResponder(t, utils.MustUnmarshalToMap(btcUSDPairing), decimal.NewFromInt(9700), test.includeInputAtKey, test.expectedInput)) defer s1.Close() feedURL, err := url.ParseRequestURI(s1.URL) require.NoError(t, err) orm := bridges.NewORM(db) _, bridge := cltest.MustCreateBridge(t, db, cltest.BridgeOpts{URL: feedURL.String()}) task := pipeline.BridgeTask{ BaseTask: pipeline.NewBaseTask(0, "bridge", nil, nil, 0), Name: bridge.Name.String(), RequestData: btcUSDPairing, IncludeInputAtKey: test.includeInputAtKey, } c := clhttptest.NewTestLocalOnlyHTTPClient() trORM := pipeline.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns()) specID, err := trORM.CreateSpec(testutils.Context(t), pipeline.Pipeline{}, *models.NewInterval(5 * time.Minute)) require.NoError(t, err) task.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c) result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectedErrorCause != nil { require.Equal(t, test.expectedErrorCause, errors.Cause(result.Error)) require.Nil(t, result.Value) } else { require.NoError(t, result.Error) require.NotNil(t, result.Value) var x struct { Data struct { Result decimal.Decimal `json:"result"` } `json:"data"` } err = json.Unmarshal([]byte(result.Value.(string)), &x) require.NoError(t, err) require.Equal(t, decimal.NewFromInt(9700), x.Data.Result) } })` $DIR/core/services/pipeline/task.bridge_test.go: `task.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `err = json.Unmarshal([]byte(result.Value.(string)), &x)` $DIR/core/services/pipeline/task.bridge_test.go: `w.Header().Set("Content-Type", "application/json")` $DIR/core/services/pipeline/task.bridge_test.go: `w.WriteHeader(http.StatusTooManyRequests)` $DIR/core/services/pipeline/task.bridge_test.go: `resp.SetErrorMessage("could not hit data fetcher")` $DIR/core/services/pipeline/task.bridge_test.go: `task.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `w.Header().Set("Content-Type", "application/json")` $DIR/core/services/pipeline/task.bridge_test.go: `w.WriteHeader(http.StatusBadGateway)` $DIR/core/services/pipeline/task.bridge_test.go: `task.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `task.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `t.Run(test.name, func(t *testing.T) { var response adapterResponse err := json.Unmarshal([]byte(test.content), &response) require.NoError(t, err) result := response.Result() require.Equal(t, test.expect.String(), result.String()) })` $DIR/core/services/pipeline/task.bridge_test.go: `headers = r.Header` $DIR/core/services/pipeline/task.bridge_test.go: `w.Header().Set("Content-Type", "application/json")` $DIR/core/services/pipeline/task.bridge_test.go: `w.WriteHeader(http.StatusOK)` $DIR/core/services/pipeline/task.bridge_test.go: `keys = append(keys, k)` $DIR/core/services/pipeline/task.bridge_test.go: `sort.Strings(keys)` $DIR/core/services/pipeline/task.bridge_test.go: `s = append(s, k, v)` $DIR/core/services/pipeline/task.bridge_test.go: `fmt.Println(k, v)` $DIR/core/services/pipeline/task.bridge_test.go: `t.Run("sends headers", func(t *testing.T) { task := pipeline.BridgeTask{ BaseTask: pipeline.NewBaseTask(0, "bridge", nil, nil, 0), Name: bridge.Name.String(), RequestData: btcUSDPairing, Headers: `["X-Header-1", "foo", "X-Header-2", "bar"]`, } c := clhttptest.NewTestLocalOnlyHTTPClient() trORM := pipeline.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns()) specID, err := trORM.CreateSpec(testutils.Context(t), pipeline.Pipeline{}, *models.NewInterval(5 * time.Minute)) require.NoError(t, err) task.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c) result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), nil) assert.False(t, runInfo.IsPending) assert.Equal(t, `{"fooresponse": 1}`, result.Value) assert.Nil(t, result.Error) assert.Equal(t, append(standardHeaders, "X-Header-1", "foo", "X-Header-2", "bar"), allHeaders(headers)) })` $DIR/core/services/pipeline/task.bridge_test.go: `task.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `t.Run("errors with odd number of headers", func(t *testing.T) { task := pipeline.BridgeTask{ BaseTask: pipeline.NewBaseTask(0, "bridge", nil, nil, 0), Name: bridge.Name.String(), RequestData: btcUSDPairing, Headers: `["X-Header-1", "foo", "X-Header-2", "bar", "odd one out"]`, } c := clhttptest.NewTestLocalOnlyHTTPClient() trORM := pipeline.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns()) specID, err := trORM.CreateSpec(testutils.Context(t), pipeline.Pipeline{}, *models.NewInterval(5 * time.Minute)) require.NoError(t, err) task.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c) result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), nil) assert.False(t, runInfo.IsPending) assert.NotNil(t, result.Error) assert.Equal(t, `headers must have an even number of elements`, result.Error.Error()) assert.Nil(t, result.Value) })` $DIR/core/services/pipeline/task.bridge_test.go: `task.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `task.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `c.WebServer.BridgeCacheTTL = commonconfig.MustNewDuration(1 * time.Minute)` $DIR/core/services/pipeline/task.bridge_test.go: `task.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `_, err = db.ExecContext(ctx, `INSERT INTO bridge_last_value(dot_id, spec_id, value, finished_at) VALUES($1, $2, $3, $4) ON CONFLICT ON CONSTRAINT bridge_last_value_pkey DO UPDATE SET value = $3, finished_at = $4;`, task.DotID(), specID, big.NewInt(9700).Bytes(), time.Now())` $DIR/core/services/pipeline/task.bridge_test.go: `testAdapterResponse.SetStatusCode(http.StatusBadRequest)` $DIR/core/services/pipeline/task.bridge_test.go: `testAdapterResponse.SetStatusCode(http.StatusOK)` $DIR/core/services/pipeline/task.bridge_test.go: `testAdapterResponse.SetProviderStatusCode(http.StatusBadRequest)` $DIR/core/services/pipeline/task.bridge_test.go: `result, runInfo = task.Run(ctx, logger.TestLogger(t), vars, nil)` $DIR/core/services/pipeline/task.bridge_test.go: `testAdapterResponse.SetStatusCode(http.StatusOK)` $DIR/core/services/pipeline/task.bridge_test.go: `testAdapterResponse.SetProviderStatusCode(http.StatusOK)` $DIR/core/services/pipeline/task.bridge_test.go: `testAdapterResponse.SetError("some error")` $DIR/core/services/pipeline/task.bridge_test.go: `result, runInfo = task.Run(ctx, logger.TestLogger(t), vars, nil)` $DIR/core/services/pipeline/task.bridge_test.go: `testAdapterResponse.SetStatusCode(http.StatusInternalServerError)` $DIR/core/services/pipeline/task.bridge_test.go: `result, runInfo = task.Run(ctx, logger.TestLogger(t), vars, nil)` $DIR/core/services/pipeline/task.bridge_test.go: `c.WebServer.BridgeCacheTTL = commonconfig.MustNewDuration(1 * time.Minute)` $DIR/core/services/pipeline/task.bridge_test.go: `time.Sleep(time.Second)` $DIR/core/services/pipeline/task.bridge_test.go: `task.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `_, err = db.ExecContext(ctx, `INSERT INTO bridge_last_value(dot_id, spec_id, value, finished_at) VALUES($1, $2, $3, $4) ON CONFLICT ON CONSTRAINT bridge_last_value_pkey DO UPDATE SET value = $3, finished_at = $4;`, task.DotID(), specID, big.NewInt(9700).Bytes(), time.Now())` $DIR/core/services/pipeline/task.bridge_test.go: `t.Run("pre-cancelled", func(t *testing.T) { ctx, cancel := context.WithCancel(testutils.Context(t)) cancel() // pre-cancelled result, runInfo := task.Run(ctx, logger.TestLogger(t), vars, nil) require.NoError(t, result.Error) require.NotNil(t, result.Value) require.False(t, runInfo.IsRetryable) require.False(t, runInfo.IsPending) })` $DIR/core/services/pipeline/task.bridge_test.go: `cancel()` $DIR/core/services/pipeline/task.bridge_test.go: `t.Cleanup(cancel)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewServer(fakePriceResponder(t, utils.MustUnmarshalToMap(btcUSDPairing), decimal.NewFromInt(9700), "", nil))` $DIR/core/services/pipeline/task.bridge_test.go: `.MustUnmarshalToMap(btcUSDPairing)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewFromInt(9700)` $DIR/core/services/pipeline/task.bridge_test.go: `.ParseRequestURI(s1.URL)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db)` $DIR/core/services/pipeline/task.bridge_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{URL: feedURL.String()})` $DIR/core/services/pipeline/task.bridge_test.go: `.String()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewBaseTask(0, "bridge", nil, nil, 0)` $DIR/core/services/pipeline/task.bridge_test.go: `.Name.String()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/pipeline/task.bridge_test.go: `.CreateSpec(testutils.Context(t), pipeline.Pipeline{}, *models.NewInterval(5 * time.Minute))` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewInterval(5 * time.Minute)` $DIR/core/services/pipeline/task.bridge_test.go: `.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.WebServer()` $DIR/core/services/pipeline/task.bridge_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.Unmarshal([]byte(result.Value.(string)), &x)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewFromInt(9700)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) {})` $DIR/core/services/pipeline/task.bridge_test.go: `.NewServer(fakeIntermittentlyFailingPriceResponder(t, utils.MustUnmarshalToMap(btcUSDPairing), decimal.NewFromInt(9700), "", nil))` $DIR/core/services/pipeline/task.bridge_test.go: `.MustUnmarshalToMap(btcUSDPairing)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewFromInt(9700)` $DIR/core/services/pipeline/task.bridge_test.go: `.ParseRequestURI(s1.URL)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db)` $DIR/core/services/pipeline/task.bridge_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{URL: feedURL.String()})` $DIR/core/services/pipeline/task.bridge_test.go: `.String()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewBaseTask(0, "bridge", nil, nil, 0)` $DIR/core/services/pipeline/task.bridge_test.go: `.Name.String()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/pipeline/task.bridge_test.go: `.CreateSpec(testutils.Context(t), pipeline.Pipeline{}, *models.NewInterval(5 * time.Minute))` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewInterval(5 * time.Minute)` $DIR/core/services/pipeline/task.bridge_test.go: `.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.WebServer()` $DIR/core/services/pipeline/task.bridge_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "shouldFail": false, }, }, }, ), nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "shouldFail": false, }, }, }, )` $DIR/core/services/pipeline/task.bridge_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "shouldFail": true, }, }, }, ), nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "shouldFail": true, }, }, }, )` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.WebServer.BridgeCacheTTL = commonconfig.MustNewDuration(30 * time.Second) })` $DIR/core/services/pipeline/task.bridge_test.go: `.MustNewDuration(30 * time.Second)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewServer(fakeIntermittentlyFailingPriceResponder(t, utils.MustUnmarshalToMap(btcUSDPairing), decimal.NewFromInt(9700), "", nil))` $DIR/core/services/pipeline/task.bridge_test.go: `.MustUnmarshalToMap(btcUSDPairing)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewFromInt(9700)` $DIR/core/services/pipeline/task.bridge_test.go: `.ParseRequestURI(s1.URL)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db)` $DIR/core/services/pipeline/task.bridge_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{URL: feedURL.String()})` $DIR/core/services/pipeline/task.bridge_test.go: `.String()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewBaseTask(0, "bridge", nil, nil, 0)` $DIR/core/services/pipeline/task.bridge_test.go: `.Name.String()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/pipeline/task.bridge_test.go: `.CreateSpec(testutils.Context(t), pipeline.Pipeline{}, *models.NewInterval(5 * time.Minute))` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewInterval(5 * time.Minute)` $DIR/core/services/pipeline/task.bridge_test.go: `.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.WebServer()` $DIR/core/services/pipeline/task.bridge_test.go: `.ExecContext(ctx, `INSERT INTO bridge_last_value(dot_id, spec_id, value, finished_at) VALUES($1, $2, $3, $4) ON CONFLICT ON CONSTRAINT bridge_last_value_pkey DO UPDATE SET value = $3, finished_at = $4;`, task.DotID(), specID, big.NewInt(9700).Bytes(), time.Now().Add(-1*time.Minute))` $DIR/core/services/pipeline/task.bridge_test.go: `.DotID()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewInt(9700)` $DIR/core/services/pipeline/task.bridge_test.go: `.Bytes()` $DIR/core/services/pipeline/task.bridge_test.go: `.Now()` $DIR/core/services/pipeline/task.bridge_test.go: `.Add(-1*time.Minute)` $DIR/core/services/pipeline/task.bridge_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "shouldFail": true, }, }, }, ), nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "shouldFail": true, }, }, }, )` $DIR/core/services/pipeline/task.bridge_test.go: `.ExecContext(ctx, `INSERT INTO bridge_last_value(dot_id, spec_id, value, finished_at) VALUES($1, $2, $3, $4) ON CONFLICT ON CONSTRAINT bridge_last_value_pkey DO UPDATE SET value = $3, finished_at = $4;`, task.DotID(), specID, big.NewInt(9700).Bytes(), time.Now().Add(-10*time.Second))` $DIR/core/services/pipeline/task.bridge_test.go: `.DotID()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewInt(9700)` $DIR/core/services/pipeline/task.bridge_test.go: `.Bytes()` $DIR/core/services/pipeline/task.bridge_test.go: `.Now()` $DIR/core/services/pipeline/task.bridge_test.go: `.Add(-10*time.Second)` $DIR/core/services/pipeline/task.bridge_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "shouldFail": true, }, }, }, ), nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "shouldFail": true, }, }, }, )` $DIR/core/services/pipeline/task.bridge_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.WebServer.BridgeCacheTTL = commonconfig.MustNewDuration(0 * time.Second) })` $DIR/core/services/pipeline/task.bridge_test.go: `.MustNewDuration(0 * time.Second)` $DIR/core/services/pipeline/task.bridge_test.go: `.HelperSetDependencies(cfg2.JobPipeline(), cfg2.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.WebServer()` $DIR/core/services/pipeline/task.bridge_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "shouldFail": true, }, }, }, ), nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "shouldFail": true, }, }, }, )` $DIR/core/services/pipeline/task.bridge_test.go: `.NewBaseTask(0, "bridge2", nil, nil, 0)` $DIR/core/services/pipeline/task.bridge_test.go: `.Name.String()` $DIR/core/services/pipeline/task.bridge_test.go: `.HelperSetDependencies(cfg2.JobPipeline(), cfg2.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.WebServer()` $DIR/core/services/pipeline/task.bridge_test.go: `.ExecContext(ctx, `INSERT INTO bridge_last_value(dot_id, spec_id, value, finished_at) VALUES($1, $2, $3, $4) ON CONFLICT ON CONSTRAINT bridge_last_value_pkey DO UPDATE SET value = $3, finished_at = $4;`, task2.DotID(), specID, big.NewInt(9700).Bytes(), time.Now().Add(-32*time.Minute))` $DIR/core/services/pipeline/task.bridge_test.go: `.DotID()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewInt(9700)` $DIR/core/services/pipeline/task.bridge_test.go: `.Bytes()` $DIR/core/services/pipeline/task.bridge_test.go: `.Now()` $DIR/core/services/pipeline/task.bridge_test.go: `.Add(-32*time.Minute)` $DIR/core/services/pipeline/task.bridge_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "shouldFail": true, }, }, }, ), nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "shouldFail": true, }, }, }, )` $DIR/core/services/pipeline/task.bridge_test.go: `.ExecContext(ctx, `INSERT INTO bridge_last_value(dot_id, spec_id, value, finished_at) VALUES($1, $2, $3, $4) ON CONFLICT ON CONSTRAINT bridge_last_value_pkey DO UPDATE SET value = $3, finished_at = $4;`, task2.DotID(), specID, big.NewInt(9700).Bytes(), time.Now().Add(-25*time.Minute))` $DIR/core/services/pipeline/task.bridge_test.go: `.DotID()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewInt(9700)` $DIR/core/services/pipeline/task.bridge_test.go: `.Bytes()` $DIR/core/services/pipeline/task.bridge_test.go: `.Now()` $DIR/core/services/pipeline/task.bridge_test.go: `.Add(-25*time.Minute)` $DIR/core/services/pipeline/task.bridge_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "shouldFail": true, }, }, }, ), nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "shouldFail": true, }, }, }, )` $DIR/core/services/pipeline/task.bridge_test.go: `.NewInt(9700)` $DIR/core/services/pipeline/task.bridge_test.go: `.Bytes()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.New()` $DIR/core/services/pipeline/task.bridge_test.go: `.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var reqBody adapterRequest payload, err := io.ReadAll(r.Body) require.NoError(t, err) defer r.Body.Close() err = json.Unmarshal(payload, &reqBody) require.NoError(t, err) require.Equal(t, fmt.Sprintf("%s/v2/resume/%v", cfg.WebServer().BridgeResponseURL(), id.String()), reqBody.ResponseURL) w.Header().Set("Content-Type", "application/json") // w.Header().Set("X-Chainlink-Pending", "true") response := map[string]interface{}{"pending": true} require.NoError(t, json.NewEncoder(w).Encode(response)) })` $DIR/core/services/pipeline/task.bridge_test.go: `.ReadAll(r.Body)` $DIR/core/services/pipeline/task.bridge_test.go: `.Unmarshal(payload, &reqBody)` $DIR/core/services/pipeline/task.bridge_test.go: `.Header()` $DIR/core/services/pipeline/task.bridge_test.go: `.Set("Content-Type", "application/json")` $DIR/core/services/pipeline/task.bridge_test.go: `.NewServer(handler)` $DIR/core/services/pipeline/task.bridge_test.go: `.ParseRequestURI(server.URL)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db)` $DIR/core/services/pipeline/task.bridge_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{URL: feedURL.String()})` $DIR/core/services/pipeline/task.bridge_test.go: `.String()` $DIR/core/services/pipeline/task.bridge_test.go: `.Name.String()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/pipeline/task.bridge_test.go: `.CreateSpec(testutils.Context(t), pipeline.Pipeline{}, *models.NewInterval(5 * time.Minute))` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewInterval(5 * time.Minute)` $DIR/core/services/pipeline/task.bridge_test.go: `.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, id, c)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.WebServer()` $DIR/core/services/pipeline/task.bridge_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom(map[string]interface{}{"some_data": map[string]interface{}{"foo": 543.21}})` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom(map[string]interface{}{"some_data": map[string]interface{}{"foo": 543.21}})` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom(map[string]interface{}{"some_data": map[string]interface{}{"foo": 543.21}})` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom(map[string]interface{}{"some_data": map[string]interface{}{"foo": 543.21}})` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom(map[string]interface{}{"not_some_data": map[string]interface{}{"foo": 543.21}})` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom(map[string]interface{}{"some_data": 543.21})` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom(map[string]interface{}{"medianize": 543.21})` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom(map[string]interface{}{"medianize": 543.21})` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom(map[string]interface{}{"medianize": 543.21})` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom(map[string]interface{}{"nope": "foo bar"})` $DIR/core/services/pipeline/task.bridge_test.go: `.Run(test.name, func(t *testing.T) { t.Parallel() db := pgtest.NewSqlxDB(t) cfg := configtest.NewTestGeneralConfig(t) s1 := httptest.NewServer(fakePriceResponder(t, test.expectedRequestData, decimal.NewFromInt(9700), "", nil)) defer s1.Close() feedURL, err := url.ParseRequestURI(s1.URL) require.NoError(t, err) orm := bridges.NewORM(db) _, bridge := cltest.MustCreateBridge(t, db, cltest.BridgeOpts{URL: feedURL.String()}) task := pipeline.BridgeTask{ BaseTask: pipeline.NewBaseTask(0, "bridge", nil, nil, 0), Name: bridge.Name.String(), RequestData: test.requestData, IncludeInputAtKey: test.includeInputAtKey, } c := clhttptest.NewTestLocalOnlyHTTPClient() trORM := pipeline.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns()) specID, err := trORM.CreateSpec(testutils.Context(t), pipeline.Pipeline{}, *models.NewInterval(5 * time.Minute)) require.NoError(t, err) task.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c) result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectedErrorCause != nil { require.Equal(t, test.expectedErrorCause, errors.Cause(result.Error)) if test.expectedErrorContains != "" { require.Contains(t, result.Error.Error(), test.expectedErrorContains) } } else { require.NoError(t, result.Error) require.NotNil(t, result.Value) var x struct { Data struct { Result decimal.Decimal `json:"result"` } `json:"data"` } err = json.Unmarshal([]byte(result.Value.(string)), &x) require.NoError(t, err) require.Equal(t, decimal.NewFromInt(9700), x.Data.Result) } })` $DIR/core/services/pipeline/task.bridge_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewServer(fakePriceResponder(t, test.expectedRequestData, decimal.NewFromInt(9700), "", nil))` $DIR/core/services/pipeline/task.bridge_test.go: `.NewFromInt(9700)` $DIR/core/services/pipeline/task.bridge_test.go: `.ParseRequestURI(s1.URL)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db)` $DIR/core/services/pipeline/task.bridge_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{URL: feedURL.String()})` $DIR/core/services/pipeline/task.bridge_test.go: `.String()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewBaseTask(0, "bridge", nil, nil, 0)` $DIR/core/services/pipeline/task.bridge_test.go: `.Name.String()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/pipeline/task.bridge_test.go: `.CreateSpec(testutils.Context(t), pipeline.Pipeline{}, *models.NewInterval(5 * time.Minute))` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewInterval(5 * time.Minute)` $DIR/core/services/pipeline/task.bridge_test.go: `.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.WebServer()` $DIR/core/services/pipeline/task.bridge_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs)` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.Unmarshal([]byte(result.Value.(string)), &x)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var req adapterRequest body, _ := io.ReadAll(r.Body) err := json.Unmarshal(body, &req) require.NoError(t, err) require.Equal(t, float64(10), req.Meta["latestAnswer"]) require.Equal(t, float64(1616447984), req.Meta["updatedAt"]) w.Header().Set("Content-Type", "application/json") require.NoError(t, json.NewEncoder(w).Encode(empty)) httpCalled.Store(true) })` $DIR/core/services/pipeline/task.bridge_test.go: `.ReadAll(r.Body)` $DIR/core/services/pipeline/task.bridge_test.go: `.Unmarshal(body, &req)` $DIR/core/services/pipeline/task.bridge_test.go: `.Header()` $DIR/core/services/pipeline/task.bridge_test.go: `.Set("Content-Type", "application/json")` $DIR/core/services/pipeline/task.bridge_test.go: `.Store(true)` $DIR/core/services/pipeline/task.bridge_test.go: `.MarshalBridgeMetaData(big.NewInt(10), big.NewInt(1616447984))` $DIR/core/services/pipeline/task.bridge_test.go: `.NewInt(10)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewInt(1616447984)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewServer(handler)` $DIR/core/services/pipeline/task.bridge_test.go: `.ParseRequestURI(s1.URL)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db)` $DIR/core/services/pipeline/task.bridge_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{URL: feedURL.String()})` $DIR/core/services/pipeline/task.bridge_test.go: `.String()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewBaseTask(0, "bridge", nil, nil, 0)` $DIR/core/services/pipeline/task.bridge_test.go: `.Name.String()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/pipeline/task.bridge_test.go: `.CreateSpec(testutils.Context(t), pipeline.Pipeline{}, *models.NewInterval(5 * time.Minute))` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewInterval(5 * time.Minute)` $DIR/core/services/pipeline/task.bridge_test.go: `.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.WebServer()` $DIR/core/services/pipeline/task.bridge_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(map[string]interface{}{"jobRun": mp}), nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom(map[string]interface{}{"jobRun": mp})` $DIR/core/services/pipeline/task.bridge_test.go: `.Load()` $DIR/core/services/pipeline/task.bridge_test.go: `.New("foo")` $DIR/core/services/pipeline/task.bridge_test.go: `.NewFromFloat(123.45)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewFromFloat(123.45)` $DIR/core/services/pipeline/task.bridge_test.go: `.Run(test.name, func(t *testing.T) { db := pgtest.NewSqlxDB(t) cfg := configtest.NewTestGeneralConfig(t) s1 := httptest.NewServer(fakePriceResponder(t, utils.MustUnmarshalToMap(btcUSDPairing), decimal.NewFromInt(9700), test.includeInputAtKey, test.expectedInput)) defer s1.Close() feedURL, err := url.ParseRequestURI(s1.URL) require.NoError(t, err) orm := bridges.NewORM(db) _, bridge := cltest.MustCreateBridge(t, db, cltest.BridgeOpts{URL: feedURL.String()}) task := pipeline.BridgeTask{ BaseTask: pipeline.NewBaseTask(0, "bridge", nil, nil, 0), Name: bridge.Name.String(), RequestData: btcUSDPairing, IncludeInputAtKey: test.includeInputAtKey, } c := clhttptest.NewTestLocalOnlyHTTPClient() trORM := pipeline.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns()) specID, err := trORM.CreateSpec(testutils.Context(t), pipeline.Pipeline{}, *models.NewInterval(5 * time.Minute)) require.NoError(t, err) task.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c) result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectedErrorCause != nil { require.Equal(t, test.expectedErrorCause, errors.Cause(result.Error)) require.Nil(t, result.Value) } else { require.NoError(t, result.Error) require.NotNil(t, result.Value) var x struct { Data struct { Result decimal.Decimal `json:"result"` } `json:"data"` } err = json.Unmarshal([]byte(result.Value.(string)), &x) require.NoError(t, err) require.Equal(t, decimal.NewFromInt(9700), x.Data.Result) } })` $DIR/core/services/pipeline/task.bridge_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewServer(fakePriceResponder(t, utils.MustUnmarshalToMap(btcUSDPairing), decimal.NewFromInt(9700), test.includeInputAtKey, test.expectedInput))` $DIR/core/services/pipeline/task.bridge_test.go: `.MustUnmarshalToMap(btcUSDPairing)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewFromInt(9700)` $DIR/core/services/pipeline/task.bridge_test.go: `.ParseRequestURI(s1.URL)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db)` $DIR/core/services/pipeline/task.bridge_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{URL: feedURL.String()})` $DIR/core/services/pipeline/task.bridge_test.go: `.String()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewBaseTask(0, "bridge", nil, nil, 0)` $DIR/core/services/pipeline/task.bridge_test.go: `.Name.String()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/pipeline/task.bridge_test.go: `.CreateSpec(testutils.Context(t), pipeline.Pipeline{}, *models.NewInterval(5 * time.Minute))` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewInterval(5 * time.Minute)` $DIR/core/services/pipeline/task.bridge_test.go: `.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.WebServer()` $DIR/core/services/pipeline/task.bridge_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), test.inputs)` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.Unmarshal([]byte(result.Value.(string)), &x)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusTooManyRequests) resp := &adapterResponse{} resp.SetErrorMessage("could not hit data fetcher") err := json.NewEncoder(w).Encode(resp) require.NoError(t, err) })` $DIR/core/services/pipeline/task.bridge_test.go: `.Header()` $DIR/core/services/pipeline/task.bridge_test.go: `.Set("Content-Type", "application/json")` $DIR/core/services/pipeline/task.bridge_test.go: `.WriteHeader(http.StatusTooManyRequests)` $DIR/core/services/pipeline/task.bridge_test.go: `.SetErrorMessage("could not hit data fetcher")` $DIR/core/services/pipeline/task.bridge_test.go: `.NewEncoder(w)` $DIR/core/services/pipeline/task.bridge_test.go: `.Encode(resp)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewServer(handler)` $DIR/core/services/pipeline/task.bridge_test.go: `.ParseRequestURI(server.URL)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db)` $DIR/core/services/pipeline/task.bridge_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{URL: feedURL.String()})` $DIR/core/services/pipeline/task.bridge_test.go: `.String()` $DIR/core/services/pipeline/task.bridge_test.go: `.Name.String()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/pipeline/task.bridge_test.go: `.CreateSpec(testutils.Context(t), pipeline.Pipeline{}, *models.NewInterval(5 * time.Minute))` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewInterval(5 * time.Minute)` $DIR/core/services/pipeline/task.bridge_test.go: `.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.WebServer()` $DIR/core/services/pipeline/task.bridge_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusBadGateway) _, err := w.Write([]byte(mustReadFile(t, "../../testdata/apiresponses/coinmarketcap.error.json"))) require.NoError(t, err) })` $DIR/core/services/pipeline/task.bridge_test.go: `.Header()` $DIR/core/services/pipeline/task.bridge_test.go: `.Set("Content-Type", "application/json")` $DIR/core/services/pipeline/task.bridge_test.go: `.WriteHeader(http.StatusBadGateway)` $DIR/core/services/pipeline/task.bridge_test.go: `.Write([]byte(mustReadFile(t, "../../testdata/apiresponses/coinmarketcap.error.json")))` $DIR/core/services/pipeline/task.bridge_test.go: `.NewServer(handler)` $DIR/core/services/pipeline/task.bridge_test.go: `.ParseRequestURI(server.URL)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db)` $DIR/core/services/pipeline/task.bridge_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{URL: feedURL.String()})` $DIR/core/services/pipeline/task.bridge_test.go: `.String()` $DIR/core/services/pipeline/task.bridge_test.go: `.Name.String()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/pipeline/task.bridge_test.go: `.CreateSpec(testutils.Context(t), pipeline.Pipeline{}, *models.NewInterval(5 * time.Minute))` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewInterval(5 * time.Minute)` $DIR/core/services/pipeline/task.bridge_test.go: `.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.WebServer()` $DIR/core/services/pipeline/task.bridge_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/pipeline/task.bridge_test.go: `.CreateSpec(testutils.Context(t), pipeline.Pipeline{}, *models.NewInterval(5 * time.Minute))` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewInterval(5 * time.Minute)` $DIR/core/services/pipeline/task.bridge_test.go: `.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.WebServer()` $DIR/core/services/pipeline/task.bridge_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewFromFloat(123.456789)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewFromFloat(306.52036004)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewFromFloat(305.5574615)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewFromFloat(305.76)` $DIR/core/services/pipeline/task.bridge_test.go: `.Run(test.name, func(t *testing.T) { var response adapterResponse err := json.Unmarshal([]byte(test.content), &response) require.NoError(t, err) result := response.Result() require.Equal(t, test.expect.String(), result.String()) })` $DIR/core/services/pipeline/task.bridge_test.go: `.Unmarshal([]byte(test.content), &response)` $DIR/core/services/pipeline/task.bridge_test.go: `.Result()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { headers = r.Header w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) _, err := w.Write([]byte(`{"fooresponse": 1}`)) require.NoError(t, err) })` $DIR/core/services/pipeline/task.bridge_test.go: `.Header()` $DIR/core/services/pipeline/task.bridge_test.go: `.Set("Content-Type", "application/json")` $DIR/core/services/pipeline/task.bridge_test.go: `.WriteHeader(http.StatusOK)` $DIR/core/services/pipeline/task.bridge_test.go: `.Write([]byte(`{"fooresponse": 1}`))` $DIR/core/services/pipeline/task.bridge_test.go: `.NewServer(handler)` $DIR/core/services/pipeline/task.bridge_test.go: `.ParseRequestURI(server.URL)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db)` $DIR/core/services/pipeline/task.bridge_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{URL: bridgeURL.String()})` $DIR/core/services/pipeline/task.bridge_test.go: `.String()` $DIR/core/services/pipeline/task.bridge_test.go: `.Strings(keys)` $DIR/core/services/pipeline/task.bridge_test.go: `.Get(k)` $DIR/core/services/pipeline/task.bridge_test.go: `.Println(k, v)` $DIR/core/services/pipeline/task.bridge_test.go: `.Run("sends headers", func(t *testing.T) { task := pipeline.BridgeTask{ BaseTask: pipeline.NewBaseTask(0, "bridge", nil, nil, 0), Name: bridge.Name.String(), RequestData: btcUSDPairing, Headers: `["X-Header-1", "foo", "X-Header-2", "bar"]`, } c := clhttptest.NewTestLocalOnlyHTTPClient() trORM := pipeline.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns()) specID, err := trORM.CreateSpec(testutils.Context(t), pipeline.Pipeline{}, *models.NewInterval(5 * time.Minute)) require.NoError(t, err) task.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c) result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), nil) assert.False(t, runInfo.IsPending) assert.Equal(t, `{"fooresponse": 1}`, result.Value) assert.Nil(t, result.Error) assert.Equal(t, append(standardHeaders, "X-Header-1", "foo", "X-Header-2", "bar"), allHeaders(headers)) })` $DIR/core/services/pipeline/task.bridge_test.go: `.NewBaseTask(0, "bridge", nil, nil, 0)` $DIR/core/services/pipeline/task.bridge_test.go: `.Name.String()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/pipeline/task.bridge_test.go: `.CreateSpec(testutils.Context(t), pipeline.Pipeline{}, *models.NewInterval(5 * time.Minute))` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewInterval(5 * time.Minute)` $DIR/core/services/pipeline/task.bridge_test.go: `.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.WebServer()` $DIR/core/services/pipeline/task.bridge_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.Run("errors with odd number of headers", func(t *testing.T) { task := pipeline.BridgeTask{ BaseTask: pipeline.NewBaseTask(0, "bridge", nil, nil, 0), Name: bridge.Name.String(), RequestData: btcUSDPairing, Headers: `["X-Header-1", "foo", "X-Header-2", "bar", "odd one out"]`, } c := clhttptest.NewTestLocalOnlyHTTPClient() trORM := pipeline.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns()) specID, err := trORM.CreateSpec(testutils.Context(t), pipeline.Pipeline{}, *models.NewInterval(5 * time.Minute)) require.NoError(t, err) task.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c) result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), nil) assert.False(t, runInfo.IsPending) assert.NotNil(t, result.Error) assert.Equal(t, `headers must have an even number of elements`, result.Error.Error()) assert.Nil(t, result.Value) })` $DIR/core/services/pipeline/task.bridge_test.go: `.NewBaseTask(0, "bridge", nil, nil, 0)` $DIR/core/services/pipeline/task.bridge_test.go: `.Name.String()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/pipeline/task.bridge_test.go: `.CreateSpec(testutils.Context(t), pipeline.Pipeline{}, *models.NewInterval(5 * time.Minute))` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewInterval(5 * time.Minute)` $DIR/core/services/pipeline/task.bridge_test.go: `.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.WebServer()` $DIR/core/services/pipeline/task.bridge_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewBaseTask(0, "bridge", nil, nil, 0)` $DIR/core/services/pipeline/task.bridge_test.go: `.Name.String()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/pipeline/task.bridge_test.go: `.CreateSpec(testutils.Context(t), pipeline.Pipeline{}, *models.NewInterval(5 * time.Minute))` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewInterval(5 * time.Minute)` $DIR/core/services/pipeline/task.bridge_test.go: `.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.WebServer()` $DIR/core/services/pipeline/task.bridge_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.WebServer.BridgeCacheTTL = commonconfig.MustNewDuration(1 * time.Minute) })` $DIR/core/services/pipeline/task.bridge_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewServer( http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { err := json.NewEncoder(w).Encode(testAdapterResponse) require.NoError(t, err) }))` $DIR/core/services/pipeline/task.bridge_test.go: `.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { err := json.NewEncoder(w).Encode(testAdapterResponse) require.NoError(t, err) })` $DIR/core/services/pipeline/task.bridge_test.go: `.NewEncoder(w)` $DIR/core/services/pipeline/task.bridge_test.go: `.Encode(testAdapterResponse)` $DIR/core/services/pipeline/task.bridge_test.go: `.ParseRequestURI(s1.URL)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db)` $DIR/core/services/pipeline/task.bridge_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{URL: feedURL.String()})` $DIR/core/services/pipeline/task.bridge_test.go: `.String()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewBaseTask(0, "bridge", nil, nil, 0)` $DIR/core/services/pipeline/task.bridge_test.go: `.Name.String()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/pipeline/task.bridge_test.go: `.CreateSpec(ctx, pipeline.Pipeline{}, *models.NewInterval(5 * time.Minute))` $DIR/core/services/pipeline/task.bridge_test.go: `.NewInterval(5 * time.Minute)` $DIR/core/services/pipeline/task.bridge_test.go: `.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.WebServer()` $DIR/core/services/pipeline/task.bridge_test.go: `.ExecContext(ctx, `INSERT INTO bridge_last_value(dot_id, spec_id, value, finished_at) VALUES($1, $2, $3, $4) ON CONFLICT ON CONSTRAINT bridge_last_value_pkey DO UPDATE SET value = $3, finished_at = $4;`, task.DotID(), specID, big.NewInt(9700).Bytes(), time.Now())` $DIR/core/services/pipeline/task.bridge_test.go: `.DotID()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewInt(9700)` $DIR/core/services/pipeline/task.bridge_test.go: `.Bytes()` $DIR/core/services/pipeline/task.bridge_test.go: `.Now()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "shouldFail": true, }, }, }, )` $DIR/core/services/pipeline/task.bridge_test.go: `.SetStatusCode(http.StatusBadRequest)` $DIR/core/services/pipeline/task.bridge_test.go: `.Run(ctx, logger.TestLogger(t), vars, nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.SetStatusCode(http.StatusOK)` $DIR/core/services/pipeline/task.bridge_test.go: `.SetProviderStatusCode(http.StatusBadRequest)` $DIR/core/services/pipeline/task.bridge_test.go: `.Run(ctx, logger.TestLogger(t), vars, nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.SetStatusCode(http.StatusOK)` $DIR/core/services/pipeline/task.bridge_test.go: `.SetProviderStatusCode(http.StatusOK)` $DIR/core/services/pipeline/task.bridge_test.go: `.SetError("some error")` $DIR/core/services/pipeline/task.bridge_test.go: `.Run(ctx, logger.TestLogger(t), vars, nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.SetStatusCode(http.StatusInternalServerError)` $DIR/core/services/pipeline/task.bridge_test.go: `.Run(ctx, logger.TestLogger(t), vars, nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.WebServer.BridgeCacheTTL = commonconfig.MustNewDuration(1 * time.Minute) })` $DIR/core/services/pipeline/task.bridge_test.go: `.MustNewDuration(1 * time.Minute)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewServer( http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { time.Sleep(time.Second) // delay enough to time-out }))` $DIR/core/services/pipeline/task.bridge_test.go: `.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { time.Sleep(time.Second) // delay enough to time-out })` $DIR/core/services/pipeline/task.bridge_test.go: `.Sleep(time.Second)` $DIR/core/services/pipeline/task.bridge_test.go: `.ParseRequestURI(s1.URL)` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db)` $DIR/core/services/pipeline/task.bridge_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{URL: feedURL.String()})` $DIR/core/services/pipeline/task.bridge_test.go: `.String()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewBaseTask(0, "bridge", nil, nil, 0)` $DIR/core/services/pipeline/task.bridge_test.go: `.Name.String()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/pipeline/task.bridge_test.go: `.CreateSpec(ctx, pipeline.Pipeline{}, *models.NewInterval(5 * time.Minute))` $DIR/core/services/pipeline/task.bridge_test.go: `.NewInterval(5 * time.Minute)` $DIR/core/services/pipeline/task.bridge_test.go: `.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.bridge_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.bridge_test.go: `.WebServer()` $DIR/core/services/pipeline/task.bridge_test.go: `.ExecContext(ctx, `INSERT INTO bridge_last_value(dot_id, spec_id, value, finished_at) VALUES($1, $2, $3, $4) ON CONFLICT ON CONSTRAINT bridge_last_value_pkey DO UPDATE SET value = $3, finished_at = $4;`, task.DotID(), specID, big.NewInt(9700).Bytes(), time.Now())` $DIR/core/services/pipeline/task.bridge_test.go: `.DotID()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewInt(9700)` $DIR/core/services/pipeline/task.bridge_test.go: `.Bytes()` $DIR/core/services/pipeline/task.bridge_test.go: `.Now()` $DIR/core/services/pipeline/task.bridge_test.go: `.NewVarsFrom( map[string]interface{}{ "jobRun": map[string]interface{}{ "meta": map[string]interface{}{ "shouldFail": true, }, }, }, )` $DIR/core/services/pipeline/task.bridge_test.go: `.Run("pre-cancelled", func(t *testing.T) { ctx, cancel := context.WithCancel(testutils.Context(t)) cancel() // pre-cancelled result, runInfo := task.Run(ctx, logger.TestLogger(t), vars, nil) require.NoError(t, result.Error) require.NotNil(t, result.Value) require.False(t, runInfo.IsRetryable) require.False(t, runInfo.IsPending) })` $DIR/core/services/pipeline/task.bridge_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.Run(ctx, logger.TestLogger(t), vars, nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.WithTimeout(testutils.Context(t), time.Millisecond)` $DIR/core/services/pipeline/task.bridge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.bridge_test.go: `.Cleanup(cancel)` $DIR/core/services/pipeline/task.bridge_test.go: `.Run(ctx, logger.TestLogger(t), vars, nil)` $DIR/core/services/pipeline/task.bridge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.cborparse_test.go: `t.Run(test.name, func(t *testing.T) { task := pipeline.CBORParseTask{ BaseTask: pipeline.NewBaseTask(0, "cbor", nil, nil, 0), Data: test.data, } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectedErrorCause != nil { assert.Equal(t, test.expectedErrorCause, errors.Cause(result.Error)) assert.Nil(t, result.Value) if test.expectedErrorContains != "" { assert.Contains(t, result.Error.Error(), test.expectedErrorContains) } } else { assert.NoError(t, result.Error) assert.Equal(t, test.expected, result.Value) } })` $DIR/core/services/pipeline/task.cborparse_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": "0xbf6375726c781a68747470733a2f2f657468657270726963652e636f6d2f61706964706174689f66726563656e7463757364ffff", })` $DIR/core/services/pipeline/task.cborparse_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": "0xbf6375726c781a68747470733a2f2f657468657270726963652e636f6d2f61706964706174689f66726563656e7463757364ffff000000", })` $DIR/core/services/pipeline/task.cborparse_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": "0xbf657461736b739f6868747470706f7374ff66706172616d73bf636d73676f68656c6c6f5f636861696e6c696e6b6375726c75687474703a2f2f6c6f63616c686f73743a36363930ffff", })` $DIR/core/services/pipeline/task.cborparse_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": "0x" + "bf" + // map(*) "67" + // text(7) "6269676e756d73" + // "bignums" "9f" + // array(*) "c2" + // tag(2) == unsigned bignum "5820" + // bytes(32) "0000000000000000000000000000000000000000000000010000000000000000" + // int(18446744073709551616) "c2" + // tag(2) == unsigned bignum "5820" + // bytes(32) "4000000000000000000000000000000000000000000000000000000000000000" + // int(28948022309329048855892746252171976963317496166410141009864396001978282409984) "c3" + // tag(3) == signed bignum "5820" + // bytes(32) "0000000000000000000000000000000000000000000000010000000000000000" + // int(18446744073709551616) "c3" + // tag(3) == signed bignum "5820" + // bytes(32) "3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + // int(28948022309329048855892746252171976963317496166410141009864396001978282409983) "ff" + // primitive(*) "ff", // primitive(*) })` $DIR/core/services/pipeline/task.cborparse_test.go: `.MustParseBigInt(t, "18446744073709551616")` $DIR/core/services/pipeline/task.cborparse_test.go: `.MustParseBigInt(t, "28948022309329048855892746252171976963317496166410141009864396001978282409984")` $DIR/core/services/pipeline/task.cborparse_test.go: `.MustParseBigInt(t, "-18446744073709551617")` $DIR/core/services/pipeline/task.cborparse_test.go: `.MustParseBigInt(t, "-28948022309329048855892746252171976963317496166410141009864396001978282409984")` $DIR/core/services/pipeline/task.cborparse_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": nil, })` $DIR/core/services/pipeline/task.cborparse_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.cborparse_test.go: `.New("foo")` $DIR/core/services/pipeline/task.cborparse_test.go: `.Run(test.name, func(t *testing.T) { task := pipeline.CBORParseTask{ BaseTask: pipeline.NewBaseTask(0, "cbor", nil, nil, 0), Data: test.data, } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectedErrorCause != nil { assert.Equal(t, test.expectedErrorCause, errors.Cause(result.Error)) assert.Nil(t, result.Value) if test.expectedErrorContains != "" { assert.Contains(t, result.Error.Error(), test.expectedErrorContains) } } else { assert.NoError(t, result.Error) assert.Equal(t, test.expected, result.Value) } })` $DIR/core/services/pipeline/task.cborparse_test.go: `.NewBaseTask(0, "cbor", nil, nil, 0)` $DIR/core/services/pipeline/task.cborparse_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs)` $DIR/core/services/pipeline/task.cborparse_test.go: `.Context(t)` $DIR/core/services/pipeline/task.cborparse_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.conditional_test.go: `t.Run(test.name, func(t *testing.T) { t.Run("without vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.ConditionalTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Data: test.input.(string)} result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}}) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectErr { require.Error(t, result.Error) require.Equal(t, nil, result.Value) } else { require.NoError(t, result.Error) require.Equal(t, true, result.Value.(bool)) } }) t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.ConditionalTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Data: "$(foo.bar)", } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{}) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectErr { require.Error(t, result.Error) require.Equal(t, nil, result.Value) } else { require.NoError(t, result.Error) require.Equal(t, true, result.Value.(bool)) } }) })` $DIR/core/services/pipeline/task.conditional_test.go: `t.Run("without vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.ConditionalTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Data: test.input.(string)} result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}}) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectErr { require.Error(t, result.Error) require.Equal(t, nil, result.Value) } else { require.NoError(t, result.Error) require.Equal(t, true, result.Value.(bool)) } })` $DIR/core/services/pipeline/task.conditional_test.go: `t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.ConditionalTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Data: "$(foo.bar)", } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{}) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectErr { require.Error(t, result.Error) require.Equal(t, nil, result.Value) } else { require.NoError(t, result.Error) require.Equal(t, true, result.Value.(bool)) } })` $DIR/core/services/pipeline/task.conditional_test.go: `.Run(test.name, func(t *testing.T) { t.Run("without vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.ConditionalTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Data: test.input.(string)} result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}}) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectErr { require.Error(t, result.Error) require.Equal(t, nil, result.Value) } else { require.NoError(t, result.Error) require.Equal(t, true, result.Value.(bool)) } }) t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.ConditionalTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Data: "$(foo.bar)", } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{}) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectErr { require.Error(t, result.Error) require.Equal(t, nil, result.Value) } else { require.NoError(t, result.Error) require.Equal(t, true, result.Value.(bool)) } }) })` $DIR/core/services/pipeline/task.conditional_test.go: `.Run("without vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.ConditionalTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Data: test.input.(string)} result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}}) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectErr { require.Error(t, result.Error) require.Equal(t, nil, result.Value) } else { require.NoError(t, result.Error) require.Equal(t, true, result.Value.(bool)) } })` $DIR/core/services/pipeline/task.conditional_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.conditional_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.conditional_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})` $DIR/core/services/pipeline/task.conditional_test.go: `.Context(t)` $DIR/core/services/pipeline/task.conditional_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.conditional_test.go: `.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.ConditionalTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Data: "$(foo.bar)", } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{}) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectErr { require.Error(t, result.Error) require.Equal(t, nil, result.Value) } else { require.NoError(t, result.Error) require.Equal(t, true, result.Value.(bool)) } })` $DIR/core/services/pipeline/task.conditional_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, })` $DIR/core/services/pipeline/task.conditional_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.conditional_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})` $DIR/core/services/pipeline/task.conditional_test.go: `.Context(t)` $DIR/core/services/pipeline/task.conditional_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.divide_test.go: `t.Run(test.name, func(t *testing.T) { t.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.DivideTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Divisor: test.divisor, Precision: test.precision, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) }) t.Run("without vars through input param", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.DivideTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: fmt.Sprintf("%v", test.input), Divisor: test.divisor, Precision: test.precision, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, "chain": map[string]interface{}{"link": test.divisor}, "sergey": map[string]interface{}{"steve": test.precision}, }) task := pipeline.DivideTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", Divisor: "$(chain.link)", Precision: "$(sergey.steve)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) })` $DIR/core/services/pipeline/task.divide_test.go: `t.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.DivideTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Divisor: test.divisor, Precision: test.precision, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) })` $DIR/core/services/pipeline/task.divide_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}}))` $DIR/core/services/pipeline/task.divide_test.go: `t.Run("without vars through input param", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.DivideTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: fmt.Sprintf("%v", test.input), Divisor: test.divisor, Precision: test.precision, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.divide_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{}))` $DIR/core/services/pipeline/task.divide_test.go: `t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, "chain": map[string]interface{}{"link": test.divisor}, "sergey": map[string]interface{}{"steve": test.precision}, }) task := pipeline.DivideTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", Divisor: "$(chain.link)", Precision: "$(sergey.steve)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.divide_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{}))` $DIR/core/services/pipeline/task.divide_test.go: `t.Run(test.name, func(t *testing.T) { task := pipeline.DivideTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: test.input, Divisor: test.divisor, } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) require.Equal(t, test.wantErrorCause, errors.Cause(result.Error)) if test.wantErrorContains != "" { require.Contains(t, result.Error.Error(), test.wantErrorContains) } })` $DIR/core/services/pipeline/task.divide_test.go: `.Run(test.name, func(t *testing.T) { t.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.DivideTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Divisor: test.divisor, Precision: test.precision, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) }) t.Run("without vars through input param", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.DivideTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: fmt.Sprintf("%v", test.input), Divisor: test.divisor, Precision: test.precision, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, "chain": map[string]interface{}{"link": test.divisor}, "sergey": map[string]interface{}{"steve": test.precision}, }) task := pipeline.DivideTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", Divisor: "$(chain.link)", Precision: "$(sergey.steve)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) })` $DIR/core/services/pipeline/task.divide_test.go: `.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.DivideTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Divisor: test.divisor, Precision: test.precision, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) })` $DIR/core/services/pipeline/task.divide_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.divide_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.divide_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})` $DIR/core/services/pipeline/task.divide_test.go: `.Context(t)` $DIR/core/services/pipeline/task.divide_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.divide_test.go: `.Run("without vars through input param", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.DivideTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: fmt.Sprintf("%v", test.input), Divisor: test.divisor, Precision: test.precision, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.divide_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.divide_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.divide_test.go: `.Sprintf("%v", test.input)` $DIR/core/services/pipeline/task.divide_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})` $DIR/core/services/pipeline/task.divide_test.go: `.Context(t)` $DIR/core/services/pipeline/task.divide_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.divide_test.go: `.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, "chain": map[string]interface{}{"link": test.divisor}, "sergey": map[string]interface{}{"steve": test.precision}, }) task := pipeline.DivideTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", Divisor: "$(chain.link)", Precision: "$(sergey.steve)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.divide_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, "chain": map[string]interface{}{"link": test.divisor}, "sergey": map[string]interface{}{"steve": test.precision}, })` $DIR/core/services/pipeline/task.divide_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.divide_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})` $DIR/core/services/pipeline/task.divide_test.go: `.Context(t)` $DIR/core/services/pipeline/task.divide_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.divide_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.divide_test.go: `.NewVarsFrom(map[string]interface{}{"foo": map[string]interface{}{"chain": "link"}})` $DIR/core/services/pipeline/task.divide_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.divide_test.go: `.NewVarsFrom(map[string]interface{}{"foo": []interface{}{"chain", "link"}})` $DIR/core/services/pipeline/task.divide_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.divide_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.divide_test.go: `.New("uh oh")` $DIR/core/services/pipeline/task.divide_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.divide_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.divide_test.go: `.Run(test.name, func(t *testing.T) { task := pipeline.DivideTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: test.input, Divisor: test.divisor, } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) require.Equal(t, test.wantErrorCause, errors.Cause(result.Error)) if test.wantErrorContains != "" { require.Contains(t, result.Error.Error(), test.wantErrorContains) } })` $DIR/core/services/pipeline/task.divide_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.divide_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs)` $DIR/core/services/pipeline/task.divide_test.go: `.Context(t)` $DIR/core/services/pipeline/task.divide_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.divide_test.go: `.NewFromString("6.34e-01")` $DIR/core/services/pipeline/task.divide_test.go: `.NewFromString("6.34e-10")` $DIR/core/services/pipeline/task.divide_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.divide_test.go: `.Sprintf("%d", math.MaxInt32)` $DIR/core/services/pipeline/task.divide_test.go: `.NewVarsFrom(map[string]interface{}{ "a": d1, "b": d2, })` $DIR/core/services/pipeline/task.divide_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: "123"}})` $DIR/core/services/pipeline/task.divide_test.go: `.Context(t)` $DIR/core/services/pipeline/task.divide_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.divide_test.go: `.Cause(result.Error)` $DIR/core/services/pipeline/task.divide_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/task.divide_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/task.divide_test.go: `.NewORM(t)` $DIR/core/services/pipeline/task.divide_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.divide_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.divide_test.go: `.ExecuteRun(testutils.Context(t), spec, vars, lggr)` $DIR/core/services/pipeline/task.divide_test.go: `.Context(t)` $DIR/core/services/pipeline/task.divide_test.go: `.String()` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `t.Run(test.name, func(t *testing.T) { task := pipeline.ETHABIDecodeLogTask{ BaseTask: pipeline.NewBaseTask(0, "decodelog", nil, nil, 0), ABI: test.abi, Data: test.data, Topics: test.topics, } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectedErrorCause != nil { require.Equal(t, test.expectedErrorCause, errors.Cause(result.Error)) require.Nil(t, result.Value) if test.expectedErrorContains != "" { require.Contains(t, result.Error.Error(), test.expectedErrorContains) } } else { require.NoError(t, result.Error) require.Equal(t, test.expected, result.Value) } })` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{ "address": common.HexToAddress("0x2fCeA879fDC9FE5e90394faf0CA644a1749d0ad6"), "data": hexutil.MustDecode("0x000000000000000000000000000000000000000000000000000000000000000f"), "topics": []common.Hash{ common.HexToHash("0x0109fc6f55cf40689f02fbaad7af7fe7bbac8a3d2186600afc7d3e10cac60271"), common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000009"), common.HexToHash("0x000000000000000000000000f17f52151ebef6c7334fad080c5704d77216b732"), }, }, })` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToAddress("0x2fCeA879fDC9FE5e90394faf0CA644a1749d0ad6")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.MustDecode("0x000000000000000000000000000000000000000000000000000000000000000f")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToHash("0x0109fc6f55cf40689f02fbaad7af7fe7bbac8a3d2186600afc7d3e10cac60271")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000009")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToHash("0x000000000000000000000000f17f52151ebef6c7334fad080c5704d77216b732")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.NewInt(9)` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToAddress("0xf17f52151ebef6c7334fad080c5704d77216b732")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.NewInt(15)` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{ "address": common.HexToAddress("0x2fCeA879fDC9FE5e90394faf0CA644a1749d0ad6"), "data": hexutil.MustDecode("0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef74686520726571756573742069640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a6e000000000000000000000000cafebabecafebabecafebabecafebabecafebabe61736466000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003039000000000000000000000000000000000000000000000000000000000000d431000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000147374657665746f7368692073657267616d6f746f000000000000000000000000"), "topics": []common.Hash{ common.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65"), common.HexToHash("0x746865206a6f6220696400000000000000000000000000000000000000000000"), }, }, })` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToAddress("0x2fCeA879fDC9FE5e90394faf0CA644a1749d0ad6")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.MustDecode("0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef74686520726571756573742069640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a6e000000000000000000000000cafebabecafebabecafebabecafebabecafebabe61736466000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003039000000000000000000000000000000000000000000000000000000000000d431000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000147374657665746f7368692073657267616d6f746f000000000000000000000000")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToHash("0x746865206a6f6220696400000000000000000000000000000000000000000000")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.Bytes32FromString("the job id")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToAddress("0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.Bytes32FromString("the request id")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.NewInt(133742)` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToAddress("0xCafEBAbECAFEbAbEcaFEbabECAfebAbEcAFEBaBe")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.Bytes4FromString("asdf")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.NewInt(12345)` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.NewInt(54321)` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{ "address": common.HexToAddress("0x2fCeA879fDC9FE5e90394faf0CA644a1749d0ad6"), "data": hexutil.MustDecode("0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef000000000000000000000000cafebabecafebabecafebabecafebabecafebabe"), "topics": []common.Hash{ common.HexToHash("0xe720bc96024900ba647b8faa27766eb59f72cadf3c7ec34a7365c999f78320db"), }, }, })` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToAddress("0x2fCeA879fDC9FE5e90394faf0CA644a1749d0ad6")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.MustDecode("0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef000000000000000000000000cafebabecafebabecafebabecafebabecafebabe")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToHash("0xe720bc96024900ba647b8faa27766eb59f72cadf3c7ec34a7365c999f78320db")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToAddress("0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToAddress("0xCafEBAbECAFEbAbEcaFEbabECAfebAbEcAFEBaBe")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{ "address": common.HexToAddress("0x2fCeA879fDC9FE5e90394faf0CA644a1749d0ad6"), "data": hexutil.MustDecode("0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef74686520726571756573742069640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a6e000000000000000000000000cafebabecafebabecafebabecafebabecafebabe61736466000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003039000000000000000000000000000000000000000000000000000000000000d431000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000147374657665746f7368692073657267616d6f746f000000000000000000000000"), "topics": []common.Hash{ common.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65"), }, }, })` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToAddress("0x2fCeA879fDC9FE5e90394faf0CA644a1749d0ad6")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.MustDecode("0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef74686520726571756573742069640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a6e000000000000000000000000cafebabecafebabecafebabecafebabecafebabe61736466000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003039000000000000000000000000000000000000000000000000000000000000d431000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000147374657665746f7368692073657267616d6f746f000000000000000000000000")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{ "address": common.HexToAddress("0x2fCeA879fDC9FE5e90394faf0CA644a1749d0ad6"), "data": hexutil.MustDecode("0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef74686520726571756573742069640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a6e000000000000000000000000cafebabecafebabecafebabecafebabecafebabe61736466000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003039000000000000000000000000000000000000000000000000000000000000d431000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000147374657665746f7368692073657267616d6f746f000000000000000000000000"), "topics": []common.Hash{ common.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65"), }, }, })` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToAddress("0x2fCeA879fDC9FE5e90394faf0CA644a1749d0ad6")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.MustDecode("0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef74686520726571756573742069640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a6e000000000000000000000000cafebabecafebabecafebabecafebabecafebabe61736466000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003039000000000000000000000000000000000000000000000000000000000000d431000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000147374657665746f7368692073657267616d6f746f000000000000000000000000")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{ "address": common.HexToAddress("0x2fCeA879fDC9FE5e90394faf0CA644a1749d0ad6"), "data": hexutil.MustDecode("0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef74686520726571756573742069640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a6e000000000000000000000000cafebabecafebabecafebabecafebabecafebabe61736466000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003039000000000000000000000000000000000000000000000000000000000000d431000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000147374657665746f7368692073657267616d6f746f000000000000000000000000"), "topics": []common.Hash{ common.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65"), }, }, })` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToAddress("0x2fCeA879fDC9FE5e90394faf0CA644a1749d0ad6")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.MustDecode("0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef74686520726571756573742069640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a6e000000000000000000000000cafebabecafebabecafebabecafebabecafebabe61736466000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003039000000000000000000000000000000000000000000000000000000000000d431000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000147374657665746f7368692073657267616d6f746f000000000000000000000000")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{ "address": common.HexToAddress("0x2fCeA879fDC9FE5e90394faf0CA644a1749d0ad6"), "data": hexutil.MustDecode("0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef74686520726571756573742069640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a6e000000000000000000000000cafebabecafebabecafebabecafebabecafebabe61736466000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003039000000000000000000000000000000000000000000000000000000000000d4310000000000000000000000000000000000000000000000000000"), "topics": []common.Hash{ common.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65"), common.HexToHash("0x746865206a6f6220696400000000000000000000000000000000000000000000"), }, }, })` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToAddress("0x2fCeA879fDC9FE5e90394faf0CA644a1749d0ad6")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.MustDecode("0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef74686520726571756573742069640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a6e000000000000000000000000cafebabecafebabecafebabecafebabecafebabe61736466000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003039000000000000000000000000000000000000000000000000000000000000d4310000000000000000000000000000000000000000000000000000")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToHash("0x746865206a6f6220696400000000000000000000000000000000000000000000")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{ "address": common.HexToAddress("0x2fCeA879fDC9FE5e90394faf0CA644a1749d0ad6"), "data": hexutil.MustDecode("0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef7468652072657175657374206964000000000000000000000000000000000000"), "topics": []common.Hash{ common.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65"), common.HexToHash("0x746865206a6f6220696400000000000000000000000000000000000000000000"), }, }, })` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToAddress("0x2fCeA879fDC9FE5e90394faf0CA644a1749d0ad6")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.MustDecode("0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef7468652072657175657374206964000000000000000000000000000000000000")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToHash("0x746865206a6f6220696400000000000000000000000000000000000000000000")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{ "address": common.HexToAddress("0x2fCeA879fDC9FE5e90394faf0CA644a1749d0ad6"), "data": hexutil.MustDecode("0x000000000000000000000000000000000000000000000000000000000000000f"), "topics": []common.Hash{ common.HexToHash("0x0109fc6f55cf40689f02fbaad7af7fe7bbac8a3d2186600afc7d3e10cac60271"), common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000009"), common.HexToHash("0x000000000000000000000000f17f52151ebef6c7334fad080c5704d77216b732"), }, }, })` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToAddress("0x2fCeA879fDC9FE5e90394faf0CA644a1749d0ad6")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.MustDecode("0x000000000000000000000000000000000000000000000000000000000000000f")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToHash("0x0109fc6f55cf40689f02fbaad7af7fe7bbac8a3d2186600afc7d3e10cac60271")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000009")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.HexToHash("0x000000000000000000000000f17f52151ebef6c7334fad080c5704d77216b732")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.New("uh oh")` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.Run(test.name, func(t *testing.T) { task := pipeline.ETHABIDecodeLogTask{ BaseTask: pipeline.NewBaseTask(0, "decodelog", nil, nil, 0), ABI: test.abi, Data: test.data, Topics: test.topics, } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectedErrorCause != nil { require.Equal(t, test.expectedErrorCause, errors.Cause(result.Error)) require.Nil(t, result.Value) if test.expectedErrorContains != "" { require.Contains(t, result.Error.Error(), test.expectedErrorContains) } } else { require.NoError(t, result.Error) require.Equal(t, test.expected, result.Value) } })` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.NewBaseTask(0, "decodelog", nil, nil, 0)` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs)` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.Context(t)` $DIR/core/services/pipeline/task.eth_abi_decode_log_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.eth_abi_decode_test.go: `t.Run(test.name, func(t *testing.T) { task := ETHABIDecodeTask{ BaseTask: NewBaseTask(0, "decode", nil, nil, 0), ABI: test.abi, Data: test.data, } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectedErrorCause != nil { require.Equal(t, test.expectedErrorCause, errors.Cause(result.Error)) require.Nil(t, result.Value) if test.expectedErrorContains != "" { require.Contains(t, result.Error.Error(), test.expectedErrorContains) } } else { require.NoError(t, result.Error) require.Equal(t, test.expected, result.Value) } })` $DIR/core/services/pipeline/task.eth_abi_decode_test.go: `.Run(test.name, func(t *testing.T) { task := ETHABIDecodeTask{ BaseTask: NewBaseTask(0, "decode", nil, nil, 0), ABI: test.abi, Data: test.data, } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectedErrorCause != nil { require.Equal(t, test.expectedErrorCause, errors.Cause(result.Error)) require.Nil(t, result.Value) if test.expectedErrorContains != "" { require.Contains(t, result.Error.Error(), test.expectedErrorContains) } } else { require.NoError(t, result.Error) require.Equal(t, test.expected, result.Value) } })` $DIR/core/services/pipeline/task.eth_abi_decode_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs)` $DIR/core/services/pipeline/task.eth_abi_decode_test.go: `.Context(t)` $DIR/core/services/pipeline/task.eth_abi_decode_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `copy(bytes32[:], []byte("chainlink chainlink chainlink"))` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `t.Run(test.name, func(t *testing.T) { task := pipeline.ETHABIEncodeTask2{ BaseTask: pipeline.NewBaseTask(0, "encode", nil, nil, 0), ABI: test.abi, Data: test.data, } result, _ := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) if test.expectedErrorCause != nil { require.Equal(t, test.expectedErrorCause, errors.Cause(result.Error)) require.Nil(t, result.Value) if test.expectedErrorContains != "" { require.Contains(t, result.Error.Error(), test.expectedErrorContains) } } else { require.NoError(t, result.Error) require.Equal(t, test.expected, result.Value) } })` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": big.NewInt(123), "bar": true, "baz": big.NewInt(-321), "quux": "foo bar baz", })` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.NewInt(123)` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.NewInt(-321)` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": bytes32, "bar": []byte("stevetoshi sergeymoto"), "baz": common.HexToAddress("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef"), })` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.HexToAddress("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef")` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": []common.Address{ common.HexToAddress("0x6c91b062a774cbe8b9bf52f224c37badf98fc40b"), common.HexToAddress("0xc4f27ead9083c756cc2c02aaa39b223fe8d0a0e5"), common.HexToAddress("0x749e4598819b2b0e915a02120696c7b8fe16c09c"), }, "bar": big.NewInt(8293), "baz": []*big.Int{big.NewInt(192), big.NewInt(4182)}, })` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.HexToAddress("0x6c91b062a774cbe8b9bf52f224c37badf98fc40b")` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.HexToAddress("0xc4f27ead9083c756cc2c02aaa39b223fe8d0a0e5")` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.HexToAddress("0x749e4598819b2b0e915a02120696c7b8fe16c09c")` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.NewInt(8293)` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.NewInt(192)` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.NewInt(4182)` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": [][]bool{{true, false}, {false, true}, {false, false}, {true, true}}, "bar": [][]*big.Int{{big.NewInt(123), big.NewInt(456)}, {big.NewInt(22), big.NewInt(19842)}}, })` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.NewInt(123)` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.NewInt(456)` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.NewInt(22)` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.NewInt(19842)` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": big.NewInt(math.MaxInt64), })` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.NewInt(math.MaxInt64)` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", })` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": bytes32, "bar": []byte("stevetoshi sergeymoto"), "baz": common.HexToAddress("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef"), })` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.HexToAddress("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef")` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.New("uh oh")` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": "0x0000000000000000000000000000000000000000000000000000000000000001", })` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.NewVarsFrom(map[string]interface{}{ "value": map[string]interface{}{ "first": "0x0000000000000000000000000000000000000000000000000000000000000001", "last": true, }, })` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.NewVarsFrom(map[string]interface{}{ "value": []interface{}{ "0x0000000000000000000000000000000000000000000000000000000000000001", true, }, })` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.Run(test.name, func(t *testing.T) { task := pipeline.ETHABIEncodeTask2{ BaseTask: pipeline.NewBaseTask(0, "encode", nil, nil, 0), ABI: test.abi, Data: test.data, } result, _ := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) if test.expectedErrorCause != nil { require.Equal(t, test.expectedErrorCause, errors.Cause(result.Error)) require.Nil(t, result.Value) if test.expectedErrorContains != "" { require.Contains(t, result.Error.Error(), test.expectedErrorContains) } } else { require.NoError(t, result.Error) require.Equal(t, test.expected, result.Value) } })` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.NewBaseTask(0, "encode", nil, nil, 0)` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs)` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.Context(t)` $DIR/core/services/pipeline/task.eth_abi_encode_2_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `copy(bytes32[:], []byte("chainlink chainlink chainlink"))` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `t.Run(test.name, func(t *testing.T) { task := pipeline.ETHABIEncodeTask{ BaseTask: pipeline.NewBaseTask(0, "encode", nil, nil, 0), ABI: test.abi, Data: test.data, } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectedErrorCause != nil { require.Equal(t, test.expectedErrorCause, errors.Cause(result.Error)) require.Nil(t, result.Value) if test.expectedErrorContains != "" { require.Contains(t, result.Error.Error(), test.expectedErrorContains) } } else { require.NoError(t, result.Error) require.Equal(t, test.expected, result.Value) } })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `t.Run(test.name, func(t *testing.T) { task := pipeline.ETHABIEncodeTask{ BaseTask: pipeline.NewBaseTask(0, "encode", nil, nil, 0), ABI: test.abi, Data: test.data, } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectedErrorCause != nil { require.Equal(t, test.expectedErrorCause, errors.Cause(result.Error)) require.Nil(t, result.Value) if test.expectedErrorContains != "" { require.Contains(t, result.Error.Error(), test.expectedErrorContains) } } else { require.NoError(t, result.Error) assert.Equal(t, test.expected, result.Value, fmt.Sprintf("test: %s", test.name)) } })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `t.Run(test.name, func(t *testing.T) { task := pipeline.ETHABIEncodeTask{ BaseTask: pipeline.NewBaseTask(0, "encode", nil, nil, 0), ABI: test.abi, Data: test.data, } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectedErrorCause != nil { require.Equal(t, test.expectedErrorCause, errors.Cause(result.Error)) require.Nil(t, result.Value) if test.expectedErrorContains != "" { require.Contains(t, result.Error.Error(), test.expectedErrorContains) } } else { require.NoError(t, result.Error) assert.Equal(t, test.expected, result.Value, fmt.Sprintf("test: %s", test.name)) } })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.StringToHex(string(bytes32[:]))` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": big.NewInt(123), "bar": true, "baz": big.NewInt(-321), "quux": "foo bar baz", })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewInt(123)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewInt(-321)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": bytes32, "bar": []byte("stevetoshi sergeymoto"), "baz": common.HexToAddress("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef"), })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.HexToAddress("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef")` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": bytes32hex, "bar": []byte("stevetoshi sergeymoto"), "baz": common.HexToAddress("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef"), })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.HexToAddress("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef")` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": []common.Address{ common.HexToAddress("0x6c91b062a774cbe8b9bf52f224c37badf98fc40b"), common.HexToAddress("0xc4f27ead9083c756cc2c02aaa39b223fe8d0a0e5"), common.HexToAddress("0x749e4598819b2b0e915a02120696c7b8fe16c09c"), }, "bar": big.NewInt(8293), "baz": []*big.Int{big.NewInt(192), big.NewInt(4182)}, })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.HexToAddress("0x6c91b062a774cbe8b9bf52f224c37badf98fc40b")` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.HexToAddress("0xc4f27ead9083c756cc2c02aaa39b223fe8d0a0e5")` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.HexToAddress("0x749e4598819b2b0e915a02120696c7b8fe16c09c")` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewInt(8293)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewInt(192)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewInt(4182)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": [][]bool{{true, false}, {false, true}, {false, false}, {true, true}}, "bar": [][]*big.Int{{big.NewInt(123), big.NewInt(456)}, {big.NewInt(22), big.NewInt(19842)}}, })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewInt(123)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewInt(456)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewInt(22)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewInt(19842)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": big.NewInt(math.MaxInt64), })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewInt(math.MaxInt64)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": []interface{}{123, 456, 789}, })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": []interface{}{ []interface{}{123, 456, 789}, }, })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": bytes32, "bar": []byte("stevetoshi sergeymoto"), "baz": common.HexToAddress("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef"), })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.HexToAddress("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef")` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.New("uh oh")` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": "0x0000000000000000000000000000000000000000000000000000000000000001", })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.Run(test.name, func(t *testing.T) { task := pipeline.ETHABIEncodeTask{ BaseTask: pipeline.NewBaseTask(0, "encode", nil, nil, 0), ABI: test.abi, Data: test.data, } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectedErrorCause != nil { require.Equal(t, test.expectedErrorCause, errors.Cause(result.Error)) require.Nil(t, result.Value) if test.expectedErrorContains != "" { require.Contains(t, result.Error.Error(), test.expectedErrorContains) } } else { require.NoError(t, result.Error) require.Equal(t, test.expected, result.Value) } })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewBaseTask(0, "encode", nil, nil, 0)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.Context(t)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": int8(1), })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": uint8(1), })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": int16(1), })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": uint16(1), })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": int32(1), })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": uint32(1), })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": int32(1), })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": uint32(1), })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": int64(1), })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": uint64(1), })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": int64(1), })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": uint64(1), })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": int64(1), })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": uint64(1), })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": int64(1), })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": uint64(1), })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": big.NewInt(1), })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewInt(1)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": big.NewInt(1), })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewInt(1)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": big.NewInt(1), })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewInt(1)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": big.NewInt(1), })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewInt(1)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.Run(test.name, func(t *testing.T) { task := pipeline.ETHABIEncodeTask{ BaseTask: pipeline.NewBaseTask(0, "encode", nil, nil, 0), ABI: test.abi, Data: test.data, } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectedErrorCause != nil { require.Equal(t, test.expectedErrorCause, errors.Cause(result.Error)) require.Nil(t, result.Value) if test.expectedErrorContains != "" { require.Contains(t, result.Error.Error(), test.expectedErrorContains) } } else { require.NoError(t, result.Error) assert.Equal(t, test.expected, result.Value, fmt.Sprintf("test: %s", test.name)) } })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewBaseTask(0, "encode", nil, nil, 0)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.Context(t)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": int16(129), })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": uint16(257), })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.Run(test.name, func(t *testing.T) { task := pipeline.ETHABIEncodeTask{ BaseTask: pipeline.NewBaseTask(0, "encode", nil, nil, 0), ABI: test.abi, Data: test.data, } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectedErrorCause != nil { require.Equal(t, test.expectedErrorCause, errors.Cause(result.Error)) require.Nil(t, result.Value) if test.expectedErrorContains != "" { require.Contains(t, result.Error.Error(), test.expectedErrorContains) } } else { require.NoError(t, result.Error) assert.Equal(t, test.expected, result.Value, fmt.Sprintf("test: %s", test.name)) } })` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.NewBaseTask(0, "encode", nil, nil, 0)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.Context(t)` $DIR/core/services/pipeline/task.eth_abi_encode_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.eth_call_test.go: `testutils.SkipShortDB(t)` $DIR/core/services/pipeline/task.eth_call_test.go: `ethClient. On("CallContract", mock.Anything, ethereum.CallMsg{To: &contractAddr, Gas: uint64(drJobTypeGasLimit), Data: []byte("foo bar")}, (*big.Int)(nil)). Return([]byte("baz quux"), nil)` $DIR/core/services/pipeline/task.eth_call_test.go: `ethClient. On("CallContract", mock.Anything, ethereum.CallMsg{To: &contractAddr, Gas: 100_000, Data: []byte("foo bar")}, (*big.Int)(nil)). Return([]byte("baz quux"), nil)` $DIR/core/services/pipeline/task.eth_call_test.go: `ethClient. On("CallContract", mock.Anything, ethereum.CallMsg{To: &contractAddr, Gas: uint64(specGasLimit), Data: []byte("foo bar")}, (*big.Int)(nil)). Return([]byte("baz quux"), nil)` $DIR/core/services/pipeline/task.eth_call_test.go: `ethClient. On("CallContract", mock.Anything, ethereum.CallMsg{To: &contractAddr, Gas: uint64(drJobTypeGasLimit), From: fromAddr, Data: []byte("foo bar")}, (*big.Int)(nil)). Return([]byte("baz quux"), nil)` $DIR/core/services/pipeline/task.eth_call_test.go: `ethClient. On("CallContract", mock.Anything, ethereum.CallMsg{To: &contractAddr, Data: []byte("foo bar")}, (*big.Int)(nil)). Return([]byte("baz quux"), nil).Maybe()` $DIR/core/services/pipeline/task.eth_call_test.go: `ethClient. On("CallContract", mock.Anything, ethereum.CallMsg{To: &contractAddr, Gas: uint64(drJobTypeGasLimit), Data: []byte("foo bar")}, (*big.Int)(nil)). Return([]byte("baz quux"), nil)` $DIR/core/services/pipeline/task.eth_call_test.go: `ethClient. On("PendingCallContract", mock.Anything, ethereum.CallMsg{To: &contractAddr, Gas: uint64(drJobTypeGasLimit), Data: []byte("foo bar")}). Return([]byte("baz quux"), nil)` $DIR/core/services/pipeline/task.eth_call_test.go: `t.Run(test.name, func(t *testing.T) { task := pipeline.ETHCallTask{ BaseTask: pipeline.NewBaseTask(0, "ethcall", nil, nil, 0), Contract: test.contract, From: test.from, Data: test.data, EVMChainID: test.evmChainID, Gas: test.gas, Block: test.block, } ethClient := evmclimocks.NewClient(t) config := pipelinemocks.NewConfig(t) test.setupClientMocks(ethClient, config) cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.LimitDefault = ptr(gasLimit) c.EVM[0].GasEstimator.LimitJobType.DR = ptr(drJobTypeGasLimit) }) lggr := logger.TestLogger(t) keyStore := keystoremocks.NewEth(t) txManager := txmmocks.NewMockEvmTxManager(t) db := pgtest.NewSqlxDB(t) var legacyChains legacyevm.LegacyChainContainer if test.expectedErrorCause != nil || test.expectedErrorContains != "" { exts := evmtest.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, GeneralConfig: cfg, TxManager: txManager, KeyStore: keyStore}) legacyChains = evmrelay.NewLegacyChainsFromRelayerExtenders(exts) } else { legacyChains = cltest.NewLegacyChainsWithMockChain(t, ethClient, cfg) } task.HelperSetDependencies(legacyChains, cfg.JobPipeline(), test.specGasLimit, pipeline.DirectRequestJobType) result, runInfo := task.Run(testutils.Context(t), lggr, test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectedErrorCause != nil || test.expectedErrorContains != "" { require.Nil(t, result.Value) if test.expectedErrorCause != nil { require.Equal(t, test.expectedErrorCause, errors.Cause(result.Error)) } if test.expectedErrorContains != "" { require.Contains(t, result.Error.Error(), test.expectedErrorContains) } } else { require.NoError(t, result.Error) require.Equal(t, test.expected, result.Value) } })` $DIR/core/services/pipeline/task.eth_call_test.go: `test.setupClientMocks(ethClient, config)` $DIR/core/services/pipeline/task.eth_call_test.go: `c.EVM[0].GasEstimator.LimitDefault = ptr(gasLimit)` $DIR/core/services/pipeline/task.eth_call_test.go: `c.EVM[0].GasEstimator.LimitJobType.DR = ptr(drJobTypeGasLimit)` $DIR/core/services/pipeline/task.eth_call_test.go: `legacyChains = evmrelay.NewLegacyChainsFromRelayerExtenders(exts)` $DIR/core/services/pipeline/task.eth_call_test.go: `legacyChains = cltest.NewLegacyChainsWithMockChain(t, ethClient, cfg)` $DIR/core/services/pipeline/task.eth_call_test.go: `task.HelperSetDependencies(legacyChains, cfg.JobPipeline(), test.specGasLimit, pipeline.DirectRequestJobType)` $DIR/core/services/pipeline/task.eth_call_test.go: `.SkipShortDB(t)` $DIR/core/services/pipeline/task.eth_call_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": []byte("foo bar"), })` $DIR/core/services/pipeline/task.eth_call_test.go: `.HexToAddress("0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF")` $DIR/core/services/pipeline/task.eth_call_test.go: `. On("CallContract", mock.Anything, ethereum.CallMsg{To: &contractAddr, Gas: uint64(drJobTypeGasLimit), Data: []byte("foo bar")}, (*big.Int)(nil))` $DIR/core/services/pipeline/task.eth_call_test.go: `. Return([]byte("baz quux"), nil)` $DIR/core/services/pipeline/task.eth_call_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": []byte("foo bar"), "gasLimit": 100_000, })` $DIR/core/services/pipeline/task.eth_call_test.go: `.HexToAddress("0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF")` $DIR/core/services/pipeline/task.eth_call_test.go: `. On("CallContract", mock.Anything, ethereum.CallMsg{To: &contractAddr, Gas: 100_000, Data: []byte("foo bar")}, (*big.Int)(nil))` $DIR/core/services/pipeline/task.eth_call_test.go: `. Return([]byte("baz quux"), nil)` $DIR/core/services/pipeline/task.eth_call_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": []byte("foo bar"), })` $DIR/core/services/pipeline/task.eth_call_test.go: `.HexToAddress("0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF")` $DIR/core/services/pipeline/task.eth_call_test.go: `. On("CallContract", mock.Anything, ethereum.CallMsg{To: &contractAddr, Gas: uint64(specGasLimit), Data: []byte("foo bar")}, (*big.Int)(nil))` $DIR/core/services/pipeline/task.eth_call_test.go: `. Return([]byte("baz quux"), nil)` $DIR/core/services/pipeline/task.eth_call_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": []byte("foo bar"), })` $DIR/core/services/pipeline/task.eth_call_test.go: `.HexToAddress("0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF")` $DIR/core/services/pipeline/task.eth_call_test.go: `.HexToAddress("0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF")` $DIR/core/services/pipeline/task.eth_call_test.go: `. On("CallContract", mock.Anything, ethereum.CallMsg{To: &contractAddr, Gas: uint64(drJobTypeGasLimit), From: fromAddr, Data: []byte("foo bar")}, (*big.Int)(nil))` $DIR/core/services/pipeline/task.eth_call_test.go: `. Return([]byte("baz quux"), nil)` $DIR/core/services/pipeline/task.eth_call_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": []byte("foo bar"), })` $DIR/core/services/pipeline/task.eth_call_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": []byte("foo bar"), })` $DIR/core/services/pipeline/task.eth_call_test.go: `.NewVarsFrom(map[string]interface{}{ "zork": []byte("foo bar"), })` $DIR/core/services/pipeline/task.eth_call_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": []byte(nil), })` $DIR/core/services/pipeline/task.eth_call_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": []byte("foo bar"), })` $DIR/core/services/pipeline/task.eth_call_test.go: `.New("uh oh")` $DIR/core/services/pipeline/task.eth_call_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": []byte("foo bar"), "evmChainID": "123", })` $DIR/core/services/pipeline/task.eth_call_test.go: `.HexToAddress("0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF")` $DIR/core/services/pipeline/task.eth_call_test.go: `. On("CallContract", mock.Anything, ethereum.CallMsg{To: &contractAddr, Data: []byte("foo bar")}, (*big.Int)(nil))` $DIR/core/services/pipeline/task.eth_call_test.go: `. Return([]byte("baz quux"), nil)` $DIR/core/services/pipeline/task.eth_call_test.go: `.Maybe()` $DIR/core/services/pipeline/task.eth_call_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": []byte("foo bar"), })` $DIR/core/services/pipeline/task.eth_call_test.go: `.HexToAddress("0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF")` $DIR/core/services/pipeline/task.eth_call_test.go: `. On("CallContract", mock.Anything, ethereum.CallMsg{To: &contractAddr, Gas: uint64(drJobTypeGasLimit), Data: []byte("foo bar")}, (*big.Int)(nil))` $DIR/core/services/pipeline/task.eth_call_test.go: `. Return([]byte("baz quux"), nil)` $DIR/core/services/pipeline/task.eth_call_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": []byte("foo bar"), })` $DIR/core/services/pipeline/task.eth_call_test.go: `.HexToAddress("0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF")` $DIR/core/services/pipeline/task.eth_call_test.go: `. On("PendingCallContract", mock.Anything, ethereum.CallMsg{To: &contractAddr, Gas: uint64(drJobTypeGasLimit), Data: []byte("foo bar")})` $DIR/core/services/pipeline/task.eth_call_test.go: `. Return([]byte("baz quux"), nil)` $DIR/core/services/pipeline/task.eth_call_test.go: `.Run(test.name, func(t *testing.T) { task := pipeline.ETHCallTask{ BaseTask: pipeline.NewBaseTask(0, "ethcall", nil, nil, 0), Contract: test.contract, From: test.from, Data: test.data, EVMChainID: test.evmChainID, Gas: test.gas, Block: test.block, } ethClient := evmclimocks.NewClient(t) config := pipelinemocks.NewConfig(t) test.setupClientMocks(ethClient, config) cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.LimitDefault = ptr(gasLimit) c.EVM[0].GasEstimator.LimitJobType.DR = ptr(drJobTypeGasLimit) }) lggr := logger.TestLogger(t) keyStore := keystoremocks.NewEth(t) txManager := txmmocks.NewMockEvmTxManager(t) db := pgtest.NewSqlxDB(t) var legacyChains legacyevm.LegacyChainContainer if test.expectedErrorCause != nil || test.expectedErrorContains != "" { exts := evmtest.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, GeneralConfig: cfg, TxManager: txManager, KeyStore: keyStore}) legacyChains = evmrelay.NewLegacyChainsFromRelayerExtenders(exts) } else { legacyChains = cltest.NewLegacyChainsWithMockChain(t, ethClient, cfg) } task.HelperSetDependencies(legacyChains, cfg.JobPipeline(), test.specGasLimit, pipeline.DirectRequestJobType) result, runInfo := task.Run(testutils.Context(t), lggr, test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectedErrorCause != nil || test.expectedErrorContains != "" { require.Nil(t, result.Value) if test.expectedErrorCause != nil { require.Equal(t, test.expectedErrorCause, errors.Cause(result.Error)) } if test.expectedErrorContains != "" { require.Contains(t, result.Error.Error(), test.expectedErrorContains) } } else { require.NoError(t, result.Error) require.Equal(t, test.expected, result.Value) } })` $DIR/core/services/pipeline/task.eth_call_test.go: `.NewBaseTask(0, "ethcall", nil, nil, 0)` $DIR/core/services/pipeline/task.eth_call_test.go: `.NewClient(t)` $DIR/core/services/pipeline/task.eth_call_test.go: `.NewConfig(t)` $DIR/core/services/pipeline/task.eth_call_test.go: `.setupClientMocks(ethClient, config)` $DIR/core/services/pipeline/task.eth_call_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.LimitDefault = ptr(gasLimit) c.EVM[0].GasEstimator.LimitJobType.DR = ptr(drJobTypeGasLimit) })` $DIR/core/services/pipeline/task.eth_call_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.eth_call_test.go: `.NewEth(t)` $DIR/core/services/pipeline/task.eth_call_test.go: `.NewMockEvmTxManager(t)` $DIR/core/services/pipeline/task.eth_call_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/task.eth_call_test.go: `.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, GeneralConfig: cfg, TxManager: txManager, KeyStore: keyStore})` $DIR/core/services/pipeline/task.eth_call_test.go: `.NewLegacyChainsFromRelayerExtenders(exts)` $DIR/core/services/pipeline/task.eth_call_test.go: `.NewLegacyChainsWithMockChain(t, ethClient, cfg)` $DIR/core/services/pipeline/task.eth_call_test.go: `.HelperSetDependencies(legacyChains, cfg.JobPipeline(), test.specGasLimit, pipeline.DirectRequestJobType)` $DIR/core/services/pipeline/task.eth_call_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.eth_call_test.go: `.Run(testutils.Context(t), lggr, test.vars, test.inputs)` $DIR/core/services/pipeline/task.eth_call_test.go: `.Context(t)` $DIR/core/services/pipeline/task.eth_tx_test.go: `keyStore.On("GetRoundRobinAddress", mock.Anything, testutils.FixtureChainID, from).Return(from, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `txManager.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ FromAddress: from, ToAddress: to, EncodedPayload: data, FeeLimit: gasLimit, Meta: txMeta, Strategy: txmgrcommon.NewSendEveryStrategy(), Checker: txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeVRFV2, VRFCoordinatorAddress: &addr, }, SignalCallback: true, }).Return(txmgr.Tx{}, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `keyStore.On("GetRoundRobinAddress", mock.Anything, testutils.FixtureChainID, from).Return(from, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `txManager.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ FromAddress: from, ToAddress: to, EncodedPayload: data, FeeLimit: gasLimit, Meta: txMeta, Strategy: txmgrcommon.NewSendEveryStrategy(), SignalCallback: true, }).Return(txmgr.Tx{}, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `keyStore.On("GetRoundRobinAddress", mock.Anything, testutils.FixtureChainID, addr).Return(addr, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `txManager.On("CreateTransaction", mock.Anything, mock.MatchedBy(func(tx txmgr.TxRequest) bool { return tx.MinConfirmations == clnull.Uint32From(2) })).Return(txmgr.Tx{}, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `keyStore.On("GetRoundRobinAddress", mock.Anything, testutils.FixtureChainID, from).Return(from, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `txManager.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ FromAddress: from, ToAddress: to, EncodedPayload: data, FeeLimit: gasLimit, Meta: txMeta, Strategy: txmgrcommon.NewSendEveryStrategy(), SignalCallback: true, }).Return(txmgr.Tx{}, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `keyStore.On("GetRoundRobinAddress", mock.Anything, testutils.FixtureChainID).Return(from, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `txManager.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ FromAddress: from, ToAddress: to, EncodedPayload: data, FeeLimit: gasLimit, Meta: txMeta, Strategy: txmgrcommon.NewSendEveryStrategy(), SignalCallback: true, }).Return(txmgr.Tx{}, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `keyStore.On("GetRoundRobinAddress", mock.Anything, testutils.FixtureChainID, from).Return(from, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `txManager.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ FromAddress: from, ToAddress: to, EncodedPayload: data, FeeLimit: gasLimit, Meta: txMeta, Strategy: txmgrcommon.NewSendEveryStrategy(), SignalCallback: true, }).Return(txmgr.Tx{}, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `keyStore.On("GetRoundRobinAddress", mock.Anything, testutils.FixtureChainID, from).Return(from, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `txManager.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ FromAddress: from, ToAddress: to, EncodedPayload: data, FeeLimit: uint64(drJobTypeGasLimit), Meta: txMeta, Strategy: txmgrcommon.NewSendEveryStrategy(), SignalCallback: true, }).Return(txmgr.Tx{}, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `keyStore.On("GetRoundRobinAddress", mock.Anything, testutils.FixtureChainID, from).Return(from, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `txManager.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ FromAddress: from, ToAddress: to, EncodedPayload: data, FeeLimit: uint64(specGasLimit), Meta: txMeta, Strategy: txmgrcommon.NewSendEveryStrategy(), SignalCallback: true, }).Return(txmgr.Tx{}, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `keyStore.On("GetRoundRobinAddress", mock.Anything, testutils.FixtureChainID).Return(nil, errors.New("uh oh"))` $DIR/core/services/pipeline/task.eth_tx_test.go: `keyStore.On("GetRoundRobinAddress", mock.Anything, testutils.FixtureChainID, from).Return(from, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `txManager.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ FromAddress: from, ToAddress: to, EncodedPayload: data, FeeLimit: gasLimit, Meta: txMeta, Strategy: txmgrcommon.NewSendEveryStrategy(), SignalCallback: true, }).Return(txmgr.Tx{}, errors.New("uh oh"))` $DIR/core/services/pipeline/task.eth_tx_test.go: `keyStore.On("GetRoundRobinAddress", mock.Anything, testutils.FixtureChainID, from).Return(from, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `txManager.On("CreateTransaction", mock.Anything, mock.MatchedBy(func(tx txmgr.TxRequest) bool { return tx.MinConfirmations == clnull.Uint32From(3) && tx.PipelineTaskRunID != nil })).Return(txmgr.Tx{}, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `t.Run(test.name, func(t *testing.T) { t.Parallel() task := pipeline.ETHTxTask{ BaseTask: pipeline.NewBaseTask(0, "ethtx", nil, nil, 0), From: test.from, To: test.to, Data: test.data, GasLimit: test.gasLimit, TxMeta: test.txMeta, MinConfirmations: test.minConfirmations, EVMChainID: test.evmChainID, TransmitChecker: test.transmitChecker, } keyStore := keystoremocks.NewEth(t) txManager := txmmocks.NewMockEvmTxManager(t) db := pgtest.NewSqlxDB(t) cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.LimitDefault = ptr(defaultGasLimit) c.EVM[0].GasEstimator.LimitJobType.DR = ptr(drJobTypeGasLimit) }) lggr := logger.TestLogger(t) relayExtenders := evmtest.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, GeneralConfig: cfg, TxManager: txManager, KeyStore: keyStore}) legacyChains := evmrelay.NewLegacyChainsFromRelayerExtenders(relayExtenders) test.setupClientMocks(keyStore, txManager) task.HelperSetDependencies(legacyChains, keyStore, test.specGasLimit, pipeline.DirectRequestJobType) result, runInfo := task.Run(testutils.Context(t), lggr, test.vars, test.inputs) assert.Equal(t, test.expectedRunInfo, runInfo) if test.expectedErrorCause != nil || test.expectedErrorContains != "" { require.Nil(t, result.Value) if test.expectedErrorCause != nil { require.Equal(t, test.expectedErrorCause, errors.Cause(result.Error)) } if test.expectedErrorContains != "" { require.Contains(t, result.Error.Error(), test.expectedErrorContains) } } else { require.NoError(t, result.Error) require.Equal(t, test.expected, result.Value) } })` $DIR/core/services/pipeline/task.eth_tx_test.go: `c.EVM[0].GasEstimator.LimitDefault = ptr(defaultGasLimit)` $DIR/core/services/pipeline/task.eth_tx_test.go: `c.EVM[0].GasEstimator.LimitJobType.DR = ptr(drJobTypeGasLimit)` $DIR/core/services/pipeline/task.eth_tx_test.go: `test.setupClientMocks(keyStore, txManager)` $DIR/core/services/pipeline/task.eth_tx_test.go: `task.HelperSetDependencies(legacyChains, keyStore, test.specGasLimit, pipeline.DirectRequestJobType)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToHash("0x5198616554d738d9485d1a7cf53b2f33e09c3bbc8fe9ac0020bd672cd2bc15d2")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToHash("0xc524fafafcaec40652b1f84fca09c231185437d008d195fccf2f51e64b7062f8")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToAddress("0x882969652440ccf14a5dbb9bd53eb21cb1e11e5c")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToAddress("0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToAddress("0x2E396ecbc8223Ebc16EC45136228AE5EDB649943")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.BoolFrom(false)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.On("GetRoundRobinAddress", mock.Anything, testutils.FixtureChainID, from)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.Return(from, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ FromAddress: from, ToAddress: to, EncodedPayload: data, FeeLimit: gasLimit, Meta: txMeta, Strategy: txmgrcommon.NewSendEveryStrategy(), Checker: txmgr.TransmitCheckerSpec{ CheckerType: txmgr.TransmitCheckerTypeVRFV2, VRFCoordinatorAddress: &addr, }, SignalCallback: true, })` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewSendEveryStrategy()` $DIR/core/services/pipeline/task.eth_tx_test.go: `.Return(txmgr.Tx{}, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewVarsFrom(map[string]interface{}{ "fromAddr": common.HexToAddress("0x882969652440ccf14a5dbb9bd53eb21cb1e11e5c"), "toAddr": common.HexToAddress("0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF"), "data": []byte("foobar"), "gasLimit": uint64(12345), "jobID": int32(321), "requestID": common.HexToHash("0x5198616554d738d9485d1a7cf53b2f33e09c3bbc8fe9ac0020bd672cd2bc15d2"), "requestTxHash": common.HexToHash("0xc524fafafcaec40652b1f84fca09c231185437d008d195fccf2f51e64b7062f8"), })` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToAddress("0x882969652440ccf14a5dbb9bd53eb21cb1e11e5c")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToAddress("0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToHash("0x5198616554d738d9485d1a7cf53b2f33e09c3bbc8fe9ac0020bd672cd2bc15d2")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToHash("0xc524fafafcaec40652b1f84fca09c231185437d008d195fccf2f51e64b7062f8")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.BoolFrom(false)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.On("GetRoundRobinAddress", mock.Anything, testutils.FixtureChainID, from)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.Return(from, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ FromAddress: from, ToAddress: to, EncodedPayload: data, FeeLimit: gasLimit, Meta: txMeta, Strategy: txmgrcommon.NewSendEveryStrategy(), SignalCallback: true, })` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewSendEveryStrategy()` $DIR/core/services/pipeline/task.eth_tx_test.go: `.Return(txmgr.Tx{}, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewVarsFrom(map[string]interface{}{ "fromAddr": common.HexToAddress("0x882969652440ccf14a5dbb9bd53eb21cb1e11e5c"), "toAddr": common.HexToAddress("0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF"), "data": []byte("foobar"), "gasLimit": uint64(12345), "minConfirmations": uint64(2), "jobID": int32(321), "requestID": common.HexToHash("0x5198616554d738d9485d1a7cf53b2f33e09c3bbc8fe9ac0020bd672cd2bc15d2"), "requestTxHash": common.HexToHash("0xc524fafafcaec40652b1f84fca09c231185437d008d195fccf2f51e64b7062f8"), })` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToAddress("0x882969652440ccf14a5dbb9bd53eb21cb1e11e5c")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToAddress("0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToHash("0x5198616554d738d9485d1a7cf53b2f33e09c3bbc8fe9ac0020bd672cd2bc15d2")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToHash("0xc524fafafcaec40652b1f84fca09c231185437d008d195fccf2f51e64b7062f8")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToAddress("0x882969652440ccf14a5dbb9bd53eb21cb1e11e5c")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.On("GetRoundRobinAddress", mock.Anything, testutils.FixtureChainID, addr)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.Return(addr, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.On("CreateTransaction", mock.Anything, mock.MatchedBy(func(tx txmgr.TxRequest) bool { return tx.MinConfirmations == clnull.Uint32From(2) }))` $DIR/core/services/pipeline/task.eth_tx_test.go: `.MatchedBy(func(tx txmgr.TxRequest) bool { return tx.MinConfirmations == clnull.Uint32From(2) })` $DIR/core/services/pipeline/task.eth_tx_test.go: `.Uint32From(2)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.Return(txmgr.Tx{}, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewVarsFrom(map[string]interface{}{ "fromAddrs": []common.Address{common.HexToAddress("0x882969652440ccf14a5dbb9bd53eb21cb1e11e5c")}, "toAddr": "0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF", "data": []byte("foobar"), "gasLimit": uint32(12345), "requestData": map[string]interface{}{ "jobID": int32(321), "requestID": common.HexToHash("0x5198616554d738d9485d1a7cf53b2f33e09c3bbc8fe9ac0020bd672cd2bc15d2"), "requestTxHash": common.HexToHash("0xc524fafafcaec40652b1f84fca09c231185437d008d195fccf2f51e64b7062f8"), }, })` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToAddress("0x882969652440ccf14a5dbb9bd53eb21cb1e11e5c")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToHash("0x5198616554d738d9485d1a7cf53b2f33e09c3bbc8fe9ac0020bd672cd2bc15d2")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToHash("0xc524fafafcaec40652b1f84fca09c231185437d008d195fccf2f51e64b7062f8")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.BoolFrom(false)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.On("GetRoundRobinAddress", mock.Anything, testutils.FixtureChainID, from)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.Return(from, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ FromAddress: from, ToAddress: to, EncodedPayload: data, FeeLimit: gasLimit, Meta: txMeta, Strategy: txmgrcommon.NewSendEveryStrategy(), SignalCallback: true, })` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewSendEveryStrategy()` $DIR/core/services/pipeline/task.eth_tx_test.go: `.Return(txmgr.Tx{}, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewVarsFrom(map[string]interface{}{ "fromAddrs": []common.Address{common.HexToAddress("0x882969652440ccf14a5dbb9bd53eb21cb1e11e5c")}, "toAddr": common.HexToAddress("0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF"), "data": []byte("foobar"), "gasLimit": uint32(12345), "requestData": map[string]interface{}{ "jobID": int32(321), "requestID": common.HexToHash("0x5198616554d738d9485d1a7cf53b2f33e09c3bbc8fe9ac0020bd672cd2bc15d2"), "requestTxHash": common.HexToHash("0xc524fafafcaec40652b1f84fca09c231185437d008d195fccf2f51e64b7062f8"), }, })` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToAddress("0x882969652440ccf14a5dbb9bd53eb21cb1e11e5c")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToAddress("0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToHash("0x5198616554d738d9485d1a7cf53b2f33e09c3bbc8fe9ac0020bd672cd2bc15d2")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToHash("0xc524fafafcaec40652b1f84fca09c231185437d008d195fccf2f51e64b7062f8")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.BoolFrom(false)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.On("GetRoundRobinAddress", mock.Anything, testutils.FixtureChainID)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.Return(from, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ FromAddress: from, ToAddress: to, EncodedPayload: data, FeeLimit: gasLimit, Meta: txMeta, Strategy: txmgrcommon.NewSendEveryStrategy(), SignalCallback: true, })` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewSendEveryStrategy()` $DIR/core/services/pipeline/task.eth_tx_test.go: `.Return(txmgr.Tx{}, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.BoolFrom(false)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.On("GetRoundRobinAddress", mock.Anything, testutils.FixtureChainID, from)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.Return(from, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ FromAddress: from, ToAddress: to, EncodedPayload: data, FeeLimit: gasLimit, Meta: txMeta, Strategy: txmgrcommon.NewSendEveryStrategy(), SignalCallback: true, })` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewSendEveryStrategy()` $DIR/core/services/pipeline/task.eth_tx_test.go: `.Return(txmgr.Tx{}, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.BoolFrom(false)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.On("GetRoundRobinAddress", mock.Anything, testutils.FixtureChainID, from)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.Return(from, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ FromAddress: from, ToAddress: to, EncodedPayload: data, FeeLimit: uint64(drJobTypeGasLimit), Meta: txMeta, Strategy: txmgrcommon.NewSendEveryStrategy(), SignalCallback: true, })` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewSendEveryStrategy()` $DIR/core/services/pipeline/task.eth_tx_test.go: `.Return(txmgr.Tx{}, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.BoolFrom(false)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.On("GetRoundRobinAddress", mock.Anything, testutils.FixtureChainID, from)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.Return(from, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ FromAddress: from, ToAddress: to, EncodedPayload: data, FeeLimit: uint64(specGasLimit), Meta: txMeta, Strategy: txmgrcommon.NewSendEveryStrategy(), SignalCallback: true, })` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewSendEveryStrategy()` $DIR/core/services/pipeline/task.eth_tx_test.go: `.Return(txmgr.Tx{}, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewVarsFrom(map[string]interface{}{ "fromAddrs": []common.Address{common.HexToAddress("0x882969652440ccf14a5dbb9bd53eb21cb1e11e5c")}, "toAddr": common.HexToAddress("0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF"), "data": []byte("foobar"), "gasLimit": uint32(12345), "requestData": map[string]interface{}{ "jobID": int32(321), "requestID": common.HexToHash("0x5198616554d738d9485d1a7cf53b2f33e09c3bbc8fe9ac0020bd672cd2bc15d2"), "requestTxHash": common.HexToHash("0xc524fafafcaec40652b1f84fca09c231185437d008d195fccf2f51e64b7062f8"), }, })` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToAddress("0x882969652440ccf14a5dbb9bd53eb21cb1e11e5c")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToAddress("0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToHash("0x5198616554d738d9485d1a7cf53b2f33e09c3bbc8fe9ac0020bd672cd2bc15d2")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToHash("0xc524fafafcaec40652b1f84fca09c231185437d008d195fccf2f51e64b7062f8")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.On("GetRoundRobinAddress", mock.Anything, testutils.FixtureChainID)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.Return(nil, errors.New("uh oh"))` $DIR/core/services/pipeline/task.eth_tx_test.go: `.New("uh oh")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.BoolFrom(false)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.On("GetRoundRobinAddress", mock.Anything, testutils.FixtureChainID, from)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.Return(from, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ FromAddress: from, ToAddress: to, EncodedPayload: data, FeeLimit: gasLimit, Meta: txMeta, Strategy: txmgrcommon.NewSendEveryStrategy(), SignalCallback: true, })` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewSendEveryStrategy()` $DIR/core/services/pipeline/task.eth_tx_test.go: `.Return(txmgr.Tx{}, errors.New("uh oh"))` $DIR/core/services/pipeline/task.eth_tx_test.go: `.New("uh oh")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.New("uh oh")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToAddress("0x882969652440ccf14a5dbb9bd53eb21cb1e11e5c")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.On("GetRoundRobinAddress", mock.Anything, testutils.FixtureChainID, from)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.Return(from, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.On("CreateTransaction", mock.Anything, mock.MatchedBy(func(tx txmgr.TxRequest) bool { return tx.MinConfirmations == clnull.Uint32From(3) && tx.PipelineTaskRunID != nil }))` $DIR/core/services/pipeline/task.eth_tx_test.go: `.MatchedBy(func(tx txmgr.TxRequest) bool { return tx.MinConfirmations == clnull.Uint32From(3) && tx.PipelineTaskRunID != nil })` $DIR/core/services/pipeline/task.eth_tx_test.go: `.Uint32From(3)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.Return(txmgr.Tx{}, nil)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewVarsFrom(map[string]interface{}{ "fromAddr": common.HexToAddress("0x882969652440ccf14a5dbb9bd53eb21cb1e11e5c"), "toAddr": common.HexToAddress("0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF"), "data": []byte("foobar"), "gasLimit": uint32(12345), "jobID": int32(321), "requestID": common.HexToHash("0x5198616554d738d9485d1a7cf53b2f33e09c3bbc8fe9ac0020bd672cd2bc15d2"), "requestTxHash": common.HexToHash("0xc524fafafcaec40652b1f84fca09c231185437d008d195fccf2f51e64b7062f8"), "evmChainID": "123", })` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToAddress("0x882969652440ccf14a5dbb9bd53eb21cb1e11e5c")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToAddress("0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToHash("0x5198616554d738d9485d1a7cf53b2f33e09c3bbc8fe9ac0020bd672cd2bc15d2")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HexToHash("0xc524fafafcaec40652b1f84fca09c231185437d008d195fccf2f51e64b7062f8")` $DIR/core/services/pipeline/task.eth_tx_test.go: `.Run(test.name, func(t *testing.T) { t.Parallel() task := pipeline.ETHTxTask{ BaseTask: pipeline.NewBaseTask(0, "ethtx", nil, nil, 0), From: test.from, To: test.to, Data: test.data, GasLimit: test.gasLimit, TxMeta: test.txMeta, MinConfirmations: test.minConfirmations, EVMChainID: test.evmChainID, TransmitChecker: test.transmitChecker, } keyStore := keystoremocks.NewEth(t) txManager := txmmocks.NewMockEvmTxManager(t) db := pgtest.NewSqlxDB(t) cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.LimitDefault = ptr(defaultGasLimit) c.EVM[0].GasEstimator.LimitJobType.DR = ptr(drJobTypeGasLimit) }) lggr := logger.TestLogger(t) relayExtenders := evmtest.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, GeneralConfig: cfg, TxManager: txManager, KeyStore: keyStore}) legacyChains := evmrelay.NewLegacyChainsFromRelayerExtenders(relayExtenders) test.setupClientMocks(keyStore, txManager) task.HelperSetDependencies(legacyChains, keyStore, test.specGasLimit, pipeline.DirectRequestJobType) result, runInfo := task.Run(testutils.Context(t), lggr, test.vars, test.inputs) assert.Equal(t, test.expectedRunInfo, runInfo) if test.expectedErrorCause != nil || test.expectedErrorContains != "" { require.Nil(t, result.Value) if test.expectedErrorCause != nil { require.Equal(t, test.expectedErrorCause, errors.Cause(result.Error)) } if test.expectedErrorContains != "" { require.Contains(t, result.Error.Error(), test.expectedErrorContains) } } else { require.NoError(t, result.Error) require.Equal(t, test.expected, result.Value) } })` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewBaseTask(0, "ethtx", nil, nil, 0)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewEth(t)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewMockEvmTxManager(t)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.LimitDefault = ptr(defaultGasLimit) c.EVM[0].GasEstimator.LimitJobType.DR = ptr(drJobTypeGasLimit) })` $DIR/core/services/pipeline/task.eth_tx_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewChainRelayExtenders(t, evmtest.TestChainOpts{DB: db, GeneralConfig: cfg, TxManager: txManager, KeyStore: keyStore})` $DIR/core/services/pipeline/task.eth_tx_test.go: `.NewLegacyChainsFromRelayerExtenders(relayExtenders)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.setupClientMocks(keyStore, txManager)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.HelperSetDependencies(legacyChains, keyStore, test.specGasLimit, pipeline.DirectRequestJobType)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.Run(testutils.Context(t), lggr, test.vars, test.inputs)` $DIR/core/services/pipeline/task.eth_tx_test.go: `.Context(t)` $DIR/core/services/pipeline/task.hexdecode_test.go: `t.Run(test.name, func(t *testing.T) { t.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.HexDecodeTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) }) t.Run("without vars through input param", func(t *testing.T) { inputStr := fmt.Sprintf("%v", test.input) if inputStr == "" { // empty input parameter is indistinguishable from not providing it at all // in that case the task will use an input defined by the job DAG return } vars := pipeline.NewVarsFrom(nil) task := pipeline.HexDecodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: inputStr, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.HexDecodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) })` $DIR/core/services/pipeline/task.hexdecode_test.go: `t.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.HexDecodeTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) })` $DIR/core/services/pipeline/task.hexdecode_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}}))` $DIR/core/services/pipeline/task.hexdecode_test.go: `t.Run("without vars through input param", func(t *testing.T) { inputStr := fmt.Sprintf("%v", test.input) if inputStr == "" { // empty input parameter is indistinguishable from not providing it at all // in that case the task will use an input defined by the job DAG return } vars := pipeline.NewVarsFrom(nil) task := pipeline.HexDecodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: inputStr, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.hexdecode_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{}))` $DIR/core/services/pipeline/task.hexdecode_test.go: `t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.HexDecodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.hexdecode_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{}))` $DIR/core/services/pipeline/task.hexdecode_test.go: `.Run(test.name, func(t *testing.T) { t.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.HexDecodeTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) }) t.Run("without vars through input param", func(t *testing.T) { inputStr := fmt.Sprintf("%v", test.input) if inputStr == "" { // empty input parameter is indistinguishable from not providing it at all // in that case the task will use an input defined by the job DAG return } vars := pipeline.NewVarsFrom(nil) task := pipeline.HexDecodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: inputStr, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.HexDecodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) })` $DIR/core/services/pipeline/task.hexdecode_test.go: `.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.HexDecodeTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) })` $DIR/core/services/pipeline/task.hexdecode_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.hexdecode_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.hexdecode_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})` $DIR/core/services/pipeline/task.hexdecode_test.go: `.Context(t)` $DIR/core/services/pipeline/task.hexdecode_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.hexdecode_test.go: `.Run("without vars through input param", func(t *testing.T) { inputStr := fmt.Sprintf("%v", test.input) if inputStr == "" { // empty input parameter is indistinguishable from not providing it at all // in that case the task will use an input defined by the job DAG return } vars := pipeline.NewVarsFrom(nil) task := pipeline.HexDecodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: inputStr, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.hexdecode_test.go: `.Sprintf("%v", test.input)` $DIR/core/services/pipeline/task.hexdecode_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.hexdecode_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.hexdecode_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})` $DIR/core/services/pipeline/task.hexdecode_test.go: `.Context(t)` $DIR/core/services/pipeline/task.hexdecode_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.hexdecode_test.go: `.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.HexDecodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.hexdecode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, })` $DIR/core/services/pipeline/task.hexdecode_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.hexdecode_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})` $DIR/core/services/pipeline/task.hexdecode_test.go: `.Context(t)` $DIR/core/services/pipeline/task.hexdecode_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.hexencode_test.go: `t.Run(test.name, func(t *testing.T) { t.Run("without vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.HexEncodeTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) }) t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.HexEncodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) })` $DIR/core/services/pipeline/task.hexencode_test.go: `t.Run("without vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.HexEncodeTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) })` $DIR/core/services/pipeline/task.hexencode_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}}))` $DIR/core/services/pipeline/task.hexencode_test.go: `t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.HexEncodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.hexencode_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{}))` $DIR/core/services/pipeline/task.hexencode_test.go: `t.Run(test.name, func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.HexEncodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: fmt.Sprintf("%v", test.input), } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{}) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) require.NoError(t, result.Error) require.Equal(t, test.result, result.Value) })` $DIR/core/services/pipeline/task.hexencode_test.go: `.NewInt(2)` $DIR/core/services/pipeline/task.hexencode_test.go: `.NewInt(3)` $DIR/core/services/pipeline/task.hexencode_test.go: `.Exp(bigTwo, big.NewInt(100), nil)` $DIR/core/services/pipeline/task.hexencode_test.go: `.NewInt(100)` $DIR/core/services/pipeline/task.hexencode_test.go: `.Exp(bigThree, big.NewInt(100), nil)` $DIR/core/services/pipeline/task.hexencode_test.go: `.NewInt(100)` $DIR/core/services/pipeline/task.hexencode_test.go: `.NewInt(-100)` $DIR/core/services/pipeline/task.hexencode_test.go: `.Run(test.name, func(t *testing.T) { t.Run("without vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.HexEncodeTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) }) t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.HexEncodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) })` $DIR/core/services/pipeline/task.hexencode_test.go: `.Run("without vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.HexEncodeTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) })` $DIR/core/services/pipeline/task.hexencode_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.hexencode_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.hexencode_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})` $DIR/core/services/pipeline/task.hexencode_test.go: `.Context(t)` $DIR/core/services/pipeline/task.hexencode_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.hexencode_test.go: `.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.HexEncodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.hexencode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, })` $DIR/core/services/pipeline/task.hexencode_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.hexencode_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})` $DIR/core/services/pipeline/task.hexencode_test.go: `.Context(t)` $DIR/core/services/pipeline/task.hexencode_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.hexencode_test.go: `.Run(test.name, func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.HexEncodeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: fmt.Sprintf("%v", test.input), } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{}) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) require.NoError(t, result.Error) require.Equal(t, test.result, result.Value) })` $DIR/core/services/pipeline/task.hexencode_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.hexencode_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.hexencode_test.go: `.Sprintf("%v", test.input)` $DIR/core/services/pipeline/task.hexencode_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})` $DIR/core/services/pipeline/task.hexencode_test.go: `.Context(t)` $DIR/core/services/pipeline/task.hexencode_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.http_test.go: `task.HelperSetDependencies(config.JobPipeline(), c, c)` $DIR/core/services/pipeline/task.http_test.go: `t.Run(test.name, func(t *testing.T) { t.Parallel() db := pgtest.NewSqlxDB(t) cfg := configtest.NewTestGeneralConfig(t) s1 := httptest.NewServer(fakePriceResponder(t, test.expectedRequestData, decimal.NewFromInt(9700), "", nil)) defer s1.Close() feedURL, err := url.ParseRequestURI(s1.URL) require.NoError(t, err) orm := bridges.NewORM(db) _, bridge := cltest.MustCreateBridge(t, db, cltest.BridgeOpts{URL: feedURL.String()}) task := pipeline.BridgeTask{ BaseTask: pipeline.NewBaseTask(0, "bridge", nil, nil, 0), Name: bridge.Name.String(), RequestData: test.requestData, } c := clhttptest.NewTestLocalOnlyHTTPClient() trORM := pipeline.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns()) specID, err := trORM.CreateSpec(testutils.Context(t), pipeline.Pipeline{}, *models.NewInterval(5 * time.Minute)) require.NoError(t, err) task.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c) err = test.vars.Set("meta", test.meta) require.NoError(t, err) result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectedErrorCause != nil { require.Equal(t, test.expectedErrorCause, errors.Cause(result.Error)) if test.expectedErrorContains != "" { require.Contains(t, result.Error.Error(), test.expectedErrorContains) } } else { require.NoError(t, result.Error) require.NotNil(t, result.Value) var x struct { Data struct { Result decimal.Decimal `json:"result"` } `json:"data"` } err := json.Unmarshal([]byte(result.Value.(string)), &x) require.NoError(t, err) require.Equal(t, decimal.NewFromInt(9700), x.Data.Result) } })` $DIR/core/services/pipeline/task.http_test.go: `task.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.http_test.go: `err = test.vars.Set("meta", test.meta)` $DIR/core/services/pipeline/task.http_test.go: `w.Header().Set("Content-Type", "application/json")` $DIR/core/services/pipeline/task.http_test.go: `w.WriteHeader(http.StatusOK)` $DIR/core/services/pipeline/task.http_test.go: `task.HelperSetDependencies(config.JobPipeline(), r, u)` $DIR/core/services/pipeline/task.http_test.go: `task.URL = "$(url)"` $DIR/core/services/pipeline/task.http_test.go: `result, runInfo = task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil)` $DIR/core/services/pipeline/task.http_test.go: `task.AllowUnrestrictedNetworkAccess = "true"` $DIR/core/services/pipeline/task.http_test.go: `result, runInfo = task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil)` $DIR/core/services/pipeline/task.http_test.go: `w.Header().Set("Content-Type", "application/json")` $DIR/core/services/pipeline/task.http_test.go: `w.WriteHeader(http.StatusTooManyRequests)` $DIR/core/services/pipeline/task.http_test.go: `resp.SetErrorMessage("could not hit data fetcher")` $DIR/core/services/pipeline/task.http_test.go: `task.HelperSetDependencies(config.JobPipeline(), c, c)` $DIR/core/services/pipeline/task.http_test.go: `w.Header().Set("Content-Type", "application/json")` $DIR/core/services/pipeline/task.http_test.go: `w.WriteHeader(http.StatusBadGateway)` $DIR/core/services/pipeline/task.http_test.go: `task.HelperSetDependencies(config.JobPipeline(), c, c)` $DIR/core/services/pipeline/task.http_test.go: `keys = append(keys, k)` $DIR/core/services/pipeline/task.http_test.go: `sort.Strings(keys)` $DIR/core/services/pipeline/task.http_test.go: `s = append(s, k, v)` $DIR/core/services/pipeline/task.http_test.go: `t.Run("sends headers", func(t *testing.T) { config := configtest.NewTestGeneralConfig(t) var headers http.Header handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { headers = r.Header w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) _, err := w.Write([]byte(`{"fooresponse": 1}`)) require.NoError(t, err) }) server := httptest.NewServer(handler) defer server.Close() task := pipeline.HTTPTask{ Method: "POST", URL: server.URL, RequestData: ethUSDPairing, Headers: `["X-Header-1", "foo", "X-Header-2", "bar"]`, } c := clhttptest.NewTestLocalOnlyHTTPClient() task.HelperSetDependencies(config.JobPipeline(), c, c) result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), nil) assert.False(t, runInfo.IsPending) assert.Equal(t, `{"fooresponse": 1}`, result.Value) assert.Nil(t, result.Error) assert.Equal(t, append(standardHeaders, "X-Header-1", "foo", "X-Header-2", "bar"), allHeaders(headers)) })` $DIR/core/services/pipeline/task.http_test.go: `headers = r.Header` $DIR/core/services/pipeline/task.http_test.go: `w.Header().Set("Content-Type", "application/json")` $DIR/core/services/pipeline/task.http_test.go: `w.WriteHeader(http.StatusOK)` $DIR/core/services/pipeline/task.http_test.go: `task.HelperSetDependencies(config.JobPipeline(), c, c)` $DIR/core/services/pipeline/task.http_test.go: `t.Run("errors with odd number of headers", func(t *testing.T) { task := pipeline.HTTPTask{ Method: "POST", URL: "http://example.com", RequestData: ethUSDPairing, Headers: `["X-Header-1", "foo", "X-Header-2", "bar", "odd one out"]`, } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), nil) assert.False(t, runInfo.IsPending) assert.NotNil(t, result.Error) assert.Equal(t, `headers must have an even number of elements`, result.Error.Error()) assert.Nil(t, result.Value) })` $DIR/core/services/pipeline/task.http_test.go: `headers = r.Header` $DIR/core/services/pipeline/task.http_test.go: `w.Header().Set("Content-Type", "application/json")` $DIR/core/services/pipeline/task.http_test.go: `w.WriteHeader(http.StatusOK)` $DIR/core/services/pipeline/task.http_test.go: `task.HelperSetDependencies(config.JobPipeline(), c, c)` $DIR/core/services/pipeline/task.http_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/task.http_test.go: `.NewServer(fakePriceResponder(t, utils.MustUnmarshalToMap(btcUSDPairing), decimal.NewFromInt(9700), "", nil))` $DIR/core/services/pipeline/task.http_test.go: `.MustUnmarshalToMap(btcUSDPairing)` $DIR/core/services/pipeline/task.http_test.go: `.NewFromInt(9700)` $DIR/core/services/pipeline/task.http_test.go: `.NewBaseTask(0, "http", nil, nil, 0)` $DIR/core/services/pipeline/task.http_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/services/pipeline/task.http_test.go: `.HelperSetDependencies(config.JobPipeline(), c, c)` $DIR/core/services/pipeline/task.http_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.http_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), nil)` $DIR/core/services/pipeline/task.http_test.go: `.Context(t)` $DIR/core/services/pipeline/task.http_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.http_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.http_test.go: `.Unmarshal([]byte(result.Value.(string)), &x)` $DIR/core/services/pipeline/task.http_test.go: `.NewFromInt(9700)` $DIR/core/services/pipeline/task.http_test.go: `.NewVarsFrom(map[string]interface{}{"some_data": map[string]interface{}{"foo": 543.21}})` $DIR/core/services/pipeline/task.http_test.go: `.NewVarsFrom(map[string]interface{}{"some_data": map[string]interface{}{"foo": 543.21}})` $DIR/core/services/pipeline/task.http_test.go: `.NewVarsFrom(map[string]interface{}{"some_data": map[string]interface{}{"foo": 543.21}})` $DIR/core/services/pipeline/task.http_test.go: `.NewVarsFrom(map[string]interface{}{"not_some_data": map[string]interface{}{"foo": 543.21}})` $DIR/core/services/pipeline/task.http_test.go: `.NewVarsFrom(map[string]interface{}{"some_data": 543.21})` $DIR/core/services/pipeline/task.http_test.go: `.NewVarsFrom(map[string]interface{}{"medianize": 543.21})` $DIR/core/services/pipeline/task.http_test.go: `.NewVarsFrom(map[string]interface{}{"nope": "foo bar"})` $DIR/core/services/pipeline/task.http_test.go: `.Run(test.name, func(t *testing.T) { t.Parallel() db := pgtest.NewSqlxDB(t) cfg := configtest.NewTestGeneralConfig(t) s1 := httptest.NewServer(fakePriceResponder(t, test.expectedRequestData, decimal.NewFromInt(9700), "", nil)) defer s1.Close() feedURL, err := url.ParseRequestURI(s1.URL) require.NoError(t, err) orm := bridges.NewORM(db) _, bridge := cltest.MustCreateBridge(t, db, cltest.BridgeOpts{URL: feedURL.String()}) task := pipeline.BridgeTask{ BaseTask: pipeline.NewBaseTask(0, "bridge", nil, nil, 0), Name: bridge.Name.String(), RequestData: test.requestData, } c := clhttptest.NewTestLocalOnlyHTTPClient() trORM := pipeline.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns()) specID, err := trORM.CreateSpec(testutils.Context(t), pipeline.Pipeline{}, *models.NewInterval(5 * time.Minute)) require.NoError(t, err) task.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c) err = test.vars.Set("meta", test.meta) require.NoError(t, err) result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.expectedErrorCause != nil { require.Equal(t, test.expectedErrorCause, errors.Cause(result.Error)) if test.expectedErrorContains != "" { require.Contains(t, result.Error.Error(), test.expectedErrorContains) } } else { require.NoError(t, result.Error) require.NotNil(t, result.Value) var x struct { Data struct { Result decimal.Decimal `json:"result"` } `json:"data"` } err := json.Unmarshal([]byte(result.Value.(string)), &x) require.NoError(t, err) require.Equal(t, decimal.NewFromInt(9700), x.Data.Result) } })` $DIR/core/services/pipeline/task.http_test.go: `.NewSqlxDB(t)` $DIR/core/services/pipeline/task.http_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/task.http_test.go: `.NewServer(fakePriceResponder(t, test.expectedRequestData, decimal.NewFromInt(9700), "", nil))` $DIR/core/services/pipeline/task.http_test.go: `.NewFromInt(9700)` $DIR/core/services/pipeline/task.http_test.go: `.ParseRequestURI(s1.URL)` $DIR/core/services/pipeline/task.http_test.go: `.NewORM(db)` $DIR/core/services/pipeline/task.http_test.go: `.MustCreateBridge(t, db, cltest.BridgeOpts{URL: feedURL.String()})` $DIR/core/services/pipeline/task.http_test.go: `.String()` $DIR/core/services/pipeline/task.http_test.go: `.NewBaseTask(0, "bridge", nil, nil, 0)` $DIR/core/services/pipeline/task.http_test.go: `.Name.String()` $DIR/core/services/pipeline/task.http_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/services/pipeline/task.http_test.go: `.NewORM(db, logger.TestLogger(t), cfg.JobPipeline().MaxSuccessfulRuns())` $DIR/core/services/pipeline/task.http_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.http_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.http_test.go: `.MaxSuccessfulRuns()` $DIR/core/services/pipeline/task.http_test.go: `.CreateSpec(testutils.Context(t), pipeline.Pipeline{}, *models.NewInterval(5 * time.Minute))` $DIR/core/services/pipeline/task.http_test.go: `.Context(t)` $DIR/core/services/pipeline/task.http_test.go: `.NewInterval(5 * time.Minute)` $DIR/core/services/pipeline/task.http_test.go: `.HelperSetDependencies(cfg.JobPipeline(), cfg.WebServer(), orm, specID, uuid.UUID{}, c)` $DIR/core/services/pipeline/task.http_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.http_test.go: `.WebServer()` $DIR/core/services/pipeline/task.http_test.go: `.vars.Set("meta", test.meta)` $DIR/core/services/pipeline/task.http_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs)` $DIR/core/services/pipeline/task.http_test.go: `.Context(t)` $DIR/core/services/pipeline/task.http_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.http_test.go: `.Unmarshal([]byte(result.Value.(string)), &x)` $DIR/core/services/pipeline/task.http_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/task.http_test.go: `.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) _, err := w.Write([]byte("{}")) require.NoError(t, err) })` $DIR/core/services/pipeline/task.http_test.go: `.Header()` $DIR/core/services/pipeline/task.http_test.go: `.Set("Content-Type", "application/json")` $DIR/core/services/pipeline/task.http_test.go: `.WriteHeader(http.StatusOK)` $DIR/core/services/pipeline/task.http_test.go: `.Write([]byte("{}"))` $DIR/core/services/pipeline/task.http_test.go: `.NewServer(handler)` $DIR/core/services/pipeline/task.http_test.go: `.NewRestrictedHTTPClient(config.Database(), logger.TestLogger(t))` $DIR/core/services/pipeline/task.http_test.go: `.Database()` $DIR/core/services/pipeline/task.http_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.http_test.go: `.NewUnrestrictedHTTPClient()` $DIR/core/services/pipeline/task.http_test.go: `.HelperSetDependencies(config.JobPipeline(), r, u)` $DIR/core/services/pipeline/task.http_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.http_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), nil)` $DIR/core/services/pipeline/task.http_test.go: `.Context(t)` $DIR/core/services/pipeline/task.http_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.http_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.http_test.go: `.NewVarsFrom(map[string]interface{}{"url": server.URL})` $DIR/core/services/pipeline/task.http_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, nil)` $DIR/core/services/pipeline/task.http_test.go: `.Context(t)` $DIR/core/services/pipeline/task.http_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.http_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, nil)` $DIR/core/services/pipeline/task.http_test.go: `.Context(t)` $DIR/core/services/pipeline/task.http_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.http_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/task.http_test.go: `.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusTooManyRequests) resp := &adapterResponse{} resp.SetErrorMessage("could not hit data fetcher") err := json.NewEncoder(w).Encode(resp) require.NoError(t, err) })` $DIR/core/services/pipeline/task.http_test.go: `.Header()` $DIR/core/services/pipeline/task.http_test.go: `.Set("Content-Type", "application/json")` $DIR/core/services/pipeline/task.http_test.go: `.WriteHeader(http.StatusTooManyRequests)` $DIR/core/services/pipeline/task.http_test.go: `.SetErrorMessage("could not hit data fetcher")` $DIR/core/services/pipeline/task.http_test.go: `.NewEncoder(w)` $DIR/core/services/pipeline/task.http_test.go: `.Encode(resp)` $DIR/core/services/pipeline/task.http_test.go: `.NewServer(handler)` $DIR/core/services/pipeline/task.http_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/services/pipeline/task.http_test.go: `.HelperSetDependencies(config.JobPipeline(), c, c)` $DIR/core/services/pipeline/task.http_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.http_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), nil)` $DIR/core/services/pipeline/task.http_test.go: `.Context(t)` $DIR/core/services/pipeline/task.http_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.http_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.http_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/task.http_test.go: `.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusBadGateway) _, err := w.Write([]byte(mustReadFile(t, "../../testdata/apiresponses/coinmarketcap.error.json"))) require.NoError(t, err) })` $DIR/core/services/pipeline/task.http_test.go: `.Header()` $DIR/core/services/pipeline/task.http_test.go: `.Set("Content-Type", "application/json")` $DIR/core/services/pipeline/task.http_test.go: `.WriteHeader(http.StatusBadGateway)` $DIR/core/services/pipeline/task.http_test.go: `.Write([]byte(mustReadFile(t, "../../testdata/apiresponses/coinmarketcap.error.json")))` $DIR/core/services/pipeline/task.http_test.go: `.NewServer(handler)` $DIR/core/services/pipeline/task.http_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/services/pipeline/task.http_test.go: `.HelperSetDependencies(config.JobPipeline(), c, c)` $DIR/core/services/pipeline/task.http_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.http_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), nil)` $DIR/core/services/pipeline/task.http_test.go: `.Context(t)` $DIR/core/services/pipeline/task.http_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.http_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.http_test.go: `.Strings(keys)` $DIR/core/services/pipeline/task.http_test.go: `.Get(k)` $DIR/core/services/pipeline/task.http_test.go: `.Run("sends headers", func(t *testing.T) { config := configtest.NewTestGeneralConfig(t) var headers http.Header handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { headers = r.Header w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) _, err := w.Write([]byte(`{"fooresponse": 1}`)) require.NoError(t, err) }) server := httptest.NewServer(handler) defer server.Close() task := pipeline.HTTPTask{ Method: "POST", URL: server.URL, RequestData: ethUSDPairing, Headers: `["X-Header-1", "foo", "X-Header-2", "bar"]`, } c := clhttptest.NewTestLocalOnlyHTTPClient() task.HelperSetDependencies(config.JobPipeline(), c, c) result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), nil) assert.False(t, runInfo.IsPending) assert.Equal(t, `{"fooresponse": 1}`, result.Value) assert.Nil(t, result.Error) assert.Equal(t, append(standardHeaders, "X-Header-1", "foo", "X-Header-2", "bar"), allHeaders(headers)) })` $DIR/core/services/pipeline/task.http_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/task.http_test.go: `.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { headers = r.Header w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) _, err := w.Write([]byte(`{"fooresponse": 1}`)) require.NoError(t, err) })` $DIR/core/services/pipeline/task.http_test.go: `.Header()` $DIR/core/services/pipeline/task.http_test.go: `.Set("Content-Type", "application/json")` $DIR/core/services/pipeline/task.http_test.go: `.WriteHeader(http.StatusOK)` $DIR/core/services/pipeline/task.http_test.go: `.Write([]byte(`{"fooresponse": 1}`))` $DIR/core/services/pipeline/task.http_test.go: `.NewServer(handler)` $DIR/core/services/pipeline/task.http_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/services/pipeline/task.http_test.go: `.HelperSetDependencies(config.JobPipeline(), c, c)` $DIR/core/services/pipeline/task.http_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.http_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), nil)` $DIR/core/services/pipeline/task.http_test.go: `.Context(t)` $DIR/core/services/pipeline/task.http_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.http_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.http_test.go: `.Run("errors with odd number of headers", func(t *testing.T) { task := pipeline.HTTPTask{ Method: "POST", URL: "http://example.com", RequestData: ethUSDPairing, Headers: `["X-Header-1", "foo", "X-Header-2", "bar", "odd one out"]`, } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), nil) assert.False(t, runInfo.IsPending) assert.NotNil(t, result.Error) assert.Equal(t, `headers must have an even number of elements`, result.Error.Error()) assert.Nil(t, result.Value) })` $DIR/core/services/pipeline/task.http_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), nil)` $DIR/core/services/pipeline/task.http_test.go: `.Context(t)` $DIR/core/services/pipeline/task.http_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.http_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.http_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/pipeline/task.http_test.go: `.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { headers = r.Header w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) _, err := w.Write([]byte(`{"fooresponse": 3}`)) require.NoError(t, err) })` $DIR/core/services/pipeline/task.http_test.go: `.Header()` $DIR/core/services/pipeline/task.http_test.go: `.Set("Content-Type", "application/json")` $DIR/core/services/pipeline/task.http_test.go: `.WriteHeader(http.StatusOK)` $DIR/core/services/pipeline/task.http_test.go: `.Write([]byte(`{"fooresponse": 3}`))` $DIR/core/services/pipeline/task.http_test.go: `.NewServer(handler)` $DIR/core/services/pipeline/task.http_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/services/pipeline/task.http_test.go: `.HelperSetDependencies(config.JobPipeline(), c, c)` $DIR/core/services/pipeline/task.http_test.go: `.JobPipeline()` $DIR/core/services/pipeline/task.http_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), nil)` $DIR/core/services/pipeline/task.http_test.go: `.Context(t)` $DIR/core/services/pipeline/task.http_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.http_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.jsonparse_test.go: `t.Run(test.name, func(t *testing.T) { task := pipeline.JSONParseTask{ BaseTask: pipeline.NewBaseTask(0, "json", nil, nil, 0), Path: test.path, Separator: test.separator, Data: test.data, Lax: test.lax, } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.wantErrorCause != nil { require.Equal(t, test.wantErrorCause, errors.Cause(result.Error)) if test.wantErrorContains != "" { require.Contains(t, result.Error.Error(), test.wantErrorContains) } require.Nil(t, result.Value) val, err := test.vars.Get("json") require.Equal(t, pipeline.ErrKeypathNotFound, errors.Cause(err)) require.Nil(t, val) } else { require.NoError(t, result.Error) require.Equal(t, test.wantData, result.Value) } })` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": `{"data":[{"availability":"0.99991"}]}`}, })` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": `{"data":["stevetoshi sergeymoto"]}`}, })` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": `{"data":[{"availability":"0.99991"}]}`}, "chain": map[string]interface{}{"link": "data,0,availability"}, })` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": `{"data":[{"availability":"0.99991"}]}`}, "chain": map[string]interface{}{"link": "data,0,availability"}, })` $DIR/core/services/pipeline/task.jsonparse_test.go: `.Run(test.name, func(t *testing.T) { task := pipeline.JSONParseTask{ BaseTask: pipeline.NewBaseTask(0, "json", nil, nil, 0), Path: test.path, Separator: test.separator, Data: test.data, Lax: test.lax, } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.wantErrorCause != nil { require.Equal(t, test.wantErrorCause, errors.Cause(result.Error)) if test.wantErrorContains != "" { require.Contains(t, result.Error.Error(), test.wantErrorContains) } require.Nil(t, result.Value) val, err := test.vars.Get("json") require.Equal(t, pipeline.ErrKeypathNotFound, errors.Cause(err)) require.Nil(t, val) } else { require.NoError(t, result.Error) require.Equal(t, test.wantData, result.Value) } })` $DIR/core/services/pipeline/task.jsonparse_test.go: `.NewBaseTask(0, "json", nil, nil, 0)` $DIR/core/services/pipeline/task.jsonparse_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs)` $DIR/core/services/pipeline/task.jsonparse_test.go: `.Context(t)` $DIR/core/services/pipeline/task.jsonparse_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.jsonparse_test.go: `.vars.Get("json")` $DIR/core/services/pipeline/task.length_test.go: `t.Run(test.name, func(t *testing.T) { t.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.LengthTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) }) t.Run("without vars through input param", func(t *testing.T) { var inputStr string if _, ok := test.input.([]byte); ok { inputStr = string(test.input.([]byte)) } else { inputStr = test.input.(string) } if inputStr == "" { // empty input parameter is indistinguishable from not providing it at all // in that case the task will use an input defined by the job DAG return } vars := pipeline.NewVarsFrom(nil) task := pipeline.LengthTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: inputStr, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.LengthTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) })` $DIR/core/services/pipeline/task.length_test.go: `t.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.LengthTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) })` $DIR/core/services/pipeline/task.length_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}}))` $DIR/core/services/pipeline/task.length_test.go: `t.Run("without vars through input param", func(t *testing.T) { var inputStr string if _, ok := test.input.([]byte); ok { inputStr = string(test.input.([]byte)) } else { inputStr = test.input.(string) } if inputStr == "" { // empty input parameter is indistinguishable from not providing it at all // in that case the task will use an input defined by the job DAG return } vars := pipeline.NewVarsFrom(nil) task := pipeline.LengthTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: inputStr, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.length_test.go: `inputStr = string(test.input.([]byte))` $DIR/core/services/pipeline/task.length_test.go: `inputStr = test.input.(string)` $DIR/core/services/pipeline/task.length_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{}))` $DIR/core/services/pipeline/task.length_test.go: `t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.LengthTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.length_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{}))` $DIR/core/services/pipeline/task.length_test.go: `.NewFromInt(4)` $DIR/core/services/pipeline/task.length_test.go: `.NewFromInt(0)` $DIR/core/services/pipeline/task.length_test.go: `.NewFromInt(21)` $DIR/core/services/pipeline/task.length_test.go: `.NewFromInt(21)` $DIR/core/services/pipeline/task.length_test.go: `.NewFromInt(0)` $DIR/core/services/pipeline/task.length_test.go: `.Run(test.name, func(t *testing.T) { t.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.LengthTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) }) t.Run("without vars through input param", func(t *testing.T) { var inputStr string if _, ok := test.input.([]byte); ok { inputStr = string(test.input.([]byte)) } else { inputStr = test.input.(string) } if inputStr == "" { // empty input parameter is indistinguishable from not providing it at all // in that case the task will use an input defined by the job DAG return } vars := pipeline.NewVarsFrom(nil) task := pipeline.LengthTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: inputStr, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.LengthTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) })` $DIR/core/services/pipeline/task.length_test.go: `.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.LengthTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) })` $DIR/core/services/pipeline/task.length_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.length_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.length_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})` $DIR/core/services/pipeline/task.length_test.go: `.Context(t)` $DIR/core/services/pipeline/task.length_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.length_test.go: `.Run("without vars through input param", func(t *testing.T) { var inputStr string if _, ok := test.input.([]byte); ok { inputStr = string(test.input.([]byte)) } else { inputStr = test.input.(string) } if inputStr == "" { // empty input parameter is indistinguishable from not providing it at all // in that case the task will use an input defined by the job DAG return } vars := pipeline.NewVarsFrom(nil) task := pipeline.LengthTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: inputStr, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.length_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.length_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.length_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})` $DIR/core/services/pipeline/task.length_test.go: `.Context(t)` $DIR/core/services/pipeline/task.length_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.length_test.go: `.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.LengthTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.length_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, })` $DIR/core/services/pipeline/task.length_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.length_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})` $DIR/core/services/pipeline/task.length_test.go: `.Context(t)` $DIR/core/services/pipeline/task.length_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.lessthan_test.go: `t.Run(test.name, func(t *testing.T) { t.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.LessThanTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Right: test.right} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.left}})) }) t.Run("without vars through input param", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.LessThanTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Left: fmt.Sprintf("%v", test.left), Right: test.right, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.left}, "chain": map[string]interface{}{"link": test.right}, }) task := pipeline.LessThanTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Left: "$(foo.bar)", Right: "$(chain.link)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) })` $DIR/core/services/pipeline/task.lessthan_test.go: `t.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.LessThanTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Right: test.right} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.left}})) })` $DIR/core/services/pipeline/task.lessthan_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.left}}))` $DIR/core/services/pipeline/task.lessthan_test.go: `t.Run("without vars through input param", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.LessThanTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Left: fmt.Sprintf("%v", test.left), Right: test.right, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.lessthan_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{}))` $DIR/core/services/pipeline/task.lessthan_test.go: `t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.left}, "chain": map[string]interface{}{"link": test.right}, }) task := pipeline.LessThanTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Left: "$(foo.bar)", Right: "$(chain.link)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.lessthan_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{}))` $DIR/core/services/pipeline/task.lessthan_test.go: `t.Run(test.name, func(t *testing.T) { task := pipeline.LessThanTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Left: test.left, Right: test.right, } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) require.Equal(t, test.wantErrorCause, errors.Cause(result.Error)) if test.wantErrorContains != "" { require.Contains(t, result.Error.Error(), test.wantErrorContains) } })` $DIR/core/services/pipeline/task.lessthan_test.go: `.Run(test.name, func(t *testing.T) { t.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.LessThanTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Right: test.right} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.left}})) }) t.Run("without vars through input param", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.LessThanTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Left: fmt.Sprintf("%v", test.left), Right: test.right, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.left}, "chain": map[string]interface{}{"link": test.right}, }) task := pipeline.LessThanTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Left: "$(foo.bar)", Right: "$(chain.link)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) })` $DIR/core/services/pipeline/task.lessthan_test.go: `.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.LessThanTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Right: test.right} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.left}})) })` $DIR/core/services/pipeline/task.lessthan_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.lessthan_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.lessthan_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.left}})` $DIR/core/services/pipeline/task.lessthan_test.go: `.Context(t)` $DIR/core/services/pipeline/task.lessthan_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.lessthan_test.go: `.Run("without vars through input param", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.LessThanTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Left: fmt.Sprintf("%v", test.left), Right: test.right, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.lessthan_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.lessthan_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.lessthan_test.go: `.Sprintf("%v", test.left)` $DIR/core/services/pipeline/task.lessthan_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})` $DIR/core/services/pipeline/task.lessthan_test.go: `.Context(t)` $DIR/core/services/pipeline/task.lessthan_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.lessthan_test.go: `.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.left}, "chain": map[string]interface{}{"link": test.right}, }) task := pipeline.LessThanTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Left: "$(foo.bar)", Right: "$(chain.link)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.lessthan_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.left}, "chain": map[string]interface{}{"link": test.right}, })` $DIR/core/services/pipeline/task.lessthan_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.lessthan_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})` $DIR/core/services/pipeline/task.lessthan_test.go: `.Context(t)` $DIR/core/services/pipeline/task.lessthan_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.lessthan_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.lessthan_test.go: `.NewVarsFrom(map[string]interface{}{"foo": map[string]interface{}{"chain": "link"}})` $DIR/core/services/pipeline/task.lessthan_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.lessthan_test.go: `.NewVarsFrom(map[string]interface{}{"foo": []interface{}{"chain", "link"}})` $DIR/core/services/pipeline/task.lessthan_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.lessthan_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.lessthan_test.go: `.Run(test.name, func(t *testing.T) { task := pipeline.LessThanTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Left: test.left, Right: test.right, } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) require.Equal(t, test.wantErrorCause, errors.Cause(result.Error)) if test.wantErrorContains != "" { require.Contains(t, result.Error.Error(), test.wantErrorContains) } })` $DIR/core/services/pipeline/task.lessthan_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.lessthan_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs)` $DIR/core/services/pipeline/task.lessthan_test.go: `.Context(t)` $DIR/core/services/pipeline/task.lessthan_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.lookup_test.go: `t.Run("with valid key for map", func(t *testing.T) { task.Key = "foo" inputs = []pipeline.Result{{Value: m, Error: nil}} res, _ := task.Run(testutils.Context(t), logger.TestLogger(t), vars, inputs) assert.Equal(t, 42, res.Value) assert.Nil(t, res.Error) })` $DIR/core/services/pipeline/task.lookup_test.go: `task.Key = "foo"` $DIR/core/services/pipeline/task.lookup_test.go: `inputs = []pipeline.Result{{Value: m, Error: nil}}` $DIR/core/services/pipeline/task.lookup_test.go: `t.Run("returns nil if key is missing", func(t *testing.T) { task.Key = "qux" inputs = []pipeline.Result{{Value: m, Error: nil}} res, _ := task.Run(testutils.Context(t), logger.TestLogger(t), vars, inputs) assert.Nil(t, res.Error) assert.Nil(t, res.Value) })` $DIR/core/services/pipeline/task.lookup_test.go: `task.Key = "qux"` $DIR/core/services/pipeline/task.lookup_test.go: `inputs = []pipeline.Result{{Value: m, Error: nil}}` $DIR/core/services/pipeline/task.lookup_test.go: `t.Run("errors when input is not a map", func(t *testing.T) { task.Key = "qux" inputs = []pipeline.Result{{Value: "something", Error: nil}} res, _ := task.Run(testutils.Context(t), logger.TestLogger(t), vars, inputs) assert.EqualError(t, res.Error, "unexpected input type: string") assert.Nil(t, res.Value) })` $DIR/core/services/pipeline/task.lookup_test.go: `task.Key = "qux"` $DIR/core/services/pipeline/task.lookup_test.go: `inputs = []pipeline.Result{{Value: "something", Error: nil}}` $DIR/core/services/pipeline/task.lookup_test.go: `t.Run("errors when input is error", func(t *testing.T) { task.Key = "qux" inputs = []pipeline.Result{{Value: nil, Error: errors.New("something blew up")}} res, _ := task.Run(testutils.Context(t), logger.TestLogger(t), vars, inputs) assert.EqualError(t, res.Error, "task inputs: too many errors") assert.Nil(t, res.Value) })` $DIR/core/services/pipeline/task.lookup_test.go: `task.Key = "qux"` $DIR/core/services/pipeline/task.lookup_test.go: `inputs = []pipeline.Result{{Value: nil, Error: errors.New("something blew up")}}` $DIR/core/services/pipeline/task.lookup_test.go: `task.Key = "qux"` $DIR/core/services/pipeline/task.lookup_test.go: `inputs = []pipeline.Result{{Value: m, Error: nil}, {Value: nil, Error: errors.New("something blew up")}}` $DIR/core/services/pipeline/task.lookup_test.go: `.Run("with valid key for map", func(t *testing.T) { task.Key = "foo" inputs = []pipeline.Result{{Value: m, Error: nil}} res, _ := task.Run(testutils.Context(t), logger.TestLogger(t), vars, inputs) assert.Equal(t, 42, res.Value) assert.Nil(t, res.Error) })` $DIR/core/services/pipeline/task.lookup_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, inputs)` $DIR/core/services/pipeline/task.lookup_test.go: `.Context(t)` $DIR/core/services/pipeline/task.lookup_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.lookup_test.go: `.Run("returns nil if key is missing", func(t *testing.T) { task.Key = "qux" inputs = []pipeline.Result{{Value: m, Error: nil}} res, _ := task.Run(testutils.Context(t), logger.TestLogger(t), vars, inputs) assert.Nil(t, res.Error) assert.Nil(t, res.Value) })` $DIR/core/services/pipeline/task.lookup_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, inputs)` $DIR/core/services/pipeline/task.lookup_test.go: `.Context(t)` $DIR/core/services/pipeline/task.lookup_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.lookup_test.go: `.Run("errors when input is not a map", func(t *testing.T) { task.Key = "qux" inputs = []pipeline.Result{{Value: "something", Error: nil}} res, _ := task.Run(testutils.Context(t), logger.TestLogger(t), vars, inputs) assert.EqualError(t, res.Error, "unexpected input type: string") assert.Nil(t, res.Value) })` $DIR/core/services/pipeline/task.lookup_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, inputs)` $DIR/core/services/pipeline/task.lookup_test.go: `.Context(t)` $DIR/core/services/pipeline/task.lookup_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.lookup_test.go: `.Run("errors when input is error", func(t *testing.T) { task.Key = "qux" inputs = []pipeline.Result{{Value: nil, Error: errors.New("something blew up")}} res, _ := task.Run(testutils.Context(t), logger.TestLogger(t), vars, inputs) assert.EqualError(t, res.Error, "task inputs: too many errors") assert.Nil(t, res.Value) })` $DIR/core/services/pipeline/task.lookup_test.go: `.New("something blew up")` $DIR/core/services/pipeline/task.lookup_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, inputs)` $DIR/core/services/pipeline/task.lookup_test.go: `.Context(t)` $DIR/core/services/pipeline/task.lookup_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.lookup_test.go: `.New("something blew up")` $DIR/core/services/pipeline/task.lookup_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, inputs)` $DIR/core/services/pipeline/task.lookup_test.go: `.Context(t)` $DIR/core/services/pipeline/task.lookup_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.lowercase_test.go: `t.Run(test.name, func(t *testing.T) { t.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.LowercaseTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) }) t.Run("without vars through input param", func(t *testing.T) { inputStr := fmt.Sprintf("%v", test.input) if inputStr == "" { // empty input parameter is indistinguishable from not providing it at all // in that case the task will use an input defined by the job DAG return } vars := pipeline.NewVarsFrom(nil) task := pipeline.LowercaseTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: inputStr, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.LowercaseTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) })` $DIR/core/services/pipeline/task.lowercase_test.go: `t.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.LowercaseTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) })` $DIR/core/services/pipeline/task.lowercase_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}}))` $DIR/core/services/pipeline/task.lowercase_test.go: `t.Run("without vars through input param", func(t *testing.T) { inputStr := fmt.Sprintf("%v", test.input) if inputStr == "" { // empty input parameter is indistinguishable from not providing it at all // in that case the task will use an input defined by the job DAG return } vars := pipeline.NewVarsFrom(nil) task := pipeline.LowercaseTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: inputStr, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.lowercase_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{}))` $DIR/core/services/pipeline/task.lowercase_test.go: `t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.LowercaseTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.lowercase_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{}))` $DIR/core/services/pipeline/task.lowercase_test.go: `.Run(test.name, func(t *testing.T) { t.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.LowercaseTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) }) t.Run("without vars through input param", func(t *testing.T) { inputStr := fmt.Sprintf("%v", test.input) if inputStr == "" { // empty input parameter is indistinguishable from not providing it at all // in that case the task will use an input defined by the job DAG return } vars := pipeline.NewVarsFrom(nil) task := pipeline.LowercaseTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: inputStr, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.LowercaseTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) })` $DIR/core/services/pipeline/task.lowercase_test.go: `.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.LowercaseTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) })` $DIR/core/services/pipeline/task.lowercase_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.lowercase_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.lowercase_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})` $DIR/core/services/pipeline/task.lowercase_test.go: `.Context(t)` $DIR/core/services/pipeline/task.lowercase_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.lowercase_test.go: `.Run("without vars through input param", func(t *testing.T) { inputStr := fmt.Sprintf("%v", test.input) if inputStr == "" { // empty input parameter is indistinguishable from not providing it at all // in that case the task will use an input defined by the job DAG return } vars := pipeline.NewVarsFrom(nil) task := pipeline.LowercaseTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: inputStr, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.lowercase_test.go: `.Sprintf("%v", test.input)` $DIR/core/services/pipeline/task.lowercase_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.lowercase_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.lowercase_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})` $DIR/core/services/pipeline/task.lowercase_test.go: `.Context(t)` $DIR/core/services/pipeline/task.lowercase_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.lowercase_test.go: `.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.LowercaseTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.lowercase_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, })` $DIR/core/services/pipeline/task.lowercase_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.lowercase_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})` $DIR/core/services/pipeline/task.lowercase_test.go: `.Context(t)` $DIR/core/services/pipeline/task.lowercase_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.mean_test.go: `t.Run(test.name, func(t *testing.T) { t.Run("without vars", func(t *testing.T) { task := pipeline.MeanTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), AllowedFaults: test.allowedFaults, Precision: test.precision, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } }) t.Run("with vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": inputs}, }) task := pipeline.MeanTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: "$(foo.bar)", AllowedFaults: test.allowedFaults, Precision: test.precision, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } }) t.Run("with json vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } var valuesParam string var vars pipeline.Vars switch len(inputs) { case 0: valuesParam = "[]" vars = pipeline.NewVarsFrom(nil) case 1: valuesParam = "[ $(foo) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0]}) case 2: valuesParam = "[ $(foo), $(bar) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1]}) case 3: valuesParam = "[ $(foo), $(bar), $(chain) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2]}) case 4: valuesParam = "[ $(foo), $(bar), $(chain), $(link) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2], "link": inputs[3]}) } task := pipeline.MeanTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: valuesParam, AllowedFaults: test.allowedFaults, Precision: test.precision, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } }) })` $DIR/core/services/pipeline/task.mean_test.go: `t.Run("without vars", func(t *testing.T) { task := pipeline.MeanTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), AllowedFaults: test.allowedFaults, Precision: test.precision, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } })` $DIR/core/services/pipeline/task.mean_test.go: `t.Run("with vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": inputs}, }) task := pipeline.MeanTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: "$(foo.bar)", AllowedFaults: test.allowedFaults, Precision: test.precision, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } })` $DIR/core/services/pipeline/task.mean_test.go: `inputs = append(inputs, input.Error)` $DIR/core/services/pipeline/task.mean_test.go: `inputs = append(inputs, input.Value)` $DIR/core/services/pipeline/task.mean_test.go: `t.Run("with json vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } var valuesParam string var vars pipeline.Vars switch len(inputs) { case 0: valuesParam = "[]" vars = pipeline.NewVarsFrom(nil) case 1: valuesParam = "[ $(foo) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0]}) case 2: valuesParam = "[ $(foo), $(bar) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1]}) case 3: valuesParam = "[ $(foo), $(bar), $(chain) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2]}) case 4: valuesParam = "[ $(foo), $(bar), $(chain), $(link) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2], "link": inputs[3]}) } task := pipeline.MeanTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: valuesParam, AllowedFaults: test.allowedFaults, Precision: test.precision, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } })` $DIR/core/services/pipeline/task.mean_test.go: `inputs = append(inputs, input.Error)` $DIR/core/services/pipeline/task.mean_test.go: `inputs = append(inputs, input.Value)` $DIR/core/services/pipeline/task.mean_test.go: `valuesParam = "[]"` $DIR/core/services/pipeline/task.mean_test.go: `vars = pipeline.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.mean_test.go: `valuesParam = "[ $(foo) ]"` $DIR/core/services/pipeline/task.mean_test.go: `vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0]})` $DIR/core/services/pipeline/task.mean_test.go: `valuesParam = "[ $(foo), $(bar) ]"` $DIR/core/services/pipeline/task.mean_test.go: `vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1]})` $DIR/core/services/pipeline/task.mean_test.go: `valuesParam = "[ $(foo), $(bar), $(chain) ]"` $DIR/core/services/pipeline/task.mean_test.go: `vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2]})` $DIR/core/services/pipeline/task.mean_test.go: `valuesParam = "[ $(foo), $(bar), $(chain), $(link) ]"` $DIR/core/services/pipeline/task.mean_test.go: `vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2], "link": inputs[3]})` $DIR/core/services/pipeline/task.mean_test.go: `.New("")` $DIR/core/services/pipeline/task.mean_test.go: `.New("")` $DIR/core/services/pipeline/task.mean_test.go: `.New("")` $DIR/core/services/pipeline/task.mean_test.go: `.New("")` $DIR/core/services/pipeline/task.mean_test.go: `.New("")` $DIR/core/services/pipeline/task.mean_test.go: `.New("")` $DIR/core/services/pipeline/task.mean_test.go: `.New("")` $DIR/core/services/pipeline/task.mean_test.go: `.New("")` $DIR/core/services/pipeline/task.mean_test.go: `.New("")` $DIR/core/services/pipeline/task.mean_test.go: `.New("")` $DIR/core/services/pipeline/task.mean_test.go: `.New("")` $DIR/core/services/pipeline/task.mean_test.go: `.New("")` $DIR/core/services/pipeline/task.mean_test.go: `.New("")` $DIR/core/services/pipeline/task.mean_test.go: `.New("")` $DIR/core/services/pipeline/task.mean_test.go: `.Run(test.name, func(t *testing.T) { t.Run("without vars", func(t *testing.T) { task := pipeline.MeanTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), AllowedFaults: test.allowedFaults, Precision: test.precision, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } }) t.Run("with vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": inputs}, }) task := pipeline.MeanTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: "$(foo.bar)", AllowedFaults: test.allowedFaults, Precision: test.precision, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } }) t.Run("with json vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } var valuesParam string var vars pipeline.Vars switch len(inputs) { case 0: valuesParam = "[]" vars = pipeline.NewVarsFrom(nil) case 1: valuesParam = "[ $(foo) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0]}) case 2: valuesParam = "[ $(foo), $(bar) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1]}) case 3: valuesParam = "[ $(foo), $(bar), $(chain) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2]}) case 4: valuesParam = "[ $(foo), $(bar), $(chain), $(link) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2], "link": inputs[3]}) } task := pipeline.MeanTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: valuesParam, AllowedFaults: test.allowedFaults, Precision: test.precision, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } }) })` $DIR/core/services/pipeline/task.mean_test.go: `.Run("without vars", func(t *testing.T) { task := pipeline.MeanTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), AllowedFaults: test.allowedFaults, Precision: test.precision, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } })` $DIR/core/services/pipeline/task.mean_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.mean_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), test.inputs)` $DIR/core/services/pipeline/task.mean_test.go: `.Context(t)` $DIR/core/services/pipeline/task.mean_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.mean_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.mean_test.go: `.Run("with vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": inputs}, }) task := pipeline.MeanTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: "$(foo.bar)", AllowedFaults: test.allowedFaults, Precision: test.precision, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } })` $DIR/core/services/pipeline/task.mean_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": inputs}, })` $DIR/core/services/pipeline/task.mean_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.mean_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, nil)` $DIR/core/services/pipeline/task.mean_test.go: `.Context(t)` $DIR/core/services/pipeline/task.mean_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.mean_test.go: `.Run("with json vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } var valuesParam string var vars pipeline.Vars switch len(inputs) { case 0: valuesParam = "[]" vars = pipeline.NewVarsFrom(nil) case 1: valuesParam = "[ $(foo) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0]}) case 2: valuesParam = "[ $(foo), $(bar) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1]}) case 3: valuesParam = "[ $(foo), $(bar), $(chain) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2]}) case 4: valuesParam = "[ $(foo), $(bar), $(chain), $(link) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2], "link": inputs[3]}) } task := pipeline.MeanTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: valuesParam, AllowedFaults: test.allowedFaults, Precision: test.precision, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } })` $DIR/core/services/pipeline/task.mean_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.mean_test.go: `.NewVarsFrom(map[string]interface{}{"foo": inputs[0]})` $DIR/core/services/pipeline/task.mean_test.go: `.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1]})` $DIR/core/services/pipeline/task.mean_test.go: `.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2]})` $DIR/core/services/pipeline/task.mean_test.go: `.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2], "link": inputs[3]})` $DIR/core/services/pipeline/task.mean_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.mean_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, nil)` $DIR/core/services/pipeline/task.mean_test.go: `.Context(t)` $DIR/core/services/pipeline/task.mean_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.median_test.go: `t.Run(test.name, func(t *testing.T) { t.Run("without vars", func(t *testing.T) { task := pipeline.MedianTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } }) t.Run("with vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": inputs}, }) task := pipeline.MedianTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: "$(foo.bar)", AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } }) t.Run("with json vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } var valuesParam string var vars pipeline.Vars switch len(inputs) { case 0: valuesParam = "[]" vars = pipeline.NewVarsFrom(nil) case 1: valuesParam = "[ $(foo) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0]}) case 3: valuesParam = "[ $(foo), $(bar), $(chain) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2]}) case 4: valuesParam = "[ $(foo), $(bar), $(chain), $(link) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2], "link": inputs[3]}) } task := pipeline.MedianTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: valuesParam, AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } }) })` $DIR/core/services/pipeline/task.median_test.go: `t.Run("without vars", func(t *testing.T) { task := pipeline.MedianTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } })` $DIR/core/services/pipeline/task.median_test.go: `t.Run("with vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": inputs}, }) task := pipeline.MedianTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: "$(foo.bar)", AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } })` $DIR/core/services/pipeline/task.median_test.go: `inputs = append(inputs, input.Error)` $DIR/core/services/pipeline/task.median_test.go: `inputs = append(inputs, input.Value)` $DIR/core/services/pipeline/task.median_test.go: `t.Run("with json vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } var valuesParam string var vars pipeline.Vars switch len(inputs) { case 0: valuesParam = "[]" vars = pipeline.NewVarsFrom(nil) case 1: valuesParam = "[ $(foo) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0]}) case 3: valuesParam = "[ $(foo), $(bar), $(chain) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2]}) case 4: valuesParam = "[ $(foo), $(bar), $(chain), $(link) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2], "link": inputs[3]}) } task := pipeline.MedianTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: valuesParam, AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } })` $DIR/core/services/pipeline/task.median_test.go: `inputs = append(inputs, input.Error)` $DIR/core/services/pipeline/task.median_test.go: `inputs = append(inputs, input.Value)` $DIR/core/services/pipeline/task.median_test.go: `valuesParam = "[]"` $DIR/core/services/pipeline/task.median_test.go: `vars = pipeline.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.median_test.go: `valuesParam = "[ $(foo) ]"` $DIR/core/services/pipeline/task.median_test.go: `vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0]})` $DIR/core/services/pipeline/task.median_test.go: `valuesParam = "[ $(foo), $(bar), $(chain) ]"` $DIR/core/services/pipeline/task.median_test.go: `vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2]})` $DIR/core/services/pipeline/task.median_test.go: `valuesParam = "[ $(foo), $(bar), $(chain), $(link) ]"` $DIR/core/services/pipeline/task.median_test.go: `vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2], "link": inputs[3]})` $DIR/core/services/pipeline/task.median_test.go: `.New("")` $DIR/core/services/pipeline/task.median_test.go: `.New("")` $DIR/core/services/pipeline/task.median_test.go: `.New("")` $DIR/core/services/pipeline/task.median_test.go: `.New("")` $DIR/core/services/pipeline/task.median_test.go: `.New("")` $DIR/core/services/pipeline/task.median_test.go: `.New("")` $DIR/core/services/pipeline/task.median_test.go: `.New("")` $DIR/core/services/pipeline/task.median_test.go: `.New("")` $DIR/core/services/pipeline/task.median_test.go: `.New("")` $DIR/core/services/pipeline/task.median_test.go: `.New("")` $DIR/core/services/pipeline/task.median_test.go: `.New("")` $DIR/core/services/pipeline/task.median_test.go: `.New("")` $DIR/core/services/pipeline/task.median_test.go: `.New("")` $DIR/core/services/pipeline/task.median_test.go: `.New("")` $DIR/core/services/pipeline/task.median_test.go: `.Run(test.name, func(t *testing.T) { t.Run("without vars", func(t *testing.T) { task := pipeline.MedianTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } }) t.Run("with vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": inputs}, }) task := pipeline.MedianTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: "$(foo.bar)", AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } }) t.Run("with json vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } var valuesParam string var vars pipeline.Vars switch len(inputs) { case 0: valuesParam = "[]" vars = pipeline.NewVarsFrom(nil) case 1: valuesParam = "[ $(foo) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0]}) case 3: valuesParam = "[ $(foo), $(bar), $(chain) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2]}) case 4: valuesParam = "[ $(foo), $(bar), $(chain), $(link) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2], "link": inputs[3]}) } task := pipeline.MedianTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: valuesParam, AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } }) })` $DIR/core/services/pipeline/task.median_test.go: `.Run("without vars", func(t *testing.T) { task := pipeline.MedianTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } })` $DIR/core/services/pipeline/task.median_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.median_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), test.inputs)` $DIR/core/services/pipeline/task.median_test.go: `.Context(t)` $DIR/core/services/pipeline/task.median_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.median_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.median_test.go: `.Run("with vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": inputs}, }) task := pipeline.MedianTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: "$(foo.bar)", AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } })` $DIR/core/services/pipeline/task.median_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": inputs}, })` $DIR/core/services/pipeline/task.median_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.median_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, nil)` $DIR/core/services/pipeline/task.median_test.go: `.Context(t)` $DIR/core/services/pipeline/task.median_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.median_test.go: `.Run("with json vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } var valuesParam string var vars pipeline.Vars switch len(inputs) { case 0: valuesParam = "[]" vars = pipeline.NewVarsFrom(nil) case 1: valuesParam = "[ $(foo) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0]}) case 3: valuesParam = "[ $(foo), $(bar), $(chain) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2]}) case 4: valuesParam = "[ $(foo), $(bar), $(chain), $(link) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2], "link": inputs[3]}) } task := pipeline.MedianTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: valuesParam, AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } })` $DIR/core/services/pipeline/task.median_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.median_test.go: `.NewVarsFrom(map[string]interface{}{"foo": inputs[0]})` $DIR/core/services/pipeline/task.median_test.go: `.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2]})` $DIR/core/services/pipeline/task.median_test.go: `.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2], "link": inputs[3]})` $DIR/core/services/pipeline/task.median_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.median_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, nil)` $DIR/core/services/pipeline/task.median_test.go: `.Context(t)` $DIR/core/services/pipeline/task.median_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.median_test.go: `.Parse(` // data source 1 ds1 [type=bridge name=voter_turnout]; ds1_parse [type=jsonparse path="one,two"]; ds1_multiply [type=multiply times=1.23]; // data source 2 ds2 [type=http method=GET url="https://chain.link/voter_turnout/USA-2020" requestData=<{"hi": "hello"}>]; ds2_parse [type=jsonparse path="three,four"]; ds2_multiply [type=multiply times=4.56]; ds1 -> ds1_parse -> ds1_multiply -> answer1; ds2 -> ds2_parse -> ds2_multiply -> answer1; answer1 [type=median index=0 allowedFaults=10]; answer2 [type=bridge name=election_winner index=1]; `)` $DIR/core/services/pipeline/task.median_test.go: `.Type()` $DIR/core/services/pipeline/task.memo_test.go: `t.Run(test.name, func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) var value pipeline.ObjectParam err := value.UnmarshalPipelineParam(test.input) require.NoError(t, err) task := pipeline.MemoTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} result, _ := task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}}) require.NoError(t, result.Error) marshalledValue, err := result.Value.(pipeline.ObjectParam).Marshal() require.NoError(t, err) assert.Equal(t, test.output, marshalledValue) })` $DIR/core/services/pipeline/task.memo_test.go: `.Run(test.name, func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) var value pipeline.ObjectParam err := value.UnmarshalPipelineParam(test.input) require.NoError(t, err) task := pipeline.MemoTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} result, _ := task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}}) require.NoError(t, result.Error) marshalledValue, err := result.Value.(pipeline.ObjectParam).Marshal() require.NoError(t, err) assert.Equal(t, test.output, marshalledValue) })` $DIR/core/services/pipeline/task.memo_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.memo_test.go: `.UnmarshalPipelineParam(test.input)` $DIR/core/services/pipeline/task.memo_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.memo_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})` $DIR/core/services/pipeline/task.memo_test.go: `.Context(t)` $DIR/core/services/pipeline/task.memo_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.memo_test.go: `.Marshal()` $DIR/core/services/pipeline/task.merge_test.go: `t.Run(test.name, func(t *testing.T) { task := pipeline.MergeTask{ BaseTask: pipeline.NewBaseTask(0, "merge", nil, nil, 0), Left: test.left, Right: test.right, } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.wantError { if test.wantErrorContains != "" { require.Contains(t, result.Error.Error(), test.wantErrorContains) } require.Nil(t, result.Value) val, err := test.vars.Get("merge") require.Equal(t, pipeline.ErrKeypathNotFound, errors.Cause(err)) require.Nil(t, val) } else { assert.NoError(t, result.Error) assert.Equal(t, test.wantData, result.Value) } })` $DIR/core/services/pipeline/task.merge_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.merge_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.merge_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.merge_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.merge_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.merge_test.go: `.NewVarsFrom(map[string]interface{}{ "someInput": map[string]interface{}{ "foo": "baz", "qux": 99, "flibber": nil, }, })` $DIR/core/services/pipeline/task.merge_test.go: `.NewVarsFrom(map[string]interface{}{ "someInput": "this is a string", })` $DIR/core/services/pipeline/task.merge_test.go: `.NewVarsFrom(map[string]interface{}{ "someInput": "this is a string", })` $DIR/core/services/pipeline/task.merge_test.go: `.NewVarsFrom(map[string]interface{}{ "someInput": "this is a string", })` $DIR/core/services/pipeline/task.merge_test.go: `.Run(test.name, func(t *testing.T) { task := pipeline.MergeTask{ BaseTask: pipeline.NewBaseTask(0, "merge", nil, nil, 0), Left: test.left, Right: test.right, } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if test.wantError { if test.wantErrorContains != "" { require.Contains(t, result.Error.Error(), test.wantErrorContains) } require.Nil(t, result.Value) val, err := test.vars.Get("merge") require.Equal(t, pipeline.ErrKeypathNotFound, errors.Cause(err)) require.Nil(t, val) } else { assert.NoError(t, result.Error) assert.Equal(t, test.wantData, result.Value) } })` $DIR/core/services/pipeline/task.merge_test.go: `.NewBaseTask(0, "merge", nil, nil, 0)` $DIR/core/services/pipeline/task.merge_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs)` $DIR/core/services/pipeline/task.merge_test.go: `.Context(t)` $DIR/core/services/pipeline/task.merge_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.merge_test.go: `.vars.Get("merge")` $DIR/core/services/pipeline/task.mode_test.go: `t.Run(test.name, func(t *testing.T) { t.Run("without vars", func(t *testing.T) { task := pipeline.ModeTask{ BaseTask: pipeline.NewBaseTask(0, "mode", nil, nil, 0), AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.wantErrorCause, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, map[string]interface{}{ "results": test.wantResults, "occurrences": test.wantOccurrences, }, output.Value) require.NoError(t, output.Error) } }) t.Run("with vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": inputs}, }) task := pipeline.ModeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: "$(foo.bar)", AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.wantErrorCause, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, map[string]interface{}{ "results": test.wantResults, "occurrences": test.wantOccurrences, }, output.Value) require.NoError(t, output.Error) } }) t.Run("with json vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } var valuesParam string var vars pipeline.Vars switch len(inputs) { case 0: valuesParam = "[]" vars = pipeline.NewVarsFrom(nil) case 1: valuesParam = "[ $(foo) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0]}) case 3: valuesParam = "[ $(foo), $(bar), $(chain) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2]}) case 4: valuesParam = "[ $(foo), $(bar), $(chain), $(link) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2], "link": inputs[3]}) } task := pipeline.ModeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: valuesParam, AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.wantErrorCause, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, map[string]interface{}{ "results": test.wantResults, "occurrences": test.wantOccurrences, }, output.Value) require.NoError(t, output.Error) } }) })` $DIR/core/services/pipeline/task.mode_test.go: `t.Run("without vars", func(t *testing.T) { task := pipeline.ModeTask{ BaseTask: pipeline.NewBaseTask(0, "mode", nil, nil, 0), AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.wantErrorCause, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, map[string]interface{}{ "results": test.wantResults, "occurrences": test.wantOccurrences, }, output.Value) require.NoError(t, output.Error) } })` $DIR/core/services/pipeline/task.mode_test.go: `t.Run("with vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": inputs}, }) task := pipeline.ModeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: "$(foo.bar)", AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.wantErrorCause, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, map[string]interface{}{ "results": test.wantResults, "occurrences": test.wantOccurrences, }, output.Value) require.NoError(t, output.Error) } })` $DIR/core/services/pipeline/task.mode_test.go: `inputs = append(inputs, input.Error)` $DIR/core/services/pipeline/task.mode_test.go: `inputs = append(inputs, input.Value)` $DIR/core/services/pipeline/task.mode_test.go: `t.Run("with json vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } var valuesParam string var vars pipeline.Vars switch len(inputs) { case 0: valuesParam = "[]" vars = pipeline.NewVarsFrom(nil) case 1: valuesParam = "[ $(foo) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0]}) case 3: valuesParam = "[ $(foo), $(bar), $(chain) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2]}) case 4: valuesParam = "[ $(foo), $(bar), $(chain), $(link) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2], "link": inputs[3]}) } task := pipeline.ModeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: valuesParam, AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.wantErrorCause, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, map[string]interface{}{ "results": test.wantResults, "occurrences": test.wantOccurrences, }, output.Value) require.NoError(t, output.Error) } })` $DIR/core/services/pipeline/task.mode_test.go: `inputs = append(inputs, input.Error)` $DIR/core/services/pipeline/task.mode_test.go: `inputs = append(inputs, input.Value)` $DIR/core/services/pipeline/task.mode_test.go: `valuesParam = "[]"` $DIR/core/services/pipeline/task.mode_test.go: `vars = pipeline.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.mode_test.go: `valuesParam = "[ $(foo) ]"` $DIR/core/services/pipeline/task.mode_test.go: `vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0]})` $DIR/core/services/pipeline/task.mode_test.go: `valuesParam = "[ $(foo), $(bar), $(chain) ]"` $DIR/core/services/pipeline/task.mode_test.go: `vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2]})` $DIR/core/services/pipeline/task.mode_test.go: `valuesParam = "[ $(foo), $(bar), $(chain), $(link) ]"` $DIR/core/services/pipeline/task.mode_test.go: `vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2], "link": inputs[3]})` $DIR/core/services/pipeline/task.mode_test.go: `.New("")` $DIR/core/services/pipeline/task.mode_test.go: `.New("")` $DIR/core/services/pipeline/task.mode_test.go: `.New("")` $DIR/core/services/pipeline/task.mode_test.go: `.New("")` $DIR/core/services/pipeline/task.mode_test.go: `.New("")` $DIR/core/services/pipeline/task.mode_test.go: `.New("")` $DIR/core/services/pipeline/task.mode_test.go: `.New("")` $DIR/core/services/pipeline/task.mode_test.go: `.New("")` $DIR/core/services/pipeline/task.mode_test.go: `.NewInt(123)` $DIR/core/services/pipeline/task.mode_test.go: `.NewInt(123)` $DIR/core/services/pipeline/task.mode_test.go: `.NewInt(123)` $DIR/core/services/pipeline/task.mode_test.go: `.New("")` $DIR/core/services/pipeline/task.mode_test.go: `.New("")` $DIR/core/services/pipeline/task.mode_test.go: `.New("")` $DIR/core/services/pipeline/task.mode_test.go: `.New("")` $DIR/core/services/pipeline/task.mode_test.go: `.New("")` $DIR/core/services/pipeline/task.mode_test.go: `.New("")` $DIR/core/services/pipeline/task.mode_test.go: `.Run(test.name, func(t *testing.T) { t.Run("without vars", func(t *testing.T) { task := pipeline.ModeTask{ BaseTask: pipeline.NewBaseTask(0, "mode", nil, nil, 0), AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.wantErrorCause, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, map[string]interface{}{ "results": test.wantResults, "occurrences": test.wantOccurrences, }, output.Value) require.NoError(t, output.Error) } }) t.Run("with vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": inputs}, }) task := pipeline.ModeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: "$(foo.bar)", AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.wantErrorCause, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, map[string]interface{}{ "results": test.wantResults, "occurrences": test.wantOccurrences, }, output.Value) require.NoError(t, output.Error) } }) t.Run("with json vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } var valuesParam string var vars pipeline.Vars switch len(inputs) { case 0: valuesParam = "[]" vars = pipeline.NewVarsFrom(nil) case 1: valuesParam = "[ $(foo) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0]}) case 3: valuesParam = "[ $(foo), $(bar), $(chain) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2]}) case 4: valuesParam = "[ $(foo), $(bar), $(chain), $(link) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2], "link": inputs[3]}) } task := pipeline.ModeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: valuesParam, AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.wantErrorCause, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, map[string]interface{}{ "results": test.wantResults, "occurrences": test.wantOccurrences, }, output.Value) require.NoError(t, output.Error) } }) })` $DIR/core/services/pipeline/task.mode_test.go: `.Run("without vars", func(t *testing.T) { task := pipeline.ModeTask{ BaseTask: pipeline.NewBaseTask(0, "mode", nil, nil, 0), AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.wantErrorCause, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, map[string]interface{}{ "results": test.wantResults, "occurrences": test.wantOccurrences, }, output.Value) require.NoError(t, output.Error) } })` $DIR/core/services/pipeline/task.mode_test.go: `.NewBaseTask(0, "mode", nil, nil, 0)` $DIR/core/services/pipeline/task.mode_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), test.inputs)` $DIR/core/services/pipeline/task.mode_test.go: `.Context(t)` $DIR/core/services/pipeline/task.mode_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.mode_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.mode_test.go: `.Run("with vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": inputs}, }) task := pipeline.ModeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: "$(foo.bar)", AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.wantErrorCause, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, map[string]interface{}{ "results": test.wantResults, "occurrences": test.wantOccurrences, }, output.Value) require.NoError(t, output.Error) } })` $DIR/core/services/pipeline/task.mode_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": inputs}, })` $DIR/core/services/pipeline/task.mode_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.mode_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, nil)` $DIR/core/services/pipeline/task.mode_test.go: `.Context(t)` $DIR/core/services/pipeline/task.mode_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.mode_test.go: `.Run("with json vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } var valuesParam string var vars pipeline.Vars switch len(inputs) { case 0: valuesParam = "[]" vars = pipeline.NewVarsFrom(nil) case 1: valuesParam = "[ $(foo) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0]}) case 3: valuesParam = "[ $(foo), $(bar), $(chain) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2]}) case 4: valuesParam = "[ $(foo), $(bar), $(chain), $(link) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2], "link": inputs[3]}) } task := pipeline.ModeTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: valuesParam, AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.wantErrorCause, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, map[string]interface{}{ "results": test.wantResults, "occurrences": test.wantOccurrences, }, output.Value) require.NoError(t, output.Error) } })` $DIR/core/services/pipeline/task.mode_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.mode_test.go: `.NewVarsFrom(map[string]interface{}{"foo": inputs[0]})` $DIR/core/services/pipeline/task.mode_test.go: `.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2]})` $DIR/core/services/pipeline/task.mode_test.go: `.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2], "link": inputs[3]})` $DIR/core/services/pipeline/task.mode_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.mode_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, nil)` $DIR/core/services/pipeline/task.mode_test.go: `.Context(t)` $DIR/core/services/pipeline/task.mode_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.multiply_test.go: `t.Run(test.name, func(t *testing.T) { t.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.MultiplyTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Times: test.times} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) }) t.Run("without vars through input param", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.MultiplyTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: fmt.Sprintf("%v", test.input), Times: test.times, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, "chain": map[string]interface{}{"link": test.times}, }) task := pipeline.MultiplyTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", Times: "$(chain.link)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) })` $DIR/core/services/pipeline/task.multiply_test.go: `t.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.MultiplyTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Times: test.times} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) })` $DIR/core/services/pipeline/task.multiply_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}}))` $DIR/core/services/pipeline/task.multiply_test.go: `t.Run("without vars through input param", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.MultiplyTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: fmt.Sprintf("%v", test.input), Times: test.times, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.multiply_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{}))` $DIR/core/services/pipeline/task.multiply_test.go: `t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, "chain": map[string]interface{}{"link": test.times}, }) task := pipeline.MultiplyTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", Times: "$(chain.link)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.multiply_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{}))` $DIR/core/services/pipeline/task.multiply_test.go: `t.Run(test.name, func(t *testing.T) { task := pipeline.MultiplyTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: test.input, Times: test.times, } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) require.Equal(t, test.wantErrorCause, errors.Cause(result.Error)) if test.wantErrorContains != "" { require.Contains(t, result.Error.Error(), test.wantErrorContains) } })` $DIR/core/services/pipeline/task.multiply_test.go: `.Run(test.name, func(t *testing.T) { t.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.MultiplyTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Times: test.times} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) }) t.Run("without vars through input param", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.MultiplyTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: fmt.Sprintf("%v", test.input), Times: test.times, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, "chain": map[string]interface{}{"link": test.times}, }) task := pipeline.MultiplyTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", Times: "$(chain.link)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) })` $DIR/core/services/pipeline/task.multiply_test.go: `.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.MultiplyTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Times: test.times} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) })` $DIR/core/services/pipeline/task.multiply_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.multiply_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.multiply_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})` $DIR/core/services/pipeline/task.multiply_test.go: `.Context(t)` $DIR/core/services/pipeline/task.multiply_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.multiply_test.go: `.Run("without vars through input param", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.MultiplyTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: fmt.Sprintf("%v", test.input), Times: test.times, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.multiply_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.multiply_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.multiply_test.go: `.Sprintf("%v", test.input)` $DIR/core/services/pipeline/task.multiply_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})` $DIR/core/services/pipeline/task.multiply_test.go: `.Context(t)` $DIR/core/services/pipeline/task.multiply_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.multiply_test.go: `.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, "chain": map[string]interface{}{"link": test.times}, }) task := pipeline.MultiplyTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", Times: "$(chain.link)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.multiply_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, "chain": map[string]interface{}{"link": test.times}, })` $DIR/core/services/pipeline/task.multiply_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.multiply_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})` $DIR/core/services/pipeline/task.multiply_test.go: `.Context(t)` $DIR/core/services/pipeline/task.multiply_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.multiply_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.multiply_test.go: `.NewVarsFrom(map[string]interface{}{"foo": map[string]interface{}{"chain": "link"}})` $DIR/core/services/pipeline/task.multiply_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.multiply_test.go: `.NewVarsFrom(map[string]interface{}{"foo": []interface{}{"chain", "link"}})` $DIR/core/services/pipeline/task.multiply_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.multiply_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.multiply_test.go: `.Run(test.name, func(t *testing.T) { task := pipeline.MultiplyTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: test.input, Times: test.times, } result, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) require.Equal(t, test.wantErrorCause, errors.Cause(result.Error)) if test.wantErrorContains != "" { require.Contains(t, result.Error.Error(), test.wantErrorContains) } })` $DIR/core/services/pipeline/task.multiply_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.multiply_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), test.vars, test.inputs)` $DIR/core/services/pipeline/task.multiply_test.go: `.Context(t)` $DIR/core/services/pipeline/task.multiply_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.multiply_test.go: `.NewFromString("6.34e-1147483647")` $DIR/core/services/pipeline/task.multiply_test.go: `.NewFromString("6.34e-1147483647")` $DIR/core/services/pipeline/task.multiply_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.multiply_test.go: `.NewVarsFrom(map[string]interface{}{ "a": d1, "b": d2, })` $DIR/core/services/pipeline/task.multiply_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: "123"}})` $DIR/core/services/pipeline/task.multiply_test.go: `.Context(t)` $DIR/core/services/pipeline/task.multiply_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.multiply_test.go: `.Cause(result.Error)` $DIR/core/services/pipeline/task.sum_test.go: `t.Run(test.name, func(t *testing.T) { t.Run("without vars", func(t *testing.T) { task := pipeline.SumTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } }) t.Run("with vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": inputs}, }) task := pipeline.SumTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: "$(foo.bar)", AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } }) t.Run("with json vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } var valuesParam string var vars pipeline.Vars switch len(inputs) { case 0: valuesParam = "[]" vars = pipeline.NewVarsFrom(nil) case 1: valuesParam = "[ $(foo) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0]}) case 3: valuesParam = "[ $(foo), $(bar), $(chain) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2]}) case 4: valuesParam = "[ $(foo), $(bar), $(chain), $(link) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2], "link": inputs[3]}) } task := pipeline.SumTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: valuesParam, AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } }) })` $DIR/core/services/pipeline/task.sum_test.go: `t.Run("without vars", func(t *testing.T) { task := pipeline.SumTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } })` $DIR/core/services/pipeline/task.sum_test.go: `t.Run("with vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": inputs}, }) task := pipeline.SumTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: "$(foo.bar)", AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } })` $DIR/core/services/pipeline/task.sum_test.go: `inputs = append(inputs, input.Error)` $DIR/core/services/pipeline/task.sum_test.go: `inputs = append(inputs, input.Value)` $DIR/core/services/pipeline/task.sum_test.go: `t.Run("with json vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } var valuesParam string var vars pipeline.Vars switch len(inputs) { case 0: valuesParam = "[]" vars = pipeline.NewVarsFrom(nil) case 1: valuesParam = "[ $(foo) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0]}) case 3: valuesParam = "[ $(foo), $(bar), $(chain) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2]}) case 4: valuesParam = "[ $(foo), $(bar), $(chain), $(link) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2], "link": inputs[3]}) } task := pipeline.SumTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: valuesParam, AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } })` $DIR/core/services/pipeline/task.sum_test.go: `inputs = append(inputs, input.Error)` $DIR/core/services/pipeline/task.sum_test.go: `inputs = append(inputs, input.Value)` $DIR/core/services/pipeline/task.sum_test.go: `valuesParam = "[]"` $DIR/core/services/pipeline/task.sum_test.go: `vars = pipeline.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.sum_test.go: `valuesParam = "[ $(foo) ]"` $DIR/core/services/pipeline/task.sum_test.go: `vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0]})` $DIR/core/services/pipeline/task.sum_test.go: `valuesParam = "[ $(foo), $(bar), $(chain) ]"` $DIR/core/services/pipeline/task.sum_test.go: `vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2]})` $DIR/core/services/pipeline/task.sum_test.go: `valuesParam = "[ $(foo), $(bar), $(chain), $(link) ]"` $DIR/core/services/pipeline/task.sum_test.go: `vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2], "link": inputs[3]})` $DIR/core/services/pipeline/task.sum_test.go: `.New("")` $DIR/core/services/pipeline/task.sum_test.go: `.New("")` $DIR/core/services/pipeline/task.sum_test.go: `.New("")` $DIR/core/services/pipeline/task.sum_test.go: `.New("")` $DIR/core/services/pipeline/task.sum_test.go: `.New("")` $DIR/core/services/pipeline/task.sum_test.go: `.New("")` $DIR/core/services/pipeline/task.sum_test.go: `.New("")` $DIR/core/services/pipeline/task.sum_test.go: `.New("")` $DIR/core/services/pipeline/task.sum_test.go: `.New("")` $DIR/core/services/pipeline/task.sum_test.go: `.New("")` $DIR/core/services/pipeline/task.sum_test.go: `.New("")` $DIR/core/services/pipeline/task.sum_test.go: `.New("")` $DIR/core/services/pipeline/task.sum_test.go: `.New("")` $DIR/core/services/pipeline/task.sum_test.go: `.New("")` $DIR/core/services/pipeline/task.sum_test.go: `.Run(test.name, func(t *testing.T) { t.Run("without vars", func(t *testing.T) { task := pipeline.SumTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } }) t.Run("with vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": inputs}, }) task := pipeline.SumTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: "$(foo.bar)", AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } }) t.Run("with json vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } var valuesParam string var vars pipeline.Vars switch len(inputs) { case 0: valuesParam = "[]" vars = pipeline.NewVarsFrom(nil) case 1: valuesParam = "[ $(foo) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0]}) case 3: valuesParam = "[ $(foo), $(bar), $(chain) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2]}) case 4: valuesParam = "[ $(foo), $(bar), $(chain), $(link) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2], "link": inputs[3]}) } task := pipeline.SumTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: valuesParam, AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } }) })` $DIR/core/services/pipeline/task.sum_test.go: `.Run("without vars", func(t *testing.T) { task := pipeline.SumTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), test.inputs) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } })` $DIR/core/services/pipeline/task.sum_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.sum_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), pipeline.NewVarsFrom(nil), test.inputs)` $DIR/core/services/pipeline/task.sum_test.go: `.Context(t)` $DIR/core/services/pipeline/task.sum_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.sum_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.sum_test.go: `.Run("with vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": inputs}, }) task := pipeline.SumTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: "$(foo.bar)", AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } })` $DIR/core/services/pipeline/task.sum_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": inputs}, })` $DIR/core/services/pipeline/task.sum_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.sum_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, nil)` $DIR/core/services/pipeline/task.sum_test.go: `.Context(t)` $DIR/core/services/pipeline/task.sum_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.sum_test.go: `.Run("with json vars", func(t *testing.T) { var inputs []interface{} for _, input := range test.inputs { if input.Error != nil { inputs = append(inputs, input.Error) } else { inputs = append(inputs, input.Value) } } var valuesParam string var vars pipeline.Vars switch len(inputs) { case 0: valuesParam = "[]" vars = pipeline.NewVarsFrom(nil) case 1: valuesParam = "[ $(foo) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0]}) case 3: valuesParam = "[ $(foo), $(bar), $(chain) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2]}) case 4: valuesParam = "[ $(foo), $(bar), $(chain), $(link) ]" vars = pipeline.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2], "link": inputs[3]}) } task := pipeline.SumTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Values: valuesParam, AllowedFaults: test.allowedFaults, } output, runInfo := task.Run(testutils.Context(t), logger.TestLogger(t), vars, nil) assert.False(t, runInfo.IsPending) assert.False(t, runInfo.IsRetryable) if output.Error != nil { require.Equal(t, test.want.Error, errors.Cause(output.Error)) require.Nil(t, output.Value) } else { require.Equal(t, test.want.Value.(*decimal.Decimal).String(), output.Value.(decimal.Decimal).String()) require.NoError(t, output.Error) } })` $DIR/core/services/pipeline/task.sum_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.sum_test.go: `.NewVarsFrom(map[string]interface{}{"foo": inputs[0]})` $DIR/core/services/pipeline/task.sum_test.go: `.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2]})` $DIR/core/services/pipeline/task.sum_test.go: `.NewVarsFrom(map[string]interface{}{"foo": inputs[0], "bar": inputs[1], "chain": inputs[2], "link": inputs[3]})` $DIR/core/services/pipeline/task.sum_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.sum_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, nil)` $DIR/core/services/pipeline/task.sum_test.go: `.Context(t)` $DIR/core/services/pipeline/task.sum_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.uppercase_test.go: `t.Run(test.name, func(t *testing.T) { t.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.UppercaseTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) }) t.Run("without vars through input param", func(t *testing.T) { inputStr := fmt.Sprintf("%v", test.input) if inputStr == "" { // empty input parameter is indistinguishable from not providing it at all // in that case the task will use an input defined by the job DAG return } vars := pipeline.NewVarsFrom(nil) task := pipeline.UppercaseTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: inputStr, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.UppercaseTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) })` $DIR/core/services/pipeline/task.uppercase_test.go: `t.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.UppercaseTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) })` $DIR/core/services/pipeline/task.uppercase_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}}))` $DIR/core/services/pipeline/task.uppercase_test.go: `t.Run("without vars through input param", func(t *testing.T) { inputStr := fmt.Sprintf("%v", test.input) if inputStr == "" { // empty input parameter is indistinguishable from not providing it at all // in that case the task will use an input defined by the job DAG return } vars := pipeline.NewVarsFrom(nil) task := pipeline.UppercaseTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: inputStr, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.uppercase_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{}))` $DIR/core/services/pipeline/task.uppercase_test.go: `t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.UppercaseTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.uppercase_test.go: `assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{}))` $DIR/core/services/pipeline/task.uppercase_test.go: `.Run(test.name, func(t *testing.T) { t.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.UppercaseTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) }) t.Run("without vars through input param", func(t *testing.T) { inputStr := fmt.Sprintf("%v", test.input) if inputStr == "" { // empty input parameter is indistinguishable from not providing it at all // in that case the task will use an input defined by the job DAG return } vars := pipeline.NewVarsFrom(nil) task := pipeline.UppercaseTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: inputStr, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) t.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.UppercaseTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) }) })` $DIR/core/services/pipeline/task.uppercase_test.go: `.Run("without vars through job DAG", func(t *testing.T) { vars := pipeline.NewVarsFrom(nil) task := pipeline.UppercaseTask{BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0)} assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})) })` $DIR/core/services/pipeline/task.uppercase_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.uppercase_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.uppercase_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{{Value: test.input}})` $DIR/core/services/pipeline/task.uppercase_test.go: `.Context(t)` $DIR/core/services/pipeline/task.uppercase_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.uppercase_test.go: `.Run("without vars through input param", func(t *testing.T) { inputStr := fmt.Sprintf("%v", test.input) if inputStr == "" { // empty input parameter is indistinguishable from not providing it at all // in that case the task will use an input defined by the job DAG return } vars := pipeline.NewVarsFrom(nil) task := pipeline.UppercaseTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: inputStr, } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.uppercase_test.go: `.Sprintf("%v", test.input)` $DIR/core/services/pipeline/task.uppercase_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/task.uppercase_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.uppercase_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})` $DIR/core/services/pipeline/task.uppercase_test.go: `.Context(t)` $DIR/core/services/pipeline/task.uppercase_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task.uppercase_test.go: `.Run("with vars", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, }) task := pipeline.UppercaseTask{ BaseTask: pipeline.NewBaseTask(0, "task", nil, nil, 0), Input: "$(foo.bar)", } assertOK(task.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})) })` $DIR/core/services/pipeline/task.uppercase_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{"bar": test.input}, })` $DIR/core/services/pipeline/task.uppercase_test.go: `.NewBaseTask(0, "task", nil, nil, 0)` $DIR/core/services/pipeline/task.uppercase_test.go: `.Run(testutils.Context(t), logger.TestLogger(t), vars, []pipeline.Result{})` $DIR/core/services/pipeline/task.uppercase_test.go: `.Context(t)` $DIR/core/services/pipeline/task.uppercase_test.go: `.TestLogger(t)` $DIR/core/services/pipeline/task_object_params_test.go: `t.Run(test.name, func(t *testing.T) { var value pipeline.ObjectParam err := value.UnmarshalPipelineParam(test.input) require.NoError(t, err) marshalledValue, err := value.Marshal() require.NoError(t, err) assert.Equal(t, test.output, marshalledValue) })` $DIR/core/services/pipeline/task_object_params_test.go: `t.Run(test.name, func(t *testing.T) { marshalledValue, err := test.input.Marshal() require.NoError(t, err) assert.Equal(t, test.output, marshalledValue) })` $DIR/core/services/pipeline/task_object_params_test.go: `.New(173, -1)` $DIR/core/services/pipeline/task_object_params_test.go: `.NewInt(-17)` $DIR/core/services/pipeline/task_object_params_test.go: `.NewInt(29)` $DIR/core/services/pipeline/task_object_params_test.go: `.Run(test.name, func(t *testing.T) { var value pipeline.ObjectParam err := value.UnmarshalPipelineParam(test.input) require.NoError(t, err) marshalledValue, err := value.Marshal() require.NoError(t, err) assert.Equal(t, test.output, marshalledValue) })` $DIR/core/services/pipeline/task_object_params_test.go: `.UnmarshalPipelineParam(test.input)` $DIR/core/services/pipeline/task_object_params_test.go: `.Marshal()` $DIR/core/services/pipeline/task_object_params_test.go: `.Run(test.name, func(t *testing.T) { marshalledValue, err := test.input.Marshal() require.NoError(t, err) assert.Equal(t, test.output, marshalledValue) })` $DIR/core/services/pipeline/task_object_params_test.go: `.input.Marshal()` $DIR/core/services/pipeline/task_params_test.go: `t.Run(test.name, func(t *testing.T) { var p pipeline.StringParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) require.Equal(t, test.expected, p) })` $DIR/core/services/pipeline/task_params_test.go: `t.Run(test.name, func(t *testing.T) { var p pipeline.StringSliceParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) if test.expected != nil { require.Equal(t, test.expected, p) } })` $DIR/core/services/pipeline/task_params_test.go: `t.Run(test.name, func(t *testing.T) { var p pipeline.BytesParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) require.Equal(t, test.expected, p) })` $DIR/core/services/pipeline/task_params_test.go: `copy(addr[:], []byte("deadbeefdeadbeefdead"))` $DIR/core/services/pipeline/task_params_test.go: `t.Run(test.name, func(t *testing.T) { var p pipeline.AddressParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) if test.expected != nil { require.Equal(t, test.expected, p) } })` $DIR/core/services/pipeline/task_params_test.go: `t.Run(test.name, func(t *testing.T) { var p pipeline.AddressSliceParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) if test.expected != nil { require.Equal(t, test.expected, p) } })` $DIR/core/services/pipeline/task_params_test.go: `t.Run(test.name, func(t *testing.T) { var p pipeline.Uint64Param err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) if test.err == nil { require.Equal(t, test.expected, p) } })` $DIR/core/services/pipeline/task_params_test.go: `t.Run(test.name, func(t *testing.T) { var p pipeline.MaybeUint64Param err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) if err == nil { require.Equal(t, test.expected, p) } })` $DIR/core/services/pipeline/task_params_test.go: `t.Run(test.name, func(t *testing.T) { var p pipeline.MaybeBigIntParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) if test.err == nil { require.Equal(t, test.expected, p) } })` $DIR/core/services/pipeline/task_params_test.go: `t.Run(test.name, func(t *testing.T) { var p pipeline.MaybeInt32Param err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) require.Equal(t, test.expected, p) })` $DIR/core/services/pipeline/task_params_test.go: `t.Run(test.name, func(t *testing.T) { var p pipeline.BoolParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) require.Equal(t, test.expected, p) })` $DIR/core/services/pipeline/task_params_test.go: `t.Run(test.name, func(t *testing.T) { var p pipeline.DecimalParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) require.Equal(t, test.expected, p) })` $DIR/core/services/pipeline/task_params_test.go: `t.Run(test.name, func(t *testing.T) { var p pipeline.URLParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) require.Equal(t, test.expected, p) })` $DIR/core/services/pipeline/task_params_test.go: `t.Run(test.name, func(t *testing.T) { var p pipeline.MapParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) require.Equal(t, test.expected, p) })` $DIR/core/services/pipeline/task_params_test.go: `t.Run(test.name, func(t *testing.T) { var p pipeline.SliceParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) require.Equal(t, test.expected, p) })` $DIR/core/services/pipeline/task_params_test.go: `t.Run(test.name, func(t *testing.T) { var p pipeline.HashSliceParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) if test.expected != nil { require.Equal(t, test.expected, p) } })` $DIR/core/services/pipeline/task_params_test.go: `t.Run(test.name, func(t *testing.T) { var p pipeline.DecimalSliceParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) require.Equal(t, test.expected, p) })` $DIR/core/services/pipeline/task_params_test.go: `t.Run(test.name, func(t *testing.T) { var p pipeline.JSONPathParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) require.Equal(t, test.expected, p) })` $DIR/core/services/pipeline/task_params_test.go: `t.Run("calls getters in order until the first one that returns without ErrParameterEmpty", func(t *testing.T) { param := mocks.NewPipelineParamUnmarshaler(t) param.On("UnmarshalPipelineParam", mock.Anything).Return(nil) called := []int{} getters := []pipeline.GetterFunc{ func() (interface{}, error) { called = append(called, 0) return nil, errors.Wrap(pipeline.ErrParameterEmpty, "make sure it still notices when wrapped") }, func() (interface{}, error) { called = append(called, 1) return 123, nil }, func() (interface{}, error) { called = append(called, 2) return 123, nil }, } err := pipeline.ResolveParam(param, getters) require.NoError(t, err) require.Equal(t, []int{0, 1}, called) })` $DIR/core/services/pipeline/task_params_test.go: `param.On("UnmarshalPipelineParam", mock.Anything).Return(nil)` $DIR/core/services/pipeline/task_params_test.go: `called = append(called, 0)` $DIR/core/services/pipeline/task_params_test.go: `called = append(called, 1)` $DIR/core/services/pipeline/task_params_test.go: `called = append(called, 2)` $DIR/core/services/pipeline/task_params_test.go: `t.Run("returns any GetterFunc error that isn't ErrParameterEmpty", func(t *testing.T) { param := mocks.NewPipelineParamUnmarshaler(t) called := []int{} expectedErr := errors.New("some other issue") getters := []pipeline.GetterFunc{ func() (interface{}, error) { called = append(called, 0) return nil, expectedErr }, func() (interface{}, error) { called = append(called, 1) return 123, nil }, func() (interface{}, error) { called = append(called, 2) return 123, nil }, } err := pipeline.ResolveParam(param, getters) require.Equal(t, expectedErr, err) require.Equal(t, []int{0}, called) })` $DIR/core/services/pipeline/task_params_test.go: `called = append(called, 0)` $DIR/core/services/pipeline/task_params_test.go: `called = append(called, 1)` $DIR/core/services/pipeline/task_params_test.go: `called = append(called, 2)` $DIR/core/services/pipeline/task_params_test.go: `t.Run("calls UnmarshalPipelineParam with the value obtained from the GetterFuncs", func(t *testing.T) { expectedValue := 123 param := mocks.NewPipelineParamUnmarshaler(t) param.On("UnmarshalPipelineParam", expectedValue).Return(nil) getters := []pipeline.GetterFunc{ func() (interface{}, error) { return expectedValue, nil }, } err := pipeline.ResolveParam(param, getters) require.NoError(t, err) })` $DIR/core/services/pipeline/task_params_test.go: `param.On("UnmarshalPipelineParam", expectedValue).Return(nil)` $DIR/core/services/pipeline/task_params_test.go: `param.On("UnmarshalPipelineParam", expectedValue).Return(expectedErr)` $DIR/core/services/pipeline/task_params_test.go: `.StringParam("foo bar baz")` $DIR/core/services/pipeline/task_params_test.go: `.StringParam("foo bar baz")` $DIR/core/services/pipeline/task_params_test.go: `.StringParam("boz bar bap")` $DIR/core/services/pipeline/task_params_test.go: `.StringParam("boz bar bap")` $DIR/core/services/pipeline/task_params_test.go: `.StringParam("")` $DIR/core/services/pipeline/task_params_test.go: `.StringParam("")` $DIR/core/services/pipeline/task_params_test.go: `.StringParam("")` $DIR/core/services/pipeline/task_params_test.go: `.Run(test.name, func(t *testing.T) { var p pipeline.StringParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) require.Equal(t, test.expected, p) })` $DIR/core/services/pipeline/task_params_test.go: `.UnmarshalPipelineParam(test.input)` $DIR/core/services/pipeline/task_params_test.go: `.SliceParam([]interface{}{"foo", "bar", "baz"})` $DIR/core/services/pipeline/task_params_test.go: `.StringSliceParam(nil)` $DIR/core/services/pipeline/task_params_test.go: `.Run(test.name, func(t *testing.T) { var p pipeline.StringSliceParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) if test.expected != nil { require.Equal(t, test.expected, p) } })` $DIR/core/services/pipeline/task_params_test.go: `.UnmarshalPipelineParam(test.input)` $DIR/core/services/pipeline/task_params_test.go: `.BytesParam("foo bar baz")` $DIR/core/services/pipeline/task_params_test.go: `.BytesParam("foo bar baz")` $DIR/core/services/pipeline/task_params_test.go: `.BytesParam(nil)` $DIR/core/services/pipeline/task_params_test.go: `.BytesParam("0xh")` $DIR/core/services/pipeline/task_params_test.go: `.MustDecode("0xd3184d")` $DIR/core/services/pipeline/task_params_test.go: `.BytesParam(hexutil.MustDecode("0xd3184d"))` $DIR/core/services/pipeline/task_params_test.go: `.MustDecode("0xd3184d")` $DIR/core/services/pipeline/task_params_test.go: `.BytesParam("boz bar bap")` $DIR/core/services/pipeline/task_params_test.go: `.BytesParam("boz bar bap")` $DIR/core/services/pipeline/task_params_test.go: `.Run(test.name, func(t *testing.T) { var p pipeline.BytesParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) require.Equal(t, test.expected, p) })` $DIR/core/services/pipeline/task_params_test.go: `.UnmarshalPipelineParam(test.input)` $DIR/core/services/pipeline/task_params_test.go: `.AddressParam(common.HexToAddress("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef"))` $DIR/core/services/pipeline/task_params_test.go: `.HexToAddress("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef")` $DIR/core/services/pipeline/task_params_test.go: `.AddressParam(common.HexToAddress("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef"))` $DIR/core/services/pipeline/task_params_test.go: `.HexToAddress("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef")` $DIR/core/services/pipeline/task_params_test.go: `.Run(test.name, func(t *testing.T) { var p pipeline.AddressParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) if test.expected != nil { require.Equal(t, test.expected, p) } })` $DIR/core/services/pipeline/task_params_test.go: `.UnmarshalPipelineParam(test.input)` $DIR/core/services/pipeline/task_params_test.go: `.HexToAddress("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef")` $DIR/core/services/pipeline/task_params_test.go: `.HexToAddress("0xcafebabecafebabecafebabecafebabecafebabe")` $DIR/core/services/pipeline/task_params_test.go: `.String()` $DIR/core/services/pipeline/task_params_test.go: `.String()` $DIR/core/services/pipeline/task_params_test.go: `.String()` $DIR/core/services/pipeline/task_params_test.go: `.String()` $DIR/core/services/pipeline/task_params_test.go: `.AddressSliceParam(nil)` $DIR/core/services/pipeline/task_params_test.go: `.Run(test.name, func(t *testing.T) { var p pipeline.AddressSliceParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) if test.expected != nil { require.Equal(t, test.expected, p) } })` $DIR/core/services/pipeline/task_params_test.go: `.UnmarshalPipelineParam(test.input)` $DIR/core/services/pipeline/task_params_test.go: `.Uint64Param(123)` $DIR/core/services/pipeline/task_params_test.go: `.Uint64Param(123)` $DIR/core/services/pipeline/task_params_test.go: `.Uint64Param(123)` $DIR/core/services/pipeline/task_params_test.go: `.Uint64Param(123)` $DIR/core/services/pipeline/task_params_test.go: `.Uint64Param(123)` $DIR/core/services/pipeline/task_params_test.go: `.Uint64Param(123)` $DIR/core/services/pipeline/task_params_test.go: `.Uint64Param(123)` $DIR/core/services/pipeline/task_params_test.go: `.Uint64Param(123)` $DIR/core/services/pipeline/task_params_test.go: `.Uint64Param(123)` $DIR/core/services/pipeline/task_params_test.go: `.Uint64Param(123)` $DIR/core/services/pipeline/task_params_test.go: `.Uint64Param(123)` $DIR/core/services/pipeline/task_params_test.go: `.Uint64Param(123)` $DIR/core/services/pipeline/task_params_test.go: `.Uint64Param(0)` $DIR/core/services/pipeline/task_params_test.go: `.Uint64Param(0)` $DIR/core/services/pipeline/task_params_test.go: `.Uint64Param(0)` $DIR/core/services/pipeline/task_params_test.go: `.Uint64Param(0)` $DIR/core/services/pipeline/task_params_test.go: `.Uint64Param(0)` $DIR/core/services/pipeline/task_params_test.go: `.Uint64Param(0)` $DIR/core/services/pipeline/task_params_test.go: `.Uint64Param(0)` $DIR/core/services/pipeline/task_params_test.go: `.Uint64Param(0)` $DIR/core/services/pipeline/task_params_test.go: `.Run(test.name, func(t *testing.T) { var p pipeline.Uint64Param err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) if test.err == nil { require.Equal(t, test.expected, p) } })` $DIR/core/services/pipeline/task_params_test.go: `.UnmarshalPipelineParam(test.input)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeUint64Param(123, true)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeUint64Param(123, true)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeUint64Param(123, true)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeUint64Param(123, true)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeUint64Param(123, true)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeUint64Param(123, true)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeUint64Param(123, true)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeUint64Param(123, true)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeUint64Param(123, true)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeUint64Param(123, true)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeUint64Param(123, true)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeUint64Param(123, true)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeUint64Param(0, false)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeUint64Param(0, false)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeUint64Param(0, false)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeUint64Param(0, false)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeUint64Param(0, false)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeUint64Param(0, false)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeUint64Param(0, false)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeUint64Param(0, false)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeUint64Param(0, false)` $DIR/core/services/pipeline/task_params_test.go: `.Run(test.name, func(t *testing.T) { var p pipeline.MaybeUint64Param err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) if err == nil { require.Equal(t, test.expected, p) } })` $DIR/core/services/pipeline/task_params_test.go: `.UnmarshalPipelineParam(test.input)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeBigIntParam(big.NewInt(n))` $DIR/core/services/pipeline/task_params_test.go: `.NewInt(n)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeBigIntParam(nil)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeBigIntParam(nil)` $DIR/core/services/pipeline/task_params_test.go: `.NewInt(123)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeBigIntParam(nil)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeBigIntParam(nil)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeBigIntParam(nil)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeBigIntParam(nil)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeBigIntParam(nil)` $DIR/core/services/pipeline/task_params_test.go: `.Run(test.name, func(t *testing.T) { var p pipeline.MaybeBigIntParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) if test.err == nil { require.Equal(t, test.expected, p) } })` $DIR/core/services/pipeline/task_params_test.go: `.UnmarshalPipelineParam(test.input)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeInt32Param(123, true)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeInt32Param(123, true)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeInt32Param(123, true)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeInt32Param(123, true)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeInt32Param(123, true)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeInt32Param(123, true)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeInt32Param(123, true)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeInt32Param(123, true)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeInt32Param(123, true)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeInt32Param(123, true)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeInt32Param(123, true)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeInt32Param(123, true)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeInt32Param(0, false)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeInt32Param(0, false)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeInt32Param(0, false)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeInt32Param(0, false)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeInt32Param(0, false)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeInt32Param(0, false)` $DIR/core/services/pipeline/task_params_test.go: `.NewMaybeInt32Param(0, false)` $DIR/core/services/pipeline/task_params_test.go: `.Run(test.name, func(t *testing.T) { var p pipeline.MaybeInt32Param err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) require.Equal(t, test.expected, p) })` $DIR/core/services/pipeline/task_params_test.go: `.UnmarshalPipelineParam(test.input)` $DIR/core/services/pipeline/task_params_test.go: `.BoolParam(true)` $DIR/core/services/pipeline/task_params_test.go: `.BoolParam(false)` $DIR/core/services/pipeline/task_params_test.go: `.BoolParam(true)` $DIR/core/services/pipeline/task_params_test.go: `.BoolParam(false)` $DIR/core/services/pipeline/task_params_test.go: `.BoolParam(false)` $DIR/core/services/pipeline/task_params_test.go: `.BoolParam(true)` $DIR/core/services/pipeline/task_params_test.go: `.BoolParam(true)` $DIR/core/services/pipeline/task_params_test.go: `.Run(test.name, func(t *testing.T) { var p pipeline.BoolParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) require.Equal(t, test.expected, p) })` $DIR/core/services/pipeline/task_params_test.go: `.UnmarshalPipelineParam(test.input)` $DIR/core/services/pipeline/task_params_test.go: `.NewFromFloat(123.45)` $DIR/core/services/pipeline/task_params_test.go: `.DecimalParam(d)` $DIR/core/services/pipeline/task_params_test.go: `.DecimalParam(d)` $DIR/core/services/pipeline/task_params_test.go: `.DecimalParam(d)` $DIR/core/services/pipeline/task_params_test.go: `.DecimalParam(d)` $DIR/core/services/pipeline/task_params_test.go: `.DecimalParam(dNull)` $DIR/core/services/pipeline/task_params_test.go: `.DecimalParam(dNull)` $DIR/core/services/pipeline/task_params_test.go: `.DecimalParam(dNull)` $DIR/core/services/pipeline/task_params_test.go: `.Run(test.name, func(t *testing.T) { var p pipeline.DecimalParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) require.Equal(t, test.expected, p) })` $DIR/core/services/pipeline/task_params_test.go: `.UnmarshalPipelineParam(test.input)` $DIR/core/services/pipeline/task_params_test.go: `.ParseRequestURI("https://chain.link/foo?bar=sergey")` $DIR/core/services/pipeline/task_params_test.go: `.URLParam(*good)` $DIR/core/services/pipeline/task_params_test.go: `.URLParam(url.URL{})` $DIR/core/services/pipeline/task_params_test.go: `.URLParam(url.URL{})` $DIR/core/services/pipeline/task_params_test.go: `.Run(test.name, func(t *testing.T) { var p pipeline.URLParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) require.Equal(t, test.expected, p) })` $DIR/core/services/pipeline/task_params_test.go: `.UnmarshalPipelineParam(test.input)` $DIR/core/services/pipeline/task_params_test.go: `.MapParam(nil)` $DIR/core/services/pipeline/task_params_test.go: `.MapParam(nil)` $DIR/core/services/pipeline/task_params_test.go: `.MapParam(nil)` $DIR/core/services/pipeline/task_params_test.go: `.Run(test.name, func(t *testing.T) { var p pipeline.MapParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) require.Equal(t, test.expected, p) })` $DIR/core/services/pipeline/task_params_test.go: `.UnmarshalPipelineParam(test.input)` $DIR/core/services/pipeline/task_params_test.go: `.SliceParam([]interface{}{1, 2, 3})` $DIR/core/services/pipeline/task_params_test.go: `.SliceParam([]interface{}{float64(1), float64(2), float64(3)})` $DIR/core/services/pipeline/task_params_test.go: `.SliceParam([]interface{}{float64(1), float64(2), float64(3)})` $DIR/core/services/pipeline/task_params_test.go: `.SliceParam(nil)` $DIR/core/services/pipeline/task_params_test.go: `.SliceParam(nil)` $DIR/core/services/pipeline/task_params_test.go: `.Run(test.name, func(t *testing.T) { var p pipeline.SliceParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) require.Equal(t, test.expected, p) })` $DIR/core/services/pipeline/task_params_test.go: `.UnmarshalPipelineParam(test.input)` $DIR/core/services/pipeline/task_params_test.go: `.HexToHash("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef")` $DIR/core/services/pipeline/task_params_test.go: `.HexToHash("0xcafebabecafebabecafebabecafebabecafebabedeadbeefdeadbeefdeadbeef")` $DIR/core/services/pipeline/task_params_test.go: `.String()` $DIR/core/services/pipeline/task_params_test.go: `.String()` $DIR/core/services/pipeline/task_params_test.go: `.String()` $DIR/core/services/pipeline/task_params_test.go: `.String()` $DIR/core/services/pipeline/task_params_test.go: `.HashSliceParam(nil)` $DIR/core/services/pipeline/task_params_test.go: `.Run(test.name, func(t *testing.T) { var p pipeline.HashSliceParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) if test.expected != nil { require.Equal(t, test.expected, p) } })` $DIR/core/services/pipeline/task_params_test.go: `.UnmarshalPipelineParam(test.input)` $DIR/core/services/pipeline/task_params_test.go: `.New("bar")` $DIR/core/services/pipeline/task_params_test.go: `.FilterErrors()` $DIR/core/services/pipeline/task_params_test.go: `.DecimalSliceParam(nil)` $DIR/core/services/pipeline/task_params_test.go: `.DecimalSliceParam(nil)` $DIR/core/services/pipeline/task_params_test.go: `.DecimalSliceParam(nil)` $DIR/core/services/pipeline/task_params_test.go: `.Run(test.name, func(t *testing.T) { var p pipeline.DecimalSliceParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) require.Equal(t, test.expected, p) })` $DIR/core/services/pipeline/task_params_test.go: `.UnmarshalPipelineParam(test.input)` $DIR/core/services/pipeline/task_params_test.go: `.JSONPathParam(nil)` $DIR/core/services/pipeline/task_params_test.go: `.JSONPathParam(nil)` $DIR/core/services/pipeline/task_params_test.go: `.Run(test.name, func(t *testing.T) { var p pipeline.JSONPathParam err := p.UnmarshalPipelineParam(test.input) require.Equal(t, test.err, errors.Cause(err)) require.Equal(t, test.expected, p) })` $DIR/core/services/pipeline/task_params_test.go: `.UnmarshalPipelineParam(test.input)` $DIR/core/services/pipeline/task_params_test.go: `.Run("calls getters in order until the first one that returns without ErrParameterEmpty", func(t *testing.T) { param := mocks.NewPipelineParamUnmarshaler(t) param.On("UnmarshalPipelineParam", mock.Anything).Return(nil) called := []int{} getters := []pipeline.GetterFunc{ func() (interface{}, error) { called = append(called, 0) return nil, errors.Wrap(pipeline.ErrParameterEmpty, "make sure it still notices when wrapped") }, func() (interface{}, error) { called = append(called, 1) return 123, nil }, func() (interface{}, error) { called = append(called, 2) return 123, nil }, } err := pipeline.ResolveParam(param, getters) require.NoError(t, err) require.Equal(t, []int{0, 1}, called) })` $DIR/core/services/pipeline/task_params_test.go: `.NewPipelineParamUnmarshaler(t)` $DIR/core/services/pipeline/task_params_test.go: `.On("UnmarshalPipelineParam", mock.Anything)` $DIR/core/services/pipeline/task_params_test.go: `.Return(nil)` $DIR/core/services/pipeline/task_params_test.go: `.Wrap(pipeline.ErrParameterEmpty, "make sure it still notices when wrapped")` $DIR/core/services/pipeline/task_params_test.go: `.ResolveParam(param, getters)` $DIR/core/services/pipeline/task_params_test.go: `.Run("returns any GetterFunc error that isn't ErrParameterEmpty", func(t *testing.T) { param := mocks.NewPipelineParamUnmarshaler(t) called := []int{} expectedErr := errors.New("some other issue") getters := []pipeline.GetterFunc{ func() (interface{}, error) { called = append(called, 0) return nil, expectedErr }, func() (interface{}, error) { called = append(called, 1) return 123, nil }, func() (interface{}, error) { called = append(called, 2) return 123, nil }, } err := pipeline.ResolveParam(param, getters) require.Equal(t, expectedErr, err) require.Equal(t, []int{0}, called) })` $DIR/core/services/pipeline/task_params_test.go: `.NewPipelineParamUnmarshaler(t)` $DIR/core/services/pipeline/task_params_test.go: `.New("some other issue")` $DIR/core/services/pipeline/task_params_test.go: `.ResolveParam(param, getters)` $DIR/core/services/pipeline/task_params_test.go: `.Run("calls UnmarshalPipelineParam with the value obtained from the GetterFuncs", func(t *testing.T) { expectedValue := 123 param := mocks.NewPipelineParamUnmarshaler(t) param.On("UnmarshalPipelineParam", expectedValue).Return(nil) getters := []pipeline.GetterFunc{ func() (interface{}, error) { return expectedValue, nil }, } err := pipeline.ResolveParam(param, getters) require.NoError(t, err) })` $DIR/core/services/pipeline/task_params_test.go: `.NewPipelineParamUnmarshaler(t)` $DIR/core/services/pipeline/task_params_test.go: `.On("UnmarshalPipelineParam", expectedValue)` $DIR/core/services/pipeline/task_params_test.go: `.Return(nil)` $DIR/core/services/pipeline/task_params_test.go: `.ResolveParam(param, getters)` $DIR/core/services/pipeline/task_params_test.go: `.New("some issue")` $DIR/core/services/pipeline/task_params_test.go: `.NewPipelineParamUnmarshaler(t)` $DIR/core/services/pipeline/task_params_test.go: `.On("UnmarshalPipelineParam", expectedValue)` $DIR/core/services/pipeline/task_params_test.go: `.Return(expectedErr)` $DIR/core/services/pipeline/task_params_test.go: `.ResolveParam(param, getters)` $DIR/core/services/pipeline/variables_test.go: `err = vars.Set(" ", "foo")` $DIR/core/services/pipeline/variables_test.go: `err = vars.Set("x.y", "foo")` $DIR/core/services/pipeline/variables_test.go: `t.Run("gets the values at keypaths that exist", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": []interface{}{1, "bar", false}, "bar": 321, }) got, err := vars.Get("foo.1") require.NoError(t, err) require.Equal(t, "bar", got) got, err = vars.Get("bar") require.NoError(t, err) require.Equal(t, 321, got) })` $DIR/core/services/pipeline/variables_test.go: `got, err = vars.Get("bar")` $DIR/core/services/pipeline/variables_test.go: `t.Run("gets the value for a keypath with more than 2 parts", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{ "bar": map[string]interface{}{ "chainlink": 123, }, }, }) got, err := vars.Get("foo.bar.chainlink") require.NoError(t, err) require.Equal(t, 123, got) })` $DIR/core/services/pipeline/variables_test.go: `t.Run("gets the value with indices in the keypath", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": []interface{}{ nil, map[string]interface{}{ "chainlink": 456, }, }, }) got, err := vars.Get("foo.1.chainlink") require.NoError(t, err) require.Equal(t, 456, got) })` $DIR/core/services/pipeline/variables_test.go: `t.Run("errors when getting the values at keypaths that don't exist", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": []interface{}{1, "bar", false}, "bar": 321, }) _, err := vars.Get("foo.blah") require.Equal(t, pipeline.ErrKeypathNotFound, errors.Cause(err)) })` $DIR/core/services/pipeline/variables_test.go: `t.Run("errors when getting a value at a keypath where the first part is not a map/slice", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": 123, }) _, err := vars.Get("foo.bar") require.Equal(t, pipeline.ErrKeypathNotFound, errors.Cause(err)) })` $DIR/core/services/pipeline/variables_test.go: `t.Run("errors when getting a value at a keypath where the second part is not a map/slice", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{ "bar": 123, }, }) _, err := vars.Get("foo.bar.baz") require.Equal(t, pipeline.ErrKeypathNotFound, errors.Cause(err)) })` $DIR/core/services/pipeline/variables_test.go: `t.Run("errors when using a keypath with empty segments", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{ "bar": 123, }, }) _, err := vars.Get("foo..bar") require.Equal(t, pipeline.ErrWrongKeypath, errors.Cause(err)) })` $DIR/core/services/pipeline/variables_test.go: `_, err = vars.Get("foo.-1")` $DIR/core/services/pipeline/variables_test.go: `.NewVarsFrom(nil)` $DIR/core/services/pipeline/variables_test.go: `.Set("xyz", "foo")` $DIR/core/services/pipeline/variables_test.go: `.Get("xyz")` $DIR/core/services/pipeline/variables_test.go: `.Set(" ", "foo")` $DIR/core/services/pipeline/variables_test.go: `.Set("x.y", "foo")` $DIR/core/services/pipeline/variables_test.go: `.Run("gets the values at keypaths that exist", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": []interface{}{1, "bar", false}, "bar": 321, }) got, err := vars.Get("foo.1") require.NoError(t, err) require.Equal(t, "bar", got) got, err = vars.Get("bar") require.NoError(t, err) require.Equal(t, 321, got) })` $DIR/core/services/pipeline/variables_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": []interface{}{1, "bar", false}, "bar": 321, })` $DIR/core/services/pipeline/variables_test.go: `.Get("foo.1")` $DIR/core/services/pipeline/variables_test.go: `.Get("bar")` $DIR/core/services/pipeline/variables_test.go: `.Run("gets the value for a keypath with more than 2 parts", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{ "bar": map[string]interface{}{ "chainlink": 123, }, }, }) got, err := vars.Get("foo.bar.chainlink") require.NoError(t, err) require.Equal(t, 123, got) })` $DIR/core/services/pipeline/variables_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{ "bar": map[string]interface{}{ "chainlink": 123, }, }, })` $DIR/core/services/pipeline/variables_test.go: `.Get("foo.bar.chainlink")` $DIR/core/services/pipeline/variables_test.go: `.Run("gets the value with indices in the keypath", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": []interface{}{ nil, map[string]interface{}{ "chainlink": 456, }, }, }) got, err := vars.Get("foo.1.chainlink") require.NoError(t, err) require.Equal(t, 456, got) })` $DIR/core/services/pipeline/variables_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": []interface{}{ nil, map[string]interface{}{ "chainlink": 456, }, }, })` $DIR/core/services/pipeline/variables_test.go: `.Get("foo.1.chainlink")` $DIR/core/services/pipeline/variables_test.go: `.Run("errors when getting the values at keypaths that don't exist", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": []interface{}{1, "bar", false}, "bar": 321, }) _, err := vars.Get("foo.blah") require.Equal(t, pipeline.ErrKeypathNotFound, errors.Cause(err)) })` $DIR/core/services/pipeline/variables_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": []interface{}{1, "bar", false}, "bar": 321, })` $DIR/core/services/pipeline/variables_test.go: `.Get("foo.blah")` $DIR/core/services/pipeline/variables_test.go: `.Run("errors when getting a value at a keypath where the first part is not a map/slice", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": 123, }) _, err := vars.Get("foo.bar") require.Equal(t, pipeline.ErrKeypathNotFound, errors.Cause(err)) })` $DIR/core/services/pipeline/variables_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": 123, })` $DIR/core/services/pipeline/variables_test.go: `.Get("foo.bar")` $DIR/core/services/pipeline/variables_test.go: `.Run("errors when getting a value at a keypath where the second part is not a map/slice", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{ "bar": 123, }, }) _, err := vars.Get("foo.bar.baz") require.Equal(t, pipeline.ErrKeypathNotFound, errors.Cause(err)) })` $DIR/core/services/pipeline/variables_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{ "bar": 123, }, })` $DIR/core/services/pipeline/variables_test.go: `.Get("foo.bar.baz")` $DIR/core/services/pipeline/variables_test.go: `.Run("errors when using a keypath with empty segments", func(t *testing.T) { vars := pipeline.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{ "bar": 123, }, }) _, err := vars.Get("foo..bar") require.Equal(t, pipeline.ErrWrongKeypath, errors.Cause(err)) })` $DIR/core/services/pipeline/variables_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": map[string]interface{}{ "bar": 123, }, })` $DIR/core/services/pipeline/variables_test.go: `.Get("foo..bar")` $DIR/core/services/pipeline/variables_test.go: `.NewVarsFrom(map[string]interface{}{ "foo": []interface{}{1, "bar", false}, })` $DIR/core/services/pipeline/variables_test.go: `.Get("foo.4")` $DIR/core/services/pipeline/variables_test.go: `.Get("foo.-1")` $DIR/core/services/pipeline/variables_test.go: `.NewVarsFrom(map[string]interface{}{ "nested": map[string]interface{}{ "foo": "zet", }, "bar": 321, })` $DIR/core/services/pipeline/variables_test.go: `.Copy()` $DIR/core/services/promreporter/prom_reporter_test.go: `t.Run("with nothing in the database", func(t *testing.T) { db := pgtest.NewSqlxDB(t) backend := mocks.NewPrometheusBackend(t) reporter := promreporter.NewPromReporter(db, newLegacyChainContainer(t, db), logger.TestLogger(t), backend, 10*time.Millisecond) var subscribeCalls atomic.Int32 backend.On("SetUnconfirmedTransactions", big.NewInt(0), int64(0)).Return() backend.On("SetMaxUnconfirmedAge", big.NewInt(0), float64(0)).Return() backend.On("SetMaxUnconfirmedBlocks", big.NewInt(0), int64(0)).Return() backend.On("SetPipelineTaskRunsQueued", 0).Return() backend.On("SetPipelineRunsQueued", 0). Run(func(args mock.Arguments) { subscribeCalls.Add(1) }). Return() servicetest.Run(t, reporter) head := newHead() reporter.OnNewLongestChain(testutils.Context(t), &head) require.Eventually(t, func() bool { return subscribeCalls.Load() >= 1 }, 12*time.Second, 100*time.Millisecond) })` $DIR/core/services/promreporter/prom_reporter_test.go: `backend.On("SetUnconfirmedTransactions", big.NewInt(0), int64(0)).Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `backend.On("SetMaxUnconfirmedAge", big.NewInt(0), float64(0)).Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `backend.On("SetMaxUnconfirmedBlocks", big.NewInt(0), int64(0)).Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `backend.On("SetPipelineTaskRunsQueued", 0).Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `backend.On("SetPipelineRunsQueued", 0). Run(func(args mock.Arguments) { subscribeCalls.Add(1) }). Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `subscribeCalls.Add(1)` $DIR/core/services/promreporter/prom_reporter_test.go: `servicetest.Run(t, reporter)` $DIR/core/services/promreporter/prom_reporter_test.go: `reporter.OnNewLongestChain(testutils.Context(t), &head)` $DIR/core/services/promreporter/prom_reporter_test.go: `t.Run("with unconfirmed evm.txes", func(t *testing.T) { db := pgtest.NewSqlxDB(t) txStore := cltest.NewTestTxStore(t, db) ethKeyStore := cltest.NewKeyStore(t, db).Eth() _, fromAddress := cltest.MustInsertRandomKey(t, ethKeyStore) var subscribeCalls atomic.Int32 backend := mocks.NewPrometheusBackend(t) backend.On("SetUnconfirmedTransactions", big.NewInt(0), int64(3)).Return() backend.On("SetMaxUnconfirmedAge", big.NewInt(0), mock.MatchedBy(func(s float64) bool { return s > 0 })).Return() backend.On("SetMaxUnconfirmedBlocks", big.NewInt(0), int64(35)).Return() backend.On("SetPipelineTaskRunsQueued", 0).Return() backend.On("SetPipelineRunsQueued", 0). Run(func(args mock.Arguments) { subscribeCalls.Add(1) }). Return() reporter := promreporter.NewPromReporter(db, newLegacyChainContainer(t, db), logger.TestLogger(t), backend, 10*time.Millisecond) servicetest.Run(t, reporter) etx := cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 0, fromAddress) cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 1, fromAddress) cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 2, fromAddress) require.NoError(t, txStore.UpdateTxAttemptBroadcastBeforeBlockNum(testutils.Context(t), etx.ID, 7)) head := newHead() reporter.OnNewLongestChain(testutils.Context(t), &head) require.Eventually(t, func() bool { return subscribeCalls.Load() >= 1 }, 12*time.Second, 100*time.Millisecond) })` $DIR/core/services/promreporter/prom_reporter_test.go: `backend.On("SetUnconfirmedTransactions", big.NewInt(0), int64(3)).Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `backend.On("SetMaxUnconfirmedAge", big.NewInt(0), mock.MatchedBy(func(s float64) bool { return s > 0 })).Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `backend.On("SetMaxUnconfirmedBlocks", big.NewInt(0), int64(35)).Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `backend.On("SetPipelineTaskRunsQueued", 0).Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `backend.On("SetPipelineRunsQueued", 0). Run(func(args mock.Arguments) { subscribeCalls.Add(1) }). Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `subscribeCalls.Add(1)` $DIR/core/services/promreporter/prom_reporter_test.go: `servicetest.Run(t, reporter)` $DIR/core/services/promreporter/prom_reporter_test.go: `cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 1, fromAddress)` $DIR/core/services/promreporter/prom_reporter_test.go: `cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 2, fromAddress)` $DIR/core/services/promreporter/prom_reporter_test.go: `reporter.OnNewLongestChain(testutils.Context(t), &head)` $DIR/core/services/promreporter/prom_reporter_test.go: `pgtest.MustExec(t, db, `SET CONSTRAINTS pipeline_task_runs_pipeline_run_id_fkey DEFERRED`)` $DIR/core/services/promreporter/prom_reporter_test.go: `cltest.MustInsertUnfinishedPipelineTaskRun(t, db, 1)` $DIR/core/services/promreporter/prom_reporter_test.go: `cltest.MustInsertUnfinishedPipelineTaskRun(t, db, 1)` $DIR/core/services/promreporter/prom_reporter_test.go: `cltest.MustInsertUnfinishedPipelineTaskRun(t, db, 2)` $DIR/core/services/promreporter/prom_reporter_test.go: `backend.On("SetUnconfirmedTransactions", big.NewInt(0), int64(0)).Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `backend.On("SetMaxUnconfirmedAge", big.NewInt(0), float64(0)).Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `backend.On("SetMaxUnconfirmedBlocks", big.NewInt(0), int64(0)).Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `backend.On("SetPipelineTaskRunsQueued", 3).Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `backend.On("SetPipelineRunsQueued", 2). Run(func(args mock.Arguments) { subscribeCalls.Add(1) }). Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `subscribeCalls.Add(1)` $DIR/core/services/promreporter/prom_reporter_test.go: `servicetest.Run(t, reporter)` $DIR/core/services/promreporter/prom_reporter_test.go: `reporter.OnNewLongestChain(testutils.Context(t), &head)` $DIR/core/services/promreporter/prom_reporter_test.go: `.Run("with nothing in the database", func(t *testing.T) { db := pgtest.NewSqlxDB(t) backend := mocks.NewPrometheusBackend(t) reporter := promreporter.NewPromReporter(db, newLegacyChainContainer(t, db), logger.TestLogger(t), backend, 10*time.Millisecond) var subscribeCalls atomic.Int32 backend.On("SetUnconfirmedTransactions", big.NewInt(0), int64(0)).Return() backend.On("SetMaxUnconfirmedAge", big.NewInt(0), float64(0)).Return() backend.On("SetMaxUnconfirmedBlocks", big.NewInt(0), int64(0)).Return() backend.On("SetPipelineTaskRunsQueued", 0).Return() backend.On("SetPipelineRunsQueued", 0). Run(func(args mock.Arguments) { subscribeCalls.Add(1) }). Return() servicetest.Run(t, reporter) head := newHead() reporter.OnNewLongestChain(testutils.Context(t), &head) require.Eventually(t, func() bool { return subscribeCalls.Load() >= 1 }, 12*time.Second, 100*time.Millisecond) })` $DIR/core/services/promreporter/prom_reporter_test.go: `.NewSqlxDB(t)` $DIR/core/services/promreporter/prom_reporter_test.go: `.NewPrometheusBackend(t)` $DIR/core/services/promreporter/prom_reporter_test.go: `.NewPromReporter(db, newLegacyChainContainer(t, db), logger.TestLogger(t), backend, 10*time.Millisecond)` $DIR/core/services/promreporter/prom_reporter_test.go: `.TestLogger(t)` $DIR/core/services/promreporter/prom_reporter_test.go: `.On("SetUnconfirmedTransactions", big.NewInt(0), int64(0))` $DIR/core/services/promreporter/prom_reporter_test.go: `.NewInt(0)` $DIR/core/services/promreporter/prom_reporter_test.go: `.Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `.On("SetMaxUnconfirmedAge", big.NewInt(0), float64(0))` $DIR/core/services/promreporter/prom_reporter_test.go: `.NewInt(0)` $DIR/core/services/promreporter/prom_reporter_test.go: `.Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `.On("SetMaxUnconfirmedBlocks", big.NewInt(0), int64(0))` $DIR/core/services/promreporter/prom_reporter_test.go: `.NewInt(0)` $DIR/core/services/promreporter/prom_reporter_test.go: `.Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `.On("SetPipelineTaskRunsQueued", 0)` $DIR/core/services/promreporter/prom_reporter_test.go: `.Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `.On("SetPipelineRunsQueued", 0)` $DIR/core/services/promreporter/prom_reporter_test.go: `. Run(func(args mock.Arguments) { subscribeCalls.Add(1) })` $DIR/core/services/promreporter/prom_reporter_test.go: `.Add(1)` $DIR/core/services/promreporter/prom_reporter_test.go: `. Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `.Run(t, reporter)` $DIR/core/services/promreporter/prom_reporter_test.go: `.OnNewLongestChain(testutils.Context(t), &head)` $DIR/core/services/promreporter/prom_reporter_test.go: `.Context(t)` $DIR/core/services/promreporter/prom_reporter_test.go: `.Run("with unconfirmed evm.txes", func(t *testing.T) { db := pgtest.NewSqlxDB(t) txStore := cltest.NewTestTxStore(t, db) ethKeyStore := cltest.NewKeyStore(t, db).Eth() _, fromAddress := cltest.MustInsertRandomKey(t, ethKeyStore) var subscribeCalls atomic.Int32 backend := mocks.NewPrometheusBackend(t) backend.On("SetUnconfirmedTransactions", big.NewInt(0), int64(3)).Return() backend.On("SetMaxUnconfirmedAge", big.NewInt(0), mock.MatchedBy(func(s float64) bool { return s > 0 })).Return() backend.On("SetMaxUnconfirmedBlocks", big.NewInt(0), int64(35)).Return() backend.On("SetPipelineTaskRunsQueued", 0).Return() backend.On("SetPipelineRunsQueued", 0). Run(func(args mock.Arguments) { subscribeCalls.Add(1) }). Return() reporter := promreporter.NewPromReporter(db, newLegacyChainContainer(t, db), logger.TestLogger(t), backend, 10*time.Millisecond) servicetest.Run(t, reporter) etx := cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 0, fromAddress) cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 1, fromAddress) cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 2, fromAddress) require.NoError(t, txStore.UpdateTxAttemptBroadcastBeforeBlockNum(testutils.Context(t), etx.ID, 7)) head := newHead() reporter.OnNewLongestChain(testutils.Context(t), &head) require.Eventually(t, func() bool { return subscribeCalls.Load() >= 1 }, 12*time.Second, 100*time.Millisecond) })` $DIR/core/services/promreporter/prom_reporter_test.go: `.NewSqlxDB(t)` $DIR/core/services/promreporter/prom_reporter_test.go: `.NewTestTxStore(t, db)` $DIR/core/services/promreporter/prom_reporter_test.go: `.NewKeyStore(t, db)` $DIR/core/services/promreporter/prom_reporter_test.go: `.Eth()` $DIR/core/services/promreporter/prom_reporter_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/services/promreporter/prom_reporter_test.go: `.NewPrometheusBackend(t)` $DIR/core/services/promreporter/prom_reporter_test.go: `.On("SetUnconfirmedTransactions", big.NewInt(0), int64(3))` $DIR/core/services/promreporter/prom_reporter_test.go: `.NewInt(0)` $DIR/core/services/promreporter/prom_reporter_test.go: `.Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `.On("SetMaxUnconfirmedAge", big.NewInt(0), mock.MatchedBy(func(s float64) bool { return s > 0 }))` $DIR/core/services/promreporter/prom_reporter_test.go: `.NewInt(0)` $DIR/core/services/promreporter/prom_reporter_test.go: `.MatchedBy(func(s float64) bool { return s > 0 })` $DIR/core/services/promreporter/prom_reporter_test.go: `.Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `.On("SetMaxUnconfirmedBlocks", big.NewInt(0), int64(35))` $DIR/core/services/promreporter/prom_reporter_test.go: `.NewInt(0)` $DIR/core/services/promreporter/prom_reporter_test.go: `.Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `.On("SetPipelineTaskRunsQueued", 0)` $DIR/core/services/promreporter/prom_reporter_test.go: `.Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `.On("SetPipelineRunsQueued", 0)` $DIR/core/services/promreporter/prom_reporter_test.go: `. Run(func(args mock.Arguments) { subscribeCalls.Add(1) })` $DIR/core/services/promreporter/prom_reporter_test.go: `.Add(1)` $DIR/core/services/promreporter/prom_reporter_test.go: `. Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `.NewPromReporter(db, newLegacyChainContainer(t, db), logger.TestLogger(t), backend, 10*time.Millisecond)` $DIR/core/services/promreporter/prom_reporter_test.go: `.TestLogger(t)` $DIR/core/services/promreporter/prom_reporter_test.go: `.Run(t, reporter)` $DIR/core/services/promreporter/prom_reporter_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 0, fromAddress)` $DIR/core/services/promreporter/prom_reporter_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 1, fromAddress)` $DIR/core/services/promreporter/prom_reporter_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 2, fromAddress)` $DIR/core/services/promreporter/prom_reporter_test.go: `.OnNewLongestChain(testutils.Context(t), &head)` $DIR/core/services/promreporter/prom_reporter_test.go: `.Context(t)` $DIR/core/services/promreporter/prom_reporter_test.go: `.NewSqlxDB(t)` $DIR/core/services/promreporter/prom_reporter_test.go: `.MustExec(t, db, `SET CONSTRAINTS pipeline_task_runs_pipeline_run_id_fkey DEFERRED`)` $DIR/core/services/promreporter/prom_reporter_test.go: `.NewPrometheusBackend(t)` $DIR/core/services/promreporter/prom_reporter_test.go: `.NewPromReporter(db, newLegacyChainContainer(t, db), logger.TestLogger(t), backend, 10*time.Millisecond)` $DIR/core/services/promreporter/prom_reporter_test.go: `.TestLogger(t)` $DIR/core/services/promreporter/prom_reporter_test.go: `.MustInsertUnfinishedPipelineTaskRun(t, db, 1)` $DIR/core/services/promreporter/prom_reporter_test.go: `.MustInsertUnfinishedPipelineTaskRun(t, db, 1)` $DIR/core/services/promreporter/prom_reporter_test.go: `.MustInsertUnfinishedPipelineTaskRun(t, db, 2)` $DIR/core/services/promreporter/prom_reporter_test.go: `.On("SetUnconfirmedTransactions", big.NewInt(0), int64(0))` $DIR/core/services/promreporter/prom_reporter_test.go: `.NewInt(0)` $DIR/core/services/promreporter/prom_reporter_test.go: `.Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `.On("SetMaxUnconfirmedAge", big.NewInt(0), float64(0))` $DIR/core/services/promreporter/prom_reporter_test.go: `.NewInt(0)` $DIR/core/services/promreporter/prom_reporter_test.go: `.Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `.On("SetMaxUnconfirmedBlocks", big.NewInt(0), int64(0))` $DIR/core/services/promreporter/prom_reporter_test.go: `.NewInt(0)` $DIR/core/services/promreporter/prom_reporter_test.go: `.Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `.On("SetPipelineTaskRunsQueued", 3)` $DIR/core/services/promreporter/prom_reporter_test.go: `.Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `.On("SetPipelineRunsQueued", 2)` $DIR/core/services/promreporter/prom_reporter_test.go: `. Run(func(args mock.Arguments) { subscribeCalls.Add(1) })` $DIR/core/services/promreporter/prom_reporter_test.go: `.Add(1)` $DIR/core/services/promreporter/prom_reporter_test.go: `. Return()` $DIR/core/services/promreporter/prom_reporter_test.go: `.Run(t, reporter)` $DIR/core/services/promreporter/prom_reporter_test.go: `.OnNewLongestChain(testutils.Context(t), &head)` $DIR/core/services/promreporter/prom_reporter_test.go: `.Context(t)` $DIR/core/services/relay/evm/cap_encoder_test.go: `wrapped, err = values.NewMap(input)` $DIR/core/services/relay/evm/cap_encoder_test.go: `wrapped, err = values.NewMap(input)` $DIR/core/services/relay/evm/cap_encoder_test.go: `wrapped, err = values.NewMap(input)` $DIR/core/services/relay/evm/cap_encoder_test.go: `wrapped, err = values.NewMap(input)` $DIR/core/services/relay/evm/cap_encoder_test.go: `wrapped, err = values.NewMap(input)` $DIR/core/services/relay/evm/cap_encoder_test.go: `_, err = enc.Encode(testutils.Context(t), *wrapped)` $DIR/core/services/relay/evm/cap_encoder_test.go: `input = map[string]any{ "Full_reports": []any{reportA, reportB}, consensustypes.MetadataFieldName: getMetadata(wrongLength), }` $DIR/core/services/relay/evm/cap_encoder_test.go: `wrapped, err = values.NewMap(input)` $DIR/core/services/relay/evm/cap_encoder_test.go: `_, err = enc.Encode(testutils.Context(t), *wrapped)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.NewMap(config)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.NewEVMEncoder(wrapped)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.NewMap(input)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.Encode(testutils.Context(t), *wrapped)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.Context(t)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.EncodeToString(encoded)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.NewMap(config)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.NewEVMEncoder(wrapped)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.NewInt(234)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.NewInt(456)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.NewMap(input)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.Encode(testutils.Context(t), *wrapped)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.Context(t)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.EncodeToString(encoded)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.NewMap(config)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.NewEVMEncoder(wrapped)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.NewInt(234)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.NewInt(456)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.NewMap(input)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.Encode(testutils.Context(t), *wrapped)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.Context(t)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.EncodeToString(encoded)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.NewMap(config)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.NewEVMEncoder(wrapped)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.NewInt(234)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.NewInt(456)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.NewMap(input)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.Encode(testutils.Context(t), *wrapped)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.Context(t)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.EncodeToString(encoded)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.NewMap(config)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.NewEVMEncoder(wrapped)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.NewMap(input)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.Encode(testutils.Context(t), *wrapped)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.Context(t)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.NewMap(input)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.Encode(testutils.Context(t), *wrapped)` $DIR/core/services/relay/evm/cap_encoder_test.go: `.Context(t)` $DIR/core/services/relay/evm/chain_reader_test.go: `RunChainReaderInterfaceTests(t, it)` $DIR/core/services/relay/evm/chain_reader_test.go: `RunChainReaderInterfaceTests(t, commontestutils.WrapChainReaderTesterForLoop(it))` $DIR/core/services/relay/evm/chain_reader_test.go: `t.Run("Dynamically typed topics can be used to filter and have type correct in return", func(t *testing.T) { it.Setup(t) // bind event before firing it to avoid log poller race ctx := testutils.Context(t) cr := it.GetChainReader(t) require.NoError(t, cr.Bind(ctx, it.GetBindings(t))) anyString := "foo" tx, err := it.evmTest.TriggerEventWithDynamicTopic(it.auth, anyString) require.NoError(t, err) it.sim.Commit() it.incNonce() it.awaitTx(t, tx) input := struct{ Field string }{Field: anyString} tp := cr.(clcommontypes.ContractTypeProvider) output, err := tp.CreateContractType(AnyContractName, triggerWithDynamicTopic, false) require.NoError(t, err) rOutput := reflect.Indirect(reflect.ValueOf(output)) require.Eventually(t, func() bool { return cr.GetLatestValue(ctx, AnyContractName, triggerWithDynamicTopic, input, output) == nil }, it.MaxWaitTimeForEvents(), time.Millisecond*10) assert.Equal(t, &anyString, rOutput.FieldByName("Field").Interface()) topic, err := abi.MakeTopics([]any{anyString}) require.NoError(t, err) assert.Equal(t, &topic[0][0], rOutput.FieldByName("FieldHash").Interface()) })` $DIR/core/services/relay/evm/chain_reader_test.go: `it.Setup(t)` $DIR/core/services/relay/evm/chain_reader_test.go: `it.sim.Commit()` $DIR/core/services/relay/evm/chain_reader_test.go: `it.incNonce()` $DIR/core/services/relay/evm/chain_reader_test.go: `it.awaitTx(t, tx)` $DIR/core/services/relay/evm/chain_reader_test.go: `it.Setup(t)` $DIR/core/services/relay/evm/chain_reader_test.go: `triggerFourTopics(t, it, int32(1), int32(2), int32(3))` $DIR/core/services/relay/evm/chain_reader_test.go: `triggerFourTopics(t, it, int32(2), int32(2), int32(3))` $DIR/core/services/relay/evm/chain_reader_test.go: `triggerFourTopics(t, it, int32(1), int32(3), int32(3))` $DIR/core/services/relay/evm/chain_reader_test.go: `triggerFourTopics(t, it, int32(1), int32(2), int32(4))` $DIR/core/services/relay/evm/chain_reader_test.go: `.WrapChainReaderTesterForLoop(it)` $DIR/core/services/relay/evm/chain_reader_test.go: `.Run("Dynamically typed topics can be used to filter and have type correct in return", func(t *testing.T) { it.Setup(t) // bind event before firing it to avoid log poller race ctx := testutils.Context(t) cr := it.GetChainReader(t) require.NoError(t, cr.Bind(ctx, it.GetBindings(t))) anyString := "foo" tx, err := it.evmTest.TriggerEventWithDynamicTopic(it.auth, anyString) require.NoError(t, err) it.sim.Commit() it.incNonce() it.awaitTx(t, tx) input := struct{ Field string }{Field: anyString} tp := cr.(clcommontypes.ContractTypeProvider) output, err := tp.CreateContractType(AnyContractName, triggerWithDynamicTopic, false) require.NoError(t, err) rOutput := reflect.Indirect(reflect.ValueOf(output)) require.Eventually(t, func() bool { return cr.GetLatestValue(ctx, AnyContractName, triggerWithDynamicTopic, input, output) == nil }, it.MaxWaitTimeForEvents(), time.Millisecond*10) assert.Equal(t, &anyString, rOutput.FieldByName("Field").Interface()) topic, err := abi.MakeTopics([]any{anyString}) require.NoError(t, err) assert.Equal(t, &topic[0][0], rOutput.FieldByName("FieldHash").Interface()) })` $DIR/core/services/relay/evm/chain_reader_test.go: `.Setup(t)` $DIR/core/services/relay/evm/chain_reader_test.go: `.Context(t)` $DIR/core/services/relay/evm/chain_reader_test.go: `.GetChainReader(t)` $DIR/core/services/relay/evm/chain_reader_test.go: `.evmTest.TriggerEventWithDynamicTopic(it.auth, anyString)` $DIR/core/services/relay/evm/chain_reader_test.go: `.sim.Commit()` $DIR/core/services/relay/evm/chain_reader_test.go: `.incNonce()` $DIR/core/services/relay/evm/chain_reader_test.go: `.awaitTx(t, tx)` $DIR/core/services/relay/evm/chain_reader_test.go: `.CreateContractType(AnyContractName, triggerWithDynamicTopic, false)` $DIR/core/services/relay/evm/chain_reader_test.go: `.Indirect(reflect.ValueOf(output))` $DIR/core/services/relay/evm/chain_reader_test.go: `.ValueOf(output)` $DIR/core/services/relay/evm/chain_reader_test.go: `.MakeTopics([]any{anyString})` $DIR/core/services/relay/evm/chain_reader_test.go: `.Setup(t)` $DIR/core/services/relay/evm/chain_reader_test.go: `.Context(t)` $DIR/core/services/relay/evm/chain_reader_test.go: `.GetChainReader(t)` $DIR/core/services/relay/evm/codec_test.go: `RunCodecInterfaceTests(t, tester)` $DIR/core/services/relay/evm/codec_test.go: `RunCodecInterfaceTests(t, looptestutils.WrapCodecTesterForLoop(tester))` $DIR/core/services/relay/evm/codec_test.go: `t.Run("GetMaxEncodingSize delegates to GetMaxSize", func(t *testing.T) { actual, err := c.GetMaxEncodingSize(testutils.Context(t), anyN, sizeItemType) assert.NoError(t, err) expected, err := types.GetMaxSize(anyN, parseDefs(t)[sizeItemType]) require.NoError(t, err) assert.Equal(t, expected, actual) })` $DIR/core/services/relay/evm/codec_test.go: `.WrapCodecTesterForLoop(tester)` $DIR/core/services/relay/evm/codec_test.go: `.GetCodec(t)` $DIR/core/services/relay/evm/codec_test.go: `.Run("GetMaxEncodingSize delegates to GetMaxSize", func(t *testing.T) { actual, err := c.GetMaxEncodingSize(testutils.Context(t), anyN, sizeItemType) assert.NoError(t, err) expected, err := types.GetMaxSize(anyN, parseDefs(t)[sizeItemType]) require.NoError(t, err) assert.Equal(t, expected, actual) })` $DIR/core/services/relay/evm/codec_test.go: `.GetMaxEncodingSize(testutils.Context(t), anyN, sizeItemType)` $DIR/core/services/relay/evm/codec_test.go: `.Context(t)` $DIR/core/services/relay/evm/codec_test.go: `.GetMaxSize(anyN, parseDefs(t)[sizeItemType])` $DIR/core/services/relay/evm/codec_test.go: `.GetMaxDecodingSize(testutils.Context(t), anyN, sizeItemType)` $DIR/core/services/relay/evm/codec_test.go: `.Context(t)` $DIR/core/services/relay/evm/codec_test.go: `.GetMaxSize(anyN, parseDefs(t)[sizeItemType])` $DIR/core/services/relay/evm/codec_test.go: `.NewCodec(codecConfig)` $DIR/core/services/relay/evm/codec_test.go: `.Encode(testutils.Context(t), input, codecName)` $DIR/core/services/relay/evm/codec_test.go: `.Context(t)` $DIR/core/services/relay/evm/codec_test.go: `.Encode(result)` $DIR/core/services/relay/evm/codec_test.go: `.NewCodec(codecConfig)` $DIR/core/services/relay/evm/codec_test.go: `.Encode(testutils.Context(t), input, codecName)` $DIR/core/services/relay/evm/codec_test.go: `.Context(t)` $DIR/core/services/relay/evm/codec_test.go: `.Encode(result)` $DIR/core/services/relay/evm/codec_test.go: `.NewInt(234)` $DIR/core/services/relay/evm/codec_test.go: `.NewInt(456)` $DIR/core/services/relay/evm/codec_test.go: `.NewCodec(codecConfig)` $DIR/core/services/relay/evm/codec_test.go: `.Encode(testutils.Context(t), input, codecName)` $DIR/core/services/relay/evm/codec_test.go: `.Context(t)` $DIR/core/services/relay/evm/codec_test.go: `.Encode(result)` $DIR/core/services/relay/evm/config_poller_test.go: `user, err = bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))` $DIR/core/services/relay/evm/config_poller_test.go: `b = backends.NewSimulatedBackend(core.GenesisAlloc{ user.From: {Balance: big.NewInt(1000000000000000000)}}, 5*ethconfig.Defaults.Miner.GasCeil)` $DIR/core/services/relay/evm/config_poller_test.go: `linkTokenAddress, _, _, err = link_token_interface.DeployLinkToken(user, b)` $DIR/core/services/relay/evm/config_poller_test.go: `accessAddress, _, _, err = testoffchainaggregator2.DeploySimpleWriteAccessController(user, b)` $DIR/core/services/relay/evm/config_poller_test.go: `ocrAddress, _, ocrContract, err = ocr2aggregator.DeployOCR2Aggregator( user, b, linkTokenAddress, big.NewInt(0), big.NewInt(10), accessAddress, accessAddress, 9, "TEST", )` $DIR/core/services/relay/evm/config_poller_test.go: `configStoreContractAddr, _, configStoreContract, err = ocrconfigurationstoreevmsimple.DeployOCRConfigurationStoreEVMSimple(user, b)` $DIR/core/services/relay/evm/config_poller_test.go: `b.Commit()` $DIR/core/services/relay/evm/config_poller_test.go: `ethClient = evmclient.NewSimulatedBackendClient(t, b, testutils.SimulatedChainID)` $DIR/core/services/relay/evm/config_poller_test.go: `lp = logpoller.NewLogPoller(lorm, ethClient, lggr, lpOpts)` $DIR/core/services/relay/evm/config_poller_test.go: `servicetest.Run(t, lp)` $DIR/core/services/relay/evm/config_poller_test.go: `t.Run("LatestConfig errors if there is no config in logs and config store is unconfigured", func(t *testing.T) { cp, err := NewConfigPoller(ctx, lggr, CPConfig{ethClient, lp, ocrAddress, nil, ld}) require.NoError(t, err) _, err = cp.LatestConfig(testutils.Context(t), 0) require.Error(t, err) assert.Contains(t, err.Error(), "no logs found for config on contract") })` $DIR/core/services/relay/evm/config_poller_test.go: `_, err = cp.LatestConfig(testutils.Context(t), 0)` $DIR/core/services/relay/evm/config_poller_test.go: `t.Run("happy path (with config store)", func(t *testing.T) { cp, err := NewConfigPoller(ctx, lggr, CPConfig{ethClient, lp, ocrAddress, &configStoreContractAddr, ld}) require.NoError(t, err) // Should have no config to begin with. _, configDigest, err := cp.LatestConfigDetails(testutils.Context(t)) require.NoError(t, err) require.Equal(t, ocrtypes2.ConfigDigest{}, configDigest) // Should error because there are no logs for config at block 0 _, err = cp.LatestConfig(testutils.Context(t), 0) require.Error(t, err) assert.Contains(t, err.Error(), "config details missing while trying to lookup config in store") // Set the config contractConfig := setConfig(t, median.OffchainConfig{ AlphaReportInfinite: false, AlphaReportPPB: 0, AlphaAcceptInfinite: true, AlphaAcceptPPB: 0, DeltaC: 10, }, ocrContract, user) b.Commit() latest, err := b.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err) // Ensure we capture this config set log. require.NoError(t, lp.Replay(testutils.Context(t), latest.Number().Int64()-1)) // Send blocks until we see the config updated. var configBlock uint64 var digest [32]byte gomega.NewGomegaWithT(t).Eventually(func() bool { b.Commit() configBlock, digest, err = cp.LatestConfigDetails(testutils.Context(t)) require.NoError(t, err) return ocrtypes2.ConfigDigest{} != digest }, testutils.WaitTimeout(t), 100*time.Millisecond).Should(gomega.BeTrue()) // Assert the config returned is the one we configured. newConfig, err := cp.LatestConfig(testutils.Context(t), configBlock) require.NoError(t, err) // Note we don't check onchainConfig, as that is populated in the contract itself. assert.Equal(t, digest, [32]byte(newConfig.ConfigDigest)) assert.Equal(t, contractConfig.Signers, newConfig.Signers) assert.Equal(t, contractConfig.Transmitters, newConfig.Transmitters) assert.Equal(t, contractConfig.F, newConfig.F) assert.Equal(t, contractConfig.OffchainConfigVersion, newConfig.OffchainConfigVersion) assert.Equal(t, contractConfig.OffchainConfig, newConfig.OffchainConfig) })` $DIR/core/services/relay/evm/config_poller_test.go: `_, err = cp.LatestConfig(testutils.Context(t), 0)` $DIR/core/services/relay/evm/config_poller_test.go: `b.Commit()` $DIR/core/services/relay/evm/config_poller_test.go: `gomega.NewGomegaWithT(t).Eventually(func() bool { b.Commit() configBlock, digest, err = cp.LatestConfigDetails(testutils.Context(t)) require.NoError(t, err) return ocrtypes2.ConfigDigest{} != digest }, testutils.WaitTimeout(t), 100*time.Millisecond).Should(gomega.BeTrue())` $DIR/core/services/relay/evm/config_poller_test.go: `b.Commit()` $DIR/core/services/relay/evm/config_poller_test.go: `configBlock, digest, err = cp.LatestConfigDetails(testutils.Context(t))` $DIR/core/services/relay/evm/config_poller_test.go: `ocrAddress, _, ocrContract, err = ocr2aggregator.DeployOCR2Aggregator( user, b, linkTokenAddress, big.NewInt(0), big.NewInt(10), accessAddress, accessAddress, 9, "TEST", )` $DIR/core/services/relay/evm/config_poller_test.go: `b.Commit()` $DIR/core/services/relay/evm/config_poller_test.go: `t.Run("LatestConfigDetails, when logs have been pruned and config store contract is configured", func(t *testing.T) { // Give it a log poller that will never return logs mp := new(mocks.LogPoller) mp.On("RegisterFilter", mock.Anything, mock.Anything).Return(nil) mp.On("LatestLogByEventSigWithConfs", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, sql.ErrNoRows) t.Run("if callLatestConfigDetails succeeds", func(t *testing.T) { cp, err := newConfigPoller(ctx, lggr, ethClient, mp, ocrAddress, &configStoreContractAddr, ld) require.NoError(t, err) t.Run("when config has not been set, returns zero values", func(t *testing.T) { changedInBlock, configDigest, err := cp.LatestConfigDetails(testutils.Context(t)) require.NoError(t, err) assert.Equal(t, 0, int(changedInBlock)) assert.Equal(t, ocrtypes.ConfigDigest{}, configDigest) }) t.Run("when config has been set, returns config details", func(t *testing.T) { setConfig(t, median.OffchainConfig{ AlphaReportInfinite: false, AlphaReportPPB: 0, AlphaAcceptInfinite: true, AlphaAcceptPPB: 0, DeltaC: 10, }, ocrContract, user) b.Commit() changedInBlock, configDigest, err := cp.LatestConfigDetails(testutils.Context(t)) require.NoError(t, err) latest, err := b.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err) onchainDetails, err := ocrContract.LatestConfigDetails(nil) require.NoError(t, err) assert.Equal(t, latest.Number().Int64(), int64(changedInBlock)) assert.Equal(t, onchainDetails.ConfigDigest, [32]byte(configDigest)) }) }) t.Run("returns error if callLatestConfigDetails fails", func(t *testing.T) { failingClient := new(evmClientMocks.Client) failingClient.On("ConfiguredChainID").Return(big.NewInt(42)) failingClient.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("something exploded")) cp, err := newConfigPoller(ctx, lggr, failingClient, mp, ocrAddress, &configStoreContractAddr, ld) require.NoError(t, err) cp.configStoreContractAddr = &configStoreContractAddr cp.configStoreContract = configStoreContract _, _, err = cp.LatestConfigDetails(testutils.Context(t)) assert.EqualError(t, err, "something exploded") failingClient.AssertExpectations(t) }) })` $DIR/core/services/relay/evm/config_poller_test.go: `mp.On("RegisterFilter", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/relay/evm/config_poller_test.go: `mp.On("LatestLogByEventSigWithConfs", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, sql.ErrNoRows)` $DIR/core/services/relay/evm/config_poller_test.go: `t.Run("if callLatestConfigDetails succeeds", func(t *testing.T) { cp, err := newConfigPoller(ctx, lggr, ethClient, mp, ocrAddress, &configStoreContractAddr, ld) require.NoError(t, err) t.Run("when config has not been set, returns zero values", func(t *testing.T) { changedInBlock, configDigest, err := cp.LatestConfigDetails(testutils.Context(t)) require.NoError(t, err) assert.Equal(t, 0, int(changedInBlock)) assert.Equal(t, ocrtypes.ConfigDigest{}, configDigest) }) t.Run("when config has been set, returns config details", func(t *testing.T) { setConfig(t, median.OffchainConfig{ AlphaReportInfinite: false, AlphaReportPPB: 0, AlphaAcceptInfinite: true, AlphaAcceptPPB: 0, DeltaC: 10, }, ocrContract, user) b.Commit() changedInBlock, configDigest, err := cp.LatestConfigDetails(testutils.Context(t)) require.NoError(t, err) latest, err := b.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err) onchainDetails, err := ocrContract.LatestConfigDetails(nil) require.NoError(t, err) assert.Equal(t, latest.Number().Int64(), int64(changedInBlock)) assert.Equal(t, onchainDetails.ConfigDigest, [32]byte(configDigest)) }) })` $DIR/core/services/relay/evm/config_poller_test.go: `t.Run("when config has not been set, returns zero values", func(t *testing.T) { changedInBlock, configDigest, err := cp.LatestConfigDetails(testutils.Context(t)) require.NoError(t, err) assert.Equal(t, 0, int(changedInBlock)) assert.Equal(t, ocrtypes.ConfigDigest{}, configDigest) })` $DIR/core/services/relay/evm/config_poller_test.go: `t.Run("when config has been set, returns config details", func(t *testing.T) { setConfig(t, median.OffchainConfig{ AlphaReportInfinite: false, AlphaReportPPB: 0, AlphaAcceptInfinite: true, AlphaAcceptPPB: 0, DeltaC: 10, }, ocrContract, user) b.Commit() changedInBlock, configDigest, err := cp.LatestConfigDetails(testutils.Context(t)) require.NoError(t, err) latest, err := b.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err) onchainDetails, err := ocrContract.LatestConfigDetails(nil) require.NoError(t, err) assert.Equal(t, latest.Number().Int64(), int64(changedInBlock)) assert.Equal(t, onchainDetails.ConfigDigest, [32]byte(configDigest)) })` $DIR/core/services/relay/evm/config_poller_test.go: `setConfig(t, median.OffchainConfig{ AlphaReportInfinite: false, AlphaReportPPB: 0, AlphaAcceptInfinite: true, AlphaAcceptPPB: 0, DeltaC: 10, }, ocrContract, user)` $DIR/core/services/relay/evm/config_poller_test.go: `b.Commit()` $DIR/core/services/relay/evm/config_poller_test.go: `t.Run("returns error if callLatestConfigDetails fails", func(t *testing.T) { failingClient := new(evmClientMocks.Client) failingClient.On("ConfiguredChainID").Return(big.NewInt(42)) failingClient.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("something exploded")) cp, err := newConfigPoller(ctx, lggr, failingClient, mp, ocrAddress, &configStoreContractAddr, ld) require.NoError(t, err) cp.configStoreContractAddr = &configStoreContractAddr cp.configStoreContract = configStoreContract _, _, err = cp.LatestConfigDetails(testutils.Context(t)) assert.EqualError(t, err, "something exploded") failingClient.AssertExpectations(t) })` $DIR/core/services/relay/evm/config_poller_test.go: `failingClient.On("ConfiguredChainID").Return(big.NewInt(42))` $DIR/core/services/relay/evm/config_poller_test.go: `failingClient.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("something exploded"))` $DIR/core/services/relay/evm/config_poller_test.go: `cp.configStoreContractAddr = &configStoreContractAddr` $DIR/core/services/relay/evm/config_poller_test.go: `cp.configStoreContract = configStoreContract` $DIR/core/services/relay/evm/config_poller_test.go: `_, _, err = cp.LatestConfigDetails(testutils.Context(t))` $DIR/core/services/relay/evm/config_poller_test.go: `failingClient.AssertExpectations(t)` $DIR/core/services/relay/evm/config_poller_test.go: `ocrAddress, _, ocrContract, err = ocr2aggregator.DeployOCR2Aggregator( user, b, linkTokenAddress, big.NewInt(0), big.NewInt(10), accessAddress, accessAddress, 9, "TEST", )` $DIR/core/services/relay/evm/config_poller_test.go: `b.Commit()` $DIR/core/services/relay/evm/config_poller_test.go: `mp.On("RegisterFilter", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/relay/evm/config_poller_test.go: `mp.On("Logs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil)` $DIR/core/services/relay/evm/config_poller_test.go: `mp.On("LatestLogByEventSigWithConfs", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, sql.ErrNoRows)` $DIR/core/services/relay/evm/config_poller_test.go: `t.Run("if callReadConfig succeeds", func(t *testing.T) { cp, err := newConfigPoller(ctx, lggr, ethClient, mp, ocrAddress, &configStoreContractAddr, ld) require.NoError(t, err) t.Run("when config has not been set, returns error", func(t *testing.T) { _, err := cp.LatestConfig(testutils.Context(t), 0) require.Error(t, err) assert.Contains(t, err.Error(), "config details missing while trying to lookup config in store") }) t.Run("when config has been set, returns config", func(t *testing.T) { b.Commit() onchainDetails, err := ocrContract.LatestConfigDetails(nil) require.NoError(t, err) contractConfig := setConfig(t, median.OffchainConfig{ AlphaReportInfinite: false, AlphaReportPPB: 0, AlphaAcceptInfinite: true, AlphaAcceptPPB: 0, DeltaC: 10, }, ocrContract, user) signerAddresses, err := OnchainPublicKeyToAddress(contractConfig.Signers) require.NoError(t, err) transmitterAddresses, err := AccountToAddress(contractConfig.Transmitters) require.NoError(t, err) configuration := ocrconfigurationstoreevmsimple.OCRConfigurationStoreEVMSimpleConfigurationEVMSimple{ Signers: signerAddresses, Transmitters: transmitterAddresses, OnchainConfig: contractConfig.OnchainConfig, OffchainConfig: contractConfig.OffchainConfig, ContractAddress: ocrAddress, OffchainConfigVersion: contractConfig.OffchainConfigVersion, ConfigCount: 1, F: contractConfig.F, } addConfig(t, user, configStoreContract, configuration) b.Commit() onchainDetails, err = ocrContract.LatestConfigDetails(nil) require.NoError(t, err) newConfig, err := cp.LatestConfig(testutils.Context(t), 0) require.NoError(t, err) assert.Equal(t, onchainDetails.ConfigDigest, [32]byte(newConfig.ConfigDigest)) assert.Equal(t, contractConfig.Signers, newConfig.Signers) assert.Equal(t, contractConfig.Transmitters, newConfig.Transmitters) assert.Equal(t, contractConfig.F, newConfig.F) assert.Equal(t, contractConfig.OffchainConfigVersion, newConfig.OffchainConfigVersion) assert.Equal(t, contractConfig.OffchainConfig, newConfig.OffchainConfig) }) })` $DIR/core/services/relay/evm/config_poller_test.go: `t.Run("when config has not been set, returns error", func(t *testing.T) { _, err := cp.LatestConfig(testutils.Context(t), 0) require.Error(t, err) assert.Contains(t, err.Error(), "config details missing while trying to lookup config in store") })` $DIR/core/services/relay/evm/config_poller_test.go: `t.Run("when config has been set, returns config", func(t *testing.T) { b.Commit() onchainDetails, err := ocrContract.LatestConfigDetails(nil) require.NoError(t, err) contractConfig := setConfig(t, median.OffchainConfig{ AlphaReportInfinite: false, AlphaReportPPB: 0, AlphaAcceptInfinite: true, AlphaAcceptPPB: 0, DeltaC: 10, }, ocrContract, user) signerAddresses, err := OnchainPublicKeyToAddress(contractConfig.Signers) require.NoError(t, err) transmitterAddresses, err := AccountToAddress(contractConfig.Transmitters) require.NoError(t, err) configuration := ocrconfigurationstoreevmsimple.OCRConfigurationStoreEVMSimpleConfigurationEVMSimple{ Signers: signerAddresses, Transmitters: transmitterAddresses, OnchainConfig: contractConfig.OnchainConfig, OffchainConfig: contractConfig.OffchainConfig, ContractAddress: ocrAddress, OffchainConfigVersion: contractConfig.OffchainConfigVersion, ConfigCount: 1, F: contractConfig.F, } addConfig(t, user, configStoreContract, configuration) b.Commit() onchainDetails, err = ocrContract.LatestConfigDetails(nil) require.NoError(t, err) newConfig, err := cp.LatestConfig(testutils.Context(t), 0) require.NoError(t, err) assert.Equal(t, onchainDetails.ConfigDigest, [32]byte(newConfig.ConfigDigest)) assert.Equal(t, contractConfig.Signers, newConfig.Signers) assert.Equal(t, contractConfig.Transmitters, newConfig.Transmitters) assert.Equal(t, contractConfig.F, newConfig.F) assert.Equal(t, contractConfig.OffchainConfigVersion, newConfig.OffchainConfigVersion) assert.Equal(t, contractConfig.OffchainConfig, newConfig.OffchainConfig) })` $DIR/core/services/relay/evm/config_poller_test.go: `b.Commit()` $DIR/core/services/relay/evm/config_poller_test.go: `addConfig(t, user, configStoreContract, configuration)` $DIR/core/services/relay/evm/config_poller_test.go: `b.Commit()` $DIR/core/services/relay/evm/config_poller_test.go: `onchainDetails, err = ocrContract.LatestConfigDetails(nil)` $DIR/core/services/relay/evm/config_poller_test.go: `t.Run("returns error if callReadConfig fails", func(t *testing.T) { failingClient := new(evmClientMocks.Client) failingClient.On("ConfiguredChainID").Return(big.NewInt(42)) failingClient.On("CallContract", mock.Anything, mock.MatchedBy(func(callArgs ethereum.CallMsg) bool { // initial call to retrieve config store address from aggregator return *callArgs.To == ocrAddress }), mock.Anything).Return(nil, errors.New("something exploded")).Once() cp, err := newConfigPoller(ctx, lggr, failingClient, mp, ocrAddress, &configStoreContractAddr, ld) require.NoError(t, err) _, err = cp.LatestConfig(testutils.Context(t), 0) assert.EqualError(t, err, "failed to get latest config details: something exploded") failingClient.AssertExpectations(t) })` $DIR/core/services/relay/evm/config_poller_test.go: `failingClient.On("ConfiguredChainID").Return(big.NewInt(42))` $DIR/core/services/relay/evm/config_poller_test.go: `failingClient.On("CallContract", mock.Anything, mock.MatchedBy(func(callArgs ethereum.CallMsg) bool { // initial call to retrieve config store address from aggregator return *callArgs.To == ocrAddress }), mock.Anything).Return(nil, errors.New("something exploded")).Once()` $DIR/core/services/relay/evm/config_poller_test.go: `_, err = cp.LatestConfig(testutils.Context(t), 0)` $DIR/core/services/relay/evm/config_poller_test.go: `failingClient.AssertExpectations(t)` $DIR/core/services/relay/evm/config_poller_test.go: `.TestLogger(t)` $DIR/core/services/relay/evm/config_poller_test.go: `.Context(t)` $DIR/core/services/relay/evm/config_poller_test.go: `.GenerateKey()` $DIR/core/services/relay/evm/config_poller_test.go: `.NewKeyedTransactorWithChainID(key, big.NewInt(1337))` $DIR/core/services/relay/evm/config_poller_test.go: `.NewInt(1337)` $DIR/core/services/relay/evm/config_poller_test.go: `.NewSimulatedBackend(core.GenesisAlloc{ user.From: {Balance: big.NewInt(1000000000000000000)}}, 5*ethconfig.Defaults.Miner.GasCeil)` $DIR/core/services/relay/evm/config_poller_test.go: `.NewInt(1000000000000000000)` $DIR/core/services/relay/evm/config_poller_test.go: `.DeployLinkToken(user, b)` $DIR/core/services/relay/evm/config_poller_test.go: `.DeploySimpleWriteAccessController(user, b)` $DIR/core/services/relay/evm/config_poller_test.go: `.DeployOCR2Aggregator( user, b, linkTokenAddress, big.NewInt(0), big.NewInt(10), accessAddress, accessAddress, 9, "TEST", )` $DIR/core/services/relay/evm/config_poller_test.go: `.NewInt(0)` $DIR/core/services/relay/evm/config_poller_test.go: `.NewInt(10)` $DIR/core/services/relay/evm/config_poller_test.go: `.DeployOCRConfigurationStoreEVMSimple(user, b)` $DIR/core/services/relay/evm/config_poller_test.go: `.Commit()` $DIR/core/services/relay/evm/config_poller_test.go: `.NewSqlxDB(t)` $DIR/core/services/relay/evm/config_poller_test.go: `.NewSimulatedBackendClient(t, b, testutils.SimulatedChainID)` $DIR/core/services/relay/evm/config_poller_test.go: `.NewORM(testutils.SimulatedChainID, db, lggr)` $DIR/core/services/relay/evm/config_poller_test.go: `.NewLogPoller(lorm, ethClient, lggr, lpOpts)` $DIR/core/services/relay/evm/config_poller_test.go: `.Run(t, lp)` $DIR/core/services/relay/evm/config_poller_test.go: `.Run("LatestConfig errors if there is no config in logs and config store is unconfigured", func(t *testing.T) { cp, err := NewConfigPoller(ctx, lggr, CPConfig{ethClient, lp, ocrAddress, nil, ld}) require.NoError(t, err) _, err = cp.LatestConfig(testutils.Context(t), 0) require.Error(t, err) assert.Contains(t, err.Error(), "no logs found for config on contract") })` $DIR/core/services/relay/evm/config_poller_test.go: `.LatestConfig(testutils.Context(t), 0)` $DIR/core/services/relay/evm/config_poller_test.go: `.Context(t)` $DIR/core/services/relay/evm/config_poller_test.go: `.Run("happy path (with config store)", func(t *testing.T) { cp, err := NewConfigPoller(ctx, lggr, CPConfig{ethClient, lp, ocrAddress, &configStoreContractAddr, ld}) require.NoError(t, err) // Should have no config to begin with. _, configDigest, err := cp.LatestConfigDetails(testutils.Context(t)) require.NoError(t, err) require.Equal(t, ocrtypes2.ConfigDigest{}, configDigest) // Should error because there are no logs for config at block 0 _, err = cp.LatestConfig(testutils.Context(t), 0) require.Error(t, err) assert.Contains(t, err.Error(), "config details missing while trying to lookup config in store") // Set the config contractConfig := setConfig(t, median.OffchainConfig{ AlphaReportInfinite: false, AlphaReportPPB: 0, AlphaAcceptInfinite: true, AlphaAcceptPPB: 0, DeltaC: 10, }, ocrContract, user) b.Commit() latest, err := b.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err) // Ensure we capture this config set log. require.NoError(t, lp.Replay(testutils.Context(t), latest.Number().Int64()-1)) // Send blocks until we see the config updated. var configBlock uint64 var digest [32]byte gomega.NewGomegaWithT(t).Eventually(func() bool { b.Commit() configBlock, digest, err = cp.LatestConfigDetails(testutils.Context(t)) require.NoError(t, err) return ocrtypes2.ConfigDigest{} != digest }, testutils.WaitTimeout(t), 100*time.Millisecond).Should(gomega.BeTrue()) // Assert the config returned is the one we configured. newConfig, err := cp.LatestConfig(testutils.Context(t), configBlock) require.NoError(t, err) // Note we don't check onchainConfig, as that is populated in the contract itself. assert.Equal(t, digest, [32]byte(newConfig.ConfigDigest)) assert.Equal(t, contractConfig.Signers, newConfig.Signers) assert.Equal(t, contractConfig.Transmitters, newConfig.Transmitters) assert.Equal(t, contractConfig.F, newConfig.F) assert.Equal(t, contractConfig.OffchainConfigVersion, newConfig.OffchainConfigVersion) assert.Equal(t, contractConfig.OffchainConfig, newConfig.OffchainConfig) })` $DIR/core/services/relay/evm/config_poller_test.go: `.LatestConfigDetails(testutils.Context(t))` $DIR/core/services/relay/evm/config_poller_test.go: `.Context(t)` $DIR/core/services/relay/evm/config_poller_test.go: `.LatestConfig(testutils.Context(t), 0)` $DIR/core/services/relay/evm/config_poller_test.go: `.Context(t)` $DIR/core/services/relay/evm/config_poller_test.go: `.Commit()` $DIR/core/services/relay/evm/config_poller_test.go: `.BlockByNumber(testutils.Context(t), nil)` $DIR/core/services/relay/evm/config_poller_test.go: `.Context(t)` $DIR/core/services/relay/evm/config_poller_test.go: `.NewGomegaWithT(t)` $DIR/core/services/relay/evm/config_poller_test.go: `.Eventually(func() bool { b.Commit() configBlock, digest, err = cp.LatestConfigDetails(testutils.Context(t)) require.NoError(t, err) return ocrtypes2.ConfigDigest{} != digest }, testutils.WaitTimeout(t), 100*time.Millisecond)` $DIR/core/services/relay/evm/config_poller_test.go: `.Commit()` $DIR/core/services/relay/evm/config_poller_test.go: `.LatestConfigDetails(testutils.Context(t))` $DIR/core/services/relay/evm/config_poller_test.go: `.Context(t)` $DIR/core/services/relay/evm/config_poller_test.go: `.WaitTimeout(t)` $DIR/core/services/relay/evm/config_poller_test.go: `.Should(gomega.BeTrue())` $DIR/core/services/relay/evm/config_poller_test.go: `.BeTrue()` $DIR/core/services/relay/evm/config_poller_test.go: `.LatestConfig(testutils.Context(t), configBlock)` $DIR/core/services/relay/evm/config_poller_test.go: `.Context(t)` $DIR/core/services/relay/evm/config_poller_test.go: `.DeployOCR2Aggregator( user, b, linkTokenAddress, big.NewInt(0), big.NewInt(10), accessAddress, accessAddress, 9, "TEST", )` $DIR/core/services/relay/evm/config_poller_test.go: `.NewInt(0)` $DIR/core/services/relay/evm/config_poller_test.go: `.NewInt(10)` $DIR/core/services/relay/evm/config_poller_test.go: `.Commit()` $DIR/core/services/relay/evm/config_poller_test.go: `.Run("LatestConfigDetails, when logs have been pruned and config store contract is configured", func(t *testing.T) { // Give it a log poller that will never return logs mp := new(mocks.LogPoller) mp.On("RegisterFilter", mock.Anything, mock.Anything).Return(nil) mp.On("LatestLogByEventSigWithConfs", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, sql.ErrNoRows) t.Run("if callLatestConfigDetails succeeds", func(t *testing.T) { cp, err := newConfigPoller(ctx, lggr, ethClient, mp, ocrAddress, &configStoreContractAddr, ld) require.NoError(t, err) t.Run("when config has not been set, returns zero values", func(t *testing.T) { changedInBlock, configDigest, err := cp.LatestConfigDetails(testutils.Context(t)) require.NoError(t, err) assert.Equal(t, 0, int(changedInBlock)) assert.Equal(t, ocrtypes.ConfigDigest{}, configDigest) }) t.Run("when config has been set, returns config details", func(t *testing.T) { setConfig(t, median.OffchainConfig{ AlphaReportInfinite: false, AlphaReportPPB: 0, AlphaAcceptInfinite: true, AlphaAcceptPPB: 0, DeltaC: 10, }, ocrContract, user) b.Commit() changedInBlock, configDigest, err := cp.LatestConfigDetails(testutils.Context(t)) require.NoError(t, err) latest, err := b.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err) onchainDetails, err := ocrContract.LatestConfigDetails(nil) require.NoError(t, err) assert.Equal(t, latest.Number().Int64(), int64(changedInBlock)) assert.Equal(t, onchainDetails.ConfigDigest, [32]byte(configDigest)) }) }) t.Run("returns error if callLatestConfigDetails fails", func(t *testing.T) { failingClient := new(evmClientMocks.Client) failingClient.On("ConfiguredChainID").Return(big.NewInt(42)) failingClient.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("something exploded")) cp, err := newConfigPoller(ctx, lggr, failingClient, mp, ocrAddress, &configStoreContractAddr, ld) require.NoError(t, err) cp.configStoreContractAddr = &configStoreContractAddr cp.configStoreContract = configStoreContract _, _, err = cp.LatestConfigDetails(testutils.Context(t)) assert.EqualError(t, err, "something exploded") failingClient.AssertExpectations(t) }) })` $DIR/core/services/relay/evm/config_poller_test.go: `.On("RegisterFilter", mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/config_poller_test.go: `.Return(nil)` $DIR/core/services/relay/evm/config_poller_test.go: `.On("LatestLogByEventSigWithConfs", mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/config_poller_test.go: `.Return(nil, sql.ErrNoRows)` $DIR/core/services/relay/evm/config_poller_test.go: `.Run("if callLatestConfigDetails succeeds", func(t *testing.T) { cp, err := newConfigPoller(ctx, lggr, ethClient, mp, ocrAddress, &configStoreContractAddr, ld) require.NoError(t, err) t.Run("when config has not been set, returns zero values", func(t *testing.T) { changedInBlock, configDigest, err := cp.LatestConfigDetails(testutils.Context(t)) require.NoError(t, err) assert.Equal(t, 0, int(changedInBlock)) assert.Equal(t, ocrtypes.ConfigDigest{}, configDigest) }) t.Run("when config has been set, returns config details", func(t *testing.T) { setConfig(t, median.OffchainConfig{ AlphaReportInfinite: false, AlphaReportPPB: 0, AlphaAcceptInfinite: true, AlphaAcceptPPB: 0, DeltaC: 10, }, ocrContract, user) b.Commit() changedInBlock, configDigest, err := cp.LatestConfigDetails(testutils.Context(t)) require.NoError(t, err) latest, err := b.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err) onchainDetails, err := ocrContract.LatestConfigDetails(nil) require.NoError(t, err) assert.Equal(t, latest.Number().Int64(), int64(changedInBlock)) assert.Equal(t, onchainDetails.ConfigDigest, [32]byte(configDigest)) }) })` $DIR/core/services/relay/evm/config_poller_test.go: `.Run("when config has not been set, returns zero values", func(t *testing.T) { changedInBlock, configDigest, err := cp.LatestConfigDetails(testutils.Context(t)) require.NoError(t, err) assert.Equal(t, 0, int(changedInBlock)) assert.Equal(t, ocrtypes.ConfigDigest{}, configDigest) })` $DIR/core/services/relay/evm/config_poller_test.go: `.LatestConfigDetails(testutils.Context(t))` $DIR/core/services/relay/evm/config_poller_test.go: `.Context(t)` $DIR/core/services/relay/evm/config_poller_test.go: `.Run("when config has been set, returns config details", func(t *testing.T) { setConfig(t, median.OffchainConfig{ AlphaReportInfinite: false, AlphaReportPPB: 0, AlphaAcceptInfinite: true, AlphaAcceptPPB: 0, DeltaC: 10, }, ocrContract, user) b.Commit() changedInBlock, configDigest, err := cp.LatestConfigDetails(testutils.Context(t)) require.NoError(t, err) latest, err := b.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err) onchainDetails, err := ocrContract.LatestConfigDetails(nil) require.NoError(t, err) assert.Equal(t, latest.Number().Int64(), int64(changedInBlock)) assert.Equal(t, onchainDetails.ConfigDigest, [32]byte(configDigest)) })` $DIR/core/services/relay/evm/config_poller_test.go: `.Commit()` $DIR/core/services/relay/evm/config_poller_test.go: `.LatestConfigDetails(testutils.Context(t))` $DIR/core/services/relay/evm/config_poller_test.go: `.Context(t)` $DIR/core/services/relay/evm/config_poller_test.go: `.BlockByNumber(testutils.Context(t), nil)` $DIR/core/services/relay/evm/config_poller_test.go: `.Context(t)` $DIR/core/services/relay/evm/config_poller_test.go: `.LatestConfigDetails(nil)` $DIR/core/services/relay/evm/config_poller_test.go: `.Run("returns error if callLatestConfigDetails fails", func(t *testing.T) { failingClient := new(evmClientMocks.Client) failingClient.On("ConfiguredChainID").Return(big.NewInt(42)) failingClient.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("something exploded")) cp, err := newConfigPoller(ctx, lggr, failingClient, mp, ocrAddress, &configStoreContractAddr, ld) require.NoError(t, err) cp.configStoreContractAddr = &configStoreContractAddr cp.configStoreContract = configStoreContract _, _, err = cp.LatestConfigDetails(testutils.Context(t)) assert.EqualError(t, err, "something exploded") failingClient.AssertExpectations(t) })` $DIR/core/services/relay/evm/config_poller_test.go: `.On("ConfiguredChainID")` $DIR/core/services/relay/evm/config_poller_test.go: `.Return(big.NewInt(42))` $DIR/core/services/relay/evm/config_poller_test.go: `.NewInt(42)` $DIR/core/services/relay/evm/config_poller_test.go: `.On("CallContract", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/config_poller_test.go: `.Return(nil, errors.New("something exploded"))` $DIR/core/services/relay/evm/config_poller_test.go: `.New("something exploded")` $DIR/core/services/relay/evm/config_poller_test.go: `.LatestConfigDetails(testutils.Context(t))` $DIR/core/services/relay/evm/config_poller_test.go: `.Context(t)` $DIR/core/services/relay/evm/config_poller_test.go: `.AssertExpectations(t)` $DIR/core/services/relay/evm/config_poller_test.go: `.DeployOCR2Aggregator( user, b, linkTokenAddress, big.NewInt(0), big.NewInt(10), accessAddress, accessAddress, 9, "TEST", )` $DIR/core/services/relay/evm/config_poller_test.go: `.NewInt(0)` $DIR/core/services/relay/evm/config_poller_test.go: `.NewInt(10)` $DIR/core/services/relay/evm/config_poller_test.go: `.Commit()` $DIR/core/services/relay/evm/config_poller_test.go: `.NewLogPoller(t)` $DIR/core/services/relay/evm/config_poller_test.go: `.On("RegisterFilter", mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/config_poller_test.go: `.Return(nil)` $DIR/core/services/relay/evm/config_poller_test.go: `.On("Logs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/config_poller_test.go: `.Return(nil, nil)` $DIR/core/services/relay/evm/config_poller_test.go: `.On("LatestLogByEventSigWithConfs", mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/config_poller_test.go: `.Return(nil, sql.ErrNoRows)` $DIR/core/services/relay/evm/config_poller_test.go: `.Run("if callReadConfig succeeds", func(t *testing.T) { cp, err := newConfigPoller(ctx, lggr, ethClient, mp, ocrAddress, &configStoreContractAddr, ld) require.NoError(t, err) t.Run("when config has not been set, returns error", func(t *testing.T) { _, err := cp.LatestConfig(testutils.Context(t), 0) require.Error(t, err) assert.Contains(t, err.Error(), "config details missing while trying to lookup config in store") }) t.Run("when config has been set, returns config", func(t *testing.T) { b.Commit() onchainDetails, err := ocrContract.LatestConfigDetails(nil) require.NoError(t, err) contractConfig := setConfig(t, median.OffchainConfig{ AlphaReportInfinite: false, AlphaReportPPB: 0, AlphaAcceptInfinite: true, AlphaAcceptPPB: 0, DeltaC: 10, }, ocrContract, user) signerAddresses, err := OnchainPublicKeyToAddress(contractConfig.Signers) require.NoError(t, err) transmitterAddresses, err := AccountToAddress(contractConfig.Transmitters) require.NoError(t, err) configuration := ocrconfigurationstoreevmsimple.OCRConfigurationStoreEVMSimpleConfigurationEVMSimple{ Signers: signerAddresses, Transmitters: transmitterAddresses, OnchainConfig: contractConfig.OnchainConfig, OffchainConfig: contractConfig.OffchainConfig, ContractAddress: ocrAddress, OffchainConfigVersion: contractConfig.OffchainConfigVersion, ConfigCount: 1, F: contractConfig.F, } addConfig(t, user, configStoreContract, configuration) b.Commit() onchainDetails, err = ocrContract.LatestConfigDetails(nil) require.NoError(t, err) newConfig, err := cp.LatestConfig(testutils.Context(t), 0) require.NoError(t, err) assert.Equal(t, onchainDetails.ConfigDigest, [32]byte(newConfig.ConfigDigest)) assert.Equal(t, contractConfig.Signers, newConfig.Signers) assert.Equal(t, contractConfig.Transmitters, newConfig.Transmitters) assert.Equal(t, contractConfig.F, newConfig.F) assert.Equal(t, contractConfig.OffchainConfigVersion, newConfig.OffchainConfigVersion) assert.Equal(t, contractConfig.OffchainConfig, newConfig.OffchainConfig) }) })` $DIR/core/services/relay/evm/config_poller_test.go: `.Run("when config has not been set, returns error", func(t *testing.T) { _, err := cp.LatestConfig(testutils.Context(t), 0) require.Error(t, err) assert.Contains(t, err.Error(), "config details missing while trying to lookup config in store") })` $DIR/core/services/relay/evm/config_poller_test.go: `.LatestConfig(testutils.Context(t), 0)` $DIR/core/services/relay/evm/config_poller_test.go: `.Context(t)` $DIR/core/services/relay/evm/config_poller_test.go: `.Run("when config has been set, returns config", func(t *testing.T) { b.Commit() onchainDetails, err := ocrContract.LatestConfigDetails(nil) require.NoError(t, err) contractConfig := setConfig(t, median.OffchainConfig{ AlphaReportInfinite: false, AlphaReportPPB: 0, AlphaAcceptInfinite: true, AlphaAcceptPPB: 0, DeltaC: 10, }, ocrContract, user) signerAddresses, err := OnchainPublicKeyToAddress(contractConfig.Signers) require.NoError(t, err) transmitterAddresses, err := AccountToAddress(contractConfig.Transmitters) require.NoError(t, err) configuration := ocrconfigurationstoreevmsimple.OCRConfigurationStoreEVMSimpleConfigurationEVMSimple{ Signers: signerAddresses, Transmitters: transmitterAddresses, OnchainConfig: contractConfig.OnchainConfig, OffchainConfig: contractConfig.OffchainConfig, ContractAddress: ocrAddress, OffchainConfigVersion: contractConfig.OffchainConfigVersion, ConfigCount: 1, F: contractConfig.F, } addConfig(t, user, configStoreContract, configuration) b.Commit() onchainDetails, err = ocrContract.LatestConfigDetails(nil) require.NoError(t, err) newConfig, err := cp.LatestConfig(testutils.Context(t), 0) require.NoError(t, err) assert.Equal(t, onchainDetails.ConfigDigest, [32]byte(newConfig.ConfigDigest)) assert.Equal(t, contractConfig.Signers, newConfig.Signers) assert.Equal(t, contractConfig.Transmitters, newConfig.Transmitters) assert.Equal(t, contractConfig.F, newConfig.F) assert.Equal(t, contractConfig.OffchainConfigVersion, newConfig.OffchainConfigVersion) assert.Equal(t, contractConfig.OffchainConfig, newConfig.OffchainConfig) })` $DIR/core/services/relay/evm/config_poller_test.go: `.Commit()` $DIR/core/services/relay/evm/config_poller_test.go: `.LatestConfigDetails(nil)` $DIR/core/services/relay/evm/config_poller_test.go: `.Commit()` $DIR/core/services/relay/evm/config_poller_test.go: `.LatestConfigDetails(nil)` $DIR/core/services/relay/evm/config_poller_test.go: `.LatestConfig(testutils.Context(t), 0)` $DIR/core/services/relay/evm/config_poller_test.go: `.Context(t)` $DIR/core/services/relay/evm/config_poller_test.go: `.Run("returns error if callReadConfig fails", func(t *testing.T) { failingClient := new(evmClientMocks.Client) failingClient.On("ConfiguredChainID").Return(big.NewInt(42)) failingClient.On("CallContract", mock.Anything, mock.MatchedBy(func(callArgs ethereum.CallMsg) bool { // initial call to retrieve config store address from aggregator return *callArgs.To == ocrAddress }), mock.Anything).Return(nil, errors.New("something exploded")).Once() cp, err := newConfigPoller(ctx, lggr, failingClient, mp, ocrAddress, &configStoreContractAddr, ld) require.NoError(t, err) _, err = cp.LatestConfig(testutils.Context(t), 0) assert.EqualError(t, err, "failed to get latest config details: something exploded") failingClient.AssertExpectations(t) })` $DIR/core/services/relay/evm/config_poller_test.go: `.On("ConfiguredChainID")` $DIR/core/services/relay/evm/config_poller_test.go: `.Return(big.NewInt(42))` $DIR/core/services/relay/evm/config_poller_test.go: `.NewInt(42)` $DIR/core/services/relay/evm/config_poller_test.go: `.On("CallContract", mock.Anything, mock.MatchedBy(func(callArgs ethereum.CallMsg) bool { // initial call to retrieve config store address from aggregator return *callArgs.To == ocrAddress }), mock.Anything)` $DIR/core/services/relay/evm/config_poller_test.go: `.MatchedBy(func(callArgs ethereum.CallMsg) bool { // initial call to retrieve config store address from aggregator return *callArgs.To == ocrAddress })` $DIR/core/services/relay/evm/config_poller_test.go: `.Return(nil, errors.New("something exploded"))` $DIR/core/services/relay/evm/config_poller_test.go: `.New("something exploded")` $DIR/core/services/relay/evm/config_poller_test.go: `.Once()` $DIR/core/services/relay/evm/config_poller_test.go: `.LatestConfig(testutils.Context(t), 0)` $DIR/core/services/relay/evm/config_poller_test.go: `.Context(t)` $DIR/core/services/relay/evm/config_poller_test.go: `.AssertExpectations(t)` $DIR/core/services/relay/evm/contract_transmitter_test.go: `c.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(digestAndEpochDontScanLogs, nil).Once()` $DIR/core/services/relay/evm/contract_transmitter_test.go: `lp.On("RegisterFilter", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/relay/evm/contract_transmitter_test.go: `c.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(digestAndEpochScanLogs, nil).Once()` $DIR/core/services/relay/evm/contract_transmitter_test.go: `lp.On("LatestLogByEventSigWithConfs", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&logpoller.Log{ Data: transmitted2, }, nil)` $DIR/core/services/relay/evm/contract_transmitter_test.go: `digest, epoch, err = ot.LatestConfigDigestAndEpoch(testutils.Context(t))` $DIR/core/services/relay/evm/contract_transmitter_test.go: `.TestLogger(t)` $DIR/core/services/relay/evm/contract_transmitter_test.go: `.NewClient(t)` $DIR/core/services/relay/evm/contract_transmitter_test.go: `.NewLogPoller(t)` $DIR/core/services/relay/evm/contract_transmitter_test.go: `.Context(t)` $DIR/core/services/relay/evm/contract_transmitter_test.go: `.DecodeString( "0000000000000000000000000000000000000000000000000000000000000000" + // false "000130da6b9315bd59af6b0a3f5463c0d0a39e92eaa34cbcbdbace7b3bfcc776" + // config digest "0000000000000000000000000000000000000000000000000000000000000002")` $DIR/core/services/relay/evm/contract_transmitter_test.go: `.On("CallContract", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/contract_transmitter_test.go: `.Return(digestAndEpochDontScanLogs, nil)` $DIR/core/services/relay/evm/contract_transmitter_test.go: `.Once()` $DIR/core/services/relay/evm/contract_transmitter_test.go: `.JSON(strings.NewReader(ocr2aggregator.OCR2AggregatorABI))` $DIR/core/services/relay/evm/contract_transmitter_test.go: `.NewReader(ocr2aggregator.OCR2AggregatorABI)` $DIR/core/services/relay/evm/contract_transmitter_test.go: `.On("RegisterFilter", mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/contract_transmitter_test.go: `.Return(nil)` $DIR/core/services/relay/evm/contract_transmitter_test.go: `.LatestConfigDigestAndEpoch(testutils.Context(t))` $DIR/core/services/relay/evm/contract_transmitter_test.go: `.Context(t)` $DIR/core/services/relay/evm/contract_transmitter_test.go: `.DecodeString( "0000000000000000000000000000000000000000000000000000000000000001" + // true "000130da6b9315bd59af6b0a3f5463c0d0a39e92eaa34cbcbdbace7b3bfcc776" + // config digest "0000000000000000000000000000000000000000000000000000000000000002")` $DIR/core/services/relay/evm/contract_transmitter_test.go: `.On("CallContract", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/contract_transmitter_test.go: `.Return(digestAndEpochScanLogs, nil)` $DIR/core/services/relay/evm/contract_transmitter_test.go: `.Once()` $DIR/core/services/relay/evm/contract_transmitter_test.go: `.DecodeString( "000130da6b9315bd59af6b0a3f5463c0d0a39e92eaa34cbcbdbace7b3bfcc777" + // config digest "0000000000000000000000000000000000000000000000000000000000000002")` $DIR/core/services/relay/evm/contract_transmitter_test.go: `.On("LatestLogByEventSigWithConfs", mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/contract_transmitter_test.go: `.Return(&logpoller.Log{ Data: transmitted2, }, nil)` $DIR/core/services/relay/evm/contract_transmitter_test.go: `.LatestConfigDigestAndEpoch(testutils.Context(t))` $DIR/core/services/relay/evm/contract_transmitter_test.go: `.Context(t)` $DIR/core/services/relay/evm/contract_transmitter_test.go: `.FromAccount()` $DIR/core/services/relay/evm/contract_transmitter_test.go: `.String()` $DIR/core/services/relay/evm/evm_test.go: `t.Run(tt.name, func(t *testing.T) { c := evm.RelayerOpts{ DS: tt.fields.DS, CSAETHKeystore: tt.fields.CSAETHKeystore, CapabilitiesRegistry: tt.fields.CapabilitiesRegistry, } err := c.Validate() if tt.wantErrContains != "" { assert.Contains(t, err.Error(), tt.wantErrContains) } else { assert.NoError(t, err) } })` $DIR/core/services/relay/evm/evm_test.go: `.Run(tt.name, func(t *testing.T) { c := evm.RelayerOpts{ DS: tt.fields.DS, CSAETHKeystore: tt.fields.CSAETHKeystore, CapabilitiesRegistry: tt.fields.CapabilitiesRegistry, } err := c.Validate() if tt.wantErrContains != "" { assert.Contains(t, err.Error(), tt.wantErrContains) } else { assert.NoError(t, err) } })` $DIR/core/services/relay/evm/evm_test.go: `.Validate()` $DIR/core/services/relay/evm/functions/config_poller_test.go: `t.Run("FunctionsPlugin", func(t *testing.T) { runTest(t, functions.FunctionsPlugin, functions.FunctionsDigestPrefix) })` $DIR/core/services/relay/evm/functions/config_poller_test.go: `runTest(t, functions.FunctionsPlugin, functions.FunctionsDigestPrefix)` $DIR/core/services/relay/evm/functions/config_poller_test.go: `t.Run("ThresholdPlugin", func(t *testing.T) { runTest(t, functions.ThresholdPlugin, functions.ThresholdDigestPrefix) })` $DIR/core/services/relay/evm/functions/config_poller_test.go: `runTest(t, functions.ThresholdPlugin, functions.ThresholdDigestPrefix)` $DIR/core/services/relay/evm/functions/config_poller_test.go: `runTest(t, functions.S4Plugin, functions.S4DigestPrefix)` $DIR/core/services/relay/evm/functions/config_poller_test.go: `.Run("FunctionsPlugin", func(t *testing.T) { runTest(t, functions.FunctionsPlugin, functions.FunctionsDigestPrefix) })` $DIR/core/services/relay/evm/functions/config_poller_test.go: `.Run("ThresholdPlugin", func(t *testing.T) { runTest(t, functions.ThresholdPlugin, functions.ThresholdDigestPrefix) })` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `c.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(digestAndEpochDontScanLogs, nil).Once()` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `lp.On("RegisterFilter", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `lp.On("RegisterFilter", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `txm.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: coordinatorAddress, EncodedPayload: payload, FeeLimit: gasLimit, ForwarderAddress: gethcommon.Address{}, Meta: nil, Strategy: strategy, }).Return(txmgr.Tx{}, nil).Once()` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `signatures = append(signatures, ocrtypes.AttributedOnchainSignature{})` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `lp.On("RegisterFilter", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `txm.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: coordinatorAddress1, EncodedPayload: payload, FeeLimit: gasLimit, ForwarderAddress: gethcommon.Address{}, Meta: nil, Strategy: strategy, }).Return(txmgr.Tx{}, nil).Once()` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.Context(t)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewSqlxDB(t)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewKeyStore(t, db)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.Eth()` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.TestLogger(t)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewClient(t)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewLogPoller(t)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.DecodeString( "0000000000000000000000000000000000000000000000000000000000000000" + // scan logs = false digestStr + "0000000000000000000000000000000000000000000000000000000000000002")` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.On("CallContract", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.Return(digestAndEpochDontScanLogs, nil)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.Once()` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.JSON(strings.NewReader(ocr2aggregator.OCR2AggregatorABI))` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewReader(ocr2aggregator.OCR2AggregatorABI)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewMockEvmTxManager(t)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewInt(0)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.On("RegisterFilter", mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.Return(nil)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewFunctionsContractTransmitter( c, contractABI, lp, lggr, 1, txm, []gethcommon.Address{fromAddress}, gasLimit, effectiveTransmitterAddress, strategy, txmgr.TransmitCheckerSpec{}, chainID, ethKeyStore, )` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.LatestConfigDigestAndEpoch(testutils.Context(t))` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.Context(t)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.Context(t)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewSqlxDB(t)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewKeyStore(t, db)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.Eth()` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewAddress()` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewAddress()` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.TestLogger(t)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewClient(t)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewLogPoller(t)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.JSON(strings.NewReader(ocr2aggregator.OCR2AggregatorABI))` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewReader(ocr2aggregator.OCR2AggregatorABI)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewMockEvmTxManager(t)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewInt(0)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.On("RegisterFilter", mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.Return(nil)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewFunctionsContractTransmitter( c, contractABI, lp, lggr, contractVersion, txm, []gethcommon.Address{fromAddress}, gasLimit, effectiveTransmitterAddress, strategy, txmgr.TransmitCheckerSpec{}, chainID, ethKeyStore, )` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.DecodeString("000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f")` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.Bytes()` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewReportCodec(contractVersion)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.EncodeReport(processedRequests)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.RawReportContext(ocrtypes.ReportContext{})` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.Pack("transmit", rawReportCtx, reportBytes, rs, ss, vs)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: coordinatorAddress, EncodedPayload: payload, FeeLimit: gasLimit, ForwarderAddress: gethcommon.Address{}, Meta: nil, Strategy: strategy, })` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.Return(txmgr.Tx{}, nil)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.Once()` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.Transmit(testutils.Context(t), ocrtypes.ReportContext{}, reportBytes, signatures)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.Context(t)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.Context(t)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewSqlxDB(t)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewKeyStore(t, db)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.Eth()` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewAddress()` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewAddress()` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewAddress()` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.TestLogger(t)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewClient(t)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewLogPoller(t)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.JSON(strings.NewReader(ocr2aggregator.OCR2AggregatorABI))` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewReader(ocr2aggregator.OCR2AggregatorABI)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewMockEvmTxManager(t)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewInt(0)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.On("RegisterFilter", mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.Return(nil)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewFunctionsContractTransmitter( c, contractABI, lp, lggr, contractVersion, txm, []gethcommon.Address{fromAddress}, gasLimit, effectiveTransmitterAddress, strategy, txmgr.TransmitCheckerSpec{}, chainID, ethKeyStore, )` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.DecodeString("110102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f")` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.DecodeString("220102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f")` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.Bytes()` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.Bytes()` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.NewReportCodec(contractVersion)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.EncodeReport(processedRequests)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.RawReportContext(ocrtypes.ReportContext{})` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.Pack("transmit", rawReportCtx, reportBytes, rs, ss, vs)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.On("CreateTransaction", mock.Anything, txmgr.TxRequest{ FromAddress: fromAddress, ToAddress: coordinatorAddress1, EncodedPayload: payload, FeeLimit: gasLimit, ForwarderAddress: gethcommon.Address{}, Meta: nil, Strategy: strategy, })` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.Return(txmgr.Tx{}, nil)` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.Once()` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.Transmit(testutils.Context(t), ocrtypes.ReportContext{}, reportBytes, []ocrtypes.AttributedOnchainSignature{})` $DIR/core/services/relay/evm/functions/contract_transmitter_test.go: `.Context(t)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: int64(100)}, nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `lp.On("Logs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]logpoller.Log{}, nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `client.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(addr(t, "01"), nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `lp.On("RegisterFilter", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `lp.On("GetFilters").Return(map[string]logpoller.Filter{}, nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `lpWrapper.SubscribeToUpdates(ctx, "mock_subscriber", subscriber)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `servicetest.Run(t, lpWrapper)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `subscriber.updates.Wait()` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: int64(100)}, nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `client.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(addr(t, "00"), nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `servicetest.Run(t, lpWrapper)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: int64(100)}, nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `client.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(addr(t, "01"), nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `lp.On("RegisterFilter", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `lp.On("GetFilters").Return(map[string]logpoller.Filter{}, nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `lpWrapper.SubscribeToUpdates(ctx, "mock_subscriber", subscriber)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `lp.On("Logs", mock.Anything, mock.Anything, mock.Anything, functions_coordinator.FunctionsCoordinatorOracleResponse{}.Topic(), mock.Anything).Return([]logpoller.Log{}, nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `lp.On("Logs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]logpoller.Log{mockedLog}, nil).Once()` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `lp.On("Logs", mock.Anything, mock.Anything, mock.Anything, functions_coordinator.FunctionsCoordinatorOracleRequest{}.Topic(), mock.Anything).Return([]logpoller.Log{}, nil).Once()` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `lp.On("Logs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]logpoller.Log{mockedLog}, nil).Once()` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `servicetest.Run(t, lpWrapper)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `subscriber.updates.Wait()` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `oracleRequests, _, err = lpWrapper.LatestEvents(ctx)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `oracleRequests, _, err = lpWrapper.LatestEvents(ctx)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `inputLogs[i] = getMockedRequestLog(t)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `inputLogs[0].Topics = [][]byte{[]byte("invalid topic")}` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `copy(mockedRequestId[:], mockedRequestLog.Topics[1])` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `mockedDetectedEvents.isPreviouslyDetected[mockedRequestId] = struct{}{}` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `mockedDetectedEvents.detectedEventsOrdered[0] = detectedEvent{ requestId: mockedRequestId, timeDetected: time.Now().Add(-time.Second * time.Duration(logPollerCacheDurationSecDefault+1)), }` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `wrapper.activeCoordinator = activeCoord` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `wrapper.proposedCoordinator = proposedCoord` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `lp.On("RegisterFilter", ctx, mock.Anything).Return(nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `lp.On("GetFilters").Return(existingFilters, nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `lp.On("UnregisterFilter", ctx, activeCoordFilterName).Return(nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `wrapper.handleRouteUpdate(ctx, newActiveCoord, newProposedCoord)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Context(t)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.On("LatestBlock", mock.Anything)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Return(logpoller.LogPollerBlock{BlockNumber: int64(100)}, nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.On("Logs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Return([]logpoller.Log{}, nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.On("CallContract", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Return(addr(t, "01"), nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.On("RegisterFilter", mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Return(nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.On("GetFilters")` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Return(map[string]logpoller.Filter{}, nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.SubscribeToUpdates(ctx, "mock_subscriber", subscriber)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Run(t, lpWrapper)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.updates.Wait()` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.LatestEvents(ctx)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Context(t)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.On("LatestBlock", mock.Anything)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Return(logpoller.LogPollerBlock{BlockNumber: int64(100)}, nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.On("CallContract", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Return(addr(t, "00"), nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Run(t, lpWrapper)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.LatestEvents(ctx)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Context(t)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.On("LatestBlock", mock.Anything)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Return(logpoller.LogPollerBlock{BlockNumber: int64(100)}, nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.On("CallContract", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Return(addr(t, "01"), nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.On("RegisterFilter", mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Return(nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.On("GetFilters")` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Return(map[string]logpoller.Filter{}, nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.SubscribeToUpdates(ctx, "mock_subscriber", subscriber)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.On("Logs", mock.Anything, mock.Anything, mock.Anything, functions_coordinator.FunctionsCoordinatorOracleResponse{}.Topic(), mock.Anything)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Topic()` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Return([]logpoller.Log{}, nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.On("Logs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Return([]logpoller.Log{mockedLog}, nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Once()` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.On("Logs", mock.Anything, mock.Anything, mock.Anything, functions_coordinator.FunctionsCoordinatorOracleRequest{}.Topic(), mock.Anything)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Topic()` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Return([]logpoller.Log{}, nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Once()` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.On("Logs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Return([]logpoller.Log{mockedLog}, nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Once()` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Run(t, lpWrapper)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.updates.Wait()` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.LatestEvents(ctx)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.LatestEvents(ctx)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.LatestEvents(ctx)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.filterPreviouslyDetectedEvents(inputLogs, &mockedDetectedEvents, "request")` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.filterPreviouslyDetectedEvents(inputLogs, &mockedDetectedEvents, "request")` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Now()` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Add(-time.Second * time.Duration(logPollerCacheDurationSecDefault+1))` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Duration(logPollerCacheDurationSecDefault+1)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.filterPreviouslyDetectedEvents(inputLogs, &mockedDetectedEvents, "request")` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Context(t)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.HexToAddress("0x1")` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.HexToAddress("0x2")` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.HexToAddress("0x3")` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.filterName(activeCoord)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.filterName(proposedCoord)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.filterName(newProposedCoord)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.On("RegisterFilter", ctx, mock.Anything)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Return(nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.On("GetFilters")` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Return(existingFilters, nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.On("UnregisterFilter", ctx, activeCoordFilterName)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.Return(nil)` $DIR/core/services/relay/evm/functions/logpoller_wrapper_test.go: `.handleRouteUpdate(ctx, newActiveCoord, newProposedCoord)` $DIR/core/services/relay/evm/median_test.go: `chain.On("ID").Return(chainID)` $DIR/core/services/relay/evm/median_test.go: `t.Run("wrong chainID", func(t *testing.T) { relayConfigBadChainID := evmtypes.RelayConfig{} rc, err2 := json.Marshal(&relayConfigBadChainID) rargs2 := commontypes.RelayArgs{ContractID: contractID.String(), RelayConfig: rc} require.NoError(t, err2) _, err2 = relayer.NewMedianProvider(rargs2, pargs) assert.ErrorContains(t, err2, "chain id in spec does not match") })` $DIR/core/services/relay/evm/median_test.go: `_, err2 = relayer.NewMedianProvider(rargs2, pargs)` $DIR/core/services/relay/evm/median_test.go: `_, err2 = relayer.NewMedianProvider(rargsBadContractID, pargs)` $DIR/core/services/relay/evm/median_test.go: `.TestLogger(t)` $DIR/core/services/relay/evm/median_test.go: `.NewChain(t)` $DIR/core/services/relay/evm/median_test.go: `.NewRandomEVMChainID()` $DIR/core/services/relay/evm/median_test.go: `.On("ID")` $DIR/core/services/relay/evm/median_test.go: `.Return(chainID)` $DIR/core/services/relay/evm/median_test.go: `.NewAddress()` $DIR/core/services/relay/evm/median_test.go: `.Run("wrong chainID", func(t *testing.T) { relayConfigBadChainID := evmtypes.RelayConfig{} rc, err2 := json.Marshal(&relayConfigBadChainID) rargs2 := commontypes.RelayArgs{ContractID: contractID.String(), RelayConfig: rc} require.NoError(t, err2) _, err2 = relayer.NewMedianProvider(rargs2, pargs) assert.ErrorContains(t, err2, "chain id in spec does not match") })` $DIR/core/services/relay/evm/median_test.go: `.Marshal(&relayConfigBadChainID)` $DIR/core/services/relay/evm/median_test.go: `.String()` $DIR/core/services/relay/evm/median_test.go: `.NewMedianProvider(rargs2, pargs)` $DIR/core/services/relay/evm/median_test.go: `.New(chainID)` $DIR/core/services/relay/evm/median_test.go: `.Marshal(&relayConfig)` $DIR/core/services/relay/evm/median_test.go: `.NewMedianProvider(rargsBadContractID, pargs)` $DIR/core/services/relay/evm/mercury/config_digest_test.go: `backend.Commit()` $DIR/core/services/relay/evm/mercury/config_digest_test.go: `p.Property("onchain/offchain config digests match", prop.ForAll( func( feedID [32]byte, chainID uint64, contractAddress common.Address, configCount uint64, oracles []common.Address, transmitters [][32]byte, f uint8, onchainConfig []byte, offchainConfigVersion uint64, offchainConfig []byte, ) bool { chainIDBig := new(big.Int).SetUint64(chainID) golangDigest := configDigest( feedID, chainIDBig, contractAddress, configCount, oracles, *(*[]credentials.StaticSizedPublicKey)(unsafe.Pointer(&transmitters)), f, onchainConfig, offchainConfigVersion, offchainConfig, ) bigChainID := new(big.Int) bigChainID.SetUint64(chainID) solidityDigest, err := eoa.ExposedConfigDigestFromConfigData(nil, feedID, bigChainID, contractAddress, configCount, oracles, transmitters, f, onchainConfig, offchainConfigVersion, offchainConfig, ) require.NoError(t, err, "could not compute solidity version of config digest") return golangDigest == solidityDigest }, GenHash(t), gen.UInt64(), GenAddress(t), gen.UInt64(), GenAddressArray(t), GenClientPubKeyArray(t), gen.UInt8(), GenBytes(t), gen.UInt64(), GenBytes(t), ))` $DIR/core/services/relay/evm/mercury/config_digest_test.go: `bigChainID.SetUint64(chainID)` $DIR/core/services/relay/evm/mercury/config_digest_test.go: `.GenerateKey()` $DIR/core/services/relay/evm/mercury/config_digest_test.go: `.NewKeyedTransactorWithChainID(key, big.NewInt(1337))` $DIR/core/services/relay/evm/mercury/config_digest_test.go: `.NewInt(1337)` $DIR/core/services/relay/evm/mercury/config_digest_test.go: `.NewSimulatedBackend( core.GenesisAlloc{owner.From: {Balance: new(big.Int).Lsh(big.NewInt(1), 60)}}, ethconfig.Defaults.Miner.GasCeil, )` $DIR/core/services/relay/evm/mercury/config_digest_test.go: `.Lsh(big.NewInt(1), 60)` $DIR/core/services/relay/evm/mercury/config_digest_test.go: `.NewInt(1)` $DIR/core/services/relay/evm/mercury/config_digest_test.go: `.DeployExposedVerifier( owner, backend, )` $DIR/core/services/relay/evm/mercury/config_digest_test.go: `.Commit()` $DIR/core/services/relay/evm/mercury/config_digest_test.go: `.NewProperties(nil)` $DIR/core/services/relay/evm/mercury/config_digest_test.go: `.Property("onchain/offchain config digests match", prop.ForAll( func( feedID [32]byte, chainID uint64, contractAddress common.Address, configCount uint64, oracles []common.Address, transmitters [][32]byte, f uint8, onchainConfig []byte, offchainConfigVersion uint64, offchainConfig []byte, ) bool { chainIDBig := new(big.Int).SetUint64(chainID) golangDigest := configDigest( feedID, chainIDBig, contractAddress, configCount, oracles, *(*[]credentials.StaticSizedPublicKey)(unsafe.Pointer(&transmitters)), f, onchainConfig, offchainConfigVersion, offchainConfig, ) bigChainID := new(big.Int) bigChainID.SetUint64(chainID) solidityDigest, err := eoa.ExposedConfigDigestFromConfigData(nil, feedID, bigChainID, contractAddress, configCount, oracles, transmitters, f, onchainConfig, offchainConfigVersion, offchainConfig, ) require.NoError(t, err, "could not compute solidity version of config digest") return golangDigest == solidityDigest }, GenHash(t), gen.UInt64(), GenAddress(t), gen.UInt64(), GenAddressArray(t), GenClientPubKeyArray(t), gen.UInt8(), GenBytes(t), gen.UInt64(), GenBytes(t), ))` $DIR/core/services/relay/evm/mercury/config_digest_test.go: `.ForAll( func( feedID [32]byte, chainID uint64, contractAddress common.Address, configCount uint64, oracles []common.Address, transmitters [][32]byte, f uint8, onchainConfig []byte, offchainConfigVersion uint64, offchainConfig []byte, ) bool { chainIDBig := new(big.Int).SetUint64(chainID) golangDigest := configDigest( feedID, chainIDBig, contractAddress, configCount, oracles, *(*[]credentials.StaticSizedPublicKey)(unsafe.Pointer(&transmitters)), f, onchainConfig, offchainConfigVersion, offchainConfig, ) bigChainID := new(big.Int) bigChainID.SetUint64(chainID) solidityDigest, err := eoa.ExposedConfigDigestFromConfigData(nil, feedID, bigChainID, contractAddress, configCount, oracles, transmitters, f, onchainConfig, offchainConfigVersion, offchainConfig, ) require.NoError(t, err, "could not compute solidity version of config digest") return golangDigest == solidityDigest }, GenHash(t), gen.UInt64(), GenAddress(t), gen.UInt64(), GenAddressArray(t), GenClientPubKeyArray(t), gen.UInt8(), GenBytes(t), gen.UInt64(), GenBytes(t), )` $DIR/core/services/relay/evm/mercury/config_digest_test.go: `.SetUint64(chainID)` $DIR/core/services/relay/evm/mercury/config_digest_test.go: `.Pointer(&transmitters)` $DIR/core/services/relay/evm/mercury/config_digest_test.go: `.SetUint64(chainID)` $DIR/core/services/relay/evm/mercury/config_digest_test.go: `.ExposedConfigDigestFromConfigData(nil, feedID, bigChainID, contractAddress, configCount, oracles, transmitters, f, onchainConfig, offchainConfigVersion, offchainConfig, )` $DIR/core/services/relay/evm/mercury/config_digest_test.go: `.UInt64()` $DIR/core/services/relay/evm/mercury/config_digest_test.go: `.UInt64()` $DIR/core/services/relay/evm/mercury/config_digest_test.go: `.UInt8()` $DIR/core/services/relay/evm/mercury/config_digest_test.go: `.UInt64()` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `oracles = append(oracles, confighelper2.OracleIdentityExtra{ OracleIdentity: confighelper2.OracleIdentity{ OnchainPublicKey: evmutils.RandomAddress().Bytes(), TransmitAccount: ocrtypes2.Account(evmutils.RandomAddress().String()), OffchainPublicKey: evmutils.RandomBytes32(), PeerID: utils.MustNewPeerID(), }, ConfigEncryptionPublicKey: evmutils.RandomBytes32(), })` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `offchainTransmitters[i] = oracles[i].OffchainPublicKey` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `encodedTransmitter[i] = ocrtypes2.Account(fmt.Sprintf("%x", oracles[i].OffchainPublicKey[:]))` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `_, err = th.verifierContract.SetConfig(th.user, feedIDBytes, signerAddresses, offchainTransmitters, f, onchainConfig, offchainConfigVersion, offchainConfig, nil)` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `th.backend.Commit()` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `gomega.NewGomegaWithT(t).Eventually(func() bool { th.backend.Commit() configBlock, digest, err = th.configPoller.LatestConfigDetails(testutils.Context(t)) require.NoError(t, err) return ocrtypes2.ConfigDigest{} != digest }, testutils.WaitTimeout(t), 100*time.Millisecond).Should(gomega.BeTrue())` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `th.backend.Commit()` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `configBlock, digest, err = th.configPoller.LatestConfigDetails(testutils.Context(t))` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.NewHash()` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.configPoller.Notify()` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.configPoller.LatestConfigDetails(testutils.Context(t))` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.RandomAddress()` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.Bytes()` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.Account(evmutils.RandomAddress().String())` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.RandomAddress()` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.String()` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.RandomBytes32()` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.MustNewPeerID()` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.RandomBytes32()` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.MustNewType("tuple()")` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.Encode(map[string]interface{}{}, configType)` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.ContractSetConfigArgsForTests( 2*time.Second, // DeltaProgress 20*time.Second, // DeltaResend 100*time.Millisecond, // DeltaRound 0, // DeltaGrace 1*time.Minute, // DeltaStage 100, // rMax []int{len(oracles)}, // S oracles, []byte{}, // reportingPluginConfig []byte, 0, // Max duration query 250*time.Millisecond, // Max duration observation 250*time.Millisecond, // MaxDurationReport 250*time.Millisecond, // MaxDurationShouldAcceptFinalizedReport 250*time.Millisecond, // MaxDurationShouldTransmitAcceptedReport int(f), // f onchainConfigVal, )` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.Account(fmt.Sprintf("%x", oracles[i].OffchainPublicKey[:]))` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.Sprintf("%x", oracles[i].OffchainPublicKey[:])` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.verifierContract.SetConfig(th.user, feedIDBytes, signerAddresses, offchainTransmitters, f, onchainConfig, offchainConfigVersion, offchainConfig, nil)` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.backend.Commit()` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.backend.BlockByNumber(testutils.Context(t), nil)` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.NewGomegaWithT(t)` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.Eventually(func() bool { th.backend.Commit() configBlock, digest, err = th.configPoller.LatestConfigDetails(testutils.Context(t)) require.NoError(t, err) return ocrtypes2.ConfigDigest{} != digest }, testutils.WaitTimeout(t), 100*time.Millisecond)` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.backend.Commit()` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.configPoller.LatestConfigDetails(testutils.Context(t))` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.WaitTimeout(t)` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.Should(gomega.BeTrue())` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.BeTrue()` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.configPoller.LatestConfig(testutils.Context(t), configBlock)` $DIR/core/services/relay/evm/mercury/config_poller_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/offchain_config_digester_test.go: `_, err = OffchainConfigDigester{}.ConfigDigest(types.ContractConfig{ Signers: []types.OnchainPublicKey{{1, 2}}, })` $DIR/core/services/relay/evm/mercury/offchain_config_digester_test.go: `_, err = OffchainConfigDigester{}.ConfigDigest(types.ContractConfig{ Transmitters: []types.Account{"0x"}, })` $DIR/core/services/relay/evm/mercury/offchain_config_digester_test.go: `_, err = OffchainConfigDigester{}.ConfigDigest(types.ContractConfig{ Transmitters: []types.Account{"7343581f55146951b0f678dc6cfa8fd360e2f353"}, })` $DIR/core/services/relay/evm/mercury/offchain_config_digester_test.go: `_, err = OffchainConfigDigester{}.ConfigDigest(types.ContractConfig{ Transmitters: []types.Account{"7343581f55146951b0f678dc6cfa8fd360e2f353aabbccddeeffaaccddeeffaz"}, })` $DIR/core/services/relay/evm/mercury/offchain_config_digester_test.go: `_, err = OffchainConfigDigester{ChainID: big.NewInt(0)}.ConfigDigest(types.ContractConfig{ Transmitters: []types.Account{"7343581f55146951b0f678dc6cfa8fd360e2f353aabbccddeeffaaccddeeffaa"}, })` $DIR/core/services/relay/evm/mercury/offchain_config_digester_test.go: `.NewInt(0)` $DIR/core/services/relay/evm/mercury/offchain_config_digester_test.go: `.ConfigDigest(types.ContractConfig{})` $DIR/core/services/relay/evm/mercury/offchain_config_digester_test.go: `.NewInt(0)` $DIR/core/services/relay/evm/mercury/offchain_config_digester_test.go: `.ConfigDigest(types.ContractConfig{})` $DIR/core/services/relay/evm/mercury/offchain_config_digester_test.go: `.NewInt(1)` $DIR/core/services/relay/evm/mercury/offchain_config_digester_test.go: `.ConfigDigest(types.ContractConfig{})` $DIR/core/services/relay/evm/mercury/offchain_config_digester_test.go: `.NewInt(1)` $DIR/core/services/relay/evm/mercury/offchain_config_digester_test.go: `.ConfigDigest(types.ContractConfig{})` $DIR/core/services/relay/evm/mercury/offchain_config_digester_test.go: `.ConfigDigest(types.ContractConfig{ Signers: []types.OnchainPublicKey{{1, 2}}, })` $DIR/core/services/relay/evm/mercury/offchain_config_digester_test.go: `.ConfigDigest(types.ContractConfig{ Transmitters: []types.Account{"0x"}, })` $DIR/core/services/relay/evm/mercury/offchain_config_digester_test.go: `.ConfigDigest(types.ContractConfig{ Transmitters: []types.Account{"7343581f55146951b0f678dc6cfa8fd360e2f353"}, })` $DIR/core/services/relay/evm/mercury/offchain_config_digester_test.go: `.ConfigDigest(types.ContractConfig{ Transmitters: []types.Account{"7343581f55146951b0f678dc6cfa8fd360e2f353aabbccddeeffaaccddeeffaz"}, })` $DIR/core/services/relay/evm/mercury/offchain_config_digester_test.go: `.NewInt(0)` $DIR/core/services/relay/evm/mercury/offchain_config_digester_test.go: `.ConfigDigest(types.ContractConfig{ Transmitters: []types.Account{"7343581f55146951b0f678dc6cfa8fd360e2f353aabbccddeeffaaccddeeffaa"}, })` $DIR/core/services/relay/evm/mercury/orm_test.go: `pgtest.MustExec(t, db, `SET CONSTRAINTS mercury_transmit_requests_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/orm_test.go: `pgtest.MustExec(t, db, `SET CONSTRAINTS feed_latest_reports_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/orm_test.go: `reportContexts[i] = ocrtypes.ReportContext{ ReportTimestamp: ocrtypes.ReportTimestamp{ ConfigDigest: ocrtypes.ConfigDigest{'1'}, Epoch: 10, Round: uint8(i), }, ExtraHash: [32]byte{'2'}, }` $DIR/core/services/relay/evm/mercury/orm_test.go: `err = orm.InsertTransmitRequest(ctx, []string{sURL}, &pb.TransmitRequest{Payload: reports[0]}, jobID, reportContexts[0])` $DIR/core/services/relay/evm/mercury/orm_test.go: `err = orm.InsertTransmitRequest(ctx, []string{sURL}, &pb.TransmitRequest{Payload: reports[1]}, jobID, reportContexts[1])` $DIR/core/services/relay/evm/mercury/orm_test.go: `err = orm.InsertTransmitRequest(ctx, []string{sURL}, &pb.TransmitRequest{Payload: reports[2]}, jobID, reportContexts[2])` $DIR/core/services/relay/evm/mercury/orm_test.go: `err = orm.InsertTransmitRequest(ctx, []string{sURL2}, &pb.TransmitRequest{Payload: reports[3]}, jobID, reportContexts[0])` $DIR/core/services/relay/evm/mercury/orm_test.go: `transmissions, err = orm.GetTransmitRequests(ctx, sURL2, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `l, err = orm.LatestReport(testutils.Context(t), feedID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `err = orm.DeleteTransmitRequests(ctx, sURL, []*pb.TransmitRequest{{Payload: reports[1]}})` $DIR/core/services/relay/evm/mercury/orm_test.go: `transmissions, err = orm.GetTransmitRequests(ctx, sURL, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `l, err = orm.LatestReport(testutils.Context(t), feedID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `err = orm.DeleteTransmitRequests(ctx, sURL, []*pb.TransmitRequest{{Payload: []byte("does-not-exist")}})` $DIR/core/services/relay/evm/mercury/orm_test.go: `transmissions, err = orm.GetTransmitRequests(ctx, sURL, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `err = orm.DeleteTransmitRequests(ctx, sURL, []*pb.TransmitRequest{ {Payload: reports[0]}, {Payload: reports[2]}, })` $DIR/core/services/relay/evm/mercury/orm_test.go: `l, err = orm.LatestReport(testutils.Context(t), feedID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `transmissions, err = orm.GetTransmitRequests(ctx, sURL, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `err = orm.InsertTransmitRequest(ctx, []string{sURL}, &pb.TransmitRequest{Payload: reports[3]}, jobID, reportContexts[3])` $DIR/core/services/relay/evm/mercury/orm_test.go: `transmissions, err = orm.GetTransmitRequests(ctx, sURL, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `err = orm.InsertTransmitRequest(ctx, []string{sURL}, &pb.TransmitRequest{Payload: reports[3]}, jobID, reportContexts[3])` $DIR/core/services/relay/evm/mercury/orm_test.go: `err = orm.InsertTransmitRequest(ctx, []string{sURL}, &pb.TransmitRequest{Payload: reports[3]}, jobID, reportContexts[3])` $DIR/core/services/relay/evm/mercury/orm_test.go: `transmissions, err = orm.GetTransmitRequests(ctx, sURL, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `l, err = orm.LatestReport(testutils.Context(t), feedID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `transmissions, err = orm.GetTransmitRequests(ctx, sURL2, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `pgtest.MustExec(t, db, `SET CONSTRAINTS mercury_transmit_requests_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/orm_test.go: `pgtest.MustExec(t, db, `SET CONSTRAINTS feed_latest_reports_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/orm_test.go: `reportContexts[i] = ocrtypes.ReportContext{ ReportTimestamp: ocrtypes.ReportTimestamp{ ConfigDigest: ocrtypes.ConfigDigest{'1'}, Epoch: 10, Round: uint8(i), }, ExtraHash: [32]byte{'2'}, }` $DIR/core/services/relay/evm/mercury/orm_test.go: `transmissions, err = orm.GetTransmitRequests(ctx, sURL2, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `transmissions, err = orm.GetTransmitRequests(ctx, sURL3, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `pgtest.MustExec(t, db, `SET CONSTRAINTS mercury_transmit_requests_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/orm_test.go: `pgtest.MustExec(t, db, `SET CONSTRAINTS feed_latest_reports_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/orm_test.go: `err = orm.InsertTransmitRequest(ctx, []string{sURL}, &pb.TransmitRequest{Payload: reports[1]}, jobID, makeReportContext(1, 2))` $DIR/core/services/relay/evm/mercury/orm_test.go: `err = orm.InsertTransmitRequest(ctx, []string{sURL2}, &pb.TransmitRequest{Payload: reports[0]}, jobID, makeReportContext(1, 0))` $DIR/core/services/relay/evm/mercury/orm_test.go: `err = orm.InsertTransmitRequest(ctx, []string{sURL2}, &pb.TransmitRequest{Payload: reports[0]}, jobID, makeReportContext(1, 1))` $DIR/core/services/relay/evm/mercury/orm_test.go: `err = orm.InsertTransmitRequest(ctx, []string{sURL2}, &pb.TransmitRequest{Payload: reports[1]}, jobID, makeReportContext(1, 2))` $DIR/core/services/relay/evm/mercury/orm_test.go: `err = orm.InsertTransmitRequest(ctx, []string{sURL2}, &pb.TransmitRequest{Payload: reports[2]}, jobID, makeReportContext(1, 3))` $DIR/core/services/relay/evm/mercury/orm_test.go: `err = orm.PruneTransmitRequests(ctx, sURL, jobID, 5)` $DIR/core/services/relay/evm/mercury/orm_test.go: `err = orm.PruneTransmitRequests(ctx, sURL, jobID, 2)` $DIR/core/services/relay/evm/mercury/orm_test.go: `transmissions, err = orm.GetTransmitRequests(ctx, sURL, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `err = orm.PruneTransmitRequests(ctx, sURL, -1, 2)` $DIR/core/services/relay/evm/mercury/orm_test.go: `transmissions, err = orm.GetTransmitRequests(ctx, sURL, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `err = orm.InsertTransmitRequest(ctx, []string{sURL}, &pb.TransmitRequest{Payload: reports[2]}, jobID, makeReportContext(2, 1))` $DIR/core/services/relay/evm/mercury/orm_test.go: `err = orm.InsertTransmitRequest(ctx, []string{sURL}, &pb.TransmitRequest{Payload: reports[3]}, jobID, makeReportContext(2, 2))` $DIR/core/services/relay/evm/mercury/orm_test.go: `err = orm.PruneTransmitRequests(ctx, sURL, jobID, 3)` $DIR/core/services/relay/evm/mercury/orm_test.go: `transmissions, err = orm.GetTransmitRequests(ctx, sURL, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `transmissions, err = orm.GetTransmitRequests(ctx, sURL2, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `pgtest.MustExec(t, db, `SET CONSTRAINTS mercury_transmit_requests_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/orm_test.go: `pgtest.MustExec(t, db, `SET CONSTRAINTS feed_latest_reports_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/orm_test.go: `err = orm.InsertTransmitRequest(ctx, []string{sURL2}, &pb.TransmitRequest{Payload: reports[1]}, jobID, makeReportContext( 0, 0, ))` $DIR/core/services/relay/evm/mercury/orm_test.go: `t.Run("replaces if epoch and round are larger", func(t *testing.T) { err = orm.InsertTransmitRequest(ctx, []string{"foo"}, &pb.TransmitRequest{Payload: reports[1]}, jobID, makeReportContext(1, 1)) require.NoError(t, err) l, err = orm.LatestReport(testutils.Context(t), feedID) require.NoError(t, err) assert.Equal(t, reports[1], l) })` $DIR/core/services/relay/evm/mercury/orm_test.go: `err = orm.InsertTransmitRequest(ctx, []string{"foo"}, &pb.TransmitRequest{Payload: reports[1]}, jobID, makeReportContext(1, 1))` $DIR/core/services/relay/evm/mercury/orm_test.go: `l, err = orm.LatestReport(testutils.Context(t), feedID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `t.Run("replaces if epoch is the same but round is greater", func(t *testing.T) { err = orm.InsertTransmitRequest(ctx, []string{sURL}, &pb.TransmitRequest{Payload: reports[2]}, jobID, makeReportContext(1, 2)) require.NoError(t, err) l, err = orm.LatestReport(testutils.Context(t), feedID) require.NoError(t, err) assert.Equal(t, reports[2], l) })` $DIR/core/services/relay/evm/mercury/orm_test.go: `err = orm.InsertTransmitRequest(ctx, []string{sURL}, &pb.TransmitRequest{Payload: reports[2]}, jobID, makeReportContext(1, 2))` $DIR/core/services/relay/evm/mercury/orm_test.go: `l, err = orm.LatestReport(testutils.Context(t), feedID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `t.Run("replaces if epoch is larger but round is smaller", func(t *testing.T) { err = orm.InsertTransmitRequest(ctx, []string{"bar"}, &pb.TransmitRequest{Payload: reports[3]}, jobID, makeReportContext(2, 1)) require.NoError(t, err) l, err = orm.LatestReport(testutils.Context(t), feedID) require.NoError(t, err) assert.Equal(t, reports[3], l) })` $DIR/core/services/relay/evm/mercury/orm_test.go: `err = orm.InsertTransmitRequest(ctx, []string{"bar"}, &pb.TransmitRequest{Payload: reports[3]}, jobID, makeReportContext(2, 1))` $DIR/core/services/relay/evm/mercury/orm_test.go: `l, err = orm.LatestReport(testutils.Context(t), feedID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `err = orm.InsertTransmitRequest(ctx, []string{sURL}, &pb.TransmitRequest{Payload: reports[0]}, jobID, makeReportContext(2, 1))` $DIR/core/services/relay/evm/mercury/orm_test.go: `l, err = orm.LatestReport(testutils.Context(t), feedID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `t.Run("FeedIDFromReport extracts the current block number from a valid report", func(t *testing.T) { report := buildSampleV1Report(42) f, err := FeedIDFromReport(report) require.NoError(t, err) assert.Equal(t, sampleFeedID[:], f[:]) })` $DIR/core/services/relay/evm/mercury/orm_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.Int32()` $DIR/core/services/relay/evm/mercury/orm_test.go: `.MustExec(t, db, `SET CONSTRAINTS mercury_transmit_requests_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.MustExec(t, db, `SET CONSTRAINTS feed_latest_reports_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.LatestReport(testutils.Context(t), feedID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.InsertTransmitRequest(ctx, []string{sURL}, &pb.TransmitRequest{Payload: reports[0]}, jobID, reportContexts[0])` $DIR/core/services/relay/evm/mercury/orm_test.go: `.InsertTransmitRequest(ctx, []string{sURL}, &pb.TransmitRequest{Payload: reports[1]}, jobID, reportContexts[1])` $DIR/core/services/relay/evm/mercury/orm_test.go: `.InsertTransmitRequest(ctx, []string{sURL}, &pb.TransmitRequest{Payload: reports[2]}, jobID, reportContexts[2])` $DIR/core/services/relay/evm/mercury/orm_test.go: `.InsertTransmitRequest(ctx, []string{sURL2}, &pb.TransmitRequest{Payload: reports[3]}, jobID, reportContexts[0])` $DIR/core/services/relay/evm/mercury/orm_test.go: `.GetTransmitRequests(ctx, sURL, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.GetTransmitRequests(ctx, sURL2, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.LatestReport(testutils.Context(t), feedID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.DeleteTransmitRequests(ctx, sURL, []*pb.TransmitRequest{{Payload: reports[1]}})` $DIR/core/services/relay/evm/mercury/orm_test.go: `.GetTransmitRequests(ctx, sURL, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.LatestReport(testutils.Context(t), feedID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.DeleteTransmitRequests(ctx, sURL, []*pb.TransmitRequest{{Payload: []byte("does-not-exist")}})` $DIR/core/services/relay/evm/mercury/orm_test.go: `.GetTransmitRequests(ctx, sURL, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.DeleteTransmitRequests(ctx, sURL, []*pb.TransmitRequest{ {Payload: reports[0]}, {Payload: reports[2]}, })` $DIR/core/services/relay/evm/mercury/orm_test.go: `.LatestReport(testutils.Context(t), feedID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.GetTransmitRequests(ctx, sURL, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.InsertTransmitRequest(ctx, []string{sURL}, &pb.TransmitRequest{Payload: reports[3]}, jobID, reportContexts[3])` $DIR/core/services/relay/evm/mercury/orm_test.go: `.GetTransmitRequests(ctx, sURL, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.InsertTransmitRequest(ctx, []string{sURL}, &pb.TransmitRequest{Payload: reports[3]}, jobID, reportContexts[3])` $DIR/core/services/relay/evm/mercury/orm_test.go: `.InsertTransmitRequest(ctx, []string{sURL}, &pb.TransmitRequest{Payload: reports[3]}, jobID, reportContexts[3])` $DIR/core/services/relay/evm/mercury/orm_test.go: `.GetTransmitRequests(ctx, sURL, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.LatestReport(testutils.Context(t), feedID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.GetTransmitRequests(ctx, sURL2, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.Int32()` $DIR/core/services/relay/evm/mercury/orm_test.go: `.MustExec(t, db, `SET CONSTRAINTS mercury_transmit_requests_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.MustExec(t, db, `SET CONSTRAINTS feed_latest_reports_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.InsertTransmitRequest(ctx, []string{sURL, sURL2, sURL3}, &pb.TransmitRequest{Payload: reports[0]}, jobID, reportContexts[0])` $DIR/core/services/relay/evm/mercury/orm_test.go: `.GetTransmitRequests(ctx, sURL, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.GetTransmitRequests(ctx, sURL2, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.GetTransmitRequests(ctx, sURL3, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.LatestReport(testutils.Context(t), feedID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.Int32()` $DIR/core/services/relay/evm/mercury/orm_test.go: `.MustExec(t, db, `SET CONSTRAINTS mercury_transmit_requests_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.MustExec(t, db, `SET CONSTRAINTS feed_latest_reports_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.InsertTransmitRequest(ctx, []string{sURL}, &pb.TransmitRequest{Payload: reports[0]}, jobID, makeReportContext(1, 1))` $DIR/core/services/relay/evm/mercury/orm_test.go: `.InsertTransmitRequest(ctx, []string{sURL}, &pb.TransmitRequest{Payload: reports[1]}, jobID, makeReportContext(1, 2))` $DIR/core/services/relay/evm/mercury/orm_test.go: `.InsertTransmitRequest(ctx, []string{sURL2}, &pb.TransmitRequest{Payload: reports[0]}, jobID, makeReportContext(1, 0))` $DIR/core/services/relay/evm/mercury/orm_test.go: `.InsertTransmitRequest(ctx, []string{sURL2}, &pb.TransmitRequest{Payload: reports[0]}, jobID, makeReportContext(1, 1))` $DIR/core/services/relay/evm/mercury/orm_test.go: `.InsertTransmitRequest(ctx, []string{sURL2}, &pb.TransmitRequest{Payload: reports[1]}, jobID, makeReportContext(1, 2))` $DIR/core/services/relay/evm/mercury/orm_test.go: `.InsertTransmitRequest(ctx, []string{sURL2}, &pb.TransmitRequest{Payload: reports[2]}, jobID, makeReportContext(1, 3))` $DIR/core/services/relay/evm/mercury/orm_test.go: `.PruneTransmitRequests(ctx, sURL, jobID, 5)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.GetTransmitRequests(ctx, sURL, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.PruneTransmitRequests(ctx, sURL, jobID, 2)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.GetTransmitRequests(ctx, sURL, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.PruneTransmitRequests(ctx, sURL, -1, 2)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.GetTransmitRequests(ctx, sURL, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.InsertTransmitRequest(ctx, []string{sURL}, &pb.TransmitRequest{Payload: reports[2]}, jobID, makeReportContext(2, 1))` $DIR/core/services/relay/evm/mercury/orm_test.go: `.InsertTransmitRequest(ctx, []string{sURL}, &pb.TransmitRequest{Payload: reports[3]}, jobID, makeReportContext(2, 2))` $DIR/core/services/relay/evm/mercury/orm_test.go: `.PruneTransmitRequests(ctx, sURL, jobID, 3)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.GetTransmitRequests(ctx, sURL, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.GetTransmitRequests(ctx, sURL2, jobID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.Int32()` $DIR/core/services/relay/evm/mercury/orm_test.go: `.MustExec(t, db, `SET CONSTRAINTS mercury_transmit_requests_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.MustExec(t, db, `SET CONSTRAINTS feed_latest_reports_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.InsertTransmitRequest(ctx, []string{sURL}, &pb.TransmitRequest{Payload: reports[0]}, jobID, makeReportContext( 0, 0, ))` $DIR/core/services/relay/evm/mercury/orm_test.go: `.InsertTransmitRequest(ctx, []string{sURL2}, &pb.TransmitRequest{Payload: reports[1]}, jobID, makeReportContext( 0, 0, ))` $DIR/core/services/relay/evm/mercury/orm_test.go: `.LatestReport(testutils.Context(t), feedID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.Run("replaces if epoch and round are larger", func(t *testing.T) { err = orm.InsertTransmitRequest(ctx, []string{"foo"}, &pb.TransmitRequest{Payload: reports[1]}, jobID, makeReportContext(1, 1)) require.NoError(t, err) l, err = orm.LatestReport(testutils.Context(t), feedID) require.NoError(t, err) assert.Equal(t, reports[1], l) })` $DIR/core/services/relay/evm/mercury/orm_test.go: `.InsertTransmitRequest(ctx, []string{"foo"}, &pb.TransmitRequest{Payload: reports[1]}, jobID, makeReportContext(1, 1))` $DIR/core/services/relay/evm/mercury/orm_test.go: `.LatestReport(testutils.Context(t), feedID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.Run("replaces if epoch is the same but round is greater", func(t *testing.T) { err = orm.InsertTransmitRequest(ctx, []string{sURL}, &pb.TransmitRequest{Payload: reports[2]}, jobID, makeReportContext(1, 2)) require.NoError(t, err) l, err = orm.LatestReport(testutils.Context(t), feedID) require.NoError(t, err) assert.Equal(t, reports[2], l) })` $DIR/core/services/relay/evm/mercury/orm_test.go: `.InsertTransmitRequest(ctx, []string{sURL}, &pb.TransmitRequest{Payload: reports[2]}, jobID, makeReportContext(1, 2))` $DIR/core/services/relay/evm/mercury/orm_test.go: `.LatestReport(testutils.Context(t), feedID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.Run("replaces if epoch is larger but round is smaller", func(t *testing.T) { err = orm.InsertTransmitRequest(ctx, []string{"bar"}, &pb.TransmitRequest{Payload: reports[3]}, jobID, makeReportContext(2, 1)) require.NoError(t, err) l, err = orm.LatestReport(testutils.Context(t), feedID) require.NoError(t, err) assert.Equal(t, reports[3], l) })` $DIR/core/services/relay/evm/mercury/orm_test.go: `.InsertTransmitRequest(ctx, []string{"bar"}, &pb.TransmitRequest{Payload: reports[3]}, jobID, makeReportContext(2, 1))` $DIR/core/services/relay/evm/mercury/orm_test.go: `.LatestReport(testutils.Context(t), feedID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.InsertTransmitRequest(ctx, []string{sURL}, &pb.TransmitRequest{Payload: reports[0]}, jobID, makeReportContext(2, 1))` $DIR/core/services/relay/evm/mercury/orm_test.go: `.LatestReport(testutils.Context(t), feedID)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/orm_test.go: `.Run("FeedIDFromReport extracts the current block number from a valid report", func(t *testing.T) { report := buildSampleV1Report(42) f, err := FeedIDFromReport(report) require.NoError(t, err) assert.Equal(t, sampleFeedID[:], f[:]) })` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `pgtest.MustExec(t, db, `SET CONSTRAINTS mercury_transmit_requests_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `pgtest.MustExec(t, db, `SET CONSTRAINTS feed_latest_reports_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `err = pm.Insert(ctx, &pb.TransmitRequest{Payload: reports[1]}, ocrtypes.ReportContext{})` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `err = pm.Delete(ctx, &pb.TransmitRequest{Payload: reports[0]})` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `transmissions, err = pm.Load(ctx)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `transmissions, err = pm2.Load(ctx)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `pgtest.MustExec(t, db, `SET CONSTRAINTS mercury_transmit_requests_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `pgtest.MustExec(t, db, `SET CONSTRAINTS feed_latest_reports_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `err = pm.Insert(ctx, &pb.TransmitRequest{Payload: reports[1]}, ocrtypes.ReportContext{})` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `err = pm.Start(ctx)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `pm.AsyncDelete(&pb.TransmitRequest{Payload: reports[0]})` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `observedLogs.TakeAll()` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `testutils.WaitForLogMessage(t, observedLogs, "Deleted queued transmit requests")` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `err = pm.Close()` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `pm.AsyncDelete(&pb.TransmitRequest{Payload: reports[1]})` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `time.Sleep(15 * time.Millisecond)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `transmissions, err = pm.Load(ctx)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `pgtest.MustExec(t, db, `SET CONSTRAINTS mercury_transmit_requests_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `pgtest.MustExec(t, db, `SET CONSTRAINTS feed_latest_reports_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `reports[i] = buildSampleV1Report(int64(i))` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `err = pm.Insert(ctx, &pb.TransmitRequest{Payload: reports[22]}, ocrtypes.ReportContext{ReportTimestamp: ocrtypes.ReportTimestamp{Epoch: 22}})` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `err = pm.Insert(ctx, &pb.TransmitRequest{Payload: reports[23]}, ocrtypes.ReportContext{ReportTimestamp: ocrtypes.ReportTimestamp{Epoch: 23}})` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `err = pm.Start(ctx)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `observedLogs.TakeAll()` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `testutils.WaitForLogMessage(t, observedLogs, "Pruned transmit requests table")` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `err = pm.Close()` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `err = pm.Insert(ctx, &pb.TransmitRequest{Payload: reports[24]}, ocrtypes.ReportContext{ReportTimestamp: ocrtypes.ReportTimestamp{Epoch: 24}})` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `transmissions, err = pm.Load(ctx)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `transmissions, err = pm2.Load(ctx)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.Int32()` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.NewSqlxDB(t)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.MustExec(t, db, `SET CONSTRAINTS mercury_transmit_requests_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.MustExec(t, db, `SET CONSTRAINTS feed_latest_reports_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.Insert(ctx, &pb.TransmitRequest{Payload: reports[0]}, ocrtypes.ReportContext{})` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.Insert(ctx, &pb.TransmitRequest{Payload: reports[1]}, ocrtypes.ReportContext{})` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.Load(ctx)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.Delete(ctx, &pb.TransmitRequest{Payload: reports[0]})` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.Load(ctx)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.Load(ctx)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.Int32()` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.NewSqlxDB(t)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.MustExec(t, db, `SET CONSTRAINTS mercury_transmit_requests_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.MustExec(t, db, `SET CONSTRAINTS feed_latest_reports_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.Insert(ctx, &pb.TransmitRequest{Payload: reports[0]}, ocrtypes.ReportContext{})` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.Insert(ctx, &pb.TransmitRequest{Payload: reports[1]}, ocrtypes.ReportContext{})` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.Start(ctx)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.AsyncDelete(&pb.TransmitRequest{Payload: reports[0]})` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.TakeAll()` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.WaitForLogMessage(t, observedLogs, "Deleted queued transmit requests")` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.Load(ctx)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.AsyncDelete(&pb.TransmitRequest{Payload: reports[1]})` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.Sleep(15 * time.Millisecond)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.Load(ctx)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.Int32()` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.NewSqlxDB(t)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.MustExec(t, db, `SET CONSTRAINTS mercury_transmit_requests_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.MustExec(t, db, `SET CONSTRAINTS feed_latest_reports_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.Insert(ctx, &pb.TransmitRequest{Payload: reports[i]}, ocrtypes.ReportContext{ReportTimestamp: ocrtypes.ReportTimestamp{Epoch: uint32(i)}})` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.Insert(ctx, &pb.TransmitRequest{Payload: reports[21]}, ocrtypes.ReportContext{ReportTimestamp: ocrtypes.ReportTimestamp{Epoch: 21}})` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.Insert(ctx, &pb.TransmitRequest{Payload: reports[22]}, ocrtypes.ReportContext{ReportTimestamp: ocrtypes.ReportTimestamp{Epoch: 22}})` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.Insert(ctx, &pb.TransmitRequest{Payload: reports[23]}, ocrtypes.ReportContext{ReportTimestamp: ocrtypes.ReportTimestamp{Epoch: 23}})` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.Start(ctx)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.TakeAll()` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.WaitForLogMessage(t, observedLogs, "Pruned transmit requests table")` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.Load(ctx)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.Insert(ctx, &pb.TransmitRequest{Payload: reports[24]}, ocrtypes.ReportContext{ReportTimestamp: ocrtypes.ReportTimestamp{Epoch: 24}})` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.Load(ctx)` $DIR/core/services/relay/evm/mercury/persistence_manager_test.go: `.Load(ctx)` $DIR/core/services/relay/evm/mercury/queue_test.go: `transmitQueue.Init([]*Transmission{})` $DIR/core/services/relay/evm/mercury/queue_test.go: `t.Run("successfully add transmissions to transmit queue", func(t *testing.T) { for _, tt := range testTransmissions { ok := transmitQueue.Push(tt.tr, tt.ctx) require.True(t, ok) } report := transmitQueue.HealthReport() assert.Nil(t, report[transmitQueue.Name()]) })` $DIR/core/services/relay/evm/mercury/queue_test.go: `t.Run("transmit queue is more than 50% full", func(t *testing.T) { transmitQueue.Push(testTransmissions[2].tr, testTransmissions[2].ctx) report := transmitQueue.HealthReport() assert.Equal(t, report[transmitQueue.Name()].Error(), "transmit priority queue is greater than 50% full (4/7)") })` $DIR/core/services/relay/evm/mercury/queue_test.go: `transmitQueue.Push(testTransmissions[2].tr, testTransmissions[2].ctx)` $DIR/core/services/relay/evm/mercury/queue_test.go: `t.Run("transmit queue pops the highest priority transmission", func(t *testing.T) { tr := transmitQueue.BlockingPop() assert.Equal(t, testTransmissions[2].tr, tr.Req) })` $DIR/core/services/relay/evm/mercury/queue_test.go: `t.Run("transmit queue is full and evicts the oldest transmission", func(t *testing.T) { deleter.On("AsyncDelete", testTransmissions[0].tr).Once() // add 5 more transmissions to overflow the queue by 1 for i := 0; i < 5; i++ { transmitQueue.Push(testTransmissions[1].tr, testTransmissions[1].ctx) } // expecting testTransmissions[0] to get evicted and not present in the queue anymore testutils.WaitForLogMessage(t, observedLogs, "Transmit queue is full; dropping oldest transmission (reached max length of 7)") for i := 0; i < 7; i++ { tr := transmitQueue.BlockingPop() assert.NotEqual(t, tr.Req, testTransmissions[0].tr) } })` $DIR/core/services/relay/evm/mercury/queue_test.go: `deleter.On("AsyncDelete", testTransmissions[0].tr).Once()` $DIR/core/services/relay/evm/mercury/queue_test.go: `transmitQueue.Push(testTransmissions[1].tr, testTransmissions[1].ctx)` $DIR/core/services/relay/evm/mercury/queue_test.go: `testutils.WaitForLogMessage(t, observedLogs, "Transmit queue is full; dropping oldest transmission (reached max length of 7)")` $DIR/core/services/relay/evm/mercury/queue_test.go: `t.Run("transmit queue blocks when empty and resumes when tranmission available", func(t *testing.T) { assert.True(t, transmitQueue.IsEmpty()) var wg sync.WaitGroup wg.Add(2) go func() { defer wg.Done() tr := transmitQueue.BlockingPop() assert.Equal(t, tr.Req, testTransmissions[0].tr) }() go func() { defer wg.Done() transmitQueue.Push(testTransmissions[0].tr, testTransmissions[0].ctx) }() wg.Wait() })` $DIR/core/services/relay/evm/mercury/queue_test.go: `wg.Add(2)` $DIR/core/services/relay/evm/mercury/queue_test.go: `transmitQueue.Push(testTransmissions[0].tr, testTransmissions[0].ctx)` $DIR/core/services/relay/evm/mercury/queue_test.go: `wg.Wait()` $DIR/core/services/relay/evm/mercury/queue_test.go: `transmitQueue.Init(transmissions)` $DIR/core/services/relay/evm/mercury/queue_test.go: `.TestLoggerObserved(t, zapcore.ErrorLevel)` $DIR/core/services/relay/evm/mercury/queue_test.go: `.NewAsyncDeleter(t)` $DIR/core/services/relay/evm/mercury/queue_test.go: `.Init([]*Transmission{})` $DIR/core/services/relay/evm/mercury/queue_test.go: `.Run("successfully add transmissions to transmit queue", func(t *testing.T) { for _, tt := range testTransmissions { ok := transmitQueue.Push(tt.tr, tt.ctx) require.True(t, ok) } report := transmitQueue.HealthReport() assert.Nil(t, report[transmitQueue.Name()]) })` $DIR/core/services/relay/evm/mercury/queue_test.go: `.Push(tt.tr, tt.ctx)` $DIR/core/services/relay/evm/mercury/queue_test.go: `.HealthReport()` $DIR/core/services/relay/evm/mercury/queue_test.go: `.Run("transmit queue is more than 50% full", func(t *testing.T) { transmitQueue.Push(testTransmissions[2].tr, testTransmissions[2].ctx) report := transmitQueue.HealthReport() assert.Equal(t, report[transmitQueue.Name()].Error(), "transmit priority queue is greater than 50% full (4/7)") })` $DIR/core/services/relay/evm/mercury/queue_test.go: `.Push(testTransmissions[2].tr, testTransmissions[2].ctx)` $DIR/core/services/relay/evm/mercury/queue_test.go: `.HealthReport()` $DIR/core/services/relay/evm/mercury/queue_test.go: `.Run("transmit queue pops the highest priority transmission", func(t *testing.T) { tr := transmitQueue.BlockingPop() assert.Equal(t, testTransmissions[2].tr, tr.Req) })` $DIR/core/services/relay/evm/mercury/queue_test.go: `.BlockingPop()` $DIR/core/services/relay/evm/mercury/queue_test.go: `.Run("transmit queue is full and evicts the oldest transmission", func(t *testing.T) { deleter.On("AsyncDelete", testTransmissions[0].tr).Once() // add 5 more transmissions to overflow the queue by 1 for i := 0; i < 5; i++ { transmitQueue.Push(testTransmissions[1].tr, testTransmissions[1].ctx) } // expecting testTransmissions[0] to get evicted and not present in the queue anymore testutils.WaitForLogMessage(t, observedLogs, "Transmit queue is full; dropping oldest transmission (reached max length of 7)") for i := 0; i < 7; i++ { tr := transmitQueue.BlockingPop() assert.NotEqual(t, tr.Req, testTransmissions[0].tr) } })` $DIR/core/services/relay/evm/mercury/queue_test.go: `.On("AsyncDelete", testTransmissions[0].tr)` $DIR/core/services/relay/evm/mercury/queue_test.go: `.Once()` $DIR/core/services/relay/evm/mercury/queue_test.go: `.Push(testTransmissions[1].tr, testTransmissions[1].ctx)` $DIR/core/services/relay/evm/mercury/queue_test.go: `.WaitForLogMessage(t, observedLogs, "Transmit queue is full; dropping oldest transmission (reached max length of 7)")` $DIR/core/services/relay/evm/mercury/queue_test.go: `.BlockingPop()` $DIR/core/services/relay/evm/mercury/queue_test.go: `.Run("transmit queue blocks when empty and resumes when tranmission available", func(t *testing.T) { assert.True(t, transmitQueue.IsEmpty()) var wg sync.WaitGroup wg.Add(2) go func() { defer wg.Done() tr := transmitQueue.BlockingPop() assert.Equal(t, tr.Req, testTransmissions[0].tr) }() go func() { defer wg.Done() transmitQueue.Push(testTransmissions[0].tr, testTransmissions[0].ctx) }() wg.Wait() })` $DIR/core/services/relay/evm/mercury/queue_test.go: `.Add(2)` $DIR/core/services/relay/evm/mercury/queue_test.go: `.Done()` $DIR/core/services/relay/evm/mercury/queue_test.go: `.BlockingPop()` $DIR/core/services/relay/evm/mercury/queue_test.go: `.Done()` $DIR/core/services/relay/evm/mercury/queue_test.go: `.Push(testTransmissions[0].tr, testTransmissions[0].ctx)` $DIR/core/services/relay/evm/mercury/queue_test.go: `.Wait()` $DIR/core/services/relay/evm/mercury/queue_test.go: `.Init(transmissions)` $DIR/core/services/relay/evm/mercury/queue_test.go: `.BlockingPop()` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `pgtest.MustExec(t, db, `SET CONSTRAINTS mercury_transmit_requests_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `pgtest.MustExec(t, db, `SET CONSTRAINTS feed_latest_reports_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `t.Run("with one mercury server", func(t *testing.T) { t.Run("v1 report transmission successfully enqueued", func(t *testing.T) { report := sampleV1Report c := &mocks.MockWSRPCClient{} clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) // init the queue since we skipped starting transmitter mt.servers[sURL].q.Init([]*Transmission{}) err := mt.Transmit(testutils.Context(t), sampleReportContext, report, sampleSigs) require.NoError(t, err) // ensure it was added to the queue require.Equal(t, mt.servers[sURL].q.(*transmitQueue).pq.Len(), 1) assert.Subset(t, mt.servers[sURL].q.(*transmitQueue).pq.Pop().(*Transmission).Req.Payload, report) }) t.Run("v2 report transmission successfully enqueued", func(t *testing.T) { report := sampleV2Report c := &mocks.MockWSRPCClient{} clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) // init the queue since we skipped starting transmitter mt.servers[sURL].q.Init([]*Transmission{}) err := mt.Transmit(testutils.Context(t), sampleReportContext, report, sampleSigs) require.NoError(t, err) // ensure it was added to the queue require.Equal(t, mt.servers[sURL].q.(*transmitQueue).pq.Len(), 1) assert.Subset(t, mt.servers[sURL].q.(*transmitQueue).pq.Pop().(*Transmission).Req.Payload, report) }) t.Run("v3 report transmission successfully enqueued", func(t *testing.T) { report := sampleV3Report c := &mocks.MockWSRPCClient{} clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) // init the queue since we skipped starting transmitter mt.servers[sURL].q.Init([]*Transmission{}) err := mt.Transmit(testutils.Context(t), sampleReportContext, report, sampleSigs) require.NoError(t, err) // ensure it was added to the queue require.Equal(t, mt.servers[sURL].q.(*transmitQueue).pq.Len(), 1) assert.Subset(t, mt.servers[sURL].q.(*transmitQueue).pq.Pop().(*Transmission).Req.Payload, report) }) t.Run("v3 report transmission sent only to trigger service", func(t *testing.T) { report := sampleV3Report c := &mocks.MockWSRPCClient{} clients[sURL] = c triggerService := triggers.NewMercuryTriggerService(0, lggr) mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, triggerService) // init the queue since we skipped starting transmitter mt.servers[sURL].q.Init([]*Transmission{}) err := mt.Transmit(testutils.Context(t), sampleReportContext, report, sampleSigs) require.NoError(t, err) // queue is empty require.Equal(t, mt.servers[sURL].q.(*transmitQueue).pq.Len(), 0) }) })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `t.Run("v1 report transmission successfully enqueued", func(t *testing.T) { report := sampleV1Report c := &mocks.MockWSRPCClient{} clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) // init the queue since we skipped starting transmitter mt.servers[sURL].q.Init([]*Transmission{}) err := mt.Transmit(testutils.Context(t), sampleReportContext, report, sampleSigs) require.NoError(t, err) // ensure it was added to the queue require.Equal(t, mt.servers[sURL].q.(*transmitQueue).pq.Len(), 1) assert.Subset(t, mt.servers[sURL].q.(*transmitQueue).pq.Pop().(*Transmission).Req.Payload, report) })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `clients[sURL] = c` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `mt.servers[sURL].q.Init([]*Transmission{})` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `t.Run("v2 report transmission successfully enqueued", func(t *testing.T) { report := sampleV2Report c := &mocks.MockWSRPCClient{} clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) // init the queue since we skipped starting transmitter mt.servers[sURL].q.Init([]*Transmission{}) err := mt.Transmit(testutils.Context(t), sampleReportContext, report, sampleSigs) require.NoError(t, err) // ensure it was added to the queue require.Equal(t, mt.servers[sURL].q.(*transmitQueue).pq.Len(), 1) assert.Subset(t, mt.servers[sURL].q.(*transmitQueue).pq.Pop().(*Transmission).Req.Payload, report) })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `clients[sURL] = c` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `mt.servers[sURL].q.Init([]*Transmission{})` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `t.Run("v3 report transmission successfully enqueued", func(t *testing.T) { report := sampleV3Report c := &mocks.MockWSRPCClient{} clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) // init the queue since we skipped starting transmitter mt.servers[sURL].q.Init([]*Transmission{}) err := mt.Transmit(testutils.Context(t), sampleReportContext, report, sampleSigs) require.NoError(t, err) // ensure it was added to the queue require.Equal(t, mt.servers[sURL].q.(*transmitQueue).pq.Len(), 1) assert.Subset(t, mt.servers[sURL].q.(*transmitQueue).pq.Pop().(*Transmission).Req.Payload, report) })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `clients[sURL] = c` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `mt.servers[sURL].q.Init([]*Transmission{})` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `t.Run("v3 report transmission sent only to trigger service", func(t *testing.T) { report := sampleV3Report c := &mocks.MockWSRPCClient{} clients[sURL] = c triggerService := triggers.NewMercuryTriggerService(0, lggr) mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, triggerService) // init the queue since we skipped starting transmitter mt.servers[sURL].q.Init([]*Transmission{}) err := mt.Transmit(testutils.Context(t), sampleReportContext, report, sampleSigs) require.NoError(t, err) // queue is empty require.Equal(t, mt.servers[sURL].q.(*transmitQueue).pq.Len(), 0) })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `clients[sURL] = c` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `mt.servers[sURL].q.Init([]*Transmission{})` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `clients[sURL] = c` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `clients[sURL2] = c` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `clients[sURL3] = c` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `mt.servers[sURL].q.Init([]*Transmission{})` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `mt.servers[sURL2].q.Init([]*Transmission{})` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `mt.servers[sURL3].q.Init([]*Transmission{})` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `t.Run("successful query", func(t *testing.T) { c := &mocks.MockWSRPCClient{ LatestReportF: func(ctx context.Context, in *pb.LatestReportRequest) (out *pb.LatestReportResponse, err error) { require.NotNil(t, in) assert.Equal(t, hexutil.Encode(sampleFeedID[:]), hexutil.Encode(in.FeedId)) out = new(pb.LatestReportResponse) out.Report = new(pb.Report) out.Report.FeedId = sampleFeedID[:] out.Report.ObservationsTimestamp = 42 return out, nil }, } clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) ts, err := mt.LatestTimestamp(testutils.Context(t)) require.NoError(t, err) assert.Equal(t, int64(42), ts) })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out = new(pb.LatestReportResponse)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out.Report = new(pb.Report)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out.Report.FeedId = sampleFeedID[:]` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out.Report.ObservationsTimestamp = 42` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `clients[sURL] = c` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `t.Run("successful query returning nil report (new feed) gives latest timestamp = -1", func(t *testing.T) { c := &mocks.MockWSRPCClient{ LatestReportF: func(ctx context.Context, in *pb.LatestReportRequest) (out *pb.LatestReportResponse, err error) { out = new(pb.LatestReportResponse) out.Report = nil return out, nil }, } clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) ts, err := mt.LatestTimestamp(testutils.Context(t)) require.NoError(t, err) assert.Equal(t, int64(-1), ts) })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out = new(pb.LatestReportResponse)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out.Report = nil` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `clients[sURL] = c` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `t.Run("failing query", func(t *testing.T) { c := &mocks.MockWSRPCClient{ LatestReportF: func(ctx context.Context, in *pb.LatestReportRequest) (out *pb.LatestReportResponse, err error) { return nil, errors.New("something exploded") }, } clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) _, err := mt.LatestTimestamp(testutils.Context(t)) require.Error(t, err) assert.Contains(t, err.Error(), "something exploded") })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `clients[sURL] = c` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out = new(pb.LatestReportResponse)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out.Report = new(pb.Report)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out.Report.FeedId = sampleFeedID[:]` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out.Report.ObservationsTimestamp = 42` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out = new(pb.LatestReportResponse)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out.Report = new(pb.Report)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out.Report.FeedId = sampleFeedID[:]` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out.Report.ObservationsTimestamp = 41` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `t.Run("successful query", func(t *testing.T) { originalPrice := big.NewInt(123456789) c := &mocks.MockWSRPCClient{ LatestReportF: func(ctx context.Context, in *pb.LatestReportRequest) (out *pb.LatestReportResponse, err error) { require.NotNil(t, in) assert.Equal(t, hexutil.Encode(sampleFeedID[:]), hexutil.Encode(in.FeedId)) out = new(pb.LatestReportResponse) out.Report = new(pb.Report) out.Report.FeedId = sampleFeedID[:] out.Report.Payload = buildSamplePayload([]byte("doesn't matter")) return out, nil }, } clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) t.Run("BenchmarkPriceFromReport succeeds", func(t *testing.T) { codec.val = originalPrice codec.err = nil price, err := mt.LatestPrice(testutils.Context(t), sampleFeedID) require.NoError(t, err) assert.Equal(t, originalPrice, price) }) t.Run("BenchmarkPriceFromReport fails", func(t *testing.T) { codec.val = nil codec.err = errors.New("something exploded") _, err := mt.LatestPrice(testutils.Context(t), sampleFeedID) require.Error(t, err) assert.EqualError(t, err, "something exploded") }) })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out = new(pb.LatestReportResponse)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out.Report = new(pb.Report)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out.Report.FeedId = sampleFeedID[:]` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out.Report.Payload = buildSamplePayload([]byte("doesn't matter"))` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `clients[sURL] = c` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `t.Run("BenchmarkPriceFromReport succeeds", func(t *testing.T) { codec.val = originalPrice codec.err = nil price, err := mt.LatestPrice(testutils.Context(t), sampleFeedID) require.NoError(t, err) assert.Equal(t, originalPrice, price) })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `codec.val = originalPrice` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `codec.err = nil` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `t.Run("BenchmarkPriceFromReport fails", func(t *testing.T) { codec.val = nil codec.err = errors.New("something exploded") _, err := mt.LatestPrice(testutils.Context(t), sampleFeedID) require.Error(t, err) assert.EqualError(t, err, "something exploded") })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `codec.val = nil` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `codec.err = errors.New("something exploded")` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `t.Run("successful query returning nil report (new feed)", func(t *testing.T) { c := &mocks.MockWSRPCClient{ LatestReportF: func(ctx context.Context, in *pb.LatestReportRequest) (out *pb.LatestReportResponse, err error) { out = new(pb.LatestReportResponse) out.Report = nil return out, nil }, } clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) price, err := mt.LatestPrice(testutils.Context(t), sampleFeedID) require.NoError(t, err) assert.Nil(t, price) })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out = new(pb.LatestReportResponse)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out.Report = nil` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `clients[sURL] = c` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `clients[sURL] = c` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `t.Run("successful query", func(t *testing.T) { c := &mocks.MockWSRPCClient{ LatestReportF: func(ctx context.Context, in *pb.LatestReportRequest) (out *pb.LatestReportResponse, err error) { require.NotNil(t, in) assert.Equal(t, hexutil.Encode(sampleFeedID[:]), hexutil.Encode(in.FeedId)) out = new(pb.LatestReportResponse) out.Report = new(pb.Report) out.Report.FeedId = sampleFeedID[:] out.Report.CurrentBlockNumber = 42 return out, nil }, } clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) bn, err := mt.FetchInitialMaxFinalizedBlockNumber(testutils.Context(t)) require.NoError(t, err) require.NotNil(t, bn) assert.Equal(t, 42, int(*bn)) })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out = new(pb.LatestReportResponse)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out.Report = new(pb.Report)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out.Report.FeedId = sampleFeedID[:]` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out.Report.CurrentBlockNumber = 42` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `clients[sURL] = c` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `t.Run("successful query returning nil report (new feed)", func(t *testing.T) { c := &mocks.MockWSRPCClient{ LatestReportF: func(ctx context.Context, in *pb.LatestReportRequest) (out *pb.LatestReportResponse, err error) { out = new(pb.LatestReportResponse) out.Report = nil return out, nil }, } clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) bn, err := mt.FetchInitialMaxFinalizedBlockNumber(testutils.Context(t)) require.NoError(t, err) assert.Nil(t, bn) })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out = new(pb.LatestReportResponse)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out.Report = nil` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `clients[sURL] = c` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `t.Run("failing query", func(t *testing.T) { c := &mocks.MockWSRPCClient{ LatestReportF: func(ctx context.Context, in *pb.LatestReportRequest) (out *pb.LatestReportResponse, err error) { return nil, errors.New("something exploded") }, } clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) _, err := mt.FetchInitialMaxFinalizedBlockNumber(testutils.Context(t)) require.Error(t, err) assert.Contains(t, err.Error(), "something exploded") })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `clients[sURL] = c` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out = new(pb.LatestReportResponse)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out.Report = new(pb.Report)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out.Report.CurrentBlockNumber = 42` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `out.Report.FeedId = []byte{1, 2}` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `clients[sURL] = c` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `sortReportsLatestFirst(reports)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `t.Run("pulls from queue and transmits successfully", func(t *testing.T) { transmit := make(chan *pb.TransmitRequest, 1) c.TransmitF = func(ctx context.Context, in *pb.TransmitRequest) (*pb.TransmitResponse, error) { transmit <- in return &pb.TransmitResponse{Code: 0, Error: ""}, nil } q := newMockQ() s.q = q wg := &sync.WaitGroup{} wg.Add(1) go s.runQueueLoop(nil, wg, feedIDHex) q.Push(req, sampleReportContext) select { case tr := <-transmit: assert.Equal(t, []byte{1, 2, 3}, tr.Payload) assert.Equal(t, 32, int(tr.ReportFormat)) // case <-time.After(testutils.WaitTimeout(t)): case <-time.After(1 * time.Second): t.Fatal("expected a transmit request to be sent") } q.Close() wg.Wait() })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `transmit <- in` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `s.q = q` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `wg.Add(1)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `go s.runQueueLoop(nil, wg, feedIDHex)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `q.Push(req, sampleReportContext)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `wg.Wait()` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `t.Run("on duplicate, success", func(t *testing.T) { transmit := make(chan *pb.TransmitRequest, 1) c.TransmitF = func(ctx context.Context, in *pb.TransmitRequest) (*pb.TransmitResponse, error) { transmit <- in return &pb.TransmitResponse{Code: DuplicateReport, Error: ""}, nil } q := newMockQ() s.q = q wg := &sync.WaitGroup{} wg.Add(1) go s.runQueueLoop(nil, wg, feedIDHex) q.Push(req, sampleReportContext) select { case tr := <-transmit: assert.Equal(t, []byte{1, 2, 3}, tr.Payload) assert.Equal(t, 32, int(tr.ReportFormat)) // case <-time.After(testutils.WaitTimeout(t)): case <-time.After(1 * time.Second): t.Fatal("expected a transmit request to be sent") } q.Close() wg.Wait() })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `transmit <- in` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `s.q = q` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `wg.Add(1)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `go s.runQueueLoop(nil, wg, feedIDHex)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `q.Push(req, sampleReportContext)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `wg.Wait()` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `t.Run("on server-side error, does not retry", func(t *testing.T) { transmit := make(chan *pb.TransmitRequest, 1) c.TransmitF = func(ctx context.Context, in *pb.TransmitRequest) (*pb.TransmitResponse, error) { transmit <- in return &pb.TransmitResponse{Code: DuplicateReport, Error: ""}, nil } q := newMockQ() s.q = q wg := &sync.WaitGroup{} wg.Add(1) go s.runQueueLoop(nil, wg, feedIDHex) q.Push(req, sampleReportContext) select { case tr := <-transmit: assert.Equal(t, []byte{1, 2, 3}, tr.Payload) assert.Equal(t, 32, int(tr.ReportFormat)) // case <-time.After(testutils.WaitTimeout(t)): case <-time.After(1 * time.Second): t.Fatal("expected a transmit request to be sent") } q.Close() wg.Wait() })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `transmit <- in` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `s.q = q` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `wg.Add(1)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `go s.runQueueLoop(nil, wg, feedIDHex)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `q.Push(req, sampleReportContext)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `wg.Wait()` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `transmit <- in` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `s.q = q` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `wg.Add(1)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `go s.runQueueLoop(stopCh, wg, feedIDHex)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `q.Push(req, sampleReportContext)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `cnt++` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `close(stopCh)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `wg.Wait()` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.TestLogger(t)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.NewSqlxDB(t)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.MustExec(t, db, `SET CONSTRAINTS mercury_transmit_requests_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.MustExec(t, db, `SET CONSTRAINTS feed_latest_reports_job_id_fkey DEFERRED`)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Run("with one mercury server", func(t *testing.T) { t.Run("v1 report transmission successfully enqueued", func(t *testing.T) { report := sampleV1Report c := &mocks.MockWSRPCClient{} clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) // init the queue since we skipped starting transmitter mt.servers[sURL].q.Init([]*Transmission{}) err := mt.Transmit(testutils.Context(t), sampleReportContext, report, sampleSigs) require.NoError(t, err) // ensure it was added to the queue require.Equal(t, mt.servers[sURL].q.(*transmitQueue).pq.Len(), 1) assert.Subset(t, mt.servers[sURL].q.(*transmitQueue).pq.Pop().(*Transmission).Req.Payload, report) }) t.Run("v2 report transmission successfully enqueued", func(t *testing.T) { report := sampleV2Report c := &mocks.MockWSRPCClient{} clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) // init the queue since we skipped starting transmitter mt.servers[sURL].q.Init([]*Transmission{}) err := mt.Transmit(testutils.Context(t), sampleReportContext, report, sampleSigs) require.NoError(t, err) // ensure it was added to the queue require.Equal(t, mt.servers[sURL].q.(*transmitQueue).pq.Len(), 1) assert.Subset(t, mt.servers[sURL].q.(*transmitQueue).pq.Pop().(*Transmission).Req.Payload, report) }) t.Run("v3 report transmission successfully enqueued", func(t *testing.T) { report := sampleV3Report c := &mocks.MockWSRPCClient{} clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) // init the queue since we skipped starting transmitter mt.servers[sURL].q.Init([]*Transmission{}) err := mt.Transmit(testutils.Context(t), sampleReportContext, report, sampleSigs) require.NoError(t, err) // ensure it was added to the queue require.Equal(t, mt.servers[sURL].q.(*transmitQueue).pq.Len(), 1) assert.Subset(t, mt.servers[sURL].q.(*transmitQueue).pq.Pop().(*Transmission).Req.Payload, report) }) t.Run("v3 report transmission sent only to trigger service", func(t *testing.T) { report := sampleV3Report c := &mocks.MockWSRPCClient{} clients[sURL] = c triggerService := triggers.NewMercuryTriggerService(0, lggr) mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, triggerService) // init the queue since we skipped starting transmitter mt.servers[sURL].q.Init([]*Transmission{}) err := mt.Transmit(testutils.Context(t), sampleReportContext, report, sampleSigs) require.NoError(t, err) // queue is empty require.Equal(t, mt.servers[sURL].q.(*transmitQueue).pq.Len(), 0) }) })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Run("v1 report transmission successfully enqueued", func(t *testing.T) { report := sampleV1Report c := &mocks.MockWSRPCClient{} clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) // init the queue since we skipped starting transmitter mt.servers[sURL].q.Init([]*Transmission{}) err := mt.Transmit(testutils.Context(t), sampleReportContext, report, sampleSigs) require.NoError(t, err) // ensure it was added to the queue require.Equal(t, mt.servers[sURL].q.(*transmitQueue).pq.Len(), 1) assert.Subset(t, mt.servers[sURL].q.(*transmitQueue).pq.Pop().(*Transmission).Req.Payload, report) })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.q.Init([]*Transmission{})` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Transmit(testutils.Context(t), sampleReportContext, report, sampleSigs)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Run("v2 report transmission successfully enqueued", func(t *testing.T) { report := sampleV2Report c := &mocks.MockWSRPCClient{} clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) // init the queue since we skipped starting transmitter mt.servers[sURL].q.Init([]*Transmission{}) err := mt.Transmit(testutils.Context(t), sampleReportContext, report, sampleSigs) require.NoError(t, err) // ensure it was added to the queue require.Equal(t, mt.servers[sURL].q.(*transmitQueue).pq.Len(), 1) assert.Subset(t, mt.servers[sURL].q.(*transmitQueue).pq.Pop().(*Transmission).Req.Payload, report) })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.q.Init([]*Transmission{})` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Transmit(testutils.Context(t), sampleReportContext, report, sampleSigs)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Run("v3 report transmission successfully enqueued", func(t *testing.T) { report := sampleV3Report c := &mocks.MockWSRPCClient{} clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) // init the queue since we skipped starting transmitter mt.servers[sURL].q.Init([]*Transmission{}) err := mt.Transmit(testutils.Context(t), sampleReportContext, report, sampleSigs) require.NoError(t, err) // ensure it was added to the queue require.Equal(t, mt.servers[sURL].q.(*transmitQueue).pq.Len(), 1) assert.Subset(t, mt.servers[sURL].q.(*transmitQueue).pq.Pop().(*Transmission).Req.Payload, report) })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.q.Init([]*Transmission{})` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Transmit(testutils.Context(t), sampleReportContext, report, sampleSigs)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Run("v3 report transmission sent only to trigger service", func(t *testing.T) { report := sampleV3Report c := &mocks.MockWSRPCClient{} clients[sURL] = c triggerService := triggers.NewMercuryTriggerService(0, lggr) mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, triggerService) // init the queue since we skipped starting transmitter mt.servers[sURL].q.Init([]*Transmission{}) err := mt.Transmit(testutils.Context(t), sampleReportContext, report, sampleSigs) require.NoError(t, err) // queue is empty require.Equal(t, mt.servers[sURL].q.(*transmitQueue).pq.Len(), 0) })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.NewMercuryTriggerService(0, lggr)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.q.Init([]*Transmission{})` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Transmit(testutils.Context(t), sampleReportContext, report, sampleSigs)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.q.Init([]*Transmission{})` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.q.Init([]*Transmission{})` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.q.Init([]*Transmission{})` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Transmit(testutils.Context(t), sampleReportContext, report, sampleSigs)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.TestLogger(t)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.NewSqlxDB(t)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Run("successful query", func(t *testing.T) { c := &mocks.MockWSRPCClient{ LatestReportF: func(ctx context.Context, in *pb.LatestReportRequest) (out *pb.LatestReportResponse, err error) { require.NotNil(t, in) assert.Equal(t, hexutil.Encode(sampleFeedID[:]), hexutil.Encode(in.FeedId)) out = new(pb.LatestReportResponse) out.Report = new(pb.Report) out.Report.FeedId = sampleFeedID[:] out.Report.ObservationsTimestamp = 42 return out, nil }, } clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) ts, err := mt.LatestTimestamp(testutils.Context(t)) require.NoError(t, err) assert.Equal(t, int64(42), ts) })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.LatestTimestamp(testutils.Context(t))` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Run("successful query returning nil report (new feed) gives latest timestamp = -1", func(t *testing.T) { c := &mocks.MockWSRPCClient{ LatestReportF: func(ctx context.Context, in *pb.LatestReportRequest) (out *pb.LatestReportResponse, err error) { out = new(pb.LatestReportResponse) out.Report = nil return out, nil }, } clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) ts, err := mt.LatestTimestamp(testutils.Context(t)) require.NoError(t, err) assert.Equal(t, int64(-1), ts) })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.LatestTimestamp(testutils.Context(t))` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Run("failing query", func(t *testing.T) { c := &mocks.MockWSRPCClient{ LatestReportF: func(ctx context.Context, in *pb.LatestReportRequest) (out *pb.LatestReportResponse, err error) { return nil, errors.New("something exploded") }, } clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) _, err := mt.LatestTimestamp(testutils.Context(t)) require.Error(t, err) assert.Contains(t, err.Error(), "something exploded") })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.New("something exploded")` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.LatestTimestamp(testutils.Context(t))` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.New("something exploded")` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.LatestTimestamp(testutils.Context(t))` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.TestLogger(t)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.NewSqlxDB(t)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Run("successful query", func(t *testing.T) { originalPrice := big.NewInt(123456789) c := &mocks.MockWSRPCClient{ LatestReportF: func(ctx context.Context, in *pb.LatestReportRequest) (out *pb.LatestReportResponse, err error) { require.NotNil(t, in) assert.Equal(t, hexutil.Encode(sampleFeedID[:]), hexutil.Encode(in.FeedId)) out = new(pb.LatestReportResponse) out.Report = new(pb.Report) out.Report.FeedId = sampleFeedID[:] out.Report.Payload = buildSamplePayload([]byte("doesn't matter")) return out, nil }, } clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) t.Run("BenchmarkPriceFromReport succeeds", func(t *testing.T) { codec.val = originalPrice codec.err = nil price, err := mt.LatestPrice(testutils.Context(t), sampleFeedID) require.NoError(t, err) assert.Equal(t, originalPrice, price) }) t.Run("BenchmarkPriceFromReport fails", func(t *testing.T) { codec.val = nil codec.err = errors.New("something exploded") _, err := mt.LatestPrice(testutils.Context(t), sampleFeedID) require.Error(t, err) assert.EqualError(t, err, "something exploded") }) })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.NewInt(123456789)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Run("BenchmarkPriceFromReport succeeds", func(t *testing.T) { codec.val = originalPrice codec.err = nil price, err := mt.LatestPrice(testutils.Context(t), sampleFeedID) require.NoError(t, err) assert.Equal(t, originalPrice, price) })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.LatestPrice(testutils.Context(t), sampleFeedID)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Run("BenchmarkPriceFromReport fails", func(t *testing.T) { codec.val = nil codec.err = errors.New("something exploded") _, err := mt.LatestPrice(testutils.Context(t), sampleFeedID) require.Error(t, err) assert.EqualError(t, err, "something exploded") })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.New("something exploded")` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.LatestPrice(testutils.Context(t), sampleFeedID)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Run("successful query returning nil report (new feed)", func(t *testing.T) { c := &mocks.MockWSRPCClient{ LatestReportF: func(ctx context.Context, in *pb.LatestReportRequest) (out *pb.LatestReportResponse, err error) { out = new(pb.LatestReportResponse) out.Report = nil return out, nil }, } clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) price, err := mt.LatestPrice(testutils.Context(t), sampleFeedID) require.NoError(t, err) assert.Nil(t, price) })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.LatestPrice(testutils.Context(t), sampleFeedID)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.New("something exploded")` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.LatestPrice(testutils.Context(t), sampleFeedID)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.TestLogger(t)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.NewSqlxDB(t)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Run("successful query", func(t *testing.T) { c := &mocks.MockWSRPCClient{ LatestReportF: func(ctx context.Context, in *pb.LatestReportRequest) (out *pb.LatestReportResponse, err error) { require.NotNil(t, in) assert.Equal(t, hexutil.Encode(sampleFeedID[:]), hexutil.Encode(in.FeedId)) out = new(pb.LatestReportResponse) out.Report = new(pb.Report) out.Report.FeedId = sampleFeedID[:] out.Report.CurrentBlockNumber = 42 return out, nil }, } clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) bn, err := mt.FetchInitialMaxFinalizedBlockNumber(testutils.Context(t)) require.NoError(t, err) require.NotNil(t, bn) assert.Equal(t, 42, int(*bn)) })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.FetchInitialMaxFinalizedBlockNumber(testutils.Context(t))` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Run("successful query returning nil report (new feed)", func(t *testing.T) { c := &mocks.MockWSRPCClient{ LatestReportF: func(ctx context.Context, in *pb.LatestReportRequest) (out *pb.LatestReportResponse, err error) { out = new(pb.LatestReportResponse) out.Report = nil return out, nil }, } clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) bn, err := mt.FetchInitialMaxFinalizedBlockNumber(testutils.Context(t)) require.NoError(t, err) assert.Nil(t, bn) })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.FetchInitialMaxFinalizedBlockNumber(testutils.Context(t))` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Run("failing query", func(t *testing.T) { c := &mocks.MockWSRPCClient{ LatestReportF: func(ctx context.Context, in *pb.LatestReportRequest) (out *pb.LatestReportResponse, err error) { return nil, errors.New("something exploded") }, } clients[sURL] = c mt := NewTransmitter(lggr, mockCfg{}, clients, sampleClientPubKey, jobID, sampleFeedID, orm, codec, nil) _, err := mt.FetchInitialMaxFinalizedBlockNumber(testutils.Context(t)) require.Error(t, err) assert.Contains(t, err.Error(), "something exploded") })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.New("something exploded")` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.FetchInitialMaxFinalizedBlockNumber(testutils.Context(t))` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.FetchInitialMaxFinalizedBlockNumber(testutils.Context(t))` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.NewHash()` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Hex()` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.TestLogger(t)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.NewSqlxDB(t)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Run("pulls from queue and transmits successfully", func(t *testing.T) { transmit := make(chan *pb.TransmitRequest, 1) c.TransmitF = func(ctx context.Context, in *pb.TransmitRequest) (*pb.TransmitResponse, error) { transmit <- in return &pb.TransmitResponse{Code: 0, Error: ""}, nil } q := newMockQ() s.q = q wg := &sync.WaitGroup{} wg.Add(1) go s.runQueueLoop(nil, wg, feedIDHex) q.Push(req, sampleReportContext) select { case tr := <-transmit: assert.Equal(t, []byte{1, 2, 3}, tr.Payload) assert.Equal(t, 32, int(tr.ReportFormat)) // case <-time.After(testutils.WaitTimeout(t)): case <-time.After(1 * time.Second): t.Fatal("expected a transmit request to be sent") } q.Close() wg.Wait() })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Add(1)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.runQueueLoop(nil, wg, feedIDHex)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Push(req, sampleReportContext)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.After(1 * time.Second)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Wait()` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Run("on duplicate, success", func(t *testing.T) { transmit := make(chan *pb.TransmitRequest, 1) c.TransmitF = func(ctx context.Context, in *pb.TransmitRequest) (*pb.TransmitResponse, error) { transmit <- in return &pb.TransmitResponse{Code: DuplicateReport, Error: ""}, nil } q := newMockQ() s.q = q wg := &sync.WaitGroup{} wg.Add(1) go s.runQueueLoop(nil, wg, feedIDHex) q.Push(req, sampleReportContext) select { case tr := <-transmit: assert.Equal(t, []byte{1, 2, 3}, tr.Payload) assert.Equal(t, 32, int(tr.ReportFormat)) // case <-time.After(testutils.WaitTimeout(t)): case <-time.After(1 * time.Second): t.Fatal("expected a transmit request to be sent") } q.Close() wg.Wait() })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Add(1)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.runQueueLoop(nil, wg, feedIDHex)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Push(req, sampleReportContext)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.After(1 * time.Second)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Wait()` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Run("on server-side error, does not retry", func(t *testing.T) { transmit := make(chan *pb.TransmitRequest, 1) c.TransmitF = func(ctx context.Context, in *pb.TransmitRequest) (*pb.TransmitResponse, error) { transmit <- in return &pb.TransmitResponse{Code: DuplicateReport, Error: ""}, nil } q := newMockQ() s.q = q wg := &sync.WaitGroup{} wg.Add(1) go s.runQueueLoop(nil, wg, feedIDHex) q.Push(req, sampleReportContext) select { case tr := <-transmit: assert.Equal(t, []byte{1, 2, 3}, tr.Payload) assert.Equal(t, 32, int(tr.ReportFormat)) // case <-time.After(testutils.WaitTimeout(t)): case <-time.After(1 * time.Second): t.Fatal("expected a transmit request to be sent") } q.Close() wg.Wait() })` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Add(1)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.runQueueLoop(nil, wg, feedIDHex)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Push(req, sampleReportContext)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.After(1 * time.Second)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Wait()` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.New("transmission error")` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Add(1)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.runQueueLoop(stopCh, wg, feedIDHex)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Push(req, sampleReportContext)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.After(1 * time.Second)` $DIR/core/services/relay/evm/mercury/transmitter_test.go: `.Wait()` $DIR/core/services/relay/evm/mercury/utils/feeds_test.go: `t.Run("versioned feed ID", func(t *testing.T) { assert.Equal(t, REPORT_V1, v1FeedId.Version()) assert.True(t, v1FeedId.IsV1()) assert.False(t, v1FeedId.IsV2()) assert.False(t, v1FeedId.IsV3()) assert.Equal(t, REPORT_V2, v2FeedId.Version()) assert.False(t, v2FeedId.IsV1()) assert.True(t, v2FeedId.IsV2()) assert.False(t, v2FeedId.IsV3()) assert.Equal(t, REPORT_V3, v3FeedId.Version()) assert.False(t, v3FeedId.IsV1()) assert.False(t, v3FeedId.IsV2()) assert.True(t, v3FeedId.IsV3()) })` $DIR/core/services/relay/evm/mercury/utils/feeds_test.go: `.Run("versioned feed ID", func(t *testing.T) { assert.Equal(t, REPORT_V1, v1FeedId.Version()) assert.True(t, v1FeedId.IsV1()) assert.False(t, v1FeedId.IsV2()) assert.False(t, v1FeedId.IsV3()) assert.Equal(t, REPORT_V2, v2FeedId.Version()) assert.False(t, v2FeedId.IsV1()) assert.True(t, v2FeedId.IsV2()) assert.False(t, v2FeedId.IsV3()) assert.Equal(t, REPORT_V3, v3FeedId.Version()) assert.False(t, v3FeedId.IsV1()) assert.False(t, v3FeedId.IsV2()) assert.True(t, v3FeedId.IsV3()) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `ds.fetcher = fetcher` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `ds.saver = saver` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `ds.pipelineRunner = runner` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `ds.spec = spec` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `ds.mercuryChainReader = evm.NewMercuryChainReader(h)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `h.On("LatestChain").Return(head)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `t.Run("when fetchMaxFinalizedBlockNum=true", func(t *testing.T) { t.Run("with latest report in database", func(t *testing.T) { orm.report = buildSampleV1Report() orm.err = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedBlockNumber.Err) assert.Equal(t, int64(143), obs.MaxFinalizedBlockNumber.Val) }) t.Run("if querying latest report fails", func(t *testing.T) { orm.report = nil orm.err = errors.New("something exploded") obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "something exploded") assert.Zero(t, obs.MaxFinalizedBlockNumber.Val) }) t.Run("if decoding latest report fails", func(t *testing.T) { orm.report = []byte{1, 2, 3} orm.err = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "failed to decode report: abi: cannot marshal in to go type: length insufficient 3 require 32") assert.Zero(t, obs.MaxFinalizedBlockNumber.Val) }) orm.report = nil orm.err = nil t.Run("without latest report in database", func(t *testing.T) { t.Run("if FetchInitialMaxFinalizedBlockNumber returns error", func(t *testing.T) { fetcher.err = errors.New("mock fetcher error") obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "mock fetcher error") assert.Zero(t, obs.MaxFinalizedBlockNumber.Val) }) t.Run("if FetchInitialMaxFinalizedBlockNumber succeeds", func(t *testing.T) { fetcher.err = nil var num int64 = 32 fetcher.num = &num obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedBlockNumber.Err) assert.Equal(t, int64(32), obs.MaxFinalizedBlockNumber.Val) }) t.Run("if FetchInitialMaxFinalizedBlockNumber returns nil (new feed) and initialBlockNumber is set", func(t *testing.T) { var initialBlockNumber int64 = 50 ds.initialBlockNumber = &initialBlockNumber fetcher.err = nil fetcher.num = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedBlockNumber.Err) assert.Equal(t, int64(49), obs.MaxFinalizedBlockNumber.Val) }) t.Run("if FetchInitialMaxFinalizedBlockNumber returns nil (new feed) and initialBlockNumber is not set", func(t *testing.T) { ds.initialBlockNumber = nil t.Run("if current block num is valid", func(t *testing.T) { fetcher.err = nil fetcher.num = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedBlockNumber.Err) assert.Equal(t, head.Number-1, obs.MaxFinalizedBlockNumber.Val) }) t.Run("if no current block available", func(t *testing.T) { h2 := htmocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) h2.On("LatestChain").Return((*evmtypes.Head)(nil)) ds.mercuryChainReader = evm.NewMercuryChainReader(h2) obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "FetchInitialMaxFinalizedBlockNumber returned empty LatestReport; this is a new feed. No initialBlockNumber was set, tried to use current block number to determine maxFinalizedBlockNumber but got error: no blocks available") }) }) }) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `t.Run("with latest report in database", func(t *testing.T) { orm.report = buildSampleV1Report() orm.err = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedBlockNumber.Err) assert.Equal(t, int64(143), obs.MaxFinalizedBlockNumber.Val) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `orm.report = buildSampleV1Report()` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `orm.err = nil` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `t.Run("if querying latest report fails", func(t *testing.T) { orm.report = nil orm.err = errors.New("something exploded") obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "something exploded") assert.Zero(t, obs.MaxFinalizedBlockNumber.Val) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `orm.report = nil` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `orm.err = errors.New("something exploded")` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `t.Run("if decoding latest report fails", func(t *testing.T) { orm.report = []byte{1, 2, 3} orm.err = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "failed to decode report: abi: cannot marshal in to go type: length insufficient 3 require 32") assert.Zero(t, obs.MaxFinalizedBlockNumber.Val) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `orm.report = []byte{1, 2, 3}` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `orm.err = nil` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `orm.report = nil` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `orm.err = nil` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `t.Run("without latest report in database", func(t *testing.T) { t.Run("if FetchInitialMaxFinalizedBlockNumber returns error", func(t *testing.T) { fetcher.err = errors.New("mock fetcher error") obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "mock fetcher error") assert.Zero(t, obs.MaxFinalizedBlockNumber.Val) }) t.Run("if FetchInitialMaxFinalizedBlockNumber succeeds", func(t *testing.T) { fetcher.err = nil var num int64 = 32 fetcher.num = &num obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedBlockNumber.Err) assert.Equal(t, int64(32), obs.MaxFinalizedBlockNumber.Val) }) t.Run("if FetchInitialMaxFinalizedBlockNumber returns nil (new feed) and initialBlockNumber is set", func(t *testing.T) { var initialBlockNumber int64 = 50 ds.initialBlockNumber = &initialBlockNumber fetcher.err = nil fetcher.num = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedBlockNumber.Err) assert.Equal(t, int64(49), obs.MaxFinalizedBlockNumber.Val) }) t.Run("if FetchInitialMaxFinalizedBlockNumber returns nil (new feed) and initialBlockNumber is not set", func(t *testing.T) { ds.initialBlockNumber = nil t.Run("if current block num is valid", func(t *testing.T) { fetcher.err = nil fetcher.num = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedBlockNumber.Err) assert.Equal(t, head.Number-1, obs.MaxFinalizedBlockNumber.Val) }) t.Run("if no current block available", func(t *testing.T) { h2 := htmocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) h2.On("LatestChain").Return((*evmtypes.Head)(nil)) ds.mercuryChainReader = evm.NewMercuryChainReader(h2) obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "FetchInitialMaxFinalizedBlockNumber returned empty LatestReport; this is a new feed. No initialBlockNumber was set, tried to use current block number to determine maxFinalizedBlockNumber but got error: no blocks available") }) }) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `t.Run("if FetchInitialMaxFinalizedBlockNumber returns error", func(t *testing.T) { fetcher.err = errors.New("mock fetcher error") obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "mock fetcher error") assert.Zero(t, obs.MaxFinalizedBlockNumber.Val) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `fetcher.err = errors.New("mock fetcher error")` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `t.Run("if FetchInitialMaxFinalizedBlockNumber succeeds", func(t *testing.T) { fetcher.err = nil var num int64 = 32 fetcher.num = &num obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedBlockNumber.Err) assert.Equal(t, int64(32), obs.MaxFinalizedBlockNumber.Val) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `fetcher.err = nil` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `fetcher.num = &num` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `t.Run("if FetchInitialMaxFinalizedBlockNumber returns nil (new feed) and initialBlockNumber is set", func(t *testing.T) { var initialBlockNumber int64 = 50 ds.initialBlockNumber = &initialBlockNumber fetcher.err = nil fetcher.num = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedBlockNumber.Err) assert.Equal(t, int64(49), obs.MaxFinalizedBlockNumber.Val) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `ds.initialBlockNumber = &initialBlockNumber` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `fetcher.err = nil` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `fetcher.num = nil` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `t.Run("if FetchInitialMaxFinalizedBlockNumber returns nil (new feed) and initialBlockNumber is not set", func(t *testing.T) { ds.initialBlockNumber = nil t.Run("if current block num is valid", func(t *testing.T) { fetcher.err = nil fetcher.num = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedBlockNumber.Err) assert.Equal(t, head.Number-1, obs.MaxFinalizedBlockNumber.Val) }) t.Run("if no current block available", func(t *testing.T) { h2 := htmocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) h2.On("LatestChain").Return((*evmtypes.Head)(nil)) ds.mercuryChainReader = evm.NewMercuryChainReader(h2) obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "FetchInitialMaxFinalizedBlockNumber returned empty LatestReport; this is a new feed. No initialBlockNumber was set, tried to use current block number to determine maxFinalizedBlockNumber but got error: no blocks available") }) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `ds.initialBlockNumber = nil` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `t.Run("if current block num is valid", func(t *testing.T) { fetcher.err = nil fetcher.num = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedBlockNumber.Err) assert.Equal(t, head.Number-1, obs.MaxFinalizedBlockNumber.Val) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `fetcher.err = nil` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `fetcher.num = nil` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `t.Run("if no current block available", func(t *testing.T) { h2 := htmocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) h2.On("LatestChain").Return((*evmtypes.Head)(nil)) ds.mercuryChainReader = evm.NewMercuryChainReader(h2) obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "FetchInitialMaxFinalizedBlockNumber returned empty LatestReport; this is a new feed. No initialBlockNumber was set, tried to use current block number to determine maxFinalizedBlockNumber but got error: no blocks available") })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `h2.On("LatestChain").Return((*evmtypes.Head)(nil))` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `ds.mercuryChainReader = evm.NewMercuryChainReader(h2)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `ds.mercuryChainReader = evm.NewMercuryChainReader(h)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `t.Run("when fetchMaxFinalizedBlockNum=false", func(t *testing.T) { t.Run("when run execution fails, returns error", func(t *testing.T) { t.Cleanup(func() { runner.Err = nil }) runner.Err = errors.New("run execution failed") _, err := ds.Observe(ctx, repts, false) assert.EqualError(t, err, "Observe failed while executing run: error executing run for spec ID 0: run execution failed") }) t.Run("makes observation using pipeline, when all tasks succeed", func(t *testing.T) { obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Equal(t, big.NewInt(122), obs.BenchmarkPrice.Val) assert.NoError(t, obs.BenchmarkPrice.Err) assert.Equal(t, big.NewInt(121), obs.Bid.Val) assert.NoError(t, obs.Bid.Err) assert.Equal(t, big.NewInt(123), obs.Ask.Val) assert.NoError(t, obs.Ask.Err) assert.Equal(t, head.Number, obs.CurrentBlockNum.Val) assert.NoError(t, obs.CurrentBlockNum.Err) assert.Equal(t, fmt.Sprintf("%x", head.Hash), fmt.Sprintf("%x", obs.CurrentBlockHash.Val)) assert.NoError(t, obs.CurrentBlockHash.Err) assert.Equal(t, uint64(head.Timestamp.Unix()), obs.CurrentBlockTimestamp.Val) assert.NoError(t, obs.CurrentBlockTimestamp.Err) assert.Zero(t, obs.MaxFinalizedBlockNumber.Val) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "fetchMaxFinalizedBlockNum=false") }) t.Run("makes observation using pipeline, with erroring tasks", func(t *testing.T) { for i := range trrs { trrs[i].Result.Error = fmt.Errorf("task error %d", i) } obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Zero(t, obs.BenchmarkPrice.Val) assert.EqualError(t, obs.BenchmarkPrice.Err, "task error 0") assert.Zero(t, obs.Bid.Val) assert.EqualError(t, obs.Bid.Err, "task error 1") assert.Zero(t, obs.Ask.Val) assert.EqualError(t, obs.Ask.Err, "task error 2") assert.Equal(t, head.Number, obs.CurrentBlockNum.Val) assert.NoError(t, obs.CurrentBlockNum.Err) assert.Equal(t, fmt.Sprintf("%x", head.Hash), fmt.Sprintf("%x", obs.CurrentBlockHash.Val)) assert.NoError(t, obs.CurrentBlockHash.Err) assert.Equal(t, uint64(head.Timestamp.Unix()), obs.CurrentBlockTimestamp.Val) assert.NoError(t, obs.CurrentBlockTimestamp.Err) assert.Zero(t, obs.MaxFinalizedBlockNumber.Val) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "fetchMaxFinalizedBlockNum=false") }) t.Run("makes partial observation using pipeline, if only some results have errored", func(t *testing.T) { trrs[0].Result.Error = fmt.Errorf("task failed") trrs[1].Result.Value = "33" trrs[1].Result.Error = nil trrs[2].Result.Value = nil trrs[2].Result.Error = fmt.Errorf("task failed") obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Zero(t, obs.BenchmarkPrice.Val) assert.EqualError(t, obs.BenchmarkPrice.Err, "task failed") assert.Equal(t, big.NewInt(33), obs.Bid.Val) assert.NoError(t, obs.Bid.Err) assert.Zero(t, obs.Ask.Val) assert.EqualError(t, obs.Ask.Err, "task failed") }) t.Run("returns error if at least one result is unparseable", func(t *testing.T) { trrs[0].Result.Error = fmt.Errorf("task failed") trrs[1].Result.Value = "foo" trrs[1].Result.Error = nil trrs[2].Result.Value = "123456" trrs[2].Result.Error = nil _, err := ds.Observe(ctx, repts, false) assert.EqualError(t, err, "Observe failed while parsing run results: failed to parse Bid: can't convert foo to decimal") }) t.Run("saves run", func(t *testing.T) { for i := range trrs { trrs[i].Result.Value = "123" trrs[i].Result.Error = nil } _, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Equal(t, int64(42), saver.r.ID) }) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `t.Run("when run execution fails, returns error", func(t *testing.T) { t.Cleanup(func() { runner.Err = nil }) runner.Err = errors.New("run execution failed") _, err := ds.Observe(ctx, repts, false) assert.EqualError(t, err, "Observe failed while executing run: error executing run for spec ID 0: run execution failed") })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `t.Cleanup(func() { runner.Err = nil })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `runner.Err = nil` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `runner.Err = errors.New("run execution failed")` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `t.Run("makes observation using pipeline, when all tasks succeed", func(t *testing.T) { obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Equal(t, big.NewInt(122), obs.BenchmarkPrice.Val) assert.NoError(t, obs.BenchmarkPrice.Err) assert.Equal(t, big.NewInt(121), obs.Bid.Val) assert.NoError(t, obs.Bid.Err) assert.Equal(t, big.NewInt(123), obs.Ask.Val) assert.NoError(t, obs.Ask.Err) assert.Equal(t, head.Number, obs.CurrentBlockNum.Val) assert.NoError(t, obs.CurrentBlockNum.Err) assert.Equal(t, fmt.Sprintf("%x", head.Hash), fmt.Sprintf("%x", obs.CurrentBlockHash.Val)) assert.NoError(t, obs.CurrentBlockHash.Err) assert.Equal(t, uint64(head.Timestamp.Unix()), obs.CurrentBlockTimestamp.Val) assert.NoError(t, obs.CurrentBlockTimestamp.Err) assert.Zero(t, obs.MaxFinalizedBlockNumber.Val) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "fetchMaxFinalizedBlockNum=false") })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `t.Run("makes observation using pipeline, with erroring tasks", func(t *testing.T) { for i := range trrs { trrs[i].Result.Error = fmt.Errorf("task error %d", i) } obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Zero(t, obs.BenchmarkPrice.Val) assert.EqualError(t, obs.BenchmarkPrice.Err, "task error 0") assert.Zero(t, obs.Bid.Val) assert.EqualError(t, obs.Bid.Err, "task error 1") assert.Zero(t, obs.Ask.Val) assert.EqualError(t, obs.Ask.Err, "task error 2") assert.Equal(t, head.Number, obs.CurrentBlockNum.Val) assert.NoError(t, obs.CurrentBlockNum.Err) assert.Equal(t, fmt.Sprintf("%x", head.Hash), fmt.Sprintf("%x", obs.CurrentBlockHash.Val)) assert.NoError(t, obs.CurrentBlockHash.Err) assert.Equal(t, uint64(head.Timestamp.Unix()), obs.CurrentBlockTimestamp.Val) assert.NoError(t, obs.CurrentBlockTimestamp.Err) assert.Zero(t, obs.MaxFinalizedBlockNumber.Val) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "fetchMaxFinalizedBlockNum=false") })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `trrs[i].Result.Error = fmt.Errorf("task error %d", i)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `t.Run("makes partial observation using pipeline, if only some results have errored", func(t *testing.T) { trrs[0].Result.Error = fmt.Errorf("task failed") trrs[1].Result.Value = "33" trrs[1].Result.Error = nil trrs[2].Result.Value = nil trrs[2].Result.Error = fmt.Errorf("task failed") obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Zero(t, obs.BenchmarkPrice.Val) assert.EqualError(t, obs.BenchmarkPrice.Err, "task failed") assert.Equal(t, big.NewInt(33), obs.Bid.Val) assert.NoError(t, obs.Bid.Err) assert.Zero(t, obs.Ask.Val) assert.EqualError(t, obs.Ask.Err, "task failed") })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `trrs[0].Result.Error = fmt.Errorf("task failed")` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `trrs[1].Result.Value = "33"` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `trrs[1].Result.Error = nil` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `trrs[2].Result.Value = nil` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `trrs[2].Result.Error = fmt.Errorf("task failed")` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `t.Run("returns error if at least one result is unparseable", func(t *testing.T) { trrs[0].Result.Error = fmt.Errorf("task failed") trrs[1].Result.Value = "foo" trrs[1].Result.Error = nil trrs[2].Result.Value = "123456" trrs[2].Result.Error = nil _, err := ds.Observe(ctx, repts, false) assert.EqualError(t, err, "Observe failed while parsing run results: failed to parse Bid: can't convert foo to decimal") })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `trrs[0].Result.Error = fmt.Errorf("task failed")` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `trrs[1].Result.Value = "foo"` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `trrs[1].Result.Error = nil` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `trrs[2].Result.Value = "123456"` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `trrs[2].Result.Error = nil` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `t.Run("saves run", func(t *testing.T) { for i := range trrs { trrs[i].Result.Value = "123" trrs[i].Result.Error = nil } _, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Equal(t, int64(42), saver.r.ID) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `trrs[i].Result.Value = "123"` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `trrs[i].Result.Error = nil` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `t.Run("when chain length is zero", func(t *testing.T) { ht2 := htmocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) ht2.On("LatestChain").Return((*evmtypes.Head)(nil)) ds.mercuryChainReader = evm.NewMercuryChainReader(ht2) obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.Len(t, obs.LatestBlocks, 0) ht2.AssertExpectations(t) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `ht2.On("LatestChain").Return((*evmtypes.Head)(nil))` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `ds.mercuryChainReader = evm.NewMercuryChainReader(ht2)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `ht2.AssertExpectations(t)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `t.Run("when chain is too short", func(t *testing.T) { h4 := &evmtypes.Head{ Number: 4, Parent: nil, } h5 := &evmtypes.Head{ Number: 5, Parent: h4, } h6 := &evmtypes.Head{ Number: 6, Parent: h5, } ht2 := htmocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) ht2.On("LatestChain").Return(h6) ds.mercuryChainReader = evm.NewMercuryChainReader(ht2) obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.Len(t, obs.LatestBlocks, 3) assert.Equal(t, 6, int(obs.LatestBlocks[0].Num)) assert.Equal(t, 5, int(obs.LatestBlocks[1].Num)) assert.Equal(t, 4, int(obs.LatestBlocks[2].Num)) ht2.AssertExpectations(t) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `ht2.On("LatestChain").Return(h6)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `ds.mercuryChainReader = evm.NewMercuryChainReader(ht2)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `ht2.AssertExpectations(t)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `t.Run("when chain is long enough", func(t *testing.T) { heads := make([]*evmtypes.Head, nBlocksObservation+5) for i := range heads { heads[i] = &evmtypes.Head{Number: int64(i)} if i > 0 { heads[i].Parent = heads[i-1] } } ht2 := htmocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) ht2.On("LatestChain").Return(heads[len(heads)-1]) ds.mercuryChainReader = evm.NewMercuryChainReader(ht2) obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.Len(t, obs.LatestBlocks, nBlocksObservation) highestBlockNum := heads[len(heads)-1].Number for i := range obs.LatestBlocks { assert.Equal(t, int(highestBlockNum)-i, int(obs.LatestBlocks[i].Num)) } ht2.AssertExpectations(t) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `heads[i] = &evmtypes.Head{Number: int64(i)}` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `heads[i].Parent = heads[i-1]` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `ht2.On("LatestChain").Return(heads[len(heads)-1])` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `ds.mercuryChainReader = evm.NewMercuryChainReader(ht2)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `ht2.AssertExpectations(t)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `t.Run("when chain reader returns an error", func(t *testing.T) { ds.mercuryChainReader = &mockChainReader{ err: io.EOF, obs: nil, } obs, err := ds.Observe(ctx, repts, true) assert.Error(t, err) assert.Equal(t, obs, v1.Observation{}) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `ds.mercuryChainReader = &mockChainReader{ err: io.EOF, obs: nil, }` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `t.Run("returns head from headtracker if present", func(t *testing.T) { headTracker := htmocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) headTracker.On("LatestChain").Return(&h, nil) ds.mercuryChainReader = evm.NewMercuryChainReader(headTracker) obs := v1.Observation{} err := ds.setLatestBlocks(testutils.Context(t), &obs) assert.NoError(t, err) assert.Equal(t, h.Number, obs.CurrentBlockNum.Val) assert.Equal(t, h.Hash.Bytes(), obs.CurrentBlockHash.Val) assert.Equal(t, uint64(h.Timestamp.Unix()), obs.CurrentBlockTimestamp.Val) assert.Len(t, obs.LatestBlocks, 1) headTracker.AssertExpectations(t) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `headTracker.On("LatestChain").Return(&h, nil)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `ds.mercuryChainReader = evm.NewMercuryChainReader(headTracker)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `headTracker.AssertExpectations(t)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `headTracker.On("LatestChain").Return((*evmtypes.Head)(nil))` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `ds.mercuryChainReader = evm.NewChainReader(headTracker)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `headTracker.AssertExpectations(t)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.TestLogger(t)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.NewMercuryChainReader(h)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Int31()` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.NewHash()` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Now()` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.On("LatestChain")` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Return(head)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Run("when fetchMaxFinalizedBlockNum=true", func(t *testing.T) { t.Run("with latest report in database", func(t *testing.T) { orm.report = buildSampleV1Report() orm.err = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedBlockNumber.Err) assert.Equal(t, int64(143), obs.MaxFinalizedBlockNumber.Val) }) t.Run("if querying latest report fails", func(t *testing.T) { orm.report = nil orm.err = errors.New("something exploded") obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "something exploded") assert.Zero(t, obs.MaxFinalizedBlockNumber.Val) }) t.Run("if decoding latest report fails", func(t *testing.T) { orm.report = []byte{1, 2, 3} orm.err = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "failed to decode report: abi: cannot marshal in to go type: length insufficient 3 require 32") assert.Zero(t, obs.MaxFinalizedBlockNumber.Val) }) orm.report = nil orm.err = nil t.Run("without latest report in database", func(t *testing.T) { t.Run("if FetchInitialMaxFinalizedBlockNumber returns error", func(t *testing.T) { fetcher.err = errors.New("mock fetcher error") obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "mock fetcher error") assert.Zero(t, obs.MaxFinalizedBlockNumber.Val) }) t.Run("if FetchInitialMaxFinalizedBlockNumber succeeds", func(t *testing.T) { fetcher.err = nil var num int64 = 32 fetcher.num = &num obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedBlockNumber.Err) assert.Equal(t, int64(32), obs.MaxFinalizedBlockNumber.Val) }) t.Run("if FetchInitialMaxFinalizedBlockNumber returns nil (new feed) and initialBlockNumber is set", func(t *testing.T) { var initialBlockNumber int64 = 50 ds.initialBlockNumber = &initialBlockNumber fetcher.err = nil fetcher.num = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedBlockNumber.Err) assert.Equal(t, int64(49), obs.MaxFinalizedBlockNumber.Val) }) t.Run("if FetchInitialMaxFinalizedBlockNumber returns nil (new feed) and initialBlockNumber is not set", func(t *testing.T) { ds.initialBlockNumber = nil t.Run("if current block num is valid", func(t *testing.T) { fetcher.err = nil fetcher.num = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedBlockNumber.Err) assert.Equal(t, head.Number-1, obs.MaxFinalizedBlockNumber.Val) }) t.Run("if no current block available", func(t *testing.T) { h2 := htmocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) h2.On("LatestChain").Return((*evmtypes.Head)(nil)) ds.mercuryChainReader = evm.NewMercuryChainReader(h2) obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "FetchInitialMaxFinalizedBlockNumber returned empty LatestReport; this is a new feed. No initialBlockNumber was set, tried to use current block number to determine maxFinalizedBlockNumber but got error: no blocks available") }) }) }) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Run("with latest report in database", func(t *testing.T) { orm.report = buildSampleV1Report() orm.err = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedBlockNumber.Err) assert.Equal(t, int64(143), obs.MaxFinalizedBlockNumber.Val) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Observe(ctx, repts, true)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Run("if querying latest report fails", func(t *testing.T) { orm.report = nil orm.err = errors.New("something exploded") obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "something exploded") assert.Zero(t, obs.MaxFinalizedBlockNumber.Val) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.New("something exploded")` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Observe(ctx, repts, true)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Run("if decoding latest report fails", func(t *testing.T) { orm.report = []byte{1, 2, 3} orm.err = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "failed to decode report: abi: cannot marshal in to go type: length insufficient 3 require 32") assert.Zero(t, obs.MaxFinalizedBlockNumber.Val) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Observe(ctx, repts, true)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Run("without latest report in database", func(t *testing.T) { t.Run("if FetchInitialMaxFinalizedBlockNumber returns error", func(t *testing.T) { fetcher.err = errors.New("mock fetcher error") obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "mock fetcher error") assert.Zero(t, obs.MaxFinalizedBlockNumber.Val) }) t.Run("if FetchInitialMaxFinalizedBlockNumber succeeds", func(t *testing.T) { fetcher.err = nil var num int64 = 32 fetcher.num = &num obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedBlockNumber.Err) assert.Equal(t, int64(32), obs.MaxFinalizedBlockNumber.Val) }) t.Run("if FetchInitialMaxFinalizedBlockNumber returns nil (new feed) and initialBlockNumber is set", func(t *testing.T) { var initialBlockNumber int64 = 50 ds.initialBlockNumber = &initialBlockNumber fetcher.err = nil fetcher.num = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedBlockNumber.Err) assert.Equal(t, int64(49), obs.MaxFinalizedBlockNumber.Val) }) t.Run("if FetchInitialMaxFinalizedBlockNumber returns nil (new feed) and initialBlockNumber is not set", func(t *testing.T) { ds.initialBlockNumber = nil t.Run("if current block num is valid", func(t *testing.T) { fetcher.err = nil fetcher.num = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedBlockNumber.Err) assert.Equal(t, head.Number-1, obs.MaxFinalizedBlockNumber.Val) }) t.Run("if no current block available", func(t *testing.T) { h2 := htmocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) h2.On("LatestChain").Return((*evmtypes.Head)(nil)) ds.mercuryChainReader = evm.NewMercuryChainReader(h2) obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "FetchInitialMaxFinalizedBlockNumber returned empty LatestReport; this is a new feed. No initialBlockNumber was set, tried to use current block number to determine maxFinalizedBlockNumber but got error: no blocks available") }) }) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Run("if FetchInitialMaxFinalizedBlockNumber returns error", func(t *testing.T) { fetcher.err = errors.New("mock fetcher error") obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "mock fetcher error") assert.Zero(t, obs.MaxFinalizedBlockNumber.Val) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.New("mock fetcher error")` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Observe(ctx, repts, true)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Run("if FetchInitialMaxFinalizedBlockNumber succeeds", func(t *testing.T) { fetcher.err = nil var num int64 = 32 fetcher.num = &num obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedBlockNumber.Err) assert.Equal(t, int64(32), obs.MaxFinalizedBlockNumber.Val) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Observe(ctx, repts, true)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Run("if FetchInitialMaxFinalizedBlockNumber returns nil (new feed) and initialBlockNumber is set", func(t *testing.T) { var initialBlockNumber int64 = 50 ds.initialBlockNumber = &initialBlockNumber fetcher.err = nil fetcher.num = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedBlockNumber.Err) assert.Equal(t, int64(49), obs.MaxFinalizedBlockNumber.Val) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Observe(ctx, repts, true)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Run("if FetchInitialMaxFinalizedBlockNumber returns nil (new feed) and initialBlockNumber is not set", func(t *testing.T) { ds.initialBlockNumber = nil t.Run("if current block num is valid", func(t *testing.T) { fetcher.err = nil fetcher.num = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedBlockNumber.Err) assert.Equal(t, head.Number-1, obs.MaxFinalizedBlockNumber.Val) }) t.Run("if no current block available", func(t *testing.T) { h2 := htmocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) h2.On("LatestChain").Return((*evmtypes.Head)(nil)) ds.mercuryChainReader = evm.NewMercuryChainReader(h2) obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "FetchInitialMaxFinalizedBlockNumber returned empty LatestReport; this is a new feed. No initialBlockNumber was set, tried to use current block number to determine maxFinalizedBlockNumber but got error: no blocks available") }) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Run("if current block num is valid", func(t *testing.T) { fetcher.err = nil fetcher.num = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedBlockNumber.Err) assert.Equal(t, head.Number-1, obs.MaxFinalizedBlockNumber.Val) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Observe(ctx, repts, true)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Run("if no current block available", func(t *testing.T) { h2 := htmocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) h2.On("LatestChain").Return((*evmtypes.Head)(nil)) ds.mercuryChainReader = evm.NewMercuryChainReader(h2) obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "FetchInitialMaxFinalizedBlockNumber returned empty LatestReport; this is a new feed. No initialBlockNumber was set, tried to use current block number to determine maxFinalizedBlockNumber but got error: no blocks available") })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.On("LatestChain")` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Return((*evmtypes.Head)(nil))` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.NewMercuryChainReader(h2)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Observe(ctx, repts, true)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.NewMercuryChainReader(h)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Run("when fetchMaxFinalizedBlockNum=false", func(t *testing.T) { t.Run("when run execution fails, returns error", func(t *testing.T) { t.Cleanup(func() { runner.Err = nil }) runner.Err = errors.New("run execution failed") _, err := ds.Observe(ctx, repts, false) assert.EqualError(t, err, "Observe failed while executing run: error executing run for spec ID 0: run execution failed") }) t.Run("makes observation using pipeline, when all tasks succeed", func(t *testing.T) { obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Equal(t, big.NewInt(122), obs.BenchmarkPrice.Val) assert.NoError(t, obs.BenchmarkPrice.Err) assert.Equal(t, big.NewInt(121), obs.Bid.Val) assert.NoError(t, obs.Bid.Err) assert.Equal(t, big.NewInt(123), obs.Ask.Val) assert.NoError(t, obs.Ask.Err) assert.Equal(t, head.Number, obs.CurrentBlockNum.Val) assert.NoError(t, obs.CurrentBlockNum.Err) assert.Equal(t, fmt.Sprintf("%x", head.Hash), fmt.Sprintf("%x", obs.CurrentBlockHash.Val)) assert.NoError(t, obs.CurrentBlockHash.Err) assert.Equal(t, uint64(head.Timestamp.Unix()), obs.CurrentBlockTimestamp.Val) assert.NoError(t, obs.CurrentBlockTimestamp.Err) assert.Zero(t, obs.MaxFinalizedBlockNumber.Val) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "fetchMaxFinalizedBlockNum=false") }) t.Run("makes observation using pipeline, with erroring tasks", func(t *testing.T) { for i := range trrs { trrs[i].Result.Error = fmt.Errorf("task error %d", i) } obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Zero(t, obs.BenchmarkPrice.Val) assert.EqualError(t, obs.BenchmarkPrice.Err, "task error 0") assert.Zero(t, obs.Bid.Val) assert.EqualError(t, obs.Bid.Err, "task error 1") assert.Zero(t, obs.Ask.Val) assert.EqualError(t, obs.Ask.Err, "task error 2") assert.Equal(t, head.Number, obs.CurrentBlockNum.Val) assert.NoError(t, obs.CurrentBlockNum.Err) assert.Equal(t, fmt.Sprintf("%x", head.Hash), fmt.Sprintf("%x", obs.CurrentBlockHash.Val)) assert.NoError(t, obs.CurrentBlockHash.Err) assert.Equal(t, uint64(head.Timestamp.Unix()), obs.CurrentBlockTimestamp.Val) assert.NoError(t, obs.CurrentBlockTimestamp.Err) assert.Zero(t, obs.MaxFinalizedBlockNumber.Val) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "fetchMaxFinalizedBlockNum=false") }) t.Run("makes partial observation using pipeline, if only some results have errored", func(t *testing.T) { trrs[0].Result.Error = fmt.Errorf("task failed") trrs[1].Result.Value = "33" trrs[1].Result.Error = nil trrs[2].Result.Value = nil trrs[2].Result.Error = fmt.Errorf("task failed") obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Zero(t, obs.BenchmarkPrice.Val) assert.EqualError(t, obs.BenchmarkPrice.Err, "task failed") assert.Equal(t, big.NewInt(33), obs.Bid.Val) assert.NoError(t, obs.Bid.Err) assert.Zero(t, obs.Ask.Val) assert.EqualError(t, obs.Ask.Err, "task failed") }) t.Run("returns error if at least one result is unparseable", func(t *testing.T) { trrs[0].Result.Error = fmt.Errorf("task failed") trrs[1].Result.Value = "foo" trrs[1].Result.Error = nil trrs[2].Result.Value = "123456" trrs[2].Result.Error = nil _, err := ds.Observe(ctx, repts, false) assert.EqualError(t, err, "Observe failed while parsing run results: failed to parse Bid: can't convert foo to decimal") }) t.Run("saves run", func(t *testing.T) { for i := range trrs { trrs[i].Result.Value = "123" trrs[i].Result.Error = nil } _, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Equal(t, int64(42), saver.r.ID) }) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Run("when run execution fails, returns error", func(t *testing.T) { t.Cleanup(func() { runner.Err = nil }) runner.Err = errors.New("run execution failed") _, err := ds.Observe(ctx, repts, false) assert.EqualError(t, err, "Observe failed while executing run: error executing run for spec ID 0: run execution failed") })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Cleanup(func() { runner.Err = nil })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.New("run execution failed")` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Observe(ctx, repts, false)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Run("makes observation using pipeline, when all tasks succeed", func(t *testing.T) { obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Equal(t, big.NewInt(122), obs.BenchmarkPrice.Val) assert.NoError(t, obs.BenchmarkPrice.Err) assert.Equal(t, big.NewInt(121), obs.Bid.Val) assert.NoError(t, obs.Bid.Err) assert.Equal(t, big.NewInt(123), obs.Ask.Val) assert.NoError(t, obs.Ask.Err) assert.Equal(t, head.Number, obs.CurrentBlockNum.Val) assert.NoError(t, obs.CurrentBlockNum.Err) assert.Equal(t, fmt.Sprintf("%x", head.Hash), fmt.Sprintf("%x", obs.CurrentBlockHash.Val)) assert.NoError(t, obs.CurrentBlockHash.Err) assert.Equal(t, uint64(head.Timestamp.Unix()), obs.CurrentBlockTimestamp.Val) assert.NoError(t, obs.CurrentBlockTimestamp.Err) assert.Zero(t, obs.MaxFinalizedBlockNumber.Val) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "fetchMaxFinalizedBlockNum=false") })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Observe(ctx, repts, false)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Run("makes observation using pipeline, with erroring tasks", func(t *testing.T) { for i := range trrs { trrs[i].Result.Error = fmt.Errorf("task error %d", i) } obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Zero(t, obs.BenchmarkPrice.Val) assert.EqualError(t, obs.BenchmarkPrice.Err, "task error 0") assert.Zero(t, obs.Bid.Val) assert.EqualError(t, obs.Bid.Err, "task error 1") assert.Zero(t, obs.Ask.Val) assert.EqualError(t, obs.Ask.Err, "task error 2") assert.Equal(t, head.Number, obs.CurrentBlockNum.Val) assert.NoError(t, obs.CurrentBlockNum.Err) assert.Equal(t, fmt.Sprintf("%x", head.Hash), fmt.Sprintf("%x", obs.CurrentBlockHash.Val)) assert.NoError(t, obs.CurrentBlockHash.Err) assert.Equal(t, uint64(head.Timestamp.Unix()), obs.CurrentBlockTimestamp.Val) assert.NoError(t, obs.CurrentBlockTimestamp.Err) assert.Zero(t, obs.MaxFinalizedBlockNumber.Val) assert.EqualError(t, obs.MaxFinalizedBlockNumber.Err, "fetchMaxFinalizedBlockNum=false") })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Observe(ctx, repts, false)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Run("makes partial observation using pipeline, if only some results have errored", func(t *testing.T) { trrs[0].Result.Error = fmt.Errorf("task failed") trrs[1].Result.Value = "33" trrs[1].Result.Error = nil trrs[2].Result.Value = nil trrs[2].Result.Error = fmt.Errorf("task failed") obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Zero(t, obs.BenchmarkPrice.Val) assert.EqualError(t, obs.BenchmarkPrice.Err, "task failed") assert.Equal(t, big.NewInt(33), obs.Bid.Val) assert.NoError(t, obs.Bid.Err) assert.Zero(t, obs.Ask.Val) assert.EqualError(t, obs.Ask.Err, "task failed") })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Observe(ctx, repts, false)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Run("returns error if at least one result is unparseable", func(t *testing.T) { trrs[0].Result.Error = fmt.Errorf("task failed") trrs[1].Result.Value = "foo" trrs[1].Result.Error = nil trrs[2].Result.Value = "123456" trrs[2].Result.Error = nil _, err := ds.Observe(ctx, repts, false) assert.EqualError(t, err, "Observe failed while parsing run results: failed to parse Bid: can't convert foo to decimal") })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Observe(ctx, repts, false)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Run("saves run", func(t *testing.T) { for i := range trrs { trrs[i].Result.Value = "123" trrs[i].Result.Error = nil } _, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Equal(t, int64(42), saver.r.ID) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Observe(ctx, repts, false)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Run("when chain length is zero", func(t *testing.T) { ht2 := htmocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) ht2.On("LatestChain").Return((*evmtypes.Head)(nil)) ds.mercuryChainReader = evm.NewMercuryChainReader(ht2) obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.Len(t, obs.LatestBlocks, 0) ht2.AssertExpectations(t) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.On("LatestChain")` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Return((*evmtypes.Head)(nil))` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.NewMercuryChainReader(ht2)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Observe(ctx, repts, true)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.AssertExpectations(t)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Run("when chain is too short", func(t *testing.T) { h4 := &evmtypes.Head{ Number: 4, Parent: nil, } h5 := &evmtypes.Head{ Number: 5, Parent: h4, } h6 := &evmtypes.Head{ Number: 6, Parent: h5, } ht2 := htmocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) ht2.On("LatestChain").Return(h6) ds.mercuryChainReader = evm.NewMercuryChainReader(ht2) obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.Len(t, obs.LatestBlocks, 3) assert.Equal(t, 6, int(obs.LatestBlocks[0].Num)) assert.Equal(t, 5, int(obs.LatestBlocks[1].Num)) assert.Equal(t, 4, int(obs.LatestBlocks[2].Num)) ht2.AssertExpectations(t) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.On("LatestChain")` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Return(h6)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.NewMercuryChainReader(ht2)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Observe(ctx, repts, true)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.AssertExpectations(t)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Run("when chain is long enough", func(t *testing.T) { heads := make([]*evmtypes.Head, nBlocksObservation+5) for i := range heads { heads[i] = &evmtypes.Head{Number: int64(i)} if i > 0 { heads[i].Parent = heads[i-1] } } ht2 := htmocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) ht2.On("LatestChain").Return(heads[len(heads)-1]) ds.mercuryChainReader = evm.NewMercuryChainReader(ht2) obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.Len(t, obs.LatestBlocks, nBlocksObservation) highestBlockNum := heads[len(heads)-1].Number for i := range obs.LatestBlocks { assert.Equal(t, int(highestBlockNum)-i, int(obs.LatestBlocks[i].Num)) } ht2.AssertExpectations(t) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.On("LatestChain")` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Return(heads[len(heads)-1])` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.NewMercuryChainReader(ht2)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Observe(ctx, repts, true)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.AssertExpectations(t)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Run("when chain reader returns an error", func(t *testing.T) { ds.mercuryChainReader = &mockChainReader{ err: io.EOF, obs: nil, } obs, err := ds.Observe(ctx, repts, true) assert.Error(t, err) assert.Equal(t, obs, v1.Observation{}) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Observe(ctx, repts, true)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.TestLogger(t)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.NewRandomPositiveInt64()` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.NewHash()` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.NewHash()` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Now()` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.NewWeiI(testutils.NewRandomPositiveInt64())` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.NewRandomPositiveInt64()` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.NewHash()` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.NewHash()` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.NewHash()` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Run("returns head from headtracker if present", func(t *testing.T) { headTracker := htmocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) headTracker.On("LatestChain").Return(&h, nil) ds.mercuryChainReader = evm.NewMercuryChainReader(headTracker) obs := v1.Observation{} err := ds.setLatestBlocks(testutils.Context(t), &obs) assert.NoError(t, err) assert.Equal(t, h.Number, obs.CurrentBlockNum.Val) assert.Equal(t, h.Hash.Bytes(), obs.CurrentBlockHash.Val) assert.Equal(t, uint64(h.Timestamp.Unix()), obs.CurrentBlockTimestamp.Val) assert.Len(t, obs.LatestBlocks, 1) headTracker.AssertExpectations(t) })` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.On("LatestChain")` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Return(&h, nil)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.NewMercuryChainReader(headTracker)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.setLatestBlocks(testutils.Context(t), &obs)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.AssertExpectations(t)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.On("LatestChain")` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Return((*evmtypes.Head)(nil))` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.NewChainReader(headTracker)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.setLatestBlocks(testutils.Context(t), &obs)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/v1/data_source_test.go: `.AssertExpectations(t)` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `t.Run("BuildReport errors on zero fields", func(t *testing.T) { _, err := r.BuildReport(v1.ReportFields{}) require.Error(t, err) assert.Contains(t, err.Error(), "benchmarkPrice may not be nil") assert.Contains(t, err.Error(), "bid may not be nil") assert.Contains(t, err.Error(), "ask may not be nil") assert.Contains(t, err.Error(), "invalid length for currentBlockHash, expected: 32, got: 0") })` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `t.Run("BuildReport constructs a report from observations", func(t *testing.T) { rf := newValidReportFields() // only need to test happy path since validations are done in relaymercury report, err := r.BuildReport(rf) require.NoError(t, err) reportElems := make(map[string]interface{}) err = ReportTypes.UnpackIntoMap(reportElems, report) require.NoError(t, err) assert.Equal(t, int(reportElems["observationsTimestamp"].(uint32)), 242) assert.Equal(t, reportElems["benchmarkPrice"].(*big.Int).Int64(), int64(243)) assert.Equal(t, reportElems["bid"].(*big.Int).Int64(), int64(244)) assert.Equal(t, reportElems["ask"].(*big.Int).Int64(), int64(245)) assert.Equal(t, reportElems["currentBlockNum"].(uint64), uint64(248)) assert.Equal(t, common.Hash(reportElems["currentBlockHash"].([32]byte)), common.BytesToHash(hash)) assert.Equal(t, reportElems["currentBlockTimestamp"].(uint64), uint64(123)) assert.Equal(t, reportElems["validFromBlockNum"].(uint64), uint64(46)) assert.Equal(t, types.Report{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x55, 0x2c, 0x2c, 0xea, 0x3a, 0xb4, 0x3b, 0xae, 0x13, 0x7d, 0x89, 0xee, 0x61, 0x42, 0xa0, 0x1d, 0xb3, 0xae, 0x2b, 0x56, 0x78, 0xbc, 0x3c, 0x9b, 0xd5, 0xf5, 0x9, 0xf5, 0x37, 0xbe, 0xa5, 0x7b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b}, report) max, err := r.MaxReportLength(4) require.NoError(t, err) assert.LessOrEqual(t, len(report), max) t.Run("Decode decodes the report", func(t *testing.T) { decoded, err := r.Decode(report) require.NoError(t, err) require.NotNil(t, decoded) assert.Equal(t, uint32(242), decoded.ObservationsTimestamp) assert.Equal(t, big.NewInt(243), decoded.BenchmarkPrice) assert.Equal(t, big.NewInt(244), decoded.Bid) assert.Equal(t, big.NewInt(245), decoded.Ask) assert.Equal(t, uint64(248), decoded.CurrentBlockNum) assert.Equal(t, [32]byte(common.BytesToHash(hash)), decoded.CurrentBlockHash) assert.Equal(t, uint64(123), decoded.CurrentBlockTimestamp) assert.Equal(t, uint64(46), decoded.ValidFromBlockNum) }) })` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `err = ReportTypes.UnpackIntoMap(reportElems, report)` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `t.Run("Decode decodes the report", func(t *testing.T) { decoded, err := r.Decode(report) require.NoError(t, err) require.NotNil(t, decoded) assert.Equal(t, uint32(242), decoded.ObservationsTimestamp) assert.Equal(t, big.NewInt(243), decoded.BenchmarkPrice) assert.Equal(t, big.NewInt(244), decoded.Bid) assert.Equal(t, big.NewInt(245), decoded.Ask) assert.Equal(t, uint64(248), decoded.CurrentBlockNum) assert.Equal(t, [32]byte(common.BytesToHash(hash)), decoded.CurrentBlockHash) assert.Equal(t, uint64(123), decoded.CurrentBlockTimestamp) assert.Equal(t, uint64(46), decoded.ValidFromBlockNum) })` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `longBad[i] = byte(i)` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `_, err = r.Decode(longBad)` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `t.Run("CurrentBlockNumFromReport extracts the current block number from a valid report", func(t *testing.T) { report := buildSampleReport(validBn, 143, feedID) bn, err := r.CurrentBlockNumFromReport(report) require.NoError(t, err) assert.Equal(t, validBn, bn) })` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `t.Run("ValidFromBlockNumFromReport extracts the valid from block number from a valid report", func(t *testing.T) { report := buildSampleReport(42, 999, feedID) bn, err := r.ValidFromBlockNumFromReport(report) require.NoError(t, err) assert.Equal(t, int64(999), bn) })` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `t.Run("BenchmarkPriceFromReport extracts the benchmark price from valid report", func(t *testing.T) { report := buildSampleReport(42, 999, feedID) bp, err := r.BenchmarkPriceFromReport(report) require.NoError(t, err) assert.Equal(t, big.NewInt(242), bp) })` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `.Run("BuildReport errors on zero fields", func(t *testing.T) { _, err := r.BuildReport(v1.ReportFields{}) require.Error(t, err) assert.Contains(t, err.Error(), "benchmarkPrice may not be nil") assert.Contains(t, err.Error(), "bid may not be nil") assert.Contains(t, err.Error(), "ask may not be nil") assert.Contains(t, err.Error(), "invalid length for currentBlockHash, expected: 32, got: 0") })` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `.BuildReport(v1.ReportFields{})` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `.Run("BuildReport constructs a report from observations", func(t *testing.T) { rf := newValidReportFields() // only need to test happy path since validations are done in relaymercury report, err := r.BuildReport(rf) require.NoError(t, err) reportElems := make(map[string]interface{}) err = ReportTypes.UnpackIntoMap(reportElems, report) require.NoError(t, err) assert.Equal(t, int(reportElems["observationsTimestamp"].(uint32)), 242) assert.Equal(t, reportElems["benchmarkPrice"].(*big.Int).Int64(), int64(243)) assert.Equal(t, reportElems["bid"].(*big.Int).Int64(), int64(244)) assert.Equal(t, reportElems["ask"].(*big.Int).Int64(), int64(245)) assert.Equal(t, reportElems["currentBlockNum"].(uint64), uint64(248)) assert.Equal(t, common.Hash(reportElems["currentBlockHash"].([32]byte)), common.BytesToHash(hash)) assert.Equal(t, reportElems["currentBlockTimestamp"].(uint64), uint64(123)) assert.Equal(t, reportElems["validFromBlockNum"].(uint64), uint64(46)) assert.Equal(t, types.Report{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x55, 0x2c, 0x2c, 0xea, 0x3a, 0xb4, 0x3b, 0xae, 0x13, 0x7d, 0x89, 0xee, 0x61, 0x42, 0xa0, 0x1d, 0xb3, 0xae, 0x2b, 0x56, 0x78, 0xbc, 0x3c, 0x9b, 0xd5, 0xf5, 0x9, 0xf5, 0x37, 0xbe, 0xa5, 0x7b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b}, report) max, err := r.MaxReportLength(4) require.NoError(t, err) assert.LessOrEqual(t, len(report), max) t.Run("Decode decodes the report", func(t *testing.T) { decoded, err := r.Decode(report) require.NoError(t, err) require.NotNil(t, decoded) assert.Equal(t, uint32(242), decoded.ObservationsTimestamp) assert.Equal(t, big.NewInt(243), decoded.BenchmarkPrice) assert.Equal(t, big.NewInt(244), decoded.Bid) assert.Equal(t, big.NewInt(245), decoded.Ask) assert.Equal(t, uint64(248), decoded.CurrentBlockNum) assert.Equal(t, [32]byte(common.BytesToHash(hash)), decoded.CurrentBlockHash) assert.Equal(t, uint64(123), decoded.CurrentBlockTimestamp) assert.Equal(t, uint64(46), decoded.ValidFromBlockNum) }) })` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `.BuildReport(rf)` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `.UnpackIntoMap(reportElems, report)` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `.MaxReportLength(4)` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `.Run("Decode decodes the report", func(t *testing.T) { decoded, err := r.Decode(report) require.NoError(t, err) require.NotNil(t, decoded) assert.Equal(t, uint32(242), decoded.ObservationsTimestamp) assert.Equal(t, big.NewInt(243), decoded.BenchmarkPrice) assert.Equal(t, big.NewInt(244), decoded.Bid) assert.Equal(t, big.NewInt(245), decoded.Ask) assert.Equal(t, uint64(248), decoded.CurrentBlockNum) assert.Equal(t, [32]byte(common.BytesToHash(hash)), decoded.CurrentBlockHash) assert.Equal(t, uint64(123), decoded.CurrentBlockTimestamp) assert.Equal(t, uint64(46), decoded.ValidFromBlockNum) })` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `.Decode(report)` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `.Decode([]byte{1, 2, 3})` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `.Decode(longBad)` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `.NewHash()` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `.Run("CurrentBlockNumFromReport extracts the current block number from a valid report", func(t *testing.T) { report := buildSampleReport(validBn, 143, feedID) bn, err := r.CurrentBlockNumFromReport(report) require.NoError(t, err) assert.Equal(t, validBn, bn) })` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `.CurrentBlockNumFromReport(report)` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `.CurrentBlockNumFromReport(report)` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `.NewHash()` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `.Run("ValidFromBlockNumFromReport extracts the valid from block number from a valid report", func(t *testing.T) { report := buildSampleReport(42, 999, feedID) bn, err := r.ValidFromBlockNumFromReport(report) require.NoError(t, err) assert.Equal(t, int64(999), bn) })` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `.ValidFromBlockNumFromReport(report)` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `.ValidFromBlockNumFromReport(report)` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `.NewHash()` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `.Run("BenchmarkPriceFromReport extracts the benchmark price from valid report", func(t *testing.T) { report := buildSampleReport(42, 999, feedID) bp, err := r.BenchmarkPriceFromReport(report) require.NoError(t, err) assert.Equal(t, big.NewInt(242), bp) })` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `.BenchmarkPriceFromReport(report)` $DIR/core/services/relay/evm/mercury/v1/reportcodec/report_codec_test.go: `.BenchmarkPriceFromReport([]byte{1, 2, 3})` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `ds.fetcher = fetcher` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `ds.saver = saver` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `ds.pipelineRunner = &mercurymocks.MockRunner{ Trrs: goodTrrs, }` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `ds.spec = spec` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `t.Run("when fetchMaxFinalizedTimestamp=true", func(t *testing.T) { t.Run("with latest report in database", func(t *testing.T) { orm.report = buildSampleV2Report() orm.err = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, int64(124), obs.MaxFinalizedTimestamp.Val) }) t.Run("if querying latest report fails", func(t *testing.T) { orm.report = nil orm.err = errors.New("something exploded") obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedTimestamp.Err, "something exploded") assert.Zero(t, obs.MaxFinalizedTimestamp.Val) }) t.Run("if codec fails to decode", func(t *testing.T) { orm.report = []byte{1, 2, 3} orm.err = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedTimestamp.Err, "failed to decode report: abi: cannot marshal in to go type: length insufficient 3 require 32") assert.Zero(t, obs.MaxFinalizedTimestamp.Val) }) orm.report = nil orm.err = nil t.Run("if LatestTimestamp returns error", func(t *testing.T) { fetcher.tsErr = errors.New("some error") obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedTimestamp.Err, "some error") assert.Zero(t, obs.MaxFinalizedTimestamp.Val) }) t.Run("if LatestTimestamp succeeds", func(t *testing.T) { fetcher.tsErr = nil fetcher.ts = 123 obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.Equal(t, int64(123), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) }) t.Run("if LatestTimestamp succeeds but ts=0 (new feed)", func(t *testing.T) { fetcher.tsErr = nil fetcher.ts = 0 obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Zero(t, obs.MaxFinalizedTimestamp.Val) }) t.Run("when run execution succeeded", func(t *testing.T) { t.Run("when feedId=linkFeedID=nativeFeedId", func(t *testing.T) { t.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId }) ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, feedId, feedId fetcher.ts = 123123 fetcher.tsErr = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.Equal(t, big.NewInt(122), obs.BenchmarkPrice.Val) assert.NoError(t, obs.BenchmarkPrice.Err) assert.Equal(t, int64(123123), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, big.NewInt(122), obs.LinkPrice.Val) assert.NoError(t, obs.LinkPrice.Err) assert.Equal(t, big.NewInt(122), obs.NativePrice.Val) assert.NoError(t, obs.NativePrice.Err) }) }) })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `t.Run("with latest report in database", func(t *testing.T) { orm.report = buildSampleV2Report() orm.err = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, int64(124), obs.MaxFinalizedTimestamp.Val) })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `orm.report = buildSampleV2Report()` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `orm.err = nil` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `t.Run("if querying latest report fails", func(t *testing.T) { orm.report = nil orm.err = errors.New("something exploded") obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedTimestamp.Err, "something exploded") assert.Zero(t, obs.MaxFinalizedTimestamp.Val) })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `orm.report = nil` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `orm.err = errors.New("something exploded")` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `t.Run("if codec fails to decode", func(t *testing.T) { orm.report = []byte{1, 2, 3} orm.err = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedTimestamp.Err, "failed to decode report: abi: cannot marshal in to go type: length insufficient 3 require 32") assert.Zero(t, obs.MaxFinalizedTimestamp.Val) })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `orm.report = []byte{1, 2, 3}` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `orm.err = nil` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `orm.report = nil` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `orm.err = nil` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `t.Run("if LatestTimestamp returns error", func(t *testing.T) { fetcher.tsErr = errors.New("some error") obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedTimestamp.Err, "some error") assert.Zero(t, obs.MaxFinalizedTimestamp.Val) })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `fetcher.tsErr = errors.New("some error")` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `t.Run("if LatestTimestamp succeeds", func(t *testing.T) { fetcher.tsErr = nil fetcher.ts = 123 obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.Equal(t, int64(123), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `fetcher.tsErr = nil` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `fetcher.ts = 123` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `t.Run("if LatestTimestamp succeeds but ts=0 (new feed)", func(t *testing.T) { fetcher.tsErr = nil fetcher.ts = 0 obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Zero(t, obs.MaxFinalizedTimestamp.Val) })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `fetcher.tsErr = nil` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `fetcher.ts = 0` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `t.Run("when run execution succeeded", func(t *testing.T) { t.Run("when feedId=linkFeedID=nativeFeedId", func(t *testing.T) { t.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId }) ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, feedId, feedId fetcher.ts = 123123 fetcher.tsErr = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.Equal(t, big.NewInt(122), obs.BenchmarkPrice.Val) assert.NoError(t, obs.BenchmarkPrice.Err) assert.Equal(t, int64(123123), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, big.NewInt(122), obs.LinkPrice.Val) assert.NoError(t, obs.LinkPrice.Err) assert.Equal(t, big.NewInt(122), obs.NativePrice.Val) assert.NoError(t, obs.NativePrice.Err) }) })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `t.Run("when feedId=linkFeedID=nativeFeedId", func(t *testing.T) { t.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId }) ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, feedId, feedId fetcher.ts = 123123 fetcher.tsErr = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.Equal(t, big.NewInt(122), obs.BenchmarkPrice.Val) assert.NoError(t, obs.BenchmarkPrice.Err) assert.Equal(t, int64(123123), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, big.NewInt(122), obs.LinkPrice.Val) assert.NoError(t, obs.LinkPrice.Err) assert.Equal(t, big.NewInt(122), obs.NativePrice.Val) assert.NoError(t, obs.NativePrice.Err) })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `t.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, feedId, feedId` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `fetcher.ts = 123123` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `fetcher.tsErr = nil` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `t.Run("when run execution fails, returns error", func(t *testing.T) { t.Cleanup(func() { ds.pipelineRunner = &mercurymocks.MockRunner{ Trrs: goodTrrs, Err: nil, } }) ds.pipelineRunner = &mercurymocks.MockRunner{ Trrs: goodTrrs, Err: errors.New("run execution failed"), } _, err := ds.Observe(ctx, repts, false) assert.EqualError(t, err, "Observe failed while executing run: error executing run for spec ID 0: run execution failed") })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `t.Cleanup(func() { ds.pipelineRunner = &mercurymocks.MockRunner{ Trrs: goodTrrs, Err: nil, } })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `ds.pipelineRunner = &mercurymocks.MockRunner{ Trrs: goodTrrs, Err: nil, }` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `ds.pipelineRunner = &mercurymocks.MockRunner{ Trrs: goodTrrs, Err: errors.New("run execution failed"), }` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `t.Run("when parsing run results fails, return error", func(t *testing.T) { t.Cleanup(func() { runner := &mercurymocks.MockRunner{ Trrs: goodTrrs, Err: nil, } ds.pipelineRunner = runner }) badTrrs := []pipeline.TaskRunResult{ { // benchmark price Result: pipeline.Result{Error: errors.New("some error with bp")}, Task: &mercurymocks.MockTask{}, }, } ds.pipelineRunner = &mercurymocks.MockRunner{ Trrs: badTrrs, Err: nil, } _, err := ds.Observe(ctx, repts, false) assert.EqualError(t, err, "Observe failed while parsing run results: some error with bp") })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `t.Cleanup(func() { runner := &mercurymocks.MockRunner{ Trrs: goodTrrs, Err: nil, } ds.pipelineRunner = runner })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `ds.pipelineRunner = runner` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `ds.pipelineRunner = &mercurymocks.MockRunner{ Trrs: badTrrs, Err: nil, }` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `t.Run("when run execution succeeded", func(t *testing.T) { t.Run("when feedId=linkFeedID=nativeFeedId", func(t *testing.T) { t.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId }) var feedId utils.FeedID = [32]byte{1} ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, feedId, feedId obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Equal(t, big.NewInt(122), obs.BenchmarkPrice.Val) assert.NoError(t, obs.BenchmarkPrice.Err) assert.Equal(t, int64(0), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, big.NewInt(122), obs.LinkPrice.Val) assert.NoError(t, obs.LinkPrice.Err) assert.Equal(t, big.NewInt(122), obs.NativePrice.Val) assert.NoError(t, obs.NativePrice.Err) }) t.Run("when fails to fetch linkPrice or nativePrice", func(t *testing.T) { t.Cleanup(func() { fetcher.linkPriceErr = nil fetcher.nativePriceErr = nil }) fetcher.linkPriceErr = errors.New("some error fetching link price") fetcher.nativePriceErr = errors.New("some error fetching native price") obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Nil(t, obs.LinkPrice.Val) assert.EqualError(t, obs.LinkPrice.Err, "some error fetching link price") assert.Nil(t, obs.NativePrice.Val) assert.EqualError(t, obs.NativePrice.Err, "some error fetching native price") }) t.Run("when succeeds to fetch linkPrice or nativePrice but got nil (new feed)", func(t *testing.T) { obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Equal(t, obs.LinkPrice.Val, v2.MissingPrice) assert.Nil(t, obs.LinkPrice.Err) assert.Equal(t, obs.NativePrice.Val, v2.MissingPrice) assert.Nil(t, obs.NativePrice.Err) }) })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `t.Run("when feedId=linkFeedID=nativeFeedId", func(t *testing.T) { t.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId }) var feedId utils.FeedID = [32]byte{1} ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, feedId, feedId obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Equal(t, big.NewInt(122), obs.BenchmarkPrice.Val) assert.NoError(t, obs.BenchmarkPrice.Err) assert.Equal(t, int64(0), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, big.NewInt(122), obs.LinkPrice.Val) assert.NoError(t, obs.LinkPrice.Err) assert.Equal(t, big.NewInt(122), obs.NativePrice.Val) assert.NoError(t, obs.NativePrice.Err) })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `t.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, feedId, feedId` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `t.Run("when fails to fetch linkPrice or nativePrice", func(t *testing.T) { t.Cleanup(func() { fetcher.linkPriceErr = nil fetcher.nativePriceErr = nil }) fetcher.linkPriceErr = errors.New("some error fetching link price") fetcher.nativePriceErr = errors.New("some error fetching native price") obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Nil(t, obs.LinkPrice.Val) assert.EqualError(t, obs.LinkPrice.Err, "some error fetching link price") assert.Nil(t, obs.NativePrice.Val) assert.EqualError(t, obs.NativePrice.Err, "some error fetching native price") })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `t.Cleanup(func() { fetcher.linkPriceErr = nil fetcher.nativePriceErr = nil })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `fetcher.linkPriceErr = nil` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `fetcher.nativePriceErr = nil` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `fetcher.linkPriceErr = errors.New("some error fetching link price")` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `fetcher.nativePriceErr = errors.New("some error fetching native price")` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `t.Run("when succeeds to fetch linkPrice or nativePrice but got nil (new feed)", func(t *testing.T) { obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Equal(t, obs.LinkPrice.Val, v2.MissingPrice) assert.Nil(t, obs.LinkPrice.Err) assert.Equal(t, obs.NativePrice.Val, v2.MissingPrice) assert.Nil(t, obs.NativePrice.Err) })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.TestLogger(t)` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Run("when fetchMaxFinalizedTimestamp=true", func(t *testing.T) { t.Run("with latest report in database", func(t *testing.T) { orm.report = buildSampleV2Report() orm.err = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, int64(124), obs.MaxFinalizedTimestamp.Val) }) t.Run("if querying latest report fails", func(t *testing.T) { orm.report = nil orm.err = errors.New("something exploded") obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedTimestamp.Err, "something exploded") assert.Zero(t, obs.MaxFinalizedTimestamp.Val) }) t.Run("if codec fails to decode", func(t *testing.T) { orm.report = []byte{1, 2, 3} orm.err = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedTimestamp.Err, "failed to decode report: abi: cannot marshal in to go type: length insufficient 3 require 32") assert.Zero(t, obs.MaxFinalizedTimestamp.Val) }) orm.report = nil orm.err = nil t.Run("if LatestTimestamp returns error", func(t *testing.T) { fetcher.tsErr = errors.New("some error") obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedTimestamp.Err, "some error") assert.Zero(t, obs.MaxFinalizedTimestamp.Val) }) t.Run("if LatestTimestamp succeeds", func(t *testing.T) { fetcher.tsErr = nil fetcher.ts = 123 obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.Equal(t, int64(123), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) }) t.Run("if LatestTimestamp succeeds but ts=0 (new feed)", func(t *testing.T) { fetcher.tsErr = nil fetcher.ts = 0 obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Zero(t, obs.MaxFinalizedTimestamp.Val) }) t.Run("when run execution succeeded", func(t *testing.T) { t.Run("when feedId=linkFeedID=nativeFeedId", func(t *testing.T) { t.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId }) ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, feedId, feedId fetcher.ts = 123123 fetcher.tsErr = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.Equal(t, big.NewInt(122), obs.BenchmarkPrice.Val) assert.NoError(t, obs.BenchmarkPrice.Err) assert.Equal(t, int64(123123), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, big.NewInt(122), obs.LinkPrice.Val) assert.NoError(t, obs.LinkPrice.Err) assert.Equal(t, big.NewInt(122), obs.NativePrice.Val) assert.NoError(t, obs.NativePrice.Err) }) }) })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Run("with latest report in database", func(t *testing.T) { orm.report = buildSampleV2Report() orm.err = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, int64(124), obs.MaxFinalizedTimestamp.Val) })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Observe(ctx, repts, true)` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Run("if querying latest report fails", func(t *testing.T) { orm.report = nil orm.err = errors.New("something exploded") obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedTimestamp.Err, "something exploded") assert.Zero(t, obs.MaxFinalizedTimestamp.Val) })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.New("something exploded")` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Observe(ctx, repts, true)` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Run("if codec fails to decode", func(t *testing.T) { orm.report = []byte{1, 2, 3} orm.err = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedTimestamp.Err, "failed to decode report: abi: cannot marshal in to go type: length insufficient 3 require 32") assert.Zero(t, obs.MaxFinalizedTimestamp.Val) })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Observe(ctx, repts, true)` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Run("if LatestTimestamp returns error", func(t *testing.T) { fetcher.tsErr = errors.New("some error") obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedTimestamp.Err, "some error") assert.Zero(t, obs.MaxFinalizedTimestamp.Val) })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.New("some error")` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Observe(ctx, repts, true)` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Run("if LatestTimestamp succeeds", func(t *testing.T) { fetcher.tsErr = nil fetcher.ts = 123 obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.Equal(t, int64(123), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Observe(ctx, repts, true)` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Run("if LatestTimestamp succeeds but ts=0 (new feed)", func(t *testing.T) { fetcher.tsErr = nil fetcher.ts = 0 obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Zero(t, obs.MaxFinalizedTimestamp.Val) })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Observe(ctx, repts, true)` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Run("when run execution succeeded", func(t *testing.T) { t.Run("when feedId=linkFeedID=nativeFeedId", func(t *testing.T) { t.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId }) ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, feedId, feedId fetcher.ts = 123123 fetcher.tsErr = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.Equal(t, big.NewInt(122), obs.BenchmarkPrice.Val) assert.NoError(t, obs.BenchmarkPrice.Err) assert.Equal(t, int64(123123), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, big.NewInt(122), obs.LinkPrice.Val) assert.NoError(t, obs.LinkPrice.Err) assert.Equal(t, big.NewInt(122), obs.NativePrice.Val) assert.NoError(t, obs.NativePrice.Err) }) })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Run("when feedId=linkFeedID=nativeFeedId", func(t *testing.T) { t.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId }) ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, feedId, feedId fetcher.ts = 123123 fetcher.tsErr = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.Equal(t, big.NewInt(122), obs.BenchmarkPrice.Val) assert.NoError(t, obs.BenchmarkPrice.Err) assert.Equal(t, int64(123123), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, big.NewInt(122), obs.LinkPrice.Val) assert.NoError(t, obs.LinkPrice.Err) assert.Equal(t, big.NewInt(122), obs.NativePrice.Val) assert.NoError(t, obs.NativePrice.Err) })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Observe(ctx, repts, true)` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Run("when run execution fails, returns error", func(t *testing.T) { t.Cleanup(func() { ds.pipelineRunner = &mercurymocks.MockRunner{ Trrs: goodTrrs, Err: nil, } }) ds.pipelineRunner = &mercurymocks.MockRunner{ Trrs: goodTrrs, Err: errors.New("run execution failed"), } _, err := ds.Observe(ctx, repts, false) assert.EqualError(t, err, "Observe failed while executing run: error executing run for spec ID 0: run execution failed") })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Cleanup(func() { ds.pipelineRunner = &mercurymocks.MockRunner{ Trrs: goodTrrs, Err: nil, } })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.New("run execution failed")` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Observe(ctx, repts, false)` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Run("when parsing run results fails, return error", func(t *testing.T) { t.Cleanup(func() { runner := &mercurymocks.MockRunner{ Trrs: goodTrrs, Err: nil, } ds.pipelineRunner = runner }) badTrrs := []pipeline.TaskRunResult{ { // benchmark price Result: pipeline.Result{Error: errors.New("some error with bp")}, Task: &mercurymocks.MockTask{}, }, } ds.pipelineRunner = &mercurymocks.MockRunner{ Trrs: badTrrs, Err: nil, } _, err := ds.Observe(ctx, repts, false) assert.EqualError(t, err, "Observe failed while parsing run results: some error with bp") })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Cleanup(func() { runner := &mercurymocks.MockRunner{ Trrs: goodTrrs, Err: nil, } ds.pipelineRunner = runner })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.New("some error with bp")` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Observe(ctx, repts, false)` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Run("when run execution succeeded", func(t *testing.T) { t.Run("when feedId=linkFeedID=nativeFeedId", func(t *testing.T) { t.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId }) var feedId utils.FeedID = [32]byte{1} ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, feedId, feedId obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Equal(t, big.NewInt(122), obs.BenchmarkPrice.Val) assert.NoError(t, obs.BenchmarkPrice.Err) assert.Equal(t, int64(0), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, big.NewInt(122), obs.LinkPrice.Val) assert.NoError(t, obs.LinkPrice.Err) assert.Equal(t, big.NewInt(122), obs.NativePrice.Val) assert.NoError(t, obs.NativePrice.Err) }) t.Run("when fails to fetch linkPrice or nativePrice", func(t *testing.T) { t.Cleanup(func() { fetcher.linkPriceErr = nil fetcher.nativePriceErr = nil }) fetcher.linkPriceErr = errors.New("some error fetching link price") fetcher.nativePriceErr = errors.New("some error fetching native price") obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Nil(t, obs.LinkPrice.Val) assert.EqualError(t, obs.LinkPrice.Err, "some error fetching link price") assert.Nil(t, obs.NativePrice.Val) assert.EqualError(t, obs.NativePrice.Err, "some error fetching native price") }) t.Run("when succeeds to fetch linkPrice or nativePrice but got nil (new feed)", func(t *testing.T) { obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Equal(t, obs.LinkPrice.Val, v2.MissingPrice) assert.Nil(t, obs.LinkPrice.Err) assert.Equal(t, obs.NativePrice.Val, v2.MissingPrice) assert.Nil(t, obs.NativePrice.Err) }) })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Run("when feedId=linkFeedID=nativeFeedId", func(t *testing.T) { t.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId }) var feedId utils.FeedID = [32]byte{1} ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, feedId, feedId obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Equal(t, big.NewInt(122), obs.BenchmarkPrice.Val) assert.NoError(t, obs.BenchmarkPrice.Err) assert.Equal(t, int64(0), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, big.NewInt(122), obs.LinkPrice.Val) assert.NoError(t, obs.LinkPrice.Err) assert.Equal(t, big.NewInt(122), obs.NativePrice.Val) assert.NoError(t, obs.NativePrice.Err) })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Observe(ctx, repts, false)` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Run("when fails to fetch linkPrice or nativePrice", func(t *testing.T) { t.Cleanup(func() { fetcher.linkPriceErr = nil fetcher.nativePriceErr = nil }) fetcher.linkPriceErr = errors.New("some error fetching link price") fetcher.nativePriceErr = errors.New("some error fetching native price") obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Nil(t, obs.LinkPrice.Val) assert.EqualError(t, obs.LinkPrice.Err, "some error fetching link price") assert.Nil(t, obs.NativePrice.Val) assert.EqualError(t, obs.NativePrice.Err, "some error fetching native price") })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Cleanup(func() { fetcher.linkPriceErr = nil fetcher.nativePriceErr = nil })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.New("some error fetching link price")` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.New("some error fetching native price")` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Observe(ctx, repts, false)` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Run("when succeeds to fetch linkPrice or nativePrice but got nil (new feed)", func(t *testing.T) { obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Equal(t, obs.LinkPrice.Val, v2.MissingPrice) assert.Nil(t, obs.LinkPrice.Err) assert.Equal(t, obs.NativePrice.Val, v2.MissingPrice) assert.Nil(t, obs.NativePrice.Err) })` $DIR/core/services/relay/evm/mercury/v2/data_source_test.go: `.Observe(ctx, repts, false)` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `t.Run("BuildReport errors on zero values", func(t *testing.T) { _, err := r.BuildReport(v2.ReportFields{}) require.Error(t, err) assert.Contains(t, err.Error(), "benchmarkPrice may not be nil") assert.Contains(t, err.Error(), "linkFee may not be nil") assert.Contains(t, err.Error(), "nativeFee may not be nil") })` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `t.Run("BuildReport constructs a report from observations", func(t *testing.T) { rf := newValidReportFields() // only need to test happy path since validations are done in relaymercury report, err := r.BuildReport(rf) require.NoError(t, err) reportElems := make(map[string]interface{}) err = ReportTypes.UnpackIntoMap(reportElems, report) require.NoError(t, err) assert.Equal(t, int(reportElems["observationsTimestamp"].(uint32)), 242) assert.Equal(t, reportElems["benchmarkPrice"].(*big.Int).Int64(), int64(243)) assert.Equal(t, reportElems["validFromTimestamp"].(uint32), uint32(123)) assert.Equal(t, reportElems["expiresAt"].(uint32), uint32(20)) assert.Equal(t, reportElems["linkFee"].(*big.Int).Int64(), int64(456)) assert.Equal(t, reportElems["nativeFee"].(*big.Int).Int64(), int64(457)) assert.Equal(t, types.Report{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xc9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf3}, report) max, err := r.MaxReportLength(4) require.NoError(t, err) assert.LessOrEqual(t, len(report), max) t.Run("Decode decodes the report", func(t *testing.T) { decoded, err := r.Decode(report) require.NoError(t, err) require.NotNil(t, decoded) assert.Equal(t, uint32(242), decoded.ObservationsTimestamp) assert.Equal(t, big.NewInt(243), decoded.BenchmarkPrice) assert.Equal(t, uint32(123), decoded.ValidFromTimestamp) assert.Equal(t, uint32(20), decoded.ExpiresAt) assert.Equal(t, big.NewInt(456), decoded.LinkFee) assert.Equal(t, big.NewInt(457), decoded.NativeFee) }) })` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `err = ReportTypes.UnpackIntoMap(reportElems, report)` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `t.Run("Decode decodes the report", func(t *testing.T) { decoded, err := r.Decode(report) require.NoError(t, err) require.NotNil(t, decoded) assert.Equal(t, uint32(242), decoded.ObservationsTimestamp) assert.Equal(t, big.NewInt(243), decoded.BenchmarkPrice) assert.Equal(t, uint32(123), decoded.ValidFromTimestamp) assert.Equal(t, uint32(20), decoded.ExpiresAt) assert.Equal(t, big.NewInt(456), decoded.LinkFee) assert.Equal(t, big.NewInt(457), decoded.NativeFee) })` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `t.Run("errors on negative fee", func(t *testing.T) { rf := newValidReportFields() rf.LinkFee = big.NewInt(-1) rf.NativeFee = big.NewInt(-1) _, err := r.BuildReport(rf) require.Error(t, err) assert.Contains(t, err.Error(), "linkFee may not be negative (got: -1)") assert.Contains(t, err.Error(), "nativeFee may not be negative (got: -1)") })` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `rf.LinkFee = big.NewInt(-1)` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `rf.NativeFee = big.NewInt(-1)` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `longBad[i] = byte(i)` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `_, err = r.Decode(longBad)` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `t.Run("ObservationTimestampFromReport extracts observation timestamp from a valid report", func(t *testing.T) { report := buildSampleReport(123) ts, err := r.ObservationTimestampFromReport(report) require.NoError(t, err) assert.Equal(t, ts, uint32(123)) })` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `t.Run("BenchmarkPriceFromReport extracts the benchmark price from valid report", func(t *testing.T) { report := buildSampleReport(123) bp, err := r.BenchmarkPriceFromReport(report) require.NoError(t, err) assert.Equal(t, big.NewInt(242), bp) })` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `.Run("BuildReport errors on zero values", func(t *testing.T) { _, err := r.BuildReport(v2.ReportFields{}) require.Error(t, err) assert.Contains(t, err.Error(), "benchmarkPrice may not be nil") assert.Contains(t, err.Error(), "linkFee may not be nil") assert.Contains(t, err.Error(), "nativeFee may not be nil") })` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `.BuildReport(v2.ReportFields{})` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `.Run("BuildReport constructs a report from observations", func(t *testing.T) { rf := newValidReportFields() // only need to test happy path since validations are done in relaymercury report, err := r.BuildReport(rf) require.NoError(t, err) reportElems := make(map[string]interface{}) err = ReportTypes.UnpackIntoMap(reportElems, report) require.NoError(t, err) assert.Equal(t, int(reportElems["observationsTimestamp"].(uint32)), 242) assert.Equal(t, reportElems["benchmarkPrice"].(*big.Int).Int64(), int64(243)) assert.Equal(t, reportElems["validFromTimestamp"].(uint32), uint32(123)) assert.Equal(t, reportElems["expiresAt"].(uint32), uint32(20)) assert.Equal(t, reportElems["linkFee"].(*big.Int).Int64(), int64(456)) assert.Equal(t, reportElems["nativeFee"].(*big.Int).Int64(), int64(457)) assert.Equal(t, types.Report{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xc9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf3}, report) max, err := r.MaxReportLength(4) require.NoError(t, err) assert.LessOrEqual(t, len(report), max) t.Run("Decode decodes the report", func(t *testing.T) { decoded, err := r.Decode(report) require.NoError(t, err) require.NotNil(t, decoded) assert.Equal(t, uint32(242), decoded.ObservationsTimestamp) assert.Equal(t, big.NewInt(243), decoded.BenchmarkPrice) assert.Equal(t, uint32(123), decoded.ValidFromTimestamp) assert.Equal(t, uint32(20), decoded.ExpiresAt) assert.Equal(t, big.NewInt(456), decoded.LinkFee) assert.Equal(t, big.NewInt(457), decoded.NativeFee) }) })` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `.BuildReport(rf)` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `.UnpackIntoMap(reportElems, report)` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `.MaxReportLength(4)` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `.Run("Decode decodes the report", func(t *testing.T) { decoded, err := r.Decode(report) require.NoError(t, err) require.NotNil(t, decoded) assert.Equal(t, uint32(242), decoded.ObservationsTimestamp) assert.Equal(t, big.NewInt(243), decoded.BenchmarkPrice) assert.Equal(t, uint32(123), decoded.ValidFromTimestamp) assert.Equal(t, uint32(20), decoded.ExpiresAt) assert.Equal(t, big.NewInt(456), decoded.LinkFee) assert.Equal(t, big.NewInt(457), decoded.NativeFee) })` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `.Decode(report)` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `.Run("errors on negative fee", func(t *testing.T) { rf := newValidReportFields() rf.LinkFee = big.NewInt(-1) rf.NativeFee = big.NewInt(-1) _, err := r.BuildReport(rf) require.Error(t, err) assert.Contains(t, err.Error(), "linkFee may not be negative (got: -1)") assert.Contains(t, err.Error(), "nativeFee may not be negative (got: -1)") })` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `.NewInt(-1)` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `.NewInt(-1)` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `.BuildReport(rf)` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `.Decode([]byte{1, 2, 3})` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `.Decode(longBad)` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `.Run("ObservationTimestampFromReport extracts observation timestamp from a valid report", func(t *testing.T) { report := buildSampleReport(123) ts, err := r.ObservationTimestampFromReport(report) require.NoError(t, err) assert.Equal(t, ts, uint32(123)) })` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `.ObservationTimestampFromReport(report)` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `.ObservationTimestampFromReport(report)` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `.Run("BenchmarkPriceFromReport extracts the benchmark price from valid report", func(t *testing.T) { report := buildSampleReport(123) bp, err := r.BenchmarkPriceFromReport(report) require.NoError(t, err) assert.Equal(t, big.NewInt(242), bp) })` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `.BenchmarkPriceFromReport(report)` $DIR/core/services/relay/evm/mercury/v2/reportcodec/report_codec_test.go: `.BenchmarkPriceFromReport([]byte{1, 2, 3})` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `ds.fetcher = fetcher` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `ds.saver = saver` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `ds.pipelineRunner = &mercurymocks.MockRunner{ Trrs: goodTrrs, }` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `ds.spec = spec` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `t.Run("when fetchMaxFinalizedTimestamp=true", func(t *testing.T) { t.Run("with latest report in database", func(t *testing.T) { orm.report = buildSampleV3Report() orm.err = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, int64(124), obs.MaxFinalizedTimestamp.Val) }) t.Run("if querying latest report fails", func(t *testing.T) { orm.report = nil orm.err = errors.New("something exploded") obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedTimestamp.Err, "something exploded") assert.Zero(t, obs.MaxFinalizedTimestamp.Val) }) t.Run("if codec fails to decode", func(t *testing.T) { orm.report = []byte{1, 2, 3} orm.err = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedTimestamp.Err, "failed to decode report: abi: cannot marshal in to go type: length insufficient 3 require 32") assert.Zero(t, obs.MaxFinalizedTimestamp.Val) }) orm.report = nil orm.err = nil t.Run("if LatestTimestamp returns error", func(t *testing.T) { fetcher.tsErr = errors.New("some error") obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedTimestamp.Err, "some error") assert.Zero(t, obs.MaxFinalizedTimestamp.Val) }) t.Run("if LatestTimestamp succeeds", func(t *testing.T) { fetcher.tsErr = nil fetcher.ts = 123 obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.Equal(t, int64(123), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) }) t.Run("if LatestTimestamp succeeds but ts=0 (new feed)", func(t *testing.T) { fetcher.tsErr = nil fetcher.ts = 0 obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Zero(t, obs.MaxFinalizedTimestamp.Val) }) t.Run("when run execution succeeded", func(t *testing.T) { t.Run("when feedId=linkFeedID=nativeFeedId", func(t *testing.T) { t.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId }) ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, feedId, feedId fetcher.ts = 123123 fetcher.tsErr = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.Equal(t, big.NewInt(122), obs.BenchmarkPrice.Val) assert.NoError(t, obs.BenchmarkPrice.Err) assert.Equal(t, big.NewInt(121), obs.Bid.Val) assert.NoError(t, obs.Bid.Err) assert.Equal(t, big.NewInt(123), obs.Ask.Val) assert.NoError(t, obs.Ask.Err) assert.Equal(t, int64(123123), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, big.NewInt(122), obs.LinkPrice.Val) assert.NoError(t, obs.LinkPrice.Err) assert.Equal(t, big.NewInt(122), obs.NativePrice.Val) assert.NoError(t, obs.NativePrice.Err) }) }) })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `t.Run("with latest report in database", func(t *testing.T) { orm.report = buildSampleV3Report() orm.err = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, int64(124), obs.MaxFinalizedTimestamp.Val) })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `orm.report = buildSampleV3Report()` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `orm.err = nil` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `t.Run("if querying latest report fails", func(t *testing.T) { orm.report = nil orm.err = errors.New("something exploded") obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedTimestamp.Err, "something exploded") assert.Zero(t, obs.MaxFinalizedTimestamp.Val) })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `orm.report = nil` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `orm.err = errors.New("something exploded")` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `t.Run("if codec fails to decode", func(t *testing.T) { orm.report = []byte{1, 2, 3} orm.err = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedTimestamp.Err, "failed to decode report: abi: cannot marshal in to go type: length insufficient 3 require 32") assert.Zero(t, obs.MaxFinalizedTimestamp.Val) })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `orm.report = []byte{1, 2, 3}` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `orm.err = nil` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `orm.report = nil` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `orm.err = nil` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `t.Run("if LatestTimestamp returns error", func(t *testing.T) { fetcher.tsErr = errors.New("some error") obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedTimestamp.Err, "some error") assert.Zero(t, obs.MaxFinalizedTimestamp.Val) })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `fetcher.tsErr = errors.New("some error")` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `t.Run("if LatestTimestamp succeeds", func(t *testing.T) { fetcher.tsErr = nil fetcher.ts = 123 obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.Equal(t, int64(123), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `fetcher.tsErr = nil` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `fetcher.ts = 123` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `t.Run("if LatestTimestamp succeeds but ts=0 (new feed)", func(t *testing.T) { fetcher.tsErr = nil fetcher.ts = 0 obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Zero(t, obs.MaxFinalizedTimestamp.Val) })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `fetcher.tsErr = nil` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `fetcher.ts = 0` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `t.Run("when run execution succeeded", func(t *testing.T) { t.Run("when feedId=linkFeedID=nativeFeedId", func(t *testing.T) { t.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId }) ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, feedId, feedId fetcher.ts = 123123 fetcher.tsErr = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.Equal(t, big.NewInt(122), obs.BenchmarkPrice.Val) assert.NoError(t, obs.BenchmarkPrice.Err) assert.Equal(t, big.NewInt(121), obs.Bid.Val) assert.NoError(t, obs.Bid.Err) assert.Equal(t, big.NewInt(123), obs.Ask.Val) assert.NoError(t, obs.Ask.Err) assert.Equal(t, int64(123123), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, big.NewInt(122), obs.LinkPrice.Val) assert.NoError(t, obs.LinkPrice.Err) assert.Equal(t, big.NewInt(122), obs.NativePrice.Val) assert.NoError(t, obs.NativePrice.Err) }) })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `t.Run("when feedId=linkFeedID=nativeFeedId", func(t *testing.T) { t.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId }) ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, feedId, feedId fetcher.ts = 123123 fetcher.tsErr = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.Equal(t, big.NewInt(122), obs.BenchmarkPrice.Val) assert.NoError(t, obs.BenchmarkPrice.Err) assert.Equal(t, big.NewInt(121), obs.Bid.Val) assert.NoError(t, obs.Bid.Err) assert.Equal(t, big.NewInt(123), obs.Ask.Val) assert.NoError(t, obs.Ask.Err) assert.Equal(t, int64(123123), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, big.NewInt(122), obs.LinkPrice.Val) assert.NoError(t, obs.LinkPrice.Err) assert.Equal(t, big.NewInt(122), obs.NativePrice.Val) assert.NoError(t, obs.NativePrice.Err) })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `t.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, feedId, feedId` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `fetcher.ts = 123123` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `fetcher.tsErr = nil` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `t.Run("when run execution fails, returns error", func(t *testing.T) { t.Cleanup(func() { ds.pipelineRunner = &mercurymocks.MockRunner{ Trrs: goodTrrs, Err: nil, } }) ds.pipelineRunner = &mercurymocks.MockRunner{ Trrs: goodTrrs, Err: errors.New("run execution failed"), } _, err := ds.Observe(ctx, repts, false) assert.EqualError(t, err, "Observe failed while executing run: error executing run for spec ID 0: run execution failed") })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `t.Cleanup(func() { ds.pipelineRunner = &mercurymocks.MockRunner{ Trrs: goodTrrs, Err: nil, } })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `ds.pipelineRunner = &mercurymocks.MockRunner{ Trrs: goodTrrs, Err: nil, }` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `ds.pipelineRunner = &mercurymocks.MockRunner{ Trrs: goodTrrs, Err: errors.New("run execution failed"), }` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `t.Run("when parsing run results fails, return error", func(t *testing.T) { t.Cleanup(func() { runner := &mercurymocks.MockRunner{ Trrs: goodTrrs, Err: nil, } ds.pipelineRunner = runner }) badTrrs := []pipeline.TaskRunResult{ { // benchmark price Result: pipeline.Result{Value: "122.345"}, Task: &mercurymocks.MockTask{}, }, { // bid Result: pipeline.Result{Value: "121.993"}, Task: &mercurymocks.MockTask{}, }, { // ask Result: pipeline.Result{Error: errors.New("some error with ask")}, Task: &mercurymocks.MockTask{}, }, } ds.pipelineRunner = &mercurymocks.MockRunner{ Trrs: badTrrs, Err: nil, } _, err := ds.Observe(ctx, repts, false) assert.EqualError(t, err, "Observe failed while parsing run results: some error with ask") })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `t.Cleanup(func() { runner := &mercurymocks.MockRunner{ Trrs: goodTrrs, Err: nil, } ds.pipelineRunner = runner })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `ds.pipelineRunner = runner` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `ds.pipelineRunner = &mercurymocks.MockRunner{ Trrs: badTrrs, Err: nil, }` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `t.Run("when run execution succeeded", func(t *testing.T) { t.Run("when feedId=linkFeedID=nativeFeedId", func(t *testing.T) { t.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId }) var feedId utils.FeedID = [32]byte{1} ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, feedId, feedId obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Equal(t, big.NewInt(122), obs.BenchmarkPrice.Val) assert.NoError(t, obs.BenchmarkPrice.Err) assert.Equal(t, big.NewInt(121), obs.Bid.Val) assert.NoError(t, obs.Bid.Err) assert.Equal(t, big.NewInt(123), obs.Ask.Val) assert.NoError(t, obs.Ask.Err) assert.Equal(t, int64(0), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, big.NewInt(122), obs.LinkPrice.Val) assert.NoError(t, obs.LinkPrice.Err) assert.Equal(t, big.NewInt(122), obs.NativePrice.Val) assert.NoError(t, obs.NativePrice.Err) }) t.Run("when fails to fetch linkPrice or nativePrice", func(t *testing.T) { t.Cleanup(func() { fetcher.linkPriceErr = nil fetcher.nativePriceErr = nil }) fetcher.linkPriceErr = errors.New("some error fetching link price") fetcher.nativePriceErr = errors.New("some error fetching native price") obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Nil(t, obs.LinkPrice.Val) assert.EqualError(t, obs.LinkPrice.Err, "some error fetching link price") assert.Nil(t, obs.NativePrice.Val) assert.EqualError(t, obs.NativePrice.Err, "some error fetching native price") }) t.Run("when succeeds to fetch linkPrice or nativePrice but got nil (new feed)", func(t *testing.T) { obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Equal(t, obs.LinkPrice.Val, relaymercuryv3.MissingPrice) assert.Nil(t, obs.LinkPrice.Err) assert.Equal(t, obs.NativePrice.Val, relaymercuryv3.MissingPrice) assert.Nil(t, obs.NativePrice.Err) }) })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `t.Run("when feedId=linkFeedID=nativeFeedId", func(t *testing.T) { t.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId }) var feedId utils.FeedID = [32]byte{1} ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, feedId, feedId obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Equal(t, big.NewInt(122), obs.BenchmarkPrice.Val) assert.NoError(t, obs.BenchmarkPrice.Err) assert.Equal(t, big.NewInt(121), obs.Bid.Val) assert.NoError(t, obs.Bid.Err) assert.Equal(t, big.NewInt(123), obs.Ask.Val) assert.NoError(t, obs.Ask.Err) assert.Equal(t, int64(0), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, big.NewInt(122), obs.LinkPrice.Val) assert.NoError(t, obs.LinkPrice.Err) assert.Equal(t, big.NewInt(122), obs.NativePrice.Val) assert.NoError(t, obs.NativePrice.Err) })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `t.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, feedId, feedId` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `t.Run("when fails to fetch linkPrice or nativePrice", func(t *testing.T) { t.Cleanup(func() { fetcher.linkPriceErr = nil fetcher.nativePriceErr = nil }) fetcher.linkPriceErr = errors.New("some error fetching link price") fetcher.nativePriceErr = errors.New("some error fetching native price") obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Nil(t, obs.LinkPrice.Val) assert.EqualError(t, obs.LinkPrice.Err, "some error fetching link price") assert.Nil(t, obs.NativePrice.Val) assert.EqualError(t, obs.NativePrice.Err, "some error fetching native price") })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `t.Cleanup(func() { fetcher.linkPriceErr = nil fetcher.nativePriceErr = nil })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `fetcher.linkPriceErr = nil` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `fetcher.nativePriceErr = nil` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `fetcher.linkPriceErr = errors.New("some error fetching link price")` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `fetcher.nativePriceErr = errors.New("some error fetching native price")` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `t.Run("when succeeds to fetch linkPrice or nativePrice but got nil (new feed)", func(t *testing.T) { obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Equal(t, obs.LinkPrice.Val, relaymercuryv3.MissingPrice) assert.Nil(t, obs.LinkPrice.Err) assert.Equal(t, obs.NativePrice.Val, relaymercuryv3.MissingPrice) assert.Nil(t, obs.NativePrice.Err) })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.TestLogger(t)` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Run("when fetchMaxFinalizedTimestamp=true", func(t *testing.T) { t.Run("with latest report in database", func(t *testing.T) { orm.report = buildSampleV3Report() orm.err = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, int64(124), obs.MaxFinalizedTimestamp.Val) }) t.Run("if querying latest report fails", func(t *testing.T) { orm.report = nil orm.err = errors.New("something exploded") obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedTimestamp.Err, "something exploded") assert.Zero(t, obs.MaxFinalizedTimestamp.Val) }) t.Run("if codec fails to decode", func(t *testing.T) { orm.report = []byte{1, 2, 3} orm.err = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedTimestamp.Err, "failed to decode report: abi: cannot marshal in to go type: length insufficient 3 require 32") assert.Zero(t, obs.MaxFinalizedTimestamp.Val) }) orm.report = nil orm.err = nil t.Run("if LatestTimestamp returns error", func(t *testing.T) { fetcher.tsErr = errors.New("some error") obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedTimestamp.Err, "some error") assert.Zero(t, obs.MaxFinalizedTimestamp.Val) }) t.Run("if LatestTimestamp succeeds", func(t *testing.T) { fetcher.tsErr = nil fetcher.ts = 123 obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.Equal(t, int64(123), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) }) t.Run("if LatestTimestamp succeeds but ts=0 (new feed)", func(t *testing.T) { fetcher.tsErr = nil fetcher.ts = 0 obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Zero(t, obs.MaxFinalizedTimestamp.Val) }) t.Run("when run execution succeeded", func(t *testing.T) { t.Run("when feedId=linkFeedID=nativeFeedId", func(t *testing.T) { t.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId }) ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, feedId, feedId fetcher.ts = 123123 fetcher.tsErr = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.Equal(t, big.NewInt(122), obs.BenchmarkPrice.Val) assert.NoError(t, obs.BenchmarkPrice.Err) assert.Equal(t, big.NewInt(121), obs.Bid.Val) assert.NoError(t, obs.Bid.Err) assert.Equal(t, big.NewInt(123), obs.Ask.Val) assert.NoError(t, obs.Ask.Err) assert.Equal(t, int64(123123), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, big.NewInt(122), obs.LinkPrice.Val) assert.NoError(t, obs.LinkPrice.Err) assert.Equal(t, big.NewInt(122), obs.NativePrice.Val) assert.NoError(t, obs.NativePrice.Err) }) }) })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Run("with latest report in database", func(t *testing.T) { orm.report = buildSampleV3Report() orm.err = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, int64(124), obs.MaxFinalizedTimestamp.Val) })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Observe(ctx, repts, true)` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Run("if querying latest report fails", func(t *testing.T) { orm.report = nil orm.err = errors.New("something exploded") obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedTimestamp.Err, "something exploded") assert.Zero(t, obs.MaxFinalizedTimestamp.Val) })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.New("something exploded")` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Observe(ctx, repts, true)` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Run("if codec fails to decode", func(t *testing.T) { orm.report = []byte{1, 2, 3} orm.err = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedTimestamp.Err, "failed to decode report: abi: cannot marshal in to go type: length insufficient 3 require 32") assert.Zero(t, obs.MaxFinalizedTimestamp.Val) })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Observe(ctx, repts, true)` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Run("if LatestTimestamp returns error", func(t *testing.T) { fetcher.tsErr = errors.New("some error") obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.EqualError(t, obs.MaxFinalizedTimestamp.Err, "some error") assert.Zero(t, obs.MaxFinalizedTimestamp.Val) })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.New("some error")` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Observe(ctx, repts, true)` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Run("if LatestTimestamp succeeds", func(t *testing.T) { fetcher.tsErr = nil fetcher.ts = 123 obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.Equal(t, int64(123), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Observe(ctx, repts, true)` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Run("if LatestTimestamp succeeds but ts=0 (new feed)", func(t *testing.T) { fetcher.tsErr = nil fetcher.ts = 0 obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Zero(t, obs.MaxFinalizedTimestamp.Val) })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Observe(ctx, repts, true)` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Run("when run execution succeeded", func(t *testing.T) { t.Run("when feedId=linkFeedID=nativeFeedId", func(t *testing.T) { t.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId }) ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, feedId, feedId fetcher.ts = 123123 fetcher.tsErr = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.Equal(t, big.NewInt(122), obs.BenchmarkPrice.Val) assert.NoError(t, obs.BenchmarkPrice.Err) assert.Equal(t, big.NewInt(121), obs.Bid.Val) assert.NoError(t, obs.Bid.Err) assert.Equal(t, big.NewInt(123), obs.Ask.Val) assert.NoError(t, obs.Ask.Err) assert.Equal(t, int64(123123), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, big.NewInt(122), obs.LinkPrice.Val) assert.NoError(t, obs.LinkPrice.Err) assert.Equal(t, big.NewInt(122), obs.NativePrice.Val) assert.NoError(t, obs.NativePrice.Err) }) })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Run("when feedId=linkFeedID=nativeFeedId", func(t *testing.T) { t.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId }) ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, feedId, feedId fetcher.ts = 123123 fetcher.tsErr = nil obs, err := ds.Observe(ctx, repts, true) assert.NoError(t, err) assert.Equal(t, big.NewInt(122), obs.BenchmarkPrice.Val) assert.NoError(t, obs.BenchmarkPrice.Err) assert.Equal(t, big.NewInt(121), obs.Bid.Val) assert.NoError(t, obs.Bid.Err) assert.Equal(t, big.NewInt(123), obs.Ask.Val) assert.NoError(t, obs.Ask.Err) assert.Equal(t, int64(123123), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, big.NewInt(122), obs.LinkPrice.Val) assert.NoError(t, obs.LinkPrice.Err) assert.Equal(t, big.NewInt(122), obs.NativePrice.Val) assert.NoError(t, obs.NativePrice.Err) })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Observe(ctx, repts, true)` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Run("when run execution fails, returns error", func(t *testing.T) { t.Cleanup(func() { ds.pipelineRunner = &mercurymocks.MockRunner{ Trrs: goodTrrs, Err: nil, } }) ds.pipelineRunner = &mercurymocks.MockRunner{ Trrs: goodTrrs, Err: errors.New("run execution failed"), } _, err := ds.Observe(ctx, repts, false) assert.EqualError(t, err, "Observe failed while executing run: error executing run for spec ID 0: run execution failed") })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Cleanup(func() { ds.pipelineRunner = &mercurymocks.MockRunner{ Trrs: goodTrrs, Err: nil, } })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.New("run execution failed")` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Observe(ctx, repts, false)` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Run("when parsing run results fails, return error", func(t *testing.T) { t.Cleanup(func() { runner := &mercurymocks.MockRunner{ Trrs: goodTrrs, Err: nil, } ds.pipelineRunner = runner }) badTrrs := []pipeline.TaskRunResult{ { // benchmark price Result: pipeline.Result{Value: "122.345"}, Task: &mercurymocks.MockTask{}, }, { // bid Result: pipeline.Result{Value: "121.993"}, Task: &mercurymocks.MockTask{}, }, { // ask Result: pipeline.Result{Error: errors.New("some error with ask")}, Task: &mercurymocks.MockTask{}, }, } ds.pipelineRunner = &mercurymocks.MockRunner{ Trrs: badTrrs, Err: nil, } _, err := ds.Observe(ctx, repts, false) assert.EqualError(t, err, "Observe failed while parsing run results: some error with ask") })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Cleanup(func() { runner := &mercurymocks.MockRunner{ Trrs: goodTrrs, Err: nil, } ds.pipelineRunner = runner })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.New("some error with ask")` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Observe(ctx, repts, false)` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Run("when run execution succeeded", func(t *testing.T) { t.Run("when feedId=linkFeedID=nativeFeedId", func(t *testing.T) { t.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId }) var feedId utils.FeedID = [32]byte{1} ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, feedId, feedId obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Equal(t, big.NewInt(122), obs.BenchmarkPrice.Val) assert.NoError(t, obs.BenchmarkPrice.Err) assert.Equal(t, big.NewInt(121), obs.Bid.Val) assert.NoError(t, obs.Bid.Err) assert.Equal(t, big.NewInt(123), obs.Ask.Val) assert.NoError(t, obs.Ask.Err) assert.Equal(t, int64(0), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, big.NewInt(122), obs.LinkPrice.Val) assert.NoError(t, obs.LinkPrice.Err) assert.Equal(t, big.NewInt(122), obs.NativePrice.Val) assert.NoError(t, obs.NativePrice.Err) }) t.Run("when fails to fetch linkPrice or nativePrice", func(t *testing.T) { t.Cleanup(func() { fetcher.linkPriceErr = nil fetcher.nativePriceErr = nil }) fetcher.linkPriceErr = errors.New("some error fetching link price") fetcher.nativePriceErr = errors.New("some error fetching native price") obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Nil(t, obs.LinkPrice.Val) assert.EqualError(t, obs.LinkPrice.Err, "some error fetching link price") assert.Nil(t, obs.NativePrice.Val) assert.EqualError(t, obs.NativePrice.Err, "some error fetching native price") }) t.Run("when succeeds to fetch linkPrice or nativePrice but got nil (new feed)", func(t *testing.T) { obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Equal(t, obs.LinkPrice.Val, relaymercuryv3.MissingPrice) assert.Nil(t, obs.LinkPrice.Err) assert.Equal(t, obs.NativePrice.Val, relaymercuryv3.MissingPrice) assert.Nil(t, obs.NativePrice.Err) }) })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Run("when feedId=linkFeedID=nativeFeedId", func(t *testing.T) { t.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId }) var feedId utils.FeedID = [32]byte{1} ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, feedId, feedId obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Equal(t, big.NewInt(122), obs.BenchmarkPrice.Val) assert.NoError(t, obs.BenchmarkPrice.Err) assert.Equal(t, big.NewInt(121), obs.Bid.Val) assert.NoError(t, obs.Bid.Err) assert.Equal(t, big.NewInt(123), obs.Ask.Val) assert.NoError(t, obs.Ask.Err) assert.Equal(t, int64(0), obs.MaxFinalizedTimestamp.Val) assert.NoError(t, obs.MaxFinalizedTimestamp.Err) assert.Equal(t, big.NewInt(122), obs.LinkPrice.Val) assert.NoError(t, obs.LinkPrice.Err) assert.Equal(t, big.NewInt(122), obs.NativePrice.Val) assert.NoError(t, obs.NativePrice.Err) })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Cleanup(func() { ds.feedID, ds.linkFeedID, ds.nativeFeedID = feedId, linkFeedId, nativeFeedId })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Observe(ctx, repts, false)` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Run("when fails to fetch linkPrice or nativePrice", func(t *testing.T) { t.Cleanup(func() { fetcher.linkPriceErr = nil fetcher.nativePriceErr = nil }) fetcher.linkPriceErr = errors.New("some error fetching link price") fetcher.nativePriceErr = errors.New("some error fetching native price") obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Nil(t, obs.LinkPrice.Val) assert.EqualError(t, obs.LinkPrice.Err, "some error fetching link price") assert.Nil(t, obs.NativePrice.Val) assert.EqualError(t, obs.NativePrice.Err, "some error fetching native price") })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Cleanup(func() { fetcher.linkPriceErr = nil fetcher.nativePriceErr = nil })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.New("some error fetching link price")` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.New("some error fetching native price")` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Observe(ctx, repts, false)` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Run("when succeeds to fetch linkPrice or nativePrice but got nil (new feed)", func(t *testing.T) { obs, err := ds.Observe(ctx, repts, false) assert.NoError(t, err) assert.Equal(t, obs.LinkPrice.Val, relaymercuryv3.MissingPrice) assert.Nil(t, obs.LinkPrice.Err) assert.Equal(t, obs.NativePrice.Val, relaymercuryv3.MissingPrice) assert.Nil(t, obs.NativePrice.Err) })` $DIR/core/services/relay/evm/mercury/v3/data_source_test.go: `.Observe(ctx, repts, false)` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `t.Run("BuildReport errors on zero values", func(t *testing.T) { _, err := r.BuildReport(v3.ReportFields{}) require.Error(t, err) assert.Contains(t, err.Error(), "benchmarkPrice may not be nil") assert.Contains(t, err.Error(), "linkFee may not be nil") assert.Contains(t, err.Error(), "nativeFee may not be nil") })` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `t.Run("BuildReport constructs a report from observations", func(t *testing.T) { rf := newValidReportFields() // only need to test happy path since validations are done in relaymercury report, err := r.BuildReport(rf) require.NoError(t, err) reportElems := make(map[string]interface{}) err = ReportTypes.UnpackIntoMap(reportElems, report) require.NoError(t, err) assert.Equal(t, int(reportElems["observationsTimestamp"].(uint32)), 242) assert.Equal(t, reportElems["benchmarkPrice"].(*big.Int).Int64(), int64(243)) assert.Equal(t, reportElems["bid"].(*big.Int).Int64(), int64(244)) assert.Equal(t, reportElems["ask"].(*big.Int).Int64(), int64(245)) assert.Equal(t, reportElems["validFromTimestamp"].(uint32), uint32(123)) assert.Equal(t, reportElems["expiresAt"].(uint32), uint32(20)) assert.Equal(t, reportElems["linkFee"].(*big.Int).Int64(), int64(456)) assert.Equal(t, reportElems["nativeFee"].(*big.Int).Int64(), int64(457)) assert.Equal(t, types.Report{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xc9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf5}, report) max, err := r.MaxReportLength(4) require.NoError(t, err) assert.LessOrEqual(t, len(report), max) t.Run("Decode decodes the report", func(t *testing.T) { decoded, err := r.Decode(report) require.NoError(t, err) require.NotNil(t, decoded) assert.Equal(t, uint32(242), decoded.ObservationsTimestamp) assert.Equal(t, big.NewInt(243), decoded.BenchmarkPrice) assert.Equal(t, big.NewInt(244), decoded.Bid) assert.Equal(t, big.NewInt(245), decoded.Ask) assert.Equal(t, uint32(123), decoded.ValidFromTimestamp) assert.Equal(t, uint32(20), decoded.ExpiresAt) assert.Equal(t, big.NewInt(456), decoded.LinkFee) assert.Equal(t, big.NewInt(457), decoded.NativeFee) }) })` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `err = ReportTypes.UnpackIntoMap(reportElems, report)` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `t.Run("Decode decodes the report", func(t *testing.T) { decoded, err := r.Decode(report) require.NoError(t, err) require.NotNil(t, decoded) assert.Equal(t, uint32(242), decoded.ObservationsTimestamp) assert.Equal(t, big.NewInt(243), decoded.BenchmarkPrice) assert.Equal(t, big.NewInt(244), decoded.Bid) assert.Equal(t, big.NewInt(245), decoded.Ask) assert.Equal(t, uint32(123), decoded.ValidFromTimestamp) assert.Equal(t, uint32(20), decoded.ExpiresAt) assert.Equal(t, big.NewInt(456), decoded.LinkFee) assert.Equal(t, big.NewInt(457), decoded.NativeFee) })` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `t.Run("errors on negative fee", func(t *testing.T) { rf := newValidReportFields() rf.LinkFee = big.NewInt(-1) rf.NativeFee = big.NewInt(-1) _, err := r.BuildReport(rf) require.Error(t, err) assert.Contains(t, err.Error(), "linkFee may not be negative (got: -1)") assert.Contains(t, err.Error(), "nativeFee may not be negative (got: -1)") })` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `rf.LinkFee = big.NewInt(-1)` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `rf.NativeFee = big.NewInt(-1)` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `longBad[i] = byte(i)` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `_, err = r.Decode(longBad)` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `t.Run("ObservationTimestampFromReport extracts observation timestamp from a valid report", func(t *testing.T) { report := buildSampleReport(123) ts, err := r.ObservationTimestampFromReport(report) require.NoError(t, err) assert.Equal(t, ts, uint32(123)) })` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `t.Run("BenchmarkPriceFromReport extracts the benchmark price from valid report", func(t *testing.T) { report := buildSampleReport(123) bp, err := r.BenchmarkPriceFromReport(report) require.NoError(t, err) assert.Equal(t, big.NewInt(242), bp) })` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `.Run("BuildReport errors on zero values", func(t *testing.T) { _, err := r.BuildReport(v3.ReportFields{}) require.Error(t, err) assert.Contains(t, err.Error(), "benchmarkPrice may not be nil") assert.Contains(t, err.Error(), "linkFee may not be nil") assert.Contains(t, err.Error(), "nativeFee may not be nil") })` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `.BuildReport(v3.ReportFields{})` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `.Run("BuildReport constructs a report from observations", func(t *testing.T) { rf := newValidReportFields() // only need to test happy path since validations are done in relaymercury report, err := r.BuildReport(rf) require.NoError(t, err) reportElems := make(map[string]interface{}) err = ReportTypes.UnpackIntoMap(reportElems, report) require.NoError(t, err) assert.Equal(t, int(reportElems["observationsTimestamp"].(uint32)), 242) assert.Equal(t, reportElems["benchmarkPrice"].(*big.Int).Int64(), int64(243)) assert.Equal(t, reportElems["bid"].(*big.Int).Int64(), int64(244)) assert.Equal(t, reportElems["ask"].(*big.Int).Int64(), int64(245)) assert.Equal(t, reportElems["validFromTimestamp"].(uint32), uint32(123)) assert.Equal(t, reportElems["expiresAt"].(uint32), uint32(20)) assert.Equal(t, reportElems["linkFee"].(*big.Int).Int64(), int64(456)) assert.Equal(t, reportElems["nativeFee"].(*big.Int).Int64(), int64(457)) assert.Equal(t, types.Report{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xc9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf5}, report) max, err := r.MaxReportLength(4) require.NoError(t, err) assert.LessOrEqual(t, len(report), max) t.Run("Decode decodes the report", func(t *testing.T) { decoded, err := r.Decode(report) require.NoError(t, err) require.NotNil(t, decoded) assert.Equal(t, uint32(242), decoded.ObservationsTimestamp) assert.Equal(t, big.NewInt(243), decoded.BenchmarkPrice) assert.Equal(t, big.NewInt(244), decoded.Bid) assert.Equal(t, big.NewInt(245), decoded.Ask) assert.Equal(t, uint32(123), decoded.ValidFromTimestamp) assert.Equal(t, uint32(20), decoded.ExpiresAt) assert.Equal(t, big.NewInt(456), decoded.LinkFee) assert.Equal(t, big.NewInt(457), decoded.NativeFee) }) })` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `.BuildReport(rf)` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `.UnpackIntoMap(reportElems, report)` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `.MaxReportLength(4)` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `.Run("Decode decodes the report", func(t *testing.T) { decoded, err := r.Decode(report) require.NoError(t, err) require.NotNil(t, decoded) assert.Equal(t, uint32(242), decoded.ObservationsTimestamp) assert.Equal(t, big.NewInt(243), decoded.BenchmarkPrice) assert.Equal(t, big.NewInt(244), decoded.Bid) assert.Equal(t, big.NewInt(245), decoded.Ask) assert.Equal(t, uint32(123), decoded.ValidFromTimestamp) assert.Equal(t, uint32(20), decoded.ExpiresAt) assert.Equal(t, big.NewInt(456), decoded.LinkFee) assert.Equal(t, big.NewInt(457), decoded.NativeFee) })` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `.Decode(report)` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `.Run("errors on negative fee", func(t *testing.T) { rf := newValidReportFields() rf.LinkFee = big.NewInt(-1) rf.NativeFee = big.NewInt(-1) _, err := r.BuildReport(rf) require.Error(t, err) assert.Contains(t, err.Error(), "linkFee may not be negative (got: -1)") assert.Contains(t, err.Error(), "nativeFee may not be negative (got: -1)") })` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `.NewInt(-1)` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `.NewInt(-1)` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `.BuildReport(rf)` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `.Decode([]byte{1, 2, 3})` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `.Decode(longBad)` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `.Run("ObservationTimestampFromReport extracts observation timestamp from a valid report", func(t *testing.T) { report := buildSampleReport(123) ts, err := r.ObservationTimestampFromReport(report) require.NoError(t, err) assert.Equal(t, ts, uint32(123)) })` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `.ObservationTimestampFromReport(report)` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `.ObservationTimestampFromReport(report)` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `.Run("BenchmarkPriceFromReport extracts the benchmark price from valid report", func(t *testing.T) { report := buildSampleReport(123) bp, err := r.BenchmarkPriceFromReport(report) require.NoError(t, err) assert.Equal(t, big.NewInt(242), bp) })` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `.BenchmarkPriceFromReport(report)` $DIR/core/services/relay/evm/mercury/v3/reportcodec/report_codec_test.go: `.BenchmarkPriceFromReport([]byte{1, 2, 3})` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_set_test.go: `servicetest.Run(t, cs)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_set_test.go: `t.Run("with caching disabled, returns nil, nil", func(t *testing.T) { assert.Len(t, disabledCs.caches, 0) f, err = disabledCs.Get(ctx, c) require.NoError(t, err) assert.Nil(t, f) assert.Len(t, disabledCs.caches, 0) })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_set_test.go: `f, err = disabledCs.Get(ctx, c)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_set_test.go: `t.Run("with virgin cacheset, makes new entry and returns it", func(t *testing.T) { assert.Len(t, cs.caches, 0) f, err = cs.Get(ctx, c) require.NoError(t, err) assert.IsType(t, f, &memCache{}) assert.Len(t, cs.caches, 1) })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_set_test.go: `f, err = cs.Get(ctx, c)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_set_test.go: `t.Run("with existing cache for value, returns that", func(t *testing.T) { var f2 Fetcher assert.Len(t, cs.caches, 1) f2, err = cs.Get(ctx, c) require.NoError(t, err) assert.IsType(t, f, &memCache{}) assert.Equal(t, f, f2) assert.Len(t, cs.caches, 1) })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_set_test.go: `f2, err = cs.Get(ctx, c)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_set_test.go: `.TestLogger(t)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_set_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_set_test.go: `.Run(t, cs)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_set_test.go: `.Run("with caching disabled, returns nil, nil", func(t *testing.T) { assert.Len(t, disabledCs.caches, 0) f, err = disabledCs.Get(ctx, c) require.NoError(t, err) assert.Nil(t, f) assert.Len(t, disabledCs.caches, 0) })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_set_test.go: `.Get(ctx, c)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_set_test.go: `.Run("with virgin cacheset, makes new entry and returns it", func(t *testing.T) { assert.Len(t, cs.caches, 0) f, err = cs.Get(ctx, c) require.NoError(t, err) assert.IsType(t, f, &memCache{}) assert.Len(t, cs.caches, 1) })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_set_test.go: `.Get(ctx, c)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_set_test.go: `.Run("with existing cache for value, returns that", func(t *testing.T) { var f2 Fetcher assert.Len(t, cs.caches, 1) f2, err = cs.Get(ctx, c) require.NoError(t, err) assert.IsType(t, f, &memCache{}) assert.Equal(t, f, f2) assert.Len(t, cs.caches, 1) })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_set_test.go: `.Get(ctx, c)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `t.Run("errors with nil req", func(t *testing.T) { c := newMemCache(lggr, client, cfg) _, err := c.LatestReport(ctx, nil) assert.EqualError(t, err, "req must not be nil") })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `t.Run("with LatestReportTTL=0 does no caching", func(t *testing.T) { c := newMemCache(lggr, client, cfg) req := &pb.LatestReportRequest{} for i := 0; i < 5; i++ { client.resp = &pb.LatestReportResponse{Report: &pb.Report{Price: []byte(strconv.Itoa(i))}} resp, err := c.LatestReport(ctx, req) require.NoError(t, err) assert.Equal(t, client.resp, resp) } client.resp = nil client.err = errors.New("something exploded") resp, err := c.LatestReport(ctx, req) assert.EqualError(t, err, "something exploded") assert.Nil(t, resp) })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `client.resp = &pb.LatestReportResponse{Report: &pb.Report{Price: []byte(strconv.Itoa(i))}}` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `client.resp = nil` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `client.err = errors.New("something exploded")` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `t.Run("caches repeated calls to LatestReport, keyed by request", func(t *testing.T) { cfg.LatestReportTTL = neverExpireTTL client.err = nil c := newMemCache(lggr, client, cfg) t.Run("if cache is unstarted, returns error", func(t *testing.T) { // starting the cache is required for state management if we // actually cache results, since fetches are initiated async and // need to be cleaned up properly on close _, err := c.LatestReport(ctx, &pb.LatestReportRequest{}) assert.EqualError(t, err, "memCache must be started, but is: Unstarted") }) err := c.StartOnce("test start", func() error { return nil }) require.NoError(t, err) t.Run("returns cached value for key", func(t *testing.T) { var firstResp *pb.LatestReportResponse for i := 0; i < 5; i++ { client.resp = &pb.LatestReportResponse{Report: &pb.Report{Price: []byte(strconv.Itoa(i))}} if firstResp == nil { firstResp = client.resp } resp, err := c.LatestReport(ctx, req1) require.NoError(t, err) assert.Equal(t, firstResp, resp) } }) t.Run("cache keys do not conflict", func(t *testing.T) { var firstResp1 *pb.LatestReportResponse for i := 5; i < 10; i++ { client.resp = &pb.LatestReportResponse{Report: &pb.Report{Price: []byte(strconv.Itoa(i))}} if firstResp1 == nil { firstResp1 = client.resp } resp, err := c.LatestReport(ctx, req2) require.NoError(t, err) assert.Equal(t, firstResp1, resp) } var firstResp2 *pb.LatestReportResponse for i := 10; i < 15; i++ { client.resp = &pb.LatestReportResponse{Report: &pb.Report{Price: []byte(strconv.Itoa(i))}} if firstResp2 == nil { firstResp2 = client.resp } resp, err := c.LatestReport(ctx, req3) require.NoError(t, err) assert.Equal(t, firstResp2, resp) } // req1 key still has same value resp, err := c.LatestReport(ctx, req1) require.NoError(t, err) assert.Equal(t, []byte(strconv.Itoa(0)), resp.Report.Price) // req2 key still has same value resp, err = c.LatestReport(ctx, req2) require.NoError(t, err) assert.Equal(t, []byte(strconv.Itoa(5)), resp.Report.Price) }) t.Run("re-queries when a cache item has expired", func(t *testing.T) { vi, exists := c.cache.Load(feedID1Hex) require.True(t, exists) v := vi.(*cacheVal) v.expiresAt = time.Now().Add(-1 * time.Second) client.resp = &pb.LatestReportResponse{Report: &pb.Report{Price: []byte(strconv.Itoa(15))}} resp, err := c.LatestReport(ctx, req1) require.NoError(t, err) assert.Equal(t, client.resp, resp) // querying again yields the same cached item resp, err = c.LatestReport(ctx, req1) require.NoError(t, err) assert.Equal(t, client.resp, resp) }) })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `cfg.LatestReportTTL = neverExpireTTL` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `client.err = nil` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `t.Run("if cache is unstarted, returns error", func(t *testing.T) { // starting the cache is required for state management if we // actually cache results, since fetches are initiated async and // need to be cleaned up properly on close _, err := c.LatestReport(ctx, &pb.LatestReportRequest{}) assert.EqualError(t, err, "memCache must be started, but is: Unstarted") })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `t.Run("returns cached value for key", func(t *testing.T) { var firstResp *pb.LatestReportResponse for i := 0; i < 5; i++ { client.resp = &pb.LatestReportResponse{Report: &pb.Report{Price: []byte(strconv.Itoa(i))}} if firstResp == nil { firstResp = client.resp } resp, err := c.LatestReport(ctx, req1) require.NoError(t, err) assert.Equal(t, firstResp, resp) } })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `client.resp = &pb.LatestReportResponse{Report: &pb.Report{Price: []byte(strconv.Itoa(i))}}` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `firstResp = client.resp` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `t.Run("cache keys do not conflict", func(t *testing.T) { var firstResp1 *pb.LatestReportResponse for i := 5; i < 10; i++ { client.resp = &pb.LatestReportResponse{Report: &pb.Report{Price: []byte(strconv.Itoa(i))}} if firstResp1 == nil { firstResp1 = client.resp } resp, err := c.LatestReport(ctx, req2) require.NoError(t, err) assert.Equal(t, firstResp1, resp) } var firstResp2 *pb.LatestReportResponse for i := 10; i < 15; i++ { client.resp = &pb.LatestReportResponse{Report: &pb.Report{Price: []byte(strconv.Itoa(i))}} if firstResp2 == nil { firstResp2 = client.resp } resp, err := c.LatestReport(ctx, req3) require.NoError(t, err) assert.Equal(t, firstResp2, resp) } // req1 key still has same value resp, err := c.LatestReport(ctx, req1) require.NoError(t, err) assert.Equal(t, []byte(strconv.Itoa(0)), resp.Report.Price) // req2 key still has same value resp, err = c.LatestReport(ctx, req2) require.NoError(t, err) assert.Equal(t, []byte(strconv.Itoa(5)), resp.Report.Price) })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `client.resp = &pb.LatestReportResponse{Report: &pb.Report{Price: []byte(strconv.Itoa(i))}}` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `firstResp1 = client.resp` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `client.resp = &pb.LatestReportResponse{Report: &pb.Report{Price: []byte(strconv.Itoa(i))}}` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `firstResp2 = client.resp` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `resp, err = c.LatestReport(ctx, req2)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `t.Run("re-queries when a cache item has expired", func(t *testing.T) { vi, exists := c.cache.Load(feedID1Hex) require.True(t, exists) v := vi.(*cacheVal) v.expiresAt = time.Now().Add(-1 * time.Second) client.resp = &pb.LatestReportResponse{Report: &pb.Report{Price: []byte(strconv.Itoa(15))}} resp, err := c.LatestReport(ctx, req1) require.NoError(t, err) assert.Equal(t, client.resp, resp) // querying again yields the same cached item resp, err = c.LatestReport(ctx, req1) require.NoError(t, err) assert.Equal(t, client.resp, resp) })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `v.expiresAt = time.Now().Add(-1 * time.Second)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `client.resp = &pb.LatestReportResponse{Report: &pb.Report{Price: []byte(strconv.Itoa(15))}}` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `resp, err = c.LatestReport(ctx, req1)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `t.Run("complete fetch", func(t *testing.T) { t.Run("does not change expiry if fetch returns error", func(t *testing.T) { expires := time.Now().Add(-1 * time.Second) v := &cacheVal{ fetching: true, fetchCh: make(chan (struct{})), val: nil, err: nil, expiresAt: expires, } v.completeFetch(nil, errors.New("foo"), time.Now().Add(neverExpireTTL)) assert.Equal(t, expires, v.expiresAt) v = &cacheVal{ fetching: true, fetchCh: make(chan (struct{})), val: nil, err: nil, expiresAt: expires, } expires = time.Now().Add(neverExpireTTL) v.completeFetch(nil, nil, expires) assert.Equal(t, expires, v.expiresAt) }) })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `t.Run("does not change expiry if fetch returns error", func(t *testing.T) { expires := time.Now().Add(-1 * time.Second) v := &cacheVal{ fetching: true, fetchCh: make(chan (struct{})), val: nil, err: nil, expiresAt: expires, } v.completeFetch(nil, errors.New("foo"), time.Now().Add(neverExpireTTL)) assert.Equal(t, expires, v.expiresAt) v = &cacheVal{ fetching: true, fetchCh: make(chan (struct{})), val: nil, err: nil, expiresAt: expires, } expires = time.Now().Add(neverExpireTTL) v.completeFetch(nil, nil, expires) assert.Equal(t, expires, v.expiresAt) })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `v.completeFetch(nil, errors.New("foo"), time.Now().Add(neverExpireTTL))` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `v = &cacheVal{ fetching: true, fetchCh: make(chan (struct{})), val: nil, err: nil, expiresAt: expires, }` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `expires = time.Now().Add(neverExpireTTL)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `v.completeFetch(nil, nil, expires)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `c.cache.Store(feedID1Hex, v)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `cancel()` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `t.Run("returns context deadline exceeded error if fetch takes too long", func(t *testing.T) { _, err := c.LatestReport(canceledCtx, req1) require.Error(t, err) assert.True(t, errors.Is(err, context.Canceled)) assert.EqualError(t, err, "context canceled") })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `t.Run("returns wrapped context deadline exceeded error if fetch has errored and is in the retry loop", func(t *testing.T) { v.err = errors.New("some background fetch error") _, err := c.LatestReport(canceledCtx, req1) require.Error(t, err) assert.True(t, errors.Is(err, context.Canceled)) assert.EqualError(t, err, "some background fetch error\ncontext canceled") })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `v.err = errors.New("some background fetch error")` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.TestLogger(t)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.BytesToFeedID(req1.FeedId)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.String()` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Run("errors with nil req", func(t *testing.T) { c := newMemCache(lggr, client, cfg) _, err := c.LatestReport(ctx, nil) assert.EqualError(t, err, "req must not be nil") })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.LatestReport(ctx, nil)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Run("with LatestReportTTL=0 does no caching", func(t *testing.T) { c := newMemCache(lggr, client, cfg) req := &pb.LatestReportRequest{} for i := 0; i < 5; i++ { client.resp = &pb.LatestReportResponse{Report: &pb.Report{Price: []byte(strconv.Itoa(i))}} resp, err := c.LatestReport(ctx, req) require.NoError(t, err) assert.Equal(t, client.resp, resp) } client.resp = nil client.err = errors.New("something exploded") resp, err := c.LatestReport(ctx, req) assert.EqualError(t, err, "something exploded") assert.Nil(t, resp) })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Itoa(i)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.LatestReport(ctx, req)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.New("something exploded")` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.LatestReport(ctx, req)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Run("caches repeated calls to LatestReport, keyed by request", func(t *testing.T) { cfg.LatestReportTTL = neverExpireTTL client.err = nil c := newMemCache(lggr, client, cfg) t.Run("if cache is unstarted, returns error", func(t *testing.T) { // starting the cache is required for state management if we // actually cache results, since fetches are initiated async and // need to be cleaned up properly on close _, err := c.LatestReport(ctx, &pb.LatestReportRequest{}) assert.EqualError(t, err, "memCache must be started, but is: Unstarted") }) err := c.StartOnce("test start", func() error { return nil }) require.NoError(t, err) t.Run("returns cached value for key", func(t *testing.T) { var firstResp *pb.LatestReportResponse for i := 0; i < 5; i++ { client.resp = &pb.LatestReportResponse{Report: &pb.Report{Price: []byte(strconv.Itoa(i))}} if firstResp == nil { firstResp = client.resp } resp, err := c.LatestReport(ctx, req1) require.NoError(t, err) assert.Equal(t, firstResp, resp) } }) t.Run("cache keys do not conflict", func(t *testing.T) { var firstResp1 *pb.LatestReportResponse for i := 5; i < 10; i++ { client.resp = &pb.LatestReportResponse{Report: &pb.Report{Price: []byte(strconv.Itoa(i))}} if firstResp1 == nil { firstResp1 = client.resp } resp, err := c.LatestReport(ctx, req2) require.NoError(t, err) assert.Equal(t, firstResp1, resp) } var firstResp2 *pb.LatestReportResponse for i := 10; i < 15; i++ { client.resp = &pb.LatestReportResponse{Report: &pb.Report{Price: []byte(strconv.Itoa(i))}} if firstResp2 == nil { firstResp2 = client.resp } resp, err := c.LatestReport(ctx, req3) require.NoError(t, err) assert.Equal(t, firstResp2, resp) } // req1 key still has same value resp, err := c.LatestReport(ctx, req1) require.NoError(t, err) assert.Equal(t, []byte(strconv.Itoa(0)), resp.Report.Price) // req2 key still has same value resp, err = c.LatestReport(ctx, req2) require.NoError(t, err) assert.Equal(t, []byte(strconv.Itoa(5)), resp.Report.Price) }) t.Run("re-queries when a cache item has expired", func(t *testing.T) { vi, exists := c.cache.Load(feedID1Hex) require.True(t, exists) v := vi.(*cacheVal) v.expiresAt = time.Now().Add(-1 * time.Second) client.resp = &pb.LatestReportResponse{Report: &pb.Report{Price: []byte(strconv.Itoa(15))}} resp, err := c.LatestReport(ctx, req1) require.NoError(t, err) assert.Equal(t, client.resp, resp) // querying again yields the same cached item resp, err = c.LatestReport(ctx, req1) require.NoError(t, err) assert.Equal(t, client.resp, resp) }) })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Run("if cache is unstarted, returns error", func(t *testing.T) { // starting the cache is required for state management if we // actually cache results, since fetches are initiated async and // need to be cleaned up properly on close _, err := c.LatestReport(ctx, &pb.LatestReportRequest{}) assert.EqualError(t, err, "memCache must be started, but is: Unstarted") })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.LatestReport(ctx, &pb.LatestReportRequest{})` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.StartOnce("test start", func() error { return nil })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Run("returns cached value for key", func(t *testing.T) { var firstResp *pb.LatestReportResponse for i := 0; i < 5; i++ { client.resp = &pb.LatestReportResponse{Report: &pb.Report{Price: []byte(strconv.Itoa(i))}} if firstResp == nil { firstResp = client.resp } resp, err := c.LatestReport(ctx, req1) require.NoError(t, err) assert.Equal(t, firstResp, resp) } })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Itoa(i)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.LatestReport(ctx, req1)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Run("cache keys do not conflict", func(t *testing.T) { var firstResp1 *pb.LatestReportResponse for i := 5; i < 10; i++ { client.resp = &pb.LatestReportResponse{Report: &pb.Report{Price: []byte(strconv.Itoa(i))}} if firstResp1 == nil { firstResp1 = client.resp } resp, err := c.LatestReport(ctx, req2) require.NoError(t, err) assert.Equal(t, firstResp1, resp) } var firstResp2 *pb.LatestReportResponse for i := 10; i < 15; i++ { client.resp = &pb.LatestReportResponse{Report: &pb.Report{Price: []byte(strconv.Itoa(i))}} if firstResp2 == nil { firstResp2 = client.resp } resp, err := c.LatestReport(ctx, req3) require.NoError(t, err) assert.Equal(t, firstResp2, resp) } // req1 key still has same value resp, err := c.LatestReport(ctx, req1) require.NoError(t, err) assert.Equal(t, []byte(strconv.Itoa(0)), resp.Report.Price) // req2 key still has same value resp, err = c.LatestReport(ctx, req2) require.NoError(t, err) assert.Equal(t, []byte(strconv.Itoa(5)), resp.Report.Price) })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Itoa(i)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.LatestReport(ctx, req2)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Itoa(i)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.LatestReport(ctx, req3)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.LatestReport(ctx, req1)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.LatestReport(ctx, req2)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Run("re-queries when a cache item has expired", func(t *testing.T) { vi, exists := c.cache.Load(feedID1Hex) require.True(t, exists) v := vi.(*cacheVal) v.expiresAt = time.Now().Add(-1 * time.Second) client.resp = &pb.LatestReportResponse{Report: &pb.Report{Price: []byte(strconv.Itoa(15))}} resp, err := c.LatestReport(ctx, req1) require.NoError(t, err) assert.Equal(t, client.resp, resp) // querying again yields the same cached item resp, err = c.LatestReport(ctx, req1) require.NoError(t, err) assert.Equal(t, client.resp, resp) })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.cache.Load(feedID1Hex)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Now()` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Add(-1 * time.Second)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Itoa(15)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.LatestReport(ctx, req1)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.LatestReport(ctx, req1)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Run("complete fetch", func(t *testing.T) { t.Run("does not change expiry if fetch returns error", func(t *testing.T) { expires := time.Now().Add(-1 * time.Second) v := &cacheVal{ fetching: true, fetchCh: make(chan (struct{})), val: nil, err: nil, expiresAt: expires, } v.completeFetch(nil, errors.New("foo"), time.Now().Add(neverExpireTTL)) assert.Equal(t, expires, v.expiresAt) v = &cacheVal{ fetching: true, fetchCh: make(chan (struct{})), val: nil, err: nil, expiresAt: expires, } expires = time.Now().Add(neverExpireTTL) v.completeFetch(nil, nil, expires) assert.Equal(t, expires, v.expiresAt) }) })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Run("does not change expiry if fetch returns error", func(t *testing.T) { expires := time.Now().Add(-1 * time.Second) v := &cacheVal{ fetching: true, fetchCh: make(chan (struct{})), val: nil, err: nil, expiresAt: expires, } v.completeFetch(nil, errors.New("foo"), time.Now().Add(neverExpireTTL)) assert.Equal(t, expires, v.expiresAt) v = &cacheVal{ fetching: true, fetchCh: make(chan (struct{})), val: nil, err: nil, expiresAt: expires, } expires = time.Now().Add(neverExpireTTL) v.completeFetch(nil, nil, expires) assert.Equal(t, expires, v.expiresAt) })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Now()` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Add(-1 * time.Second)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.completeFetch(nil, errors.New("foo"), time.Now().Add(neverExpireTTL))` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.New("foo")` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Now()` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Add(neverExpireTTL)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Now()` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Add(neverExpireTTL)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.completeFetch(nil, nil, expires)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Now()` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Add(-1 * time.Second)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.cache.Store(feedID1Hex, v)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Run("returns context deadline exceeded error if fetch takes too long", func(t *testing.T) { _, err := c.LatestReport(canceledCtx, req1) require.Error(t, err) assert.True(t, errors.Is(err, context.Canceled)) assert.EqualError(t, err, "context canceled") })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.LatestReport(canceledCtx, req1)` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.Run("returns wrapped context deadline exceeded error if fetch has errored and is in the retry loop", func(t *testing.T) { v.err = errors.New("some background fetch error") _, err := c.LatestReport(canceledCtx, req1) require.Error(t, err) assert.True(t, errors.Is(err, context.Canceled)) assert.EqualError(t, err, "some background fetch error\ncontext canceled") })` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.New("some background fetch error")` $DIR/core/services/relay/evm/mercury/wsrpc/cache/cache_test.go: `.LatestReport(canceledCtx, req1)` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `calls++` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `c.conn = conn` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `c.rawClient = wsrpcClient` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `t.Run("successful transmit resets the counter", func(t *testing.T) { transmitErr = nil // working transmit to reset counter _, err = c.Transmit(ctx, req) require.NoError(t, err) assert.Equal(t, MaxConsecutiveRequestFailures+1, calls) assert.Equal(t, 0, int(c.consecutiveTimeoutCnt.Load())) })` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `transmitErr = nil` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `_, err = c.Transmit(ctx, req)` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `t.Run("doesn't block in case channel is full", func(t *testing.T) { transmitErr = context.DeadlineExceeded c.chResetTransport = nil // simulate full channel for i := 0; i < MaxConsecutiveRequestFailures; i++ { _, err := c.Transmit(ctx, req) require.EqualError(t, err, "context deadline exceeded") } })` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `transmitErr = context.DeadlineExceeded` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `c.chResetTransport = nil` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `t.Run(tt.name, func(t *testing.T) { req := &pb.LatestReportRequest{} cacheSet := cache.NewCacheSet(lggr, cache.Config{LatestReportTTL: tt.ttl}) resp := &pb.LatestReportResponse{} var calls int wsrpcClient := &mocks.MockWSRPCClient{ LatestReportF: func(ctx context.Context, in *pb.LatestReportRequest) (*pb.LatestReportResponse, error) { calls++ assert.Equal(t, req, in) return resp, nil }, } conn := &mocks.MockConn{ Ready: true, } c := newClient(lggr, csakey.KeyV2{}, nil, "", cacheSet) c.conn = conn c.rawClient = wsrpcClient servicetest.Run(t, cacheSet) simulateStart(ctx, t, c) for i := 0; i < cacheReads; i++ { r, err := c.LatestReport(ctx, req) require.NoError(t, err) assert.Equal(t, resp, r) } assert.Equal(t, tt.expectedCalls, calls, "expected %d calls to LatestReport but it was called %d times", tt.expectedCalls, calls) })` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `calls++` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `c.conn = conn` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `c.rawClient = wsrpcClient` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `servicetest.Run(t, cacheSet)` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `simulateStart(ctx, t, c)` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `.TestLogger(t)` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `.Transmit(ctx, req)` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `.Transmit(ctx, req)` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `.Run("successful transmit resets the counter", func(t *testing.T) { transmitErr = nil // working transmit to reset counter _, err = c.Transmit(ctx, req) require.NoError(t, err) assert.Equal(t, MaxConsecutiveRequestFailures+1, calls) assert.Equal(t, 0, int(c.consecutiveTimeoutCnt.Load())) })` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `.Transmit(ctx, req)` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `.Run("doesn't block in case channel is full", func(t *testing.T) { transmitErr = context.DeadlineExceeded c.chResetTransport = nil // simulate full channel for i := 0; i < MaxConsecutiveRequestFailures; i++ { _, err := c.Transmit(ctx, req) require.EqualError(t, err, "context deadline exceeded") } })` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `.Transmit(ctx, req)` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `.TestLogger(t)` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `.Run(tt.name, func(t *testing.T) { req := &pb.LatestReportRequest{} cacheSet := cache.NewCacheSet(lggr, cache.Config{LatestReportTTL: tt.ttl}) resp := &pb.LatestReportResponse{} var calls int wsrpcClient := &mocks.MockWSRPCClient{ LatestReportF: func(ctx context.Context, in *pb.LatestReportRequest) (*pb.LatestReportResponse, error) { calls++ assert.Equal(t, req, in) return resp, nil }, } conn := &mocks.MockConn{ Ready: true, } c := newClient(lggr, csakey.KeyV2{}, nil, "", cacheSet) c.conn = conn c.rawClient = wsrpcClient servicetest.Run(t, cacheSet) simulateStart(ctx, t, c) for i := 0; i < cacheReads; i++ { r, err := c.LatestReport(ctx, req) require.NoError(t, err) assert.Equal(t, resp, r) } assert.Equal(t, tt.expectedCalls, calls, "expected %d calls to LatestReport but it was called %d times", tt.expectedCalls, calls) })` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `.NewCacheSet(lggr, cache.Config{LatestReportTTL: tt.ttl})` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `.Run(t, cacheSet)` $DIR/core/services/relay/evm/mercury/wsrpc/client_test.go: `.LatestReport(ctx, req)` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `t.Run("Checkout", func(t *testing.T) { p := newPool(lggr) p.cacheSet = &mockCacheSet{} t.Run("checks out one started client", func(t *testing.T) { clientPrivKey := csakey.MustNewV2XXXTestingOnly(big.NewInt(rand.Int63())) serverPubKey := utils.NewHash().Bytes() serverURL := "example.com:443/ws" client := newMockClient(lggr) p.newClient = func(lggr logger.Logger, cprivk csakey.KeyV2, spubk []byte, surl string, cs cache.CacheSet) Client { assert.Equal(t, clientPrivKey, cprivk) assert.Equal(t, serverPubKey, spubk) assert.Equal(t, serverURL, surl) return client } c, err := p.Checkout(ctx, clientPrivKey, serverPubKey, serverURL) require.NoError(t, err) assert.True(t, client.started) require.IsType(t, &clientCheckout{}, c) conn := c.(*clientCheckout).connection require.Equal(t, conn.Client, client) assert.Len(t, conn.checkouts, 1) assert.Same(t, lggr, conn.lggr) assert.Equal(t, clientPrivKey, conn.clientPrivKey) assert.Equal(t, serverPubKey, conn.serverPubKey) assert.Equal(t, serverURL, conn.serverURL) assert.Same(t, p, conn.pool) t.Run("checks in the clientCheckout when Close is called", func(t *testing.T) { err := c.Close() require.NoError(t, err) assert.Len(t, conn.checkouts, 0) require.IsType(t, nil, conn.Client) assert.Nil(t, conn.Client) assert.True(t, client.closed) }) }) t.Run("checks out multiple started clients and only closes if all of the clients for a given pk/server pair are checked back in", func(t *testing.T) { clientPrivKeys := []csakey.KeyV2{ csakey.MustNewV2XXXTestingOnly(big.NewInt(rand.Int63())), csakey.MustNewV2XXXTestingOnly(big.NewInt(rand.Int63())), } serverPubKey := utils.NewHash().Bytes() serverURLs := []string{ "example.com:443/ws", "example.invalid:8000/ws", } p.newClient = func(lggr logger.Logger, cprivk csakey.KeyV2, spubk []byte, surl string, cs cache.CacheSet) Client { return newMockClient(lggr) } // conn 1 c1 := mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[0]) c2 := mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[0]) c3 := mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[0]) assert.Len(t, p.connections, 1) assert.Len(t, p.connections[serverURLs[0]], 1) assert.Len(t, p.connections[serverURLs[1]], 0) // conn 2 c4 := mustCheckout(t, p, clientPrivKeys[1], serverPubKey, serverURLs[0]) assert.Len(t, p.connections, 1) assert.Len(t, p.connections[serverURLs[0]], 2) assert.Len(t, p.connections[serverURLs[1]], 0) // conn 3 c5 := mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[1]) c6 := mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[1]) assert.Len(t, p.connections, 2) assert.Len(t, p.connections[serverURLs[0]], 2) assert.Len(t, p.connections[serverURLs[1]], 1) conn1 := c1.(*clientCheckout).connection assert.Same(t, conn1, c2.(*clientCheckout).connection) assert.Same(t, conn1, c3.(*clientCheckout).connection) assert.Len(t, conn1.checkouts, 3) assert.True(t, conn1.Client.(*mockClient).started) conn2 := c4.(*clientCheckout).connection assert.NotEqual(t, conn1, conn2) assert.Len(t, conn2.checkouts, 1) assert.True(t, conn2.Client.(*mockClient).started) conn3 := c5.(*clientCheckout).connection assert.NotEqual(t, conn1, conn3) assert.NotEqual(t, conn2, conn3) assert.Same(t, conn3, c6.(*clientCheckout).connection) assert.Len(t, conn3.checkouts, 2) assert.True(t, conn3.Client.(*mockClient).started) require.NoError(t, c1.Close()) assert.Len(t, conn1.checkouts, 2) assert.NotNil(t, conn1.Client) assert.Len(t, p.connections, 2) assert.Len(t, p.connections[serverURLs[0]], 2) assert.Len(t, p.connections[serverURLs[1]], 1) require.NoError(t, c2.Close()) assert.Len(t, conn1.checkouts, 1) assert.NotNil(t, conn1.Client) assert.Len(t, p.connections, 2) assert.Len(t, p.connections[serverURLs[0]], 2) assert.Len(t, p.connections[serverURLs[1]], 1) require.NoError(t, c3.Close()) assert.Len(t, conn1.checkouts, 0) assert.Nil(t, conn1.Client) assert.Len(t, p.connections, 2) assert.Len(t, p.connections[serverURLs[0]], 1) assert.Len(t, p.connections[serverURLs[1]], 1) c7 := mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[0]) // Not the same one, since previously all checkouts were checked in, the original connection was deleted from the map and a new one created assert.NotSame(t, conn1, c7.(*clientCheckout).connection) assert.Len(t, conn1.checkouts, 0) // actually, conn1 has already been removed from the map and will be garbage collected conn4 := c7.(*clientCheckout).connection assert.Len(t, conn4.checkouts, 1) assert.NotNil(t, conn4.Client) assert.Len(t, p.connections, 2) assert.Len(t, p.connections[serverURLs[0]], 2) assert.Len(t, p.connections[serverURLs[1]], 1) require.NoError(t, c7.Close()) assert.Len(t, p.connections, 2) assert.Len(t, p.connections[serverURLs[0]], 1) assert.Len(t, p.connections[serverURLs[1]], 1) require.NoError(t, c4.Close()) assert.Len(t, p.connections, 1) assert.Len(t, p.connections[serverURLs[0]], 0) assert.Len(t, p.connections[serverURLs[1]], 1) require.NoError(t, c5.Close()) require.NoError(t, c6.Close()) assert.Len(t, p.connections, 0) require.NoError(t, p.Close()) }) })` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `p.cacheSet = &mockCacheSet{}` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `t.Run("checks out one started client", func(t *testing.T) { clientPrivKey := csakey.MustNewV2XXXTestingOnly(big.NewInt(rand.Int63())) serverPubKey := utils.NewHash().Bytes() serverURL := "example.com:443/ws" client := newMockClient(lggr) p.newClient = func(lggr logger.Logger, cprivk csakey.KeyV2, spubk []byte, surl string, cs cache.CacheSet) Client { assert.Equal(t, clientPrivKey, cprivk) assert.Equal(t, serverPubKey, spubk) assert.Equal(t, serverURL, surl) return client } c, err := p.Checkout(ctx, clientPrivKey, serverPubKey, serverURL) require.NoError(t, err) assert.True(t, client.started) require.IsType(t, &clientCheckout{}, c) conn := c.(*clientCheckout).connection require.Equal(t, conn.Client, client) assert.Len(t, conn.checkouts, 1) assert.Same(t, lggr, conn.lggr) assert.Equal(t, clientPrivKey, conn.clientPrivKey) assert.Equal(t, serverPubKey, conn.serverPubKey) assert.Equal(t, serverURL, conn.serverURL) assert.Same(t, p, conn.pool) t.Run("checks in the clientCheckout when Close is called", func(t *testing.T) { err := c.Close() require.NoError(t, err) assert.Len(t, conn.checkouts, 0) require.IsType(t, nil, conn.Client) assert.Nil(t, conn.Client) assert.True(t, client.closed) }) })` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `t.Run("checks in the clientCheckout when Close is called", func(t *testing.T) { err := c.Close() require.NoError(t, err) assert.Len(t, conn.checkouts, 0) require.IsType(t, nil, conn.Client) assert.Nil(t, conn.Client) assert.True(t, client.closed) })` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `t.Run("checks out multiple started clients and only closes if all of the clients for a given pk/server pair are checked back in", func(t *testing.T) { clientPrivKeys := []csakey.KeyV2{ csakey.MustNewV2XXXTestingOnly(big.NewInt(rand.Int63())), csakey.MustNewV2XXXTestingOnly(big.NewInt(rand.Int63())), } serverPubKey := utils.NewHash().Bytes() serverURLs := []string{ "example.com:443/ws", "example.invalid:8000/ws", } p.newClient = func(lggr logger.Logger, cprivk csakey.KeyV2, spubk []byte, surl string, cs cache.CacheSet) Client { return newMockClient(lggr) } // conn 1 c1 := mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[0]) c2 := mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[0]) c3 := mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[0]) assert.Len(t, p.connections, 1) assert.Len(t, p.connections[serverURLs[0]], 1) assert.Len(t, p.connections[serverURLs[1]], 0) // conn 2 c4 := mustCheckout(t, p, clientPrivKeys[1], serverPubKey, serverURLs[0]) assert.Len(t, p.connections, 1) assert.Len(t, p.connections[serverURLs[0]], 2) assert.Len(t, p.connections[serverURLs[1]], 0) // conn 3 c5 := mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[1]) c6 := mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[1]) assert.Len(t, p.connections, 2) assert.Len(t, p.connections[serverURLs[0]], 2) assert.Len(t, p.connections[serverURLs[1]], 1) conn1 := c1.(*clientCheckout).connection assert.Same(t, conn1, c2.(*clientCheckout).connection) assert.Same(t, conn1, c3.(*clientCheckout).connection) assert.Len(t, conn1.checkouts, 3) assert.True(t, conn1.Client.(*mockClient).started) conn2 := c4.(*clientCheckout).connection assert.NotEqual(t, conn1, conn2) assert.Len(t, conn2.checkouts, 1) assert.True(t, conn2.Client.(*mockClient).started) conn3 := c5.(*clientCheckout).connection assert.NotEqual(t, conn1, conn3) assert.NotEqual(t, conn2, conn3) assert.Same(t, conn3, c6.(*clientCheckout).connection) assert.Len(t, conn3.checkouts, 2) assert.True(t, conn3.Client.(*mockClient).started) require.NoError(t, c1.Close()) assert.Len(t, conn1.checkouts, 2) assert.NotNil(t, conn1.Client) assert.Len(t, p.connections, 2) assert.Len(t, p.connections[serverURLs[0]], 2) assert.Len(t, p.connections[serverURLs[1]], 1) require.NoError(t, c2.Close()) assert.Len(t, conn1.checkouts, 1) assert.NotNil(t, conn1.Client) assert.Len(t, p.connections, 2) assert.Len(t, p.connections[serverURLs[0]], 2) assert.Len(t, p.connections[serverURLs[1]], 1) require.NoError(t, c3.Close()) assert.Len(t, conn1.checkouts, 0) assert.Nil(t, conn1.Client) assert.Len(t, p.connections, 2) assert.Len(t, p.connections[serverURLs[0]], 1) assert.Len(t, p.connections[serverURLs[1]], 1) c7 := mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[0]) // Not the same one, since previously all checkouts were checked in, the original connection was deleted from the map and a new one created assert.NotSame(t, conn1, c7.(*clientCheckout).connection) assert.Len(t, conn1.checkouts, 0) // actually, conn1 has already been removed from the map and will be garbage collected conn4 := c7.(*clientCheckout).connection assert.Len(t, conn4.checkouts, 1) assert.NotNil(t, conn4.Client) assert.Len(t, p.connections, 2) assert.Len(t, p.connections[serverURLs[0]], 2) assert.Len(t, p.connections[serverURLs[1]], 1) require.NoError(t, c7.Close()) assert.Len(t, p.connections, 2) assert.Len(t, p.connections[serverURLs[0]], 1) assert.Len(t, p.connections[serverURLs[1]], 1) require.NoError(t, c4.Close()) assert.Len(t, p.connections, 1) assert.Len(t, p.connections[serverURLs[0]], 0) assert.Len(t, p.connections[serverURLs[1]], 1) require.NoError(t, c5.Close()) require.NoError(t, c6.Close()) assert.Len(t, p.connections, 0) require.NoError(t, p.Close()) })` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `p.cacheSet = &mockCacheSet{}` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `t.Run("Name", func(t *testing.T) { assert.Equal(t, "PoolTestLogger", p.Name()) })` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `t.Run("Start", func(t *testing.T) { require.NoError(t, p.Start(ctx)) assert.Nil(t, p.Ready()) assert.Nil(t, p.HealthReport()["PoolTestLogger"]) })` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `clients = append(clients, c)` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[0])` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[0])` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[0])` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `mustCheckout(t, p, clientPrivKeys[1], serverPubKey, serverURLs[0])` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[1])` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[1])` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.TestLogger(t)` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.Named("PoolTestLogger")` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.Context(t)` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.Run("Checkout", func(t *testing.T) { p := newPool(lggr) p.cacheSet = &mockCacheSet{} t.Run("checks out one started client", func(t *testing.T) { clientPrivKey := csakey.MustNewV2XXXTestingOnly(big.NewInt(rand.Int63())) serverPubKey := utils.NewHash().Bytes() serverURL := "example.com:443/ws" client := newMockClient(lggr) p.newClient = func(lggr logger.Logger, cprivk csakey.KeyV2, spubk []byte, surl string, cs cache.CacheSet) Client { assert.Equal(t, clientPrivKey, cprivk) assert.Equal(t, serverPubKey, spubk) assert.Equal(t, serverURL, surl) return client } c, err := p.Checkout(ctx, clientPrivKey, serverPubKey, serverURL) require.NoError(t, err) assert.True(t, client.started) require.IsType(t, &clientCheckout{}, c) conn := c.(*clientCheckout).connection require.Equal(t, conn.Client, client) assert.Len(t, conn.checkouts, 1) assert.Same(t, lggr, conn.lggr) assert.Equal(t, clientPrivKey, conn.clientPrivKey) assert.Equal(t, serverPubKey, conn.serverPubKey) assert.Equal(t, serverURL, conn.serverURL) assert.Same(t, p, conn.pool) t.Run("checks in the clientCheckout when Close is called", func(t *testing.T) { err := c.Close() require.NoError(t, err) assert.Len(t, conn.checkouts, 0) require.IsType(t, nil, conn.Client) assert.Nil(t, conn.Client) assert.True(t, client.closed) }) }) t.Run("checks out multiple started clients and only closes if all of the clients for a given pk/server pair are checked back in", func(t *testing.T) { clientPrivKeys := []csakey.KeyV2{ csakey.MustNewV2XXXTestingOnly(big.NewInt(rand.Int63())), csakey.MustNewV2XXXTestingOnly(big.NewInt(rand.Int63())), } serverPubKey := utils.NewHash().Bytes() serverURLs := []string{ "example.com:443/ws", "example.invalid:8000/ws", } p.newClient = func(lggr logger.Logger, cprivk csakey.KeyV2, spubk []byte, surl string, cs cache.CacheSet) Client { return newMockClient(lggr) } // conn 1 c1 := mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[0]) c2 := mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[0]) c3 := mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[0]) assert.Len(t, p.connections, 1) assert.Len(t, p.connections[serverURLs[0]], 1) assert.Len(t, p.connections[serverURLs[1]], 0) // conn 2 c4 := mustCheckout(t, p, clientPrivKeys[1], serverPubKey, serverURLs[0]) assert.Len(t, p.connections, 1) assert.Len(t, p.connections[serverURLs[0]], 2) assert.Len(t, p.connections[serverURLs[1]], 0) // conn 3 c5 := mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[1]) c6 := mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[1]) assert.Len(t, p.connections, 2) assert.Len(t, p.connections[serverURLs[0]], 2) assert.Len(t, p.connections[serverURLs[1]], 1) conn1 := c1.(*clientCheckout).connection assert.Same(t, conn1, c2.(*clientCheckout).connection) assert.Same(t, conn1, c3.(*clientCheckout).connection) assert.Len(t, conn1.checkouts, 3) assert.True(t, conn1.Client.(*mockClient).started) conn2 := c4.(*clientCheckout).connection assert.NotEqual(t, conn1, conn2) assert.Len(t, conn2.checkouts, 1) assert.True(t, conn2.Client.(*mockClient).started) conn3 := c5.(*clientCheckout).connection assert.NotEqual(t, conn1, conn3) assert.NotEqual(t, conn2, conn3) assert.Same(t, conn3, c6.(*clientCheckout).connection) assert.Len(t, conn3.checkouts, 2) assert.True(t, conn3.Client.(*mockClient).started) require.NoError(t, c1.Close()) assert.Len(t, conn1.checkouts, 2) assert.NotNil(t, conn1.Client) assert.Len(t, p.connections, 2) assert.Len(t, p.connections[serverURLs[0]], 2) assert.Len(t, p.connections[serverURLs[1]], 1) require.NoError(t, c2.Close()) assert.Len(t, conn1.checkouts, 1) assert.NotNil(t, conn1.Client) assert.Len(t, p.connections, 2) assert.Len(t, p.connections[serverURLs[0]], 2) assert.Len(t, p.connections[serverURLs[1]], 1) require.NoError(t, c3.Close()) assert.Len(t, conn1.checkouts, 0) assert.Nil(t, conn1.Client) assert.Len(t, p.connections, 2) assert.Len(t, p.connections[serverURLs[0]], 1) assert.Len(t, p.connections[serverURLs[1]], 1) c7 := mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[0]) // Not the same one, since previously all checkouts were checked in, the original connection was deleted from the map and a new one created assert.NotSame(t, conn1, c7.(*clientCheckout).connection) assert.Len(t, conn1.checkouts, 0) // actually, conn1 has already been removed from the map and will be garbage collected conn4 := c7.(*clientCheckout).connection assert.Len(t, conn4.checkouts, 1) assert.NotNil(t, conn4.Client) assert.Len(t, p.connections, 2) assert.Len(t, p.connections[serverURLs[0]], 2) assert.Len(t, p.connections[serverURLs[1]], 1) require.NoError(t, c7.Close()) assert.Len(t, p.connections, 2) assert.Len(t, p.connections[serverURLs[0]], 1) assert.Len(t, p.connections[serverURLs[1]], 1) require.NoError(t, c4.Close()) assert.Len(t, p.connections, 1) assert.Len(t, p.connections[serverURLs[0]], 0) assert.Len(t, p.connections[serverURLs[1]], 1) require.NoError(t, c5.Close()) require.NoError(t, c6.Close()) assert.Len(t, p.connections, 0) require.NoError(t, p.Close()) }) })` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.Run("checks out one started client", func(t *testing.T) { clientPrivKey := csakey.MustNewV2XXXTestingOnly(big.NewInt(rand.Int63())) serverPubKey := utils.NewHash().Bytes() serverURL := "example.com:443/ws" client := newMockClient(lggr) p.newClient = func(lggr logger.Logger, cprivk csakey.KeyV2, spubk []byte, surl string, cs cache.CacheSet) Client { assert.Equal(t, clientPrivKey, cprivk) assert.Equal(t, serverPubKey, spubk) assert.Equal(t, serverURL, surl) return client } c, err := p.Checkout(ctx, clientPrivKey, serverPubKey, serverURL) require.NoError(t, err) assert.True(t, client.started) require.IsType(t, &clientCheckout{}, c) conn := c.(*clientCheckout).connection require.Equal(t, conn.Client, client) assert.Len(t, conn.checkouts, 1) assert.Same(t, lggr, conn.lggr) assert.Equal(t, clientPrivKey, conn.clientPrivKey) assert.Equal(t, serverPubKey, conn.serverPubKey) assert.Equal(t, serverURL, conn.serverURL) assert.Same(t, p, conn.pool) t.Run("checks in the clientCheckout when Close is called", func(t *testing.T) { err := c.Close() require.NoError(t, err) assert.Len(t, conn.checkouts, 0) require.IsType(t, nil, conn.Client) assert.Nil(t, conn.Client) assert.True(t, client.closed) }) })` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(rand.Int63()))` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.NewInt(rand.Int63())` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.Int63()` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.NewHash()` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.Bytes()` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.Checkout(ctx, clientPrivKey, serverPubKey, serverURL)` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.Run("checks in the clientCheckout when Close is called", func(t *testing.T) { err := c.Close() require.NoError(t, err) assert.Len(t, conn.checkouts, 0) require.IsType(t, nil, conn.Client) assert.Nil(t, conn.Client) assert.True(t, client.closed) })` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.Run("checks out multiple started clients and only closes if all of the clients for a given pk/server pair are checked back in", func(t *testing.T) { clientPrivKeys := []csakey.KeyV2{ csakey.MustNewV2XXXTestingOnly(big.NewInt(rand.Int63())), csakey.MustNewV2XXXTestingOnly(big.NewInt(rand.Int63())), } serverPubKey := utils.NewHash().Bytes() serverURLs := []string{ "example.com:443/ws", "example.invalid:8000/ws", } p.newClient = func(lggr logger.Logger, cprivk csakey.KeyV2, spubk []byte, surl string, cs cache.CacheSet) Client { return newMockClient(lggr) } // conn 1 c1 := mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[0]) c2 := mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[0]) c3 := mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[0]) assert.Len(t, p.connections, 1) assert.Len(t, p.connections[serverURLs[0]], 1) assert.Len(t, p.connections[serverURLs[1]], 0) // conn 2 c4 := mustCheckout(t, p, clientPrivKeys[1], serverPubKey, serverURLs[0]) assert.Len(t, p.connections, 1) assert.Len(t, p.connections[serverURLs[0]], 2) assert.Len(t, p.connections[serverURLs[1]], 0) // conn 3 c5 := mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[1]) c6 := mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[1]) assert.Len(t, p.connections, 2) assert.Len(t, p.connections[serverURLs[0]], 2) assert.Len(t, p.connections[serverURLs[1]], 1) conn1 := c1.(*clientCheckout).connection assert.Same(t, conn1, c2.(*clientCheckout).connection) assert.Same(t, conn1, c3.(*clientCheckout).connection) assert.Len(t, conn1.checkouts, 3) assert.True(t, conn1.Client.(*mockClient).started) conn2 := c4.(*clientCheckout).connection assert.NotEqual(t, conn1, conn2) assert.Len(t, conn2.checkouts, 1) assert.True(t, conn2.Client.(*mockClient).started) conn3 := c5.(*clientCheckout).connection assert.NotEqual(t, conn1, conn3) assert.NotEqual(t, conn2, conn3) assert.Same(t, conn3, c6.(*clientCheckout).connection) assert.Len(t, conn3.checkouts, 2) assert.True(t, conn3.Client.(*mockClient).started) require.NoError(t, c1.Close()) assert.Len(t, conn1.checkouts, 2) assert.NotNil(t, conn1.Client) assert.Len(t, p.connections, 2) assert.Len(t, p.connections[serverURLs[0]], 2) assert.Len(t, p.connections[serverURLs[1]], 1) require.NoError(t, c2.Close()) assert.Len(t, conn1.checkouts, 1) assert.NotNil(t, conn1.Client) assert.Len(t, p.connections, 2) assert.Len(t, p.connections[serverURLs[0]], 2) assert.Len(t, p.connections[serverURLs[1]], 1) require.NoError(t, c3.Close()) assert.Len(t, conn1.checkouts, 0) assert.Nil(t, conn1.Client) assert.Len(t, p.connections, 2) assert.Len(t, p.connections[serverURLs[0]], 1) assert.Len(t, p.connections[serverURLs[1]], 1) c7 := mustCheckout(t, p, clientPrivKeys[0], serverPubKey, serverURLs[0]) // Not the same one, since previously all checkouts were checked in, the original connection was deleted from the map and a new one created assert.NotSame(t, conn1, c7.(*clientCheckout).connection) assert.Len(t, conn1.checkouts, 0) // actually, conn1 has already been removed from the map and will be garbage collected conn4 := c7.(*clientCheckout).connection assert.Len(t, conn4.checkouts, 1) assert.NotNil(t, conn4.Client) assert.Len(t, p.connections, 2) assert.Len(t, p.connections[serverURLs[0]], 2) assert.Len(t, p.connections[serverURLs[1]], 1) require.NoError(t, c7.Close()) assert.Len(t, p.connections, 2) assert.Len(t, p.connections[serverURLs[0]], 1) assert.Len(t, p.connections[serverURLs[1]], 1) require.NoError(t, c4.Close()) assert.Len(t, p.connections, 1) assert.Len(t, p.connections[serverURLs[0]], 0) assert.Len(t, p.connections[serverURLs[1]], 1) require.NoError(t, c5.Close()) require.NoError(t, c6.Close()) assert.Len(t, p.connections, 0) require.NoError(t, p.Close()) })` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(rand.Int63()))` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.NewInt(rand.Int63())` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.Int63()` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(rand.Int63()))` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.NewInt(rand.Int63())` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.Int63()` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.NewHash()` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.Bytes()` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.Run("Name", func(t *testing.T) { assert.Equal(t, "PoolTestLogger", p.Name()) })` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.Run("Start", func(t *testing.T) { require.NoError(t, p.Start(ctx)) assert.Nil(t, p.Ready()) assert.Nil(t, p.HealthReport()["PoolTestLogger"]) })` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(rand.Int63()))` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.NewInt(rand.Int63())` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.Int63()` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(rand.Int63()))` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.NewInt(rand.Int63())` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.Int63()` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.NewHash()` $DIR/core/services/relay/evm/mercury/wsrpc/pool_test.go: `.Bytes()` $DIR/core/services/relay/evm/relayer_extender_test.go: `c.EVM[0].MinIncomingConfirmations = &one` $DIR/core/services/relay/evm/relayer_extender_test.go: `c.EVM = append(c.EVM, &toml.EVMConfig{ChainID: ubig.New(newId), Enabled: &t, Chain: toml.Defaults(nil)})` $DIR/core/services/relay/evm/relayer_extender_test.go: `relayExtendersInstances[0].Chain().Client().(*evmclimocks.Client).AssertCalled(t, "Close")` $DIR/core/services/relay/evm/relayer_extender_test.go: `relayExtendersInstances[1].Chain().Client().(*evmclimocks.Client).AssertCalled(t, "Close")` $DIR/core/services/relay/evm/relayer_extender_test.go: `.Context(t)` $DIR/core/services/relay/evm/relayer_extender_test.go: `.NewRandomEVMChainID()` $DIR/core/services/relay/evm/relayer_extender_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { one := uint32(1) c.EVM[0].MinIncomingConfirmations = &one t := true c.EVM = append(c.EVM, &toml.EVMConfig{ChainID: ubig.New(newId), Enabled: &t, Chain: toml.Defaults(nil)}) })` $DIR/core/services/relay/evm/relayer_extender_test.go: `.New(newId)` $DIR/core/services/relay/evm/relayer_extender_test.go: `.Defaults(nil)` $DIR/core/services/relay/evm/relayer_extender_test.go: `.NewSqlxDB(t)` $DIR/core/services/relay/evm/relayer_extender_test.go: `.NewKeyStore(t, db)` $DIR/core/services/relay/evm/relayer_extender_test.go: `.NewChainRelayExtOpts(t, evmtest.TestChainOpts{DB: db, KeyStore: kst.Eth(), GeneralConfig: cfg})` $DIR/core/services/relay/evm/relayer_extender_test.go: `.Eth()` $DIR/core/services/relay/evm/relayer_extender_test.go: `.NewEthMocksWithStartupAssertions(t)` $DIR/core/services/relay/evm/relayer_extender_test.go: `.NewChainRelayerExtenders(testutils.Context(t), opts)` $DIR/core/services/relay/evm/relayer_extender_test.go: `.Context(t)` $DIR/core/services/relay/evm/relayer_extender_test.go: `.Slice()` $DIR/core/services/relay/evm/relayer_extender_test.go: `.Chain()` $DIR/core/services/relay/evm/relayer_extender_test.go: `.Client()` $DIR/core/services/relay/evm/relayer_extender_test.go: `.AssertCalled(t, "Close")` $DIR/core/services/relay/evm/relayer_extender_test.go: `.Chain()` $DIR/core/services/relay/evm/relayer_extender_test.go: `.Client()` $DIR/core/services/relay/evm/relayer_extender_test.go: `.AssertCalled(t, "Close")` $DIR/core/services/relay/evm/relayer_extender_test.go: `.GetChainStatus(testutils.Context(t))` $DIR/core/services/relay/evm/relayer_extender_test.go: `.Context(t)` $DIR/core/services/relay/evm/request_round_db_test.go: `t.Run("saves latest round requested", func(t *testing.T) { ctx := testutils.Context(t) err := db.SaveLatestRoundRequested(ctx, rr) require.NoError(t, err) rawLog.Index = 42 // Now overwrite to prove that updating works rr = ocr2aggregator.OCR2AggregatorRoundRequested{ Requester: testutils.NewAddress(), ConfigDigest: testhelpers.MakeConfigDigest(t), Epoch: 43, Round: 8, Raw: rawLog, } err = db.SaveLatestRoundRequested(ctx, rr) require.NoError(t, err) })` $DIR/core/services/relay/evm/request_round_db_test.go: `rawLog.Index = 42` $DIR/core/services/relay/evm/request_round_db_test.go: `rr = ocr2aggregator.OCR2AggregatorRoundRequested{ Requester: testutils.NewAddress(), ConfigDigest: testhelpers.MakeConfigDigest(t), Epoch: 43, Round: 8, Raw: rawLog, }` $DIR/core/services/relay/evm/request_round_db_test.go: `err = db.SaveLatestRoundRequested(ctx, rr)` $DIR/core/services/relay/evm/request_round_db_test.go: `t.Run("loads latest round requested", func(t *testing.T) { ctx := testutils.Context(t) // There is no round for db2 lrr, err := db2.LoadLatestRoundRequested(ctx) require.NoError(t, err) require.Equal(t, 0, int(lrr.Epoch)) lrr, err = db.LoadLatestRoundRequested(ctx) require.NoError(t, err) assert.Equal(t, rr, lrr) })` $DIR/core/services/relay/evm/request_round_db_test.go: `lrr, err = db.LoadLatestRoundRequested(ctx)` $DIR/core/services/relay/evm/request_round_db_test.go: `.NewSqlxDB(t)` $DIR/core/services/relay/evm/request_round_db_test.go: `.Exec(`SET CONSTRAINTS offchainreporting2_latest_round_oracle_spec_fkey DEFERRED`)` $DIR/core/services/relay/evm/request_round_db_test.go: `.TestLogger(t)` $DIR/core/services/relay/evm/request_round_db_test.go: `.NewRoundRequestedDB(sqlDB, 1, lggr)` $DIR/core/services/relay/evm/request_round_db_test.go: `.NewRoundRequestedDB(sqlDB, 2, lggr)` $DIR/core/services/relay/evm/request_round_db_test.go: `.LogFromFixture(t, "../../../testdata/jsonrpc/round_requested_log_1_1.json")` $DIR/core/services/relay/evm/request_round_db_test.go: `.NewAddress()` $DIR/core/services/relay/evm/request_round_db_test.go: `.MakeConfigDigest(t)` $DIR/core/services/relay/evm/request_round_db_test.go: `.Run("saves latest round requested", func(t *testing.T) { ctx := testutils.Context(t) err := db.SaveLatestRoundRequested(ctx, rr) require.NoError(t, err) rawLog.Index = 42 // Now overwrite to prove that updating works rr = ocr2aggregator.OCR2AggregatorRoundRequested{ Requester: testutils.NewAddress(), ConfigDigest: testhelpers.MakeConfigDigest(t), Epoch: 43, Round: 8, Raw: rawLog, } err = db.SaveLatestRoundRequested(ctx, rr) require.NoError(t, err) })` $DIR/core/services/relay/evm/request_round_db_test.go: `.Context(t)` $DIR/core/services/relay/evm/request_round_db_test.go: `.SaveLatestRoundRequested(ctx, rr)` $DIR/core/services/relay/evm/request_round_db_test.go: `.NewAddress()` $DIR/core/services/relay/evm/request_round_db_test.go: `.MakeConfigDigest(t)` $DIR/core/services/relay/evm/request_round_db_test.go: `.SaveLatestRoundRequested(ctx, rr)` $DIR/core/services/relay/evm/request_round_db_test.go: `.Run("loads latest round requested", func(t *testing.T) { ctx := testutils.Context(t) // There is no round for db2 lrr, err := db2.LoadLatestRoundRequested(ctx) require.NoError(t, err) require.Equal(t, 0, int(lrr.Epoch)) lrr, err = db.LoadLatestRoundRequested(ctx) require.NoError(t, err) assert.Equal(t, rr, lrr) })` $DIR/core/services/relay/evm/request_round_db_test.go: `.Context(t)` $DIR/core/services/relay/evm/request_round_db_test.go: `.LoadLatestRoundRequested(ctx)` $DIR/core/services/relay/evm/request_round_db_test.go: `.LoadLatestRoundRequested(ctx)` $DIR/core/services/relay/evm/request_round_db_test.go: `.Exec(`DELETE FROM ocr2_oracle_specs`)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `t.Run("does not update if contract address doesn't match", func(t *testing.T) { uni := newContractTrackerUni(t) logBroadcast := logmocks.NewBroadcast(t) rawLog := cltest.LogFromFixture(t, "../../../testdata/jsonrpc/ocr2_round_requested_log_1_1.json") logBroadcast.On("RawLog").Return(rawLog).Maybe() logBroadcast.On("String").Return("").Maybe() uni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) configDigest, epoch, round, err := uni.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) require.Equal(t, ocrtypes.ConfigDigest{}, configDigest) require.Equal(t, 0, int(round)) require.Equal(t, 0, int(epoch)) uni.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast) configDigest, epoch, round, err = uni.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) require.Equal(t, ocrtypes.ConfigDigest{}, configDigest) require.Equal(t, 0, int(round)) require.Equal(t, 0, int(epoch)) })` $DIR/core/services/relay/evm/request_round_tracker_test.go: `logBroadcast.On("RawLog").Return(rawLog).Maybe()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `logBroadcast.On("String").Return("").Maybe()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `uni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `uni.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `configDigest, epoch, round, err = uni.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `t.Run("does nothing if log has already been consumed", func(t *testing.T) { uni := newContractTrackerUni(t, fixtureFilterer, fixtureContract) logBroadcast := logmocks.NewBroadcast(t) logBroadcast.On("String").Return("").Maybe() uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(true, nil) configDigest, epoch, round, err := uni.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) require.Equal(t, ocrtypes.ConfigDigest{}, configDigest) require.Equal(t, 0, int(round)) require.Equal(t, 0, int(epoch)) uni.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast) configDigest, epoch, round, err = uni.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) require.Equal(t, ocrtypes.ConfigDigest{}, configDigest) require.Equal(t, 0, int(round)) require.Equal(t, 0, int(epoch)) })` $DIR/core/services/relay/evm/request_round_tracker_test.go: `logBroadcast.On("String").Return("").Maybe()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(true, nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `uni.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `configDigest, epoch, round, err = uni.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `t.Run("for new round requested log", func(t *testing.T) { uni := newContractTrackerUni(t, fixtureFilterer, fixtureContract) configDigest, epoch, round, err := uni.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) require.Equal(t, ocrtypes.ConfigDigest{}, configDigest) require.Equal(t, 0, int(round)) require.Equal(t, 0, int(epoch)) // Any round supercedes the 0 round rawLog := cltest.LogFromFixture(t, "../../../testdata/jsonrpc/ocr2_round_requested_log_1_1.json") logBroadcast := logmocks.NewBroadcast(t) logBroadcast.On("RawLog").Return(rawLog).Maybe() logBroadcast.On("String").Return("").Maybe() uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) uni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) uni.db.On("SaveLatestRoundRequested", mock.Anything, mock.MatchedBy(func(rr ocr2aggregator.OCR2AggregatorRoundRequested) bool { return rr.Epoch == 1 && rr.Round == 1 })).Return(nil) uni.db.On("WithDataSource", mock.Anything).Return(uni.db) uni.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast) configDigest, epoch, round, err = uni.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) assert.Equal(t, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", configDigest.Hex()) assert.Equal(t, 1, int(epoch)) assert.Equal(t, 1, int(round)) // Same round with higher epoch supercedes rawLog2 := cltest.LogFromFixture(t, "../../../testdata/jsonrpc/ocr2_round_requested_log_1_9.json") logBroadcast2 := logmocks.NewBroadcast(t) logBroadcast2.On("RawLog").Return(rawLog2).Maybe() logBroadcast2.On("String").Return("").Maybe() uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) uni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) uni.db.On("SaveLatestRoundRequested", mock.Anything, mock.MatchedBy(func(rr ocr2aggregator.OCR2AggregatorRoundRequested) bool { return rr.Epoch == 1 && rr.Round == 9 })).Return(nil) uni.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast2) configDigest, epoch, round, err = uni.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) assert.Equal(t, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", configDigest.Hex()) assert.Equal(t, 1, int(epoch)) assert.Equal(t, 9, int(round)) // Same round with lower epoch is ignored uni.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast) configDigest, epoch, round, err = uni.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) assert.Equal(t, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", configDigest.Hex()) assert.Equal(t, 1, int(epoch)) assert.Equal(t, 9, int(round)) // Higher epoch with lower round supercedes rawLog3 := cltest.LogFromFixture(t, "../../../testdata/jsonrpc/ocr2_round_requested_log_2_1.json") rawLog3.Address = fixtureContract.Address() logBroadcast3 := logmocks.NewBroadcast(t) logBroadcast3.On("RawLog").Return(rawLog3).Maybe() logBroadcast3.On("String").Return("").Maybe() uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) uni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) uni.db.On("SaveLatestRoundRequested", mock.Anything, mock.MatchedBy(func(rr ocr2aggregator.OCR2AggregatorRoundRequested) bool { return rr.Epoch == 2 && rr.Round == 1 })).Return(nil) uni.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast3) configDigest, epoch, round, err = uni.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) assert.Equal(t, "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", configDigest.Hex()) assert.Equal(t, 2, int(epoch)) assert.Equal(t, 1, int(round)) })` $DIR/core/services/relay/evm/request_round_tracker_test.go: `logBroadcast.On("RawLog").Return(rawLog).Maybe()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `logBroadcast.On("String").Return("").Maybe()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `uni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `uni.db.On("SaveLatestRoundRequested", mock.Anything, mock.MatchedBy(func(rr ocr2aggregator.OCR2AggregatorRoundRequested) bool { return rr.Epoch == 1 && rr.Round == 1 })).Return(nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `uni.db.On("WithDataSource", mock.Anything).Return(uni.db)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `uni.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `configDigest, epoch, round, err = uni.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `logBroadcast2.On("RawLog").Return(rawLog2).Maybe()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `logBroadcast2.On("String").Return("").Maybe()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `uni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `uni.db.On("SaveLatestRoundRequested", mock.Anything, mock.MatchedBy(func(rr ocr2aggregator.OCR2AggregatorRoundRequested) bool { return rr.Epoch == 1 && rr.Round == 9 })).Return(nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `uni.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast2)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `configDigest, epoch, round, err = uni.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `uni.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `configDigest, epoch, round, err = uni.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `rawLog3.Address = fixtureContract.Address()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `logBroadcast3.On("RawLog").Return(rawLog3).Maybe()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `logBroadcast3.On("String").Return("").Maybe()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `uni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `uni.db.On("SaveLatestRoundRequested", mock.Anything, mock.MatchedBy(func(rr ocr2aggregator.OCR2AggregatorRoundRequested) bool { return rr.Epoch == 2 && rr.Round == 1 })).Return(nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `uni.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast3)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `configDigest, epoch, round, err = uni.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `t.Run("does not mark consumed or update state if latest round fails to save", func(t *testing.T) { uni := newContractTrackerUni(t, fixtureFilterer, fixtureContract) rawLog := cltest.LogFromFixture(t, "../../../testdata/jsonrpc/ocr2_round_requested_log_1_1.json") rawLog.Address = fixtureContract.Address() logBroadcast := logmocks.NewBroadcast(t) logBroadcast.On("RawLog").Return(rawLog).Maybe() logBroadcast.On("String").Return("").Maybe() uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) uni.db.On("SaveLatestRoundRequested", mock.Anything, mock.Anything).Return(errors.New("something exploded")) uni.db.On("WithDataSource", mock.Anything).Return(uni.db) uni.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast) configDigest, epoch, round, err := uni.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) require.Equal(t, ocrtypes.ConfigDigest{}, configDigest) require.Equal(t, 0, int(round)) require.Equal(t, 0, int(epoch)) })` $DIR/core/services/relay/evm/request_round_tracker_test.go: `rawLog.Address = fixtureContract.Address()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `logBroadcast.On("RawLog").Return(rawLog).Maybe()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `logBroadcast.On("String").Return("").Maybe()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `uni.db.On("SaveLatestRoundRequested", mock.Anything, mock.Anything).Return(errors.New("something exploded"))` $DIR/core/services/relay/evm/request_round_tracker_test.go: `uni.db.On("WithDataSource", mock.Anything).Return(uni.db)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `uni.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `uni.lb.On("Register", uni.requestRoundTracker, mock.Anything).Return(func() { eventuallyCloseLogBroadcaster.ItHappened() })` $DIR/core/services/relay/evm/request_round_tracker_test.go: `eventuallyCloseLogBroadcaster.ItHappened()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `uni.lb.On("IsConnected").Return(true).Maybe()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `uni.db.On("LoadLatestRoundRequested", mock.Anything).Return(rr, nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `eventuallyCloseLogBroadcaster.AssertHappened(t, true)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `t.Run(test.name, func(t *testing.T) { res := evm.IsLaterThan(test.incoming, test.existing) assert.Equal(t, test.expected, res) })` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.HexToAddress("0x03bd0d5d39629423979f8a0e53dbce78c1791ebf")` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Run("does not update if contract address doesn't match", func(t *testing.T) { uni := newContractTrackerUni(t) logBroadcast := logmocks.NewBroadcast(t) rawLog := cltest.LogFromFixture(t, "../../../testdata/jsonrpc/ocr2_round_requested_log_1_1.json") logBroadcast.On("RawLog").Return(rawLog).Maybe() logBroadcast.On("String").Return("").Maybe() uni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) configDigest, epoch, round, err := uni.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) require.Equal(t, ocrtypes.ConfigDigest{}, configDigest) require.Equal(t, 0, int(round)) require.Equal(t, 0, int(epoch)) uni.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast) configDigest, epoch, round, err = uni.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) require.Equal(t, ocrtypes.ConfigDigest{}, configDigest) require.Equal(t, 0, int(round)) require.Equal(t, 0, int(epoch)) })` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.NewBroadcast(t)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.LogFromFixture(t, "../../../testdata/jsonrpc/ocr2_round_requested_log_1_1.json")` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.On("RawLog")` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return(rawLog)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Maybe()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.On("String")` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return("")` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Maybe()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return(nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return(false, nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Context(t)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Context(t)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Context(t)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Run("does nothing if log has already been consumed", func(t *testing.T) { uni := newContractTrackerUni(t, fixtureFilterer, fixtureContract) logBroadcast := logmocks.NewBroadcast(t) logBroadcast.On("String").Return("").Maybe() uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(true, nil) configDigest, epoch, round, err := uni.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) require.Equal(t, ocrtypes.ConfigDigest{}, configDigest) require.Equal(t, 0, int(round)) require.Equal(t, 0, int(epoch)) uni.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast) configDigest, epoch, round, err = uni.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) require.Equal(t, ocrtypes.ConfigDigest{}, configDigest) require.Equal(t, 0, int(round)) require.Equal(t, 0, int(epoch)) })` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.NewBroadcast(t)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.On("String")` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return("")` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Maybe()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return(true, nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Context(t)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Context(t)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Context(t)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Run("for new round requested log", func(t *testing.T) { uni := newContractTrackerUni(t, fixtureFilterer, fixtureContract) configDigest, epoch, round, err := uni.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) require.Equal(t, ocrtypes.ConfigDigest{}, configDigest) require.Equal(t, 0, int(round)) require.Equal(t, 0, int(epoch)) // Any round supercedes the 0 round rawLog := cltest.LogFromFixture(t, "../../../testdata/jsonrpc/ocr2_round_requested_log_1_1.json") logBroadcast := logmocks.NewBroadcast(t) logBroadcast.On("RawLog").Return(rawLog).Maybe() logBroadcast.On("String").Return("").Maybe() uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) uni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) uni.db.On("SaveLatestRoundRequested", mock.Anything, mock.MatchedBy(func(rr ocr2aggregator.OCR2AggregatorRoundRequested) bool { return rr.Epoch == 1 && rr.Round == 1 })).Return(nil) uni.db.On("WithDataSource", mock.Anything).Return(uni.db) uni.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast) configDigest, epoch, round, err = uni.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) assert.Equal(t, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", configDigest.Hex()) assert.Equal(t, 1, int(epoch)) assert.Equal(t, 1, int(round)) // Same round with higher epoch supercedes rawLog2 := cltest.LogFromFixture(t, "../../../testdata/jsonrpc/ocr2_round_requested_log_1_9.json") logBroadcast2 := logmocks.NewBroadcast(t) logBroadcast2.On("RawLog").Return(rawLog2).Maybe() logBroadcast2.On("String").Return("").Maybe() uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) uni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) uni.db.On("SaveLatestRoundRequested", mock.Anything, mock.MatchedBy(func(rr ocr2aggregator.OCR2AggregatorRoundRequested) bool { return rr.Epoch == 1 && rr.Round == 9 })).Return(nil) uni.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast2) configDigest, epoch, round, err = uni.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) assert.Equal(t, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", configDigest.Hex()) assert.Equal(t, 1, int(epoch)) assert.Equal(t, 9, int(round)) // Same round with lower epoch is ignored uni.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast) configDigest, epoch, round, err = uni.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) assert.Equal(t, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", configDigest.Hex()) assert.Equal(t, 1, int(epoch)) assert.Equal(t, 9, int(round)) // Higher epoch with lower round supercedes rawLog3 := cltest.LogFromFixture(t, "../../../testdata/jsonrpc/ocr2_round_requested_log_2_1.json") rawLog3.Address = fixtureContract.Address() logBroadcast3 := logmocks.NewBroadcast(t) logBroadcast3.On("RawLog").Return(rawLog3).Maybe() logBroadcast3.On("String").Return("").Maybe() uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) uni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil) uni.db.On("SaveLatestRoundRequested", mock.Anything, mock.MatchedBy(func(rr ocr2aggregator.OCR2AggregatorRoundRequested) bool { return rr.Epoch == 2 && rr.Round == 1 })).Return(nil) uni.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast3) configDigest, epoch, round, err = uni.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) assert.Equal(t, "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", configDigest.Hex()) assert.Equal(t, 2, int(epoch)) assert.Equal(t, 1, int(round)) })` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Context(t)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.LogFromFixture(t, "../../../testdata/jsonrpc/ocr2_round_requested_log_1_1.json")` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.NewBroadcast(t)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.On("RawLog")` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return(rawLog)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Maybe()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.On("String")` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return("")` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Maybe()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return(false, nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return(nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.db.On("SaveLatestRoundRequested", mock.Anything, mock.MatchedBy(func(rr ocr2aggregator.OCR2AggregatorRoundRequested) bool { return rr.Epoch == 1 && rr.Round == 1 }))` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.MatchedBy(func(rr ocr2aggregator.OCR2AggregatorRoundRequested) bool { return rr.Epoch == 1 && rr.Round == 1 })` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return(nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.db.On("WithDataSource", mock.Anything)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return(uni.db)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Context(t)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Context(t)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.LogFromFixture(t, "../../../testdata/jsonrpc/ocr2_round_requested_log_1_9.json")` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.NewBroadcast(t)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.On("RawLog")` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return(rawLog2)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Maybe()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.On("String")` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return("")` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Maybe()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return(false, nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return(nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.db.On("SaveLatestRoundRequested", mock.Anything, mock.MatchedBy(func(rr ocr2aggregator.OCR2AggregatorRoundRequested) bool { return rr.Epoch == 1 && rr.Round == 9 }))` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.MatchedBy(func(rr ocr2aggregator.OCR2AggregatorRoundRequested) bool { return rr.Epoch == 1 && rr.Round == 9 })` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return(nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast2)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Context(t)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Context(t)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Context(t)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Context(t)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.LogFromFixture(t, "../../../testdata/jsonrpc/ocr2_round_requested_log_2_1.json")` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Address()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.NewBroadcast(t)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.On("RawLog")` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return(rawLog3)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Maybe()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.On("String")` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return("")` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Maybe()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return(false, nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return(nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.db.On("SaveLatestRoundRequested", mock.Anything, mock.MatchedBy(func(rr ocr2aggregator.OCR2AggregatorRoundRequested) bool { return rr.Epoch == 2 && rr.Round == 1 }))` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.MatchedBy(func(rr ocr2aggregator.OCR2AggregatorRoundRequested) bool { return rr.Epoch == 2 && rr.Round == 1 })` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return(nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast3)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Context(t)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Context(t)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Run("does not mark consumed or update state if latest round fails to save", func(t *testing.T) { uni := newContractTrackerUni(t, fixtureFilterer, fixtureContract) rawLog := cltest.LogFromFixture(t, "../../../testdata/jsonrpc/ocr2_round_requested_log_1_1.json") rawLog.Address = fixtureContract.Address() logBroadcast := logmocks.NewBroadcast(t) logBroadcast.On("RawLog").Return(rawLog).Maybe() logBroadcast.On("String").Return("").Maybe() uni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil) uni.db.On("SaveLatestRoundRequested", mock.Anything, mock.Anything).Return(errors.New("something exploded")) uni.db.On("WithDataSource", mock.Anything).Return(uni.db) uni.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast) configDigest, epoch, round, err := uni.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0) require.NoError(t, err) require.Equal(t, ocrtypes.ConfigDigest{}, configDigest) require.Equal(t, 0, int(round)) require.Equal(t, 0, int(epoch)) })` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.LogFromFixture(t, "../../../testdata/jsonrpc/ocr2_round_requested_log_1_1.json")` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Address()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.NewBroadcast(t)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.On("RawLog")` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return(rawLog)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Maybe()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.On("String")` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return("")` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Maybe()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return(false, nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.db.On("SaveLatestRoundRequested", mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return(errors.New("something exploded"))` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.New("something exploded")` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.db.On("WithDataSource", mock.Anything)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return(uni.db)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.requestRoundTracker.HandleLog(tests.Context(t), logBroadcast)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Context(t)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Context(t)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.LogFromFixture(t, "../../../testdata/jsonrpc/ocr2_round_requested_log_1_1.json")` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.NewAddress()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.MakeConfigDigest(t)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.NewAwaiter()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.lb.On("Register", uni.requestRoundTracker, mock.Anything)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return(func() { eventuallyCloseLogBroadcaster.ItHappened() })` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.ItHappened()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.lb.On("IsConnected")` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return(true)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Maybe()` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.db.On("LoadLatestRoundRequested", mock.Anything)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Return(rr, nil)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Context(t)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.requestRoundTracker.LatestRoundRequested(testutils.Context(t), 0)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Context(t)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.AssertHappened(t, true)` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.Run(test.name, func(t *testing.T) { res := evm.IsLaterThan(test.incoming, test.existing) assert.Equal(t, test.expected, res) })` $DIR/core/services/relay/evm/request_round_tracker_test.go: `.IsLaterThan(test.incoming, test.existing)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `t.Run("basic types", func(t *testing.T) { type1, err := abi.NewType("uint16", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) type2, err := abi.NewType("string", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) type3, err := abi.NewType("uint24", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) type4, err := abi.NewType("int24", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) args := abi.Arguments{ {Name: "Field1", Type: type1}, {Name: "Field2", Type: type2}, {Name: "Field3", Type: type3}, {Name: "Field4", Type: type4}, } entry := NewCodecEntry(args, nil, nil) require.NoError(t, entry.Init()) checked := reflect.New(entry.CheckedType()) iChecked := reflect.Indirect(checked) f1 := uint16(2) iChecked.FieldByName("Field1").Set(reflect.ValueOf(&f1)) f2 := "any string" iChecked.FieldByName("Field2").Set(reflect.ValueOf(&f2)) f3 := big.NewInt( /*2^24 - 1*/ 16777215) setAndVerifyLimit(t, (*uint24)(f3), f3, iChecked.FieldByName("Field3")) f4 := big.NewInt( /*2^23 - 1*/ 8388607) setAndVerifyLimit(t, (*int24)(f4), f4, iChecked.FieldByName("Field4")) rNative, err := entry.ToNative(checked) require.NoError(t, err) iNative := reflect.Indirect(rNative) assert.Equal(t, iNative.Field(0).Interface(), iChecked.Field(0).Interface()) assert.Equal(t, iNative.Field(1).Interface(), iChecked.Field(1).Interface()) assert.Equal(t, iNative.Field(2).Interface(), f3) assert.Equal(t, iNative.Field(3).Interface(), f4) assertHaveSameStructureAndNames(t, iNative.Type(), entry.CheckedType()) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `iChecked.FieldByName("Field1").Set(reflect.ValueOf(&f1))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `iChecked.FieldByName("Field2").Set(reflect.ValueOf(&f2))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `setAndVerifyLimit(t, (*uint24)(f3), f3, iChecked.FieldByName("Field3"))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `setAndVerifyLimit(t, (*int24)(f4), f4, iChecked.FieldByName("Field4"))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `assertHaveSameStructureAndNames(t, iNative.Type(), entry.CheckedType())` $DIR/core/services/relay/evm/types/codec_entry_test.go: `t.Run("tuples", func(t *testing.T) { type1, err := abi.NewType("uint16", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) tupleType, err := abi.NewType("tuple", "", []abi.ArgumentMarshaling{ {Name: "Field3", Type: "uint24"}, {Name: "Field4", Type: "int24"}, }) require.NoError(t, err) args := abi.Arguments{ {Name: "Field1", Type: type1}, {Name: "Field2", Type: tupleType}, } entry := NewCodecEntry(args, nil, nil) require.NoError(t, entry.Init()) checked := reflect.New(entry.CheckedType()) iChecked := reflect.Indirect(checked) f1 := uint16(2) iChecked.FieldByName("Field1").Set(reflect.ValueOf(&f1)) f2 := iChecked.FieldByName("Field2") f2.Set(reflect.New(f2.Type().Elem())) f2 = reflect.Indirect(f2) f3 := big.NewInt( /*2^24 - 1*/ 16777215) setAndVerifyLimit(t, (*uint24)(f3), f3, f2.FieldByName("Field3")) f4 := big.NewInt( /*2^23 - 1*/ 8388607) setAndVerifyLimit(t, (*int24)(f4), f4, f2.FieldByName("Field4")) native, err := entry.ToNative(checked) require.NoError(t, err) iNative := reflect.Indirect(native) require.Equal(t, iNative.Field(0).Interface(), iChecked.Field(0).Interface()) nF2 := reflect.Indirect(iNative.Field(1)) assert.Equal(t, nF2.Field(0).Interface(), f3) assert.Equal(t, nF2.Field(1).Interface(), f4) assertHaveSameStructureAndNames(t, iNative.Type(), entry.CheckedType()) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `iChecked.FieldByName("Field1").Set(reflect.ValueOf(&f1))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `f2.Set(reflect.New(f2.Type().Elem()))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `f2 = reflect.Indirect(f2)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `setAndVerifyLimit(t, (*uint24)(f3), f3, f2.FieldByName("Field3"))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `setAndVerifyLimit(t, (*int24)(f4), f4, f2.FieldByName("Field4"))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `assertHaveSameStructureAndNames(t, iNative.Type(), entry.CheckedType())` $DIR/core/services/relay/evm/types/codec_entry_test.go: `t.Run("nested tuple member names are capitalized", func(t *testing.T) { type1, err := abi.NewType("uint16", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) tupleType, err := abi.NewType("tuple", "", []abi.ArgumentMarshaling{ {Name: "field3", Type: "uint24"}, {Name: "field4", Type: "int24"}, }) require.NoError(t, err) args := abi.Arguments{ {Name: "field1", Type: type1}, {Name: "field2", Type: tupleType}, } entry := NewCodecEntry(args, nil, nil) require.NoError(t, entry.Init()) checked := reflect.New(entry.CheckedType()) iChecked := reflect.Indirect(checked) f1 := uint16(2) iChecked.FieldByName("Field1").Set(reflect.ValueOf(&f1)) f2 := iChecked.FieldByName("Field2") f2.Set(reflect.New(f2.Type().Elem())) f2 = reflect.Indirect(f2) f3 := big.NewInt( /*2^24 - 1*/ 16777215) setAndVerifyLimit(t, (*uint24)(f3), f3, f2.FieldByName("Field3")) f4 := big.NewInt( /*2^23 - 1*/ 8388607) setAndVerifyLimit(t, (*int24)(f4), f4, f2.FieldByName("Field4")) native, err := entry.ToNative(checked) require.NoError(t, err) iNative := reflect.Indirect(native) require.Equal(t, iNative.Field(0).Interface(), iChecked.Field(0).Interface()) nF2 := reflect.Indirect(iNative.Field(1)) assert.Equal(t, nF2.Field(0).Interface(), f3) assert.Equal(t, nF2.Field(1).Interface(), f4) assertHaveSameStructureAndNames(t, iNative.Type(), entry.CheckedType()) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `iChecked.FieldByName("Field1").Set(reflect.ValueOf(&f1))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `f2.Set(reflect.New(f2.Type().Elem()))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `f2 = reflect.Indirect(f2)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `setAndVerifyLimit(t, (*uint24)(f3), f3, f2.FieldByName("Field3"))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `setAndVerifyLimit(t, (*int24)(f4), f4, f2.FieldByName("Field4"))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `assertHaveSameStructureAndNames(t, iNative.Type(), entry.CheckedType())` $DIR/core/services/relay/evm/types/codec_entry_test.go: `t.Run("unwrapped types", func(t *testing.T) { // This exists to allow you to decode single returned values without naming the parameter wrappedTuple, err := abi.NewType("tuple", "", []abi.ArgumentMarshaling{ {Name: "Field1", Type: "int16"}, }) require.NoError(t, err) entry := NewCodecEntry(abi.Arguments{{Name: "", Type: wrappedTuple}}, nil, nil) require.NoError(t, entry.Init()) checked := reflect.New(entry.CheckedType()) iChecked := reflect.Indirect(checked) anyValue := int16(2) iChecked.FieldByName("Field1").Set(reflect.ValueOf(&anyValue)) native, err := entry.ToNative(checked) require.NoError(t, err) iNative := reflect.Indirect(native) assert.Equal(t, &anyValue, iNative.FieldByName("Field1").Interface()) assertHaveSameStructureAndNames(t, iNative.Type(), entry.CheckedType()) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `iChecked.FieldByName("Field1").Set(reflect.ValueOf(&anyValue))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `assertHaveSameStructureAndNames(t, iNative.Type(), entry.CheckedType())` $DIR/core/services/relay/evm/types/codec_entry_test.go: `t.Run("slice types", func(t *testing.T) { type1, err := abi.NewType("int16[]", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) entry := NewCodecEntry(abi.Arguments{{Name: "Field1", Type: type1}}, nil, nil) require.NoError(t, entry.Init()) checked := reflect.New(entry.CheckedType()) iChecked := reflect.Indirect(checked) anySliceValue := &[]int16{2, 3} iChecked.FieldByName("Field1").Set(reflect.ValueOf(anySliceValue)) native, err := entry.ToNative(checked) require.NoError(t, err) iNative := reflect.Indirect(native) assert.Equal(t, anySliceValue, iNative.FieldByName("Field1").Interface()) assertHaveSameStructureAndNames(t, iNative.Type(), entry.CheckedType()) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `iChecked.FieldByName("Field1").Set(reflect.ValueOf(anySliceValue))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `assertHaveSameStructureAndNames(t, iNative.Type(), entry.CheckedType())` $DIR/core/services/relay/evm/types/codec_entry_test.go: `t.Run("array types", func(t *testing.T) { type1, err := abi.NewType("int16[3]", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) entry := NewCodecEntry(abi.Arguments{{Name: "Field1", Type: type1}}, nil, nil) require.NoError(t, entry.Init()) checked := reflect.New(entry.CheckedType()) iChecked := reflect.Indirect(checked) anySliceValue := &[3]int16{2, 3, 30} iChecked.FieldByName("Field1").Set(reflect.ValueOf(anySliceValue)) native, err := entry.ToNative(checked) require.NoError(t, err) iNative := reflect.Indirect(native) assert.Equal(t, anySliceValue, iNative.FieldByName("Field1").Interface()) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `iChecked.FieldByName("Field1").Set(reflect.ValueOf(anySliceValue))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `t.Run("Not return values makes struct{}", func(t *testing.T) { entry := NewCodecEntry(abi.Arguments{}, nil, nil) require.NoError(t, entry.Init()) assert.Equal(t, reflect.TypeOf(struct{}{}), entry.CheckedType()) native, err := entry.ToNative(reflect.ValueOf(&struct{}{})) require.NoError(t, err) assert.Equal(t, &struct{}{}, native.Interface()) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `t.Run("Address works", func(t *testing.T) { address, err := abi.NewType("address", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) entry := NewCodecEntry(abi.Arguments{{Name: "foo", Type: address}}, nil, nil) require.NoError(t, entry.Init()) checked := reflect.New(entry.CheckedType()) iChecked := reflect.Indirect(checked) anyAddr := &common.Address{1, 2, 3} iChecked.FieldByName("Foo").Set(reflect.ValueOf(anyAddr)) native, err := entry.ToNative(checked) require.NoError(t, err) iNative := reflect.Indirect(native) assert.Equal(t, anyAddr, iNative.FieldByName("Foo").Interface()) assertHaveSameStructureAndNames(t, iNative.Type(), entry.CheckedType()) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `iChecked.FieldByName("Foo").Set(reflect.ValueOf(anyAddr))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `assertHaveSameStructureAndNames(t, iNative.Type(), entry.CheckedType())` $DIR/core/services/relay/evm/types/codec_entry_test.go: `t.Run("Unnamed parameters are named after their locations", func(t *testing.T) { // use different types to make sure that the right fields have the right types. anyType1, err := abi.NewType("int64", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) anyType2, err := abi.NewType("int32", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) entry := NewCodecEntry(abi.Arguments{{Name: "", Type: anyType1}, {Name: "", Type: anyType2}}, nil, nil) assert.NoError(t, entry.Init()) ct := entry.CheckedType() require.Equal(t, 2, ct.NumField()) f0 := ct.Field(0) assert.Equal(t, "F0", f0.Name) assert.Equal(t, reflect.TypeOf((*int64)(nil)), f0.Type) f1 := ct.Field(1) assert.Equal(t, "F1", f1.Name) assert.Equal(t, reflect.TypeOf((*int32)(nil)), f1.Type) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `t.Run("Unnamed parameters adds _Xes at the end if their location name is taken", func(t *testing.T) { // use different types to make sure that the right fields have the right types. anyType1, err := abi.NewType("int64", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) anyType2, err := abi.NewType("int32", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) entry := NewCodecEntry(abi.Arguments{{Name: "F1", Type: anyType1}, {Name: "", Type: anyType2}}, nil, nil) assert.NoError(t, entry.Init()) ct := entry.CheckedType() require.Equal(t, 2, ct.NumField()) f0 := ct.Field(0) assert.Equal(t, "F1", f0.Name) assert.Equal(t, reflect.TypeOf((*int64)(nil)), f0.Type) f1 := ct.Field(1) assert.Equal(t, "F1_X", f1.Name) assert.Equal(t, reflect.TypeOf((*int32)(nil)), f1.Type) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `t.Run("Multiple abi arguments with the same name returns an error", func(t *testing.T) { anyType, err := abi.NewType("int16[3]", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) entry := NewCodecEntry(abi.Arguments{{Name: "Name", Type: anyType}, {Name: "Name", Type: anyType}}, nil, nil) assert.True(t, errors.Is(entry.Init(), commontypes.ErrInvalidConfig)) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `t.Run("Indexed basic types leave their native and checked types as-is", func(t *testing.T) { anyType, err := abi.NewType("int16", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) entry := NewCodecEntry(abi.Arguments{{Name: "Name", Type: anyType, Indexed: true}}, nil, nil) require.NoError(t, entry.Init()) checkedField, ok := entry.CheckedType().FieldByName("Name") require.True(t, ok) assert.Equal(t, reflect.TypeOf((*int16)(nil)), checkedField.Type) native, err := entry.ToNative(reflect.New(entry.CheckedType())) require.NoError(t, err) iNative := reflect.Indirect(native) assertHaveSameStructureAndNames(t, iNative.Type(), entry.CheckedType()) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `assertHaveSameStructureAndNames(t, iNative.Type(), entry.CheckedType())` $DIR/core/services/relay/evm/types/codec_entry_test.go: `t.Run("Indexed non basic types change to hash", func(t *testing.T) { anyType, err := abi.NewType("string", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) entry := NewCodecEntry(abi.Arguments{{Name: "Name", Type: anyType, Indexed: true}}, nil, nil) require.NoError(t, entry.Init()) nativeField, ok := entry.CheckedType().FieldByName("Name") require.True(t, ok) assert.Equal(t, reflect.TypeOf(&common.Hash{}), nativeField.Type) native, err := entry.ToNative(reflect.New(entry.CheckedType())) require.NoError(t, err) assertHaveSameStructureAndNames(t, native.Type().Elem(), entry.CheckedType()) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `assertHaveSameStructureAndNames(t, native.Type().Elem(), entry.CheckedType())` $DIR/core/services/relay/evm/types/codec_entry_test.go: `t.Run("Too many indexed items returns an error", func(t *testing.T) { anyType, err := abi.NewType("int16", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) entry := NewCodecEntry( abi.Arguments{ {Name: "Name1", Type: anyType, Indexed: true}, {Name: "Name2", Type: anyType, Indexed: true}, {Name: "Name3", Type: anyType, Indexed: true}, {Name: "Name4", Type: anyType, Indexed: true}, }, nil, nil) require.True(t, errors.Is(entry.Init(), commontypes.ErrInvalidConfig)) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `t.Run("Using unsupported types by go-ethereum returns an error", func(t *testing.T) { anyType, err := abi.NewType("int256[2]", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) entry := NewCodecEntry(abi.Arguments{{Name: "Name", Type: anyType, Indexed: true}}, nil, nil) assert.True(t, errors.Is(entry.Init(), commontypes.ErrInvalidConfig)) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `t.Run("Modifier returns provided modifier", func(t *testing.T) { anyType, err := abi.NewType("int16", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) mod := codec.NewRenamer(map[string]string{"Name": "RenamedName"}) entry := NewCodecEntry(abi.Arguments{{Name: "Name", Type: anyType, Indexed: true}}, nil, mod) assert.Equal(t, mod, entry.Modifier()) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Run("basic types", func(t *testing.T) { type1, err := abi.NewType("uint16", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) type2, err := abi.NewType("string", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) type3, err := abi.NewType("uint24", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) type4, err := abi.NewType("int24", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) args := abi.Arguments{ {Name: "Field1", Type: type1}, {Name: "Field2", Type: type2}, {Name: "Field3", Type: type3}, {Name: "Field4", Type: type4}, } entry := NewCodecEntry(args, nil, nil) require.NoError(t, entry.Init()) checked := reflect.New(entry.CheckedType()) iChecked := reflect.Indirect(checked) f1 := uint16(2) iChecked.FieldByName("Field1").Set(reflect.ValueOf(&f1)) f2 := "any string" iChecked.FieldByName("Field2").Set(reflect.ValueOf(&f2)) f3 := big.NewInt( /*2^24 - 1*/ 16777215) setAndVerifyLimit(t, (*uint24)(f3), f3, iChecked.FieldByName("Field3")) f4 := big.NewInt( /*2^23 - 1*/ 8388607) setAndVerifyLimit(t, (*int24)(f4), f4, iChecked.FieldByName("Field4")) rNative, err := entry.ToNative(checked) require.NoError(t, err) iNative := reflect.Indirect(rNative) assert.Equal(t, iNative.Field(0).Interface(), iChecked.Field(0).Interface()) assert.Equal(t, iNative.Field(1).Interface(), iChecked.Field(1).Interface()) assert.Equal(t, iNative.Field(2).Interface(), f3) assert.Equal(t, iNative.Field(3).Interface(), f4) assertHaveSameStructureAndNames(t, iNative.Type(), entry.CheckedType()) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewType("uint16", "", []abi.ArgumentMarshaling{})` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewType("string", "", []abi.ArgumentMarshaling{})` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewType("uint24", "", []abi.ArgumentMarshaling{})` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewType("int24", "", []abi.ArgumentMarshaling{})` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.New(entry.CheckedType())` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.CheckedType()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Indirect(checked)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.FieldByName("Field1")` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Set(reflect.ValueOf(&f1))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.ValueOf(&f1)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.FieldByName("Field2")` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Set(reflect.ValueOf(&f2))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.ValueOf(&f2)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewInt( /*2^24 - 1*/ 16777215)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.FieldByName("Field3")` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewInt( /*2^23 - 1*/ 8388607)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.FieldByName("Field4")` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.ToNative(checked)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Indirect(rNative)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Type()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.CheckedType()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Run("tuples", func(t *testing.T) { type1, err := abi.NewType("uint16", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) tupleType, err := abi.NewType("tuple", "", []abi.ArgumentMarshaling{ {Name: "Field3", Type: "uint24"}, {Name: "Field4", Type: "int24"}, }) require.NoError(t, err) args := abi.Arguments{ {Name: "Field1", Type: type1}, {Name: "Field2", Type: tupleType}, } entry := NewCodecEntry(args, nil, nil) require.NoError(t, entry.Init()) checked := reflect.New(entry.CheckedType()) iChecked := reflect.Indirect(checked) f1 := uint16(2) iChecked.FieldByName("Field1").Set(reflect.ValueOf(&f1)) f2 := iChecked.FieldByName("Field2") f2.Set(reflect.New(f2.Type().Elem())) f2 = reflect.Indirect(f2) f3 := big.NewInt( /*2^24 - 1*/ 16777215) setAndVerifyLimit(t, (*uint24)(f3), f3, f2.FieldByName("Field3")) f4 := big.NewInt( /*2^23 - 1*/ 8388607) setAndVerifyLimit(t, (*int24)(f4), f4, f2.FieldByName("Field4")) native, err := entry.ToNative(checked) require.NoError(t, err) iNative := reflect.Indirect(native) require.Equal(t, iNative.Field(0).Interface(), iChecked.Field(0).Interface()) nF2 := reflect.Indirect(iNative.Field(1)) assert.Equal(t, nF2.Field(0).Interface(), f3) assert.Equal(t, nF2.Field(1).Interface(), f4) assertHaveSameStructureAndNames(t, iNative.Type(), entry.CheckedType()) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewType("uint16", "", []abi.ArgumentMarshaling{})` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewType("tuple", "", []abi.ArgumentMarshaling{ {Name: "Field3", Type: "uint24"}, {Name: "Field4", Type: "int24"}, })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.New(entry.CheckedType())` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.CheckedType()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Indirect(checked)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.FieldByName("Field1")` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Set(reflect.ValueOf(&f1))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.ValueOf(&f1)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.FieldByName("Field2")` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Set(reflect.New(f2.Type().Elem()))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.New(f2.Type().Elem())` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Type()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Elem()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Indirect(f2)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewInt( /*2^24 - 1*/ 16777215)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.FieldByName("Field3")` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewInt( /*2^23 - 1*/ 8388607)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.FieldByName("Field4")` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.ToNative(checked)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Indirect(native)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Indirect(iNative.Field(1))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Field(1)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Type()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.CheckedType()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Run("nested tuple member names are capitalized", func(t *testing.T) { type1, err := abi.NewType("uint16", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) tupleType, err := abi.NewType("tuple", "", []abi.ArgumentMarshaling{ {Name: "field3", Type: "uint24"}, {Name: "field4", Type: "int24"}, }) require.NoError(t, err) args := abi.Arguments{ {Name: "field1", Type: type1}, {Name: "field2", Type: tupleType}, } entry := NewCodecEntry(args, nil, nil) require.NoError(t, entry.Init()) checked := reflect.New(entry.CheckedType()) iChecked := reflect.Indirect(checked) f1 := uint16(2) iChecked.FieldByName("Field1").Set(reflect.ValueOf(&f1)) f2 := iChecked.FieldByName("Field2") f2.Set(reflect.New(f2.Type().Elem())) f2 = reflect.Indirect(f2) f3 := big.NewInt( /*2^24 - 1*/ 16777215) setAndVerifyLimit(t, (*uint24)(f3), f3, f2.FieldByName("Field3")) f4 := big.NewInt( /*2^23 - 1*/ 8388607) setAndVerifyLimit(t, (*int24)(f4), f4, f2.FieldByName("Field4")) native, err := entry.ToNative(checked) require.NoError(t, err) iNative := reflect.Indirect(native) require.Equal(t, iNative.Field(0).Interface(), iChecked.Field(0).Interface()) nF2 := reflect.Indirect(iNative.Field(1)) assert.Equal(t, nF2.Field(0).Interface(), f3) assert.Equal(t, nF2.Field(1).Interface(), f4) assertHaveSameStructureAndNames(t, iNative.Type(), entry.CheckedType()) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewType("uint16", "", []abi.ArgumentMarshaling{})` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewType("tuple", "", []abi.ArgumentMarshaling{ {Name: "field3", Type: "uint24"}, {Name: "field4", Type: "int24"}, })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.New(entry.CheckedType())` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.CheckedType()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Indirect(checked)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.FieldByName("Field1")` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Set(reflect.ValueOf(&f1))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.ValueOf(&f1)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.FieldByName("Field2")` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Set(reflect.New(f2.Type().Elem()))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.New(f2.Type().Elem())` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Type()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Elem()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Indirect(f2)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewInt( /*2^24 - 1*/ 16777215)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.FieldByName("Field3")` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewInt( /*2^23 - 1*/ 8388607)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.FieldByName("Field4")` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.ToNative(checked)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Indirect(native)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Indirect(iNative.Field(1))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Field(1)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Type()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.CheckedType()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Run("unwrapped types", func(t *testing.T) { // This exists to allow you to decode single returned values without naming the parameter wrappedTuple, err := abi.NewType("tuple", "", []abi.ArgumentMarshaling{ {Name: "Field1", Type: "int16"}, }) require.NoError(t, err) entry := NewCodecEntry(abi.Arguments{{Name: "", Type: wrappedTuple}}, nil, nil) require.NoError(t, entry.Init()) checked := reflect.New(entry.CheckedType()) iChecked := reflect.Indirect(checked) anyValue := int16(2) iChecked.FieldByName("Field1").Set(reflect.ValueOf(&anyValue)) native, err := entry.ToNative(checked) require.NoError(t, err) iNative := reflect.Indirect(native) assert.Equal(t, &anyValue, iNative.FieldByName("Field1").Interface()) assertHaveSameStructureAndNames(t, iNative.Type(), entry.CheckedType()) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewType("tuple", "", []abi.ArgumentMarshaling{ {Name: "Field1", Type: "int16"}, })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.New(entry.CheckedType())` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.CheckedType()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Indirect(checked)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.FieldByName("Field1")` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Set(reflect.ValueOf(&anyValue))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.ValueOf(&anyValue)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.ToNative(checked)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Indirect(native)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Type()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.CheckedType()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Run("slice types", func(t *testing.T) { type1, err := abi.NewType("int16[]", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) entry := NewCodecEntry(abi.Arguments{{Name: "Field1", Type: type1}}, nil, nil) require.NoError(t, entry.Init()) checked := reflect.New(entry.CheckedType()) iChecked := reflect.Indirect(checked) anySliceValue := &[]int16{2, 3} iChecked.FieldByName("Field1").Set(reflect.ValueOf(anySliceValue)) native, err := entry.ToNative(checked) require.NoError(t, err) iNative := reflect.Indirect(native) assert.Equal(t, anySliceValue, iNative.FieldByName("Field1").Interface()) assertHaveSameStructureAndNames(t, iNative.Type(), entry.CheckedType()) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewType("int16[]", "", []abi.ArgumentMarshaling{})` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.New(entry.CheckedType())` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.CheckedType()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Indirect(checked)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.FieldByName("Field1")` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Set(reflect.ValueOf(anySliceValue))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.ValueOf(anySliceValue)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.ToNative(checked)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Indirect(native)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Type()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.CheckedType()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Run("array types", func(t *testing.T) { type1, err := abi.NewType("int16[3]", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) entry := NewCodecEntry(abi.Arguments{{Name: "Field1", Type: type1}}, nil, nil) require.NoError(t, entry.Init()) checked := reflect.New(entry.CheckedType()) iChecked := reflect.Indirect(checked) anySliceValue := &[3]int16{2, 3, 30} iChecked.FieldByName("Field1").Set(reflect.ValueOf(anySliceValue)) native, err := entry.ToNative(checked) require.NoError(t, err) iNative := reflect.Indirect(native) assert.Equal(t, anySliceValue, iNative.FieldByName("Field1").Interface()) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewType("int16[3]", "", []abi.ArgumentMarshaling{})` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.New(entry.CheckedType())` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.CheckedType()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Indirect(checked)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.FieldByName("Field1")` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Set(reflect.ValueOf(anySliceValue))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.ValueOf(anySliceValue)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.ToNative(checked)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Indirect(native)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Run("Not return values makes struct{}", func(t *testing.T) { entry := NewCodecEntry(abi.Arguments{}, nil, nil) require.NoError(t, entry.Init()) assert.Equal(t, reflect.TypeOf(struct{}{}), entry.CheckedType()) native, err := entry.ToNative(reflect.ValueOf(&struct{}{})) require.NoError(t, err) assert.Equal(t, &struct{}{}, native.Interface()) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.ToNative(reflect.ValueOf(&struct{}{}))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.ValueOf(&struct{}{})` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Run("Address works", func(t *testing.T) { address, err := abi.NewType("address", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) entry := NewCodecEntry(abi.Arguments{{Name: "foo", Type: address}}, nil, nil) require.NoError(t, entry.Init()) checked := reflect.New(entry.CheckedType()) iChecked := reflect.Indirect(checked) anyAddr := &common.Address{1, 2, 3} iChecked.FieldByName("Foo").Set(reflect.ValueOf(anyAddr)) native, err := entry.ToNative(checked) require.NoError(t, err) iNative := reflect.Indirect(native) assert.Equal(t, anyAddr, iNative.FieldByName("Foo").Interface()) assertHaveSameStructureAndNames(t, iNative.Type(), entry.CheckedType()) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewType("address", "", []abi.ArgumentMarshaling{})` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.New(entry.CheckedType())` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.CheckedType()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Indirect(checked)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.FieldByName("Foo")` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Set(reflect.ValueOf(anyAddr))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.ValueOf(anyAddr)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.ToNative(checked)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Indirect(native)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Type()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.CheckedType()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Run("Unnamed parameters are named after their locations", func(t *testing.T) { // use different types to make sure that the right fields have the right types. anyType1, err := abi.NewType("int64", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) anyType2, err := abi.NewType("int32", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) entry := NewCodecEntry(abi.Arguments{{Name: "", Type: anyType1}, {Name: "", Type: anyType2}}, nil, nil) assert.NoError(t, entry.Init()) ct := entry.CheckedType() require.Equal(t, 2, ct.NumField()) f0 := ct.Field(0) assert.Equal(t, "F0", f0.Name) assert.Equal(t, reflect.TypeOf((*int64)(nil)), f0.Type) f1 := ct.Field(1) assert.Equal(t, "F1", f1.Name) assert.Equal(t, reflect.TypeOf((*int32)(nil)), f1.Type) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewType("int64", "", []abi.ArgumentMarshaling{})` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewType("int32", "", []abi.ArgumentMarshaling{})` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.CheckedType()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Field(0)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Field(1)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Run("Unnamed parameters adds _Xes at the end if their location name is taken", func(t *testing.T) { // use different types to make sure that the right fields have the right types. anyType1, err := abi.NewType("int64", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) anyType2, err := abi.NewType("int32", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) entry := NewCodecEntry(abi.Arguments{{Name: "F1", Type: anyType1}, {Name: "", Type: anyType2}}, nil, nil) assert.NoError(t, entry.Init()) ct := entry.CheckedType() require.Equal(t, 2, ct.NumField()) f0 := ct.Field(0) assert.Equal(t, "F1", f0.Name) assert.Equal(t, reflect.TypeOf((*int64)(nil)), f0.Type) f1 := ct.Field(1) assert.Equal(t, "F1_X", f1.Name) assert.Equal(t, reflect.TypeOf((*int32)(nil)), f1.Type) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewType("int64", "", []abi.ArgumentMarshaling{})` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewType("int32", "", []abi.ArgumentMarshaling{})` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.CheckedType()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Field(0)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Field(1)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Run("Multiple abi arguments with the same name returns an error", func(t *testing.T) { anyType, err := abi.NewType("int16[3]", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) entry := NewCodecEntry(abi.Arguments{{Name: "Name", Type: anyType}, {Name: "Name", Type: anyType}}, nil, nil) assert.True(t, errors.Is(entry.Init(), commontypes.ErrInvalidConfig)) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewType("int16[3]", "", []abi.ArgumentMarshaling{})` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Run("Indexed basic types leave their native and checked types as-is", func(t *testing.T) { anyType, err := abi.NewType("int16", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) entry := NewCodecEntry(abi.Arguments{{Name: "Name", Type: anyType, Indexed: true}}, nil, nil) require.NoError(t, entry.Init()) checkedField, ok := entry.CheckedType().FieldByName("Name") require.True(t, ok) assert.Equal(t, reflect.TypeOf((*int16)(nil)), checkedField.Type) native, err := entry.ToNative(reflect.New(entry.CheckedType())) require.NoError(t, err) iNative := reflect.Indirect(native) assertHaveSameStructureAndNames(t, iNative.Type(), entry.CheckedType()) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewType("int16", "", []abi.ArgumentMarshaling{})` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.CheckedType()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.FieldByName("Name")` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.ToNative(reflect.New(entry.CheckedType()))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.New(entry.CheckedType())` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.CheckedType()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Indirect(native)` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Type()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.CheckedType()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Run("Indexed non basic types change to hash", func(t *testing.T) { anyType, err := abi.NewType("string", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) entry := NewCodecEntry(abi.Arguments{{Name: "Name", Type: anyType, Indexed: true}}, nil, nil) require.NoError(t, entry.Init()) nativeField, ok := entry.CheckedType().FieldByName("Name") require.True(t, ok) assert.Equal(t, reflect.TypeOf(&common.Hash{}), nativeField.Type) native, err := entry.ToNative(reflect.New(entry.CheckedType())) require.NoError(t, err) assertHaveSameStructureAndNames(t, native.Type().Elem(), entry.CheckedType()) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewType("string", "", []abi.ArgumentMarshaling{})` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.CheckedType()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.FieldByName("Name")` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.ToNative(reflect.New(entry.CheckedType()))` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.New(entry.CheckedType())` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.CheckedType()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Type()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Elem()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.CheckedType()` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Run("Too many indexed items returns an error", func(t *testing.T) { anyType, err := abi.NewType("int16", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) entry := NewCodecEntry( abi.Arguments{ {Name: "Name1", Type: anyType, Indexed: true}, {Name: "Name2", Type: anyType, Indexed: true}, {Name: "Name3", Type: anyType, Indexed: true}, {Name: "Name4", Type: anyType, Indexed: true}, }, nil, nil) require.True(t, errors.Is(entry.Init(), commontypes.ErrInvalidConfig)) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewType("int16", "", []abi.ArgumentMarshaling{})` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Run("Using unsupported types by go-ethereum returns an error", func(t *testing.T) { anyType, err := abi.NewType("int256[2]", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) entry := NewCodecEntry(abi.Arguments{{Name: "Name", Type: anyType, Indexed: true}}, nil, nil) assert.True(t, errors.Is(entry.Init(), commontypes.ErrInvalidConfig)) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewType("int256[2]", "", []abi.ArgumentMarshaling{})` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.Run("Modifier returns provided modifier", func(t *testing.T) { anyType, err := abi.NewType("int16", "", []abi.ArgumentMarshaling{}) require.NoError(t, err) mod := codec.NewRenamer(map[string]string{"Name": "RenamedName"}) entry := NewCodecEntry(abi.Arguments{{Name: "Name", Type: anyType, Indexed: true}}, nil, mod) assert.Equal(t, mod, entry.Modifier()) })` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewType("int16", "", []abi.ArgumentMarshaling{})` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewRenamer(map[string]string{"Name": "RenamedName"})` $DIR/core/services/relay/evm/types/codec_entry_test.go: `.NewType("int16", "", []abi.ArgumentMarshaling{})` $DIR/core/services/relay/evm/types/int_types_test.go: `t.Run(fmt.Sprintf("int%v", i), func(t *testing.T) { tpe, ok := GetAbiEncodingType(fmt.Sprintf("int%v", i)) require.True(t, ok) minVal := new(big.Int).Neg(new(big.Int).Exp(big.NewInt(2), big.NewInt(int64(i-1)), nil)) maxVal := new(big.Int).Sub(new(big.Int).Exp(big.NewInt(2), big.NewInt(int64(i-1)), nil), big.NewInt(1)) assertBigIntBounds(t, tpe, minVal, maxVal) })` $DIR/core/services/relay/evm/types/int_types_test.go: `assertBigIntBounds(t, tpe, minVal, maxVal)` $DIR/core/services/relay/evm/types/int_types_test.go: `t.Run(fmt.Sprintf("uint%v", i), func(t *testing.T) { tep, ok := GetAbiEncodingType(fmt.Sprintf("uint%v", i)) require.True(t, ok) minVal := big.NewInt(0) maxVal := new(big.Int).Sub(new(big.Int).Exp(big.NewInt(2), big.NewInt(int64(i)), nil), big.NewInt(1)) assertBigIntBounds(t, tep, minVal, maxVal) })` $DIR/core/services/relay/evm/types/int_types_test.go: `assertBigIntBounds(t, tep, minVal, maxVal)` $DIR/core/services/relay/evm/types/int_types_test.go: `.Run(fmt.Sprintf("int%v", i), func(t *testing.T) { tpe, ok := GetAbiEncodingType(fmt.Sprintf("int%v", i)) require.True(t, ok) minVal := new(big.Int).Neg(new(big.Int).Exp(big.NewInt(2), big.NewInt(int64(i-1)), nil)) maxVal := new(big.Int).Sub(new(big.Int).Exp(big.NewInt(2), big.NewInt(int64(i-1)), nil), big.NewInt(1)) assertBigIntBounds(t, tpe, minVal, maxVal) })` $DIR/core/services/relay/evm/types/int_types_test.go: `.Sprintf("int%v", i)` $DIR/core/services/relay/evm/types/int_types_test.go: `.Sprintf("int%v", i)` $DIR/core/services/relay/evm/types/int_types_test.go: `.Neg(new(big.Int).Exp(big.NewInt(2), big.NewInt(int64(i-1)), nil))` $DIR/core/services/relay/evm/types/int_types_test.go: `.Exp(big.NewInt(2), big.NewInt(int64(i-1)), nil)` $DIR/core/services/relay/evm/types/int_types_test.go: `.NewInt(2)` $DIR/core/services/relay/evm/types/int_types_test.go: `.NewInt(int64(i-1))` $DIR/core/services/relay/evm/types/int_types_test.go: `.Sub(new(big.Int).Exp(big.NewInt(2), big.NewInt(int64(i-1)), nil), big.NewInt(1))` $DIR/core/services/relay/evm/types/int_types_test.go: `.Exp(big.NewInt(2), big.NewInt(int64(i-1)), nil)` $DIR/core/services/relay/evm/types/int_types_test.go: `.NewInt(2)` $DIR/core/services/relay/evm/types/int_types_test.go: `.NewInt(int64(i-1))` $DIR/core/services/relay/evm/types/int_types_test.go: `.NewInt(1)` $DIR/core/services/relay/evm/types/int_types_test.go: `.Run(fmt.Sprintf("uint%v", i), func(t *testing.T) { tep, ok := GetAbiEncodingType(fmt.Sprintf("uint%v", i)) require.True(t, ok) minVal := big.NewInt(0) maxVal := new(big.Int).Sub(new(big.Int).Exp(big.NewInt(2), big.NewInt(int64(i)), nil), big.NewInt(1)) assertBigIntBounds(t, tep, minVal, maxVal) })` $DIR/core/services/relay/evm/types/int_types_test.go: `.Sprintf("uint%v", i)` $DIR/core/services/relay/evm/types/int_types_test.go: `.Sprintf("uint%v", i)` $DIR/core/services/relay/evm/types/int_types_test.go: `.NewInt(0)` $DIR/core/services/relay/evm/types/int_types_test.go: `.Sub(new(big.Int).Exp(big.NewInt(2), big.NewInt(int64(i)), nil), big.NewInt(1))` $DIR/core/services/relay/evm/types/int_types_test.go: `.Exp(big.NewInt(2), big.NewInt(int64(i)), nil)` $DIR/core/services/relay/evm/types/int_types_test.go: `.NewInt(2)` $DIR/core/services/relay/evm/types/int_types_test.go: `.NewInt(int64(i))` $DIR/core/services/relay/evm/types/int_types_test.go: `.NewInt(1)` $DIR/core/services/relay/evm/types/size_helper_test.go: `t.Run("Basic types all encode to 32 bytes", func(t *testing.T) { args := abi.Arguments{ {Name: "I8", Type: mustType(t, "int8")}, {Name: "I80", Type: mustType(t, "int80")}, {Name: "I256", Type: mustType(t, "int256")}, {Name: "B3", Type: mustType(t, "bytes3")}, {Name: "B32", Type: mustType(t, "bytes32")}, {Name: "TF", Type: mustType(t, "bool")}, } runSizeTest(t, anyNumElements, args, int8(9), big.NewInt(3), big.NewInt(200), [3]byte{1, 3, 4}, make32Bytes(1), true) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `runSizeTest(t, anyNumElements, args, int8(9), big.NewInt(3), big.NewInt(200), [3]byte{1, 3, 4}, make32Bytes(1), true)` $DIR/core/services/relay/evm/types/size_helper_test.go: `t.Run("Slices of basic types all encode to 32 bytes each + header and footer", func(t *testing.T) { args := abi.Arguments{ {Name: "I8", Type: mustType(t, "int8[]")}, {Name: "I80", Type: mustType(t, "int80[]")}, {Name: "I256", Type: mustType(t, "int256[]")}, {Name: "B3", Type: mustType(t, "bytes3[]")}, {Name: "B32", Type: mustType(t, "bytes32[]")}, {Name: "TF", Type: mustType(t, "bool[]")}, } i8 := []int8{9, 2, 1, 3, 5, 6, 2, 1, 2, 3} i80 := []*big.Int{big.NewInt(9), big.NewInt(2), big.NewInt(1), big.NewInt(3), big.NewInt(5), big.NewInt(6), big.NewInt(2), big.NewInt(1), big.NewInt(2), big.NewInt(3)} i256 := []*big.Int{big.NewInt(119), big.NewInt(112), big.NewInt(1), big.NewInt(3), big.NewInt(5), big.NewInt(6), big.NewInt(2), big.NewInt(1), big.NewInt(2), big.NewInt(3)} b3 := [][3]byte{{1, 2, 3}, {1, 2, 3}, {1, 2, 3}, {1, 2, 3}, {1, 2, 3}, {1, 2, 3}, {1, 2, 3}, {1, 2, 3}, {1, 2, 3}, {1, 2, 3}} b32 := [][32]byte{make32Bytes(1), make32Bytes(2), make32Bytes(3), make32Bytes(4), make32Bytes(5), make32Bytes(6), make32Bytes(7), make32Bytes(8), make32Bytes(9), make32Bytes(10)} tf := []bool{true, false, true, false, true, false, true, false, true, false} runSizeTest(t, anyNumElements, args, i8, i80, i256, b3, b32, tf) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `runSizeTest(t, anyNumElements, args, i8, i80, i256, b3, b32, tf)` $DIR/core/services/relay/evm/types/size_helper_test.go: `t.Run("Arrays of basic types all encode to 32 bytes each", func(t *testing.T) { args := abi.Arguments{ {Name: "I8", Type: mustType(t, "int8[3]")}, {Name: "I80", Type: mustType(t, "int80[3]")}, {Name: "I256", Type: mustType(t, "int256[3]")}, {Name: "B3", Type: mustType(t, "bytes3[3]")}, {Name: "B32", Type: mustType(t, "bytes32[3]")}, {Name: "TF", Type: mustType(t, "bool[3]")}, } i8 := [3]int8{9, 2, 1} i80 := [3]*big.Int{big.NewInt(9), big.NewInt(2), big.NewInt(1)} i256 := [3]*big.Int{big.NewInt(119), big.NewInt(112), big.NewInt(1)} b3 := [3][3]byte{{1, 2, 3}, {1, 2, 3}, {1, 2, 3}} b32 := [3][32]byte{make32Bytes(1), make32Bytes(2), make32Bytes(3)} tf := [3]bool{true, false, true} runSizeTest(t, anyNumElements, args, i8, i80, i256, b3, b32, tf) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `runSizeTest(t, anyNumElements, args, i8, i80, i256, b3, b32, tf)` $DIR/core/services/relay/evm/types/size_helper_test.go: `t.Run("Tuples are a sum of their elements", func(t *testing.T) { tuple1 := []abi.ArgumentMarshaling{ {Name: "I8", Type: "int8"}, {Name: "I80", Type: "int80"}, {Name: "I256", Type: "int256"}, {Name: "B3", Type: "bytes3"}, {Name: "B32", Type: "bytes32"}, {Name: "TF", Type: "bool"}, } t1, err := abi.NewType("tuple", "", tuple1) require.NoError(t, err) tuple2 := []abi.ArgumentMarshaling{ {Name: "I80", Type: "int80"}, {Name: "TF", Type: "bool"}, } t2, err := abi.NewType("tuple", "", tuple2) require.NoError(t, err) args := abi.Arguments{ {Name: "t1", Type: t1}, {Name: "t2", Type: t2}, } arg1 := struct { I8 int8 I80 *big.Int I256 *big.Int B3 [3]byte B32 [32]byte TF bool }{ int8(9), big.NewInt(3), big.NewInt(200), [3]byte{1, 3, 4}, make32Bytes(1), true, } arg2 := struct { I80 *big.Int TF bool }{ big.NewInt(3), true, } runSizeTest(t, anyNumElements, args, arg1, arg2) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `runSizeTest(t, anyNumElements, args, arg1, arg2)` $DIR/core/services/relay/evm/types/size_helper_test.go: `t.Run("Slices of tuples are a sum of their elements with header and footer", func(t *testing.T) { tuple1 := []abi.ArgumentMarshaling{ {Name: "I80", Type: "int80"}, {Name: "TF", Type: "bool"}, } t1, err := abi.NewType("tuple[]", "", tuple1) require.NoError(t, err) args := abi.Arguments{ {Name: "t1", Type: t1}, } arg1 := []struct { I80 *big.Int TF bool }{ {big.NewInt(1), true}, {big.NewInt(2), true}, {big.NewInt(3), true}, {big.NewInt(4), false}, {big.NewInt(5), true}, {big.NewInt(6), true}, {big.NewInt(7), true}, {big.NewInt(8), false}, {big.NewInt(9), true}, {big.NewInt(10), true}, } runSizeTest(t, anyNumElements, args, arg1) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `runSizeTest(t, anyNumElements, args, arg1)` $DIR/core/services/relay/evm/types/size_helper_test.go: `t.Run("Arrays of tuples are a sum of their elements", func(t *testing.T) { tuple1 := []abi.ArgumentMarshaling{ {Name: "I80", Type: "int80"}, {Name: "TF", Type: "bool"}, } t1, err := abi.NewType("tuple[3]", "", tuple1) require.NoError(t, err) args := abi.Arguments{ {Name: "t1", Type: t1}, } arg1 := []struct { I80 *big.Int TF bool }{ {big.NewInt(1), true}, {big.NewInt(2), true}, {big.NewInt(3), true}, } runSizeTest(t, anyNumElements, args, arg1) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `runSizeTest(t, anyNumElements, args, arg1)` $DIR/core/services/relay/evm/types/size_helper_test.go: `t.Run("Bytes pack themselves", func(t *testing.T) { args := abi.Arguments{{Name: "B", Type: mustType(t, "bytes")}} t.Run("No padding needed", func(t *testing.T) { padded := []byte("12345789022345678903234567890412345678905123456789061234") runSizeTest(t, 64, args, padded) }) t.Run("Padding needed", func(t *testing.T) { needsPadding := []byte("12345789022345678903234567890412345678905123456") runSizeTest(t, 56, args, needsPadding) }) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `t.Run("No padding needed", func(t *testing.T) { padded := []byte("12345789022345678903234567890412345678905123456789061234") runSizeTest(t, 64, args, padded) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `runSizeTest(t, 64, args, padded)` $DIR/core/services/relay/evm/types/size_helper_test.go: `t.Run("Padding needed", func(t *testing.T) { needsPadding := []byte("12345789022345678903234567890412345678905123456") runSizeTest(t, 56, args, needsPadding) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `runSizeTest(t, 56, args, needsPadding)` $DIR/core/services/relay/evm/types/size_helper_test.go: `t.Run("Strings pack themselves", func(t *testing.T) { args := abi.Arguments{{Name: "B", Type: mustType(t, "string")}} t.Run("No padding needed", func(t *testing.T) { padded := "12345789022345678903234567890412345678905123456789061234" runSizeTest(t, 64, args, padded) }) t.Run("Padding needed", func(t *testing.T) { needsPadding := "12345789022345678903234567890412345678905123456" runSizeTest(t, 56, args, needsPadding) }) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `t.Run("No padding needed", func(t *testing.T) { padded := "12345789022345678903234567890412345678905123456789061234" runSizeTest(t, 64, args, padded) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `runSizeTest(t, 64, args, padded)` $DIR/core/services/relay/evm/types/size_helper_test.go: `t.Run("Padding needed", func(t *testing.T) { needsPadding := "12345789022345678903234567890412345678905123456" runSizeTest(t, 56, args, needsPadding) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `runSizeTest(t, 56, args, needsPadding)` $DIR/core/services/relay/evm/types/size_helper_test.go: `t.Run("Nested dynamic types return errors", func(t *testing.T) { t.Run("Slice in slice", func(t *testing.T) { args := abi.Arguments{{Name: "B", Type: mustType(t, "int32[][]")}} _, err := types.GetMaxSize(anyNumElements, args) assert.IsType(t, commontypes.ErrInvalidType, err) }) t.Run("Slice in array", func(t *testing.T) { args := abi.Arguments{{Name: "B", Type: mustType(t, "int32[][2]")}} _, err := types.GetMaxSize(anyNumElements, args) assert.IsType(t, commontypes.ErrInvalidType, err) }) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `t.Run("Slice in slice", func(t *testing.T) { args := abi.Arguments{{Name: "B", Type: mustType(t, "int32[][]")}} _, err := types.GetMaxSize(anyNumElements, args) assert.IsType(t, commontypes.ErrInvalidType, err) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `t.Run("Slice in array", func(t *testing.T) { args := abi.Arguments{{Name: "B", Type: mustType(t, "int32[][2]")}} _, err := types.GetMaxSize(anyNumElements, args) assert.IsType(t, commontypes.ErrInvalidType, err) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `t.Run("Slices in a top level tuple works as-if they are the sized element", func(t *testing.T) { tuple1 := []abi.ArgumentMarshaling{ {Name: "I80", Type: "int80[]"}, {Name: "TF", Type: "bool[]"}, } t1, err := abi.NewType("tuple", "", tuple1) require.NoError(t, err) args := abi.Arguments{{Name: "tuple", Type: t1}} arg1 := struct { I80 []*big.Int TF []bool }{ I80: []*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3), big.NewInt(4), big.NewInt(5), big.NewInt(6), big.NewInt(7), big.NewInt(8), big.NewInt(9), big.NewInt(10)}, TF: []bool{true, true, true, false, true, true, true, false, true, true}, } runSizeTest(t, anyNumElements, args, arg1) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `runSizeTest(t, anyNumElements, args, arg1)` $DIR/core/services/relay/evm/types/size_helper_test.go: `_, err = types.GetMaxSize(anyNumElements, args)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.Run("Basic types all encode to 32 bytes", func(t *testing.T) { args := abi.Arguments{ {Name: "I8", Type: mustType(t, "int8")}, {Name: "I80", Type: mustType(t, "int80")}, {Name: "I256", Type: mustType(t, "int256")}, {Name: "B3", Type: mustType(t, "bytes3")}, {Name: "B32", Type: mustType(t, "bytes32")}, {Name: "TF", Type: mustType(t, "bool")}, } runSizeTest(t, anyNumElements, args, int8(9), big.NewInt(3), big.NewInt(200), [3]byte{1, 3, 4}, make32Bytes(1), true) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(3)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(200)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.Run("Slices of basic types all encode to 32 bytes each + header and footer", func(t *testing.T) { args := abi.Arguments{ {Name: "I8", Type: mustType(t, "int8[]")}, {Name: "I80", Type: mustType(t, "int80[]")}, {Name: "I256", Type: mustType(t, "int256[]")}, {Name: "B3", Type: mustType(t, "bytes3[]")}, {Name: "B32", Type: mustType(t, "bytes32[]")}, {Name: "TF", Type: mustType(t, "bool[]")}, } i8 := []int8{9, 2, 1, 3, 5, 6, 2, 1, 2, 3} i80 := []*big.Int{big.NewInt(9), big.NewInt(2), big.NewInt(1), big.NewInt(3), big.NewInt(5), big.NewInt(6), big.NewInt(2), big.NewInt(1), big.NewInt(2), big.NewInt(3)} i256 := []*big.Int{big.NewInt(119), big.NewInt(112), big.NewInt(1), big.NewInt(3), big.NewInt(5), big.NewInt(6), big.NewInt(2), big.NewInt(1), big.NewInt(2), big.NewInt(3)} b3 := [][3]byte{{1, 2, 3}, {1, 2, 3}, {1, 2, 3}, {1, 2, 3}, {1, 2, 3}, {1, 2, 3}, {1, 2, 3}, {1, 2, 3}, {1, 2, 3}, {1, 2, 3}} b32 := [][32]byte{make32Bytes(1), make32Bytes(2), make32Bytes(3), make32Bytes(4), make32Bytes(5), make32Bytes(6), make32Bytes(7), make32Bytes(8), make32Bytes(9), make32Bytes(10)} tf := []bool{true, false, true, false, true, false, true, false, true, false} runSizeTest(t, anyNumElements, args, i8, i80, i256, b3, b32, tf) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(9)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(2)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(1)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(3)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(5)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(6)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(2)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(1)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(2)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(3)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(119)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(112)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(1)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(3)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(5)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(6)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(2)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(1)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(2)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(3)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.Run("Arrays of basic types all encode to 32 bytes each", func(t *testing.T) { args := abi.Arguments{ {Name: "I8", Type: mustType(t, "int8[3]")}, {Name: "I80", Type: mustType(t, "int80[3]")}, {Name: "I256", Type: mustType(t, "int256[3]")}, {Name: "B3", Type: mustType(t, "bytes3[3]")}, {Name: "B32", Type: mustType(t, "bytes32[3]")}, {Name: "TF", Type: mustType(t, "bool[3]")}, } i8 := [3]int8{9, 2, 1} i80 := [3]*big.Int{big.NewInt(9), big.NewInt(2), big.NewInt(1)} i256 := [3]*big.Int{big.NewInt(119), big.NewInt(112), big.NewInt(1)} b3 := [3][3]byte{{1, 2, 3}, {1, 2, 3}, {1, 2, 3}} b32 := [3][32]byte{make32Bytes(1), make32Bytes(2), make32Bytes(3)} tf := [3]bool{true, false, true} runSizeTest(t, anyNumElements, args, i8, i80, i256, b3, b32, tf) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(9)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(2)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(1)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(119)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(112)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(1)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.Run("Tuples are a sum of their elements", func(t *testing.T) { tuple1 := []abi.ArgumentMarshaling{ {Name: "I8", Type: "int8"}, {Name: "I80", Type: "int80"}, {Name: "I256", Type: "int256"}, {Name: "B3", Type: "bytes3"}, {Name: "B32", Type: "bytes32"}, {Name: "TF", Type: "bool"}, } t1, err := abi.NewType("tuple", "", tuple1) require.NoError(t, err) tuple2 := []abi.ArgumentMarshaling{ {Name: "I80", Type: "int80"}, {Name: "TF", Type: "bool"}, } t2, err := abi.NewType("tuple", "", tuple2) require.NoError(t, err) args := abi.Arguments{ {Name: "t1", Type: t1}, {Name: "t2", Type: t2}, } arg1 := struct { I8 int8 I80 *big.Int I256 *big.Int B3 [3]byte B32 [32]byte TF bool }{ int8(9), big.NewInt(3), big.NewInt(200), [3]byte{1, 3, 4}, make32Bytes(1), true, } arg2 := struct { I80 *big.Int TF bool }{ big.NewInt(3), true, } runSizeTest(t, anyNumElements, args, arg1, arg2) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewType("tuple", "", tuple1)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewType("tuple", "", tuple2)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(3)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(200)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(3)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.Run("Slices of tuples are a sum of their elements with header and footer", func(t *testing.T) { tuple1 := []abi.ArgumentMarshaling{ {Name: "I80", Type: "int80"}, {Name: "TF", Type: "bool"}, } t1, err := abi.NewType("tuple[]", "", tuple1) require.NoError(t, err) args := abi.Arguments{ {Name: "t1", Type: t1}, } arg1 := []struct { I80 *big.Int TF bool }{ {big.NewInt(1), true}, {big.NewInt(2), true}, {big.NewInt(3), true}, {big.NewInt(4), false}, {big.NewInt(5), true}, {big.NewInt(6), true}, {big.NewInt(7), true}, {big.NewInt(8), false}, {big.NewInt(9), true}, {big.NewInt(10), true}, } runSizeTest(t, anyNumElements, args, arg1) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewType("tuple[]", "", tuple1)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(1)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(2)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(3)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(4)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(5)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(6)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(7)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(8)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(9)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(10)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.Run("Arrays of tuples are a sum of their elements", func(t *testing.T) { tuple1 := []abi.ArgumentMarshaling{ {Name: "I80", Type: "int80"}, {Name: "TF", Type: "bool"}, } t1, err := abi.NewType("tuple[3]", "", tuple1) require.NoError(t, err) args := abi.Arguments{ {Name: "t1", Type: t1}, } arg1 := []struct { I80 *big.Int TF bool }{ {big.NewInt(1), true}, {big.NewInt(2), true}, {big.NewInt(3), true}, } runSizeTest(t, anyNumElements, args, arg1) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewType("tuple[3]", "", tuple1)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(1)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(2)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(3)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.Run("Bytes pack themselves", func(t *testing.T) { args := abi.Arguments{{Name: "B", Type: mustType(t, "bytes")}} t.Run("No padding needed", func(t *testing.T) { padded := []byte("12345789022345678903234567890412345678905123456789061234") runSizeTest(t, 64, args, padded) }) t.Run("Padding needed", func(t *testing.T) { needsPadding := []byte("12345789022345678903234567890412345678905123456") runSizeTest(t, 56, args, needsPadding) }) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `.Run("No padding needed", func(t *testing.T) { padded := []byte("12345789022345678903234567890412345678905123456789061234") runSizeTest(t, 64, args, padded) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `.Run("Padding needed", func(t *testing.T) { needsPadding := []byte("12345789022345678903234567890412345678905123456") runSizeTest(t, 56, args, needsPadding) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `.Run("Strings pack themselves", func(t *testing.T) { args := abi.Arguments{{Name: "B", Type: mustType(t, "string")}} t.Run("No padding needed", func(t *testing.T) { padded := "12345789022345678903234567890412345678905123456789061234" runSizeTest(t, 64, args, padded) }) t.Run("Padding needed", func(t *testing.T) { needsPadding := "12345789022345678903234567890412345678905123456" runSizeTest(t, 56, args, needsPadding) }) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `.Run("No padding needed", func(t *testing.T) { padded := "12345789022345678903234567890412345678905123456789061234" runSizeTest(t, 64, args, padded) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `.Run("Padding needed", func(t *testing.T) { needsPadding := "12345789022345678903234567890412345678905123456" runSizeTest(t, 56, args, needsPadding) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `.Run("Nested dynamic types return errors", func(t *testing.T) { t.Run("Slice in slice", func(t *testing.T) { args := abi.Arguments{{Name: "B", Type: mustType(t, "int32[][]")}} _, err := types.GetMaxSize(anyNumElements, args) assert.IsType(t, commontypes.ErrInvalidType, err) }) t.Run("Slice in array", func(t *testing.T) { args := abi.Arguments{{Name: "B", Type: mustType(t, "int32[][2]")}} _, err := types.GetMaxSize(anyNumElements, args) assert.IsType(t, commontypes.ErrInvalidType, err) }) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `.Run("Slice in slice", func(t *testing.T) { args := abi.Arguments{{Name: "B", Type: mustType(t, "int32[][]")}} _, err := types.GetMaxSize(anyNumElements, args) assert.IsType(t, commontypes.ErrInvalidType, err) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `.GetMaxSize(anyNumElements, args)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.Run("Slice in array", func(t *testing.T) { args := abi.Arguments{{Name: "B", Type: mustType(t, "int32[][2]")}} _, err := types.GetMaxSize(anyNumElements, args) assert.IsType(t, commontypes.ErrInvalidType, err) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `.GetMaxSize(anyNumElements, args)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.Run("Slices in a top level tuple works as-if they are the sized element", func(t *testing.T) { tuple1 := []abi.ArgumentMarshaling{ {Name: "I80", Type: "int80[]"}, {Name: "TF", Type: "bool[]"}, } t1, err := abi.NewType("tuple", "", tuple1) require.NoError(t, err) args := abi.Arguments{{Name: "tuple", Type: t1}} arg1 := struct { I80 []*big.Int TF []bool }{ I80: []*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3), big.NewInt(4), big.NewInt(5), big.NewInt(6), big.NewInt(7), big.NewInt(8), big.NewInt(9), big.NewInt(10)}, TF: []bool{true, true, true, false, true, true, true, false, true, true}, } runSizeTest(t, anyNumElements, args, arg1) })` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewType("tuple", "", tuple1)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(1)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(2)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(3)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(4)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(5)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(6)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(7)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(8)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(9)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewInt(10)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.NewType("tuple", "", tuple2)` $DIR/core/services/relay/evm/types/size_helper_test.go: `.GetMaxSize(anyNumElements, args)` $DIR/core/services/relay/evm/types/types_test.go: `.NewRandomEVMChainID()` $DIR/core/services/relay/evm/types/types_test.go: `.NewHash()` $DIR/core/services/relay/evm/types/types_test.go: `.Sprintf(` ChainID = "%s" FromBlock = %d FeedID = "0x%x" `, cid, fromBlock, feedID[:])` $DIR/core/services/relay/evm/types/types_test.go: `.Unmarshal([]byte(rawToml), &rc)` $DIR/core/services/relay/evm/types/types_test.go: `.Hex()` $DIR/core/services/relay/evm/types/types_test.go: `.FeedID.Hex()` $DIR/core/services/relay/evm/write_target_test.go: `mockCall = append(mockCall, byte(0))` $DIR/core/services/relay/evm/write_target_test.go: `evmClient.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(mockCall, nil).Maybe()` $DIR/core/services/relay/evm/write_target_test.go: `chain.On("ID").Return(big.NewInt(11155111))` $DIR/core/services/relay/evm/write_target_test.go: `chain.On("TxManager").Return(txManager)` $DIR/core/services/relay/evm/write_target_test.go: `chain.On("LogPoller").Return(nil)` $DIR/core/services/relay/evm/write_target_test.go: `chain.On("Client").Return(evmClient)` $DIR/core/services/relay/evm/write_target_test.go: `c.EVM[0].Workflow.FromAddress = &addr` $DIR/core/services/relay/evm/write_target_test.go: `c.EVM[0].Workflow.ForwarderAddress = &forwarderAddr` $DIR/core/services/relay/evm/write_target_test.go: `chain.On("Config").Return(evmCfg)` $DIR/core/services/relay/evm/write_target_test.go: `txManager.On("CreateTransaction", mock.Anything, mock.Anything).Return(txmgr.Tx{}, nil).Run(func(args mock.Arguments) { req := args.Get(1).(txmgr.TxRequest) payload := make(map[string]any) method := forwardABI.Methods["report"] err = method.Inputs.UnpackIntoMap(payload, req.EncodedPayload[4:]) require.NoError(t, err) require.Equal(t, []byte{0x1, 0x2, 0x3}, payload["rawReport"]) require.Equal(t, [][]byte{}, payload["signatures"]) }).Once()` $DIR/core/services/relay/evm/write_target_test.go: `err = method.Inputs.UnpackIntoMap(payload, req.EncodedPayload[4:])` $DIR/core/services/relay/evm/write_target_test.go: `t.Run("succeeds with valid report", func(t *testing.T) { ctx := testutils.Context(t) capability, err := evm.NewWriteTarget(ctx, relayer, chain, lggr) require.NoError(t, err) config, err := values.NewMap(map[string]any{ "Address": evmCfg.EVM().Workflow().ForwarderAddress().String(), }) require.NoError(t, err) inputs, err := values.NewMap(map[string]any{ "signed_report": map[string]any{ "report": []byte{1, 2, 3}, "signatures": [][]byte{}, "context": []byte{4, 5}, "id": []byte{9, 9}, }, }) require.NoError(t, err) req := capabilities.CapabilityRequest{ Metadata: capabilities.RequestMetadata{ WorkflowID: "test-id", }, Config: config, Inputs: inputs, } ch, err := capability.Execute(ctx, req) require.NoError(t, err) response := <-ch require.Nil(t, response.Err) })` $DIR/core/services/relay/evm/write_target_test.go: `t.Run("succeeds with empty report", func(t *testing.T) { ctx := testutils.Context(t) capability, err := evm.NewWriteTarget(ctx, relayer, chain, logger.TestLogger(t)) require.NoError(t, err) config, err := values.NewMap(map[string]any{ "Address": evmCfg.EVM().Workflow().ForwarderAddress().String(), }) require.NoError(t, err) inputs, err := values.NewMap(map[string]any{ "signed_report": map[string]any{ "report": nil, }, }) require.NoError(t, err) req := capabilities.CapabilityRequest{ Metadata: capabilities.RequestMetadata{ WorkflowID: "test-id", }, Config: config, Inputs: inputs, } ch, err := capability.Execute(ctx, req) require.NoError(t, err) response := <-ch require.Nil(t, response.Err) })` $DIR/core/services/relay/evm/write_target_test.go: `t.Run("fails with invalid config", func(t *testing.T) { ctx := testutils.Context(t) capability, err := evm.NewWriteTarget(ctx, relayer, chain, logger.TestLogger(t)) require.NoError(t, err) invalidConfig, err := values.NewMap(map[string]any{ "Address": "invalid-address", }) require.NoError(t, err) inputs, err := values.NewMap(map[string]any{ "signed_report": map[string]any{ "report": nil, }, }) require.NoError(t, err) req := capabilities.CapabilityRequest{ Metadata: capabilities.RequestMetadata{ WorkflowID: "test-id", }, Config: invalidConfig, Inputs: inputs, } _, err = capability.Execute(ctx, req) require.Error(t, err) })` $DIR/core/services/relay/evm/write_target_test.go: `_, err = capability.Execute(ctx, req)` $DIR/core/services/relay/evm/write_target_test.go: `txManager.On("CreateTransaction", mock.Anything, mock.Anything).Return(txmgr.Tx{}, errors.New("TXM error"))` $DIR/core/services/relay/evm/write_target_test.go: `_, err = capability.Execute(ctx, req)` $DIR/core/services/relay/evm/write_target_test.go: `.NewChain(t)` $DIR/core/services/relay/evm/write_target_test.go: `.NewMockEvmTxManager(t)` $DIR/core/services/relay/evm/write_target_test.go: `.NewClient(t)` $DIR/core/services/relay/evm/write_target_test.go: `.On("CallContract", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/write_target_test.go: `.Return(mockCall, nil)` $DIR/core/services/relay/evm/write_target_test.go: `.Maybe()` $DIR/core/services/relay/evm/write_target_test.go: `.On("ID")` $DIR/core/services/relay/evm/write_target_test.go: `.Return(big.NewInt(11155111))` $DIR/core/services/relay/evm/write_target_test.go: `.NewInt(11155111)` $DIR/core/services/relay/evm/write_target_test.go: `.On("TxManager")` $DIR/core/services/relay/evm/write_target_test.go: `.Return(txManager)` $DIR/core/services/relay/evm/write_target_test.go: `.On("LogPoller")` $DIR/core/services/relay/evm/write_target_test.go: `.Return(nil)` $DIR/core/services/relay/evm/write_target_test.go: `.On("Client")` $DIR/core/services/relay/evm/write_target_test.go: `.Return(evmClient)` $DIR/core/services/relay/evm/write_target_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { a := testutils.NewAddress() addr, err2 := types.NewEIP55Address(a.Hex()) require.NoError(t, err2) c.EVM[0].Workflow.FromAddress = &addr forwarderA := testutils.NewAddress() forwarderAddr, err2 := types.NewEIP55Address(forwarderA.Hex()) require.NoError(t, err2) c.EVM[0].Workflow.ForwarderAddress = &forwarderAddr })` $DIR/core/services/relay/evm/write_target_test.go: `.NewAddress()` $DIR/core/services/relay/evm/write_target_test.go: `.NewEIP55Address(a.Hex())` $DIR/core/services/relay/evm/write_target_test.go: `.Hex()` $DIR/core/services/relay/evm/write_target_test.go: `.NewAddress()` $DIR/core/services/relay/evm/write_target_test.go: `.NewEIP55Address(forwarderA.Hex())` $DIR/core/services/relay/evm/write_target_test.go: `.Hex()` $DIR/core/services/relay/evm/write_target_test.go: `.NewChainScopedConfig(t, cfg)` $DIR/core/services/relay/evm/write_target_test.go: `.On("Config")` $DIR/core/services/relay/evm/write_target_test.go: `.Return(evmCfg)` $DIR/core/services/relay/evm/write_target_test.go: `.NewSqlxDB(t)` $DIR/core/services/relay/evm/write_target_test.go: `.NewKeyStore(t, db)` $DIR/core/services/relay/evm/write_target_test.go: `.TestLogger(t)` $DIR/core/services/relay/evm/write_target_test.go: `.NewRelayer(lggr, chain, relayevm.RelayerOpts{ DS: db, CSAETHKeystore: keyStore, CapabilitiesRegistry: evmcapabilities.NewRegistry(lggr), })` $DIR/core/services/relay/evm/write_target_test.go: `.NewRegistry(lggr)` $DIR/core/services/relay/evm/write_target_test.go: `.On("CreateTransaction", mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/write_target_test.go: `.Return(txmgr.Tx{}, nil)` $DIR/core/services/relay/evm/write_target_test.go: `.Run(func(args mock.Arguments) { req := args.Get(1).(txmgr.TxRequest) payload := make(map[string]any) method := forwardABI.Methods["report"] err = method.Inputs.UnpackIntoMap(payload, req.EncodedPayload[4:]) require.NoError(t, err) require.Equal(t, []byte{0x1, 0x2, 0x3}, payload["rawReport"]) require.Equal(t, [][]byte{}, payload["signatures"]) })` $DIR/core/services/relay/evm/write_target_test.go: `.Get(1)` $DIR/core/services/relay/evm/write_target_test.go: `.Inputs.UnpackIntoMap(payload, req.EncodedPayload[4:])` $DIR/core/services/relay/evm/write_target_test.go: `.Once()` $DIR/core/services/relay/evm/write_target_test.go: `.Run("succeeds with valid report", func(t *testing.T) { ctx := testutils.Context(t) capability, err := evm.NewWriteTarget(ctx, relayer, chain, lggr) require.NoError(t, err) config, err := values.NewMap(map[string]any{ "Address": evmCfg.EVM().Workflow().ForwarderAddress().String(), }) require.NoError(t, err) inputs, err := values.NewMap(map[string]any{ "signed_report": map[string]any{ "report": []byte{1, 2, 3}, "signatures": [][]byte{}, "context": []byte{4, 5}, "id": []byte{9, 9}, }, }) require.NoError(t, err) req := capabilities.CapabilityRequest{ Metadata: capabilities.RequestMetadata{ WorkflowID: "test-id", }, Config: config, Inputs: inputs, } ch, err := capability.Execute(ctx, req) require.NoError(t, err) response := <-ch require.Nil(t, response.Err) })` $DIR/core/services/relay/evm/write_target_test.go: `.Context(t)` $DIR/core/services/relay/evm/write_target_test.go: `.NewWriteTarget(ctx, relayer, chain, lggr)` $DIR/core/services/relay/evm/write_target_test.go: `.NewMap(map[string]any{ "Address": evmCfg.EVM().Workflow().ForwarderAddress().String(), })` $DIR/core/services/relay/evm/write_target_test.go: `.EVM()` $DIR/core/services/relay/evm/write_target_test.go: `.Workflow()` $DIR/core/services/relay/evm/write_target_test.go: `.ForwarderAddress()` $DIR/core/services/relay/evm/write_target_test.go: `.String()` $DIR/core/services/relay/evm/write_target_test.go: `.NewMap(map[string]any{ "signed_report": map[string]any{ "report": []byte{1, 2, 3}, "signatures": [][]byte{}, "context": []byte{4, 5}, "id": []byte{9, 9}, }, })` $DIR/core/services/relay/evm/write_target_test.go: `.Execute(ctx, req)` $DIR/core/services/relay/evm/write_target_test.go: `.Run("succeeds with empty report", func(t *testing.T) { ctx := testutils.Context(t) capability, err := evm.NewWriteTarget(ctx, relayer, chain, logger.TestLogger(t)) require.NoError(t, err) config, err := values.NewMap(map[string]any{ "Address": evmCfg.EVM().Workflow().ForwarderAddress().String(), }) require.NoError(t, err) inputs, err := values.NewMap(map[string]any{ "signed_report": map[string]any{ "report": nil, }, }) require.NoError(t, err) req := capabilities.CapabilityRequest{ Metadata: capabilities.RequestMetadata{ WorkflowID: "test-id", }, Config: config, Inputs: inputs, } ch, err := capability.Execute(ctx, req) require.NoError(t, err) response := <-ch require.Nil(t, response.Err) })` $DIR/core/services/relay/evm/write_target_test.go: `.Context(t)` $DIR/core/services/relay/evm/write_target_test.go: `.NewWriteTarget(ctx, relayer, chain, logger.TestLogger(t))` $DIR/core/services/relay/evm/write_target_test.go: `.TestLogger(t)` $DIR/core/services/relay/evm/write_target_test.go: `.NewMap(map[string]any{ "Address": evmCfg.EVM().Workflow().ForwarderAddress().String(), })` $DIR/core/services/relay/evm/write_target_test.go: `.EVM()` $DIR/core/services/relay/evm/write_target_test.go: `.Workflow()` $DIR/core/services/relay/evm/write_target_test.go: `.ForwarderAddress()` $DIR/core/services/relay/evm/write_target_test.go: `.String()` $DIR/core/services/relay/evm/write_target_test.go: `.NewMap(map[string]any{ "signed_report": map[string]any{ "report": nil, }, })` $DIR/core/services/relay/evm/write_target_test.go: `.Execute(ctx, req)` $DIR/core/services/relay/evm/write_target_test.go: `.Run("fails with invalid config", func(t *testing.T) { ctx := testutils.Context(t) capability, err := evm.NewWriteTarget(ctx, relayer, chain, logger.TestLogger(t)) require.NoError(t, err) invalidConfig, err := values.NewMap(map[string]any{ "Address": "invalid-address", }) require.NoError(t, err) inputs, err := values.NewMap(map[string]any{ "signed_report": map[string]any{ "report": nil, }, }) require.NoError(t, err) req := capabilities.CapabilityRequest{ Metadata: capabilities.RequestMetadata{ WorkflowID: "test-id", }, Config: invalidConfig, Inputs: inputs, } _, err = capability.Execute(ctx, req) require.Error(t, err) })` $DIR/core/services/relay/evm/write_target_test.go: `.Context(t)` $DIR/core/services/relay/evm/write_target_test.go: `.NewWriteTarget(ctx, relayer, chain, logger.TestLogger(t))` $DIR/core/services/relay/evm/write_target_test.go: `.TestLogger(t)` $DIR/core/services/relay/evm/write_target_test.go: `.NewMap(map[string]any{ "Address": "invalid-address", })` $DIR/core/services/relay/evm/write_target_test.go: `.NewMap(map[string]any{ "signed_report": map[string]any{ "report": nil, }, })` $DIR/core/services/relay/evm/write_target_test.go: `.Execute(ctx, req)` $DIR/core/services/relay/evm/write_target_test.go: `.Context(t)` $DIR/core/services/relay/evm/write_target_test.go: `.NewWriteTarget(ctx, relayer, chain, logger.TestLogger(t))` $DIR/core/services/relay/evm/write_target_test.go: `.TestLogger(t)` $DIR/core/services/relay/evm/write_target_test.go: `.NewMap(map[string]any{ "Address": evmCfg.EVM().Workflow().ForwarderAddress().String(), })` $DIR/core/services/relay/evm/write_target_test.go: `.EVM()` $DIR/core/services/relay/evm/write_target_test.go: `.Workflow()` $DIR/core/services/relay/evm/write_target_test.go: `.ForwarderAddress()` $DIR/core/services/relay/evm/write_target_test.go: `.String()` $DIR/core/services/relay/evm/write_target_test.go: `.NewMap(map[string]any{ "signed_report": map[string]any{ "report": []byte{1, 2, 3}, "signatures": [][]byte{}, "context": []byte{4, 5}, "id": []byte{9, 9}, }, })` $DIR/core/services/relay/evm/write_target_test.go: `.On("CreateTransaction", mock.Anything, mock.Anything)` $DIR/core/services/relay/evm/write_target_test.go: `.Return(txmgr.Tx{}, errors.New("TXM error"))` $DIR/core/services/relay/evm/write_target_test.go: `.New("TXM error")` $DIR/core/services/relay/evm/write_target_test.go: `.Execute(ctx, req)` $DIR/core/services/s4/address_range_test.go: `full.Advance()` $DIR/core/services/s4/address_range_test.go: `sar.Advance()` $DIR/core/services/s4/address_range_test.go: `t.Run("invalid intervals", func(t *testing.T) { _, err := s4.NewInitialAddressRangeForIntervals(0) assert.ErrorIs(t, err, s4.ErrInvalidIntervals) _, err = s4.NewInitialAddressRangeForIntervals(3) assert.ErrorIs(t, err, s4.ErrInvalidIntervals) })` $DIR/core/services/s4/address_range_test.go: `_, err = s4.NewInitialAddressRangeForIntervals(3)` $DIR/core/services/s4/address_range_test.go: `t.Run("full range for one interval", func(t *testing.T) { r, err := s4.NewInitialAddressRangeForIntervals(1) assert.NoError(t, err) assert.Equal(t, s4.NewFullAddressRange(), r) })` $DIR/core/services/s4/address_range_test.go: `t.Run("initial range for 256 intervals", func(t *testing.T) { r, err := s4.NewInitialAddressRangeForIntervals(256) assert.NoError(t, err) assert.Equal(t, "0x0", r.MinAddress.Hex()) assert.Equal(t, "0xffffffffffffffffffffffffffffffffffffff", r.MaxAddress.Hex()) })` $DIR/core/services/s4/address_range_test.go: `r.Advance()` $DIR/core/services/s4/address_range_test.go: `r.Advance()` $DIR/core/services/s4/address_range_test.go: `r.Advance()` $DIR/core/services/s4/address_range_test.go: `r.Advance()` $DIR/core/services/s4/address_range_test.go: `r.Advance()` $DIR/core/services/s4/address_range_test.go: `.NewFullAddressRange()` $DIR/core/services/s4/address_range_test.go: `.Advance()` $DIR/core/services/s4/address_range_test.go: `.NewI(0x123)` $DIR/core/services/s4/address_range_test.go: `.NewSingleAddressRange(addr)` $DIR/core/services/s4/address_range_test.go: `.Advance()` $DIR/core/services/s4/address_range_test.go: `.Contains(addr)` $DIR/core/services/s4/address_range_test.go: `.Run("invalid intervals", func(t *testing.T) { _, err := s4.NewInitialAddressRangeForIntervals(0) assert.ErrorIs(t, err, s4.ErrInvalidIntervals) _, err = s4.NewInitialAddressRangeForIntervals(3) assert.ErrorIs(t, err, s4.ErrInvalidIntervals) })` $DIR/core/services/s4/address_range_test.go: `.NewInitialAddressRangeForIntervals(0)` $DIR/core/services/s4/address_range_test.go: `.NewInitialAddressRangeForIntervals(3)` $DIR/core/services/s4/address_range_test.go: `.Run("full range for one interval", func(t *testing.T) { r, err := s4.NewInitialAddressRangeForIntervals(1) assert.NoError(t, err) assert.Equal(t, s4.NewFullAddressRange(), r) })` $DIR/core/services/s4/address_range_test.go: `.NewInitialAddressRangeForIntervals(1)` $DIR/core/services/s4/address_range_test.go: `.Run("initial range for 256 intervals", func(t *testing.T) { r, err := s4.NewInitialAddressRangeForIntervals(256) assert.NoError(t, err) assert.Equal(t, "0x0", r.MinAddress.Hex()) assert.Equal(t, "0xffffffffffffffffffffffffffffffffffffff", r.MaxAddress.Hex()) })` $DIR/core/services/s4/address_range_test.go: `.NewInitialAddressRangeForIntervals(256)` $DIR/core/services/s4/address_range_test.go: `.NewInitialAddressRangeForIntervals(256)` $DIR/core/services/s4/address_range_test.go: `.Advance()` $DIR/core/services/s4/address_range_test.go: `.Advance()` $DIR/core/services/s4/address_range_test.go: `.Advance()` $DIR/core/services/s4/address_range_test.go: `.Advance()` $DIR/core/services/s4/address_range_test.go: `.NewInitialAddressRangeForIntervals(256)` $DIR/core/services/s4/address_range_test.go: `.Advance()` $DIR/core/services/s4/address_range_test.go: `.Contains(r.MinAddress.Sub(big.NewI(1)))` $DIR/core/services/s4/address_range_test.go: `.MinAddress.Sub(big.NewI(1))` $DIR/core/services/s4/address_range_test.go: `.NewI(1)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `underlayingORM.On("GetSnapshot", mock.Anything, fullAddressRange).Return(rows, nil).Once()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `snapshotRowMap[sr.Address.String()] = cache_snapshot[i]` $DIR/core/services/s4/cached_orm_wrapper_test.go: `t.Run("OK-GetSnapshot_cache_invalidated_after_update", func(t *testing.T) { ctx := testutils.Context(t) rows := generateTestSnapshotRows(t, 100) fullAddressRange := s4.NewFullAddressRange() lggr := logger.TestLogger(t) underlayingORM := mocks.NewORM(t) underlayingORM.On("GetSnapshot", mock.Anything, fullAddressRange).Return(rows, nil).Once() orm := s4.NewCachedORMWrapper(underlayingORM, lggr) // first call will go to the underlaying orm implementation to fill the cache first_snapshot, err := orm.GetSnapshot(ctx, fullAddressRange) assert.NoError(t, err) assert.Equal(t, len(rows), len(first_snapshot)) // on the second call, the results will come from the cache, if not the mock will return an error because of .Once() cache_snapshot, err := orm.GetSnapshot(ctx, fullAddressRange) assert.NoError(t, err) assert.Equal(t, len(rows), len(cache_snapshot)) // this update call will invalidate the cache row := &s4.Row{ Address: big.New(common.HexToAddress("0x0000000000000000000000000000000000000000000000000000000000000005").Big()), SlotId: 1, Payload: cltest.MustRandomBytes(t, 32), Version: 1, Expiration: time.Now().Add(time.Hour).UnixMilli(), Confirmed: true, Signature: cltest.MustRandomBytes(t, 32), } underlayingORM.On("Update", mock.Anything, row).Return(nil).Once() err = orm.Update(ctx, row) assert.NoError(t, err) // given the cache was invalidated this request will reach the underlaying orm implementation underlayingORM.On("GetSnapshot", mock.Anything, fullAddressRange).Return(rows, nil).Once() third_snapshot, err := orm.GetSnapshot(ctx, fullAddressRange) assert.NoError(t, err) assert.Equal(t, len(rows), len(third_snapshot)) })` $DIR/core/services/s4/cached_orm_wrapper_test.go: `underlayingORM.On("GetSnapshot", mock.Anything, fullAddressRange).Return(rows, nil).Once()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `underlayingORM.On("Update", mock.Anything, row).Return(nil).Once()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `err = orm.Update(ctx, row)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `underlayingORM.On("GetSnapshot", mock.Anything, fullAddressRange).Return(rows, nil).Once()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `underlayingORM.On("GetSnapshot", mock.Anything, addressRange).Return(rows, nil).Once()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `underlayingORM.On("Update", mock.Anything, row).Return(nil).Once()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `err = orm.Update(ctx, row)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `t.Run("OK-Get_underlaying_ORM_returns_a_row", func(t *testing.T) { ctx := testutils.Context(t) underlayingORM := mocks.NewORM(t) expectedRow := &s4.Row{ Address: address, SlotId: slotID, } underlayingORM.On("Get", mock.Anything, address, slotID).Return(expectedRow, nil).Once() orm := s4.NewCachedORMWrapper(underlayingORM, lggr) row, err := orm.Get(ctx, address, slotID) require.NoError(t, err) require.Equal(t, expectedRow, row) })` $DIR/core/services/s4/cached_orm_wrapper_test.go: `underlayingORM.On("Get", mock.Anything, address, slotID).Return(expectedRow, nil).Once()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `underlayingORM.On("Get", mock.Anything, address, slotID).Return(nil, fmt.Errorf("some_error")).Once()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `t.Run("OK-DeletedExpired_underlaying_ORM_returns_a_row", func(t *testing.T) { ctx := testutils.Context(t) var expectedDeleted int64 = 10 underlayingORM := mocks.NewORM(t) underlayingORM.On("DeleteExpired", mock.Anything, limit, now).Return(expectedDeleted, nil).Once() orm := s4.NewCachedORMWrapper(underlayingORM, lggr) actualDeleted, err := orm.DeleteExpired(ctx, limit, now) require.NoError(t, err) require.Equal(t, expectedDeleted, actualDeleted) })` $DIR/core/services/s4/cached_orm_wrapper_test.go: `underlayingORM.On("DeleteExpired", mock.Anything, limit, now).Return(expectedDeleted, nil).Once()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `underlayingORM.On("DeleteExpired", mock.Anything, limit, now).Return(expectedDeleted, fmt.Errorf("some_error")).Once()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `t.Run("OK-GetUnconfirmedRows_underlaying_ORM_returns_a_row", func(t *testing.T) { ctx := testutils.Context(t) address := big.New(testutils.NewAddress().Big()) var slotID uint = 1 expectedRow := []*s4.Row{{ Address: address, SlotId: slotID, }} underlayingORM := mocks.NewORM(t) underlayingORM.On("GetUnconfirmedRows", mock.Anything, limit).Return(expectedRow, nil).Once() orm := s4.NewCachedORMWrapper(underlayingORM, lggr) actualRow, err := orm.GetUnconfirmedRows(ctx, limit) require.NoError(t, err) require.Equal(t, expectedRow, actualRow) })` $DIR/core/services/s4/cached_orm_wrapper_test.go: `underlayingORM.On("GetUnconfirmedRows", mock.Anything, limit).Return(expectedRow, nil).Once()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `underlayingORM.On("GetUnconfirmedRows", mock.Anything, limit).Return(nil, fmt.Errorf("some_error")).Once()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Context(t)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.TestLogger(t)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.NewCachedORMWrapper(psqlORM, lggr)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.GetSnapshot(ctx, s4.NewFullAddressRange())` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.NewFullAddressRange()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Context(t)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.NewFullAddressRange()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.TestLogger(t)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.NewORM(t)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.On("GetSnapshot", mock.Anything, fullAddressRange)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Return(rows, nil)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Once()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.NewCachedORMWrapper(underlayingORM, lggr)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.GetSnapshot(ctx, fullAddressRange)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.GetSnapshot(ctx, fullAddressRange)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Address.String()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Address.String()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Run("OK-GetSnapshot_cache_invalidated_after_update", func(t *testing.T) { ctx := testutils.Context(t) rows := generateTestSnapshotRows(t, 100) fullAddressRange := s4.NewFullAddressRange() lggr := logger.TestLogger(t) underlayingORM := mocks.NewORM(t) underlayingORM.On("GetSnapshot", mock.Anything, fullAddressRange).Return(rows, nil).Once() orm := s4.NewCachedORMWrapper(underlayingORM, lggr) // first call will go to the underlaying orm implementation to fill the cache first_snapshot, err := orm.GetSnapshot(ctx, fullAddressRange) assert.NoError(t, err) assert.Equal(t, len(rows), len(first_snapshot)) // on the second call, the results will come from the cache, if not the mock will return an error because of .Once() cache_snapshot, err := orm.GetSnapshot(ctx, fullAddressRange) assert.NoError(t, err) assert.Equal(t, len(rows), len(cache_snapshot)) // this update call will invalidate the cache row := &s4.Row{ Address: big.New(common.HexToAddress("0x0000000000000000000000000000000000000000000000000000000000000005").Big()), SlotId: 1, Payload: cltest.MustRandomBytes(t, 32), Version: 1, Expiration: time.Now().Add(time.Hour).UnixMilli(), Confirmed: true, Signature: cltest.MustRandomBytes(t, 32), } underlayingORM.On("Update", mock.Anything, row).Return(nil).Once() err = orm.Update(ctx, row) assert.NoError(t, err) // given the cache was invalidated this request will reach the underlaying orm implementation underlayingORM.On("GetSnapshot", mock.Anything, fullAddressRange).Return(rows, nil).Once() third_snapshot, err := orm.GetSnapshot(ctx, fullAddressRange) assert.NoError(t, err) assert.Equal(t, len(rows), len(third_snapshot)) })` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Context(t)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.NewFullAddressRange()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.TestLogger(t)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.NewORM(t)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.On("GetSnapshot", mock.Anything, fullAddressRange)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Return(rows, nil)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Once()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.NewCachedORMWrapper(underlayingORM, lggr)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.GetSnapshot(ctx, fullAddressRange)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.GetSnapshot(ctx, fullAddressRange)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.New(common.HexToAddress("0x0000000000000000000000000000000000000000000000000000000000000005").Big())` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.HexToAddress("0x0000000000000000000000000000000000000000000000000000000000000005")` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Big()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.MustRandomBytes(t, 32)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Now()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Add(time.Hour)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.UnixMilli()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.MustRandomBytes(t, 32)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.On("Update", mock.Anything, row)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Return(nil)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Once()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Update(ctx, row)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.On("GetSnapshot", mock.Anything, fullAddressRange)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Return(rows, nil)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Once()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.GetSnapshot(ctx, fullAddressRange)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Context(t)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.New(common.BytesToAddress(bytes.Repeat([]byte{0x00}, common.AddressLength)).Big())` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.BytesToAddress(bytes.Repeat([]byte{0x00}, common.AddressLength))` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Repeat([]byte{0x00}, common.AddressLength)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Big()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.New(common.BytesToAddress(append(bytes.Repeat([]byte{0x00}, common.AddressLength-1), 3)).Big())` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.BytesToAddress(append(bytes.Repeat([]byte{0x00}, common.AddressLength-1), 3))` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Repeat([]byte{0x00}, common.AddressLength-1)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Big()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.TestLogger(t)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.NewORM(t)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.On("GetSnapshot", mock.Anything, addressRange)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Return(rows, nil)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Once()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.NewCachedORMWrapper(underlayingORM, lggr)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.GetSnapshot(ctx, addressRange)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.GetSnapshot(ctx, addressRange)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.New(common.BytesToAddress(append(bytes.Repeat([]byte{0x00}, common.AddressLength-1), 5)).Big())` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.BytesToAddress(append(bytes.Repeat([]byte{0x00}, common.AddressLength-1), 5))` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Repeat([]byte{0x00}, common.AddressLength-1)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Big()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.MustRandomBytes(t, 32)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Now()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Add(time.Hour)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.UnixMilli()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.MustRandomBytes(t, 32)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.On("Update", mock.Anything, row)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Return(nil)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Once()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Update(ctx, row)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.GetSnapshot(ctx, addressRange)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.New(testutils.NewAddress().Big())` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.NewAddress()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Big()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.TestLogger(t)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Run("OK-Get_underlaying_ORM_returns_a_row", func(t *testing.T) { ctx := testutils.Context(t) underlayingORM := mocks.NewORM(t) expectedRow := &s4.Row{ Address: address, SlotId: slotID, } underlayingORM.On("Get", mock.Anything, address, slotID).Return(expectedRow, nil).Once() orm := s4.NewCachedORMWrapper(underlayingORM, lggr) row, err := orm.Get(ctx, address, slotID) require.NoError(t, err) require.Equal(t, expectedRow, row) })` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Context(t)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.NewORM(t)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.On("Get", mock.Anything, address, slotID)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Return(expectedRow, nil)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Once()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.NewCachedORMWrapper(underlayingORM, lggr)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Get(ctx, address, slotID)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Context(t)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.NewORM(t)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.On("Get", mock.Anything, address, slotID)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Return(nil, fmt.Errorf("some_error"))` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Once()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.NewCachedORMWrapper(underlayingORM, lggr)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Get(ctx, address, slotID)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Now()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.TestLogger(t)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Run("OK-DeletedExpired_underlaying_ORM_returns_a_row", func(t *testing.T) { ctx := testutils.Context(t) var expectedDeleted int64 = 10 underlayingORM := mocks.NewORM(t) underlayingORM.On("DeleteExpired", mock.Anything, limit, now).Return(expectedDeleted, nil).Once() orm := s4.NewCachedORMWrapper(underlayingORM, lggr) actualDeleted, err := orm.DeleteExpired(ctx, limit, now) require.NoError(t, err) require.Equal(t, expectedDeleted, actualDeleted) })` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Context(t)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.NewORM(t)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.On("DeleteExpired", mock.Anything, limit, now)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Return(expectedDeleted, nil)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Once()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.NewCachedORMWrapper(underlayingORM, lggr)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.DeleteExpired(ctx, limit, now)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Context(t)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.NewORM(t)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.On("DeleteExpired", mock.Anything, limit, now)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Return(expectedDeleted, fmt.Errorf("some_error"))` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Once()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.NewCachedORMWrapper(underlayingORM, lggr)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.DeleteExpired(ctx, limit, now)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.TestLogger(t)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Run("OK-GetUnconfirmedRows_underlaying_ORM_returns_a_row", func(t *testing.T) { ctx := testutils.Context(t) address := big.New(testutils.NewAddress().Big()) var slotID uint = 1 expectedRow := []*s4.Row{{ Address: address, SlotId: slotID, }} underlayingORM := mocks.NewORM(t) underlayingORM.On("GetUnconfirmedRows", mock.Anything, limit).Return(expectedRow, nil).Once() orm := s4.NewCachedORMWrapper(underlayingORM, lggr) actualRow, err := orm.GetUnconfirmedRows(ctx, limit) require.NoError(t, err) require.Equal(t, expectedRow, actualRow) })` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Context(t)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.New(testutils.NewAddress().Big())` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.NewAddress()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Big()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.NewORM(t)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.On("GetUnconfirmedRows", mock.Anything, limit)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Return(expectedRow, nil)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Once()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.NewCachedORMWrapper(underlayingORM, lggr)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.GetUnconfirmedRows(ctx, limit)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Context(t)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.NewORM(t)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.On("GetUnconfirmedRows", mock.Anything, limit)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Return(nil, fmt.Errorf("some_error"))` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.Once()` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.NewCachedORMWrapper(underlayingORM, lggr)` $DIR/core/services/s4/cached_orm_wrapper_test.go: `.GetUnconfirmedRows(ctx, limit)` $DIR/core/services/s4/envelope_test.go: `t.Run("signing", func(t *testing.T) { privateKey, err := crypto.GenerateKey() assert.NoError(t, err) sig, err := env.Sign(privateKey) assert.NoError(t, err) addr, err := env.GetSignerAddress(sig) assert.NoError(t, err) publicKey := privateKey.Public() publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey) assert.True(t, ok) assert.Equal(t, crypto.PubkeyToAddress(*publicKeyECDSA), addr) })` $DIR/core/services/s4/envelope_test.go: `err = json.Unmarshal(js, &decoded)` $DIR/core/services/s4/envelope_test.go: `.Random32Byte()` $DIR/core/services/s4/envelope_test.go: `.Now()` $DIR/core/services/s4/envelope_test.go: `.Add(time.Hour)` $DIR/core/services/s4/envelope_test.go: `.UnixMilli()` $DIR/core/services/s4/envelope_test.go: `.NewAddress()` $DIR/core/services/s4/envelope_test.go: `.NewEnvelopeFromRecord(key, &s4.Record{ Payload: payload[:], Expiration: expiration, })` $DIR/core/services/s4/envelope_test.go: `.Run("signing", func(t *testing.T) { privateKey, err := crypto.GenerateKey() assert.NoError(t, err) sig, err := env.Sign(privateKey) assert.NoError(t, err) addr, err := env.GetSignerAddress(sig) assert.NoError(t, err) publicKey := privateKey.Public() publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey) assert.True(t, ok) assert.Equal(t, crypto.PubkeyToAddress(*publicKeyECDSA), addr) })` $DIR/core/services/s4/envelope_test.go: `.GenerateKey()` $DIR/core/services/s4/envelope_test.go: `.Sign(privateKey)` $DIR/core/services/s4/envelope_test.go: `.GetSignerAddress(sig)` $DIR/core/services/s4/envelope_test.go: `.Public()` $DIR/core/services/s4/envelope_test.go: `.ToJson()` $DIR/core/services/s4/envelope_test.go: `.Unmarshal(js, &decoded)` $DIR/core/services/s4/envelope_test.go: `.ToJson()` $DIR/core/services/s4/in_memory_orm_test.go: `t.Run("row not found", func(t *testing.T) { ctx := testutils.Context(t) _, err := orm.Get(ctx, big.New(address.Big()), slotId) assert.ErrorIs(t, err, s4.ErrNotFound) })` $DIR/core/services/s4/in_memory_orm_test.go: `t.Run("insert and get", func(t *testing.T) { ctx := testutils.Context(t) err := orm.Update(ctx, row) assert.NoError(t, err) e, err := orm.Get(ctx, big.New(address.Big()), slotId) assert.NoError(t, err) assert.Equal(t, row, e) })` $DIR/core/services/s4/in_memory_orm_test.go: `row.Version = 5` $DIR/core/services/s4/in_memory_orm_test.go: `err = orm.Update(ctx, row)` $DIR/core/services/s4/in_memory_orm_test.go: `row.Confirmed = true` $DIR/core/services/s4/in_memory_orm_test.go: `err = orm.Update(ctx, row)` $DIR/core/services/s4/in_memory_orm_test.go: `thisAddress[0] = byte(i)` $DIR/core/services/s4/in_memory_orm_test.go: `thisAddress[0] = byte(i)` $DIR/core/services/s4/in_memory_orm_test.go: `time.Sleep(time.Millisecond)` $DIR/core/services/s4/in_memory_orm_test.go: `thisAddress[0] = byte(i)` $DIR/core/services/s4/in_memory_orm_test.go: `testMap[rows[i].Version]++` $DIR/core/services/s4/in_memory_orm_test.go: `.NewAddress()` $DIR/core/services/s4/in_memory_orm_test.go: `.Random32Byte()` $DIR/core/services/s4/in_memory_orm_test.go: `.Random32Byte()` $DIR/core/services/s4/in_memory_orm_test.go: `.Now()` $DIR/core/services/s4/in_memory_orm_test.go: `.Add(time.Minute)` $DIR/core/services/s4/in_memory_orm_test.go: `.UnixMilli()` $DIR/core/services/s4/in_memory_orm_test.go: `.New(address.Big())` $DIR/core/services/s4/in_memory_orm_test.go: `.Big()` $DIR/core/services/s4/in_memory_orm_test.go: `.NewInMemoryORM()` $DIR/core/services/s4/in_memory_orm_test.go: `.Run("row not found", func(t *testing.T) { ctx := testutils.Context(t) _, err := orm.Get(ctx, big.New(address.Big()), slotId) assert.ErrorIs(t, err, s4.ErrNotFound) })` $DIR/core/services/s4/in_memory_orm_test.go: `.Context(t)` $DIR/core/services/s4/in_memory_orm_test.go: `.Get(ctx, big.New(address.Big()), slotId)` $DIR/core/services/s4/in_memory_orm_test.go: `.New(address.Big())` $DIR/core/services/s4/in_memory_orm_test.go: `.Big()` $DIR/core/services/s4/in_memory_orm_test.go: `.Run("insert and get", func(t *testing.T) { ctx := testutils.Context(t) err := orm.Update(ctx, row) assert.NoError(t, err) e, err := orm.Get(ctx, big.New(address.Big()), slotId) assert.NoError(t, err) assert.Equal(t, row, e) })` $DIR/core/services/s4/in_memory_orm_test.go: `.Context(t)` $DIR/core/services/s4/in_memory_orm_test.go: `.Update(ctx, row)` $DIR/core/services/s4/in_memory_orm_test.go: `.Get(ctx, big.New(address.Big()), slotId)` $DIR/core/services/s4/in_memory_orm_test.go: `.New(address.Big())` $DIR/core/services/s4/in_memory_orm_test.go: `.Big()` $DIR/core/services/s4/in_memory_orm_test.go: `.Context(t)` $DIR/core/services/s4/in_memory_orm_test.go: `.Update(ctx, row)` $DIR/core/services/s4/in_memory_orm_test.go: `.Update(ctx, row)` $DIR/core/services/s4/in_memory_orm_test.go: `.Update(ctx, row)` $DIR/core/services/s4/in_memory_orm_test.go: `.Get(ctx, big.New(address.Big()), slotId)` $DIR/core/services/s4/in_memory_orm_test.go: `.New(address.Big())` $DIR/core/services/s4/in_memory_orm_test.go: `.Big()` $DIR/core/services/s4/in_memory_orm_test.go: `.Context(t)` $DIR/core/services/s4/in_memory_orm_test.go: `.NewInMemoryORM()` $DIR/core/services/s4/in_memory_orm_test.go: `.Now()` $DIR/core/services/s4/in_memory_orm_test.go: `.Add(time.Minute)` $DIR/core/services/s4/in_memory_orm_test.go: `.UTC()` $DIR/core/services/s4/in_memory_orm_test.go: `.New(thisAddress.Big())` $DIR/core/services/s4/in_memory_orm_test.go: `.Big()` $DIR/core/services/s4/in_memory_orm_test.go: `.Add(time.Duration(i) * time.Second)` $DIR/core/services/s4/in_memory_orm_test.go: `.Duration(i)` $DIR/core/services/s4/in_memory_orm_test.go: `.UnixMilli()` $DIR/core/services/s4/in_memory_orm_test.go: `.Update(ctx, row)` $DIR/core/services/s4/in_memory_orm_test.go: `.Add(100 * time.Second)` $DIR/core/services/s4/in_memory_orm_test.go: `.DeleteExpired(ctx, 200, deadline)` $DIR/core/services/s4/in_memory_orm_test.go: `.GetUnconfirmedRows(ctx, 200)` $DIR/core/services/s4/in_memory_orm_test.go: `.Context(t)` $DIR/core/services/s4/in_memory_orm_test.go: `.NewInMemoryORM()` $DIR/core/services/s4/in_memory_orm_test.go: `.Now()` $DIR/core/services/s4/in_memory_orm_test.go: `.Add(100 * time.Second)` $DIR/core/services/s4/in_memory_orm_test.go: `.UnixMilli()` $DIR/core/services/s4/in_memory_orm_test.go: `.New(thisAddress.Big())` $DIR/core/services/s4/in_memory_orm_test.go: `.Big()` $DIR/core/services/s4/in_memory_orm_test.go: `.Update(ctx, row)` $DIR/core/services/s4/in_memory_orm_test.go: `.Sleep(time.Millisecond)` $DIR/core/services/s4/in_memory_orm_test.go: `.GetUnconfirmedRows(ctx, 100)` $DIR/core/services/s4/in_memory_orm_test.go: `.Context(t)` $DIR/core/services/s4/in_memory_orm_test.go: `.NewInMemoryORM()` $DIR/core/services/s4/in_memory_orm_test.go: `.Now()` $DIR/core/services/s4/in_memory_orm_test.go: `.Add(100 * time.Second)` $DIR/core/services/s4/in_memory_orm_test.go: `.UnixMilli()` $DIR/core/services/s4/in_memory_orm_test.go: `.New(thisAddress.Big())` $DIR/core/services/s4/in_memory_orm_test.go: `.Big()` $DIR/core/services/s4/in_memory_orm_test.go: `.Update(ctx, row)` $DIR/core/services/s4/in_memory_orm_test.go: `.GetSnapshot(ctx, s4.NewFullAddressRange())` $DIR/core/services/s4/in_memory_orm_test.go: `.NewFullAddressRange()` $DIR/core/services/s4/postgres_orm_test.go: `row.Version++` $DIR/core/services/s4/postgres_orm_test.go: `err = orm.Update(ctx, row)` $DIR/core/services/s4/postgres_orm_test.go: `err = orm.Update(ctx, row)` $DIR/core/services/s4/postgres_orm_test.go: `rows = generateTestRows(t, 1)` $DIR/core/services/s4/postgres_orm_test.go: `row.Confirmed = true` $DIR/core/services/s4/postgres_orm_test.go: `row.Version++` $DIR/core/services/s4/postgres_orm_test.go: `row.Confirmed = false` $DIR/core/services/s4/postgres_orm_test.go: `row.Version++` $DIR/core/services/s4/postgres_orm_test.go: `row.Version--` $DIR/core/services/s4/postgres_orm_test.go: `count++` $DIR/core/services/s4/postgres_orm_test.go: `t.Run("no rows", func(t *testing.T) { ctx := testutils.Context(t) rows, err := orm.GetSnapshot(ctx, s4.NewFullAddressRange()) assert.NoError(t, err) assert.Empty(t, rows) })` $DIR/core/services/s4/postgres_orm_test.go: `t.Run("full range", func(t *testing.T) { snapshot, err := orm.GetSnapshot(testutils.Context(t), s4.NewFullAddressRange()) assert.NoError(t, err) assert.Equal(t, len(rows), len(snapshot)) snapshotRowMap := make(map[string]*s4.SnapshotRow) for i, sr := range snapshot { // assuming unique addresses snapshotRowMap[sr.Address.String()] = snapshot[i] } for _, sr := range rows { snapshotRow, ok := snapshotRowMap[sr.Address.String()] assert.True(t, ok) assert.Equal(t, snapshotRow.Address, sr.Address) assert.Equal(t, snapshotRow.SlotId, sr.SlotId) assert.Equal(t, snapshotRow.Version, sr.Version) assert.Equal(t, snapshotRow.Expiration, sr.Expiration) assert.Equal(t, snapshotRow.Confirmed, sr.Confirmed) assert.Equal(t, snapshotRow.PayloadSize, uint64(len(sr.Payload))) } })` $DIR/core/services/s4/postgres_orm_test.go: `snapshotRowMap[sr.Address.String()] = snapshot[i]` $DIR/core/services/s4/postgres_orm_test.go: `t.Run("half range", func(t *testing.T) { ar, err := s4.NewInitialAddressRangeForIntervals(2) assert.NoError(t, err) snapshot, err := orm.GetSnapshot(testutils.Context(t), ar) assert.NoError(t, err) for _, sr := range snapshot { assert.True(t, ar.Contains(sr.Address)) } })` $DIR/core/services/s4/postgres_orm_test.go: `t.Run("no rows", func(t *testing.T) { ctx := testutils.Context(t) rows, err := orm.GetUnconfirmedRows(ctx, 5) assert.NoError(t, err) assert.Empty(t, rows) })` $DIR/core/services/s4/postgres_orm_test.go: `time.Sleep(testutils.TestInterval / 10)` $DIR/core/services/s4/postgres_orm_test.go: `err = ormB.Update(ctx, rowsB[i])` $DIR/core/services/s4/postgres_orm_test.go: `_, err = ormB.DeleteExpired(ctx, n, time.Now().UTC())` $DIR/core/services/s4/postgres_orm_test.go: `row.Version = math.MaxUint64 - 10` $DIR/core/services/s4/postgres_orm_test.go: `row.Version++` $DIR/core/services/s4/postgres_orm_test.go: `err = orm.Update(ctx, row)` $DIR/core/services/s4/postgres_orm_test.go: `.Context(t)` $DIR/core/services/s4/postgres_orm_test.go: `.Update(ctx, row)` $DIR/core/services/s4/postgres_orm_test.go: `.Update(ctx, row)` $DIR/core/services/s4/postgres_orm_test.go: `.Update(ctx, row)` $DIR/core/services/s4/postgres_orm_test.go: `.Get(ctx, row.Address, row.SlotId)` $DIR/core/services/s4/postgres_orm_test.go: `.Get(ctx, rows[0].Address, rows[0].SlotId)` $DIR/core/services/s4/postgres_orm_test.go: `.Context(t)` $DIR/core/services/s4/postgres_orm_test.go: `.Update(ctx, row)` $DIR/core/services/s4/postgres_orm_test.go: `.Context(t)` $DIR/core/services/s4/postgres_orm_test.go: `.Update(ctx, row)` $DIR/core/services/s4/postgres_orm_test.go: `.DeleteExpired(ctx, expired, time.Now().Add(2*time.Hour).UTC())` $DIR/core/services/s4/postgres_orm_test.go: `.Now()` $DIR/core/services/s4/postgres_orm_test.go: `.Add(2*time.Hour)` $DIR/core/services/s4/postgres_orm_test.go: `.UTC()` $DIR/core/services/s4/postgres_orm_test.go: `.Get(ctx, row.Address, row.SlotId)` $DIR/core/services/s4/postgres_orm_test.go: `.Is(err, s4.ErrNotFound)` $DIR/core/services/s4/postgres_orm_test.go: `.Run("no rows", func(t *testing.T) { ctx := testutils.Context(t) rows, err := orm.GetSnapshot(ctx, s4.NewFullAddressRange()) assert.NoError(t, err) assert.Empty(t, rows) })` $DIR/core/services/s4/postgres_orm_test.go: `.Context(t)` $DIR/core/services/s4/postgres_orm_test.go: `.GetSnapshot(ctx, s4.NewFullAddressRange())` $DIR/core/services/s4/postgres_orm_test.go: `.NewFullAddressRange()` $DIR/core/services/s4/postgres_orm_test.go: `.Context(t)` $DIR/core/services/s4/postgres_orm_test.go: `.Update(ctx, row)` $DIR/core/services/s4/postgres_orm_test.go: `.Run("full range", func(t *testing.T) { snapshot, err := orm.GetSnapshot(testutils.Context(t), s4.NewFullAddressRange()) assert.NoError(t, err) assert.Equal(t, len(rows), len(snapshot)) snapshotRowMap := make(map[string]*s4.SnapshotRow) for i, sr := range snapshot { // assuming unique addresses snapshotRowMap[sr.Address.String()] = snapshot[i] } for _, sr := range rows { snapshotRow, ok := snapshotRowMap[sr.Address.String()] assert.True(t, ok) assert.Equal(t, snapshotRow.Address, sr.Address) assert.Equal(t, snapshotRow.SlotId, sr.SlotId) assert.Equal(t, snapshotRow.Version, sr.Version) assert.Equal(t, snapshotRow.Expiration, sr.Expiration) assert.Equal(t, snapshotRow.Confirmed, sr.Confirmed) assert.Equal(t, snapshotRow.PayloadSize, uint64(len(sr.Payload))) } })` $DIR/core/services/s4/postgres_orm_test.go: `.GetSnapshot(testutils.Context(t), s4.NewFullAddressRange())` $DIR/core/services/s4/postgres_orm_test.go: `.Context(t)` $DIR/core/services/s4/postgres_orm_test.go: `.NewFullAddressRange()` $DIR/core/services/s4/postgres_orm_test.go: `.Address.String()` $DIR/core/services/s4/postgres_orm_test.go: `.Address.String()` $DIR/core/services/s4/postgres_orm_test.go: `.Run("half range", func(t *testing.T) { ar, err := s4.NewInitialAddressRangeForIntervals(2) assert.NoError(t, err) snapshot, err := orm.GetSnapshot(testutils.Context(t), ar) assert.NoError(t, err) for _, sr := range snapshot { assert.True(t, ar.Contains(sr.Address)) } })` $DIR/core/services/s4/postgres_orm_test.go: `.NewInitialAddressRangeForIntervals(2)` $DIR/core/services/s4/postgres_orm_test.go: `.GetSnapshot(testutils.Context(t), ar)` $DIR/core/services/s4/postgres_orm_test.go: `.Context(t)` $DIR/core/services/s4/postgres_orm_test.go: `.Run("no rows", func(t *testing.T) { ctx := testutils.Context(t) rows, err := orm.GetUnconfirmedRows(ctx, 5) assert.NoError(t, err) assert.Empty(t, rows) })` $DIR/core/services/s4/postgres_orm_test.go: `.Context(t)` $DIR/core/services/s4/postgres_orm_test.go: `.GetUnconfirmedRows(ctx, 5)` $DIR/core/services/s4/postgres_orm_test.go: `.Context(t)` $DIR/core/services/s4/postgres_orm_test.go: `.Update(ctx, row)` $DIR/core/services/s4/postgres_orm_test.go: `.Sleep(testutils.TestInterval / 10)` $DIR/core/services/s4/postgres_orm_test.go: `.GetUnconfirmedRows(ctx, 5)` $DIR/core/services/s4/postgres_orm_test.go: `.Context(t)` $DIR/core/services/s4/postgres_orm_test.go: `.Update(ctx, rowsA[i])` $DIR/core/services/s4/postgres_orm_test.go: `.Update(ctx, rowsB[i])` $DIR/core/services/s4/postgres_orm_test.go: `.GetUnconfirmedRows(ctx, n)` $DIR/core/services/s4/postgres_orm_test.go: `.GetUnconfirmedRows(ctx, n)` $DIR/core/services/s4/postgres_orm_test.go: `.DeleteExpired(ctx, n, time.Now().UTC())` $DIR/core/services/s4/postgres_orm_test.go: `.Now()` $DIR/core/services/s4/postgres_orm_test.go: `.UTC()` $DIR/core/services/s4/postgres_orm_test.go: `.GetSnapshot(ctx, s4.NewFullAddressRange())` $DIR/core/services/s4/postgres_orm_test.go: `.NewFullAddressRange()` $DIR/core/services/s4/postgres_orm_test.go: `.Context(t)` $DIR/core/services/s4/postgres_orm_test.go: `.Update(ctx, row)` $DIR/core/services/s4/postgres_orm_test.go: `.Update(ctx, row)` $DIR/core/services/s4/postgres_orm_test.go: `.Get(ctx, row.Address, row.SlotId)` $DIR/core/services/s4/storage_test.go: `t.Run("ErrNotFound", func(t *testing.T) { key := &s4.Key{ Address: testutils.NewAddress(), SlotId: 1, Version: 0, } ormMock.On("Get", mock.Anything, big.New(key.Address.Big()), key.SlotId).Return(nil, s4.ErrNotFound) _, _, err := storage.Get(testutils.Context(t), key) assert.ErrorIs(t, err, s4.ErrNotFound) })` $DIR/core/services/s4/storage_test.go: `ormMock.On("Get", mock.Anything, big.New(key.Address.Big()), key.SlotId).Return(nil, s4.ErrNotFound)` $DIR/core/services/s4/storage_test.go: `t.Run("ErrSlotIdTooBig", func(t *testing.T) { key := &s4.Key{ Address: testutils.NewAddress(), SlotId: constraints.MaxSlotsPerUser + 1, Version: 0, } _, _, err := storage.Get(testutils.Context(t), key) assert.ErrorIs(t, err, s4.ErrSlotIdTooBig) record := &s4.Record{ Payload: make([]byte, 10), Expiration: now.Add(time.Minute).UnixMilli(), } err = storage.Put(testutils.Context(t), key, record, []byte{}) assert.ErrorIs(t, err, s4.ErrSlotIdTooBig) })` $DIR/core/services/s4/storage_test.go: `err = storage.Put(testutils.Context(t), key, record, []byte{})` $DIR/core/services/s4/storage_test.go: `t.Run("ErrPayloadTooBig", func(t *testing.T) { key := &s4.Key{ Address: testutils.NewAddress(), SlotId: 1, Version: 0, } record := &s4.Record{ Payload: make([]byte, constraints.MaxPayloadSizeBytes+1), Expiration: now.Add(time.Minute).UnixMilli(), } err := storage.Put(testutils.Context(t), key, record, []byte{}) assert.ErrorIs(t, err, s4.ErrPayloadTooBig) })` $DIR/core/services/s4/storage_test.go: `t.Run("ErrPastExpiration", func(t *testing.T) { key := &s4.Key{ Address: testutils.NewAddress(), SlotId: 1, Version: 0, } record := &s4.Record{ Payload: make([]byte, 10), Expiration: now.UnixMilli() - 1, } err := storage.Put(testutils.Context(t), key, record, []byte{}) assert.ErrorIs(t, err, s4.ErrPastExpiration) })` $DIR/core/services/s4/storage_test.go: `t.Run("ErrExpirationTooLong", func(t *testing.T) { key := &s4.Key{ Address: testutils.NewAddress(), SlotId: 1, Version: 0, } record := &s4.Record{ Payload: make([]byte, 10), Expiration: now.UnixMilli() + 10000000, } err := storage.Put(testutils.Context(t), key, record, []byte{}) assert.ErrorIs(t, err, s4.ErrExpirationTooLong) })` $DIR/core/services/s4/storage_test.go: `t.Run("ErrWrongSignature", func(t *testing.T) { privateKey, address := testutils.NewPrivateKeyAndAddress(t) key := &s4.Key{ Address: address, SlotId: 2, Version: 0, } record := &s4.Record{ Payload: []byte("foobar"), Expiration: now.Add(time.Minute).UnixMilli(), } env := s4.NewEnvelopeFromRecord(key, record) signature, err := env.Sign(privateKey) assert.NoError(t, err) signature[0]++ err = storage.Put(testutils.Context(t), key, record, signature) assert.ErrorIs(t, err, s4.ErrWrongSignature) })` $DIR/core/services/s4/storage_test.go: `signature[0]++` $DIR/core/services/s4/storage_test.go: `err = storage.Put(testutils.Context(t), key, record, signature)` $DIR/core/services/s4/storage_test.go: `ormMock.ExpectedCalls = make([]*mock.Call, 0)` $DIR/core/services/s4/storage_test.go: `ormMock.On("Update", mock.Anything, mock.Anything).Return(s4.ErrVersionTooLow).Once()` $DIR/core/services/s4/storage_test.go: `err = storage.Put(testutils.Context(t), key, record, signature)` $DIR/core/services/s4/storage_test.go: `ormMock.On("Update", mock.Anything, mock.Anything).Return(nil)` $DIR/core/services/s4/storage_test.go: `ormMock.On("Get", mock.Anything, big.New(key.Address.Big()), uint(2)).Return(&s4.Row{ Address: big.New(key.Address.Big()), SlotId: key.SlotId, Version: key.Version, Payload: record.Payload, Expiration: record.Expiration, Signature: signature, }, nil)` $DIR/core/services/s4/storage_test.go: `err = storage.Put(testutils.Context(t), key, record, signature)` $DIR/core/services/s4/storage_test.go: `ormMock.On("GetSnapshot", mock.Anything, addressRange).Return(ormRows, nil)` $DIR/core/services/s4/storage_test.go: `.Now()` $DIR/core/services/s4/storage_test.go: `.Constraints()` $DIR/core/services/s4/storage_test.go: `.Now()` $DIR/core/services/s4/storage_test.go: `.Run("ErrNotFound", func(t *testing.T) { key := &s4.Key{ Address: testutils.NewAddress(), SlotId: 1, Version: 0, } ormMock.On("Get", mock.Anything, big.New(key.Address.Big()), key.SlotId).Return(nil, s4.ErrNotFound) _, _, err := storage.Get(testutils.Context(t), key) assert.ErrorIs(t, err, s4.ErrNotFound) })` $DIR/core/services/s4/storage_test.go: `.NewAddress()` $DIR/core/services/s4/storage_test.go: `.On("Get", mock.Anything, big.New(key.Address.Big()), key.SlotId)` $DIR/core/services/s4/storage_test.go: `.New(key.Address.Big())` $DIR/core/services/s4/storage_test.go: `.Address.Big()` $DIR/core/services/s4/storage_test.go: `.Return(nil, s4.ErrNotFound)` $DIR/core/services/s4/storage_test.go: `.Get(testutils.Context(t), key)` $DIR/core/services/s4/storage_test.go: `.Context(t)` $DIR/core/services/s4/storage_test.go: `.Run("ErrSlotIdTooBig", func(t *testing.T) { key := &s4.Key{ Address: testutils.NewAddress(), SlotId: constraints.MaxSlotsPerUser + 1, Version: 0, } _, _, err := storage.Get(testutils.Context(t), key) assert.ErrorIs(t, err, s4.ErrSlotIdTooBig) record := &s4.Record{ Payload: make([]byte, 10), Expiration: now.Add(time.Minute).UnixMilli(), } err = storage.Put(testutils.Context(t), key, record, []byte{}) assert.ErrorIs(t, err, s4.ErrSlotIdTooBig) })` $DIR/core/services/s4/storage_test.go: `.NewAddress()` $DIR/core/services/s4/storage_test.go: `.Get(testutils.Context(t), key)` $DIR/core/services/s4/storage_test.go: `.Context(t)` $DIR/core/services/s4/storage_test.go: `.Add(time.Minute)` $DIR/core/services/s4/storage_test.go: `.UnixMilli()` $DIR/core/services/s4/storage_test.go: `.Put(testutils.Context(t), key, record, []byte{})` $DIR/core/services/s4/storage_test.go: `.Context(t)` $DIR/core/services/s4/storage_test.go: `.Run("ErrPayloadTooBig", func(t *testing.T) { key := &s4.Key{ Address: testutils.NewAddress(), SlotId: 1, Version: 0, } record := &s4.Record{ Payload: make([]byte, constraints.MaxPayloadSizeBytes+1), Expiration: now.Add(time.Minute).UnixMilli(), } err := storage.Put(testutils.Context(t), key, record, []byte{}) assert.ErrorIs(t, err, s4.ErrPayloadTooBig) })` $DIR/core/services/s4/storage_test.go: `.NewAddress()` $DIR/core/services/s4/storage_test.go: `.Add(time.Minute)` $DIR/core/services/s4/storage_test.go: `.UnixMilli()` $DIR/core/services/s4/storage_test.go: `.Put(testutils.Context(t), key, record, []byte{})` $DIR/core/services/s4/storage_test.go: `.Context(t)` $DIR/core/services/s4/storage_test.go: `.Run("ErrPastExpiration", func(t *testing.T) { key := &s4.Key{ Address: testutils.NewAddress(), SlotId: 1, Version: 0, } record := &s4.Record{ Payload: make([]byte, 10), Expiration: now.UnixMilli() - 1, } err := storage.Put(testutils.Context(t), key, record, []byte{}) assert.ErrorIs(t, err, s4.ErrPastExpiration) })` $DIR/core/services/s4/storage_test.go: `.NewAddress()` $DIR/core/services/s4/storage_test.go: `.UnixMilli()` $DIR/core/services/s4/storage_test.go: `.Put(testutils.Context(t), key, record, []byte{})` $DIR/core/services/s4/storage_test.go: `.Context(t)` $DIR/core/services/s4/storage_test.go: `.Run("ErrExpirationTooLong", func(t *testing.T) { key := &s4.Key{ Address: testutils.NewAddress(), SlotId: 1, Version: 0, } record := &s4.Record{ Payload: make([]byte, 10), Expiration: now.UnixMilli() + 10000000, } err := storage.Put(testutils.Context(t), key, record, []byte{}) assert.ErrorIs(t, err, s4.ErrExpirationTooLong) })` $DIR/core/services/s4/storage_test.go: `.NewAddress()` $DIR/core/services/s4/storage_test.go: `.UnixMilli()` $DIR/core/services/s4/storage_test.go: `.Put(testutils.Context(t), key, record, []byte{})` $DIR/core/services/s4/storage_test.go: `.Context(t)` $DIR/core/services/s4/storage_test.go: `.Run("ErrWrongSignature", func(t *testing.T) { privateKey, address := testutils.NewPrivateKeyAndAddress(t) key := &s4.Key{ Address: address, SlotId: 2, Version: 0, } record := &s4.Record{ Payload: []byte("foobar"), Expiration: now.Add(time.Minute).UnixMilli(), } env := s4.NewEnvelopeFromRecord(key, record) signature, err := env.Sign(privateKey) assert.NoError(t, err) signature[0]++ err = storage.Put(testutils.Context(t), key, record, signature) assert.ErrorIs(t, err, s4.ErrWrongSignature) })` $DIR/core/services/s4/storage_test.go: `.NewPrivateKeyAndAddress(t)` $DIR/core/services/s4/storage_test.go: `.Add(time.Minute)` $DIR/core/services/s4/storage_test.go: `.UnixMilli()` $DIR/core/services/s4/storage_test.go: `.NewEnvelopeFromRecord(key, record)` $DIR/core/services/s4/storage_test.go: `.Sign(privateKey)` $DIR/core/services/s4/storage_test.go: `.Put(testutils.Context(t), key, record, signature)` $DIR/core/services/s4/storage_test.go: `.Context(t)` $DIR/core/services/s4/storage_test.go: `.NewPrivateKeyAndAddress(t)` $DIR/core/services/s4/storage_test.go: `.Add(time.Hour)` $DIR/core/services/s4/storage_test.go: `.UnixMilli()` $DIR/core/services/s4/storage_test.go: `.NewEnvelopeFromRecord(key, record)` $DIR/core/services/s4/storage_test.go: `.Sign(privateKey)` $DIR/core/services/s4/storage_test.go: `.On("Update", mock.Anything, mock.Anything)` $DIR/core/services/s4/storage_test.go: `.Return(s4.ErrVersionTooLow)` $DIR/core/services/s4/storage_test.go: `.Once()` $DIR/core/services/s4/storage_test.go: `.Put(testutils.Context(t), key, record, signature)` $DIR/core/services/s4/storage_test.go: `.Context(t)` $DIR/core/services/s4/storage_test.go: `.Now()` $DIR/core/services/s4/storage_test.go: `.NewPrivateKeyAndAddress(t)` $DIR/core/services/s4/storage_test.go: `.Add(time.Hour)` $DIR/core/services/s4/storage_test.go: `.UnixMilli()` $DIR/core/services/s4/storage_test.go: `.NewEnvelopeFromRecord(key, record)` $DIR/core/services/s4/storage_test.go: `.Sign(privateKey)` $DIR/core/services/s4/storage_test.go: `.On("Update", mock.Anything, mock.Anything)` $DIR/core/services/s4/storage_test.go: `.Return(nil)` $DIR/core/services/s4/storage_test.go: `.On("Get", mock.Anything, big.New(key.Address.Big()), uint(2))` $DIR/core/services/s4/storage_test.go: `.New(key.Address.Big())` $DIR/core/services/s4/storage_test.go: `.Address.Big()` $DIR/core/services/s4/storage_test.go: `.Return(&s4.Row{ Address: big.New(key.Address.Big()), SlotId: key.SlotId, Version: key.Version, Payload: record.Payload, Expiration: record.Expiration, Signature: signature, }, nil)` $DIR/core/services/s4/storage_test.go: `.New(key.Address.Big())` $DIR/core/services/s4/storage_test.go: `.Address.Big()` $DIR/core/services/s4/storage_test.go: `.Put(testutils.Context(t), key, record, signature)` $DIR/core/services/s4/storage_test.go: `.Context(t)` $DIR/core/services/s4/storage_test.go: `.Get(testutils.Context(t), key)` $DIR/core/services/s4/storage_test.go: `.Context(t)` $DIR/core/services/s4/storage_test.go: `.Now()` $DIR/core/services/s4/storage_test.go: `.NewAddress()` $DIR/core/services/s4/storage_test.go: `.NewSingleAddressRange(big.New(address.Big()))` $DIR/core/services/s4/storage_test.go: `.New(address.Big())` $DIR/core/services/s4/storage_test.go: `.Big()` $DIR/core/services/s4/storage_test.go: `.On("GetSnapshot", mock.Anything, addressRange)` $DIR/core/services/s4/storage_test.go: `.Return(ormRows, nil)` $DIR/core/services/s4/storage_test.go: `.List(testutils.Context(t), address)` $DIR/core/services/s4/storage_test.go: `.Context(t)` $DIR/core/services/signatures/ethdss/ethdss_test.go: `dssArgs.secret = suite.Scalar().Zero()` $DIR/core/services/signatures/ethdss/ethdss_test.go: `dss, err = NewDSS(dssArgs)` $DIR/core/services/signatures/ethdss/ethdss_test.go: `ps0, err = dss0.PartialSig()` $DIR/core/services/signatures/ethdss/ethdss_test.go: `ps0.Partial.I = 100` $DIR/core/services/signatures/ethdss/ethdss_test.go: `err = dss1.ProcessPartialSig(ps0)` $DIR/core/services/signatures/ethdss/ethdss_test.go: `ps0.Partial.I = goodI` $DIR/core/services/signatures/ethdss/ethdss_test.go: `ps0.SessionID = []byte("ahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh")` $DIR/core/services/signatures/ethdss/ethdss_test.go: `err = dss1.ProcessPartialSig(ps0)` $DIR/core/services/signatures/ethdss/ethdss_test.go: `ps0.SessionID = goodSessionID` $DIR/core/services/signatures/ethdss/ethdss_test.go: `ps0.Signature = ethschnorr.NewSignature()` $DIR/core/services/signatures/ethdss/ethdss_test.go: `copy(ps0.Signature.CommitmentPublicAddress[:], randomBytes(20))` $DIR/core/services/signatures/ethdss/ethdss_test.go: `ps0.Signature.Signature.Set(badSig)` $DIR/core/services/signatures/ethdss/ethdss_test.go: `ps0.Signature = goodSig` $DIR/core/services/signatures/ethdss/ethdss_test.go: `ps0.Partial.V = suite.Scalar().Zero()` $DIR/core/services/signatures/ethdss/ethdss_test.go: `ps0.Signature, err = ethschnorr.Sign(dss0.secret, ps0.Hash())` $DIR/core/services/signatures/ethdss/ethdss_test.go: `err = dss1.ProcessPartialSig(ps0)` $DIR/core/services/signatures/ethdss/ethdss_test.go: `ps0.Partial.V = goodV` $DIR/core/services/signatures/ethdss/ethdss_test.go: `ps0.Signature = goodSig` $DIR/core/services/signatures/ethdss/ethdss_test.go: `err = dss1.ProcessPartialSig(ps0)` $DIR/core/services/signatures/ethdss/ethdss_test.go: `sig, err = dss1.Signature()` $DIR/core/services/signatures/ethdss/ethdss_test.go: `dsss[i] = getDSS(i)` $DIR/core/services/signatures/ethdss/ethdss_test.go: `pss[i] = ps` $DIR/core/services/signatures/ethdss/ethdss_test.go: `printTest(t, dss0.msg, dss0.long.Commitments()[0], sig)` $DIR/core/services/signatures/ethdss/ethdss_test.go: `observedHashes[hash] = true` $DIR/core/services/signatures/ethdss/ethdss_test.go: `.Scalar()` $DIR/core/services/signatures/ethdss/ethdss_test.go: `.Zero()` $DIR/core/services/signatures/ethdss/ethdss_test.go: `.PartialSig()` $DIR/core/services/signatures/ethdss/ethdss_test.go: `.PartialSig()` $DIR/core/services/signatures/ethdss/ethdss_test.go: `.ProcessPartialSig(ps0)` $DIR/core/services/signatures/ethdss/ethdss_test.go: `.ProcessPartialSig(ps0)` $DIR/core/services/signatures/ethdss/ethdss_test.go: `.NewSignature()` $DIR/core/services/signatures/ethdss/ethdss_test.go: `.ToInt(suite.Scalar().Pick(randomStream))` $DIR/core/services/signatures/ethdss/ethdss_test.go: `.Scalar()` $DIR/core/services/signatures/ethdss/ethdss_test.go: `.Pick(randomStream)` $DIR/core/services/signatures/ethdss/ethdss_test.go: `.Signature.Signature.Set(badSig)` $DIR/core/services/signatures/ethdss/ethdss_test.go: `.Scalar()` $DIR/core/services/signatures/ethdss/ethdss_test.go: `.Zero()` $DIR/core/services/signatures/ethdss/ethdss_test.go: `.Sign(dss0.secret, ps0.Hash())` $DIR/core/services/signatures/ethdss/ethdss_test.go: `.Hash()` $DIR/core/services/signatures/ethdss/ethdss_test.go: `.ProcessPartialSig(ps0)` $DIR/core/services/signatures/ethdss/ethdss_test.go: `.ProcessPartialSig(ps0)` $DIR/core/services/signatures/ethdss/ethdss_test.go: `.Signature()` $DIR/core/services/signatures/ethdss/ethdss_test.go: `.PartialSig()` $DIR/core/services/signatures/ethdss/ethdss_test.go: `.Signature()` $DIR/core/services/signatures/ethdss/ethdss_test.go: `.long.Commitments()` $DIR/core/services/signatures/ethdss/ethdss_test.go: `.PartialSig()` $DIR/core/services/signatures/ethdss/ethdss_test.go: `.Signature()` $DIR/core/services/signatures/ethdss/ethdss_test.go: `.long.Commitments()` $DIR/core/services/signatures/ethdss/ethdss_test.go: `.PartialSig()` $DIR/core/services/signatures/ethdss/ethdss_test.go: `.Hash()` $DIR/core/services/signatures/ethschnorr/ethschnorr_test.go: `printTest(t, msg, kp.Private, kp.Public, sig)` $DIR/core/services/signatures/ethschnorr/ethschnorr_test.go: `copy(badPublicCommitmentAddress.CommitmentPublicAddress[:], sig.CommitmentPublicAddress[:])` $DIR/core/services/signatures/ethschnorr/ethschnorr_test.go: `badPublicCommitmentAddress.CommitmentPublicAddress[0] ^= 1` $DIR/core/services/signatures/ethschnorr/ethschnorr_test.go: `err = Verify(edSuite.Point(), i(), NewSignature())` $DIR/core/services/signatures/ethschnorr/ethschnorr_test.go: `err = Verify(secp256k1Suite.Point(), i(), &signature{Signature: big.NewInt(-1)})` $DIR/core/services/signatures/ethschnorr/ethschnorr_test.go: `err = Verify(secp256k1Suite.Point(), i(), &signature{Signature: u256Cardinality})` $DIR/core/services/signatures/ethschnorr/ethschnorr_test.go: `h, err = ChallengeHash(point, hash, u256Cardinality)` $DIR/core/services/signatures/ethschnorr/ethschnorr_test.go: `.New(mrand.NewSource(0))` $DIR/core/services/signatures/ethschnorr/ethschnorr_test.go: `.NewSource(0)` $DIR/core/services/signatures/ethschnorr/ethschnorr_test.go: `.Int(rand, maxUint256)` $DIR/core/services/signatures/ethschnorr/ethschnorr_test.go: `.Generate(randomStream)` $DIR/core/services/signatures/ethschnorr/ethschnorr_test.go: `.NewInt(0)` $DIR/core/services/signatures/ethschnorr/ethschnorr_test.go: `.Add(msg, big.NewInt(1))` $DIR/core/services/signatures/ethschnorr/ethschnorr_test.go: `.NewInt(1)` $DIR/core/services/signatures/ethschnorr/ethschnorr_test.go: `.Point()` $DIR/core/services/signatures/ethschnorr/ethschnorr_test.go: `.Add(kp.Public, kp.Public)` $DIR/core/services/signatures/ethschnorr/ethschnorr_test.go: `.NewInt(0)` $DIR/core/services/signatures/ethschnorr/ethschnorr_test.go: `.Add(sig.Signature, one)` $DIR/core/services/signatures/ethschnorr/ethschnorr_test.go: `.NewBlakeSHA256Curve25519(false)` $DIR/core/services/signatures/ethschnorr/ethschnorr_test.go: `.Scalar()` $DIR/core/services/signatures/ethschnorr/ethschnorr_test.go: `.Point()` $DIR/core/services/signatures/ethschnorr/ethschnorr_test.go: `.Point()` $DIR/core/services/signatures/ethschnorr/ethschnorr_test.go: `.NewInt(-1)` $DIR/core/services/signatures/ethschnorr/ethschnorr_test.go: `.Point()` $DIR/core/services/signatures/ethschnorr/ethschnorr_test.go: `.NewInt(0)` $DIR/core/services/signatures/ethschnorr/ethschnorr_test.go: `.Point()` $DIR/core/services/signatures/ethschnorr/ethschnorr_test.go: `.NewInt(-1)` $DIR/core/services/signatures/secp256k1/curve_test.go: `.String()` $DIR/core/services/signatures/secp256k1/curve_test.go: `.Point()` $DIR/core/services/signatures/secp256k1/field_test.go: `g.SetInt(i)` $DIR/core/services/signatures/secp256k1/field_test.go: `i.Add(i, big.NewInt(1))` $DIR/core/services/signatures/secp256k1/field_test.go: `g.Set(f)` $DIR/core/services/signatures/secp256k1/field_test.go: `g.Add(g, fieldEltFromInt(1))` $DIR/core/services/signatures/secp256k1/field_test.go: `f.Pick(randomStream)` $DIR/core/services/signatures/secp256k1/field_test.go: `observedFieldElt(t, f)` $DIR/core/services/signatures/secp256k1/field_test.go: `f.Pick(randomStream)` $DIR/core/services/signatures/secp256k1/field_test.go: `observedFieldElt(t, f)` $DIR/core/services/signatures/secp256k1/field_test.go: `g.Neg(g)` $DIR/core/services/signatures/secp256k1/field_test.go: `f.Pick(randomStream)` $DIR/core/services/signatures/secp256k1/field_test.go: `observedFieldElt(t, f)` $DIR/core/services/signatures/secp256k1/field_test.go: `g.Add(f, f)` $DIR/core/services/signatures/secp256k1/field_test.go: `f.Pick(randomStream)` $DIR/core/services/signatures/secp256k1/field_test.go: `observedFieldElt(t, f)` $DIR/core/services/signatures/secp256k1/field_test.go: `g.SetBytes(f.Bytes())` $DIR/core/services/signatures/secp256k1/field_test.go: `f.Pick(randomStream)` $DIR/core/services/signatures/secp256k1/field_test.go: `observedFieldElt(t, f)` $DIR/core/services/signatures/secp256k1/field_test.go: `rv = bigIntSqrt.int().ModSqrt(nonSquare.int(), q)` $DIR/core/services/signatures/secp256k1/field_test.go: `.NewInt(test)` $DIR/core/services/signatures/secp256k1/field_test.go: `.SetInt(i)` $DIR/core/services/signatures/secp256k1/field_test.go: `.Add(i, big.NewInt(1))` $DIR/core/services/signatures/secp256k1/field_test.go: `.NewInt(1)` $DIR/core/services/signatures/secp256k1/field_test.go: `.String()` $DIR/core/services/signatures/secp256k1/field_test.go: `.Equal((*fieldElt)(nil))` $DIR/core/services/signatures/secp256k1/field_test.go: `.Set(f)` $DIR/core/services/signatures/secp256k1/field_test.go: `.Add(g, fieldEltFromInt(1))` $DIR/core/services/signatures/secp256k1/field_test.go: `.Add(q, big.NewInt(1))` $DIR/core/services/signatures/secp256k1/field_test.go: `.NewInt(1)` $DIR/core/services/signatures/secp256k1/field_test.go: `.Pick(randomStream)` $DIR/core/services/signatures/secp256k1/field_test.go: `.int()` $DIR/core/services/signatures/secp256k1/field_test.go: `.Cmp(big.NewInt(1000000000))` $DIR/core/services/signatures/secp256k1/field_test.go: `.NewInt(1000000000)` $DIR/core/services/signatures/secp256k1/field_test.go: `.Pick(randomStream)` $DIR/core/services/signatures/secp256k1/field_test.go: `.Clone()` $DIR/core/services/signatures/secp256k1/field_test.go: `.Neg(g)` $DIR/core/services/signatures/secp256k1/field_test.go: `.Pick(randomStream)` $DIR/core/services/signatures/secp256k1/field_test.go: `.Clone()` $DIR/core/services/signatures/secp256k1/field_test.go: `.Clone()` $DIR/core/services/signatures/secp256k1/field_test.go: `.Add(f, f)` $DIR/core/services/signatures/secp256k1/field_test.go: `.Pick(randomStream)` $DIR/core/services/signatures/secp256k1/field_test.go: `.SetBytes(f.Bytes())` $DIR/core/services/signatures/secp256k1/field_test.go: `.Bytes()` $DIR/core/services/signatures/secp256k1/field_test.go: `.Pick(randomStream)` $DIR/core/services/signatures/secp256k1/field_test.go: `.Neg(g)` $DIR/core/services/signatures/secp256k1/field_test.go: `.int()` $DIR/core/services/signatures/secp256k1/field_test.go: `.ModSqrt(s.int(), q)` $DIR/core/services/signatures/secp256k1/field_test.go: `.int()` $DIR/core/services/signatures/secp256k1/field_test.go: `.Neg(s)` $DIR/core/services/signatures/secp256k1/field_test.go: `.int()` $DIR/core/services/signatures/secp256k1/field_test.go: `.ModSqrt(nonSquare.int(), q)` $DIR/core/services/signatures/secp256k1/field_test.go: `.int()` $DIR/core/services/signatures/secp256k1/point_test.go: `f.Pick(randomStreamPoint)` $DIR/core/services/signatures/secp256k1/point_test.go: `g.Add(g, f)` $DIR/core/services/signatures/secp256k1/point_test.go: `g.Null()` $DIR/core/services/signatures/secp256k1/point_test.go: `f.Pick(randomStreamPoint)` $DIR/core/services/signatures/secp256k1/point_test.go: `g.Add(f, g)` $DIR/core/services/signatures/secp256k1/point_test.go: `p.Set(base)` $DIR/core/services/signatures/secp256k1/point_test.go: `p.Embed(data, randomStreamPoint)` $DIR/core/services/signatures/secp256k1/point_test.go: `uint256Bytes[0] = 30` $DIR/core/services/signatures/secp256k1/point_test.go: `p.X.SetBytes(uint256Bytes)` $DIR/core/services/signatures/secp256k1/point_test.go: `p.Pick(randomStreamPoint)` $DIR/core/services/signatures/secp256k1/point_test.go: `_, err = p.MarshalTo(&b)` $DIR/core/services/signatures/secp256k1/point_test.go: `_, err = p.UnmarshalFrom(&b)` $DIR/core/services/signatures/secp256k1/point_test.go: `p.Pick(randomStreamPoint)` $DIR/core/services/signatures/secp256k1/point_test.go: `p.Sub(p, q)` $DIR/core/services/signatures/secp256k1/point_test.go: `p.Neg(q)` $DIR/core/services/signatures/secp256k1/point_test.go: `r.Neg(q)` $DIR/core/services/signatures/secp256k1/point_test.go: `p.Sub(q, r)` $DIR/core/services/signatures/secp256k1/point_test.go: `p = nil` $DIR/core/services/signatures/secp256k1/point_test.go: `p = newPoint()` $DIR/core/services/signatures/secp256k1/point_test.go: `p.Pick(randomStreamPoint)` $DIR/core/services/signatures/secp256k1/point_test.go: `multiplier.Pick(randomStreamPoint)` $DIR/core/services/signatures/secp256k1/point_test.go: `comparee.Base()` $DIR/core/services/signatures/secp256k1/point_test.go: `comparee = p.Clone().(*secp256k1Point)` $DIR/core/services/signatures/secp256k1/point_test.go: `q.Mul(multiplier, p)` $DIR/core/services/signatures/secp256k1/point_test.go: `p.Pick(randomStreamPoint)` $DIR/core/services/signatures/secp256k1/point_test.go: `err = q.UnmarshalBinary(serialized)` $DIR/core/services/signatures/secp256k1/point_test.go: `p.X.SetInt(big.NewInt(0))` $DIR/core/services/signatures/secp256k1/point_test.go: `p.X.SetInt(big.NewInt(1))` $DIR/core/services/signatures/secp256k1/point_test.go: `_, err = p.MarshalBinary()` $DIR/core/services/signatures/secp256k1/point_test.go: `err = p.UnmarshalBinary(data)` $DIR/core/services/signatures/secp256k1/point_test.go: `data[32] = 2` $DIR/core/services/signatures/secp256k1/point_test.go: `data[32] = 0` $DIR/core/services/signatures/secp256k1/point_test.go: `data[31] = 5` $DIR/core/services/signatures/secp256k1/point_test.go: `p.Add(p, p)` $DIR/core/services/signatures/secp256k1/point_test.go: `.String()` $DIR/core/services/signatures/secp256k1/point_test.go: `.Clone()` $DIR/core/services/signatures/secp256k1/point_test.go: `.Pick(randomStreamPoint)` $DIR/core/services/signatures/secp256k1/point_test.go: `.Clone()` $DIR/core/services/signatures/secp256k1/point_test.go: `.Clone()` $DIR/core/services/signatures/secp256k1/point_test.go: `.Add(g, f)` $DIR/core/services/signatures/secp256k1/point_test.go: `.Null()` $DIR/core/services/signatures/secp256k1/point_test.go: `.Pick(randomStreamPoint)` $DIR/core/services/signatures/secp256k1/point_test.go: `.Add(f, g)` $DIR/core/services/signatures/secp256k1/point_test.go: `.Base()` $DIR/core/services/signatures/secp256k1/point_test.go: `.Set(base)` $DIR/core/services/signatures/secp256k1/point_test.go: `.EmbedLen()` $DIR/core/services/signatures/secp256k1/point_test.go: `.Read(data)` $DIR/core/services/signatures/secp256k1/point_test.go: `.Embed(data, randomStreamPoint)` $DIR/core/services/signatures/secp256k1/point_test.go: `.Data()` $DIR/core/services/signatures/secp256k1/point_test.go: `.X.SetBytes(uint256Bytes)` $DIR/core/services/signatures/secp256k1/point_test.go: `.Data()` $DIR/core/services/signatures/secp256k1/point_test.go: `.Pick(randomStreamPoint)` $DIR/core/services/signatures/secp256k1/point_test.go: `.MarshalTo(&b)` $DIR/core/services/signatures/secp256k1/point_test.go: `.UnmarshalFrom(&b)` $DIR/core/services/signatures/secp256k1/point_test.go: `.EmbedLen()` $DIR/core/services/signatures/secp256k1/point_test.go: `.Null()` $DIR/core/services/signatures/secp256k1/point_test.go: `.Pick(randomStreamPoint)` $DIR/core/services/signatures/secp256k1/point_test.go: `.Clone()` $DIR/core/services/signatures/secp256k1/point_test.go: `.Sub(p, q)` $DIR/core/services/signatures/secp256k1/point_test.go: `.Neg(q)` $DIR/core/services/signatures/secp256k1/point_test.go: `.Add(p, q)` $DIR/core/services/signatures/secp256k1/point_test.go: `.Neg(q)` $DIR/core/services/signatures/secp256k1/point_test.go: `.Sub(q, r)` $DIR/core/services/signatures/secp256k1/point_test.go: `.Add(q, q)` $DIR/core/services/signatures/secp256k1/point_test.go: `.Null()` $DIR/core/services/signatures/secp256k1/point_test.go: `.NewInt(int64(1))` $DIR/core/services/signatures/secp256k1/point_test.go: `.Pick(randomStreamPoint)` $DIR/core/services/signatures/secp256k1/point_test.go: `.Pick(randomStreamPoint)` $DIR/core/services/signatures/secp256k1/point_test.go: `.Mul(one, p)` $DIR/core/services/signatures/secp256k1/point_test.go: `.Base()` $DIR/core/services/signatures/secp256k1/point_test.go: `.Clone()` $DIR/core/services/signatures/secp256k1/point_test.go: `.Mul(multiplier, p)` $DIR/core/services/signatures/secp256k1/point_test.go: `.Neg(multiplier)` $DIR/core/services/signatures/secp256k1/point_test.go: `.Mul(negMultiplier, p)` $DIR/core/services/signatures/secp256k1/point_test.go: `.Add(q, r)` $DIR/core/services/signatures/secp256k1/point_test.go: `.Pick(randomStreamPoint)` $DIR/core/services/signatures/secp256k1/point_test.go: `.MarshalBinary()` $DIR/core/services/signatures/secp256k1/point_test.go: `.UnmarshalBinary(serialized)` $DIR/core/services/signatures/secp256k1/point_test.go: `.X.SetInt(big.NewInt(0))` $DIR/core/services/signatures/secp256k1/point_test.go: `.NewInt(0)` $DIR/core/services/signatures/secp256k1/point_test.go: `.MarshalBinary()` $DIR/core/services/signatures/secp256k1/point_test.go: `.X.SetInt(big.NewInt(1))` $DIR/core/services/signatures/secp256k1/point_test.go: `.NewInt(1)` $DIR/core/services/signatures/secp256k1/point_test.go: `.MarshalBinary()` $DIR/core/services/signatures/secp256k1/point_test.go: `.MarshalID()` $DIR/core/services/signatures/secp256k1/point_test.go: `.UnmarshalBinary(data)` $DIR/core/services/signatures/secp256k1/point_test.go: `.Base()` $DIR/core/services/signatures/secp256k1/point_test.go: `.Add(p, p)` $DIR/core/services/signatures/secp256k1/point_test.go: `.Base()` $DIR/core/services/signatures/secp256k1/point_test.go: `.Equal(q)` $DIR/core/services/signatures/secp256k1/point_test.go: `.NewInt(0)` $DIR/core/services/signatures/secp256k1/point_test.go: `.SetString(pString, 16)` $DIR/core/services/signatures/secp256k1/point_test.go: `.Mul(private, nil)` $DIR/core/services/signatures/secp256k1/point_test.go: `.Sprintf("%x", address)` $DIR/core/services/signatures/secp256k1/point_test.go: `.NewBlakeSHA256Curve25519(false)` $DIR/core/services/signatures/secp256k1/point_test.go: `.Point()` $DIR/core/services/signatures/secp256k1/point_test.go: `.Base()` $DIR/core/services/signatures/secp256k1/scalar_test.go: `g.Set(f)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `f.Add(f, newScalar(big.NewInt(1)))` $DIR/core/services/signatures/secp256k1/scalar_test.go: `f.Pick(randomStreamScalar)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `observedScalar(t, f)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `f.Pick(randomStreamScalar)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `observedScalar(t, f)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `g.Neg(g)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `f.Pick(randomStreamScalar)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `observedScalar(t, f)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `g.Add(f, f)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `f.Pick(randomStreamScalar)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `observedScalar(t, f)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `err = g.UnmarshalBinary(data)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `_, err = f.UnmarshalFrom(&buf)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `f.Pick(randomStreamScalar)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `observedScalar(t, f)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `g.Inv(f)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `h.Mul(f, g)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `h.Div(f, f)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `h.Div(newScalar(big.NewInt(1)), f)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `h.Pick(randomStreamScalar)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `observedScalar(t, h)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `j.Neg(j.Mul(h, f))` $DIR/core/services/signatures/secp256k1/scalar_test.go: `k.Mul(h, k.Neg(f))` $DIR/core/services/signatures/secp256k1/scalar_test.go: `IntToScalar(u256Cardinality)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.NewInt(test)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Set(f)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Add(f, newScalar(big.NewInt(1)))` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.NewInt(1)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.NewInt(1)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.NewInt(0)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Add(ToInt(one), GroupOrder)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Clone()` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Pick(randomStreamScalar)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Clone()` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Pick(randomStreamScalar)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Clone()` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Neg(g)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Clone()` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Pick(randomStreamScalar)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.NewInt(1)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Clone()` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Clone()` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Add(f, f)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Pick(randomStreamScalar)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.MarshalBinary()` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.UnmarshalBinary(data)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.MarshalID()` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.MarshalTo(&buf)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.UnmarshalFrom(&buf)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Pick(randomStreamScalar)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Inv(f)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Mul(f, g)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Div(f, f)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Div(newScalar(big.NewInt(1)), f)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.NewInt(1)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Pick(randomStreamScalar)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Neg(j.Mul(h, f))` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Mul(h, f)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Mul(h, k.Neg(f))` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Neg(f)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.String()` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.One()` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.NewInt(1)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.One()` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Lsh(big.NewInt(1), 256)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.NewInt(1)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.int()` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Sub(u256Cardinality, GroupOrder)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.NewBlakeSHA256Curve25519(true)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Lsh(big.NewInt(1), 256)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.NewInt(1)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Sub(zero().Lsh(big.NewInt(1), 256), GroupOrder)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.Lsh(big.NewInt(1), 256)` $DIR/core/services/signatures/secp256k1/scalar_test.go: `.NewInt(1)` $DIR/core/services/signatures/secp256k1/suite_test.go: `.EncodeToString(s.Hash().Sum(nil))` $DIR/core/services/signatures/secp256k1/suite_test.go: `.Hash()` $DIR/core/services/signatures/secp256k1/suite_test.go: `.Sum(nil)` $DIR/core/services/signatures/secp256k1/suite_test.go: `.RandomStream()` $DIR/core/services/streams/delegate_test.go: `t.Run("errors if job is missing streamID", func(t *testing.T) { _, err := d.ServicesForSpec(testutils.Context(t), jb) assert.EqualError(t, err, "streamID is required to be present for stream specs") })` $DIR/core/services/streams/delegate_test.go: `jb.StreamID = ptr(uint32(42))` $DIR/core/services/streams/delegate_test.go: `t.Run("returns services", func(t *testing.T) { srvs, err := d.ServicesForSpec(testutils.Context(t), jb) require.NoError(t, err) assert.Len(t, srvs, 2) assert.IsType(t, &ocrcommon.RunResultSaver{}, srvs[0]) strmSrv := srvs[1].(*StreamService) assert.Equal(t, registry, strmSrv.registry) assert.Equal(t, StreamID(42), strmSrv.id) assert.Equal(t, jb.PipelineSpec, strmSrv.spec) assert.NotNil(t, strmSrv.lggr) assert.Equal(t, srvs[0], strmSrv.rrs) })` $DIR/core/services/streams/delegate_test.go: `t.Run(tc.name, func(t *testing.T) { s, err := ValidatedStreamSpec(tc.toml) tc.assertion(t, s, err) })` $DIR/core/services/streams/delegate_test.go: `tc.assertion(t, s, err)` $DIR/core/services/streams/delegate_test.go: `.TestLogger(t)` $DIR/core/services/streams/delegate_test.go: `.Run("errors if job is missing streamID", func(t *testing.T) { _, err := d.ServicesForSpec(testutils.Context(t), jb) assert.EqualError(t, err, "streamID is required to be present for stream specs") })` $DIR/core/services/streams/delegate_test.go: `.ServicesForSpec(testutils.Context(t), jb)` $DIR/core/services/streams/delegate_test.go: `.Context(t)` $DIR/core/services/streams/delegate_test.go: `.Run("returns services", func(t *testing.T) { srvs, err := d.ServicesForSpec(testutils.Context(t), jb) require.NoError(t, err) assert.Len(t, srvs, 2) assert.IsType(t, &ocrcommon.RunResultSaver{}, srvs[0]) strmSrv := srvs[1].(*StreamService) assert.Equal(t, registry, strmSrv.registry) assert.Equal(t, StreamID(42), strmSrv.id) assert.Equal(t, jb.PipelineSpec, strmSrv.spec) assert.NotNil(t, strmSrv.lggr) assert.Equal(t, srvs[0], strmSrv.rrs) })` $DIR/core/services/streams/delegate_test.go: `.ServicesForSpec(testutils.Context(t), jb)` $DIR/core/services/streams/delegate_test.go: `.Context(t)` $DIR/core/services/streams/delegate_test.go: `.Run(tc.name, func(t *testing.T) { s, err := ValidatedStreamSpec(tc.toml) tc.assertion(t, s, err) })` $DIR/core/services/streams/delegate_test.go: `.assertion(t, s, err)` $DIR/core/services/streams/stream_registry_test.go: `t.Run("Get", func(t *testing.T) { sr := newRegistry(lggr, runner) sr.streams[1] = &mockStream{run: &pipeline.Run{ID: 1}} sr.streams[2] = &mockStream{run: &pipeline.Run{ID: 2}} sr.streams[3] = &mockStream{run: &pipeline.Run{ID: 3}} v, exists := sr.Get(1) assert.True(t, exists) assert.Equal(t, sr.streams[1], v) v, exists = sr.Get(2) assert.True(t, exists) assert.Equal(t, sr.streams[2], v) v, exists = sr.Get(3) assert.True(t, exists) assert.Equal(t, sr.streams[3], v) v, exists = sr.Get(4) assert.Nil(t, v) assert.False(t, exists) })` $DIR/core/services/streams/stream_registry_test.go: `sr.streams[1] = &mockStream{run: &pipeline.Run{ID: 1}}` $DIR/core/services/streams/stream_registry_test.go: `sr.streams[2] = &mockStream{run: &pipeline.Run{ID: 2}}` $DIR/core/services/streams/stream_registry_test.go: `sr.streams[3] = &mockStream{run: &pipeline.Run{ID: 3}}` $DIR/core/services/streams/stream_registry_test.go: `v, exists = sr.Get(2)` $DIR/core/services/streams/stream_registry_test.go: `v, exists = sr.Get(3)` $DIR/core/services/streams/stream_registry_test.go: `v, exists = sr.Get(4)` $DIR/core/services/streams/stream_registry_test.go: `t.Run("Register", func(t *testing.T) { sr := newRegistry(lggr, runner) t.Run("registers new stream", func(t *testing.T) { assert.Len(t, sr.streams, 0) err := sr.Register(1, pipeline.Spec{ID: 32, DotDagSource: "source"}, nil) require.NoError(t, err) assert.Len(t, sr.streams, 1) v, exists := sr.Get(1) require.True(t, exists) strm := v.(*stream) assert.Equal(t, StreamID(1), strm.id) assert.Equal(t, int32(32), strm.spec.ID) }) t.Run("errors when attempt to re-register a stream with an existing ID", func(t *testing.T) { assert.Len(t, sr.streams, 1) err := sr.Register(1, pipeline.Spec{ID: 33, DotDagSource: "source"}, nil) require.Error(t, err) assert.Len(t, sr.streams, 1) assert.EqualError(t, err, "stream already registered for id: 1") v, exists := sr.Get(1) require.True(t, exists) strm := v.(*stream) assert.Equal(t, StreamID(1), strm.id) assert.Equal(t, int32(32), strm.spec.ID) }) })` $DIR/core/services/streams/stream_registry_test.go: `t.Run("registers new stream", func(t *testing.T) { assert.Len(t, sr.streams, 0) err := sr.Register(1, pipeline.Spec{ID: 32, DotDagSource: "source"}, nil) require.NoError(t, err) assert.Len(t, sr.streams, 1) v, exists := sr.Get(1) require.True(t, exists) strm := v.(*stream) assert.Equal(t, StreamID(1), strm.id) assert.Equal(t, int32(32), strm.spec.ID) })` $DIR/core/services/streams/stream_registry_test.go: `t.Run("errors when attempt to re-register a stream with an existing ID", func(t *testing.T) { assert.Len(t, sr.streams, 1) err := sr.Register(1, pipeline.Spec{ID: 33, DotDagSource: "source"}, nil) require.Error(t, err) assert.Len(t, sr.streams, 1) assert.EqualError(t, err, "stream already registered for id: 1") v, exists := sr.Get(1) require.True(t, exists) strm := v.(*stream) assert.Equal(t, StreamID(1), strm.id) assert.Equal(t, int32(32), strm.spec.ID) })` $DIR/core/services/streams/stream_registry_test.go: `sr.streams[1] = &mockStream{run: &pipeline.Run{ID: 1}}` $DIR/core/services/streams/stream_registry_test.go: `sr.streams[2] = &mockStream{run: &pipeline.Run{ID: 2}}` $DIR/core/services/streams/stream_registry_test.go: `sr.streams[3] = &mockStream{run: &pipeline.Run{ID: 3}}` $DIR/core/services/streams/stream_registry_test.go: `t.Run("unregisters a stream", func(t *testing.T) { assert.Len(t, sr.streams, 3) sr.Unregister(1) assert.Len(t, sr.streams, 2) _, exists := sr.streams[1] assert.False(t, exists) })` $DIR/core/services/streams/stream_registry_test.go: `sr.Unregister(1)` $DIR/core/services/streams/stream_registry_test.go: `t.Run("no effect when unregistering a non-existent stream", func(t *testing.T) { assert.Len(t, sr.streams, 2) sr.Unregister(1) assert.Len(t, sr.streams, 2) _, exists := sr.streams[1] assert.False(t, exists) })` $DIR/core/services/streams/stream_registry_test.go: `sr.Unregister(1)` $DIR/core/services/streams/stream_registry_test.go: `.TestLogger(t)` $DIR/core/services/streams/stream_registry_test.go: `.Run("Get", func(t *testing.T) { sr := newRegistry(lggr, runner) sr.streams[1] = &mockStream{run: &pipeline.Run{ID: 1}} sr.streams[2] = &mockStream{run: &pipeline.Run{ID: 2}} sr.streams[3] = &mockStream{run: &pipeline.Run{ID: 3}} v, exists := sr.Get(1) assert.True(t, exists) assert.Equal(t, sr.streams[1], v) v, exists = sr.Get(2) assert.True(t, exists) assert.Equal(t, sr.streams[2], v) v, exists = sr.Get(3) assert.True(t, exists) assert.Equal(t, sr.streams[3], v) v, exists = sr.Get(4) assert.Nil(t, v) assert.False(t, exists) })` $DIR/core/services/streams/stream_registry_test.go: `.Get(1)` $DIR/core/services/streams/stream_registry_test.go: `.Get(2)` $DIR/core/services/streams/stream_registry_test.go: `.Get(3)` $DIR/core/services/streams/stream_registry_test.go: `.Get(4)` $DIR/core/services/streams/stream_registry_test.go: `.Run("Register", func(t *testing.T) { sr := newRegistry(lggr, runner) t.Run("registers new stream", func(t *testing.T) { assert.Len(t, sr.streams, 0) err := sr.Register(1, pipeline.Spec{ID: 32, DotDagSource: "source"}, nil) require.NoError(t, err) assert.Len(t, sr.streams, 1) v, exists := sr.Get(1) require.True(t, exists) strm := v.(*stream) assert.Equal(t, StreamID(1), strm.id) assert.Equal(t, int32(32), strm.spec.ID) }) t.Run("errors when attempt to re-register a stream with an existing ID", func(t *testing.T) { assert.Len(t, sr.streams, 1) err := sr.Register(1, pipeline.Spec{ID: 33, DotDagSource: "source"}, nil) require.Error(t, err) assert.Len(t, sr.streams, 1) assert.EqualError(t, err, "stream already registered for id: 1") v, exists := sr.Get(1) require.True(t, exists) strm := v.(*stream) assert.Equal(t, StreamID(1), strm.id) assert.Equal(t, int32(32), strm.spec.ID) }) })` $DIR/core/services/streams/stream_registry_test.go: `.Run("registers new stream", func(t *testing.T) { assert.Len(t, sr.streams, 0) err := sr.Register(1, pipeline.Spec{ID: 32, DotDagSource: "source"}, nil) require.NoError(t, err) assert.Len(t, sr.streams, 1) v, exists := sr.Get(1) require.True(t, exists) strm := v.(*stream) assert.Equal(t, StreamID(1), strm.id) assert.Equal(t, int32(32), strm.spec.ID) })` $DIR/core/services/streams/stream_registry_test.go: `.Register(1, pipeline.Spec{ID: 32, DotDagSource: "source"}, nil)` $DIR/core/services/streams/stream_registry_test.go: `.Get(1)` $DIR/core/services/streams/stream_registry_test.go: `.Run("errors when attempt to re-register a stream with an existing ID", func(t *testing.T) { assert.Len(t, sr.streams, 1) err := sr.Register(1, pipeline.Spec{ID: 33, DotDagSource: "source"}, nil) require.Error(t, err) assert.Len(t, sr.streams, 1) assert.EqualError(t, err, "stream already registered for id: 1") v, exists := sr.Get(1) require.True(t, exists) strm := v.(*stream) assert.Equal(t, StreamID(1), strm.id) assert.Equal(t, int32(32), strm.spec.ID) })` $DIR/core/services/streams/stream_registry_test.go: `.Register(1, pipeline.Spec{ID: 33, DotDagSource: "source"}, nil)` $DIR/core/services/streams/stream_registry_test.go: `.Get(1)` $DIR/core/services/streams/stream_registry_test.go: `.Run("unregisters a stream", func(t *testing.T) { assert.Len(t, sr.streams, 3) sr.Unregister(1) assert.Len(t, sr.streams, 2) _, exists := sr.streams[1] assert.False(t, exists) })` $DIR/core/services/streams/stream_registry_test.go: `.Unregister(1)` $DIR/core/services/streams/stream_registry_test.go: `.Run("no effect when unregistering a non-existent stream", func(t *testing.T) { assert.Len(t, sr.streams, 2) sr.Unregister(1) assert.Len(t, sr.streams, 2) _, exists := sr.streams[1] assert.False(t, exists) })` $DIR/core/services/streams/stream_registry_test.go: `.Unregister(1)` $DIR/core/services/streams/stream_test.go: `t.Run("errors with empty pipeline", func(t *testing.T) { _, _, err := strm.Run(ctx) assert.EqualError(t, err, "Run failed: Run failed due to unparseable pipeline: empty pipeline") })` $DIR/core/services/streams/stream_test.go: `spec.DotDagSource = ` succeed [type=memo value=42] succeed; `` $DIR/core/services/streams/stream_test.go: `strm = newStream(lggr, id, spec, runner, nil)` $DIR/core/services/streams/stream_test.go: `t.Run("executes the pipeline (success)", func(t *testing.T) { runner.run = &pipeline.Run{ID: 42} runner.trrs = []pipeline.TaskRunResult{pipeline.TaskRunResult{ID: UUID}} runner.err = nil run, trrs, err := strm.Run(ctx) assert.NoError(t, err) assert.Equal(t, int64(42), run.ID) require.Len(t, trrs, 1) assert.Equal(t, UUID, trrs[0].ID) })` $DIR/core/services/streams/stream_test.go: `runner.run = &pipeline.Run{ID: 42}` $DIR/core/services/streams/stream_test.go: `runner.trrs = []pipeline.TaskRunResult{pipeline.TaskRunResult{ID: UUID}}` $DIR/core/services/streams/stream_test.go: `runner.err = nil` $DIR/core/services/streams/stream_test.go: `t.Run("executes the pipeline (failure)", func(t *testing.T) { runner.err = errors.New("something exploded") _, _, err := strm.Run(ctx) require.Error(t, err) assert.EqualError(t, err, "Run failed: error executing run for spec ID 0: something exploded") })` $DIR/core/services/streams/stream_test.go: `runner.err = errors.New("something exploded")` $DIR/core/services/streams/stream_test.go: `t.Run("wrong number of inputs", func(t *testing.T) { trrs := []pipeline.TaskRunResult{} _, err := ExtractBigInt(trrs) assert.EqualError(t, err, "invalid number of results, expected: 1, got: 0") })` $DIR/core/services/streams/stream_test.go: `t.Run("wrong type", func(t *testing.T) { trrs := []pipeline.TaskRunResult{ { Result: pipeline.Result{Value: []byte{1, 2, 3}}, Task: &MockTask{}, }, } _, err := ExtractBigInt(trrs) assert.EqualError(t, err, "failed to parse BenchmarkPrice: type []uint8 cannot be converted to decimal.Decimal ([1 2 3])") })` $DIR/core/services/streams/stream_test.go: `.TestLogger(t)` $DIR/core/services/streams/stream_test.go: `.Context(t)` $DIR/core/services/streams/stream_test.go: `.Run("errors with empty pipeline", func(t *testing.T) { _, _, err := strm.Run(ctx) assert.EqualError(t, err, "Run failed: Run failed due to unparseable pipeline: empty pipeline") })` $DIR/core/services/streams/stream_test.go: `.Run(ctx)` $DIR/core/services/streams/stream_test.go: `.Run("executes the pipeline (success)", func(t *testing.T) { runner.run = &pipeline.Run{ID: 42} runner.trrs = []pipeline.TaskRunResult{pipeline.TaskRunResult{ID: UUID}} runner.err = nil run, trrs, err := strm.Run(ctx) assert.NoError(t, err) assert.Equal(t, int64(42), run.ID) require.Len(t, trrs, 1) assert.Equal(t, UUID, trrs[0].ID) })` $DIR/core/services/streams/stream_test.go: `.Run(ctx)` $DIR/core/services/streams/stream_test.go: `.Run("executes the pipeline (failure)", func(t *testing.T) { runner.err = errors.New("something exploded") _, _, err := strm.Run(ctx) require.Error(t, err) assert.EqualError(t, err, "Run failed: error executing run for spec ID 0: something exploded") })` $DIR/core/services/streams/stream_test.go: `.New("something exploded")` $DIR/core/services/streams/stream_test.go: `.Run(ctx)` $DIR/core/services/streams/stream_test.go: `.Run("wrong number of inputs", func(t *testing.T) { trrs := []pipeline.TaskRunResult{} _, err := ExtractBigInt(trrs) assert.EqualError(t, err, "invalid number of results, expected: 1, got: 0") })` $DIR/core/services/streams/stream_test.go: `.Run("wrong type", func(t *testing.T) { trrs := []pipeline.TaskRunResult{ { Result: pipeline.Result{Value: []byte{1, 2, 3}}, Task: &MockTask{}, }, } _, err := ExtractBigInt(trrs) assert.EqualError(t, err, "failed to parse BenchmarkPrice: type []uint8 cannot be converted to decimal.Decimal ([1 2 3])") })` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `csaKeystore.On("GetAll").Return(keyList, nil)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `servicetest.Run(t, telemIngressClient)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `telemClient.On("TelemBatch", mock.Anything, mock.Anything).Return(nil, nil).Run(func(args mock.Arguments) { telemBatchReq := args.Get(1).(*telemPb.TelemBatchRequest) if telemBatchReq.ContractId == "0x1" { for _, telem := range telemBatchReq.Telemetry { contractCounter1.Add(1) assert.Equal(t, telemPayload1.Telemetry, telem) assert.Equal(t, synchronization.OCR, telemPayload1.TelemType) } } if telemBatchReq.ContractId == "0x2" { for _, telem := range telemBatchReq.Telemetry { contractCounter2.Add(1) assert.Equal(t, telemPayload2.Telemetry, telem) assert.Equal(t, synchronization.OCR2VRF, telemPayload2.TelemType) } } if telemBatchReq.ContractId == "0x3" { for _, telem := range telemBatchReq.Telemetry { contractCounter3.Add(1) assert.Equal(t, telemPayload3.Telemetry, telem) assert.Equal(t, synchronization.OCR2Functions, telemPayload3.TelemType) } } })` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `contractCounter1.Add(1)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `contractCounter2.Add(1)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `contractCounter3.Add(1)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `telemIngressClient.Send(testCtx, telemPayload1.Telemetry, telemPayload1.ContractID, telemPayload1.TelemType)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `telemIngressClient.Send(testCtx, telemPayload2.Telemetry, telemPayload2.ContractID, telemPayload2.TelemType)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `telemIngressClient.Send(testCtx, telemPayload3.Telemetry, telemPayload3.ContractID, telemPayload3.TelemType)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `time.Sleep(sendInterval * 2)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `telemIngressClient.Send(testCtx, telemPayload1.Telemetry, telemPayload1.ContractID, telemPayload1.TelemType)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `telemIngressClient.Send(testCtx, telemPayload1.Telemetry, telemPayload1.ContractID, telemPayload1.TelemType)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `telemIngressClient.Send(testCtx, telemPayload2.Telemetry, telemPayload2.ContractID, telemPayload2.TelemType)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `.NewWithT(t)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `.NewTelemClient(t)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `.On("GetAll")` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `.Return(keyList, nil)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `.NewTestTelemetryIngressBatchClient(t, url, serverPubKeyHex, csaKeystore, false, telemClient, sendInterval, false)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `.Run(t, telemIngressClient)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `.On("TelemBatch", mock.Anything, mock.Anything)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `.Return(nil, nil)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `.Run(func(args mock.Arguments) { telemBatchReq := args.Get(1).(*telemPb.TelemBatchRequest) if telemBatchReq.ContractId == "0x1" { for _, telem := range telemBatchReq.Telemetry { contractCounter1.Add(1) assert.Equal(t, telemPayload1.Telemetry, telem) assert.Equal(t, synchronization.OCR, telemPayload1.TelemType) } } if telemBatchReq.ContractId == "0x2" { for _, telem := range telemBatchReq.Telemetry { contractCounter2.Add(1) assert.Equal(t, telemPayload2.Telemetry, telem) assert.Equal(t, synchronization.OCR2VRF, telemPayload2.TelemType) } } if telemBatchReq.ContractId == "0x3" { for _, telem := range telemBatchReq.Telemetry { contractCounter3.Add(1) assert.Equal(t, telemPayload3.Telemetry, telem) assert.Equal(t, synchronization.OCR2Functions, telemPayload3.TelemType) } } })` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `.Get(1)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `.Add(1)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `.Add(1)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `.Add(1)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `.Context(t)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `.Send(testCtx, telemPayload1.Telemetry, telemPayload1.ContractID, telemPayload1.TelemType)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `.Send(testCtx, telemPayload2.Telemetry, telemPayload2.ContractID, telemPayload2.TelemType)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `.Send(testCtx, telemPayload3.Telemetry, telemPayload3.ContractID, telemPayload3.TelemType)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `.Sleep(sendInterval * 2)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `.Send(testCtx, telemPayload1.Telemetry, telemPayload1.ContractID, telemPayload1.TelemType)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `.Send(testCtx, telemPayload1.Telemetry, telemPayload1.ContractID, telemPayload1.TelemType)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `.Send(testCtx, telemPayload2.Telemetry, telemPayload2.ContractID, telemPayload2.TelemType)` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `.Eventually(func() []uint32 { return []uint32{contractCounter1.Load(), contractCounter2.Load(), contractCounter3.Load()} })` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `.Load()` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `.Load()` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `.Load()` $DIR/core/services/synchronization/telemetry_ingress_batch_client_test.go: `.Equal([]uint32{3, 2, 1})` $DIR/core/services/synchronization/telemetry_ingress_batch_worker_test.go: `chTelemetry <- telemPayload` $DIR/core/services/synchronization/telemetry_ingress_batch_worker_test.go: `chTelemetry <- telemPayload` $DIR/core/services/synchronization/telemetry_ingress_batch_worker_test.go: `chTelemetry <- telemPayload` $DIR/core/services/synchronization/telemetry_ingress_batch_worker_test.go: `chTelemetry <- telemPayload` $DIR/core/services/synchronization/telemetry_ingress_batch_worker_test.go: `chTelemetry <- telemPayload` $DIR/core/services/synchronization/telemetry_ingress_batch_worker_test.go: `.NewTelemetryIngressBatchWorker( uint(maxTelemBatchSize), time.Millisecond*1, time.Second, mocks.NewTelemClient(t), &sync.WaitGroup{}, make(chan struct{}), chTelemetry, "0xa", synchronization.OCR, logger.TestLogger(t), false, )` $DIR/core/services/synchronization/telemetry_ingress_batch_worker_test.go: `.NewTelemClient(t)` $DIR/core/services/synchronization/telemetry_ingress_batch_worker_test.go: `.TestLogger(t)` $DIR/core/services/synchronization/telemetry_ingress_batch_worker_test.go: `.BuildTelemBatchReq()` $DIR/core/services/synchronization/telemetry_ingress_batch_worker_test.go: `.BuildTelemBatchReq()` $DIR/core/services/synchronization/telemetry_ingress_client_test.go: `csaKeystore.On("GetAll").Return(keyList, nil)` $DIR/core/services/synchronization/telemetry_ingress_client_test.go: `servicetest.Run(t, telemIngressClient)` $DIR/core/services/synchronization/telemetry_ingress_client_test.go: `telemClient.On("Telem", mock.Anything, mock.Anything).Return(nil, nil).Run(func(args mock.Arguments) { called.Store(true) telemReq := args.Get(1).(*telemPb.TelemRequest) assert.Equal(t, telemPayload.ContractID, telemReq.Address) assert.Equal(t, telemPayload.Telemetry, telemReq.Telemetry) assert.Equal(t, string(synchronization.OCR), telemReq.TelemetryType) assert.Greater(t, telemReq.SentAt, int64(0)) })` $DIR/core/services/synchronization/telemetry_ingress_client_test.go: `called.Store(true)` $DIR/core/services/synchronization/telemetry_ingress_client_test.go: `telemIngressClient.Send(testutils.Context(t), telemPayload.Telemetry, telemPayload.ContractID, telemPayload.TelemType)` $DIR/core/services/synchronization/telemetry_ingress_client_test.go: `.NewTelemClient(t)` $DIR/core/services/synchronization/telemetry_ingress_client_test.go: `.On("GetAll")` $DIR/core/services/synchronization/telemetry_ingress_client_test.go: `.Return(keyList, nil)` $DIR/core/services/synchronization/telemetry_ingress_client_test.go: `.GetDummyKeyString()` $DIR/core/services/synchronization/telemetry_ingress_client_test.go: `.NewTestTelemetryIngressClient(t, url, serverPubKeyHex, csaKeystore, false, telemClient)` $DIR/core/services/synchronization/telemetry_ingress_client_test.go: `.Run(t, telemIngressClient)` $DIR/core/services/synchronization/telemetry_ingress_client_test.go: `.HexToAddress("0xa")` $DIR/core/services/synchronization/telemetry_ingress_client_test.go: `.String()` $DIR/core/services/synchronization/telemetry_ingress_client_test.go: `.On("Telem", mock.Anything, mock.Anything)` $DIR/core/services/synchronization/telemetry_ingress_client_test.go: `.Return(nil, nil)` $DIR/core/services/synchronization/telemetry_ingress_client_test.go: `.Run(func(args mock.Arguments) { called.Store(true) telemReq := args.Get(1).(*telemPb.TelemRequest) assert.Equal(t, telemPayload.ContractID, telemReq.Address) assert.Equal(t, telemPayload.Telemetry, telemReq.Telemetry) assert.Equal(t, string(synchronization.OCR), telemReq.TelemetryType) assert.Greater(t, telemReq.SentAt, int64(0)) })` $DIR/core/services/synchronization/telemetry_ingress_client_test.go: `.Store(true)` $DIR/core/services/synchronization/telemetry_ingress_client_test.go: `.Get(1)` $DIR/core/services/synchronization/telemetry_ingress_client_test.go: `.Send(testutils.Context(t), telemPayload.Telemetry, telemPayload.ContractID, telemPayload.TelemType)` $DIR/core/services/synchronization/telemetry_ingress_client_test.go: `.Context(t)` $DIR/core/services/synchronization/telemetry_ingress_client_test.go: `.NewWithT(t)` $DIR/core/services/synchronization/telemetry_ingress_client_test.go: `.Eventually(called.Load)` $DIR/core/services/synchronization/telemetry_ingress_client_test.go: `.BeTrue()` $DIR/core/services/telemetry/ingress_batch_test.go: `telemetryBatchClient.On("Send", mock.Anything, mock.AnythingOfType("[]uint8"), mock.AnythingOfType("string"), mock.AnythingOfType("TelemetryType")).Return().Run(func(args mock.Arguments) { telemPayload = synchronization.TelemPayload{ Telemetry: args[1].([]byte), ContractID: args[2].(string), TelemType: args[3].(synchronization.TelemetryType), } })` $DIR/core/services/telemetry/ingress_batch_test.go: `telemPayload = synchronization.TelemPayload{ Telemetry: args[1].([]byte), ContractID: args[2].(string), TelemType: args[3].(synchronization.TelemetryType), }` $DIR/core/services/telemetry/ingress_batch_test.go: `monitoringEndpoint.SendLog(log)` $DIR/core/services/telemetry/ingress_batch_test.go: `.NewTelemetryService(t)` $DIR/core/services/telemetry/ingress_batch_test.go: `.NewIngressAgentWrapper(telemetryBatchClient)` $DIR/core/services/telemetry/ingress_batch_test.go: `.GenMonitoringEndpoint("test-network", "test-chainID", "0xa", synchronization.OCR)` $DIR/core/services/telemetry/ingress_batch_test.go: `.On("Send", mock.Anything, mock.AnythingOfType("[]uint8"), mock.AnythingOfType("string"), mock.AnythingOfType("TelemetryType"))` $DIR/core/services/telemetry/ingress_batch_test.go: `.AnythingOfType("[]uint8")` $DIR/core/services/telemetry/ingress_batch_test.go: `.AnythingOfType("string")` $DIR/core/services/telemetry/ingress_batch_test.go: `.AnythingOfType("TelemetryType")` $DIR/core/services/telemetry/ingress_batch_test.go: `.Return()` $DIR/core/services/telemetry/ingress_batch_test.go: `.Run(func(args mock.Arguments) { telemPayload = synchronization.TelemPayload{ Telemetry: args[1].([]byte), ContractID: args[2].(string), TelemType: args[3].(synchronization.TelemetryType), } })` $DIR/core/services/telemetry/ingress_batch_test.go: `.SendLog(log)` $DIR/core/services/telemetry/ingress_test.go: `telemetryClient.On("Send", mock.Anything, mock.AnythingOfType("[]uint8"), mock.AnythingOfType("string"), mock.AnythingOfType("TelemetryType")).Return().Run(func(args mock.Arguments) { telemPayload = synchronization.TelemPayload{ Telemetry: args[1].([]byte), ContractID: args[2].(string), TelemType: args[3].(synchronization.TelemetryType), } })` $DIR/core/services/telemetry/ingress_test.go: `telemPayload = synchronization.TelemPayload{ Telemetry: args[1].([]byte), ContractID: args[2].(string), TelemType: args[3].(synchronization.TelemetryType), }` $DIR/core/services/telemetry/ingress_test.go: `monitoringEndpoint.SendLog(log)` $DIR/core/services/telemetry/ingress_test.go: `.NewTelemetryService(t)` $DIR/core/services/telemetry/ingress_test.go: `.NewIngressAgentWrapper(telemetryClient)` $DIR/core/services/telemetry/ingress_test.go: `.GenMonitoringEndpoint("test-network", "test-chainID", "0xa", synchronization.OCR)` $DIR/core/services/telemetry/ingress_test.go: `.On("Send", mock.Anything, mock.AnythingOfType("[]uint8"), mock.AnythingOfType("string"), mock.AnythingOfType("TelemetryType"))` $DIR/core/services/telemetry/ingress_test.go: `.AnythingOfType("[]uint8")` $DIR/core/services/telemetry/ingress_test.go: `.AnythingOfType("string")` $DIR/core/services/telemetry/ingress_test.go: `.AnythingOfType("TelemetryType")` $DIR/core/services/telemetry/ingress_test.go: `.Return()` $DIR/core/services/telemetry/ingress_test.go: `.Run(func(args mock.Arguments) { telemPayload = synchronization.TelemPayload{ Telemetry: args[1].([]byte), ContractID: args[2].(string), TelemType: args[3].(synchronization.TelemetryType), } })` $DIR/core/services/telemetry/ingress_test.go: `.SendLog(log)` $DIR/core/services/telemetry/manager_test.go: `te.On("Network").Return("network-1")` $DIR/core/services/telemetry/manager_test.go: `te.On("ChainID").Return("network-1-chainID-1")` $DIR/core/services/telemetry/manager_test.go: `te.On("ServerPubKey").Return("some-pubkey")` $DIR/core/services/telemetry/manager_test.go: `te.On("URL").Return(u)` $DIR/core/services/telemetry/manager_test.go: `tic.On("Endpoints").Return([]config.TelemetryIngressEndpoint{te})` $DIR/core/services/telemetry/manager_test.go: `tic = setupMockConfig(t, false)` $DIR/core/services/telemetry/manager_test.go: `tic.On("Endpoints").Return([]config.TelemetryIngressEndpoint{te})` $DIR/core/services/telemetry/manager_test.go: `tm = NewManager(tic, ks, lggr)` $DIR/core/services/telemetry/manager_test.go: `me = tm.GenMonitoringEndpoint("network-1", "network-1-chainID-1", "", "")` $DIR/core/services/telemetry/manager_test.go: `te.On("Network").Maybe().Return(e.network)` $DIR/core/services/telemetry/manager_test.go: `te.On("ChainID").Maybe().Return(e.chainID)` $DIR/core/services/telemetry/manager_test.go: `te.On("ServerPubKey").Maybe().Return(e.pubKey)` $DIR/core/services/telemetry/manager_test.go: `u = nil` $DIR/core/services/telemetry/manager_test.go: `te.On("URL").Maybe().Return(u)` $DIR/core/services/telemetry/manager_test.go: `mockEndpoints = append(mockEndpoints, te)` $DIR/core/services/telemetry/manager_test.go: `tic.On("Endpoints").Return(mockEndpoints)` $DIR/core/services/telemetry/manager_test.go: `ks.On("GetAll").Return([]csakey.KeyV2{csakey.MustNewV2XXXTestingOnly(big.NewInt(0))}, nil)` $DIR/core/services/telemetry/manager_test.go: `found = true` $DIR/core/services/telemetry/manager_test.go: `t.Cleanup(func() { require.NoError(t, m.Close()) })` $DIR/core/services/telemetry/manager_test.go: `testutils.WaitForLogMessageCount(t, logObs, "error connecting error while dialing dial tcp", 3)` $DIR/core/services/telemetry/manager_test.go: `tic.On("Endpoints").Return(nil)` $DIR/core/services/telemetry/manager_test.go: `tm.endpoints = make([]*telemetryEndpoint, len(testEndpoints))` $DIR/core/services/telemetry/manager_test.go: `clientMock.On("Send", mock.Anything, mock.AnythingOfType("[]uint8"), mock.AnythingOfType("string"), mock.AnythingOfType("TelemetryType")).Return().Run(func(args mock.Arguments) { clientSent = append(clientSent, synchronization.TelemPayload{ Telemetry: args[1].([]byte), ContractID: args[2].(string), TelemType: args[3].(synchronization.TelemetryType), }) })` $DIR/core/services/telemetry/manager_test.go: `clientSent = append(clientSent, synchronization.TelemPayload{ Telemetry: args[1].([]byte), ContractID: args[2].(string), TelemType: args[3].(synchronization.TelemetryType), })` $DIR/core/services/telemetry/manager_test.go: `tm.endpoints[i] = &telemetryEndpoint{ ChainID: e.chainID, Network: e.network, client: clientMock, }` $DIR/core/services/telemetry/manager_test.go: `noopEndpoint = tm.GenMonitoringEndpoint("network-1", "unknown-chainID", "some-contractID", "some-type")` $DIR/core/services/telemetry/manager_test.go: `noopEndpoint = tm.GenMonitoringEndpoint("network-2", "network-1-chainID-1", "some-contractID", "some-type")` $DIR/core/services/telemetry/manager_test.go: `me.SendLog([]byte(e.chainID))` $DIR/core/services/telemetry/manager_test.go: `.NewTelemetryIngressEndpoint(t)` $DIR/core/services/telemetry/manager_test.go: `.On("Network")` $DIR/core/services/telemetry/manager_test.go: `.Return("network-1")` $DIR/core/services/telemetry/manager_test.go: `.On("ChainID")` $DIR/core/services/telemetry/manager_test.go: `.Return("network-1-chainID-1")` $DIR/core/services/telemetry/manager_test.go: `.On("ServerPubKey")` $DIR/core/services/telemetry/manager_test.go: `.Return("some-pubkey")` $DIR/core/services/telemetry/manager_test.go: `.Parse("http://some-url.test")` $DIR/core/services/telemetry/manager_test.go: `.On("URL")` $DIR/core/services/telemetry/manager_test.go: `.Return(u)` $DIR/core/services/telemetry/manager_test.go: `.On("Endpoints")` $DIR/core/services/telemetry/manager_test.go: `.Return([]config.TelemetryIngressEndpoint{te})` $DIR/core/services/telemetry/manager_test.go: `.TestLoggerObserved(t, zapcore.InfoLevel)` $DIR/core/services/telemetry/manager_test.go: `.NewCSA(t)` $DIR/core/services/telemetry/manager_test.go: `.GenMonitoringEndpoint("network-1", "network-1-chainID-1", "", "")` $DIR/core/services/telemetry/manager_test.go: `.On("Endpoints")` $DIR/core/services/telemetry/manager_test.go: `.Return([]config.TelemetryIngressEndpoint{te})` $DIR/core/services/telemetry/manager_test.go: `.GenMonitoringEndpoint("network-1", "network-1-chainID-1", "", "")` $DIR/core/services/telemetry/manager_test.go: `.TypeOf(me)` $DIR/core/services/telemetry/manager_test.go: `.String()` $DIR/core/services/telemetry/manager_test.go: `.NewTelemetryIngressEndpoint(t)` $DIR/core/services/telemetry/manager_test.go: `.On("Network")` $DIR/core/services/telemetry/manager_test.go: `.Maybe()` $DIR/core/services/telemetry/manager_test.go: `.Return(e.network)` $DIR/core/services/telemetry/manager_test.go: `.On("ChainID")` $DIR/core/services/telemetry/manager_test.go: `.Maybe()` $DIR/core/services/telemetry/manager_test.go: `.Return(e.chainID)` $DIR/core/services/telemetry/manager_test.go: `.On("ServerPubKey")` $DIR/core/services/telemetry/manager_test.go: `.Maybe()` $DIR/core/services/telemetry/manager_test.go: `.Return(e.pubKey)` $DIR/core/services/telemetry/manager_test.go: `.Parse(e.url)` $DIR/core/services/telemetry/manager_test.go: `.On("URL")` $DIR/core/services/telemetry/manager_test.go: `.Maybe()` $DIR/core/services/telemetry/manager_test.go: `.Return(u)` $DIR/core/services/telemetry/manager_test.go: `.On("Endpoints")` $DIR/core/services/telemetry/manager_test.go: `.Return(mockEndpoints)` $DIR/core/services/telemetry/manager_test.go: `.TestLoggerObserved(t, zapcore.InfoLevel)` $DIR/core/services/telemetry/manager_test.go: `.NewCSA(t)` $DIR/core/services/telemetry/manager_test.go: `.On("GetAll")` $DIR/core/services/telemetry/manager_test.go: `.Return([]csakey.KeyV2{csakey.MustNewV2XXXTestingOnly(big.NewInt(0))}, nil)` $DIR/core/services/telemetry/manager_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(0))` $DIR/core/services/telemetry/manager_test.go: `.NewInt(0)` $DIR/core/services/telemetry/manager_test.go: `.TakeAll()` $DIR/core/services/telemetry/manager_test.go: `.Contains(l.Message, e.expectedError)` $DIR/core/services/telemetry/manager_test.go: `.Cleanup(func() { require.NoError(t, m.Close()) })` $DIR/core/services/telemetry/manager_test.go: `.WaitForLogMessageCount(t, logObs, "error connecting error while dialing dial tcp", 3)` $DIR/core/services/telemetry/manager_test.go: `.HealthReport()` $DIR/core/services/telemetry/manager_test.go: `.On("Endpoints")` $DIR/core/services/telemetry/manager_test.go: `.Return(nil)` $DIR/core/services/telemetry/manager_test.go: `.TestLoggerObserved(t, zapcore.InfoLevel)` $DIR/core/services/telemetry/manager_test.go: `.NewCSA(t)` $DIR/core/services/telemetry/manager_test.go: `.NewTelemetryService(t)` $DIR/core/services/telemetry/manager_test.go: `.On("Send", mock.Anything, mock.AnythingOfType("[]uint8"), mock.AnythingOfType("string"), mock.AnythingOfType("TelemetryType"))` $DIR/core/services/telemetry/manager_test.go: `.AnythingOfType("[]uint8")` $DIR/core/services/telemetry/manager_test.go: `.AnythingOfType("string")` $DIR/core/services/telemetry/manager_test.go: `.AnythingOfType("TelemetryType")` $DIR/core/services/telemetry/manager_test.go: `.Return()` $DIR/core/services/telemetry/manager_test.go: `.Run(func(args mock.Arguments) { clientSent = append(clientSent, synchronization.TelemPayload{ Telemetry: args[1].([]byte), ContractID: args[2].(string), TelemType: args[3].(synchronization.TelemetryType), }) })` $DIR/core/services/telemetry/manager_test.go: `.GenMonitoringEndpoint("unknown-network", "unknown-chainID", "some-contractID", "some-type")` $DIR/core/services/telemetry/manager_test.go: `.GenMonitoringEndpoint("network-1", "unknown-chainID", "some-contractID", "some-type")` $DIR/core/services/telemetry/manager_test.go: `.GenMonitoringEndpoint("network-2", "network-1-chainID-1", "some-contractID", "some-type")` $DIR/core/services/telemetry/manager_test.go: `.Sprintf("TelemType_%s", e.chainID)` $DIR/core/services/telemetry/manager_test.go: `.Sprintf("contractID_%s", e.chainID)` $DIR/core/services/telemetry/manager_test.go: `.GenMonitoringEndpoint( e.network, e.chainID, contractID, synchronization.TelemetryType(telemType), )` $DIR/core/services/telemetry/manager_test.go: `.TelemetryType(telemType)` $DIR/core/services/telemetry/manager_test.go: `.SendLog([]byte(e.chainID))` $DIR/core/services/transmission/integration_test.go: `userOp.Signature = sig` $DIR/core/services/transmission/integration_test.go: `holder1.Value = assets.Ether(10).ToInt()` $DIR/core/services/transmission/integration_test.go: `backend.Commit()` $DIR/core/services/transmission/integration_test.go: `_, err = bind.WaitMined(testutils.Context(t), backend, tx)` $DIR/core/services/transmission/integration_test.go: `holder1.Value = assets.Ether(0).ToInt()` $DIR/core/services/transmission/integration_test.go: `tx, err = universe.entryPoint.HandleOps(holder2, []entry_point.UserOperation{userOp}, holder1.From)` $DIR/core/services/transmission/integration_test.go: `backend.Commit()` $DIR/core/services/transmission/integration_test.go: `_, err = bind.WaitMined(testutils.Context(t), backend, tx)` $DIR/core/services/transmission/integration_test.go: `backend.Commit()` $DIR/core/services/transmission/integration_test.go: `backend.Commit()` $DIR/core/services/transmission/integration_test.go: `_, err = bind.WaitMined(testutils.Context(t), backend, tx)` $DIR/core/services/transmission/integration_test.go: `userOp.Signature = sig` $DIR/core/services/transmission/integration_test.go: `holder1.Value = assets.Ether(10).ToInt()` $DIR/core/services/transmission/integration_test.go: `tx, err = universe.entryPoint.DepositTo(holder1, paymasterAddress)` $DIR/core/services/transmission/integration_test.go: `backend.Commit()` $DIR/core/services/transmission/integration_test.go: `_, err = bind.WaitMined(testutils.Context(t), backend, tx)` $DIR/core/services/transmission/integration_test.go: `holder1.Value = assets.Ether(0).ToInt()` $DIR/core/services/transmission/integration_test.go: `tx, err = universe.entryPoint.HandleOps(holder2, []entry_point.UserOperation{userOp}, holder1.From)` $DIR/core/services/transmission/integration_test.go: `backend.Commit()` $DIR/core/services/transmission/integration_test.go: `_, err = bind.WaitMined(testutils.Context(t), backend, tx)` $DIR/core/services/transmission/integration_test.go: `copy(keyhash[:], common.LeftPadBytes(big.NewInt(123).Bytes(), 32))` $DIR/core/services/transmission/integration_test.go: `backend.Commit()` $DIR/core/services/transmission/integration_test.go: `backend.Commit()` $DIR/core/services/transmission/integration_test.go: `_, err = bind.WaitMined(testutils.Context(t), backend, tx)` $DIR/core/services/transmission/integration_test.go: `userOp.Signature = sig` $DIR/core/services/transmission/integration_test.go: `holder1.Value = assets.Ether(10).ToInt()` $DIR/core/services/transmission/integration_test.go: `tx, err = universe.entryPoint.DepositTo(holder1, paymasterAddress)` $DIR/core/services/transmission/integration_test.go: `backend.Commit()` $DIR/core/services/transmission/integration_test.go: `_, err = bind.WaitMined(testutils.Context(t), backend, tx)` $DIR/core/services/transmission/integration_test.go: `holder1.Value = assets.Ether(0).ToInt()` $DIR/core/services/transmission/integration_test.go: `err = backend.SendTransaction(testutils.Context(t), signedtx)` $DIR/core/services/transmission/integration_test.go: `backend.Commit()` $DIR/core/services/transmission/integration_test.go: `.greeter.GetGreeting(nil)` $DIR/core/services/transmission/integration_test.go: `.helper.CalculateSmartContractAccountAddress( nil, holder1.From, universe.entryPointAddress, universe.factoryAddress, )` $DIR/core/services/transmission/integration_test.go: `.helper.GetInitCode(nil, universe.factoryAddress, holder1.From, universe.entryPointAddress)` $DIR/core/services/transmission/integration_test.go: `.Pack("setGreeting", "bye")` $DIR/core/services/transmission/integration_test.go: `.NewInt(0)` $DIR/core/services/transmission/integration_test.go: `.NewInt(0)` $DIR/core/services/transmission/integration_test.go: `.NewInt(1000)` $DIR/core/services/transmission/integration_test.go: `.helper.GetFullEndTxEncoding(nil, universe.greeterAddress, value, deadline, encodedGreetingCall)` $DIR/core/services/transmission/integration_test.go: `.NewInt(10_000_000)` $DIR/core/services/transmission/integration_test.go: `.NewInt(10_000_000)` $DIR/core/services/transmission/integration_test.go: `.NewInt(10_000_000)` $DIR/core/services/transmission/integration_test.go: `.NewInt(100)` $DIR/core/services/transmission/integration_test.go: `.NewInt(200)` $DIR/core/services/transmission/integration_test.go: `.entryPoint.GetUserOpHash(nil, userOp)` $DIR/core/services/transmission/integration_test.go: `.helper.GetFullHashForSigning(nil, userOpHash, toDeployAddress)` $DIR/core/services/transmission/integration_test.go: `.SignMessage(universe.holder1Key.ToEcdsaPrivKey(), fullHash[:])` $DIR/core/services/transmission/integration_test.go: `.holder1Key.ToEcdsaPrivKey()` $DIR/core/services/transmission/integration_test.go: `.Ether(10)` $DIR/core/services/transmission/integration_test.go: `.ToInt()` $DIR/core/services/transmission/integration_test.go: `.entryPoint.DepositTo(holder1, toDeployAddress)` $DIR/core/services/transmission/integration_test.go: `.Commit()` $DIR/core/services/transmission/integration_test.go: `.WaitMined(testutils.Context(t), backend, tx)` $DIR/core/services/transmission/integration_test.go: `.Context(t)` $DIR/core/services/transmission/integration_test.go: `.Ether(0)` $DIR/core/services/transmission/integration_test.go: `.ToInt()` $DIR/core/services/transmission/integration_test.go: `.entryPoint.BalanceOf(nil, toDeployAddress)` $DIR/core/services/transmission/integration_test.go: `.entryPoint.HandleOps(holder2, []entry_point.UserOperation{userOp}, holder1.From)` $DIR/core/services/transmission/integration_test.go: `.Commit()` $DIR/core/services/transmission/integration_test.go: `.WaitMined(testutils.Context(t), backend, tx)` $DIR/core/services/transmission/integration_test.go: `.Context(t)` $DIR/core/services/transmission/integration_test.go: `.greeter.GetGreeting(nil)` $DIR/core/services/transmission/integration_test.go: `.NewSCA(toDeployAddress, backend)` $DIR/core/services/transmission/integration_test.go: `.SNonce(nil)` $DIR/core/services/transmission/integration_test.go: `.NewInt(1)` $DIR/core/services/transmission/integration_test.go: `.greeter.GetGreeting(nil)` $DIR/core/services/transmission/integration_test.go: `.helper.CalculateSmartContractAccountAddress( nil, holder1.From, universe.entryPointAddress, universe.factoryAddress, )` $DIR/core/services/transmission/integration_test.go: `.helper.GetInitCode(nil, universe.factoryAddress, holder1.From, universe.entryPointAddress)` $DIR/core/services/transmission/integration_test.go: `.Pack("setGreeting", "bye")` $DIR/core/services/transmission/integration_test.go: `.NewInt(0)` $DIR/core/services/transmission/integration_test.go: `.NewInt(0)` $DIR/core/services/transmission/integration_test.go: `.NewInt(1000)` $DIR/core/services/transmission/integration_test.go: `.helper.GetFullEndTxEncoding(nil, universe.greeterAddress, value, deadline, encodedGreetingCall)` $DIR/core/services/transmission/integration_test.go: `.DeployLinkToken(holder1, backend)` $DIR/core/services/transmission/integration_test.go: `.DeployMockV3AggregatorContract( holder1, backend, 18, (*big.Int)(assets.GWei(5000000)), // .005 ETH )` $DIR/core/services/transmission/integration_test.go: `.GWei(5000000)` $DIR/core/services/transmission/integration_test.go: `.DeployPaymaster(holder1, backend, linkTokenAddress, linkEthFeedAddress, universe.entryPointAddress)` $DIR/core/services/transmission/integration_test.go: `.Commit()` $DIR/core/services/transmission/integration_test.go: `.TransferAndCall( holder1, paymasterAddress, assets.Ether(1000).ToInt(), common.LeftPadBytes(toDeployAddress.Bytes(), 32), )` $DIR/core/services/transmission/integration_test.go: `.Ether(1000)` $DIR/core/services/transmission/integration_test.go: `.ToInt()` $DIR/core/services/transmission/integration_test.go: `.LeftPadBytes(toDeployAddress.Bytes(), 32)` $DIR/core/services/transmission/integration_test.go: `.Bytes()` $DIR/core/services/transmission/integration_test.go: `.Commit()` $DIR/core/services/transmission/integration_test.go: `.WaitMined(testutils.Context(t), backend, tx)` $DIR/core/services/transmission/integration_test.go: `.Context(t)` $DIR/core/services/transmission/integration_test.go: `.NewInt(10_000_000)` $DIR/core/services/transmission/integration_test.go: `.NewInt(10_000_000)` $DIR/core/services/transmission/integration_test.go: `.NewInt(10_000_000)` $DIR/core/services/transmission/integration_test.go: `.NewInt(100)` $DIR/core/services/transmission/integration_test.go: `.NewInt(200)` $DIR/core/services/transmission/integration_test.go: `.Bytes()` $DIR/core/services/transmission/integration_test.go: `.entryPoint.GetUserOpHash(nil, userOp)` $DIR/core/services/transmission/integration_test.go: `.helper.GetFullHashForSigning(nil, userOpHash, toDeployAddress)` $DIR/core/services/transmission/integration_test.go: `.SignMessage(universe.holder1Key.ToEcdsaPrivKey(), fullHash[:])` $DIR/core/services/transmission/integration_test.go: `.holder1Key.ToEcdsaPrivKey()` $DIR/core/services/transmission/integration_test.go: `.Ether(10)` $DIR/core/services/transmission/integration_test.go: `.ToInt()` $DIR/core/services/transmission/integration_test.go: `.entryPoint.DepositTo(holder1, paymasterAddress)` $DIR/core/services/transmission/integration_test.go: `.Commit()` $DIR/core/services/transmission/integration_test.go: `.WaitMined(testutils.Context(t), backend, tx)` $DIR/core/services/transmission/integration_test.go: `.Context(t)` $DIR/core/services/transmission/integration_test.go: `.Ether(0)` $DIR/core/services/transmission/integration_test.go: `.ToInt()` $DIR/core/services/transmission/integration_test.go: `.entryPoint.BalanceOf(nil, paymasterAddress)` $DIR/core/services/transmission/integration_test.go: `.entryPoint.HandleOps(holder2, []entry_point.UserOperation{userOp}, holder1.From)` $DIR/core/services/transmission/integration_test.go: `.Commit()` $DIR/core/services/transmission/integration_test.go: `.WaitMined(testutils.Context(t), backend, tx)` $DIR/core/services/transmission/integration_test.go: `.Context(t)` $DIR/core/services/transmission/integration_test.go: `.greeter.GetGreeting(nil)` $DIR/core/services/transmission/integration_test.go: `.NewSCA(toDeployAddress, backend)` $DIR/core/services/transmission/integration_test.go: `.SNonce(nil)` $DIR/core/services/transmission/integration_test.go: `.NewInt(1)` $DIR/core/services/transmission/integration_test.go: `.helper.CalculateSmartContractAccountAddress( nil, holder1.From, universe.entryPointAddress, universe.factoryAddress, )` $DIR/core/services/transmission/integration_test.go: `.helper.GetInitCode(nil, universe.factoryAddress, holder1.From, universe.entryPointAddress)` $DIR/core/services/transmission/integration_test.go: `.LeftPadBytes(big.NewInt(123).Bytes(), 32)` $DIR/core/services/transmission/integration_test.go: `.NewInt(123)` $DIR/core/services/transmission/integration_test.go: `.Bytes()` $DIR/core/services/transmission/integration_test.go: `.Ether(1)` $DIR/core/services/transmission/integration_test.go: `.ToInt()` $DIR/core/services/transmission/integration_test.go: `.Pack("doRequestRandomness", keyhash, fee)` $DIR/core/services/transmission/integration_test.go: `.NewInt(0)` $DIR/core/services/transmission/integration_test.go: `.NewInt(0)` $DIR/core/services/transmission/integration_test.go: `.NewInt(1000)` $DIR/core/services/transmission/integration_test.go: `.helper.GetFullEndTxEncoding(nil, universe.vrfConsumerAddress, value, deadline, encodedVRFRequest)` $DIR/core/services/transmission/integration_test.go: `.DeployPaymaster(holder1, backend, universe.linkTokenAddress, universe.linkEthFeedAddress, universe.entryPointAddress)` $DIR/core/services/transmission/integration_test.go: `.Commit()` $DIR/core/services/transmission/integration_test.go: `.linkToken.TransferAndCall( holder1, paymasterAddress, assets.Ether(1000).ToInt(), common.LeftPadBytes(toDeployAddress.Bytes(), 32), )` $DIR/core/services/transmission/integration_test.go: `.Ether(1000)` $DIR/core/services/transmission/integration_test.go: `.ToInt()` $DIR/core/services/transmission/integration_test.go: `.LeftPadBytes(toDeployAddress.Bytes(), 32)` $DIR/core/services/transmission/integration_test.go: `.Bytes()` $DIR/core/services/transmission/integration_test.go: `.Commit()` $DIR/core/services/transmission/integration_test.go: `.WaitMined(testutils.Context(t), backend, tx)` $DIR/core/services/transmission/integration_test.go: `.Context(t)` $DIR/core/services/transmission/integration_test.go: `.helper.GetAbiEncodedDirectRequestData(nil, universe.vrfConsumerAddress, fee, fee)` $DIR/core/services/transmission/integration_test.go: `.NewInt(10_000_000)` $DIR/core/services/transmission/integration_test.go: `.NewInt(10_000_000)` $DIR/core/services/transmission/integration_test.go: `.NewInt(10_000_000)` $DIR/core/services/transmission/integration_test.go: `.NewInt(100)` $DIR/core/services/transmission/integration_test.go: `.NewInt(200)` $DIR/core/services/transmission/integration_test.go: `.Bytes()` $DIR/core/services/transmission/integration_test.go: `.entryPoint.GetUserOpHash(nil, userOp)` $DIR/core/services/transmission/integration_test.go: `.helper.GetFullHashForSigning(nil, userOpHash, toDeployAddress)` $DIR/core/services/transmission/integration_test.go: `.SignMessage(universe.holder1Key.ToEcdsaPrivKey(), fullHash[:])` $DIR/core/services/transmission/integration_test.go: `.holder1Key.ToEcdsaPrivKey()` $DIR/core/services/transmission/integration_test.go: `.Ether(10)` $DIR/core/services/transmission/integration_test.go: `.ToInt()` $DIR/core/services/transmission/integration_test.go: `.entryPoint.DepositTo(holder1, paymasterAddress)` $DIR/core/services/transmission/integration_test.go: `.Commit()` $DIR/core/services/transmission/integration_test.go: `.WaitMined(testutils.Context(t), backend, tx)` $DIR/core/services/transmission/integration_test.go: `.Context(t)` $DIR/core/services/transmission/integration_test.go: `.Ether(0)` $DIR/core/services/transmission/integration_test.go: `.ToInt()` $DIR/core/services/transmission/integration_test.go: `.entryPoint.BalanceOf(nil, paymasterAddress)` $DIR/core/services/transmission/integration_test.go: `.SuggestGasPrice(testutils.Context(t))` $DIR/core/services/transmission/integration_test.go: `.Context(t)` $DIR/core/services/transmission/integration_test.go: `.PendingNonceAt(testutils.Context(t), holder2.From)` $DIR/core/services/transmission/integration_test.go: `.Context(t)` $DIR/core/services/transmission/integration_test.go: `.Pack("handleOps", []entry_point.UserOperation{userOp}, holder1.From)` $DIR/core/services/transmission/integration_test.go: `.EstimateGas(testutils.Context(t), ethereum.CallMsg{ From: holder2.From, To: &universe.entryPointAddress, Gas: 0, Data: payload, GasPrice: gasPrice, })` $DIR/core/services/transmission/integration_test.go: `.Context(t)` $DIR/core/services/transmission/integration_test.go: `.NewTx(&types.LegacyTx{ Nonce: accountNonce, Gas: gas, To: &universe.entryPointAddress, Value: big.NewInt(0), Data: payload, GasPrice: gasPrice, })` $DIR/core/services/transmission/integration_test.go: `.NewInt(0)` $DIR/core/services/transmission/integration_test.go: `.Signer(holder2.From, unsigned)` $DIR/core/services/transmission/integration_test.go: `.SendTransaction(testutils.Context(t), signedtx)` $DIR/core/services/transmission/integration_test.go: `.Context(t)` $DIR/core/services/transmission/integration_test.go: `.Commit()` $DIR/core/services/transmission/integration_test.go: `.WaitMined(testutils.Context(t), backend, signedtx)` $DIR/core/services/transmission/integration_test.go: `.Context(t)` $DIR/core/services/transmission/integration_test.go: `.FilterLogs(testutils.Context(t), ethereum.FilterQuery{ Addresses: []common.Address{universe.vrfCoordinatorAddress}, })` $DIR/core/services/transmission/integration_test.go: `.Context(t)` $DIR/core/services/transmission/integration_test.go: `.vrfCoordinator.ParseRandomnessRequest(logs[0])` $DIR/core/services/transmission/integration_test.go: `.NewSCA(toDeployAddress, backend)` $DIR/core/services/transmission/integration_test.go: `.SNonce(nil)` $DIR/core/services/transmission/integration_test.go: `.NewInt(1)` $DIR/core/services/versioning/orm_test.go: `err = orm.UpsertNodeVersion(ctx, NewNodeVersion("9.9.7"))` $DIR/core/services/versioning/orm_test.go: `err = db.QueryRowx(`SELECT count(*) FROM node_versions`).Scan(&count)` $DIR/core/services/versioning/orm_test.go: `ver, err = orm.FindLatestNodeVersion(ctx)` $DIR/core/services/versioning/orm_test.go: `err = orm.UpsertNodeVersion(ctx, NewNodeVersion("random_12345"))` $DIR/core/services/versioning/orm_test.go: `ver, err = orm.FindLatestNodeVersion(ctx)` $DIR/core/services/versioning/orm_test.go: `_, _, err = CheckVersion(ctx, db, lggr, static.Unset)` $DIR/core/services/versioning/orm_test.go: `_, _, err = CheckVersion(ctx, db, lggr, "some old bollocks")` $DIR/core/services/versioning/orm_test.go: `_, _, err = CheckVersion(ctx, db, lggr, "9.9.7")` $DIR/core/services/versioning/orm_test.go: `appv, dbv, err = CheckVersion(ctx, db, lggr, "9.9.8")` $DIR/core/services/versioning/orm_test.go: `appv, dbv, err = CheckVersion(ctx, db, lggr, "9.9.9")` $DIR/core/services/versioning/orm_test.go: `err = orm.UpsertNodeVersion(ctx, NewNodeVersion("9.9.8"))` $DIR/core/services/versioning/orm_test.go: `.Context(t)` $DIR/core/services/versioning/orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/versioning/orm_test.go: `.TestLogger(t)` $DIR/core/services/versioning/orm_test.go: `.UpsertNodeVersion(ctx, NewNodeVersion("9.9.8"))` $DIR/core/services/versioning/orm_test.go: `.FindLatestNodeVersion(ctx)` $DIR/core/services/versioning/orm_test.go: `.UpsertNodeVersion(ctx, NewNodeVersion("9.9.7"))` $DIR/core/services/versioning/orm_test.go: `.QueryRowx(`SELECT count(*) FROM node_versions`)` $DIR/core/services/versioning/orm_test.go: `.Scan(&count)` $DIR/core/services/versioning/orm_test.go: `.FindLatestNodeVersion(ctx)` $DIR/core/services/versioning/orm_test.go: `.UpsertNodeVersion(ctx, NewNodeVersion("random_12345"))` $DIR/core/services/versioning/orm_test.go: `.FindLatestNodeVersion(ctx)` $DIR/core/services/versioning/orm_test.go: `.Context(t)` $DIR/core/services/versioning/orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/versioning/orm_test.go: `.TestLogger(t)` $DIR/core/services/versioning/orm_test.go: `.UpsertNodeVersion(ctx, NewNodeVersion("9.9.8"))` $DIR/core/services/versioning/orm_test.go: `.String()` $DIR/core/services/versioning/orm_test.go: `.Context(t)` $DIR/core/services/versioning/orm_test.go: `.NewSqlxDB(t)` $DIR/core/services/versioning/orm_test.go: `.TestLogger(t)` $DIR/core/services/versioning/orm_test.go: `.FindLatestNodeVersion(ctx)` $DIR/core/services/versioning/orm_test.go: `.UpsertNodeVersion(ctx, NewNodeVersion("9.9.8"))` $DIR/core/services/versioning/orm_test.go: `.FindLatestNodeVersion(ctx)` $DIR/core/services/vrf/delegate_test.go: `copy(reqIDBytes[:], reqID.Bytes())` $DIR/core/services/vrf/delegate_test.go: `listener.SetRespCount(reqIDBytes, 2)` $DIR/core/services/vrf/delegate_test.go: `listener.SetReqAdded(func() { added <- struct{}{} })` $DIR/core/services/vrf/delegate_test.go: `added <- struct{}{}` $DIR/core/services/vrf/delegate_test.go: `vuni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil).Maybe()` $DIR/core/services/vrf/delegate_test.go: `vuni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Return(nil).Maybe()` $DIR/core/services/vrf/delegate_test.go: `vuni.ec.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(generateCallbackReturnValues(t, false), nil).Maybe()` $DIR/core/services/vrf/delegate_test.go: `listener.HandleLog(ctx, log.NewLogBroadcast(types.Log{ // Data has all the NON-indexed parameters Data: bytes.Join([][]byte{pk.MustHash().Bytes(), // key hash preSeed, // preSeed evmutils.NewHash().Bytes(), // sender evmutils.NewHash().Bytes(), // fee reqID.Bytes()}, []byte{}, // requestID ), // JobID is indexed, thats why it lives in the Topics. Topics: []common.Hash{ solidity_cross_tests.VRFRandomnessRequestLogTopic(), jb.ExternalIDEncodeStringToTopic(), // jobID }, BlockNumber: 10, TxHash: txHash, }, vuni.cid, nil))` $DIR/core/services/vrf/delegate_test.go: `waitForChannel(t, added, time.Second, "request not added to the queue")` $DIR/core/services/vrf/delegate_test.go: `listener.SetReqAdded(func() { added <- struct{}{} })` $DIR/core/services/vrf/delegate_test.go: `added <- struct{}{}` $DIR/core/services/vrf/delegate_test.go: `vuni.pr.OnRunFinished(func(run *pipeline.Run) { if run.State == pipeline.RunStatusCompleted { runComplete <- struct{}{} } })` $DIR/core/services/vrf/delegate_test.go: `runComplete <- struct{}{}` $DIR/core/services/vrf/delegate_test.go: `vuni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/vrf/delegate_test.go: `vuni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { consumed <- struct{}{} }).Return(nil).Once()` $DIR/core/services/vrf/delegate_test.go: `consumed <- struct{}{}` $DIR/core/services/vrf/delegate_test.go: `vuni.ec.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(generateCallbackReturnValues(t, false), nil)` $DIR/core/services/vrf/delegate_test.go: `listener.HandleLog(ctx, log.NewLogBroadcast(tc.log, vuni.cid, nil))` $DIR/core/services/vrf/delegate_test.go: `waitForChannel(t, added, time.Second, "request not added to the queue")` $DIR/core/services/vrf/delegate_test.go: `listener.OnNewLongestChain(testutils.Context(t), &evmtypes.Head{Number: 16})` $DIR/core/services/vrf/delegate_test.go: `waitForChannel(t, consumed, 2*time.Second, "did not mark consumed")` $DIR/core/services/vrf/delegate_test.go: `waitForChannel(t, runComplete, 2*time.Second, "pipeline not complete")` $DIR/core/services/vrf/delegate_test.go: `vuni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/vrf/delegate_test.go: `vuni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { consumed <- struct{}{} }).Return(nil).Once()` $DIR/core/services/vrf/delegate_test.go: `consumed <- struct{}{}` $DIR/core/services/vrf/delegate_test.go: `copy(reqIDBytes[:], tc.reqID[:])` $DIR/core/services/vrf/delegate_test.go: `listener.HandleLog(ctx, log.NewLogBroadcast(types.Log{ // Data has all the NON-indexed parameters Data: bytes.Join([][]byte{reqIDBytes, // output p.Output.Bytes(), }, []byte{}, ), BlockNumber: 10, TxHash: txHash, Index: uint(i), }, vuni.cid, &solidity_vrf_coordinator_interface.VRFCoordinatorRandomnessRequestFulfilled{RequestId: tc.reqID}))` $DIR/core/services/vrf/delegate_test.go: `waitForChannel(t, consumed, 2*time.Second, "fulfillment log not marked consumed")` $DIR/core/services/vrf/delegate_test.go: `vuni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/vrf/delegate_test.go: `vuni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { done <- struct{}{} }).Return(nil).Once()` $DIR/core/services/vrf/delegate_test.go: `done <- struct{}{}` $DIR/core/services/vrf/delegate_test.go: `vuni.ec.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(generateCallbackReturnValues(t, false), nil)` $DIR/core/services/vrf/delegate_test.go: `listener.SetReqAdded(func() { added <- struct{}{} })` $DIR/core/services/vrf/delegate_test.go: `added <- struct{}{}` $DIR/core/services/vrf/delegate_test.go: `listener.HandleLog(ctx, log.NewLogBroadcast(types.Log{ // Data has all the NON-indexed parameters Data: append(append(append(append( evmutils.NewHash().Bytes(), // key hash common.BigToHash(big.NewInt(42)).Bytes()...), // seed evmutils.NewHash().Bytes()...), // sender evmutils.NewHash().Bytes()...), // fee evmutils.NewHash().Bytes()...), // requestID // JobID is indexed, that's why it lives in the Topics. Topics: []common.Hash{ solidity_cross_tests.VRFRandomnessRequestLogTopic(), jb.ExternalIDEncodeBytesToTopic(), // jobID }, Address: common.Address{}, BlockNumber: 10, TxHash: common.Hash{}, TxIndex: 0, BlockHash: common.Hash{}, Index: 0, Removed: false, }, vuni.cid, nil))` $DIR/core/services/vrf/delegate_test.go: `waitForChannel(t, added, time.Second, "request not queued")` $DIR/core/services/vrf/delegate_test.go: `listener.OnNewLongestChain(testutils.Context(t), &evmtypes.Head{Number: 16})` $DIR/core/services/vrf/delegate_test.go: `waitForChannel(t, done, time.Second, "log not consumed")` $DIR/core/services/vrf/delegate_test.go: `vuni.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything).Return(false, nil)` $DIR/core/services/vrf/delegate_test.go: `vuni.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { done <- struct{}{} }).Return(nil).Once()` $DIR/core/services/vrf/delegate_test.go: `done <- struct{}{}` $DIR/core/services/vrf/delegate_test.go: `vuni.ec.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(generateCallbackReturnValues(t, true), nil)` $DIR/core/services/vrf/delegate_test.go: `listener.SetReqAdded(func() { added <- struct{}{} })` $DIR/core/services/vrf/delegate_test.go: `added <- struct{}{}` $DIR/core/services/vrf/delegate_test.go: `listener.HandleLog(ctx, log.NewLogBroadcast( types.Log{ // Data has all the NON-indexed parameters Data: bytes.Join([][]byte{ vuni.vrfkey.PublicKey.MustHash().Bytes(), // key hash common.BigToHash(big.NewInt(42)).Bytes(), // seed evmutils.NewHash().Bytes(), // sender evmutils.NewHash().Bytes(), // fee evmutils.NewHash().Bytes()}, // requestID []byte{}), // JobID is indexed, that's why it lives in the Topics. Topics: []common.Hash{ solidity_cross_tests.VRFRandomnessRequestLogTopic(), jb.ExternalIDEncodeBytesToTopic(), // jobID STRING }, //TxHash: evmutils.NewHash().Bytes(), BlockNumber: 10, //BlockHash: evmutils.NewHash().Bytes(), }, vuni.cid, nil))` $DIR/core/services/vrf/delegate_test.go: `waitForChannel(t, added, time.Second, "request not queued")` $DIR/core/services/vrf/delegate_test.go: `listener.OnNewLongestChain(testutils.Context(t), &evmtypes.Head{Number: 16})` $DIR/core/services/vrf/delegate_test.go: `waitForChannel(t, done, time.Second, "log not consumed")` $DIR/core/services/vrf/delegate_test.go: `t.Run("returns nil error if gasLanePrice not set in job spec", func(tt *testing.T) { spec := ` type = "vrf" schemaVersion = 1 minIncomingConfirmations = 10 publicKey = "0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F8179800" coordinatorAddress = "0xB3b7874F13387D44a3398D298B075B7A3505D8d4" requestTimeout = "168h" # 7 days chunkSize = 25 backoffInitialDelay = "1m" backoffMaxDelay = "2h" observationSource = """ decode_log [type=ethabidecodelog abi="RandomnessRequest(bytes32 keyHash,uint256 seed,bytes32 indexed jobID,address sender,uint256 fee,bytes32 requestID)" data="$(jobRun.logData)" topics="$(jobRun.logTopics)"] vrf [type=vrf publicKey="$(jobSpec.publicKey)" requestBlockHash="$(jobRun.logBlockHash)" requestBlockNumber="$(jobRun.logBlockNumber)" topics="$(jobRun.logTopics)"] encode_tx [type=ethabiencode abi="fulfillRandomnessRequest(bytes proof)" data="{\\"proof\\": $(vrf)}"] submit_tx [type=ethtx to="%s" data="$(encode_tx)" txMeta="{\\"requestTxHash\\": $(jobRun.logTxHash),\\"requestID\\": $(decode_log.requestID),\\"jobID\\": $(jobSpec.databaseID)}"] decode_log->vrf->encode_tx->submit_tx """ ` jb, err := vrfcommon.ValidatedVRFSpec(spec) require.NoError(tt, err) cfg := vrf_mocks.NewFeeConfig(t) require.NoError(tt, vrf.CheckFromAddressMaxGasPrices(jb, cfg.PriceMaxKey)) })` $DIR/core/services/vrf/delegate_test.go: `t.Run("returns nil error on valid gas lane <=> key specific gas price setting", func(tt *testing.T) { var fromAddresses []string for i := 0; i < 3; i++ { fromAddresses = append(fromAddresses, testutils.NewAddress().Hex()) } cfg := vrf_mocks.NewFeeConfig(t) for _, a := range fromAddresses { cfg.On("PriceMaxKey", common.HexToAddress(a)).Return(assets.GWei(100)).Once() } defer cfg.AssertExpectations(tt) jb, err := vrfcommon.ValidatedVRFSpec(testspecs.GenerateVRFSpec( testspecs.VRFSpecParams{ RequestedConfsDelay: 10, FromAddresses: fromAddresses, ChunkSize: 25, BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(100), }). Toml()) require.NoError(t, err) require.NoError(tt, vrf.CheckFromAddressMaxGasPrices(jb, cfg.PriceMaxKey)) })` $DIR/core/services/vrf/delegate_test.go: `fromAddresses = append(fromAddresses, testutils.NewAddress().Hex())` $DIR/core/services/vrf/delegate_test.go: `cfg.On("PriceMaxKey", common.HexToAddress(a)).Return(assets.GWei(100)).Once()` $DIR/core/services/vrf/delegate_test.go: `fromAddresses = append(fromAddresses, testutils.NewAddress().Hex())` $DIR/core/services/vrf/delegate_test.go: `cfg.On("PriceMaxKey", common.HexToAddress(fromAddresses[0])).Return(assets.GWei(100)).Once()` $DIR/core/services/vrf/delegate_test.go: `cfg.On("PriceMaxKey", common.HexToAddress(fromAddresses[1])).Return(assets.GWei(100)).Once()` $DIR/core/services/vrf/delegate_test.go: `cfg.On("PriceMaxKey", common.HexToAddress(fromAddresses[2])).Return(assets.GWei(50)).Once()` $DIR/core/services/vrf/delegate_test.go: `t.Run("from addresses exist", func(t *testing.T) { ctx := testutils.Context(t) db := pgtest.NewSqlxDB(t) lggr := logger.TestLogger(t) ks := keystore.NewInMemory(db, utils.FastScryptParams, lggr) require.NoError(t, ks.Unlock(ctx, testutils.Password)) var fromAddresses []string for i := 0; i < 3; i++ { k, err := ks.Eth().Create(testutils.Context(t), big.NewInt(1337)) assert.NoError(t, err) fromAddresses = append(fromAddresses, k.Address.Hex()) } jb, err := vrfcommon.ValidatedVRFSpec(testspecs.GenerateVRFSpec( testspecs.VRFSpecParams{ RequestedConfsDelay: 10, FromAddresses: fromAddresses, ChunkSize: 25, BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(100), }). Toml()) assert.NoError(t, err) assert.NoError(t, vrf.CheckFromAddressesExist(testutils.Context(t), jb, ks.Eth())) })` $DIR/core/services/vrf/delegate_test.go: `fromAddresses = append(fromAddresses, k.Address.Hex())` $DIR/core/services/vrf/delegate_test.go: `fromAddresses = append(fromAddresses, k.Address.Hex())` $DIR/core/services/vrf/delegate_test.go: `fromAddresses = append(fromAddresses, testutils.NewAddress().Hex())` $DIR/core/services/vrf/delegate_test.go: `t.Run("all max gas prices equal", func(tt *testing.T) { fromAddresses := []string{ "0x498C2Dce1d3aEDE31A8c808c511C38a809e67684", "0x253b01b9CaAfbB9dC138d7D8c3ACBCDd47144b4B", "0xD94E6AD557277c6E3e163cefF90F52AB51A95143", } jb, err := vrfcommon.ValidatedVRFSpec(testspecs.GenerateVRFSpec(testspecs.VRFSpecParams{ RequestedConfsDelay: 10, FromAddresses: fromAddresses, ChunkSize: 25, BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(100), }).Toml()) require.NoError(tt, err) cfg := vrf_mocks.NewFeeConfig(t) for _, a := range fromAddresses { cfg.On("PriceMaxKey", common.HexToAddress(a)).Return(assets.GWei(100)) } defer cfg.AssertExpectations(tt) assert.True(tt, vrf.FromAddressMaxGasPricesAllEqual(jb, cfg.PriceMaxKey)) })` $DIR/core/services/vrf/delegate_test.go: `cfg.On("PriceMaxKey", common.HexToAddress(a)).Return(assets.GWei(100))` $DIR/core/services/vrf/delegate_test.go: `cfg.On("PriceMaxKey", common.HexToAddress(a)).Return(assets.GWei(100))` $DIR/core/services/vrf/delegate_test.go: `cfg.On("PriceMaxKey", common.HexToAddress(fromAddresses[len(fromAddresses)-1])). Return(assets.GWei(200))` $DIR/core/services/vrf/delegate_test.go: `err = vuni.jrm.CreateJob(ctx, &jb)` $DIR/core/services/vrf/delegate_test.go: `_, err = vd.ServicesForSpec(testutils.Context(t), jb)` $DIR/core/services/vrf/delegate_test.go: `.NewHash()` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.SetRespCount(reqIDBytes, 2)` $DIR/core/services/vrf/delegate_test.go: `.NewPublicKeyFromHex(vuni.vrfkey.PublicKey.String())` $DIR/core/services/vrf/delegate_test.go: `.vrfkey.PublicKey.String()` $DIR/core/services/vrf/delegate_test.go: `.SetReqAdded(func() { added <- struct{}{} })` $DIR/core/services/vrf/delegate_test.go: `.BigToHash(big.NewInt(42))` $DIR/core/services/vrf/delegate_test.go: `.NewInt(42)` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.NewHash()` $DIR/core/services/vrf/delegate_test.go: `.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/vrf/delegate_test.go: `.Return(false, nil)` $DIR/core/services/vrf/delegate_test.go: `.Maybe()` $DIR/core/services/vrf/delegate_test.go: `.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/vrf/delegate_test.go: `.Return(nil)` $DIR/core/services/vrf/delegate_test.go: `.Maybe()` $DIR/core/services/vrf/delegate_test.go: `.ec.On("CallContract", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/vrf/delegate_test.go: `.Return(generateCallbackReturnValues(t, false), nil)` $DIR/core/services/vrf/delegate_test.go: `.Maybe()` $DIR/core/services/vrf/delegate_test.go: `.Context(t)` $DIR/core/services/vrf/delegate_test.go: `.HandleLog(ctx, log.NewLogBroadcast(types.Log{ // Data has all the NON-indexed parameters Data: bytes.Join([][]byte{pk.MustHash().Bytes(), // key hash preSeed, // preSeed evmutils.NewHash().Bytes(), // sender evmutils.NewHash().Bytes(), // fee reqID.Bytes()}, []byte{}, // requestID ), // JobID is indexed, thats why it lives in the Topics. Topics: []common.Hash{ solidity_cross_tests.VRFRandomnessRequestLogTopic(), jb.ExternalIDEncodeStringToTopic(), // jobID }, BlockNumber: 10, TxHash: txHash, }, vuni.cid, nil))` $DIR/core/services/vrf/delegate_test.go: `.NewLogBroadcast(types.Log{ // Data has all the NON-indexed parameters Data: bytes.Join([][]byte{pk.MustHash().Bytes(), // key hash preSeed, // preSeed evmutils.NewHash().Bytes(), // sender evmutils.NewHash().Bytes(), // fee reqID.Bytes()}, []byte{}, // requestID ), // JobID is indexed, thats why it lives in the Topics. Topics: []common.Hash{ solidity_cross_tests.VRFRandomnessRequestLogTopic(), jb.ExternalIDEncodeStringToTopic(), // jobID }, BlockNumber: 10, TxHash: txHash, }, vuni.cid, nil)` $DIR/core/services/vrf/delegate_test.go: `.Join([][]byte{pk.MustHash().Bytes(), // key hash preSeed, // preSeed evmutils.NewHash().Bytes(), // sender evmutils.NewHash().Bytes(), // fee reqID.Bytes()}, []byte{}, // requestID )` $DIR/core/services/vrf/delegate_test.go: `.MustHash()` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.NewHash()` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.NewHash()` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.VRFRandomnessRequestLogTopic()` $DIR/core/services/vrf/delegate_test.go: `.ExternalIDEncodeStringToTopic()` $DIR/core/services/vrf/delegate_test.go: `.ReqsConfirmedAt()` $DIR/core/services/vrf/delegate_test.go: `.NewHash()` $DIR/core/services/vrf/delegate_test.go: `.NewHash()` $DIR/core/services/vrf/delegate_test.go: `.NewHash()` $DIR/core/services/vrf/delegate_test.go: `.vrfkey.PublicKey.String()` $DIR/core/services/vrf/delegate_test.go: `.NewPublicKeyFromHex(keyID)` $DIR/core/services/vrf/delegate_test.go: `.SetReqAdded(func() { added <- struct{}{} })` $DIR/core/services/vrf/delegate_test.go: `.BigToHash(big.NewInt(42))` $DIR/core/services/vrf/delegate_test.go: `.NewInt(42)` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.NewHash()` $DIR/core/services/vrf/delegate_test.go: `.Join([][]byte{ pk.MustHash().Bytes(), // key hash common.BigToHash(big.NewInt(42)).Bytes(), // seed evmutils.NewHash().Bytes(), // sender evmutils.NewHash().Bytes(), // fee reqID1.Bytes()}, // requestID []byte{})` $DIR/core/services/vrf/delegate_test.go: `.MustHash()` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.BigToHash(big.NewInt(42))` $DIR/core/services/vrf/delegate_test.go: `.NewInt(42)` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.NewHash()` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.NewHash()` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.VRFRandomnessRequestLogTopic()` $DIR/core/services/vrf/delegate_test.go: `.ExternalIDEncodeStringToTopic()` $DIR/core/services/vrf/delegate_test.go: `.Join([][]byte{ pk.MustHash().Bytes(), // key hash common.BigToHash(big.NewInt(42)).Bytes(), // seed evmutils.NewHash().Bytes(), // sender evmutils.NewHash().Bytes(), // fee reqID2.Bytes()}, // requestID []byte{})` $DIR/core/services/vrf/delegate_test.go: `.MustHash()` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.BigToHash(big.NewInt(42))` $DIR/core/services/vrf/delegate_test.go: `.NewInt(42)` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.NewHash()` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.NewHash()` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.VRFRandomnessRequestLogTopic()` $DIR/core/services/vrf/delegate_test.go: `.ExternalIDEncodeBytesToTopic()` $DIR/core/services/vrf/delegate_test.go: `.pr.OnRunFinished(func(run *pipeline.Run) { if run.State == pipeline.RunStatusCompleted { runComplete <- struct{}{} } })` $DIR/core/services/vrf/delegate_test.go: `.Context(t)` $DIR/core/services/vrf/delegate_test.go: `.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/vrf/delegate_test.go: `.Return(false, nil)` $DIR/core/services/vrf/delegate_test.go: `.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/vrf/delegate_test.go: `.Run(func(args mock.Arguments) { consumed <- struct{}{} })` $DIR/core/services/vrf/delegate_test.go: `.Return(nil)` $DIR/core/services/vrf/delegate_test.go: `.Once()` $DIR/core/services/vrf/delegate_test.go: `.ec.On("CallContract", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/vrf/delegate_test.go: `.Return(generateCallbackReturnValues(t, false), nil)` $DIR/core/services/vrf/delegate_test.go: `.HandleLog(ctx, log.NewLogBroadcast(tc.log, vuni.cid, nil))` $DIR/core/services/vrf/delegate_test.go: `.NewLogBroadcast(tc.log, vuni.cid, nil)` $DIR/core/services/vrf/delegate_test.go: `.OnNewLongestChain(testutils.Context(t), &evmtypes.Head{Number: 16})` $DIR/core/services/vrf/delegate_test.go: `.Context(t)` $DIR/core/services/vrf/delegate_test.go: `.prm.GetAllRuns(ctx)` $DIR/core/services/vrf/delegate_test.go: `.ks.VRF()` $DIR/core/services/vrf/delegate_test.go: `.GenerateProof(keyID, evmutils.MustHash(string(bytes.Join([][]byte{preSeed, bh.Bytes()}, []byte{}))).Big())` $DIR/core/services/vrf/delegate_test.go: `.MustHash(string(bytes.Join([][]byte{preSeed, bh.Bytes()}, []byte{})))` $DIR/core/services/vrf/delegate_test.go: `.Join([][]byte{preSeed, bh.Bytes()}, []byte{})` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.Big()` $DIR/core/services/vrf/delegate_test.go: `.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/vrf/delegate_test.go: `.Return(false, nil)` $DIR/core/services/vrf/delegate_test.go: `.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/vrf/delegate_test.go: `.Run(func(args mock.Arguments) { consumed <- struct{}{} })` $DIR/core/services/vrf/delegate_test.go: `.Return(nil)` $DIR/core/services/vrf/delegate_test.go: `.Once()` $DIR/core/services/vrf/delegate_test.go: `.HandleLog(ctx, log.NewLogBroadcast(types.Log{ // Data has all the NON-indexed parameters Data: bytes.Join([][]byte{reqIDBytes, // output p.Output.Bytes(), }, []byte{}, ), BlockNumber: 10, TxHash: txHash, Index: uint(i), }, vuni.cid, &solidity_vrf_coordinator_interface.VRFCoordinatorRandomnessRequestFulfilled{RequestId: tc.reqID}))` $DIR/core/services/vrf/delegate_test.go: `.NewLogBroadcast(types.Log{ // Data has all the NON-indexed parameters Data: bytes.Join([][]byte{reqIDBytes, // output p.Output.Bytes(), }, []byte{}, ), BlockNumber: 10, TxHash: txHash, Index: uint(i), }, vuni.cid, &solidity_vrf_coordinator_interface.VRFCoordinatorRandomnessRequestFulfilled{RequestId: tc.reqID})` $DIR/core/services/vrf/delegate_test.go: `.Join([][]byte{reqIDBytes, // output p.Output.Bytes(), }, []byte{}, )` $DIR/core/services/vrf/delegate_test.go: `.Output.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/vrf/delegate_test.go: `.Return(false, nil)` $DIR/core/services/vrf/delegate_test.go: `.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/vrf/delegate_test.go: `.Run(func(args mock.Arguments) { done <- struct{}{} })` $DIR/core/services/vrf/delegate_test.go: `.Return(nil)` $DIR/core/services/vrf/delegate_test.go: `.Once()` $DIR/core/services/vrf/delegate_test.go: `.ec.On("CallContract", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/vrf/delegate_test.go: `.Return(generateCallbackReturnValues(t, false), nil)` $DIR/core/services/vrf/delegate_test.go: `.SetReqAdded(func() { added <- struct{}{} })` $DIR/core/services/vrf/delegate_test.go: `.Context(t)` $DIR/core/services/vrf/delegate_test.go: `.HandleLog(ctx, log.NewLogBroadcast(types.Log{ // Data has all the NON-indexed parameters Data: append(append(append(append( evmutils.NewHash().Bytes(), // key hash common.BigToHash(big.NewInt(42)).Bytes()...), // seed evmutils.NewHash().Bytes()...), // sender evmutils.NewHash().Bytes()...), // fee evmutils.NewHash().Bytes()...), // requestID // JobID is indexed, that's why it lives in the Topics. Topics: []common.Hash{ solidity_cross_tests.VRFRandomnessRequestLogTopic(), jb.ExternalIDEncodeBytesToTopic(), // jobID }, Address: common.Address{}, BlockNumber: 10, TxHash: common.Hash{}, TxIndex: 0, BlockHash: common.Hash{}, Index: 0, Removed: false, }, vuni.cid, nil))` $DIR/core/services/vrf/delegate_test.go: `.NewLogBroadcast(types.Log{ // Data has all the NON-indexed parameters Data: append(append(append(append( evmutils.NewHash().Bytes(), // key hash common.BigToHash(big.NewInt(42)).Bytes()...), // seed evmutils.NewHash().Bytes()...), // sender evmutils.NewHash().Bytes()...), // fee evmutils.NewHash().Bytes()...), // requestID // JobID is indexed, that's why it lives in the Topics. Topics: []common.Hash{ solidity_cross_tests.VRFRandomnessRequestLogTopic(), jb.ExternalIDEncodeBytesToTopic(), // jobID }, Address: common.Address{}, BlockNumber: 10, TxHash: common.Hash{}, TxIndex: 0, BlockHash: common.Hash{}, Index: 0, Removed: false, }, vuni.cid, nil)` $DIR/core/services/vrf/delegate_test.go: `.NewHash()` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.BigToHash(big.NewInt(42))` $DIR/core/services/vrf/delegate_test.go: `.NewInt(42)` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.NewHash()` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.NewHash()` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.NewHash()` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.VRFRandomnessRequestLogTopic()` $DIR/core/services/vrf/delegate_test.go: `.ExternalIDEncodeBytesToTopic()` $DIR/core/services/vrf/delegate_test.go: `.OnNewLongestChain(testutils.Context(t), &evmtypes.Head{Number: 16})` $DIR/core/services/vrf/delegate_test.go: `.Context(t)` $DIR/core/services/vrf/delegate_test.go: `.prm.GetAllRuns(ctx)` $DIR/core/services/vrf/delegate_test.go: `.NewSqlxDB(t)` $DIR/core/services/vrf/delegate_test.go: `.NewTxStore(db, logger.TestLogger(t))` $DIR/core/services/vrf/delegate_test.go: `.TestLogger(t)` $DIR/core/services/vrf/delegate_test.go: `.GetAllTxes(testutils.Context(t))` $DIR/core/services/vrf/delegate_test.go: `.Context(t)` $DIR/core/services/vrf/delegate_test.go: `.lb.On("WasAlreadyConsumed", mock.Anything, mock.Anything)` $DIR/core/services/vrf/delegate_test.go: `.Return(false, nil)` $DIR/core/services/vrf/delegate_test.go: `.lb.On("MarkConsumed", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/vrf/delegate_test.go: `.Run(func(args mock.Arguments) { done <- struct{}{} })` $DIR/core/services/vrf/delegate_test.go: `.Return(nil)` $DIR/core/services/vrf/delegate_test.go: `.Once()` $DIR/core/services/vrf/delegate_test.go: `.ec.On("CallContract", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/vrf/delegate_test.go: `.Return(generateCallbackReturnValues(t, true), nil)` $DIR/core/services/vrf/delegate_test.go: `.SetReqAdded(func() { added <- struct{}{} })` $DIR/core/services/vrf/delegate_test.go: `.Context(t)` $DIR/core/services/vrf/delegate_test.go: `.HandleLog(ctx, log.NewLogBroadcast( types.Log{ // Data has all the NON-indexed parameters Data: bytes.Join([][]byte{ vuni.vrfkey.PublicKey.MustHash().Bytes(), // key hash common.BigToHash(big.NewInt(42)).Bytes(), // seed evmutils.NewHash().Bytes(), // sender evmutils.NewHash().Bytes(), // fee evmutils.NewHash().Bytes()}, // requestID []byte{}), // JobID is indexed, that's why it lives in the Topics. Topics: []common.Hash{ solidity_cross_tests.VRFRandomnessRequestLogTopic(), jb.ExternalIDEncodeBytesToTopic(), // jobID STRING }, //TxHash: evmutils.NewHash().Bytes(), BlockNumber: 10, //BlockHash: evmutils.NewHash().Bytes(), }, vuni.cid, nil))` $DIR/core/services/vrf/delegate_test.go: `.NewLogBroadcast( types.Log{ // Data has all the NON-indexed parameters Data: bytes.Join([][]byte{ vuni.vrfkey.PublicKey.MustHash().Bytes(), // key hash common.BigToHash(big.NewInt(42)).Bytes(), // seed evmutils.NewHash().Bytes(), // sender evmutils.NewHash().Bytes(), // fee evmutils.NewHash().Bytes()}, // requestID []byte{}), // JobID is indexed, that's why it lives in the Topics. Topics: []common.Hash{ solidity_cross_tests.VRFRandomnessRequestLogTopic(), jb.ExternalIDEncodeBytesToTopic(), // jobID STRING }, //TxHash: evmutils.NewHash().Bytes(), BlockNumber: 10, //BlockHash: evmutils.NewHash().Bytes(), }, vuni.cid, nil)` $DIR/core/services/vrf/delegate_test.go: `.Join([][]byte{ vuni.vrfkey.PublicKey.MustHash().Bytes(), // key hash common.BigToHash(big.NewInt(42)).Bytes(), // seed evmutils.NewHash().Bytes(), // sender evmutils.NewHash().Bytes(), // fee evmutils.NewHash().Bytes()}, // requestID []byte{})` $DIR/core/services/vrf/delegate_test.go: `.vrfkey.PublicKey.MustHash()` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.BigToHash(big.NewInt(42))` $DIR/core/services/vrf/delegate_test.go: `.NewInt(42)` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.NewHash()` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.NewHash()` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.NewHash()` $DIR/core/services/vrf/delegate_test.go: `.Bytes()` $DIR/core/services/vrf/delegate_test.go: `.VRFRandomnessRequestLogTopic()` $DIR/core/services/vrf/delegate_test.go: `.ExternalIDEncodeBytesToTopic()` $DIR/core/services/vrf/delegate_test.go: `.OnNewLongestChain(testutils.Context(t), &evmtypes.Head{Number: 16})` $DIR/core/services/vrf/delegate_test.go: `.Context(t)` $DIR/core/services/vrf/delegate_test.go: `.prm.GetAllRuns(ctx)` $DIR/core/services/vrf/delegate_test.go: `.Run("returns nil error if gasLanePrice not set in job spec", func(tt *testing.T) { spec := ` type = "vrf" schemaVersion = 1 minIncomingConfirmations = 10 publicKey = "0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F8179800" coordinatorAddress = "0xB3b7874F13387D44a3398D298B075B7A3505D8d4" requestTimeout = "168h" # 7 days chunkSize = 25 backoffInitialDelay = "1m" backoffMaxDelay = "2h" observationSource = """ decode_log [type=ethabidecodelog abi="RandomnessRequest(bytes32 keyHash,uint256 seed,bytes32 indexed jobID,address sender,uint256 fee,bytes32 requestID)" data="$(jobRun.logData)" topics="$(jobRun.logTopics)"] vrf [type=vrf publicKey="$(jobSpec.publicKey)" requestBlockHash="$(jobRun.logBlockHash)" requestBlockNumber="$(jobRun.logBlockNumber)" topics="$(jobRun.logTopics)"] encode_tx [type=ethabiencode abi="fulfillRandomnessRequest(bytes proof)" data="{\\"proof\\": $(vrf)}"] submit_tx [type=ethtx to="%s" data="$(encode_tx)" txMeta="{\\"requestTxHash\\": $(jobRun.logTxHash),\\"requestID\\": $(decode_log.requestID),\\"jobID\\": $(jobSpec.databaseID)}"] decode_log->vrf->encode_tx->submit_tx """ ` jb, err := vrfcommon.ValidatedVRFSpec(spec) require.NoError(tt, err) cfg := vrf_mocks.NewFeeConfig(t) require.NoError(tt, vrf.CheckFromAddressMaxGasPrices(jb, cfg.PriceMaxKey)) })` $DIR/core/services/vrf/delegate_test.go: `.ValidatedVRFSpec(spec)` $DIR/core/services/vrf/delegate_test.go: `.NewFeeConfig(t)` $DIR/core/services/vrf/delegate_test.go: `.Run("returns nil error on valid gas lane <=> key specific gas price setting", func(tt *testing.T) { var fromAddresses []string for i := 0; i < 3; i++ { fromAddresses = append(fromAddresses, testutils.NewAddress().Hex()) } cfg := vrf_mocks.NewFeeConfig(t) for _, a := range fromAddresses { cfg.On("PriceMaxKey", common.HexToAddress(a)).Return(assets.GWei(100)).Once() } defer cfg.AssertExpectations(tt) jb, err := vrfcommon.ValidatedVRFSpec(testspecs.GenerateVRFSpec( testspecs.VRFSpecParams{ RequestedConfsDelay: 10, FromAddresses: fromAddresses, ChunkSize: 25, BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(100), }). Toml()) require.NoError(t, err) require.NoError(tt, vrf.CheckFromAddressMaxGasPrices(jb, cfg.PriceMaxKey)) })` $DIR/core/services/vrf/delegate_test.go: `.NewAddress()` $DIR/core/services/vrf/delegate_test.go: `.Hex()` $DIR/core/services/vrf/delegate_test.go: `.NewFeeConfig(t)` $DIR/core/services/vrf/delegate_test.go: `.On("PriceMaxKey", common.HexToAddress(a))` $DIR/core/services/vrf/delegate_test.go: `.HexToAddress(a)` $DIR/core/services/vrf/delegate_test.go: `.Return(assets.GWei(100))` $DIR/core/services/vrf/delegate_test.go: `.GWei(100)` $DIR/core/services/vrf/delegate_test.go: `.Once()` $DIR/core/services/vrf/delegate_test.go: `.AssertExpectations(tt)` $DIR/core/services/vrf/delegate_test.go: `.ValidatedVRFSpec(testspecs.GenerateVRFSpec( testspecs.VRFSpecParams{ RequestedConfsDelay: 10, FromAddresses: fromAddresses, ChunkSize: 25, BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(100), }). Toml())` $DIR/core/services/vrf/delegate_test.go: `.GenerateVRFSpec( testspecs.VRFSpecParams{ RequestedConfsDelay: 10, FromAddresses: fromAddresses, ChunkSize: 25, BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(100), })` $DIR/core/services/vrf/delegate_test.go: `.GWei(100)` $DIR/core/services/vrf/delegate_test.go: `. Toml()` $DIR/core/services/vrf/delegate_test.go: `.NewAddress()` $DIR/core/services/vrf/delegate_test.go: `.Hex()` $DIR/core/services/vrf/delegate_test.go: `.NewFeeConfig(t)` $DIR/core/services/vrf/delegate_test.go: `.On("PriceMaxKey", common.HexToAddress(fromAddresses[0]))` $DIR/core/services/vrf/delegate_test.go: `.HexToAddress(fromAddresses[0])` $DIR/core/services/vrf/delegate_test.go: `.Return(assets.GWei(100))` $DIR/core/services/vrf/delegate_test.go: `.GWei(100)` $DIR/core/services/vrf/delegate_test.go: `.Once()` $DIR/core/services/vrf/delegate_test.go: `.On("PriceMaxKey", common.HexToAddress(fromAddresses[1]))` $DIR/core/services/vrf/delegate_test.go: `.HexToAddress(fromAddresses[1])` $DIR/core/services/vrf/delegate_test.go: `.Return(assets.GWei(100))` $DIR/core/services/vrf/delegate_test.go: `.GWei(100)` $DIR/core/services/vrf/delegate_test.go: `.Once()` $DIR/core/services/vrf/delegate_test.go: `.On("PriceMaxKey", common.HexToAddress(fromAddresses[2]))` $DIR/core/services/vrf/delegate_test.go: `.HexToAddress(fromAddresses[2])` $DIR/core/services/vrf/delegate_test.go: `.Return(assets.GWei(50))` $DIR/core/services/vrf/delegate_test.go: `.GWei(50)` $DIR/core/services/vrf/delegate_test.go: `.Once()` $DIR/core/services/vrf/delegate_test.go: `.AssertExpectations(tt)` $DIR/core/services/vrf/delegate_test.go: `.ValidatedVRFSpec(testspecs.GenerateVRFSpec( testspecs.VRFSpecParams{ RequestedConfsDelay: 10, FromAddresses: fromAddresses, ChunkSize: 25, BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(100), }). Toml())` $DIR/core/services/vrf/delegate_test.go: `.GenerateVRFSpec( testspecs.VRFSpecParams{ RequestedConfsDelay: 10, FromAddresses: fromAddresses, ChunkSize: 25, BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(100), })` $DIR/core/services/vrf/delegate_test.go: `.GWei(100)` $DIR/core/services/vrf/delegate_test.go: `. Toml()` $DIR/core/services/vrf/delegate_test.go: `.Run("from addresses exist", func(t *testing.T) { ctx := testutils.Context(t) db := pgtest.NewSqlxDB(t) lggr := logger.TestLogger(t) ks := keystore.NewInMemory(db, utils.FastScryptParams, lggr) require.NoError(t, ks.Unlock(ctx, testutils.Password)) var fromAddresses []string for i := 0; i < 3; i++ { k, err := ks.Eth().Create(testutils.Context(t), big.NewInt(1337)) assert.NoError(t, err) fromAddresses = append(fromAddresses, k.Address.Hex()) } jb, err := vrfcommon.ValidatedVRFSpec(testspecs.GenerateVRFSpec( testspecs.VRFSpecParams{ RequestedConfsDelay: 10, FromAddresses: fromAddresses, ChunkSize: 25, BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(100), }). Toml()) assert.NoError(t, err) assert.NoError(t, vrf.CheckFromAddressesExist(testutils.Context(t), jb, ks.Eth())) })` $DIR/core/services/vrf/delegate_test.go: `.Context(t)` $DIR/core/services/vrf/delegate_test.go: `.NewSqlxDB(t)` $DIR/core/services/vrf/delegate_test.go: `.TestLogger(t)` $DIR/core/services/vrf/delegate_test.go: `.NewInMemory(db, utils.FastScryptParams, lggr)` $DIR/core/services/vrf/delegate_test.go: `.Eth()` $DIR/core/services/vrf/delegate_test.go: `.Create(testutils.Context(t), big.NewInt(1337))` $DIR/core/services/vrf/delegate_test.go: `.Context(t)` $DIR/core/services/vrf/delegate_test.go: `.NewInt(1337)` $DIR/core/services/vrf/delegate_test.go: `.Address.Hex()` $DIR/core/services/vrf/delegate_test.go: `.ValidatedVRFSpec(testspecs.GenerateVRFSpec( testspecs.VRFSpecParams{ RequestedConfsDelay: 10, FromAddresses: fromAddresses, ChunkSize: 25, BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(100), }). Toml())` $DIR/core/services/vrf/delegate_test.go: `.GenerateVRFSpec( testspecs.VRFSpecParams{ RequestedConfsDelay: 10, FromAddresses: fromAddresses, ChunkSize: 25, BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(100), })` $DIR/core/services/vrf/delegate_test.go: `.GWei(100)` $DIR/core/services/vrf/delegate_test.go: `. Toml()` $DIR/core/services/vrf/delegate_test.go: `.Context(t)` $DIR/core/services/vrf/delegate_test.go: `.NewSqlxDB(t)` $DIR/core/services/vrf/delegate_test.go: `.TestLogger(t)` $DIR/core/services/vrf/delegate_test.go: `.NewInMemory(db, utils.FastScryptParams, lggr)` $DIR/core/services/vrf/delegate_test.go: `.Eth()` $DIR/core/services/vrf/delegate_test.go: `.Create(testutils.Context(t), big.NewInt(1337))` $DIR/core/services/vrf/delegate_test.go: `.Context(t)` $DIR/core/services/vrf/delegate_test.go: `.NewInt(1337)` $DIR/core/services/vrf/delegate_test.go: `.Address.Hex()` $DIR/core/services/vrf/delegate_test.go: `.NewAddress()` $DIR/core/services/vrf/delegate_test.go: `.Hex()` $DIR/core/services/vrf/delegate_test.go: `.ValidatedVRFSpec(testspecs.GenerateVRFSpec( testspecs.VRFSpecParams{ RequestedConfsDelay: 10, FromAddresses: fromAddresses, ChunkSize: 25, BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(100), }). Toml())` $DIR/core/services/vrf/delegate_test.go: `.GenerateVRFSpec( testspecs.VRFSpecParams{ RequestedConfsDelay: 10, FromAddresses: fromAddresses, ChunkSize: 25, BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(100), })` $DIR/core/services/vrf/delegate_test.go: `.GWei(100)` $DIR/core/services/vrf/delegate_test.go: `. Toml()` $DIR/core/services/vrf/delegate_test.go: `.Run("all max gas prices equal", func(tt *testing.T) { fromAddresses := []string{ "0x498C2Dce1d3aEDE31A8c808c511C38a809e67684", "0x253b01b9CaAfbB9dC138d7D8c3ACBCDd47144b4B", "0xD94E6AD557277c6E3e163cefF90F52AB51A95143", } jb, err := vrfcommon.ValidatedVRFSpec(testspecs.GenerateVRFSpec(testspecs.VRFSpecParams{ RequestedConfsDelay: 10, FromAddresses: fromAddresses, ChunkSize: 25, BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(100), }).Toml()) require.NoError(tt, err) cfg := vrf_mocks.NewFeeConfig(t) for _, a := range fromAddresses { cfg.On("PriceMaxKey", common.HexToAddress(a)).Return(assets.GWei(100)) } defer cfg.AssertExpectations(tt) assert.True(tt, vrf.FromAddressMaxGasPricesAllEqual(jb, cfg.PriceMaxKey)) })` $DIR/core/services/vrf/delegate_test.go: `.ValidatedVRFSpec(testspecs.GenerateVRFSpec(testspecs.VRFSpecParams{ RequestedConfsDelay: 10, FromAddresses: fromAddresses, ChunkSize: 25, BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(100), }).Toml())` $DIR/core/services/vrf/delegate_test.go: `.GenerateVRFSpec(testspecs.VRFSpecParams{ RequestedConfsDelay: 10, FromAddresses: fromAddresses, ChunkSize: 25, BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(100), })` $DIR/core/services/vrf/delegate_test.go: `.GWei(100)` $DIR/core/services/vrf/delegate_test.go: `.Toml()` $DIR/core/services/vrf/delegate_test.go: `.NewFeeConfig(t)` $DIR/core/services/vrf/delegate_test.go: `.On("PriceMaxKey", common.HexToAddress(a))` $DIR/core/services/vrf/delegate_test.go: `.HexToAddress(a)` $DIR/core/services/vrf/delegate_test.go: `.Return(assets.GWei(100))` $DIR/core/services/vrf/delegate_test.go: `.GWei(100)` $DIR/core/services/vrf/delegate_test.go: `.AssertExpectations(tt)` $DIR/core/services/vrf/delegate_test.go: `.ValidatedVRFSpec(testspecs.GenerateVRFSpec(testspecs.VRFSpecParams{ RequestedConfsDelay: 10, FromAddresses: fromAddresses, ChunkSize: 25, BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(100), }).Toml())` $DIR/core/services/vrf/delegate_test.go: `.GenerateVRFSpec(testspecs.VRFSpecParams{ RequestedConfsDelay: 10, FromAddresses: fromAddresses, ChunkSize: 25, BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(100), })` $DIR/core/services/vrf/delegate_test.go: `.GWei(100)` $DIR/core/services/vrf/delegate_test.go: `.Toml()` $DIR/core/services/vrf/delegate_test.go: `.NewFeeConfig(t)` $DIR/core/services/vrf/delegate_test.go: `.On("PriceMaxKey", common.HexToAddress(a))` $DIR/core/services/vrf/delegate_test.go: `.HexToAddress(a)` $DIR/core/services/vrf/delegate_test.go: `.Return(assets.GWei(100))` $DIR/core/services/vrf/delegate_test.go: `.GWei(100)` $DIR/core/services/vrf/delegate_test.go: `.On("PriceMaxKey", common.HexToAddress(fromAddresses[len(fromAddresses)-1]))` $DIR/core/services/vrf/delegate_test.go: `.HexToAddress(fromAddresses[len(fromAddresses)-1])` $DIR/core/services/vrf/delegate_test.go: `. Return(assets.GWei(200))` $DIR/core/services/vrf/delegate_test.go: `.GWei(200)` $DIR/core/services/vrf/delegate_test.go: `.AssertExpectations(tt)` $DIR/core/services/vrf/delegate_test.go: `.NewSqlxDB(t)` $DIR/core/services/vrf/delegate_test.go: `.NewTestGeneralConfig(t)` $DIR/core/services/vrf/delegate_test.go: `.Run(t, mailboxtest.NewMonitor(t))` $DIR/core/services/vrf/delegate_test.go: `.NewMonitor(t)` $DIR/core/services/vrf/delegate_test.go: `.NewDelegate( db, vuni.ks, vuni.pr, vuni.prm, vuni.legacyChains, logger.TestLogger(t), mailMon)` $DIR/core/services/vrf/delegate_test.go: `.TestLogger(t)` $DIR/core/services/vrf/delegate_test.go: `.legacyChains.Get(testutils.FixtureChainID.String())` $DIR/core/services/vrf/delegate_test.go: `.FixtureChainID.String()` $DIR/core/services/vrf/delegate_test.go: `.GenerateVRFSpec(testspecs.VRFSpecParams{ VRFVersion: vrfcommon.V2Plus, PublicKey: vuni.vrfkey.PublicKey.String(), FromAddresses: []string{vuni.submitter.Hex()}, GasLanePrice: chain.Config().EVM().GasEstimator().PriceMax(), })` $DIR/core/services/vrf/delegate_test.go: `.vrfkey.PublicKey.String()` $DIR/core/services/vrf/delegate_test.go: `.submitter.Hex()` $DIR/core/services/vrf/delegate_test.go: `.Config()` $DIR/core/services/vrf/delegate_test.go: `.EVM()` $DIR/core/services/vrf/delegate_test.go: `.GasEstimator()` $DIR/core/services/vrf/delegate_test.go: `.PriceMax()` $DIR/core/services/vrf/delegate_test.go: `.Toml()` $DIR/core/services/vrf/delegate_test.go: `.ValidatedVRFSpec(toml)` $DIR/core/services/vrf/delegate_test.go: `.Context(t)` $DIR/core/services/vrf/delegate_test.go: `.jrm.CreateJob(ctx, &jb)` $DIR/core/services/vrf/delegate_test.go: `.ServicesForSpec(testutils.Context(t), jb)` $DIR/core/services/vrf/delegate_test.go: `.Context(t)` $DIR/core/services/vrf/proof/proof_response_test.go: `backend.Commit()` $DIR/core/services/vrf/proof/proof_response_test.go: `_, err = verifier.RandomValueFromVRFProof(nil, proof[:])` $DIR/core/services/vrf/proof/proof_response_test.go: `.Context(t)` $DIR/core/services/vrf/proof/proof_response_test.go: `.NewSqlxDB(t)` $DIR/core/services/vrf/proof/proof_response_test.go: `.NewKeyStore(t, db)` $DIR/core/services/vrf/proof/proof_response_test.go: `.NewInt(1)` $DIR/core/services/vrf/proof/proof_response_test.go: `.TestXXXSeedData(t, preSeed, blockHash, blockNum)` $DIR/core/services/vrf/proof/proof_response_test.go: `.GenerateProofResponse(keyStore.VRF(), key.ID(), s)` $DIR/core/services/vrf/proof/proof_response_test.go: `.VRF()` $DIR/core/services/vrf/proof/proof_response_test.go: `.ID()` $DIR/core/services/vrf/proof/proof_response_test.go: `.UnmarshalProofResponse(proofResponse)` $DIR/core/services/vrf/proof/proof_response_test.go: `.CryptoProof(s)` $DIR/core/services/vrf/proof/proof_response_test.go: `.MarshalForSolidityVerifier(&actualProof)` $DIR/core/services/vrf/proof/proof_response_test.go: `.GenerateKey()` $DIR/core/services/vrf/proof/proof_response_test.go: `.NewKeyedTransactorWithChainID(ethereumKey, big.NewInt(1337))` $DIR/core/services/vrf/proof/proof_response_test.go: `.NewInt(1337)` $DIR/core/services/vrf/proof/proof_response_test.go: `.Ether(100)` $DIR/core/services/vrf/proof/proof_response_test.go: `.ToInt()` $DIR/core/services/vrf/proof/proof_response_test.go: `.NewSimulatedBackend(t, genesisData, gasLimit)` $DIR/core/services/vrf/proof/proof_response_test.go: `.DeployVRFTestHelper(auth, backend)` $DIR/core/services/vrf/proof/proof_response_test.go: `.Commit()` $DIR/core/services/vrf/proof/proof_response_test.go: `.RandomValueFromVRFProof(nil, proof[:])` $DIR/core/services/vrf/solidity_cross_tests/vrf_consumer_base_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/solidity_cross_tests/vrf_consumer_base_test.go: `.NewVRFCoordinatorUniverse(t, key)` $DIR/core/services/vrf/solidity_cross_tests/vrf_consumer_base_test.go: `.ConsumerContract.RawFulfillRandomness(coordinator.Neil, keyHash, big.NewInt(0).SetBytes([]byte("a bad random value")))` $DIR/core/services/vrf/solidity_cross_tests/vrf_consumer_base_test.go: `.NewInt(0)` $DIR/core/services/vrf/solidity_cross_tests/vrf_consumer_base_test.go: `.SetBytes([]byte("a bad random value"))` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_interface_test.go: `.RawRandomnessRequestLogToRandomnessRequestLog(&raw)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_interface_test.go: `.RawData()` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_interface_test.go: `.ParseRandomnessRequestLog(types.Log{ Data: rawLog, Topics: []common.Hash{solidity_cross_tests.VRFRandomnessRequestLogTopic(), jobID}, })` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_interface_test.go: `.VRFRandomnessRequestLogTopic()` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_interface_test.go: `.Equal(*nR)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `logCount++` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `copy(jobID[:], []byte("exactly 32 characters in length."))` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `fulfillRandomnessRequest(t, coordinator, *log)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `coordinator.Backend.Commit()` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `_, err = coordinator.RootContract.Withdraw(coordinator.Neil, peteThePunter, fee)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.HexToHash("0x01")` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.NewVRFCoordinatorUniverse(t, key)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.NewInt(1)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.MakeRequestId(nil, keyHash, seed)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.Hash(solidityRequestID)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.ComputedRequestID()` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.NewVRFCoordinatorUniverse(t, key)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.RootContract.FilterNewServiceAgreement(nil)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.Next()` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.RootContract.ServiceAgreements(nil, keyHash)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.Cmp(serviceAgreement.Fee)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.NewVRFCoordinatorUniverse(t, key)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.RootContract.RegisterProvingKey( coordinator.Ned, vrfFee, coordinator.Neil.From, pair(secp256k1.Coordinates(publicKey)), jobID)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.Coordinates(publicKey)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.NewVRFCoordinatorUniverseWithV08Consumer(t, key)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.BytesToHash(keyHash_[:])` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.BytesToHash(jobID_[:])` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.RequestIDBase.MakeVRFInputSeed(nil, keyHash, hardcodedSeed, coord.ConsumerContractAddress, big.NewInt(0))` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.NewInt(0)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.RequestIDBaseV08.MakeVRFInputSeed(nil, keyHash, hardcodedSeed, coord.ConsumerContractAddressV08, big.NewInt(0))` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.NewInt(0)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.rr(t, coord, keyHash, fee)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.NewInt(0)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.ms()` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.MustHash(string(append(append(append( keyHash[:], common.BigToHash(hardcodedSeed).Bytes()...), common.BytesToHash(tc.consumerAddress.Bytes()).Bytes()...), common.BigToHash(nonce).Bytes()...)))` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.BigToHash(hardcodedSeed)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.Bytes()` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.BytesToHash(tc.consumerAddress.Bytes())` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.consumerAddress.Bytes()` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.Bytes()` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.BigToHash(nonce)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.Bytes()` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.ParseRandomnessRequestLog(log.Raw.Raw)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.NewVRFCoordinatorUniverse(t, key)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.ConsumerContract.RandomnessOutput(nil)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.ConsumerContract.RequestId(nil)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.RootContract.WithdrawableTokens( nil, coordinator.Neil.From)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.Cmp(fee)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.NewVRFCoordinatorUniverse(t, key)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.NewInt(4)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.HexToAddress("0xdeadfa11deadfa11deadfa11deadfa11deadfa11")` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.RootContract.Withdraw(coordinator.Neil, peteThePunter, payment)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.Backend.Commit()` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.LinkContract.BalanceOf(nil, peteThePunter)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.RootContract.WithdrawableTokens( nil, coordinator.Neil.From)` $DIR/core/services/vrf/solidity_cross_tests/vrf_coordinator_solidity_crosscheck_test.go: `.RootContract.Withdraw(coordinator.Neil, peteThePunter, fee)` $DIR/core/services/vrf/solidity_cross_tests/vrf_fulfillment_cost_test.go: `coordinator.Backend.Commit()` $DIR/core/services/vrf/solidity_cross_tests/vrf_fulfillment_cost_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/solidity_cross_tests/vrf_fulfillment_cost_test.go: `.NewVRFCoordinatorUniverse(t, key)` $DIR/core/services/vrf/solidity_cross_tests/vrf_fulfillment_cost_test.go: `.BigToSeed(log.Seed)` $DIR/core/services/vrf/solidity_cross_tests/vrf_fulfillment_cost_test.go: `.FinalSeed(s)` $DIR/core/services/vrf/solidity_cross_tests/vrf_fulfillment_cost_test.go: `.GenerateProofWithNonce(seed, big.NewInt(1) /* nonce */)` $DIR/core/services/vrf/solidity_cross_tests/vrf_fulfillment_cost_test.go: `.NewInt(1)` $DIR/core/services/vrf/solidity_cross_tests/vrf_fulfillment_cost_test.go: `.GenerateProofResponseFromProof(proof, s)` $DIR/core/services/vrf/solidity_cross_tests/vrf_fulfillment_cost_test.go: `.Backend.Commit()` $DIR/core/services/vrf/solidity_cross_tests/vrf_randomness_output_cost_test.go: `.New(mrand.NewSource(10))` $DIR/core/services/vrf/solidity_cross_tests/vrf_randomness_output_cost_test.go: `.NewSource(10)` $DIR/core/services/vrf/solidity_cross_tests/vrf_randomness_output_cost_test.go: `.ToInt(sk)` $DIR/core/services/vrf/solidity_cross_tests/vrf_randomness_output_cost_test.go: `.MustNewV2XXXTestingOnly(skNum)` $DIR/core/services/vrf/solidity_cross_tests/vrf_randomness_output_cost_test.go: `.GenerateProofWithNonce(randomSeed, secp256k1.ToInt(nonce))` $DIR/core/services/vrf/solidity_cross_tests/vrf_randomness_output_cost_test.go: `.ToInt(nonce)` $DIR/core/services/vrf/solidity_cross_tests/vrf_randomness_output_cost_test.go: `.MarshalForSolidityVerifier(&proof)` $DIR/core/services/vrf/solidity_cross_tests/vrf_request_cost_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/solidity_cross_tests/vrf_request_cost_test.go: `.NewVRFCoordinatorUniverse(t, key)` $DIR/core/services/vrf/solidity_cross_tests/vrf_request_cost_test.go: `.BytesToHash(keyHash_[:])` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `_, err = deployVRFTestHelper(t).LinearCombination(nil, big.NewInt(0).Add( cNum, big.NewInt(1)), p1Pair, cp1Pair, sNum, p2Pair, sp2Pair, zInv)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `_, err = deployVRFTestHelper(t).LinearCombination(nil, cNum, p1Pair, cp1Pair, big.NewInt(0).Add(sNum, big.NewInt(1)), p2Pair, sp2Pair, zInv)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `mproof[corruptionTargetByte]++` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `_, err = deployVRFTestHelper(t).RandomValueFromVRFProof(nil, mproof[:])` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.New(mrand.NewSource(11))` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.NewSource(11)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.Coordinates(p)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.Coordinates(q)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.ProjectiveECAdd(p, q)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.ProjectiveECAdd( nil, px, py, qx, qy)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.New(mrand.NewSource(0))` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.NewSource(0)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.BigModExp(nil, base, exponent)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.NewInt(0)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.Exp(base, exponent, vrfkey.FieldSize)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.New(mrand.NewSource(1))` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.NewSource(1)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.SquareRoot(nil, maybeSquare)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.SquareRoot(maybeSquare)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.New(mrand.NewSource(2))` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.NewSource(2)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.YSquared(nil, x)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.New(mrand.NewSource(3))` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.NewSource(3)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.Read(msg)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.FieldHash(nil, msg)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.FieldHash(msg)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.New(mrand.NewSource(4))` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.NewSource(4)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.HashToCurve(nil, pubKeyCoords, input)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.SetCoordinates(cKey.X, cKey.Y)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.HashToCurve(pubKeyPoint, input, func(*big.Int) {})` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.New(mrand.NewSource(5))` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.NewSource(5)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.Coordinates(p1)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.Coordinates(p2)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.ProjectiveECAdd( nil, p1x, p1y, p2x, p2y)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.ProjectiveECAdd(p1, p2)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.NewInt(1)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.ModInverse(psz, vrfkey.FieldSize)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.AffineECAdd( nil, pair(p1x, p1y), pair(p2x, p2y), zInv)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.New(mrand.NewSource(6))` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.NewSource(6)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.Coordinates(p)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.Point()` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.Mul(s, p)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.EcmulVerify(nil, pxy, secp256k1.ToInt(s), product)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.ToInt(s)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.EcmulVerify(nil, pxy, big.NewInt(0).Add(secp256k1.ToInt(s), big.NewInt(1)), product)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.NewInt(0)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.Add(secp256k1.ToInt(s), big.NewInt(1))` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.ToInt(s)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.NewInt(1)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.New(mrand.NewSource(7))` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.NewSource(7)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.Point()` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.Add( (&secp256k1.Secp256k1{}).Point().Mul(c, p), (&secp256k1.Secp256k1{}).Point().Mul(s, vrfkey.Generator))` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.Point()` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.Mul(c, p)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.Point()` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.Mul(s, vrfkey.Generator)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.EthereumAddress(expectedPoint)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.VerifyLinearCombinationWithGenerator(nil, secp256k1.ToInt(c), pPair, secp256k1.ToInt(s), expectedAddress)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.ToInt(c)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.ToInt(s)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.VerifyLinearCombinationWithGenerator(nil, big.NewInt(0).Add(secp256k1.ToInt(c), big.NewInt(1)), pPair, secp256k1.ToInt(s), expectedAddress)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.NewInt(0)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.Add(secp256k1.ToInt(c), big.NewInt(1))` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.ToInt(c)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.NewInt(1)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.ToInt(s)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.New(mrand.NewSource(8))` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.NewSource(8)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.ToInt(c)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.ToInt(s)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.Point()` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.Mul(c, p1)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.Point()` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.Mul(s, p2)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.Point()` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.Add(cp1, sp2)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.ProjectiveECAdd(cp1, sp2)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.NewInt(0)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.ModInverse(z, vrfkey.FieldSize)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.LinearCombination(nil, cNum, p1Pair, cp1Pair, sNum, p2Pair, sp2Pair, zInv)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.LinearCombination(nil, big.NewInt(0).Add( cNum, big.NewInt(1)), p1Pair, cp1Pair, sNum, p2Pair, sp2Pair, zInv)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.NewInt(0)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.Add( cNum, big.NewInt(1))` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.NewInt(1)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.LinearCombination(nil, cNum, p1Pair, cp1Pair, big.NewInt(0).Add(sNum, big.NewInt(1)), p2Pair, sp2Pair, zInv)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.NewInt(0)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.Add(sNum, big.NewInt(1))` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.NewInt(1)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.New(mrand.NewSource(9))` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.NewSource(9)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.ScalarFromCurvePoints(hash, pk, gamma, uWitness, v)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.ScalarFromCurvePoints(nil, hashPair, pkPair, gammaPair, uWitness, vPair)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.New(mrand.NewSource(10))` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.NewSource(10)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.ToInt(sk)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.MustNewV2XXXTestingOnly(skNum)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.GenerateProofWithNonce(randomSeed, secp256k1.ToInt(nonce))` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.ToInt(nonce)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.MarshalForSolidityVerifier(&proof)` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.RandomValueFromVRFProof(nil, mproof[:])` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.Int63n(int64(len(mproof)))` $DIR/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go: `.RandomValueFromVRFProof(nil, mproof[:])` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `_, err = verifier.IsOnCurve(nil, [2]*big.Int{secp256k1.FieldSize, big.NewInt(10)})` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `_, err = verifier.IsOnCurve(nil, [2]*big.Int{big.NewInt(10), big.NewInt(0).Sub(secp256k1.FieldSize, big.NewInt(1))})` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `_, err = verifier.IsOnCurve(nil, [2]*big.Int{big.NewInt(0).Sub(secp256k1.FieldSize, big.NewInt(1)), big.NewInt(10)})` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `_, err = deployVRFV08TestHelper(t).LinearCombination(nil, big.NewInt(0).Add( cNum, big.NewInt(1)), p1Pair, cp1Pair, sNum, p2Pair, sp2Pair, zInv)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `_, err = deployVRFV08TestHelper(t).LinearCombination(nil, cNum, p1Pair, cp1Pair, big.NewInt(0).Add(sNum, big.NewInt(1)), p2Pair, sp2Pair, zInv)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.IsOnCurve(nil, [2]*big.Int{big.NewInt(10), secp256k1.FieldSize})` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewInt(10)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.IsOnCurve(nil, [2]*big.Int{secp256k1.FieldSize, big.NewInt(10)})` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewInt(10)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.IsOnCurve(nil, [2]*big.Int{big.NewInt(10), big.NewInt(0).Sub(secp256k1.FieldSize, big.NewInt(1))})` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewInt(10)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewInt(0)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.Sub(secp256k1.FieldSize, big.NewInt(1))` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewInt(1)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.IsOnCurve(nil, [2]*big.Int{big.NewInt(0).Sub(secp256k1.FieldSize, big.NewInt(1)), big.NewInt(10)})` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewInt(0)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.Sub(secp256k1.FieldSize, big.NewInt(1))` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewInt(1)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewInt(10)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.New(mrand.NewSource(11))` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewSource(11)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.Coordinates(p)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.Coordinates(q)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.ProjectiveECAdd(p, q)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.ProjectiveECAdd( nil, px, py, qx, qy)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.New(mrand.NewSource(0))` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewSource(0)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.BigModExp(nil, base, exponent)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewInt(0)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.Exp(base, exponent, vrfkey.FieldSize)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.New(mrand.NewSource(1))` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewSource(1)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.SquareRoot(nil, maybeSquare)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.SquareRoot(maybeSquare)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.New(mrand.NewSource(2))` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewSource(2)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.YSquared(nil, x)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.New(mrand.NewSource(3))` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewSource(3)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.Read(msg)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.FieldHash(nil, msg)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.FieldHash(msg)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.New(mrand.NewSource(4))` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewSource(4)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.HashToCurve(nil, pubKeyCoords, input)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.SetCoordinates(cKey.X, cKey.Y)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.HashToCurve(pubKeyPoint, input, func(*big.Int) {})` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.New(mrand.NewSource(5))` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewSource(5)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.Coordinates(p1)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.Coordinates(p2)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.ProjectiveECAdd( nil, p1x, p1y, p2x, p2y)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.ProjectiveECAdd(p1, p2)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewInt(1)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.ModInverse(psz, vrfkey.FieldSize)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.AffineECAdd( nil, pair(p1x, p1y), pair(p2x, p2y), zInv)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.New(mrand.NewSource(6))` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewSource(6)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.Coordinates(p)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.Point()` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.Mul(s, p)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.EcmulVerify(nil, pxy, secp256k1.ToInt(s), product)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.ToInt(s)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.EcmulVerify(nil, pxy, big.NewInt(0).Add(secp256k1.ToInt(s), big.NewInt(1)), product)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewInt(0)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.Add(secp256k1.ToInt(s), big.NewInt(1))` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.ToInt(s)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewInt(1)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.New(mrand.NewSource(7))` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewSource(7)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.Point()` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.Add( (&secp256k1.Secp256k1{}).Point().Mul(c, p), (&secp256k1.Secp256k1{}).Point().Mul(s, vrfkey.Generator))` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.Point()` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.Mul(c, p)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.Point()` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.Mul(s, vrfkey.Generator)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.EthereumAddress(expectedPoint)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.VerifyLinearCombinationWithGenerator(nil, secp256k1.ToInt(c), pPair, secp256k1.ToInt(s), expectedAddress)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.ToInt(c)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.ToInt(s)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.VerifyLinearCombinationWithGenerator(nil, big.NewInt(0).Add(secp256k1.ToInt(c), big.NewInt(1)), pPair, secp256k1.ToInt(s), expectedAddress)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewInt(0)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.Add(secp256k1.ToInt(c), big.NewInt(1))` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.ToInt(c)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewInt(1)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.ToInt(s)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.New(mrand.NewSource(8))` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewSource(8)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.ToInt(c)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.ToInt(s)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.Point()` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.Mul(c, p1)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.Point()` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.Mul(s, p2)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.Point()` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.Add(cp1, sp2)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.ProjectiveECAdd(cp1, sp2)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewInt(0)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.ModInverse(z, vrfkey.FieldSize)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.LinearCombination(nil, cNum, p1Pair, cp1Pair, sNum, p2Pair, sp2Pair, zInv)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.LinearCombination(nil, big.NewInt(0).Add( cNum, big.NewInt(1)), p1Pair, cp1Pair, sNum, p2Pair, sp2Pair, zInv)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewInt(0)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.Add( cNum, big.NewInt(1))` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewInt(1)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.LinearCombination(nil, cNum, p1Pair, cp1Pair, big.NewInt(0).Add(sNum, big.NewInt(1)), p2Pair, sp2Pair, zInv)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewInt(0)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.Add(sNum, big.NewInt(1))` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewInt(1)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.New(mrand.NewSource(9))` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewSource(9)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.ScalarFromCurvePoints(hash, pk, gamma, uWitness, v)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.ScalarFromCurvePoints(nil, hashPair, pkPair, gammaPair, uWitness, vPair)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.New(mrand.NewSource(10))` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.NewSource(10)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.ToInt(sk)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.MustNewV2XXXTestingOnly(skNum)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.GenerateProofWithNonce(randomSeed, secp256k1.ToInt(nonce))` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.ToInt(nonce)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.BigToSeed(randomSeed)` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.GenerateProofResponseFromProofV2(proof, proof2.PreSeedDataV2{ PreSeed: seed, })` $DIR/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go: `.RandomValueFromVRFProof(nil, solidity_vrf_v08_verifier_wrapper.VRFProof{ Pk: solProof.Pk, Gamma: solProof.Gamma, C: solProof.C, S: solProof.S, Seed: solProof.Seed, UWitness: solProof.UWitness, CGammaWitness: solProof.CGammaWitness, SHashWitness: solProof.SHashWitness, ZInv: solProof.ZInv, }, randomSeed)` $DIR/core/services/vrf/v1/integration_test.go: `t.Run(test.name, func(t *testing.T) { ctx := testutils.Context(t) config, _ := heavyweight.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.EIP1559DynamicFees = &test.eip1559 c.EVM[0].ChainID = (*ubig.Big)(testutils.SimulatedChainID) }) key1 := cltest.MustGenerateRandomKey(t) key2 := cltest.MustGenerateRandomKey(t) cu := vrftesthelpers.NewVRFCoordinatorUniverse(t, key1, key2) incomingConfs := 2 app := cltest.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, cu.Backend, key1, key2) require.NoError(t, app.Start(ctx)) jb, vrfKey := createVRFJobRegisterKey(t, cu, app, incomingConfs) require.NoError(t, app.JobSpawner().CreateJob(ctx, nil, &jb)) _, err := cu.ConsumerContract.TestRequestRandomness(cu.Carol, vrfKey.PublicKey.MustHash(), big.NewInt(100)) require.NoError(t, err) _, err = cu.ConsumerContract.TestRequestRandomness(cu.Carol, vrfKey.PublicKey.MustHash(), big.NewInt(100)) require.NoError(t, err) cu.Backend.Commit() t.Log("Sent 2 test requests") // Mine the required number of blocks // So our request gets confirmed. for i := 0; i < incomingConfs; i++ { cu.Backend.Commit() } var runs []pipeline.Run gomega.NewWithT(t).Eventually(func() bool { runs, err = app.PipelineORM().GetAllRuns(ctx) require.NoError(t, err) // It possible that we send the test request // before the Job spawner has started the vrf services, which is fine // the lb will backfill the logs. However we need to // keep blocks coming in for the lb to send the backfilled logs. cu.Backend.Commit() return len(runs) == 2 && runs[0].State == pipeline.RunStatusCompleted && runs[1].State == pipeline.RunStatusCompleted }, testutils.WaitTimeout(t), 1*time.Second).Should(gomega.BeTrue()) assert.Equal(t, pipeline.RunErrors([]null.String{{}}), runs[0].FatalErrors) assert.Equal(t, 4, len(runs[0].PipelineTaskRuns)) assert.Equal(t, 4, len(runs[1].PipelineTaskRuns)) assert.NotNil(t, 0, runs[0].Outputs.Val) assert.NotNil(t, 0, runs[1].Outputs.Val) // stop jobs as to not cause a race condition in geth simulated backend // between job creating new tx and fulfillment logs polling below require.NoError(t, app.JobSpawner().DeleteJob(ctx, nil, jb.ID)) // Ensure the eth transaction gets confirmed on chain. gomega.NewWithT(t).Eventually(func() bool { orm := txmgr.NewTxStore(app.GetDB(), app.GetLogger()) uc, err2 := orm.CountUnconfirmedTransactions(ctx, key1.Address, testutils.SimulatedChainID) require.NoError(t, err2) return uc == 0 }, testutils.WaitTimeout(t), 100*time.Millisecond).Should(gomega.BeTrue()) // Assert the request was fulfilled on-chain. var rf []*solidity_vrf_coordinator_interface.VRFCoordinatorRandomnessRequestFulfilled gomega.NewWithT(t).Eventually(func() bool { rfIterator, err2 := cu.RootContract.FilterRandomnessRequestFulfilled(nil) require.NoError(t, err2, "failed to subscribe to RandomnessRequest logs") rf = nil for rfIterator.Next() { rf = append(rf, rfIterator.Event) } return len(rf) == 2 }, testutils.WaitTimeout(t), 500*time.Millisecond).Should(gomega.BeTrue()) // Check that each sending address sent one transaction n1, err := cu.Backend.PendingNonceAt(ctx, key1.Address) require.NoError(t, err) require.EqualValues(t, 1, n1) n2, err := cu.Backend.PendingNonceAt(ctx, key2.Address) require.NoError(t, err) require.EqualValues(t, 1, n2) })` $DIR/core/services/vrf/v1/integration_test.go: `c.EVM[0].GasEstimator.EIP1559DynamicFees = &test.eip1559` $DIR/core/services/vrf/v1/integration_test.go: `c.EVM[0].ChainID = (*ubig.Big)(testutils.SimulatedChainID)` $DIR/core/services/vrf/v1/integration_test.go: `_, err = cu.ConsumerContract.TestRequestRandomness(cu.Carol, vrfKey.PublicKey.MustHash(), big.NewInt(100))` $DIR/core/services/vrf/v1/integration_test.go: `cu.Backend.Commit()` $DIR/core/services/vrf/v1/integration_test.go: `cu.Backend.Commit()` $DIR/core/services/vrf/v1/integration_test.go: `gomega.NewWithT(t).Eventually(func() bool { runs, err = app.PipelineORM().GetAllRuns(ctx) require.NoError(t, err) // It possible that we send the test request // before the Job spawner has started the vrf services, which is fine // the lb will backfill the logs. However we need to // keep blocks coming in for the lb to send the backfilled logs. cu.Backend.Commit() return len(runs) == 2 && runs[0].State == pipeline.RunStatusCompleted && runs[1].State == pipeline.RunStatusCompleted }, testutils.WaitTimeout(t), 1*time.Second).Should(gomega.BeTrue())` $DIR/core/services/vrf/v1/integration_test.go: `runs, err = app.PipelineORM().GetAllRuns(ctx)` $DIR/core/services/vrf/v1/integration_test.go: `cu.Backend.Commit()` $DIR/core/services/vrf/v1/integration_test.go: `gomega.NewWithT(t).Eventually(func() bool { orm := txmgr.NewTxStore(app.GetDB(), app.GetLogger()) uc, err2 := orm.CountUnconfirmedTransactions(ctx, key1.Address, testutils.SimulatedChainID) require.NoError(t, err2) return uc == 0 }, testutils.WaitTimeout(t), 100*time.Millisecond).Should(gomega.BeTrue())` $DIR/core/services/vrf/v1/integration_test.go: `gomega.NewWithT(t).Eventually(func() bool { rfIterator, err2 := cu.RootContract.FilterRandomnessRequestFulfilled(nil) require.NoError(t, err2, "failed to subscribe to RandomnessRequest logs") rf = nil for rfIterator.Next() { rf = append(rf, rfIterator.Event) } return len(rf) == 2 }, testutils.WaitTimeout(t), 500*time.Millisecond).Should(gomega.BeTrue())` $DIR/core/services/vrf/v1/integration_test.go: `rf = nil` $DIR/core/services/vrf/v1/integration_test.go: `rf = append(rf, rfIterator.Event)` $DIR/core/services/vrf/v1/integration_test.go: `c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(true)` $DIR/core/services/vrf/v1/integration_test.go: `c.EVM[0].BlockBackfillDepth = ptr[uint32](500)` $DIR/core/services/vrf/v1/integration_test.go: `c.Feature.LogPoller = ptr(true)` $DIR/core/services/vrf/v1/integration_test.go: `c.EVM[0].FinalityDepth = ptr[uint32](2)` $DIR/core/services/vrf/v1/integration_test.go: `c.EVM[0].LogPollInterval = commonconfig.MustNewDuration(time.Second)` $DIR/core/services/vrf/v1/integration_test.go: `c.EVM[0].ChainID = (*ubig.Big)(testutils.SimulatedChainID)` $DIR/core/services/vrf/v1/integration_test.go: `cu.Backend.Commit()` $DIR/core/services/vrf/v1/integration_test.go: `cu.Backend.Commit()` $DIR/core/services/vrf/v1/integration_test.go: `gomega.NewGomegaWithT(t).Eventually(func() bool { cu.Backend.Commit() _, err2 := cu.BHSContract.GetBlockhash(&bind.CallOpts{ Pending: false, From: common.Address{}, BlockNumber: nil, Context: nil, }, requestBlock) if err2 == nil { return true } else if strings.Contains(err2.Error(), "execution reverted") { return false } t.Fatal(err2) return false }, testutils.WaitTimeout(t), time.Second).Should(gomega.BeTrue())` $DIR/core/services/vrf/v1/integration_test.go: `cu.Backend.Commit()` $DIR/core/services/vrf/v1/integration_test.go: `cu.Backend.Commit()` $DIR/core/services/vrf/v1/integration_test.go: `gomega.NewWithT(t).Eventually(func() bool { runs, err = app.PipelineORM().GetAllRuns(ctx) require.NoError(t, err) cu.Backend.Commit() return len(runs) == 1 && runs[0].State == pipeline.RunStatusCompleted }, 10*time.Second, 1*time.Second).Should(gomega.BeTrue())` $DIR/core/services/vrf/v1/integration_test.go: `runs, err = app.PipelineORM().GetAllRuns(ctx)` $DIR/core/services/vrf/v1/integration_test.go: `cu.Backend.Commit()` $DIR/core/services/vrf/v1/integration_test.go: `gomega.NewWithT(t).Eventually(func() bool { orm := txmgr.NewTxStore(app.GetDB(), app.GetLogger()) uc, err2 := orm.CountUnconfirmedTransactions(ctx, key.Address, testutils.SimulatedChainID) require.NoError(t, err2) return uc == 0 }, 5*time.Second, 100*time.Millisecond).Should(gomega.BeTrue())` $DIR/core/services/vrf/v1/integration_test.go: `rf = append(rf, rfIterator.Event)` $DIR/core/services/vrf/v1/integration_test.go: `.Run(test.name, func(t *testing.T) { ctx := testutils.Context(t) config, _ := heavyweight.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.EIP1559DynamicFees = &test.eip1559 c.EVM[0].ChainID = (*ubig.Big)(testutils.SimulatedChainID) }) key1 := cltest.MustGenerateRandomKey(t) key2 := cltest.MustGenerateRandomKey(t) cu := vrftesthelpers.NewVRFCoordinatorUniverse(t, key1, key2) incomingConfs := 2 app := cltest.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, cu.Backend, key1, key2) require.NoError(t, app.Start(ctx)) jb, vrfKey := createVRFJobRegisterKey(t, cu, app, incomingConfs) require.NoError(t, app.JobSpawner().CreateJob(ctx, nil, &jb)) _, err := cu.ConsumerContract.TestRequestRandomness(cu.Carol, vrfKey.PublicKey.MustHash(), big.NewInt(100)) require.NoError(t, err) _, err = cu.ConsumerContract.TestRequestRandomness(cu.Carol, vrfKey.PublicKey.MustHash(), big.NewInt(100)) require.NoError(t, err) cu.Backend.Commit() t.Log("Sent 2 test requests") // Mine the required number of blocks // So our request gets confirmed. for i := 0; i < incomingConfs; i++ { cu.Backend.Commit() } var runs []pipeline.Run gomega.NewWithT(t).Eventually(func() bool { runs, err = app.PipelineORM().GetAllRuns(ctx) require.NoError(t, err) // It possible that we send the test request // before the Job spawner has started the vrf services, which is fine // the lb will backfill the logs. However we need to // keep blocks coming in for the lb to send the backfilled logs. cu.Backend.Commit() return len(runs) == 2 && runs[0].State == pipeline.RunStatusCompleted && runs[1].State == pipeline.RunStatusCompleted }, testutils.WaitTimeout(t), 1*time.Second).Should(gomega.BeTrue()) assert.Equal(t, pipeline.RunErrors([]null.String{{}}), runs[0].FatalErrors) assert.Equal(t, 4, len(runs[0].PipelineTaskRuns)) assert.Equal(t, 4, len(runs[1].PipelineTaskRuns)) assert.NotNil(t, 0, runs[0].Outputs.Val) assert.NotNil(t, 0, runs[1].Outputs.Val) // stop jobs as to not cause a race condition in geth simulated backend // between job creating new tx and fulfillment logs polling below require.NoError(t, app.JobSpawner().DeleteJob(ctx, nil, jb.ID)) // Ensure the eth transaction gets confirmed on chain. gomega.NewWithT(t).Eventually(func() bool { orm := txmgr.NewTxStore(app.GetDB(), app.GetLogger()) uc, err2 := orm.CountUnconfirmedTransactions(ctx, key1.Address, testutils.SimulatedChainID) require.NoError(t, err2) return uc == 0 }, testutils.WaitTimeout(t), 100*time.Millisecond).Should(gomega.BeTrue()) // Assert the request was fulfilled on-chain. var rf []*solidity_vrf_coordinator_interface.VRFCoordinatorRandomnessRequestFulfilled gomega.NewWithT(t).Eventually(func() bool { rfIterator, err2 := cu.RootContract.FilterRandomnessRequestFulfilled(nil) require.NoError(t, err2, "failed to subscribe to RandomnessRequest logs") rf = nil for rfIterator.Next() { rf = append(rf, rfIterator.Event) } return len(rf) == 2 }, testutils.WaitTimeout(t), 500*time.Millisecond).Should(gomega.BeTrue()) // Check that each sending address sent one transaction n1, err := cu.Backend.PendingNonceAt(ctx, key1.Address) require.NoError(t, err) require.EqualValues(t, 1, n1) n2, err := cu.Backend.PendingNonceAt(ctx, key2.Address) require.NoError(t, err) require.EqualValues(t, 1, n2) })` $DIR/core/services/vrf/v1/integration_test.go: `.Context(t)` $DIR/core/services/vrf/v1/integration_test.go: `.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.EIP1559DynamicFees = &test.eip1559 c.EVM[0].ChainID = (*ubig.Big)(testutils.SimulatedChainID) })` $DIR/core/services/vrf/v1/integration_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v1/integration_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v1/integration_test.go: `.NewVRFCoordinatorUniverse(t, key1, key2)` $DIR/core/services/vrf/v1/integration_test.go: `.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, cu.Backend, key1, key2)` $DIR/core/services/vrf/v1/integration_test.go: `.ConsumerContract.TestRequestRandomness(cu.Carol, vrfKey.PublicKey.MustHash(), big.NewInt(100))` $DIR/core/services/vrf/v1/integration_test.go: `.PublicKey.MustHash()` $DIR/core/services/vrf/v1/integration_test.go: `.NewInt(100)` $DIR/core/services/vrf/v1/integration_test.go: `.ConsumerContract.TestRequestRandomness(cu.Carol, vrfKey.PublicKey.MustHash(), big.NewInt(100))` $DIR/core/services/vrf/v1/integration_test.go: `.PublicKey.MustHash()` $DIR/core/services/vrf/v1/integration_test.go: `.NewInt(100)` $DIR/core/services/vrf/v1/integration_test.go: `.Backend.Commit()` $DIR/core/services/vrf/v1/integration_test.go: `.Backend.Commit()` $DIR/core/services/vrf/v1/integration_test.go: `.NewWithT(t)` $DIR/core/services/vrf/v1/integration_test.go: `.Eventually(func() bool { runs, err = app.PipelineORM().GetAllRuns(ctx) require.NoError(t, err) // It possible that we send the test request // before the Job spawner has started the vrf services, which is fine // the lb will backfill the logs. However we need to // keep blocks coming in for the lb to send the backfilled logs. cu.Backend.Commit() return len(runs) == 2 && runs[0].State == pipeline.RunStatusCompleted && runs[1].State == pipeline.RunStatusCompleted }, testutils.WaitTimeout(t), 1*time.Second)` $DIR/core/services/vrf/v1/integration_test.go: `.PipelineORM()` $DIR/core/services/vrf/v1/integration_test.go: `.GetAllRuns(ctx)` $DIR/core/services/vrf/v1/integration_test.go: `.Backend.Commit()` $DIR/core/services/vrf/v1/integration_test.go: `.WaitTimeout(t)` $DIR/core/services/vrf/v1/integration_test.go: `.Should(gomega.BeTrue())` $DIR/core/services/vrf/v1/integration_test.go: `.BeTrue()` $DIR/core/services/vrf/v1/integration_test.go: `.NewWithT(t)` $DIR/core/services/vrf/v1/integration_test.go: `.Eventually(func() bool { orm := txmgr.NewTxStore(app.GetDB(), app.GetLogger()) uc, err2 := orm.CountUnconfirmedTransactions(ctx, key1.Address, testutils.SimulatedChainID) require.NoError(t, err2) return uc == 0 }, testutils.WaitTimeout(t), 100*time.Millisecond)` $DIR/core/services/vrf/v1/integration_test.go: `.NewTxStore(app.GetDB(), app.GetLogger())` $DIR/core/services/vrf/v1/integration_test.go: `.GetDB()` $DIR/core/services/vrf/v1/integration_test.go: `.GetLogger()` $DIR/core/services/vrf/v1/integration_test.go: `.CountUnconfirmedTransactions(ctx, key1.Address, testutils.SimulatedChainID)` $DIR/core/services/vrf/v1/integration_test.go: `.WaitTimeout(t)` $DIR/core/services/vrf/v1/integration_test.go: `.Should(gomega.BeTrue())` $DIR/core/services/vrf/v1/integration_test.go: `.BeTrue()` $DIR/core/services/vrf/v1/integration_test.go: `.NewWithT(t)` $DIR/core/services/vrf/v1/integration_test.go: `.Eventually(func() bool { rfIterator, err2 := cu.RootContract.FilterRandomnessRequestFulfilled(nil) require.NoError(t, err2, "failed to subscribe to RandomnessRequest logs") rf = nil for rfIterator.Next() { rf = append(rf, rfIterator.Event) } return len(rf) == 2 }, testutils.WaitTimeout(t), 500*time.Millisecond)` $DIR/core/services/vrf/v1/integration_test.go: `.RootContract.FilterRandomnessRequestFulfilled(nil)` $DIR/core/services/vrf/v1/integration_test.go: `.Next()` $DIR/core/services/vrf/v1/integration_test.go: `.WaitTimeout(t)` $DIR/core/services/vrf/v1/integration_test.go: `.Should(gomega.BeTrue())` $DIR/core/services/vrf/v1/integration_test.go: `.BeTrue()` $DIR/core/services/vrf/v1/integration_test.go: `.Backend.PendingNonceAt(ctx, key1.Address)` $DIR/core/services/vrf/v1/integration_test.go: `.Backend.PendingNonceAt(ctx, key2.Address)` $DIR/core/services/vrf/v1/integration_test.go: `.Context(t)` $DIR/core/services/vrf/v1/integration_test.go: `.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(true) c.EVM[0].BlockBackfillDepth = ptr[uint32](500) c.Feature.LogPoller = ptr(true) c.EVM[0].FinalityDepth = ptr[uint32](2) c.EVM[0].LogPollInterval = commonconfig.MustNewDuration(time.Second) c.EVM[0].ChainID = (*ubig.Big)(testutils.SimulatedChainID) })` $DIR/core/services/vrf/v1/integration_test.go: `.MustNewDuration(time.Second)` $DIR/core/services/vrf/v1/integration_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v1/integration_test.go: `.NewVRFCoordinatorUniverse(t, key)` $DIR/core/services/vrf/v1/integration_test.go: `.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, cu.Backend, key)` $DIR/core/services/vrf/v1/integration_test.go: `.Address.String()` $DIR/core/services/vrf/v1/integration_test.go: `.CreateAndStartBHSJob(t, sendingKeys, app, cu.BHSContractAddress.String(), cu.RootContractAddress.String(), "", "", "", 0, 200, 0, 100)` $DIR/core/services/vrf/v1/integration_test.go: `.BHSContractAddress.String()` $DIR/core/services/vrf/v1/integration_test.go: `.RootContractAddress.String()` $DIR/core/services/vrf/v1/integration_test.go: `.ConsumerContract.TestRequestRandomness(cu.Carol, vrfKey.PublicKey.MustHash(), big.NewInt(100))` $DIR/core/services/vrf/v1/integration_test.go: `.PublicKey.MustHash()` $DIR/core/services/vrf/v1/integration_test.go: `.NewInt(100)` $DIR/core/services/vrf/v1/integration_test.go: `.Backend.Commit()` $DIR/core/services/vrf/v1/integration_test.go: `.Backend.Blockchain()` $DIR/core/services/vrf/v1/integration_test.go: `.CurrentHeader()` $DIR/core/services/vrf/v1/integration_test.go: `.Backend.Commit()` $DIR/core/services/vrf/v1/integration_test.go: `.NewGomegaWithT(t)` $DIR/core/services/vrf/v1/integration_test.go: `.Eventually(func() bool { cu.Backend.Commit() _, err2 := cu.BHSContract.GetBlockhash(&bind.CallOpts{ Pending: false, From: common.Address{}, BlockNumber: nil, Context: nil, }, requestBlock) if err2 == nil { return true } else if strings.Contains(err2.Error(), "execution reverted") { return false } t.Fatal(err2) return false }, testutils.WaitTimeout(t), time.Second)` $DIR/core/services/vrf/v1/integration_test.go: `.Backend.Commit()` $DIR/core/services/vrf/v1/integration_test.go: `.BHSContract.GetBlockhash(&bind.CallOpts{ Pending: false, From: common.Address{}, BlockNumber: nil, Context: nil, }, requestBlock)` $DIR/core/services/vrf/v1/integration_test.go: `.Contains(err2.Error(), "execution reverted")` $DIR/core/services/vrf/v1/integration_test.go: `.WaitTimeout(t)` $DIR/core/services/vrf/v1/integration_test.go: `.Should(gomega.BeTrue())` $DIR/core/services/vrf/v1/integration_test.go: `.BeTrue()` $DIR/core/services/vrf/v1/integration_test.go: `.Backend.Commit()` $DIR/core/services/vrf/v1/integration_test.go: `.NewWithT(t)` $DIR/core/services/vrf/v1/integration_test.go: `.Eventually(func() bool { runs, err = app.PipelineORM().GetAllRuns(ctx) require.NoError(t, err) cu.Backend.Commit() return len(runs) == 1 && runs[0].State == pipeline.RunStatusCompleted }, 10*time.Second, 1*time.Second)` $DIR/core/services/vrf/v1/integration_test.go: `.PipelineORM()` $DIR/core/services/vrf/v1/integration_test.go: `.GetAllRuns(ctx)` $DIR/core/services/vrf/v1/integration_test.go: `.Backend.Commit()` $DIR/core/services/vrf/v1/integration_test.go: `.Should(gomega.BeTrue())` $DIR/core/services/vrf/v1/integration_test.go: `.BeTrue()` $DIR/core/services/vrf/v1/integration_test.go: `.NewWithT(t)` $DIR/core/services/vrf/v1/integration_test.go: `.Eventually(func() bool { orm := txmgr.NewTxStore(app.GetDB(), app.GetLogger()) uc, err2 := orm.CountUnconfirmedTransactions(ctx, key.Address, testutils.SimulatedChainID) require.NoError(t, err2) return uc == 0 }, 5*time.Second, 100*time.Millisecond)` $DIR/core/services/vrf/v1/integration_test.go: `.NewTxStore(app.GetDB(), app.GetLogger())` $DIR/core/services/vrf/v1/integration_test.go: `.GetDB()` $DIR/core/services/vrf/v1/integration_test.go: `.GetLogger()` $DIR/core/services/vrf/v1/integration_test.go: `.CountUnconfirmedTransactions(ctx, key.Address, testutils.SimulatedChainID)` $DIR/core/services/vrf/v1/integration_test.go: `.Should(gomega.BeTrue())` $DIR/core/services/vrf/v1/integration_test.go: `.BeTrue()` $DIR/core/services/vrf/v1/integration_test.go: `.NewWithT(t)` $DIR/core/services/vrf/v1/integration_test.go: `.Eventually(func() bool { rfIterator, err := cu.RootContract.FilterRandomnessRequestFulfilled(nil) require.NoError(t, err, "failed to subscribe to RandomnessRequest logs") var rf []*solidity_vrf_coordinator_interface.VRFCoordinatorRandomnessRequestFulfilled for rfIterator.Next() { rf = append(rf, rfIterator.Event) } return len(rf) == 1 }, 5*time.Second, 500*time.Millisecond)` $DIR/core/services/vrf/v1/integration_test.go: `.RootContract.FilterRandomnessRequestFulfilled(nil)` $DIR/core/services/vrf/v1/integration_test.go: `.Next()` $DIR/core/services/vrf/v1/integration_test.go: `.BeTrue()` $DIR/core/services/vrf/v1/listener_v1_test.go: `lsn.Reqs = []request{ { confirmedAtBlock: 2, req: &solidity_vrf_coordinator_interface.VRFCoordinatorRandomnessRequest{ RequestID: utils.PadByteToHash(0x02), }, }, { confirmedAtBlock: 1, req: &solidity_vrf_coordinator_interface.VRFCoordinatorRandomnessRequest{ RequestID: utils.PadByteToHash(0x01), }, }, { confirmedAtBlock: 3, req: &solidity_vrf_coordinator_interface.VRFCoordinatorRandomnessRequest{ RequestID: utils.PadByteToHash(0x03), }, }, }` $DIR/core/services/vrf/v1/listener_v1_test.go: `lsn.LatestHead = 0` $DIR/core/services/vrf/v1/listener_v1_test.go: `lsn.LatestHead = 2` $DIR/core/services/vrf/v1/listener_v1_test.go: `logs = lsn.extractConfirmedLogs()` $DIR/core/services/vrf/v1/listener_v1_test.go: `lsn.LatestHead = 10` $DIR/core/services/vrf/v1/listener_v1_test.go: `logs = lsn.extractConfirmedLogs()` $DIR/core/services/vrf/v1/listener_v1_test.go: `lsn.LatestHead = 10000` $DIR/core/services/vrf/v1/listener_v1_test.go: `lsn.ResponseCount = map[[32]byte]uint64{ utils.PadByteToHash(0x00): 1, utils.PadByteToHash(0x01): 1, }` $DIR/core/services/vrf/v1/listener_v1_test.go: `lsn.BlockNumberToReqID = pairing.New()` $DIR/core/services/vrf/v1/listener_v1_test.go: `lsn.BlockNumberToReqID.Insert(fulfilledReq{ blockNumber: 1, reqID: utils.PadByteToHash(0x00), })` $DIR/core/services/vrf/v1/listener_v1_test.go: `lsn.BlockNumberToReqID.Insert(fulfilledReq{ blockNumber: 2, reqID: utils.PadByteToHash(0x01), })` $DIR/core/services/vrf/v1/listener_v1_test.go: `lsn.pruneConfirmedRequestCounts()` $DIR/core/services/vrf/v1/listener_v1_test.go: `lsn.LatestHead = 10001` $DIR/core/services/vrf/v1/listener_v1_test.go: `lsn.pruneConfirmedRequestCounts()` $DIR/core/services/vrf/v1/listener_v1_test.go: `lsn.LatestHead = 10002` $DIR/core/services/vrf/v1/listener_v1_test.go: `lsn.pruneConfirmedRequestCounts()` $DIR/core/services/vrf/v1/listener_v1_test.go: `.PadByteToHash(0x02)` $DIR/core/services/vrf/v1/listener_v1_test.go: `.PadByteToHash(0x01)` $DIR/core/services/vrf/v1/listener_v1_test.go: `.PadByteToHash(0x03)` $DIR/core/services/vrf/v1/listener_v1_test.go: `.extractConfirmedLogs()` $DIR/core/services/vrf/v1/listener_v1_test.go: `.extractConfirmedLogs()` $DIR/core/services/vrf/v1/listener_v1_test.go: `.extractConfirmedLogs()` $DIR/core/services/vrf/v1/listener_v1_test.go: `.PadByteToHash(0x00)` $DIR/core/services/vrf/v1/listener_v1_test.go: `.PadByteToHash(0x01)` $DIR/core/services/vrf/v1/listener_v1_test.go: `.New()` $DIR/core/services/vrf/v1/listener_v1_test.go: `.BlockNumberToReqID.Insert(fulfilledReq{ blockNumber: 1, reqID: utils.PadByteToHash(0x00), })` $DIR/core/services/vrf/v1/listener_v1_test.go: `.PadByteToHash(0x00)` $DIR/core/services/vrf/v1/listener_v1_test.go: `.BlockNumberToReqID.Insert(fulfilledReq{ blockNumber: 2, reqID: utils.PadByteToHash(0x01), })` $DIR/core/services/vrf/v1/listener_v1_test.go: `.PadByteToHash(0x01)` $DIR/core/services/vrf/v1/listener_v1_test.go: `.pruneConfirmedRequestCounts()` $DIR/core/services/vrf/v1/listener_v1_test.go: `.pruneConfirmedRequestCounts()` $DIR/core/services/vrf/v1/listener_v1_test.go: `.pruneConfirmedRequestCounts()` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `sendEth(t, ownerKey, uni.backend, vrfKey.Address, 10)` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `bhsKeyAddresses = append(bhsKeyAddresses, bhsKey.Address.String())` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `keys = append(keys, bhsKey)` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `keySpecificOverrides = append(keySpecificOverrides, toml.KeySpecific{ Key: ptr[types.EIP55Address](bhsKey.EIP55Address), GasEstimator: toml.KeySpecificGasEstimator{PriceMax: gasLanePriceWei}, })` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `sendEth(t, ownerKey, uni.backend, bhsKey.Address, 10)` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `keySpecificOverrides = append(keySpecificOverrides, toml.KeySpecific{ // Gas lane. Key: ptr[types.EIP55Address](vrfKey.EIP55Address), GasEstimator: toml.KeySpecificGasEstimator{PriceMax: gasLanePriceWei}, })` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `keys = append(keys, ownerKey, vrfKey)` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `simulatedOverrides(t, gasLanePriceWei, keySpecificOverrides...)(c, s)` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `c.EVM[0].MinIncomingConfirmations = ptr[uint32](2)` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `c.Feature.LogPoller = ptr(true)` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `c.EVM[0].FinalityDepth = ptr[uint32](2)` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `c.EVM[0].GasEstimator.LimitDefault = ptr(uint64(gasLimit))` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `c.EVM[0].LogPollInterval = commonconfig.MustNewDuration(time.Second)` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `_ = vrftesthelpers.CreateAndStartBHSJob( t, bhsKeyAddresses, app, uni.bhsContractAddress.String(), "", uni.rootContractAddress.String(), "", "", 0, 200, heartbeatPeriod, 100)` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `time.Sleep(diff)` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `verifyBlockhashStored(t, uni.coordinatorV2UniverseCommon, blockNumberStored)` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `.GWei(1)` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `.Address.String()` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { simulatedOverrides(t, gasLanePriceWei, keySpecificOverrides...)(c, s) c.EVM[0].MinIncomingConfirmations = ptr[uint32](2) c.Feature.LogPoller = ptr(true) c.EVM[0].FinalityDepth = ptr[uint32](2) c.EVM[0].GasEstimator.LimitDefault = ptr(uint64(gasLimit)) c.EVM[0].LogPollInterval = commonconfig.MustNewDuration(time.Second) })` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `.MustNewDuration(time.Second)` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, uni.backend, keys...)` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `.CreateAndStartBHSJob( t, bhsKeyAddresses, app, uni.bhsContractAddress.String(), "", uni.rootContractAddress.String(), "", "", 0, 200, heartbeatPeriod, 100)` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `.bhsContractAddress.String()` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `.rootContractAddress.String()` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `.Sleep(diff)` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `.backend.HeaderByNumber(testutils.Context(t), nil)` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `.Context(t)` $DIR/core/services/vrf/v2/bhs_feeder_test.go: `.Number.Uint64()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `t.Run("link payment", func(tt *testing.T) { testSingleConsumerHappyPathBatchFulfillment( t, ownerKey, uni.coordinatorV2UniverseCommon, uni.vrfConsumers[0], uni.consumerContracts[0], uni.consumerContractAddresses[0], uni.rootContract, uni.rootContractAddress, uni.batchCoordinatorContractAddress, nil, 5, // number of requests to send false, // don't send big callback vrfcommon.V2Plus, false, func(t *testing.T, coordinator v22.CoordinatorV2_X, rwfe v22.RandomWordsFulfilled, expectedSubID *big.Int) { _, err := coordinator.GetSubscription(nil, rwfe.SubID()) require.NoError(t, err) require.Equal(t, expectedSubID, rwfe.SubID()) }, ) })` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `testSingleConsumerHappyPathBatchFulfillment( t, ownerKey, uni.coordinatorV2UniverseCommon, uni.vrfConsumers[0], uni.consumerContracts[0], uni.consumerContractAddresses[0], uni.rootContract, uni.rootContractAddress, uni.batchCoordinatorContractAddress, nil, 5, // number of requests to send false, // don't send big callback vrfcommon.V2Plus, false, func(t *testing.T, coordinator v22.CoordinatorV2_X, rwfe v22.RandomWordsFulfilled, expectedSubID *big.Int) { _, err := coordinator.GetSubscription(nil, rwfe.SubID()) require.NoError(t, err) require.Equal(t, expectedSubID, rwfe.SubID()) }, )` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `testSingleConsumerHappyPathBatchFulfillment( t, ownerKey, uni.coordinatorV2UniverseCommon, uni.vrfConsumers[0], uni.consumerContracts[0], uni.consumerContractAddresses[0], uni.rootContract, uni.rootContractAddress, uni.batchCoordinatorContractAddress, nil, 5, // number of requests to send false, // don't send big callback vrfcommon.V2Plus, true, func(t *testing.T, coordinator v22.CoordinatorV2_X, rwfe v22.RandomWordsFulfilled, expectedSubID *big.Int) { _, err := coordinator.GetSubscription(nil, rwfe.SubID()) require.NoError(t, err) require.Equal(t, expectedSubID, rwfe.SubID()) }, )` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `t.Run("link payment", func(tt *testing.T) { testSingleConsumerHappyPathBatchFulfillment( t, ownerKey, uni.coordinatorV2UniverseCommon, uni.vrfConsumers[0], uni.consumerContracts[0], uni.consumerContractAddresses[0], uni.rootContract, uni.rootContractAddress, uni.batchCoordinatorContractAddress, nil, 5, // number of requests to send true, // send big callback vrfcommon.V2Plus, false, func(t *testing.T, coordinator v22.CoordinatorV2_X, rwfe v22.RandomWordsFulfilled, expectedSubID *big.Int) { _, err := coordinator.GetSubscription(nil, rwfe.SubID()) require.NoError(t, err) require.Equal(t, expectedSubID, rwfe.SubID()) }, ) })` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `testSingleConsumerHappyPathBatchFulfillment( t, ownerKey, uni.coordinatorV2UniverseCommon, uni.vrfConsumers[0], uni.consumerContracts[0], uni.consumerContractAddresses[0], uni.rootContract, uni.rootContractAddress, uni.batchCoordinatorContractAddress, nil, 5, // number of requests to send true, // send big callback vrfcommon.V2Plus, false, func(t *testing.T, coordinator v22.CoordinatorV2_X, rwfe v22.RandomWordsFulfilled, expectedSubID *big.Int) { _, err := coordinator.GetSubscription(nil, rwfe.SubID()) require.NoError(t, err) require.Equal(t, expectedSubID, rwfe.SubID()) }, )` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `testSingleConsumerHappyPathBatchFulfillment( t, ownerKey, uni.coordinatorV2UniverseCommon, uni.vrfConsumers[0], uni.consumerContracts[0], uni.consumerContractAddresses[0], uni.rootContract, uni.rootContractAddress, uni.batchCoordinatorContractAddress, nil, 5, // number of requests to send true, // send big callback vrfcommon.V2Plus, true, func(t *testing.T, coordinator v22.CoordinatorV2_X, rwfe v22.RandomWordsFulfilled, expectedSubID *big.Int) { _, err := coordinator.GetSubscription(nil, rwfe.SubID()) require.NoError(t, err) require.Equal(t, expectedSubID, rwfe.SubID()) }, )` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `t.Run("link payment", func(tt *testing.T) { testSingleConsumerHappyPath( t, ownerKey, uni.coordinatorV2UniverseCommon, uni.vrfConsumers[0], uni.consumerContracts[0], uni.consumerContractAddresses[0], uni.rootContract, uni.rootContractAddress, uni.batchCoordinatorContractAddress, nil, vrfcommon.V2Plus, false, func(t *testing.T, coordinator v22.CoordinatorV2_X, rwfe v22.RandomWordsFulfilled, expectedSubID *big.Int) { _, err := coordinator.GetSubscription(nil, rwfe.SubID()) require.NoError(t, err) require.Equal(t, expectedSubID, rwfe.SubID()) }) })` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `testSingleConsumerHappyPath( t, ownerKey, uni.coordinatorV2UniverseCommon, uni.vrfConsumers[0], uni.consumerContracts[0], uni.consumerContractAddresses[0], uni.rootContract, uni.rootContractAddress, uni.batchCoordinatorContractAddress, nil, vrfcommon.V2Plus, false, func(t *testing.T, coordinator v22.CoordinatorV2_X, rwfe v22.RandomWordsFulfilled, expectedSubID *big.Int) { _, err := coordinator.GetSubscription(nil, rwfe.SubID()) require.NoError(t, err) require.Equal(t, expectedSubID, rwfe.SubID()) })` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `testSingleConsumerHappyPath( t, ownerKey, uni.coordinatorV2UniverseCommon, uni.vrfConsumers[0], uni.consumerContracts[0], uni.consumerContractAddresses[0], uni.rootContract, uni.rootContractAddress, uni.batchCoordinatorContractAddress, nil, vrfcommon.V2Plus, true, func(t *testing.T, coordinator v22.CoordinatorV2_X, rwfe v22.RandomWordsFulfilled, expectedSubID *big.Int) { _, err := coordinator.GetSubscription(nil, rwfe.SubID()) require.NoError(t, err) require.Equal(t, expectedSubID, rwfe.SubID()) })` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `t.Run("link payment", func(tt *testing.T) { testMultipleConsumersNeedBHS( t, ownerKey, uni.coordinatorV2UniverseCommon, uni.vrfConsumers, uni.consumerContracts, uni.consumerContractAddresses, uni.rootContract, uni.rootContractAddress, uni.batchCoordinatorContractAddress, nil, vrfcommon.V2Plus, false, ) })` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `testMultipleConsumersNeedBHS( t, ownerKey, uni.coordinatorV2UniverseCommon, uni.vrfConsumers, uni.consumerContracts, uni.consumerContractAddresses, uni.rootContract, uni.rootContractAddress, uni.batchCoordinatorContractAddress, nil, vrfcommon.V2Plus, false, )` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `testMultipleConsumersNeedBHS( t, ownerKey, uni.coordinatorV2UniverseCommon, uni.vrfConsumers, uni.consumerContracts, uni.consumerContractAddresses, uni.rootContract, uni.rootContractAddress, uni.batchCoordinatorContractAddress, nil, vrfcommon.V2Plus, true, )` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `t.Run("link payment", func(tt *testing.T) { testBlockHeaderFeeder( t, ownerKey, uni.coordinatorV2UniverseCommon, uni.vrfConsumers, uni.consumerContracts, uni.consumerContractAddresses, uni.rootContract, uni.rootContractAddress, uni.batchCoordinatorContractAddress, nil, vrfcommon.V2Plus, false, ) })` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `testBlockHeaderFeeder( t, ownerKey, uni.coordinatorV2UniverseCommon, uni.vrfConsumers, uni.consumerContracts, uni.consumerContractAddresses, uni.rootContract, uni.rootContractAddress, uni.batchCoordinatorContractAddress, nil, vrfcommon.V2Plus, false, )` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `testBlockHeaderFeeder( t, ownerKey, uni.coordinatorV2UniverseCommon, uni.vrfConsumers, uni.consumerContracts, uni.consumerContractAddresses, uni.rootContract, uni.rootContractAddress, uni.batchCoordinatorContractAddress, nil, vrfcommon.V2Plus, true, )` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `t.Run("link payment", func(tt *testing.T) { testSingleConsumerNeedsTopUp( t, ownerKey, uni.coordinatorV2UniverseCommon, uni.vrfConsumers[0], uni.consumerContracts[0], uni.consumerContractAddresses[0], uni.rootContract, uni.rootContractAddress, uni.batchCoordinatorContractAddress, nil, assets.Ether(1).ToInt(), // initial funding of 1 LINK assets.Ether(100).ToInt(), // top up of 100 LINK vrfcommon.V2Plus, false, ) })` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `testSingleConsumerNeedsTopUp( t, ownerKey, uni.coordinatorV2UniverseCommon, uni.vrfConsumers[0], uni.consumerContracts[0], uni.consumerContractAddresses[0], uni.rootContract, uni.rootContractAddress, uni.batchCoordinatorContractAddress, nil, assets.Ether(1).ToInt(), // initial funding of 1 LINK assets.Ether(100).ToInt(), // top up of 100 LINK vrfcommon.V2Plus, false, )` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `testSingleConsumerNeedsTopUp( t, ownerKey, uni.coordinatorV2UniverseCommon, uni.vrfConsumers[0], uni.consumerContracts[0], uni.consumerContractAddresses[0], uni.rootContract, uni.rootContractAddress, uni.batchCoordinatorContractAddress, nil, big.NewInt(1e17), // initial funding of 0.1 ETH assets.Ether(100).ToInt(), // top up of 100 ETH vrfcommon.V2Plus, true, )` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err = coordinator.SetConfig(owner, uint16(1), // minimumRequestConfirmations uint32(10000), // maxGasLimit 1, // stalenessSeconds 1, // gasAfterPaymentCalculation big.NewInt(10), // fallbackWeiPerUnitLink 0, // fulfillmentFlatFeeNativePPM 0, // fulfillmentFlatFeeLinkDiscountPPM 0, // nativePremiumPercentage 0, // linkPremiumPercentage )` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err = coordinator.SetLINKAndLINKNativeFeed(owner, linkAddress, linkEthFeed)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err = linkContract.Transfer(owner, consumerAddress, assets.Ether(2).ToInt())` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `AssertLinkBalances(t, linkContract, []common.Address{owner.From, consumerAddress}, []*big.Int{assets.Ether(999_999_998).ToInt(), assets.Ether(2).ToInt()})` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err = coordinator.CreateSubscription(owner)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err = linkContract.TransferAndCall(owner, coordinatorAddress, big.NewInt(0), b)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err = coordinator.AddConsumer(owner, subID, consumerAddress)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err = consumer.RequestRandomWords(random, subID, 1, 1, 1, [32]byte{}, false)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err = consumer.RequestRandomWords(owner, subID, 1, 1, 1, [32]byte{}, false)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err = consumer.TransferOwnership(owner, random.From)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err = consumer.AcceptOwnership(random)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err = consumer.RequestRandomWords(owner, subID, 1, 1, 1, [32]byte{}, false)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err = consumer.RequestRandomWords(random, subID, 1, 1, 1, [32]byte{}, false)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err = coordinator.SetLINKAndLINKNativeFeed(owner, linkAddress, linkEthFeed)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err = linkContract.Transfer(owner, consumerAddress, assets.Ether(2).ToInt())` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `AssertLinkBalances(t, linkContract, []common.Address{owner.From, consumerAddress}, []*big.Int{assets.Ether(999_999_998).ToInt(), assets.Ether(2).ToInt()})` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err = consumer.TopUpSubscription(owner, assets.Ether(1).ToInt())` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `AssertLinkBalances(t, linkContract, []common.Address{owner.From, consumerAddress, coordinatorAddress}, []*big.Int{assets.Ether(999_999_998).ToInt(), assets.Ether(1).ToInt(), assets.Ether(1).ToInt()})` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err = consumer.Withdraw(random, assets.Ether(1).ToInt(), owner.From)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err = consumer.Withdraw(owner, assets.Ether(1).ToInt(), owner.From)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `AssertLinkBalances(t, linkContract, []common.Address{owner.From, consumerAddress, coordinatorAddress}, []*big.Int{assets.Ether(999_999_999).ToInt(), assets.Ether(0).ToInt(), assets.Ether(1).ToInt()})` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err = consumer.Unsubscribe(owner, owner.From)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `registerProvingKeyHelper(t, uni.coordinatorV2UniverseCommon, uni.rootContract, vrfkey, &defaultMaxGasPrice)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `t.Run("non-proxied consumer", func(tt *testing.T) { carol := uni.vrfConsumers[0] carolContract := uni.consumerContracts[0] carolContractAddress := uni.consumerContractAddresses[0] _, err = carolContract.CreateSubscriptionAndFund(carol, big.NewInt(1000000000000000000)) // 0.1 LINK require.NoError(tt, err) uni.backend.Commit() _, err = carolContract.TopUpSubscriptionNative(carol, big.NewInt(2000000000000000000)) // 0.2 ETH uni.backend.Commit() // Ensure even with large number of consumers its still cheap var addrs []common.Address for i := 0; i < 99; i++ { addrs = append(addrs, testutils.NewAddress()) } _, err = carolContract.UpdateSubscription(carol, addrs) require.NoError(tt, err) linkEstimate := estimateGas(tt, uni.backend, common.Address{}, carolContractAddress, uni.consumerABI, "requestRandomWords", uint32(10000), uint16(2), uint32(1), vrfkey.PublicKey.MustHash(), false) tt.Log("gas estimate of non-proxied requestRandomWords with LINK payment:", linkEstimate) nativeEstimate := estimateGas(tt, uni.backend, common.Address{}, carolContractAddress, uni.consumerABI, "requestRandomWords", uint32(10000), uint16(2), uint32(1), vrfkey.PublicKey.MustHash(), false) tt.Log("gas estimate of non-proxied requestRandomWords with Native payment:", nativeEstimate) assert.Less(tt, nativeEstimate, uint64(127_000), "requestRandomWords tx gas cost more than expected") })` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err = carolContract.CreateSubscriptionAndFund(carol, big.NewInt(1000000000000000000))` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err = carolContract.TopUpSubscriptionNative(carol, big.NewInt(2000000000000000000))` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `addrs = append(addrs, testutils.NewAddress())` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err = carolContract.UpdateSubscription(carol, addrs)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err = uni.rootContract.GetSubscription(nil, subId)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `addrs = append(addrs, testutils.NewAddress())` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err = carolContract.UpdateSubscription(carol, addrs)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `estimate = estimateGas(t, uni.backend, carolContractAddress, uni.rootContractAddress, uni.coordinatorABI, "addConsumer", subId, testutils.NewAddress())` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `registerProvingKeyHelper(t, uni.coordinatorV2UniverseCommon, uni.rootContract, vrfkey, &defaultMaxGasPrice)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `t.Run("non-proxied consumer", func(tt *testing.T) { carol := uni.vrfConsumers[0] carolContract := uni.consumerContracts[0] carolContractAddress := uni.consumerContractAddresses[0] _, err = carolContract.CreateSubscriptionAndFund(carol, big.NewInt(1000000000000000000)) // 0.1 LINK require.NoError(tt, err) uni.backend.Commit() subID, err2 := carolContract.SSubId(nil) require.NoError(tt, err2) _, err2 = carolContract.TopUpSubscriptionNative(carol, big.NewInt(2000000000000000000)) // 0.2 ETH require.NoError(tt, err2) gasRequested := 50_000 nw := 1 requestedIncomingConfs := 3 t.Run("native payment", func(tt *testing.T) { requestAndEstimateFulfillmentCost( t, subID, carol, vrfkey, uint16(requestedIncomingConfs), uint32(gasRequested), uint32(nw), carolContract, carolContractAddress, uni.coordinatorV2UniverseCommon, app, true, 120_000, 500_000, ) }) t.Run("link payment", func(tt *testing.T) { requestAndEstimateFulfillmentCost( t, subID, carol, vrfkey, uint16(requestedIncomingConfs), uint32(gasRequested), uint32(nw), carolContract, carolContractAddress, uni.coordinatorV2UniverseCommon, app, false, 120_000, 500_000, ) }) })` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err = carolContract.CreateSubscriptionAndFund(carol, big.NewInt(1000000000000000000))` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err2 = carolContract.TopUpSubscriptionNative(carol, big.NewInt(2000000000000000000))` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `t.Run("native payment", func(tt *testing.T) { requestAndEstimateFulfillmentCost( t, subID, carol, vrfkey, uint16(requestedIncomingConfs), uint32(gasRequested), uint32(nw), carolContract, carolContractAddress, uni.coordinatorV2UniverseCommon, app, true, 120_000, 500_000, ) })` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `requestAndEstimateFulfillmentCost( t, subID, carol, vrfkey, uint16(requestedIncomingConfs), uint32(gasRequested), uint32(nw), carolContract, carolContractAddress, uni.coordinatorV2UniverseCommon, app, true, 120_000, 500_000, )` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `t.Run("link payment", func(tt *testing.T) { requestAndEstimateFulfillmentCost( t, subID, carol, vrfkey, uint16(requestedIncomingConfs), uint32(gasRequested), uint32(nw), carolContract, carolContractAddress, uni.coordinatorV2UniverseCommon, app, false, 120_000, 500_000, ) })` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `requestAndEstimateFulfillmentCost( t, subID, carol, vrfkey, uint16(requestedIncomingConfs), uint32(gasRequested), uint32(nw), carolContract, carolContractAddress, uni.coordinatorV2UniverseCommon, app, false, 120_000, 500_000, )` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `requestAndEstimateFulfillmentCost( t, subID, consumerOwner, vrfkey, uint16(requestedIncomingConfs), uint32(gasRequested), uint32(nw), consumerContract, consumerContractAddress, uni.coordinatorV2UniverseCommon, app, false, 120_000, 500_000, )` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `simulatedOverrides(t, assets.GWei(10), toml.KeySpecific{ // Gas lane. Key: ptr(key1.EIP55Address), GasEstimator: toml.KeySpecificGasEstimator{PriceMax: gasLanePriceWei}, })(c, s)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `c.EVM[0].GasEstimator.LimitDefault = ptr[uint64](5_000_000)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `c.EVM[0].MinIncomingConfirmations = ptr[uint32](2)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `c.Feature.LogPoller = ptr(true)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `c.EVM[0].LogPollInterval = commonconfig.MustNewDuration(1 * time.Second)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `sendEth(t, ownerKey, uni.backend, key1.Address, 10)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `gomega.NewGomegaWithT(t).Eventually(func() bool { uni.backend.Commit() runs, err := app.PipelineORM().GetAllRuns(ctx) require.NoError(t, err) t.Log("runs", len(runs)) return len(runs) == 1 }, testutils.WaitTimeout(t), time.Second).Should(gomega.BeTrue())` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `mine(t, requestID, subID, uni.backend, db, vrfcommon.V2Plus, testutils.SimulatedChainID)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `assertRandomWordsFulfilled(t, requestID, true, uni.rootContract, false)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `assertNumRandomWords(t, consumerContract, numWords)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err = uni.rootContract.Migrate(consumer, subID, uni.migrationTestCoordinatorAddress)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err = uni.rootContract.CancelSubscription(uni.neil, subID, consumer.From)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `_, err = uni.rootContract.CancelSubscription(consumer, subID, uni.neil.From)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `AssertLinkBalance(t, uni.linkContract, uni.neil.From, linkBalanceBeforeCancel.Add(linkBalanceBeforeCancel, linkAmount))` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Run("link payment", func(tt *testing.T) { testSingleConsumerHappyPathBatchFulfillment( t, ownerKey, uni.coordinatorV2UniverseCommon, uni.vrfConsumers[0], uni.consumerContracts[0], uni.consumerContractAddresses[0], uni.rootContract, uni.rootContractAddress, uni.batchCoordinatorContractAddress, nil, 5, // number of requests to send false, // don't send big callback vrfcommon.V2Plus, false, func(t *testing.T, coordinator v22.CoordinatorV2_X, rwfe v22.RandomWordsFulfilled, expectedSubID *big.Int) { _, err := coordinator.GetSubscription(nil, rwfe.SubID()) require.NoError(t, err) require.Equal(t, expectedSubID, rwfe.SubID()) }, ) })` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.GetSubscription(nil, rwfe.SubID())` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.SubID()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.GetSubscription(nil, rwfe.SubID())` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.SubID()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Run("link payment", func(tt *testing.T) { testSingleConsumerHappyPathBatchFulfillment( t, ownerKey, uni.coordinatorV2UniverseCommon, uni.vrfConsumers[0], uni.consumerContracts[0], uni.consumerContractAddresses[0], uni.rootContract, uni.rootContractAddress, uni.batchCoordinatorContractAddress, nil, 5, // number of requests to send true, // send big callback vrfcommon.V2Plus, false, func(t *testing.T, coordinator v22.CoordinatorV2_X, rwfe v22.RandomWordsFulfilled, expectedSubID *big.Int) { _, err := coordinator.GetSubscription(nil, rwfe.SubID()) require.NoError(t, err) require.Equal(t, expectedSubID, rwfe.SubID()) }, ) })` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.GetSubscription(nil, rwfe.SubID())` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.SubID()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.GetSubscription(nil, rwfe.SubID())` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.SubID()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Run("link payment", func(tt *testing.T) { testSingleConsumerHappyPath( t, ownerKey, uni.coordinatorV2UniverseCommon, uni.vrfConsumers[0], uni.consumerContracts[0], uni.consumerContractAddresses[0], uni.rootContract, uni.rootContractAddress, uni.batchCoordinatorContractAddress, nil, vrfcommon.V2Plus, false, func(t *testing.T, coordinator v22.CoordinatorV2_X, rwfe v22.RandomWordsFulfilled, expectedSubID *big.Int) { _, err := coordinator.GetSubscription(nil, rwfe.SubID()) require.NoError(t, err) require.Equal(t, expectedSubID, rwfe.SubID()) }) })` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.GetSubscription(nil, rwfe.SubID())` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.SubID()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.GetSubscription(nil, rwfe.SubID())` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.SubID()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Run("link payment", func(tt *testing.T) { testMultipleConsumersNeedBHS( t, ownerKey, uni.coordinatorV2UniverseCommon, uni.vrfConsumers, uni.consumerContracts, uni.consumerContractAddresses, uni.rootContract, uni.rootContractAddress, uni.batchCoordinatorContractAddress, nil, vrfcommon.V2Plus, false, ) })` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Run("link payment", func(tt *testing.T) { testBlockHeaderFeeder( t, ownerKey, uni.coordinatorV2UniverseCommon, uni.vrfConsumers, uni.consumerContracts, uni.consumerContractAddresses, uni.rootContract, uni.rootContractAddress, uni.batchCoordinatorContractAddress, nil, vrfcommon.V2Plus, false, ) })` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Run("link payment", func(tt *testing.T) { testSingleConsumerNeedsTopUp( t, ownerKey, uni.coordinatorV2UniverseCommon, uni.vrfConsumers[0], uni.consumerContracts[0], uni.consumerContractAddresses[0], uni.rootContract, uni.rootContractAddress, uni.batchCoordinatorContractAddress, nil, assets.Ether(1).ToInt(), // initial funding of 1 LINK assets.Ether(100).ToInt(), // top up of 100 LINK vrfcommon.V2Plus, false, ) })` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Ether(1)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Ether(100)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.NewInt(1e17)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Ether(100)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Ether(10)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Ether(10)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil))` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.DeployLinkToken( owner, backend)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.DeployMockV3AggregatorContract( owner, backend, 18, vrftesthelpers.WeiPerUnitLink.BigInt())` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.WeiPerUnitLink.BigInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.DeployVRFCoordinatorV25( owner, backend, common.Address{})` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.SetConfig(owner, uint16(1), // minimumRequestConfirmations uint32(10000), // maxGasLimit 1, // stalenessSeconds 1, // gasAfterPaymentCalculation big.NewInt(10), // fallbackWeiPerUnitLink 0, // fulfillmentFlatFeeNativePPM 0, // fulfillmentFlatFeeLinkDiscountPPM 0, // nativePremiumPercentage 0, // linkPremiumPercentage )` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.NewInt(10)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.SetLINKAndLINKNativeFeed(owner, linkAddress, linkEthFeed)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.DeployVRFV2PlusExternalSubOwnerExample(owner, backend, coordinatorAddress, linkAddress)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Transfer(owner, consumerAddress, assets.Ether(2).ToInt())` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Ether(2)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Ether(999_999_998)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Ether(2)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.CreateSubscription(owner)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.FilterSubscriptionCreated(nil, nil)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.ABIEncode(`[{"type":"uint256"}]`, subID)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.TransferAndCall(owner, coordinatorAddress, big.NewInt(0), b)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.NewInt(0)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.AddConsumer(owner, subID, consumerAddress)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.RequestRandomWords(random, subID, 1, 1, 1, [32]byte{}, false)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.RequestRandomWords(owner, subID, 1, 1, 1, [32]byte{}, false)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.TransferOwnership(owner, random.From)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.AcceptOwnership(random)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.RequestRandomWords(owner, subID, 1, 1, 1, [32]byte{}, false)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.RequestRandomWords(random, subID, 1, 1, 1, [32]byte{}, false)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Ether(10)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil))` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.DeployLinkToken( owner, backend)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.DeployMockV3AggregatorContract( owner, backend, 18, vrftesthelpers.WeiPerUnitLink.BigInt())` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.WeiPerUnitLink.BigInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.DeployVRFCoordinatorV25( owner, backend, common.Address{})` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.SetLINKAndLINKNativeFeed(owner, linkAddress, linkEthFeed)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.DeployVRFV2PlusSingleConsumerExample(owner, backend, coordinatorAddress, linkAddress, 1, 1, 1, [32]byte{}, false)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Transfer(owner, consumerAddress, assets.Ether(2).ToInt())` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Ether(2)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Ether(999_999_998)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Ether(2)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.TopUpSubscription(owner, assets.Ether(1).ToInt())` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Ether(1)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Ether(999_999_998)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Ether(1)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Ether(1)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Withdraw(random, assets.Ether(1).ToInt(), owner.From)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Ether(1)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Withdraw(owner, assets.Ether(1).ToInt(), owner.From)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Ether(1)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Ether(999_999_999)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Ether(0)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Ether(1)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Unsubscribe(owner, owner.From)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Ether(1_000_000_000)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Ether(0)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Ether(0)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Context(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.NewGeneralConfigSimulated(t, nil)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, cfg, uni.backend, key)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.GetKeyStore()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.VRF()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Create(ctx)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Run("non-proxied consumer", func(tt *testing.T) { carol := uni.vrfConsumers[0] carolContract := uni.consumerContracts[0] carolContractAddress := uni.consumerContractAddresses[0] _, err = carolContract.CreateSubscriptionAndFund(carol, big.NewInt(1000000000000000000)) // 0.1 LINK require.NoError(tt, err) uni.backend.Commit() _, err = carolContract.TopUpSubscriptionNative(carol, big.NewInt(2000000000000000000)) // 0.2 ETH uni.backend.Commit() // Ensure even with large number of consumers its still cheap var addrs []common.Address for i := 0; i < 99; i++ { addrs = append(addrs, testutils.NewAddress()) } _, err = carolContract.UpdateSubscription(carol, addrs) require.NoError(tt, err) linkEstimate := estimateGas(tt, uni.backend, common.Address{}, carolContractAddress, uni.consumerABI, "requestRandomWords", uint32(10000), uint16(2), uint32(1), vrfkey.PublicKey.MustHash(), false) tt.Log("gas estimate of non-proxied requestRandomWords with LINK payment:", linkEstimate) nativeEstimate := estimateGas(tt, uni.backend, common.Address{}, carolContractAddress, uni.consumerABI, "requestRandomWords", uint32(10000), uint16(2), uint32(1), vrfkey.PublicKey.MustHash(), false) tt.Log("gas estimate of non-proxied requestRandomWords with Native payment:", nativeEstimate) assert.Less(tt, nativeEstimate, uint64(127_000), "requestRandomWords tx gas cost more than expected") })` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.CreateSubscriptionAndFund(carol, big.NewInt(1000000000000000000))` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.NewInt(1000000000000000000)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.TopUpSubscriptionNative(carol, big.NewInt(2000000000000000000))` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.NewInt(2000000000000000000)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.NewAddress()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.UpdateSubscription(carol, addrs)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.PublicKey.MustHash()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.PublicKey.MustHash()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.CreateSubscriptionAndFund(consumerOwner, assets.Ether(5).ToInt())` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Ether(5)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.backend.TransactionReceipt(testutils.Context(t), tx.Hash())` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Context(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Hash()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.SSubId(nil)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.rootContract.GetSubscription(nil, subId)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustGetABI(vrf_consumer_v2_plus_upgradeable_example.VRFConsumerV2PlusUpgradeableExampleMetaData.ABI)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.PublicKey.MustHash()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.NewGeneralConfigSimulated(t, nil)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, cfg, uni.backend, key)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.CreateSubscriptionAndFund(carol, big.NewInt(1000000000000000000))` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.NewInt(1000000000000000000)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.SSubId(nil)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.NewAddress()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.UpdateSubscription(carol, addrs)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.NewAddress()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Context(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.NewGeneralConfigSimulated(t, nil)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, cfg, uni.backend, key)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.GetKeyStore()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.VRF()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Create(ctx)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Run("non-proxied consumer", func(tt *testing.T) { carol := uni.vrfConsumers[0] carolContract := uni.consumerContracts[0] carolContractAddress := uni.consumerContractAddresses[0] _, err = carolContract.CreateSubscriptionAndFund(carol, big.NewInt(1000000000000000000)) // 0.1 LINK require.NoError(tt, err) uni.backend.Commit() subID, err2 := carolContract.SSubId(nil) require.NoError(tt, err2) _, err2 = carolContract.TopUpSubscriptionNative(carol, big.NewInt(2000000000000000000)) // 0.2 ETH require.NoError(tt, err2) gasRequested := 50_000 nw := 1 requestedIncomingConfs := 3 t.Run("native payment", func(tt *testing.T) { requestAndEstimateFulfillmentCost( t, subID, carol, vrfkey, uint16(requestedIncomingConfs), uint32(gasRequested), uint32(nw), carolContract, carolContractAddress, uni.coordinatorV2UniverseCommon, app, true, 120_000, 500_000, ) }) t.Run("link payment", func(tt *testing.T) { requestAndEstimateFulfillmentCost( t, subID, carol, vrfkey, uint16(requestedIncomingConfs), uint32(gasRequested), uint32(nw), carolContract, carolContractAddress, uni.coordinatorV2UniverseCommon, app, false, 120_000, 500_000, ) }) })` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.CreateSubscriptionAndFund(carol, big.NewInt(1000000000000000000))` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.NewInt(1000000000000000000)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.SSubId(nil)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.TopUpSubscriptionNative(carol, big.NewInt(2000000000000000000))` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.NewInt(2000000000000000000)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Run("native payment", func(tt *testing.T) { requestAndEstimateFulfillmentCost( t, subID, carol, vrfkey, uint16(requestedIncomingConfs), uint32(gasRequested), uint32(nw), carolContract, carolContractAddress, uni.coordinatorV2UniverseCommon, app, true, 120_000, 500_000, ) })` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Run("link payment", func(tt *testing.T) { requestAndEstimateFulfillmentCost( t, subID, carol, vrfkey, uint16(requestedIncomingConfs), uint32(gasRequested), uint32(nw), carolContract, carolContractAddress, uni.coordinatorV2UniverseCommon, app, false, 120_000, 500_000, ) })` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.CreateSubscriptionAndFund(consumerOwner, assets.Ether(5).ToInt())` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Ether(5)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.SSubId(nil)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Context(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.GWei(10)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { simulatedOverrides(t, assets.GWei(10), toml.KeySpecific{ // Gas lane. Key: ptr(key1.EIP55Address), GasEstimator: toml.KeySpecificGasEstimator{PriceMax: gasLanePriceWei}, })(c, s) c.EVM[0].GasEstimator.LimitDefault = ptr[uint64](5_000_000) c.EVM[0].MinIncomingConfirmations = ptr[uint32](2) c.Feature.LogPoller = ptr(true) c.EVM[0].LogPollInterval = commonconfig.MustNewDuration(1 * time.Second) })` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.GWei(10)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustNewDuration(1 * time.Second)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, uni.backend, ownerKey, key1)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.SetUint64(5e18)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.SetUint64(3e18)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.VRFSpec.PublicKey.MustHash()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.NewGomegaWithT(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Eventually(func() bool { uni.backend.Commit() runs, err := app.PipelineORM().GetAllRuns(ctx) require.NoError(t, err) t.Log("runs", len(runs)) return len(runs) == 1 }, testutils.WaitTimeout(t), time.Second)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.PipelineORM()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.GetAllRuns(ctx)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.WaitTimeout(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Should(gomega.BeTrue())` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.BeTrue()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.SRandomWords(nil, big.NewInt(0))` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.NewInt(0)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.rootContract.GetSubscription(nil, subID)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.rootContract.Migrate(consumer, subID, uni.migrationTestCoordinatorAddress)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.migrationTestCoordinator.GetSubscription(nil, subID)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.migrationTestCoordinator.STotalLinkBalance(nil)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.migrationTestCoordinator.STotalNativeBalance(nil)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.linkContract.BalanceOf(nil, uni.migrationTestCoordinatorAddress)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.backend.BalanceAt(ctx, uni.migrationTestCoordinatorAddress, nil)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Consumers()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.SetUint64(5e18)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.SetUint64(3e18)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.linkContract.BalanceOf(nil, uni.neil.From)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.backend.BalanceAt(testutils.Context(t), uni.neil.From, nil)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Context(t)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.rootContract.CancelSubscription(uni.neil, subID, consumer.From)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.rootContract.CancelSubscription(consumer, subID, uni.neil.From)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Add(linkBalanceBeforeCancel, linkAmount)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.Add(nativeBalanceBeforeCancel, nativeAmount)` $DIR/core/services/vrf/v2/integration_v2_plus_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `req = fulfillVRFReq(t, th, req, th.subs[0], false, nil)` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `waitForForceFulfillment(t, th, req, th.subs[0], true, 1)` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `reqs[i] = makeVRFReq(t, th, th.subs[0])` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `fulfilBatchVRFReq(t, th, reqs, th.subs[0])` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `success = true` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `waitForForceFulfillment(t, th, reqs[i], th.subs[0], success, 1)` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `req = fulfillVRFReq(t, th, req, th.subs[0], true, ptr(uint64(7)))` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `waitForForceFulfillment(t, th, req, th.subs[0], true, 2)` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `req = fulfillVRFReq(t, th, req, th.subs[0], true, nil)` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `waitForForceFulfillment(t, th, req, th.subs[0], true, 2)` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `allForceTxns = append(allForceTxns, revertedForceTxns...)` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `allForceTxns = append(allForceTxns, v2.TxnReceiptDB{RequestID: common.BigToHash(big.NewInt(2)).Hex(), ForceFulfillmentAttempt: 5})` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.BigToHash(big.NewInt(1))` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.NewInt(1)` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.Hex()` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.BigToHash(big.NewInt(1))` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.NewInt(1)` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.Hex()` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.BigToHash(big.NewInt(2))` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.NewInt(2)` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.Hex()` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.BigToHash(big.NewInt(2))` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.NewInt(2)` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.Hex()` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.BigToHash(big.NewInt(2))` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.NewInt(2)` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.Hex()` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.BigToHash(big.NewInt(2))` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.NewInt(2)` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.Hex()` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.UniqueByReqID(revertedForceTxns, allForceTxns)` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.BigToHash(big.NewInt(1))` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.NewInt(1)` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.Hex()` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.BigToHash(big.NewInt(1))` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.NewInt(1)` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.Hex()` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.BigToHash(big.NewInt(2))` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.NewInt(2)` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.Hex()` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.BigToHash(big.NewInt(2))` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.NewInt(2)` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.Hex()` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.BigToHash(big.NewInt(2))` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.NewInt(2)` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.Hex()` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.BigToHash(big.NewInt(2))` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.NewInt(2)` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.Hex()` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.BigToHash(big.NewInt(2))` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.NewInt(2)` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.Hex()` $DIR/core/services/vrf/v2/integration_v2_reverted_txns_test.go: `.UniqueByReqID(revertedForceTxns, allForceTxns)` $DIR/core/services/vrf/v2/integration_v2_test.go: `simulatedOverrides(t, assets.GWei(10), toml.KeySpecific{ // Gas lane. Key: ptr(key1.EIP55Address), GasEstimator: toml.KeySpecificGasEstimator{PriceMax: gasLanePriceWei}, })(c, s)` $DIR/core/services/vrf/v2/integration_v2_test.go: `c.EVM[0].GasEstimator.LimitDefault = ptr[uint64](3_500_000)` $DIR/core/services/vrf/v2/integration_v2_test.go: `c.EVM[0].MinIncomingConfirmations = ptr[uint32](2)` $DIR/core/services/vrf/v2/integration_v2_test.go: `sendEth(t, ownerKey, uni.backend, key1.Address, 10)` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = uni.linkContract.TransferAndCall(uni.sergey, uni.rootContractAddress, assets.Ether(100).ToInt(), b)` $DIR/core/services/vrf/v2/integration_v2_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = uni.linkContract.Transfer(uni.sergey, consumerAddress, assets.Ether(100).ToInt())` $DIR/core/services/vrf/v2/integration_v2_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `gomega.NewGomegaWithT(t).Eventually(func() bool { uni.backend.Commit() runs, err2 := app.PipelineORM().GetAllRuns(ctx) require.NoError(t, err2) t.Log("runs", len(runs)) return len(runs) == 1 }, testutils.WaitTimeout(t), time.Second).Should(gomega.BeTrue())` $DIR/core/services/vrf/v2/integration_v2_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `mine(t, requestID, new(big.Int).SetUint64(wrapperSubID), uni.backend, db, vrfcommon.V2, testutils.SimulatedChainID)` $DIR/core/services/vrf/v2/integration_v2_test.go: `assertRandomWordsFulfilled(t, requestID, true, uni.rootContract, false)` $DIR/core/services/vrf/v2/integration_v2_test.go: `simulatedOverrides(t, assets.GWei(10), toml.KeySpecific{ // Gas lane. Key: ptr(key1.EIP55Address), GasEstimator: toml.KeySpecificGasEstimator{PriceMax: gasLanePriceWei}, })(c, s)` $DIR/core/services/vrf/v2/integration_v2_test.go: `c.EVM[0].GasEstimator.LimitDefault = ptr[uint64](3_500_000)` $DIR/core/services/vrf/v2/integration_v2_test.go: `c.EVM[0].MinIncomingConfirmations = ptr[uint32](2)` $DIR/core/services/vrf/v2/integration_v2_test.go: `c.Feature.LogPoller = ptr(true)` $DIR/core/services/vrf/v2/integration_v2_test.go: `c.EVM[0].LogPollInterval = commonconfig.MustNewDuration(1 * time.Second)` $DIR/core/services/vrf/v2/integration_v2_test.go: `sendEth(t, ownerKey, uni.backend, key1.Address, 10)` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = uni.linkContract.TransferAndCall(uni.sergey, uni.rootContractAddress, assets.Ether(100).ToInt(), b)` $DIR/core/services/vrf/v2/integration_v2_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = uni.linkContract.Transfer(uni.sergey, consumerAddress, assets.Ether(100).ToInt())` $DIR/core/services/vrf/v2/integration_v2_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `gomega.NewGomegaWithT(t).Eventually(func() bool { uni.backend.Commit() runs, err2 := app.PipelineORM().GetAllRuns(ctx) require.NoError(t, err2) t.Log("runs", len(runs)) return len(runs) == 1 }, testutils.WaitTimeout(t), time.Second).Should(gomega.BeTrue())` $DIR/core/services/vrf/v2/integration_v2_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `mine(t, requestID, new(big.Int).SetUint64(wrapperSubID), uni.backend, db, vrfcommon.V2, testutils.SimulatedChainID)` $DIR/core/services/vrf/v2/integration_v2_test.go: `assertRandomWordsFulfilled(t, requestID, true, uni.rootContract, false)` $DIR/core/services/vrf/v2/integration_v2_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = coordinator.SetConfig(owner, uint16(1), uint32(10000), 1, 1, big.NewInt(10), vrf_coordinator_v2.VRFCoordinatorV2FeeConfig{ FulfillmentFlatFeeLinkPPMTier1: 0, FulfillmentFlatFeeLinkPPMTier2: 0, FulfillmentFlatFeeLinkPPMTier3: 0, FulfillmentFlatFeeLinkPPMTier4: 0, FulfillmentFlatFeeLinkPPMTier5: 0, ReqsForTier2: big.NewInt(0), ReqsForTier3: big.NewInt(0), ReqsForTier4: big.NewInt(0), ReqsForTier5: big.NewInt(0), })` $DIR/core/services/vrf/v2/integration_v2_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = linkContract.Transfer(owner, consumerAddress, assets.Ether(2).ToInt())` $DIR/core/services/vrf/v2/integration_v2_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `AssertLinkBalances(t, linkContract, []common.Address{owner.From, consumerAddress}, []*big.Int{assets.Ether(999_999_998).ToInt(), assets.Ether(2).ToInt()})` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = coordinator.CreateSubscription(owner)` $DIR/core/services/vrf/v2/integration_v2_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = linkContract.TransferAndCall(owner, coordinatorAddress, big.NewInt(0), b)` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = coordinator.AddConsumer(owner, 1, consumerAddress)` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = consumer.RequestRandomWords(random, 1, 1, 1, 1, [32]byte{})` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = consumer.RequestRandomWords(owner, 1, 1, 1, 1, [32]byte{})` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = consumer.TransferOwnership(owner, random.From)` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = consumer.RequestRandomWords(owner, 1, 1, 1, 1, [32]byte{})` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = consumer.RequestRandomWords(random, 1, 1, 1, 1, [32]byte{})` $DIR/core/services/vrf/v2/integration_v2_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = linkContract.Transfer(owner, consumerAddress, assets.Ether(2).ToInt())` $DIR/core/services/vrf/v2/integration_v2_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `AssertLinkBalances(t, linkContract, []common.Address{owner.From, consumerAddress}, []*big.Int{assets.Ether(999_999_998).ToInt(), assets.Ether(2).ToInt()})` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = consumer.TopUpSubscription(owner, assets.Ether(1).ToInt())` $DIR/core/services/vrf/v2/integration_v2_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `AssertLinkBalances(t, linkContract, []common.Address{owner.From, consumerAddress, coordinatorAddress}, []*big.Int{assets.Ether(999_999_998).ToInt(), assets.Ether(1).ToInt(), assets.Ether(1).ToInt()})` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = consumer.Withdraw(random, assets.Ether(1).ToInt(), owner.From)` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = consumer.Withdraw(owner, assets.Ether(1).ToInt(), owner.From)` $DIR/core/services/vrf/v2/integration_v2_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `AssertLinkBalances(t, linkContract, []common.Address{owner.From, consumerAddress, coordinatorAddress}, []*big.Int{assets.Ether(999_999_999).ToInt(), assets.Ether(0).ToInt(), assets.Ether(1).ToInt()})` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = consumer.Unsubscribe(owner, owner.From)` $DIR/core/services/vrf/v2/integration_v2_test.go: `backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `simulatedOverrides(t, gasPrice, toml.KeySpecific{ Key: &key.EIP55Address, GasEstimator: toml.KeySpecificGasEstimator{PriceMax: gasLanePriceWei}, })(c, s)` $DIR/core/services/vrf/v2/integration_v2_test.go: `c.EVM[0].MinIncomingConfirmations = ptr[uint32](2)` $DIR/core/services/vrf/v2/integration_v2_test.go: `chain, err = app.GetRelayers().LegacyEVMChains().Get(testutils.SimulatedChainID.String())` $DIR/core/services/vrf/v2/integration_v2_test.go: `AssertLinkBalances(t, uni.linkContract, []common.Address{ carolContractAddress, uni.rootContractAddress, }, []*big.Int{ assets.Ether(500).ToInt(), // 500 link big.NewInt(0), // 0 link })` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = carolContract.CreateSubscriptionAndFund(carol, subFunding.BigInt())` $DIR/core/services/vrf/v2/integration_v2_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `AssertLinkBalances(t, uni.linkContract, []common.Address{ carolContractAddress, uni.rootContractAddress, uni.nallory.From, // Oracle's own address should have nothing }, []*big.Int{ assets.Ether(499).ToInt(), assets.Ether(1).ToInt(), big.NewInt(0), })` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = carolContract.RequestRandomness(carol, keyHash, subId, uint16(requestedIncomingConfs), uint32(gasRequested), uint32(nw), false)` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = uni.rootContract.OracleWithdraw(uni.nallory, uni.nallory.From, big.NewInt(1000))` $DIR/core/services/vrf/v2/integration_v2_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `gomega.NewWithT(t).Eventually(func() bool { runs, err = app.PipelineORM().GetAllRuns(ctx) require.NoError(t, err) // It is possible that we send the test request // before the job spawner has started the vrf services, which is fine // the lb will backfill the logs. However, we need to // keep blocks coming in for the lb to send the backfilled logs. uni.backend.Commit() return len(runs) == 1 && runs[0].State == pipeline.RunStatusCompleted }, testutils.WaitTimeout(t), 1*time.Second).Should(gomega.BeTrue())` $DIR/core/services/vrf/v2/integration_v2_test.go: `runs, err = app.PipelineORM().GetAllRuns(ctx)` $DIR/core/services/vrf/v2/integration_v2_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `gomega.NewWithT(t).Eventually(func() bool { rfIterator, err2 := uni.rootContract.FilterRandomWordsFulfilled(nil, nil, nil) require.NoError(t, err2, "failed to logs") uni.backend.Commit() for rfIterator.Next() { rf = append(rf, rfIterator.Event()) } return len(rf) == 1 }, testutils.WaitTimeout(t), 500*time.Millisecond).Should(gomega.BeTrue())` $DIR/core/services/vrf/v2/integration_v2_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `rf = append(rf, rfIterator.Event())` $DIR/core/services/vrf/v2/integration_v2_test.go: `rw, err = carolContract.SRandomWords(nil, big.NewInt(int64(i)))` $DIR/core/services/vrf/v2/integration_v2_test.go: `seen[rw.String()] = struct{}{}` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = uni.rootContract.OracleWithdraw(uni.nallory, uni.nallory.From, linkWeiCharged.Add(decimal.NewFromInt(1)).BigInt())` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = uni.rootContract.OracleWithdraw(uni.nallory, uni.nallory.From, linkWeiCharged.BigInt())` $DIR/core/services/vrf/v2/integration_v2_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `AssertLinkBalances(t, uni.linkContract, []common.Address{ carolContractAddress, uni.rootContractAddress, uni.nallory.From, // Oracle's own address should have nothing }, []*big.Int{ assets.Ether(499).ToInt(), subFunding.Sub(linkWeiCharged).BigInt(), linkWeiCharged.BigInt(), })` $DIR/core/services/vrf/v2/integration_v2_test.go: `counts, err = listenerV2.GetStartingResponseCountsV2(ctx)` $DIR/core/services/vrf/v2/integration_v2_test.go: `registerProvingKeyHelper(t, uni.coordinatorV2UniverseCommon, uni.rootContract, vrfkey, nil)` $DIR/core/services/vrf/v2/integration_v2_test.go: `t.Run("non-proxied consumer", func(tt *testing.T) { carol := uni.vrfConsumers[0] carolContract := uni.consumerContracts[0] carolContractAddress := uni.consumerContractAddresses[0] _, err = carolContract.CreateSubscriptionAndFund(carol, big.NewInt(1000000000000000000)) // 0.1 LINK require.NoError(tt, err) uni.backend.Commit() subId, err := carolContract.SSubId(nil) require.NoError(tt, err) // Ensure even with large number of consumers its still cheap var addrs []common.Address for i := 0; i < 99; i++ { addrs = append(addrs, testutils.NewAddress()) } _, err = carolContract.UpdateSubscription(carol, addrs) require.NoError(tt, err) estimate := estimateGas(tt, uni.backend, common.Address{}, carolContractAddress, uni.consumerABI, "requestRandomness", vrfkey.PublicKey.MustHash(), subId.Uint64(), uint16(2), uint32(10000), uint32(1)) tt.Log("gas estimate of non-proxied testRequestRandomness:", estimate) // V2 should be at least (87000-134000)/134000 = 35% cheaper // Note that a second call drops further to 68998 gas, but would also drop in V1. assert.Less(tt, estimate, uint64(90_000), "requestRandomness tx gas cost more than expected") })` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = carolContract.CreateSubscriptionAndFund(carol, big.NewInt(1000000000000000000))` $DIR/core/services/vrf/v2/integration_v2_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `addrs = append(addrs, testutils.NewAddress())` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = carolContract.UpdateSubscription(carol, addrs)` $DIR/core/services/vrf/v2/integration_v2_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = uni.rootContract.GetSubscription(nil, subId)` $DIR/core/services/vrf/v2/integration_v2_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `addrs = append(addrs, testutils.NewAddress())` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = carolContract.UpdateSubscription(carol, addrs)` $DIR/core/services/vrf/v2/integration_v2_test.go: `estimate = estimateGas(t, uni.backend, carolContractAddress, uni.rootContractAddress, uni.coordinatorABI, "addConsumer", subId.Uint64(), testutils.NewAddress())` $DIR/core/services/vrf/v2/integration_v2_test.go: `registerProvingKeyHelper(t, uni.coordinatorV2UniverseCommon, uni.rootContract, vrfkey, nil)` $DIR/core/services/vrf/v2/integration_v2_test.go: `t.Run("non-proxied consumer", func(tt *testing.T) { carol := uni.vrfConsumers[0] carolContract := uni.consumerContracts[0] carolContractAddress := uni.consumerContractAddresses[0] _, err := carolContract.CreateSubscriptionAndFund(carol, big.NewInt(1000000000000000000)) // 0.1 LINK require.NoError(tt, err) uni.backend.Commit() subId, err := carolContract.SSubId(nil) require.NoError(tt, err) gasRequested := 50_000 nw := 1 requestedIncomingConfs := 3 _, err = carolContract.RequestRandomness(carol, vrfkey.PublicKey.MustHash(), subId, uint16(requestedIncomingConfs), uint32(gasRequested), uint32(nw), false) require.NoError(t, err) for i := 0; i < requestedIncomingConfs; i++ { uni.backend.Commit() } requestLog := FindLatestRandomnessRequestedLog(tt, uni.rootContract, vrfkey.PublicKey.MustHash(), nil) s, err := proof.BigToSeed(requestLog.PreSeed()) require.NoError(t, err) proof, rc, err := proof.GenerateProofResponseV2(app.GetKeyStore().VRF(), vrfkey.ID(), proof.PreSeedDataV2{ PreSeed: s, BlockHash: requestLog.Raw().BlockHash, BlockNum: requestLog.Raw().BlockNumber, SubId: subId.Uint64(), CallbackGasLimit: uint32(gasRequested), NumWords: uint32(nw), Sender: carolContractAddress, }) require.NoError(tt, err) nonProxiedConsumerGasEstimate = estimateGas(tt, uni.backend, common.Address{}, uni.rootContractAddress, uni.coordinatorABI, "fulfillRandomWords", proof, rc) t.Log("non-proxied consumer fulfillment gas estimate:", nonProxiedConsumerGasEstimate) // Establish very rough bounds on fulfillment cost assert.Greater(tt, nonProxiedConsumerGasEstimate, uint64(120_000)) assert.Less(tt, nonProxiedConsumerGasEstimate, uint64(500_000)) })` $DIR/core/services/vrf/v2/integration_v2_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = carolContract.RequestRandomness(carol, vrfkey.PublicKey.MustHash(), subId, uint16(requestedIncomingConfs), uint32(gasRequested), uint32(nw), false)` $DIR/core/services/vrf/v2/integration_v2_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `nonProxiedConsumerGasEstimate = estimateGas(tt, uni.backend, common.Address{}, uni.rootContractAddress, uni.coordinatorABI, "fulfillRandomWords", proof, rc)` $DIR/core/services/vrf/v2/integration_v2_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = consumerContract.RequestRandomness(consumerOwner, vrfkey.PublicKey.MustHash(), subId, uint16(requestedIncomingConfs), uint32(gasRequested), uint32(nw), false)` $DIR/core/services/vrf/v2/integration_v2_test.go: `uni.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `proxiedConsumerGasEstimate = estimateGas(t, uni.backend, common.Address{}, uni.rootContractAddress, uni.coordinatorABI, "fulfillRandomWords", proof, rc)` $DIR/core/services/vrf/v2/integration_v2_test.go: `ec.On("ConfiguredChainID").Return(testutils.SimulatedChainID)` $DIR/core/services/vrf/v2/integration_v2_test.go: `ec.On("LatestBlockHeight", mock.Anything).Return(big.NewInt(2), nil).Maybe()` $DIR/core/services/vrf/v2/integration_v2_test.go: `counts, err = listenerV1.GetStartingResponseCountsV1(testutils.Context(t))` $DIR/core/services/vrf/v2/integration_v2_test.go: `err = ks.Unlock(ctx, testutils.Password)` $DIR/core/services/vrf/v2/integration_v2_test.go: `unconfirmedTxes = append(unconfirmedTxes, txmgr.Tx{ Sequence: &newNonce, FromAddress: k.Address, Error: null.String{}, CreatedAt: b, State: txmgrcommon.TxUnconfirmed, BroadcastAt: &b, InitialBroadcastAt: &b, Meta: &mdSQL, EncodedPayload: []byte{}, ChainID: chainID.ToInt(), })` $DIR/core/services/vrf/v2/integration_v2_test.go: `err = txStore.InsertTx(ctx, &txList[i])` $DIR/core/services/vrf/v2/integration_v2_test.go: `txAttempts = append(txAttempts, txmgr.TxAttempt{ TxID: int64(i + 1), TxFee: gas.EvmFee{Legacy: assets.NewWeiI(100)}, SignedRawTx: []byte(`blah`), Hash: evmutils.NewHash(), BroadcastBeforeBlockNum: &broadcastBlock, State: txmgrtypes.TxAttemptBroadcast, CreatedAt: time.Now(), ChainSpecificFeeLimit: uint64(100), })` $DIR/core/services/vrf/v2/integration_v2_test.go: `txAttempts = append(txAttempts, txmgr.TxAttempt{ TxID: int64(i + 1 + len(confirmedTxes)), TxFee: gas.EvmFee{Legacy: assets.NewWeiI(100)}, SignedRawTx: []byte(`blah`), Hash: evmutils.NewHash(), State: txmgrtypes.TxAttemptInProgress, CreatedAt: time.Now(), ChainSpecificFeeLimit: uint64(100), })` $DIR/core/services/vrf/v2/integration_v2_test.go: `err = txStore.InsertTxAttempt(ctx, &txAttempts[i])` $DIR/core/services/vrf/v2/integration_v2_test.go: `receipts = append(receipts, evmtypes.Receipt{ BlockHash: evmutils.NewHash(), TxHash: txAttempts[i].Hash, BlockNumber: big.NewInt(broadcastBlock), TransactionIndex: 1, })` $DIR/core/services/vrf/v2/integration_v2_test.go: `_, err = txStore.InsertReceipt(ctx, &receipts[i])` $DIR/core/services/vrf/v2/integration_v2_test.go: `counts, err = listenerV1.GetStartingResponseCountsV1(testutils.Context(t))` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Context(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.GWei(10)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { simulatedOverrides(t, assets.GWei(10), toml.KeySpecific{ // Gas lane. Key: ptr(key1.EIP55Address), GasEstimator: toml.KeySpecificGasEstimator{PriceMax: gasLanePriceWei}, })(c, s) c.EVM[0].GasEstimator.LimitDefault = ptr[uint64](3_500_000) c.EVM[0].MinIncomingConfirmations = ptr[uint32](2) })` $DIR/core/services/vrf/v2/integration_v2_test.go: `.GWei(10)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, uni.backend, ownerKey, key1)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.VRFSpec.PublicKey.MustHash()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.SUBSCRIPTIONID(nil)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ABIEncode(`[{"type":"uint64"}]`, wrapperSubID)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.linkContract.TransferAndCall(uni.sergey, uni.rootContractAddress, assets.Ether(100).ToInt(), b)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(100)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.linkContract.Transfer(uni.sergey, consumerAddress, assets.Ether(100).ToInt())` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(100)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.SetUint64(wrapperSubID)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewGomegaWithT(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Eventually(func() bool { uni.backend.Commit() runs, err2 := app.PipelineORM().GetAllRuns(ctx) require.NoError(t, err2) t.Log("runs", len(runs)) return len(runs) == 1 }, testutils.WaitTimeout(t), time.Second)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.PipelineORM()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.GetAllRuns(ctx)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.WaitTimeout(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Should(gomega.BeTrue())` $DIR/core/services/vrf/v2/integration_v2_test.go: `.BeTrue()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.SetUint64(wrapperSubID)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Context(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.GWei(10)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { simulatedOverrides(t, assets.GWei(10), toml.KeySpecific{ // Gas lane. Key: ptr(key1.EIP55Address), GasEstimator: toml.KeySpecificGasEstimator{PriceMax: gasLanePriceWei}, })(c, s) c.EVM[0].GasEstimator.LimitDefault = ptr[uint64](3_500_000) c.EVM[0].MinIncomingConfirmations = ptr[uint32](2) c.Feature.LogPoller = ptr(true) c.EVM[0].LogPollInterval = commonconfig.MustNewDuration(1 * time.Second) })` $DIR/core/services/vrf/v2/integration_v2_test.go: `.GWei(10)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustNewDuration(1 * time.Second)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, uni.backend, ownerKey, key1)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.VRFSpec.PublicKey.MustHash()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.SUBSCRIPTIONID(nil)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ABIEncode(`[{"type":"uint64"}]`, wrapperSubID)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.linkContract.TransferAndCall(uni.sergey, uni.rootContractAddress, assets.Ether(100).ToInt(), b)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(100)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.linkContract.Transfer(uni.sergey, consumerAddress, assets.Ether(100).ToInt())` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(100)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.SetUint64(wrapperSubID)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewGomegaWithT(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Eventually(func() bool { uni.backend.Commit() runs, err2 := app.PipelineORM().GetAllRuns(ctx) require.NoError(t, err2) t.Log("runs", len(runs)) return len(runs) == 1 }, testutils.WaitTimeout(t), time.Second)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.PipelineORM()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.GetAllRuns(ctx)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.WaitTimeout(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Should(gomega.BeTrue())` $DIR/core/services/vrf/v2/integration_v2_test.go: `.BeTrue()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.SetUint64(wrapperSubID)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(1)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(100)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(10)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(10)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil))` $DIR/core/services/vrf/v2/integration_v2_test.go: `.DeployLinkToken( owner, backend)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.DeployVRFCoordinatorV2( owner, backend, linkAddress, common.Address{}, common.Address{})` $DIR/core/services/vrf/v2/integration_v2_test.go: `.SetConfig(owner, uint16(1), uint32(10000), 1, 1, big.NewInt(10), vrf_coordinator_v2.VRFCoordinatorV2FeeConfig{ FulfillmentFlatFeeLinkPPMTier1: 0, FulfillmentFlatFeeLinkPPMTier2: 0, FulfillmentFlatFeeLinkPPMTier3: 0, FulfillmentFlatFeeLinkPPMTier4: 0, FulfillmentFlatFeeLinkPPMTier5: 0, ReqsForTier2: big.NewInt(0), ReqsForTier3: big.NewInt(0), ReqsForTier4: big.NewInt(0), ReqsForTier5: big.NewInt(0), })` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewInt(10)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewInt(0)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewInt(0)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewInt(0)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewInt(0)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.DeployVRFExternalSubOwnerExample(owner, backend, coordinatorAddress, linkAddress)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Transfer(owner, consumerAddress, assets.Ether(2).ToInt())` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(2)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(999_999_998)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(2)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.CreateSubscription(owner)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ABIEncode(`[{"type":"uint64"}]`, uint64(1))` $DIR/core/services/vrf/v2/integration_v2_test.go: `.TransferAndCall(owner, coordinatorAddress, big.NewInt(0), b)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewInt(0)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.AddConsumer(owner, 1, consumerAddress)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.RequestRandomWords(random, 1, 1, 1, 1, [32]byte{})` $DIR/core/services/vrf/v2/integration_v2_test.go: `.RequestRandomWords(owner, 1, 1, 1, 1, [32]byte{})` $DIR/core/services/vrf/v2/integration_v2_test.go: `.TransferOwnership(owner, random.From)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.RequestRandomWords(owner, 1, 1, 1, 1, [32]byte{})` $DIR/core/services/vrf/v2/integration_v2_test.go: `.RequestRandomWords(random, 1, 1, 1, 1, [32]byte{})` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustNewSimTransactor(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(10)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil))` $DIR/core/services/vrf/v2/integration_v2_test.go: `.DeployLinkToken( owner, backend)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.DeployVRFCoordinatorV2( owner, backend, linkAddress, common.Address{}, common.Address{})` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.DeployVRFSingleConsumerExample(owner, backend, coordinatorAddress, linkAddress, 1, 1, 1, [32]byte{})` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Transfer(owner, consumerAddress, assets.Ether(2).ToInt())` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(2)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(999_999_998)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(2)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.TopUpSubscription(owner, assets.Ether(1).ToInt())` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(1)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(999_999_998)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(1)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(1)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Withdraw(random, assets.Ether(1).ToInt(), owner.From)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(1)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Withdraw(owner, assets.Ether(1).ToInt(), owner.From)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(1)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(999_999_999)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(0)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(1)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Unsubscribe(owner, owner.From)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(1_000_000_000)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(0)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(0)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Context(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.GWei(1)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.GWei(10)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { simulatedOverrides(t, gasPrice, toml.KeySpecific{ Key: &key.EIP55Address, GasEstimator: toml.KeySpecificGasEstimator{PriceMax: gasLanePriceWei}, })(c, s) c.EVM[0].MinIncomingConfirmations = ptr[uint32](2) })` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, uni.backend, key)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.KeyStore.Eth()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.EnabledKeysForChain(ctx, testutils.SimulatedChainID)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.GetRelayers()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.LegacyEVMChains()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Get(testutils.SimulatedChainID.String())` $DIR/core/services/vrf/v2/integration_v2_test.go: `.SimulatedChainID.String()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MakeTestListenerV2(chain)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.VRFSpec.PublicKey.MustHash()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(500)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewInt(0)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.RequireFromString("1000000000000000000")` $DIR/core/services/vrf/v2/integration_v2_test.go: `.CreateSubscriptionAndFund(carol, subFunding.BigInt())` $DIR/core/services/vrf/v2/integration_v2_test.go: `.BigInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(499)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(1)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewInt(0)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.SSubId(nil)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.rootContract.GetSubscription(nil, subId)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.RequestRandomness(carol, keyHash, subId, uint16(requestedIncomingConfs), uint32(gasRequested), uint32(nw), false)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.rootContract.OracleWithdraw(uni.nallory, uni.nallory.From, big.NewInt(1000))` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewInt(1000)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewWithT(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Eventually(func() bool { runs, err = app.PipelineORM().GetAllRuns(ctx) require.NoError(t, err) // It is possible that we send the test request // before the job spawner has started the vrf services, which is fine // the lb will backfill the logs. However, we need to // keep blocks coming in for the lb to send the backfilled logs. uni.backend.Commit() return len(runs) == 1 && runs[0].State == pipeline.RunStatusCompleted }, testutils.WaitTimeout(t), 1*time.Second)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.PipelineORM()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.GetAllRuns(ctx)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.WaitTimeout(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Should(gomega.BeTrue())` $DIR/core/services/vrf/v2/integration_v2_test.go: `.BeTrue()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewWithT(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Eventually(func() bool { rfIterator, err2 := uni.rootContract.FilterRandomWordsFulfilled(nil, nil, nil) require.NoError(t, err2, "failed to logs") uni.backend.Commit() for rfIterator.Next() { rf = append(rf, rfIterator.Event()) } return len(rf) == 1 }, testutils.WaitTimeout(t), 500*time.Millisecond)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.rootContract.FilterRandomWordsFulfilled(nil, nil, nil)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Next()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Event()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.WaitTimeout(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Should(gomega.BeTrue())` $DIR/core/services/vrf/v2/integration_v2_test.go: `.BeTrue()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.backend.TransactionReceipt(ctx, rf[0].Raw().TxHash)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Raw()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.SRandomWords(nil, big.NewInt(int64(i)))` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewInt(int64(i))` $DIR/core/services/vrf/v2/integration_v2_test.go: `.String()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.String()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.SGasAvailable(nil)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewInt(0)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Add(ga, big.NewInt(3701))` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewInt(3701)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.rootContract.GetSubscription(nil, subId)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.RequireFromString(subEnd.Balance().String())` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Balance()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.String()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.RequireFromString(subStart.Balance().String())` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Balance()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.String()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.RequireFromString("1000000000000000000")` $DIR/core/services/vrf/v2/integration_v2_test.go: `.RequireFromString("1000000000")` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Sub(end)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Sub(decimal.RequireFromString("1000000000000000"))` $DIR/core/services/vrf/v2/integration_v2_test.go: `.RequireFromString("1000000000000000")` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Div(wei)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewFromBigInt(gasPrice.ToInt(), 0)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.RequireFromString(strconv.Itoa(int(fulfillReceipt.GasUsed)))` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Itoa(int(fulfillReceipt.GasUsed))` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Mul(gasPriceD)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Div(vrftesthelpers.WeiPerUnitLink)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Sub(expected)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Mul(vrftesthelpers.WeiPerUnitLink)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Div(gasPriceD)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Abs()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.IntPart()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.rootContract.OracleWithdraw(uni.nallory, uni.nallory.From, linkWeiCharged.Add(decimal.NewFromInt(1)).BigInt())` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Add(decimal.NewFromInt(1))` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewFromInt(1)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.BigInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.rootContract.OracleWithdraw(uni.nallory, uni.nallory.From, linkWeiCharged.BigInt())` $DIR/core/services/vrf/v2/integration_v2_test.go: `.BigInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(499)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Sub(linkWeiCharged)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.BigInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.BigInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.GetStartingResponseCountsV2(ctx)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.RequestID()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.String()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Context(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewGeneralConfigSimulated(t, nil)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, cfg, uni.backend, key)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.GetKeyStore()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.VRF()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Create(ctx)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Run("non-proxied consumer", func(tt *testing.T) { carol := uni.vrfConsumers[0] carolContract := uni.consumerContracts[0] carolContractAddress := uni.consumerContractAddresses[0] _, err = carolContract.CreateSubscriptionAndFund(carol, big.NewInt(1000000000000000000)) // 0.1 LINK require.NoError(tt, err) uni.backend.Commit() subId, err := carolContract.SSubId(nil) require.NoError(tt, err) // Ensure even with large number of consumers its still cheap var addrs []common.Address for i := 0; i < 99; i++ { addrs = append(addrs, testutils.NewAddress()) } _, err = carolContract.UpdateSubscription(carol, addrs) require.NoError(tt, err) estimate := estimateGas(tt, uni.backend, common.Address{}, carolContractAddress, uni.consumerABI, "requestRandomness", vrfkey.PublicKey.MustHash(), subId.Uint64(), uint16(2), uint32(10000), uint32(1)) tt.Log("gas estimate of non-proxied testRequestRandomness:", estimate) // V2 should be at least (87000-134000)/134000 = 35% cheaper // Note that a second call drops further to 68998 gas, but would also drop in V1. assert.Less(tt, estimate, uint64(90_000), "requestRandomness tx gas cost more than expected") })` $DIR/core/services/vrf/v2/integration_v2_test.go: `.CreateSubscriptionAndFund(carol, big.NewInt(1000000000000000000))` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewInt(1000000000000000000)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.SSubId(nil)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewAddress()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.UpdateSubscription(carol, addrs)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.PublicKey.MustHash()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Uint64()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.CreateSubscriptionAndFund(consumerOwner, assets.Ether(5).ToInt())` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(5)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.backend.TransactionReceipt(testutils.Context(t), tx.Hash())` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Context(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Hash()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.SSubId(nil)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.rootContract.GetSubscription(nil, subId)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGetABI(vrf_consumer_v2_upgradeable_example.VRFConsumerV2UpgradeableExampleMetaData.ABI)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.PublicKey.MustHash()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Uint64()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewGeneralConfigSimulated(t, nil)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, cfg, uni.backend, key)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.CreateSubscriptionAndFund(carol, big.NewInt(1000000000000000000))` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewInt(1000000000000000000)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.SSubId(nil)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewAddress()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.UpdateSubscription(carol, addrs)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Uint64()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Uint64()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewAddress()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Context(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewGeneralConfigSimulated(t, nil)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, cfg, uni.backend, key)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.GetKeyStore()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.VRF()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Create(ctx)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Run("non-proxied consumer", func(tt *testing.T) { carol := uni.vrfConsumers[0] carolContract := uni.consumerContracts[0] carolContractAddress := uni.consumerContractAddresses[0] _, err := carolContract.CreateSubscriptionAndFund(carol, big.NewInt(1000000000000000000)) // 0.1 LINK require.NoError(tt, err) uni.backend.Commit() subId, err := carolContract.SSubId(nil) require.NoError(tt, err) gasRequested := 50_000 nw := 1 requestedIncomingConfs := 3 _, err = carolContract.RequestRandomness(carol, vrfkey.PublicKey.MustHash(), subId, uint16(requestedIncomingConfs), uint32(gasRequested), uint32(nw), false) require.NoError(t, err) for i := 0; i < requestedIncomingConfs; i++ { uni.backend.Commit() } requestLog := FindLatestRandomnessRequestedLog(tt, uni.rootContract, vrfkey.PublicKey.MustHash(), nil) s, err := proof.BigToSeed(requestLog.PreSeed()) require.NoError(t, err) proof, rc, err := proof.GenerateProofResponseV2(app.GetKeyStore().VRF(), vrfkey.ID(), proof.PreSeedDataV2{ PreSeed: s, BlockHash: requestLog.Raw().BlockHash, BlockNum: requestLog.Raw().BlockNumber, SubId: subId.Uint64(), CallbackGasLimit: uint32(gasRequested), NumWords: uint32(nw), Sender: carolContractAddress, }) require.NoError(tt, err) nonProxiedConsumerGasEstimate = estimateGas(tt, uni.backend, common.Address{}, uni.rootContractAddress, uni.coordinatorABI, "fulfillRandomWords", proof, rc) t.Log("non-proxied consumer fulfillment gas estimate:", nonProxiedConsumerGasEstimate) // Establish very rough bounds on fulfillment cost assert.Greater(tt, nonProxiedConsumerGasEstimate, uint64(120_000)) assert.Less(tt, nonProxiedConsumerGasEstimate, uint64(500_000)) })` $DIR/core/services/vrf/v2/integration_v2_test.go: `.CreateSubscriptionAndFund(carol, big.NewInt(1000000000000000000))` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewInt(1000000000000000000)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.SSubId(nil)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.RequestRandomness(carol, vrfkey.PublicKey.MustHash(), subId, uint16(requestedIncomingConfs), uint32(gasRequested), uint32(nw), false)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.PublicKey.MustHash()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.PublicKey.MustHash()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.BigToSeed(requestLog.PreSeed())` $DIR/core/services/vrf/v2/integration_v2_test.go: `.PreSeed()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.GenerateProofResponseV2(app.GetKeyStore().VRF(), vrfkey.ID(), proof.PreSeedDataV2{ PreSeed: s, BlockHash: requestLog.Raw().BlockHash, BlockNum: requestLog.Raw().BlockNumber, SubId: subId.Uint64(), CallbackGasLimit: uint32(gasRequested), NumWords: uint32(nw), Sender: carolContractAddress, })` $DIR/core/services/vrf/v2/integration_v2_test.go: `.GetKeyStore()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.VRF()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ID()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Raw()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Raw()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Uint64()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.CreateSubscriptionAndFund(consumerOwner, assets.Ether(5).ToInt())` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Ether(5)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.SSubId(nil)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.RequestRandomness(consumerOwner, vrfkey.PublicKey.MustHash(), subId, uint16(requestedIncomingConfs), uint32(gasRequested), uint32(nw), false)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.PublicKey.MustHash()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.backend.Commit()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.PublicKey.MustHash()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.BigToSeed(requestLog.PreSeed())` $DIR/core/services/vrf/v2/integration_v2_test.go: `.PreSeed()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.GenerateProofResponseV2(app.GetKeyStore().VRF(), vrfkey.ID(), proof.PreSeedDataV2{ PreSeed: s, BlockHash: requestLog.Raw().BlockHash, BlockNum: requestLog.Raw().BlockNumber, SubId: subId.Uint64(), CallbackGasLimit: uint32(gasRequested), NumWords: uint32(nw), Sender: consumerContractAddress, })` $DIR/core/services/vrf/v2/integration_v2_test.go: `.GetKeyStore()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.VRF()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ID()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Raw()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Raw()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Uint64()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.FullTestDBNoFixturesV2(t, nil)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Context(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.TestLogger(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewTxStore(db, logger.TestLogger(t))` $DIR/core/services/vrf/v2/integration_v2_test.go: `.TestLogger(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewInMemory(db, utils.FastScryptParams, lggr)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewClient(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.On("ConfiguredChainID")` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Return(testutils.SimulatedChainID)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.On("LatestBlockHeight", mock.Anything)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Return(big.NewInt(2), nil)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewInt(2)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Maybe()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewChainRelayExtenders(t, evmtest.TestChainOpts{KeyStore: ks.Eth(), Client: ec, DB: db, GeneralConfig: cfg, TxManager: txm})` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Eth()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewLegacyChainsFromRelayerExtenders(relayExtenders)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Get(testutils.SimulatedChainID.String())` $DIR/core/services/vrf/v2/integration_v2_test.go: `.SimulatedChainID.String()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MakeTestListenerV2(chain)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.GetStartingResponseCountsV1(testutils.Context(t))` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Context(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Unlock(ctx, testutils.Password)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Eth()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Create(testutils.Context(t), testutils.SimulatedChainID)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Context(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Now()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Nonce(0)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Nonce(1)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Nonce(2)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Nonce(3)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.PadByteToHash(0x10)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Marshal(&m1)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.JSON(md1)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.PadByteToHash(0x11)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Marshal(&m2)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.JSON(md2)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.New(testutils.SimulatedChainID)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.PadByteToHash(0x12)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Marshal(&txmgr.TxMeta{ RequestID: &reqID3, })` $DIR/core/services/vrf/v2/integration_v2_test.go: `.JSON(md)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Nonce(i + 1)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.ToInt()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.InsertTx(ctx, &txList[i])` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewWeiI(100)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewHash()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Now()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewWeiI(100)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewHash()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Now()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.InsertTxAttempt(ctx, &txAttempts[i])` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewHash()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewInt(broadcastBlock)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.InsertReceipt(ctx, &receipts[i])` $DIR/core/services/vrf/v2/integration_v2_test.go: `.GetStartingResponseCountsV1(testutils.Context(t))` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Context(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.GetStartingResponseCountsV2(testutils.Context(t))` $DIR/core/services/vrf/v2/integration_v2_test.go: `.Context(t)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.NewInt(0x12)` $DIR/core/services/vrf/v2/integration_v2_test.go: `.String()` $DIR/core/services/vrf/v2/integration_v2_test.go: `.MustGenerateRandomKey(t)` $DIR/core/services/vrf/v2/listener_v2_helpers_test.go: `weiPerUnitLink = big.NewInt(5898161234554321)` $DIR/core/services/vrf/v2/listener_v2_helpers_test.go: `actual, err = v2.EstimateFeeJuels(callbackGasLimit, maxGasPriceGwei, weiPerUnitLink)` $DIR/core/services/vrf/v2/listener_v2_helpers_test.go: `expected = big.NewInt(1780215830399116719)` $DIR/core/services/vrf/v2/listener_v2_helpers_test.go: `actual, err = v2.EstimateFeeJuels(callbackGasLimit, maxGasPriceGwei, big.NewInt(0))` $DIR/core/services/vrf/v2/listener_v2_helpers_test.go: `.GWei(30)` $DIR/core/services/vrf/v2/listener_v2_helpers_test.go: `.ToInt()` $DIR/core/services/vrf/v2/listener_v2_helpers_test.go: `.NewInt(5898160000000000)` $DIR/core/services/vrf/v2/listener_v2_helpers_test.go: `.EstimateFeeJuels(callbackGasLimit, maxGasPriceGwei, weiPerUnitLink)` $DIR/core/services/vrf/v2/listener_v2_helpers_test.go: `.NewInt(1780216203019246680)` $DIR/core/services/vrf/v2/listener_v2_helpers_test.go: `.NewInt(5898161234554321)` $DIR/core/services/vrf/v2/listener_v2_helpers_test.go: `.EstimateFeeJuels(callbackGasLimit, maxGasPriceGwei, weiPerUnitLink)` $DIR/core/services/vrf/v2/listener_v2_helpers_test.go: `.NewInt(1780215830399116719)` $DIR/core/services/vrf/v2/listener_v2_helpers_test.go: `.EstimateFeeJuels(callbackGasLimit, maxGasPriceGwei, big.NewInt(0))` $DIR/core/services/vrf/v2/listener_v2_helpers_test.go: `.NewInt(0)` $DIR/core/services/vrf/v2/listener_v2_helpers_test.go: `.NewInt(0)` $DIR/core/services/vrf/v2/listener_v2_helpers_test.go: `.NewInt(0)` $DIR/core/services/vrf/v2/listener_v2_helpers_test.go: `.NewInt(1)` $DIR/core/services/vrf/v2/listener_v2_helpers_test.go: `.NewInt(0)` $DIR/core/services/vrf/v2/listener_v2_helpers_test.go: `.NewInt(1)` $DIR/core/services/vrf/v2/listener_v2_helpers_test.go: `.NewInt(0)` $DIR/core/services/vrf/v2/listener_v2_helpers_test.go: `.DedupeTxList([]*txmgr.Tx{tx1, tx2, tx3})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `mockChain.On("ID").Return(th.ChainID)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `mockChain.On("LogPoller").Return(th.LogPoller)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `_, err1 = th.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `mockChain.On("LogPoller").Maybe().Return(th.LogPoller)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `go th.Listener.runLogListener(time.Second, 1)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `gomega.NewWithT(t).Eventually(func() bool { return th.Listener.chain.LogPoller().HasFilter(filterName) }, testutils.WaitTimeout(t), time.Second).Should(gomega.BeTrue())` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `gomega.NewWithT(t).Consistently(func() bool { return th.Listener.chain.LogPoller().HasFilter(filterName) }, 5*time.Second, 1*time.Second).Should(gomega.BeTrue())` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `close(th.Listener.chStop)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `mockChain.On("ID").Return(curTH.ChainID)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `mockChain.On("LogPoller").Return(curTH.LogPoller)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `_, err2 = th.VRFLogEmitter.EmitRandomWordsFulfilled(th.Owner, reqID, preSeed, big.NewInt(10), true)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `_, err1 = th.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `mockChain.On("ID").Return(curTH.ChainID)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `mockChain.On("LogPoller").Return(curTH.LogPoller)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `_, err1 = th.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `mockChain.On("ID").Return(curTH.ChainID)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `mockChain.On("LogPoller").Return(curTH.LogPoller)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `_, err1 = th.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `_, err2 = th.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID2, preSeed, subID, 10, 10000, 2, th.Owner.From)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `mockChain.On("ID").Return(curTH.ChainID)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `mockChain.On("LogPoller").Return(curTH.LogPoller)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `_, err1 = th.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `_, err2 = th.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID2, preSeed, subID, 10, 10000, 2, th.Owner.From)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `_, err2 = th.VRFLogEmitter.EmitRandomWordsFulfilled(th.Owner, reqID1, preSeed, big.NewInt(10), true)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `mockChain.On("LogPoller").Return(curTH.LogPoller)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `_, err2 = th.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID2, preSeed, subID, 10, 10000, 2, th.Owner.From)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `_, err1 = th.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `mockChain.On("LogPoller").Return(curTH.LogPoller)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `_, err2 = th.VRFLogEmitter.EmitRandomWordsFulfilled(th.Owner, reqID1, preSeed, big.NewInt(10), true)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `_, err1 = th.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `mockChain.On("LogPoller").Return(curTH.LogPoller)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `_, err1 = th.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `mockChain.On("LogPoller").Return(curTH.LogPoller)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `_, err1 = th.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `_, err2 = th.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID2, preSeed, subID, 10, 10000, 2, th.Owner.From)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `mockChain.On("LogPoller").Return(curTH.LogPoller)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `_, err1 = th.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `_, err2 = th.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID2, preSeed, subID, 10, 10000, 2, th.Owner.From)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `_, err2 = th.VRFLogEmitter.EmitRandomWordsFulfilled(th.Owner, reqID1, preSeed, big.NewInt(10), true)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `th.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `logs = append(logs, logpoller.Log{ EvmChainId: chainID, LogIndex: 0, BlockHash: common.BigToHash(big.NewInt(int64(i))), BlockNumber: int64(i), BlockTimestamp: time.Now(), Topics: [][]byte{ []byte("0x46692c0e59ca9cd1ad8f984a9d11715ec83424398b7eed4e05c8ce84662415a8"), }, EventSig: emitterABI.Events["Log1"].ID, Address: common.Address{}, TxHash: common.BigToHash(big.NewInt(int64(i))), Data: nil, CreatedAt: time.Now(), })` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `eventSig = vrfEmitterABI.Events["RandomWordsRequested"].ID` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `topics = [][]byte{ common.FromHex("0x63373d1c4696214b898952999c9aaec57dac1ee2723cec59bea6888f489a9772"), common.FromHex("0xc0a6c424ac7157ae408398df7e5f4552091a69125d5dfcb7b8c2659029395bdf"), common.FromHex("0x0000000000000000000000000000000000000000000000000000000000000001"), common.FromHex("0x0000000000000000000000005ee3b50502b5c4c9184dcb281471a0614d4b2ef9"), }` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `logs = append(logs, logpoller.Log{ EvmChainId: chainID, LogIndex: 0, BlockHash: common.BigToHash(big.NewInt(int64(2 * i))), BlockNumber: int64(2 * i), BlockTimestamp: time.Now(), Topics: topics, EventSig: eventSig, Address: common.Address{}, TxHash: common.BigToHash(big.NewInt(int64(2 * i))), Data: common.FromHex("0x000000000000000000000000000000000000000000000000000000000000000" + fmt.Sprintf("%d", i) + "000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000002"), CreatedAt: time.Now(), })` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `logs = append(logs, logpoller.Log{ EvmChainId: chainID, LogIndex: 0, BlockHash: common.BigToHash(big.NewInt(int64(2*i + 1))), BlockNumber: int64(2*i + 1), BlockTimestamp: time.Now(), Topics: [][]byte{ common.FromHex("0x7dffc5ae5ee4e2e4df1651cf6ad329a73cebdb728f37ea0187b9b17e036756e4"), common.FromHex("0x000000000000000000000000000000000000000000000000000000000000000" + fmt.Sprintf("%d", i)), }, EventSig: vrfEmitterABI.Events["RandomWordsFulfilled"].ID, Address: common.Address{}, TxHash: common.BigToHash(big.NewInt(int64(2*i + 1))), Data: common.FromHex("0x0000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000001"), CreatedAt: time.Now(), })` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `eventSig = vrfEmitterABI.Events["RandomWordsRequested"].ID` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `topics = [][]byte{ common.FromHex("0x63373d1c4696214b898952999c9aaec57dac1ee2723cec59bea6888f489a9772"), common.FromHex("0xc0a6c424ac7157ae408398df7e5f4552091a69125d5dfcb7b8c2659029395bdf"), common.FromHex("0x0000000000000000000000000000000000000000000000000000000000000001"), common.FromHex("0x0000000000000000000000005ee3b50502b5c4c9184dcb281471a0614d4b2ef9"), }` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `logs = append(logs, logpoller.Log{ EvmChainId: chainID, LogIndex: 0, BlockHash: common.BigToHash(big.NewInt(int64(2 * i))), BlockNumber: int64(2 * i), BlockTimestamp: time.Now(), Topics: topics, EventSig: eventSig, Address: common.Address{}, TxHash: common.BigToHash(big.NewInt(int64(2 * i))), Data: common.FromHex("0x000000000000000000000000000000000000000000000000000000000000000" + fmt.Sprintf("%d", i) + "000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000002"), CreatedAt: time.Now(), })` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `eventSig = vrfEmitterABI.Events["RandomWordsRequested"].ID` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `topics = [][]byte{ common.FromHex("0x63373d1c4696214b898952999c9aaec57dac1ee2723cec59bea6888f489a9772"), common.FromHex("0xc0a6c424ac7157ae408398df7e5f4552091a69125d5dfcb7b8c2659029395bdf"), common.FromHex("0x0000000000000000000000000000000000000000000000000000000000000001"), common.FromHex("0x0000000000000000000000005ee3b50502b5c4c9184dcb281471a0614d4b2ef9"), }` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `logs = append(logs, logpoller.Log{ EvmChainId: chainID, LogIndex: 0, BlockHash: common.BigToHash(big.NewInt(int64(2 * i))), BlockNumber: int64(2 * i), BlockTimestamp: time.Now(), Topics: topics, EventSig: eventSig, Address: common.Address{}, TxHash: common.BigToHash(big.NewInt(int64(2 * i))), Data: common.FromHex("0x000000000000000000000000000000000000000000000000000000000000000" + fmt.Sprintf("%d", i) + "000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000002"), CreatedAt: time.Now(), })` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `eventSig = vrfEmitterABI.Events["RandomWordsRequested"].ID` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `topics = [][]byte{ common.FromHex("0x63373d1c4696214b898952999c9aaec57dac1ee2723cec59bea6888f489a9772"), common.FromHex("0xc0a6c424ac7157ae408398df7e5f4552091a69125d5dfcb7b8c2659029395bdf"), common.FromHex("0x0000000000000000000000000000000000000000000000000000000000000001"), common.FromHex("0x0000000000000000000000005ee3b50502b5c4c9184dcb281471a0614d4b2ef9"), }` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `logs = append(logs, logpoller.Log{ EvmChainId: chainID, LogIndex: 0, BlockHash: common.BigToHash(big.NewInt(int64(2 * i))), BlockNumber: int64(2 * i), BlockTimestamp: time.Now(), Topics: topics, EventSig: eventSig, Address: common.Address{}, TxHash: common.BigToHash(big.NewInt(int64(2 * i))), Data: common.FromHex("0x000000000000000000000000000000000000000000000000000000000000000" + fmt.Sprintf("%d", i) + "000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000002"), CreatedAt: time.Now(), })` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `logs = append(logs, logpoller.Log{ EvmChainId: chainID, LogIndex: 0, BlockHash: common.BigToHash(big.NewInt(int64(2*i + 1))), BlockNumber: int64(2*i + 1), BlockTimestamp: time.Now(), Topics: [][]byte{ common.FromHex("0x7dffc5ae5ee4e2e4df1651cf6ad329a73cebdb728f37ea0187b9b17e036756e4"), common.FromHex("0x000000000000000000000000000000000000000000000000000000000000000" + fmt.Sprintf("%d", i)), }, EventSig: vrfEmitterABI.Events["RandomWordsFulfilled"].ID, Address: common.Address{}, TxHash: common.BigToHash(big.NewInt(int64(2*i + 1))), Data: common.FromHex("0x0000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000001"), CreatedAt: time.Now(), })` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Context(t)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.On("ID")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Return(th.ChainID)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.On("LogPoller")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Return(th.LogPoller)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Emitter.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.LogPoller.Logs(testutils.Context(t), 4, 7, emitterABI.Events["Log1"].ID, th.EmitterAddress)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Context(t)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Listener.initializeLastProcessedBlock(ctx)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.On("LogPoller")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Maybe()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Return(th.LogPoller)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Listener.runLogListener(time.Second, 1)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Listener.getLogPollerFilterName()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewWithT(t)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Eventually(func() bool { return th.Listener.chain.LogPoller().HasFilter(filterName) }, testutils.WaitTimeout(t), time.Second)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Listener.chain.LogPoller()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.HasFilter(filterName)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.WaitTimeout(t)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Should(gomega.BeTrue())` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.BeTrue()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewWithT(t)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Consistently(func() bool { return th.Listener.chain.LogPoller().HasFilter(filterName) }, 5*time.Second, 1*time.Second)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Listener.chain.LogPoller()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.HasFilter(filterName)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Should(gomega.BeTrue())` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.BeTrue()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Context(t)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.On("ID")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Return(curTH.ChainID)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.On("LogPoller")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Return(curTH.LogPoller)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Listener.job.VRFSpec.PublicKey.MustHash()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Bytes()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(105)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(1)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID, preSeed, subID, 10, 10000, 2, th.Owner.From)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.VRFLogEmitter.EmitRandomWordsFulfilled(th.Owner, reqID, preSeed, big.NewInt(10), true)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(10)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Emitter.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Listener.initializeLastProcessedBlock(ctx)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Context(t)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.On("ID")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Return(curTH.ChainID)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.On("LogPoller")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Return(curTH.LogPoller)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Listener.job.VRFSpec.PublicKey.MustHash()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Bytes()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(105)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(1)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID, preSeed, subID, 10, 10000, 2, th.Owner.From)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Emitter.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Listener.initializeLastProcessedBlock(ctx)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Context(t)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.On("ID")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Return(curTH.ChainID)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.On("LogPoller")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Return(curTH.LogPoller)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Emitter.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Listener.job.VRFSpec.PublicKey.MustHash()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Bytes()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(105)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(2 * i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID1, preSeed, subID, 10, 10000, 2, th.Owner.From)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(2*i + 1))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID2, preSeed, subID, 10, 10000, 2, th.Owner.From)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Listener.initializeLastProcessedBlock(ctx)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Context(t)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.On("ID")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Return(curTH.ChainID)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.On("LogPoller")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Return(curTH.LogPoller)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Emitter.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Listener.job.VRFSpec.PublicKey.MustHash()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Bytes()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(105)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(2 * i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID1, preSeed, subID, 10, 10000, 2, th.Owner.From)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(2*i + 1))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID2, preSeed, subID, 10, 10000, 2, th.Owner.From)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.VRFLogEmitter.EmitRandomWordsFulfilled(th.Owner, reqID1, preSeed, big.NewInt(10), true)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(10)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Listener.initializeLastProcessedBlock(ctx)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Context(t)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.On("LogPoller")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Return(curTH.LogPoller)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Listener.job.VRFSpec.PublicKey.MustHash()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Bytes()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(105)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(1))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID1, preSeed, subID, 10, 10000, 2, th.Owner.From)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(2))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID2, preSeed, subID, 10, 10000, 2, th.Owner.From)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Emitter.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Listener.updateLastProcessedBlock(ctx, 7)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Context(t)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.On("LogPoller")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Return(curTH.LogPoller)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Listener.job.VRFSpec.PublicKey.MustHash()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Bytes()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(105)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(1))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID1, preSeed, subID, 10, 10000, 2, th.Owner.From)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.VRFLogEmitter.EmitRandomWordsFulfilled(th.Owner, reqID1, preSeed, big.NewInt(10), true)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(10)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Emitter.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Listener.updateLastProcessedBlock(ctx, 4)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Context(t)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.On("LogPoller")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Return(curTH.LogPoller)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Listener.job.VRFSpec.PublicKey.MustHash()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Bytes()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(105)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(1))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID1, preSeed, subID, 10, 10000, 2, th.Owner.From)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Emitter.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Listener.updateLastProcessedBlock(ctx, 4)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Context(t)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.On("LogPoller")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Return(curTH.LogPoller)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Emitter.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Listener.job.VRFSpec.PublicKey.MustHash()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Bytes()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(105)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(2 * i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID1, preSeed, subID, 10, 10000, 2, th.Owner.From)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(2*i + 1))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID2, preSeed, subID, 10, 10000, 2, th.Owner.From)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Listener.updateLastProcessedBlock(ctx, 4)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Context(t)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.On("LogPoller")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Return(curTH.LogPoller)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Emitter.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))})` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Listener.job.VRFSpec.PublicKey.MustHash()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Bytes()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(105)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(2 * i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID1, preSeed, subID, 10, 10000, 2, th.Owner.From)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(2*i + 1))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID2, preSeed, subID, 10, 10000, 2, th.Owner.From)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.VRFLogEmitter.EmitRandomWordsFulfilled(th.Owner, reqID1, preSeed, big.NewInt(10), true)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(10)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Client.Commit()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Listener.updateLastProcessedBlock(ctx, 4)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.BigToHash(big.NewInt(int64(i)))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Now()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.BigToHash(big.NewInt(int64(i)))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Now()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.getUnfulfilled(logs, listener.l)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0x46692c0e59ca9cd1ad8f984a9d11715ec83424398b7eed4e05c8ce84662415a8")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0x63373d1c4696214b898952999c9aaec57dac1ee2723cec59bea6888f489a9772")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0xc0a6c424ac7157ae408398df7e5f4552091a69125d5dfcb7b8c2659029395bdf")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0x0000000000000000000000000000000000000000000000000000000000000001")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0x0000000000000000000000005ee3b50502b5c4c9184dcb281471a0614d4b2ef9")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.BigToHash(big.NewInt(int64(2 * i)))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(2 * i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Now()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.BigToHash(big.NewInt(int64(2 * i)))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(2 * i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0x000000000000000000000000000000000000000000000000000000000000000" + fmt.Sprintf("%d", i) + "000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000002")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Sprintf("%d", i)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Now()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.BigToHash(big.NewInt(int64(2*i + 1)))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(2*i + 1))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Now()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0x7dffc5ae5ee4e2e4df1651cf6ad329a73cebdb728f37ea0187b9b17e036756e4")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0x000000000000000000000000000000000000000000000000000000000000000" + fmt.Sprintf("%d", i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Sprintf("%d", i)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.BigToHash(big.NewInt(int64(2*i + 1)))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(2*i + 1))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0x0000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000001")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Now()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.getUnfulfilled(logs, listener.l)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0x46692c0e59ca9cd1ad8f984a9d11715ec83424398b7eed4e05c8ce84662415a8")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0x63373d1c4696214b898952999c9aaec57dac1ee2723cec59bea6888f489a9772")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0xc0a6c424ac7157ae408398df7e5f4552091a69125d5dfcb7b8c2659029395bdf")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0x0000000000000000000000000000000000000000000000000000000000000001")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0x0000000000000000000000005ee3b50502b5c4c9184dcb281471a0614d4b2ef9")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.BigToHash(big.NewInt(int64(2 * i)))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(2 * i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Now()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.BigToHash(big.NewInt(int64(2 * i)))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(2 * i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0x000000000000000000000000000000000000000000000000000000000000000" + fmt.Sprintf("%d", i) + "000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000002")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Sprintf("%d", i)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Now()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.getUnfulfilled(logs, listener.l)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0x46692c0e59ca9cd1ad8f984a9d11715ec83424398b7eed4e05c8ce84662415a8")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0x63373d1c4696214b898952999c9aaec57dac1ee2723cec59bea6888f489a9772")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0xc0a6c424ac7157ae408398df7e5f4552091a69125d5dfcb7b8c2659029395bdf")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0x0000000000000000000000000000000000000000000000000000000000000001")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0x0000000000000000000000005ee3b50502b5c4c9184dcb281471a0614d4b2ef9")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.BigToHash(big.NewInt(int64(2 * i)))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(2 * i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Now()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.BigToHash(big.NewInt(int64(2 * i)))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(2 * i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0x000000000000000000000000000000000000000000000000000000000000000" + fmt.Sprintf("%d", i) + "000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000002")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Sprintf("%d", i)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Now()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.getUnfulfilled(logs, listener.l)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.RequestID()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Int64()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0x46692c0e59ca9cd1ad8f984a9d11715ec83424398b7eed4e05c8ce84662415a8")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0x63373d1c4696214b898952999c9aaec57dac1ee2723cec59bea6888f489a9772")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0xc0a6c424ac7157ae408398df7e5f4552091a69125d5dfcb7b8c2659029395bdf")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0x0000000000000000000000000000000000000000000000000000000000000001")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0x0000000000000000000000005ee3b50502b5c4c9184dcb281471a0614d4b2ef9")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.BigToHash(big.NewInt(int64(2 * i)))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(2 * i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Now()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.BigToHash(big.NewInt(int64(2 * i)))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(2 * i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0x000000000000000000000000000000000000000000000000000000000000000" + fmt.Sprintf("%d", i) + "000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000002")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Sprintf("%d", i)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Now()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.BigToHash(big.NewInt(int64(2*i + 1)))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(2*i + 1))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Now()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0x7dffc5ae5ee4e2e4df1651cf6ad329a73cebdb728f37ea0187b9b17e036756e4")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0x000000000000000000000000000000000000000000000000000000000000000" + fmt.Sprintf("%d", i))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Sprintf("%d", i)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.BigToHash(big.NewInt(int64(2*i + 1)))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.NewInt(int64(2*i + 1))` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.FromHex("0x0000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000001")` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Now()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.getUnfulfilled(logs, listener.l)` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.RequestID()` $DIR/core/services/vrf/v2/listener_v2_log_listener_test.go: `.Int64()` $DIR/core/services/vrf/v2/listener_v2_test.go: `chain.On("TxManager").Return(txm).Maybe()` $DIR/core/services/vrf/v2/listener_v2_test.go: `j, err = vrfcommon.ValidatedVRFSpec(testspecs.GenerateVRFSpec(testspecs.VRFSpecParams{ RequestedConfsDelay: 0, }).Toml())` $DIR/core/services/vrf/v2/listener_v2_test.go: `listener.job = j` $DIR/core/services/vrf/v2/listener_v2_test.go: `confirmedAt = listener.getConfirmedAt(NewV2RandomWordsRequested(&vrf_coordinator_v2.VRFCoordinatorV2RandomWordsRequested{ RequestId: big.NewInt(1), MinimumRequestConfirmations: 100, Raw: types.Log{ BlockNumber: 100, }, }), uint32(nodeMinConfs))` $DIR/core/services/vrf/v2/listener_v2_test.go: `t.Run(test.name, func(t *testing.T) { lsn := &listenerV2{job: job.Job{ VRFSpec: &job.VRFSpec{ BackoffInitialDelay: test.initial, BackoffMaxDelay: test.max, }, }} req := pendingRequest{ confirmedAtBlock: 5, attempts: test.retries, lastTry: time.Now().Add(-test.last), } require.Equal(t, test.expected, lsn.ready(req, 10)) })` $DIR/core/services/vrf/v2/listener_v2_test.go: `.Context(t)` $DIR/core/services/vrf/v2/listener_v2_test.go: `.NewSqlxDB(t)` $DIR/core/services/vrf/v2/listener_v2_test.go: `.TestLogger(t)` $DIR/core/services/vrf/v2/listener_v2_test.go: `.NewInMemory(db, utils.FastScryptParams, lggr)` $DIR/core/services/vrf/v2/listener_v2_test.go: `.SetUint64(1)` $DIR/core/services/vrf/v2/listener_v2_test.go: `.ValidatedVRFSpec(testspecs.GenerateVRFSpec(testspecs.VRFSpecParams{ RequestedConfsDelay: 10, }).Toml())` $DIR/core/services/vrf/v2/listener_v2_test.go: `.GenerateVRFSpec(testspecs.VRFSpecParams{ RequestedConfsDelay: 10, })` $DIR/core/services/vrf/v2/listener_v2_test.go: `.Toml()` $DIR/core/services/vrf/v2/listener_v2_test.go: `.NewTxStore(db, logger.TestLogger(t))` $DIR/core/services/vrf/v2/listener_v2_test.go: `.TestLogger(t)` $DIR/core/services/vrf/v2/listener_v2_test.go: `.NewChain(t)` $DIR/core/services/vrf/v2/listener_v2_test.go: `.On("TxManager")` $DIR/core/services/vrf/v2/listener_v2_test.go: `.Return(txm)` $DIR/core/services/vrf/v2/listener_v2_test.go: `.Maybe()` $DIR/core/services/vrf/v2/listener_v2_test.go: `.MaybeSubtractReservedEth(testutils.Context(t), big.NewInt(100_000), chainID, subID, vrfcommon.V2)` $DIR/core/services/vrf/v2/listener_v2_test.go: `.Context(t)` $DIR/core/services/vrf/v2/listener_v2_test.go: `.NewInt(100_000)` $DIR/core/services/vrf/v2/listener_v2_test.go: `.NewInt(0)` $DIR/core/services/vrf/v2/listener_v2_test.go: `.ValidatedVRFSpec(testspecs.GenerateVRFSpec(testspecs.VRFSpecParams{ RequestedConfsDelay: 10, }).Toml())` $DIR/core/services/vrf/v2/listener_v2_test.go: `.GenerateVRFSpec(testspecs.VRFSpecParams{ RequestedConfsDelay: 10, })` $DIR/core/services/vrf/v2/listener_v2_test.go: `.Toml()` $DIR/core/services/vrf/v2/listener_v2_test.go: `.getConfirmedAt(NewV2RandomWordsRequested(&vrf_coordinator_v2.VRFCoordinatorV2RandomWordsRequested{ RequestId: big.NewInt(1), MinimumRequestConfirmations: 100, Raw: types.Log{ BlockNumber: 100, }, }), uint32(nodeMinConfs))` $DIR/core/services/vrf/v2/listener_v2_test.go: `.NewInt(1)` $DIR/core/services/vrf/v2/listener_v2_test.go: `.ValidatedVRFSpec(testspecs.GenerateVRFSpec(testspecs.VRFSpecParams{ RequestedConfsDelay: 0, }).Toml())` $DIR/core/services/vrf/v2/listener_v2_test.go: `.GenerateVRFSpec(testspecs.VRFSpecParams{ RequestedConfsDelay: 0, })` $DIR/core/services/vrf/v2/listener_v2_test.go: `.Toml()` $DIR/core/services/vrf/v2/listener_v2_test.go: `.getConfirmedAt(NewV2RandomWordsRequested(&vrf_coordinator_v2.VRFCoordinatorV2RandomWordsRequested{ RequestId: big.NewInt(1), MinimumRequestConfirmations: 100, Raw: types.Log{ BlockNumber: 100, }, }), uint32(nodeMinConfs))` $DIR/core/services/vrf/v2/listener_v2_test.go: `.NewInt(1)` $DIR/core/services/vrf/v2/listener_v2_test.go: `.Run(test.name, func(t *testing.T) { lsn := &listenerV2{job: job.Job{ VRFSpec: &job.VRFSpec{ BackoffInitialDelay: test.initial, BackoffMaxDelay: test.max, }, }} req := pendingRequest{ confirmedAtBlock: 5, attempts: test.retries, lastTry: time.Now().Add(-test.last), } require.Equal(t, test.expected, lsn.ready(req, 10)) })` $DIR/core/services/vrf/v2/listener_v2_test.go: `.Now()` $DIR/core/services/vrf/v2/listener_v2_test.go: `.Add(-test.last)` $DIR/core/services/vrf/v2/listener_v2_types_test.go: `bfs.addRun(vrfPipelineResult{ gasLimit: 500, req: pendingRequest{ req: NewV2RandomWordsRequested(&vrf_coordinator_v2.VRFCoordinatorV2RandomWordsRequested{ RequestId: big.NewInt(1), Raw: types.Log{ TxHash: common.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65"), }, }), }, run: pipeline.NewRun(pipeline.Spec{}, pipeline.Vars{}), }, fromAddress)` $DIR/core/services/vrf/v2/listener_v2_types_test.go: `bfs.addRun(vrfPipelineResult{ gasLimit: 500, req: pendingRequest{ req: NewV2RandomWordsRequested(&vrf_coordinator_v2.VRFCoordinatorV2RandomWordsRequested{ RequestId: big.NewInt(1), Raw: types.Log{ TxHash: common.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65"), }, }), }, run: pipeline.NewRun(pipeline.Spec{}, pipeline.Vars{}), }, fromAddress)` $DIR/core/services/vrf/v2/listener_v2_types_test.go: `bfs.addRun(vrfPipelineResult{ gasLimit: 500, req: pendingRequest{ req: NewV2_5RandomWordsRequested(&vrf_coordinator_v2_5.VRFCoordinatorV25RandomWordsRequested{ RequestId: big.NewInt(1), Raw: types.Log{ TxHash: common.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65"), }, }), }, run: pipeline.NewRun(pipeline.Spec{}, pipeline.Vars{}), }, fromAddress)` $DIR/core/services/vrf/v2/listener_v2_types_test.go: `bfs.addRun(vrfPipelineResult{ gasLimit: 500, req: pendingRequest{ req: NewV2_5RandomWordsRequested(&vrf_coordinator_v2_5.VRFCoordinatorV25RandomWordsRequested{ RequestId: big.NewInt(1), Raw: types.Log{ TxHash: common.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65"), }, }), }, run: pipeline.NewRun(pipeline.Spec{}, pipeline.Vars{}), }, fromAddress)` $DIR/core/services/vrf/v2/listener_v2_types_test.go: `.NewAddress()` $DIR/core/services/vrf/v2/listener_v2_types_test.go: `.addRun(vrfPipelineResult{ gasLimit: 500, req: pendingRequest{ req: NewV2RandomWordsRequested(&vrf_coordinator_v2.VRFCoordinatorV2RandomWordsRequested{ RequestId: big.NewInt(1), Raw: types.Log{ TxHash: common.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65"), }, }), }, run: pipeline.NewRun(pipeline.Spec{}, pipeline.Vars{}), }, fromAddress)` $DIR/core/services/vrf/v2/listener_v2_types_test.go: `.NewInt(1)` $DIR/core/services/vrf/v2/listener_v2_types_test.go: `.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65")` $DIR/core/services/vrf/v2/listener_v2_types_test.go: `.NewRun(pipeline.Spec{}, pipeline.Vars{})` $DIR/core/services/vrf/v2/listener_v2_types_test.go: `.addRun(vrfPipelineResult{ gasLimit: 500, req: pendingRequest{ req: NewV2RandomWordsRequested(&vrf_coordinator_v2.VRFCoordinatorV2RandomWordsRequested{ RequestId: big.NewInt(1), Raw: types.Log{ TxHash: common.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65"), }, }), }, run: pipeline.NewRun(pipeline.Spec{}, pipeline.Vars{}), }, fromAddress)` $DIR/core/services/vrf/v2/listener_v2_types_test.go: `.NewInt(1)` $DIR/core/services/vrf/v2/listener_v2_types_test.go: `.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65")` $DIR/core/services/vrf/v2/listener_v2_types_test.go: `.NewRun(pipeline.Spec{}, pipeline.Vars{})` $DIR/core/services/vrf/v2/listener_v2_types_test.go: `.NewAddress()` $DIR/core/services/vrf/v2/listener_v2_types_test.go: `.addRun(vrfPipelineResult{ gasLimit: 500, req: pendingRequest{ req: NewV2_5RandomWordsRequested(&vrf_coordinator_v2_5.VRFCoordinatorV25RandomWordsRequested{ RequestId: big.NewInt(1), Raw: types.Log{ TxHash: common.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65"), }, }), }, run: pipeline.NewRun(pipeline.Spec{}, pipeline.Vars{}), }, fromAddress)` $DIR/core/services/vrf/v2/listener_v2_types_test.go: `.NewInt(1)` $DIR/core/services/vrf/v2/listener_v2_types_test.go: `.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65")` $DIR/core/services/vrf/v2/listener_v2_types_test.go: `.NewRun(pipeline.Spec{}, pipeline.Vars{})` $DIR/core/services/vrf/v2/listener_v2_types_test.go: `.addRun(vrfPipelineResult{ gasLimit: 500, req: pendingRequest{ req: NewV2_5RandomWordsRequested(&vrf_coordinator_v2_5.VRFCoordinatorV25RandomWordsRequested{ RequestId: big.NewInt(1), Raw: types.Log{ TxHash: common.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65"), }, }), }, run: pipeline.NewRun(pipeline.Spec{}, pipeline.Vars{}), }, fromAddress)` $DIR/core/services/vrf/v2/listener_v2_types_test.go: `.NewInt(1)` $DIR/core/services/vrf/v2/listener_v2_types_test.go: `.HexToHash("0xd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c65")` $DIR/core/services/vrf/v2/listener_v2_types_test.go: `.NewRun(pipeline.Spec{}, pipeline.Vars{})` $DIR/core/services/vrf/vrfcommon/log_dedupe_test.go: `t.Run(test.name, func(t *testing.T) { deduper := NewLogDeduper(100) for i := range test.logs { require.Equal(t, test.results[i], deduper.ShouldDeliver(test.logs[i]), "expected shouldDeliver for log %d to be %t", i, test.results[i]) } })` $DIR/core/services/vrf/vrfcommon/log_dedupe_test.go: `.Run(test.name, func(t *testing.T) { deduper := NewLogDeduper(100) for i := range test.logs { require.Equal(t, test.results[i], deduper.ShouldDeliver(test.logs[i]), "expected shouldDeliver for log %d to be %t", i, test.results[i]) } })` $DIR/core/services/vrf/vrfcommon/validate_test.go: `t.Run(tc.name, func(t *testing.T) { s, err := ValidatedVRFSpec(tc.toml) tc.assertion(t, s, err) })` $DIR/core/services/vrf/vrfcommon/validate_test.go: `tc.assertion(t, s, err)` $DIR/core/services/vrf/vrfcommon/validate_test.go: `.Run(tc.name, func(t *testing.T) { s, err := ValidatedVRFSpec(tc.toml) tc.assertion(t, s, err) })` $DIR/core/services/vrf/vrfcommon/validate_test.go: `.assertion(t, s, err)` $DIR/core/services/webhook/authorizer_test.go: `_, err = db.Exec(`INSERT INTO external_initiator_webhook_specs (external_initiator_id, webhook_spec_id, spec) VALUES ($1,$2,$3)`, eiBar.ID, webhookSpecWithFooAndBarEI.ID, `{"ei": "bar", "name": "webhookSpecWithFooAndBarEI"}`)` $DIR/core/services/webhook/authorizer_test.go: `_, err = db.Exec(`INSERT INTO external_initiator_webhook_specs (external_initiator_id, webhook_spec_id, spec) VALUES ($1,$2,$3)`, eiBar.ID, webhookSpecWithBarEI.ID, `{"ei": "bar", "name": "webhookSpecTwoEIs"}`)` $DIR/core/services/webhook/authorizer_test.go: `t.Run("no user no ei never authorizes", func(t *testing.T) { a := webhook.NewAuthorizer(db, nil, nil) can, err := a.CanRun(testutils.Context(t), nil, jobWithFooAndBarEI.ExternalJobID) require.NoError(t, err) assert.False(t, can) can, err = a.CanRun(testutils.Context(t), nil, jobWithNoEI.ExternalJobID) require.NoError(t, err) assert.False(t, can) can, err = a.CanRun(testutils.Context(t), nil, uuid.New()) require.NoError(t, err) assert.False(t, can) })` $DIR/core/services/webhook/authorizer_test.go: `can, err = a.CanRun(testutils.Context(t), nil, jobWithNoEI.ExternalJobID)` $DIR/core/services/webhook/authorizer_test.go: `can, err = a.CanRun(testutils.Context(t), nil, uuid.New())` $DIR/core/services/webhook/authorizer_test.go: `t.Run("with user no ei always authorizes", func(t *testing.T) { a := webhook.NewAuthorizer(db, &sessions.User{}, nil) can, err := a.CanRun(testutils.Context(t), nil, jobWithFooAndBarEI.ExternalJobID) require.NoError(t, err) assert.True(t, can) can, err = a.CanRun(testutils.Context(t), nil, jobWithNoEI.ExternalJobID) require.NoError(t, err) assert.True(t, can) can, err = a.CanRun(testutils.Context(t), nil, uuid.New()) require.NoError(t, err) assert.True(t, can) })` $DIR/core/services/webhook/authorizer_test.go: `can, err = a.CanRun(testutils.Context(t), nil, jobWithNoEI.ExternalJobID)` $DIR/core/services/webhook/authorizer_test.go: `can, err = a.CanRun(testutils.Context(t), nil, uuid.New())` $DIR/core/services/webhook/authorizer_test.go: `can, err = a.CanRun(testutils.Context(t), eiDisabledCfg{}, jobWithFooAndBarEI.ExternalJobID)` $DIR/core/services/webhook/authorizer_test.go: `can, err = a.CanRun(testutils.Context(t), eiEnabledCfg{}, jobWithBarEI.ExternalJobID)` $DIR/core/services/webhook/authorizer_test.go: `can, err = a.CanRun(testutils.Context(t), eiEnabledCfg{}, jobWithNoEI.ExternalJobID)` $DIR/core/services/webhook/authorizer_test.go: `can, err = a.CanRun(testutils.Context(t), eiEnabledCfg{}, uuid.New())` $DIR/core/services/webhook/authorizer_test.go: `.NewSqlxDB(t)` $DIR/core/services/webhook/authorizer_test.go: `.NewORM(db)` $DIR/core/services/webhook/authorizer_test.go: `.MustInsertExternalInitiator(t, borm)` $DIR/core/services/webhook/authorizer_test.go: `.MustInsertExternalInitiator(t, borm)` $DIR/core/services/webhook/authorizer_test.go: `.MustInsertWebhookSpec(t, db)` $DIR/core/services/webhook/authorizer_test.go: `.MustInsertWebhookSpec(t, db)` $DIR/core/services/webhook/authorizer_test.go: `.MustInsertWebhookSpec(t, db)` $DIR/core/services/webhook/authorizer_test.go: `.Exec(`INSERT INTO external_initiator_webhook_specs (external_initiator_id, webhook_spec_id, spec) VALUES ($1,$2,$3)`, eiFoo.ID, webhookSpecWithFooAndBarEI.ID, `{"ei": "foo", "name": "webhookSpecWithFooAndBarEI"}`)` $DIR/core/services/webhook/authorizer_test.go: `.Exec(`INSERT INTO external_initiator_webhook_specs (external_initiator_id, webhook_spec_id, spec) VALUES ($1,$2,$3)`, eiBar.ID, webhookSpecWithFooAndBarEI.ID, `{"ei": "bar", "name": "webhookSpecWithFooAndBarEI"}`)` $DIR/core/services/webhook/authorizer_test.go: `.Exec(`INSERT INTO external_initiator_webhook_specs (external_initiator_id, webhook_spec_id, spec) VALUES ($1,$2,$3)`, eiBar.ID, webhookSpecWithBarEI.ID, `{"ei": "bar", "name": "webhookSpecTwoEIs"}`)` $DIR/core/services/webhook/authorizer_test.go: `.Run("no user no ei never authorizes", func(t *testing.T) { a := webhook.NewAuthorizer(db, nil, nil) can, err := a.CanRun(testutils.Context(t), nil, jobWithFooAndBarEI.ExternalJobID) require.NoError(t, err) assert.False(t, can) can, err = a.CanRun(testutils.Context(t), nil, jobWithNoEI.ExternalJobID) require.NoError(t, err) assert.False(t, can) can, err = a.CanRun(testutils.Context(t), nil, uuid.New()) require.NoError(t, err) assert.False(t, can) })` $DIR/core/services/webhook/authorizer_test.go: `.NewAuthorizer(db, nil, nil)` $DIR/core/services/webhook/authorizer_test.go: `.CanRun(testutils.Context(t), nil, jobWithFooAndBarEI.ExternalJobID)` $DIR/core/services/webhook/authorizer_test.go: `.Context(t)` $DIR/core/services/webhook/authorizer_test.go: `.CanRun(testutils.Context(t), nil, jobWithNoEI.ExternalJobID)` $DIR/core/services/webhook/authorizer_test.go: `.Context(t)` $DIR/core/services/webhook/authorizer_test.go: `.CanRun(testutils.Context(t), nil, uuid.New())` $DIR/core/services/webhook/authorizer_test.go: `.Context(t)` $DIR/core/services/webhook/authorizer_test.go: `.New()` $DIR/core/services/webhook/authorizer_test.go: `.Run("with user no ei always authorizes", func(t *testing.T) { a := webhook.NewAuthorizer(db, &sessions.User{}, nil) can, err := a.CanRun(testutils.Context(t), nil, jobWithFooAndBarEI.ExternalJobID) require.NoError(t, err) assert.True(t, can) can, err = a.CanRun(testutils.Context(t), nil, jobWithNoEI.ExternalJobID) require.NoError(t, err) assert.True(t, can) can, err = a.CanRun(testutils.Context(t), nil, uuid.New()) require.NoError(t, err) assert.True(t, can) })` $DIR/core/services/webhook/authorizer_test.go: `.NewAuthorizer(db, &sessions.User{}, nil)` $DIR/core/services/webhook/authorizer_test.go: `.CanRun(testutils.Context(t), nil, jobWithFooAndBarEI.ExternalJobID)` $DIR/core/services/webhook/authorizer_test.go: `.Context(t)` $DIR/core/services/webhook/authorizer_test.go: `.CanRun(testutils.Context(t), nil, jobWithNoEI.ExternalJobID)` $DIR/core/services/webhook/authorizer_test.go: `.Context(t)` $DIR/core/services/webhook/authorizer_test.go: `.CanRun(testutils.Context(t), nil, uuid.New())` $DIR/core/services/webhook/authorizer_test.go: `.Context(t)` $DIR/core/services/webhook/authorizer_test.go: `.New()` $DIR/core/services/webhook/authorizer_test.go: `.NewAuthorizer(db, nil, &eiFoo)` $DIR/core/services/webhook/authorizer_test.go: `.CanRun(testutils.Context(t), eiEnabledCfg{}, jobWithFooAndBarEI.ExternalJobID)` $DIR/core/services/webhook/authorizer_test.go: `.Context(t)` $DIR/core/services/webhook/authorizer_test.go: `.CanRun(testutils.Context(t), eiDisabledCfg{}, jobWithFooAndBarEI.ExternalJobID)` $DIR/core/services/webhook/authorizer_test.go: `.Context(t)` $DIR/core/services/webhook/authorizer_test.go: `.CanRun(testutils.Context(t), eiEnabledCfg{}, jobWithBarEI.ExternalJobID)` $DIR/core/services/webhook/authorizer_test.go: `.Context(t)` $DIR/core/services/webhook/authorizer_test.go: `.CanRun(testutils.Context(t), eiEnabledCfg{}, jobWithNoEI.ExternalJobID)` $DIR/core/services/webhook/authorizer_test.go: `.Context(t)` $DIR/core/services/webhook/authorizer_test.go: `.CanRun(testutils.Context(t), eiEnabledCfg{}, uuid.New())` $DIR/core/services/webhook/authorizer_test.go: `.Context(t)` $DIR/core/services/webhook/authorizer_test.go: `.New()` $DIR/core/services/webhook/delegate_test.go: `_, err = delegate.WebhookJobRunner().RunJob(ctx, spec.ExternalJobID, requestBody, meta)` $DIR/core/services/webhook/delegate_test.go: `err = service.Start(ctx)` $DIR/core/services/webhook/delegate_test.go: `runner.On("Run", mock.Anything, mock.AnythingOfType("*pipeline.Run"), mock.Anything, mock.Anything, mock.Anything). Return(false, nil). Run(func(args mock.Arguments) { run := args.Get(1).(*pipeline.Run) run.ID = int64(123) require.Equal(t, vars, run.Inputs.Val) }).Once()` $DIR/core/services/webhook/delegate_test.go: `run.ID = int64(123)` $DIR/core/services/webhook/delegate_test.go: `runner.On("Run", mock.Anything, mock.AnythingOfType("*pipeline.Run"), mock.Anything, mock.Anything, mock.Anything). Return(false, expectedErr).Once()` $DIR/core/services/webhook/delegate_test.go: `_, err = delegate.WebhookJobRunner().RunJob(ctx, spec.ExternalJobID, requestBody, meta)` $DIR/core/services/webhook/delegate_test.go: `err = service.Close()` $DIR/core/services/webhook/delegate_test.go: `_, err = delegate.WebhookJobRunner().RunJob(ctx, spec.ExternalJobID, requestBody, meta)` $DIR/core/services/webhook/delegate_test.go: `.Context(t)` $DIR/core/services/webhook/delegate_test.go: `.StringFrom("sergtoshi stevemoto")` $DIR/core/services/webhook/delegate_test.go: `.New()` $DIR/core/services/webhook/delegate_test.go: `.Name.ValueOrZero()` $DIR/core/services/webhook/delegate_test.go: `.NewRunner(t)` $DIR/core/services/webhook/delegate_test.go: `.NewDelegate(runner, eiManager, logger.TestLogger(t))` $DIR/core/services/webhook/delegate_test.go: `.TestLogger(t)` $DIR/core/services/webhook/delegate_test.go: `.ServicesForSpec(ctx, *spec)` $DIR/core/services/webhook/delegate_test.go: `.WebhookJobRunner()` $DIR/core/services/webhook/delegate_test.go: `.RunJob(ctx, spec.ExternalJobID, requestBody, meta)` $DIR/core/services/webhook/delegate_test.go: `.Start(ctx)` $DIR/core/services/webhook/delegate_test.go: `.On("Run", mock.Anything, mock.AnythingOfType("*pipeline.Run"), mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/webhook/delegate_test.go: `.AnythingOfType("*pipeline.Run")` $DIR/core/services/webhook/delegate_test.go: `. Return(false, nil)` $DIR/core/services/webhook/delegate_test.go: `. Run(func(args mock.Arguments) { run := args.Get(1).(*pipeline.Run) run.ID = int64(123) require.Equal(t, vars, run.Inputs.Val) })` $DIR/core/services/webhook/delegate_test.go: `.Get(1)` $DIR/core/services/webhook/delegate_test.go: `.Once()` $DIR/core/services/webhook/delegate_test.go: `.WebhookJobRunner()` $DIR/core/services/webhook/delegate_test.go: `.RunJob(ctx, spec.ExternalJobID, requestBody, meta)` $DIR/core/services/webhook/delegate_test.go: `.New("foo bar")` $DIR/core/services/webhook/delegate_test.go: `.On("Run", mock.Anything, mock.AnythingOfType("*pipeline.Run"), mock.Anything, mock.Anything, mock.Anything)` $DIR/core/services/webhook/delegate_test.go: `.AnythingOfType("*pipeline.Run")` $DIR/core/services/webhook/delegate_test.go: `. Return(false, expectedErr)` $DIR/core/services/webhook/delegate_test.go: `.Once()` $DIR/core/services/webhook/delegate_test.go: `.WebhookJobRunner()` $DIR/core/services/webhook/delegate_test.go: `.RunJob(ctx, spec.ExternalJobID, requestBody, meta)` $DIR/core/services/webhook/delegate_test.go: `.WebhookJobRunner()` $DIR/core/services/webhook/delegate_test.go: `.RunJob(ctx, spec.ExternalJobID, requestBody, meta)` $DIR/core/services/webhook/delegate_test.go: `.Cause(err)` $DIR/core/services/webhook/external_initiator_manager_test.go: `pgtest.MustExec(t, db, `INSERT INTO external_initiator_webhook_specs (external_initiator_id, webhook_spec_id, spec) VALUES ($1,$2,$3)`, eiFoo.ID, webhookSpecTwoEIs.ID, `{"ei": "foo", "name": "webhookSpecTwoEIs"}`)` $DIR/core/services/webhook/external_initiator_manager_test.go: `pgtest.MustExec(t, db, `INSERT INTO external_initiator_webhook_specs (external_initiator_id, webhook_spec_id, spec) VALUES ($1,$2,$3)`, eiBar.ID, webhookSpecTwoEIs.ID, `{"ei": "bar", "name": "webhookSpecTwoEIs"}`)` $DIR/core/services/webhook/external_initiator_manager_test.go: `pgtest.MustExec(t, db, `INSERT INTO external_initiator_webhook_specs (external_initiator_id, webhook_spec_id, spec) VALUES ($1,$2,$3)`, eiFoo.ID, webhookSpecOneEI.ID, `{"ei": "foo", "name": "webhookSpecOneEI"}`)` $DIR/core/services/webhook/external_initiator_manager_test.go: `eiWebhookSpecs, jobID, err = eim.Load(ctx, webhookSpecOneEI.ID)` $DIR/core/services/webhook/external_initiator_manager_test.go: `eiWebhookSpecs, jobID, err = eim.Load(ctx, webhookSpecTwoEIs.ID)` $DIR/core/services/webhook/external_initiator_manager_test.go: `pgtest.MustExec(t, db, `INSERT INTO external_initiator_webhook_specs (external_initiator_id, webhook_spec_id, spec) VALUES ($1,$2,$3)`, eiWithURL.ID, webhookSpecTwoEIs.ID, `{"ei": "foo", "name": "webhookSpecTwoEIs"}`)` $DIR/core/services/webhook/external_initiator_manager_test.go: `pgtest.MustExec(t, db, `INSERT INTO external_initiator_webhook_specs (external_initiator_id, webhook_spec_id, spec) VALUES ($1,$2,$3)`, eiNoURL.ID, webhookSpecTwoEIs.ID, `{"ei": "bar", "name": "webhookSpecTwoEIs"}`)` $DIR/core/services/webhook/external_initiator_manager_test.go: `client.On("Do", mock.MatchedBy(func(r *http.Request) bool { body, err := r.GetBody() require.NoError(t, err) b, err := io.ReadAll(body) require.NoError(t, err) assert.Equal(t, jb.ExternalJobID.String(), gjson.GetBytes(b, "jobId").Str) assert.Equal(t, eiWithURL.Name, gjson.GetBytes(b, "type").Str) assert.Equal(t, `{"ei":"foo","name":"webhookSpecTwoEIs"}`, gjson.GetBytes(b, "params").Raw) return r.Method == "POST" && r.URL.String() == eiWithURL.URL.String() && r.Header["Content-Type"][0] == "application/json" && r.Header["X-Chainlink-Ea-Accesskey"][0] == "token" && r.Header["X-Chainlink-Ea-Secret"][0] == "secret" })).Once().Return(&http.Response{StatusCode: 200, Body: io.NopCloser(strings.NewReader(""))}, nil)` $DIR/core/services/webhook/external_initiator_manager_test.go: `pgtest.MustExec(t, db, `INSERT INTO external_initiator_webhook_specs (external_initiator_id, webhook_spec_id, spec) VALUES ($1,$2,$3)`, eiWithURL.ID, webhookSpecTwoEIs.ID, `{"ei": "foo", "name": "webhookSpecTwoEIs"}`)` $DIR/core/services/webhook/external_initiator_manager_test.go: `pgtest.MustExec(t, db, `INSERT INTO external_initiator_webhook_specs (external_initiator_id, webhook_spec_id, spec) VALUES ($1,$2,$3)`, eiNoURL.ID, webhookSpecTwoEIs.ID, `{"ei": "bar", "name": "webhookSpecTwoEIs"}`)` $DIR/core/services/webhook/external_initiator_manager_test.go: `client.On("Do", mock.MatchedBy(func(r *http.Request) bool { expectedURL := fmt.Sprintf("%s/%s", eiWithURL.URL.String(), jb.ExternalJobID.String()) return r.Method == "DELETE" && r.URL.String() == expectedURL && r.Header["Content-Type"][0] == "application/json" && r.Header["X-Chainlink-Ea-Accesskey"][0] == "token" && r.Header["X-Chainlink-Ea-Secret"][0] == "secret" })).Once().Return(&http.Response{StatusCode: 200, Body: io.NopCloser(strings.NewReader(""))}, nil)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.Context(t)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.NewSqlxDB(t)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.NewORM(db)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.MustInsertExternalInitiator(t, borm)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.MustInsertExternalInitiator(t, borm)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.MustInsertWebhookSpec(t, db)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.MustInsertWebhookSpec(t, db)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.MustInsertWebhookSpec(t, db)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.MustExec(t, db, `INSERT INTO external_initiator_webhook_specs (external_initiator_id, webhook_spec_id, spec) VALUES ($1,$2,$3)`, eiFoo.ID, webhookSpecTwoEIs.ID, `{"ei": "foo", "name": "webhookSpecTwoEIs"}`)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.MustExec(t, db, `INSERT INTO external_initiator_webhook_specs (external_initiator_id, webhook_spec_id, spec) VALUES ($1,$2,$3)`, eiBar.ID, webhookSpecTwoEIs.ID, `{"ei": "bar", "name": "webhookSpecTwoEIs"}`)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.MustExec(t, db, `INSERT INTO external_initiator_webhook_specs (external_initiator_id, webhook_spec_id, spec) VALUES ($1,$2,$3)`, eiFoo.ID, webhookSpecOneEI.ID, `{"ei": "foo", "name": "webhookSpecOneEI"}`)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.NewExternalInitiatorManager(db, nil)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.Load(ctx, webhookSpecNoEIs.ID)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.Load(ctx, webhookSpecOneEI.ID)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.Load(ctx, webhookSpecTwoEIs.ID)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.Context(t)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.NewSqlxDB(t)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.NewORM(db)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.MustInsertExternalInitiatorWithOpts(t, borm, cltest.ExternalInitiatorOpts{ URL: cltest.MustWebURL(t, "http://example.com/foo"), OutgoingSecret: "secret", OutgoingToken: "token", })` $DIR/core/services/webhook/external_initiator_manager_test.go: `.MustWebURL(t, "http://example.com/foo")` $DIR/core/services/webhook/external_initiator_manager_test.go: `.MustInsertExternalInitiator(t, borm)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.MustInsertWebhookSpec(t, db)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.MustInsertWebhookSpec(t, db)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.MustExec(t, db, `INSERT INTO external_initiator_webhook_specs (external_initiator_id, webhook_spec_id, spec) VALUES ($1,$2,$3)`, eiWithURL.ID, webhookSpecTwoEIs.ID, `{"ei": "foo", "name": "webhookSpecTwoEIs"}`)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.MustExec(t, db, `INSERT INTO external_initiator_webhook_specs (external_initiator_id, webhook_spec_id, spec) VALUES ($1,$2,$3)`, eiNoURL.ID, webhookSpecTwoEIs.ID, `{"ei": "bar", "name": "webhookSpecTwoEIs"}`)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.NewHTTPClient(t)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.NewExternalInitiatorManager(db, client)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.On("Do", mock.MatchedBy(func(r *http.Request) bool { body, err := r.GetBody() require.NoError(t, err) b, err := io.ReadAll(body) require.NoError(t, err) assert.Equal(t, jb.ExternalJobID.String(), gjson.GetBytes(b, "jobId").Str) assert.Equal(t, eiWithURL.Name, gjson.GetBytes(b, "type").Str) assert.Equal(t, `{"ei":"foo","name":"webhookSpecTwoEIs"}`, gjson.GetBytes(b, "params").Raw) return r.Method == "POST" && r.URL.String() == eiWithURL.URL.String() && r.Header["Content-Type"][0] == "application/json" && r.Header["X-Chainlink-Ea-Accesskey"][0] == "token" && r.Header["X-Chainlink-Ea-Secret"][0] == "secret" }))` $DIR/core/services/webhook/external_initiator_manager_test.go: `.MatchedBy(func(r *http.Request) bool { body, err := r.GetBody() require.NoError(t, err) b, err := io.ReadAll(body) require.NoError(t, err) assert.Equal(t, jb.ExternalJobID.String(), gjson.GetBytes(b, "jobId").Str) assert.Equal(t, eiWithURL.Name, gjson.GetBytes(b, "type").Str) assert.Equal(t, `{"ei":"foo","name":"webhookSpecTwoEIs"}`, gjson.GetBytes(b, "params").Raw) return r.Method == "POST" && r.URL.String() == eiWithURL.URL.String() && r.Header["Content-Type"][0] == "application/json" && r.Header["X-Chainlink-Ea-Accesskey"][0] == "token" && r.Header["X-Chainlink-Ea-Secret"][0] == "secret" })` $DIR/core/services/webhook/external_initiator_manager_test.go: `.GetBody()` $DIR/core/services/webhook/external_initiator_manager_test.go: `.ReadAll(body)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.URL.String()` $DIR/core/services/webhook/external_initiator_manager_test.go: `.URL.String()` $DIR/core/services/webhook/external_initiator_manager_test.go: `.Once()` $DIR/core/services/webhook/external_initiator_manager_test.go: `.Return(&http.Response{StatusCode: 200, Body: io.NopCloser(strings.NewReader(""))}, nil)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.NopCloser(strings.NewReader(""))` $DIR/core/services/webhook/external_initiator_manager_test.go: `.NewReader("")` $DIR/core/services/webhook/external_initiator_manager_test.go: `.Notify(ctx, webhookSpecTwoEIs.ID)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.Context(t)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.NewSqlxDB(t)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.NewORM(db)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.MustInsertExternalInitiatorWithOpts(t, borm, cltest.ExternalInitiatorOpts{ URL: cltest.MustWebURL(t, "http://example.com/foo"), OutgoingSecret: "secret", OutgoingToken: "token", })` $DIR/core/services/webhook/external_initiator_manager_test.go: `.MustWebURL(t, "http://example.com/foo")` $DIR/core/services/webhook/external_initiator_manager_test.go: `.MustInsertExternalInitiator(t, borm)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.MustInsertWebhookSpec(t, db)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.MustInsertWebhookSpec(t, db)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.MustExec(t, db, `INSERT INTO external_initiator_webhook_specs (external_initiator_id, webhook_spec_id, spec) VALUES ($1,$2,$3)`, eiWithURL.ID, webhookSpecTwoEIs.ID, `{"ei": "foo", "name": "webhookSpecTwoEIs"}`)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.MustExec(t, db, `INSERT INTO external_initiator_webhook_specs (external_initiator_id, webhook_spec_id, spec) VALUES ($1,$2,$3)`, eiNoURL.ID, webhookSpecTwoEIs.ID, `{"ei": "bar", "name": "webhookSpecTwoEIs"}`)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.NewHTTPClient(t)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.NewExternalInitiatorManager(db, client)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.On("Do", mock.MatchedBy(func(r *http.Request) bool { expectedURL := fmt.Sprintf("%s/%s", eiWithURL.URL.String(), jb.ExternalJobID.String()) return r.Method == "DELETE" && r.URL.String() == expectedURL && r.Header["Content-Type"][0] == "application/json" && r.Header["X-Chainlink-Ea-Accesskey"][0] == "token" && r.Header["X-Chainlink-Ea-Secret"][0] == "secret" }))` $DIR/core/services/webhook/external_initiator_manager_test.go: `.MatchedBy(func(r *http.Request) bool { expectedURL := fmt.Sprintf("%s/%s", eiWithURL.URL.String(), jb.ExternalJobID.String()) return r.Method == "DELETE" && r.URL.String() == expectedURL && r.Header["Content-Type"][0] == "application/json" && r.Header["X-Chainlink-Ea-Accesskey"][0] == "token" && r.Header["X-Chainlink-Ea-Secret"][0] == "secret" })` $DIR/core/services/webhook/external_initiator_manager_test.go: `.Sprintf("%s/%s", eiWithURL.URL.String(), jb.ExternalJobID.String())` $DIR/core/services/webhook/external_initiator_manager_test.go: `.URL.String()` $DIR/core/services/webhook/external_initiator_manager_test.go: `.ExternalJobID.String()` $DIR/core/services/webhook/external_initiator_manager_test.go: `.URL.String()` $DIR/core/services/webhook/external_initiator_manager_test.go: `.Once()` $DIR/core/services/webhook/external_initiator_manager_test.go: `.Return(&http.Response{StatusCode: 200, Body: io.NopCloser(strings.NewReader(""))}, nil)` $DIR/core/services/webhook/external_initiator_manager_test.go: `.NopCloser(strings.NewReader(""))` $DIR/core/services/webhook/external_initiator_manager_test.go: `.NewReader("")` $DIR/core/services/webhook/external_initiator_manager_test.go: `.DeleteJob(ctx, webhookSpecTwoEIs.ID)` $DIR/core/services/webhook/validate_test.go: `err = jsonapi.Unmarshal(b, &r)` $DIR/core/services/webhook/validate_test.go: `eim.On("FindExternalInitiatorByName", mock.Anything, "foo").Return(bridges.ExternalInitiator{ID: 42}, nil).Once()` $DIR/core/services/webhook/validate_test.go: `eim.On("FindExternalInitiatorByName", mock.Anything, "bar").Return(bridges.ExternalInitiator{ID: 43}, nil).Once()` $DIR/core/services/webhook/validate_test.go: `err = jsonapi.Unmarshal(b, &r)` $DIR/core/services/webhook/validate_test.go: `eim.On("FindExternalInitiatorByName", mock.Anything, "foo").Return(bridges.ExternalInitiator{ID: 42}, nil).Once()` $DIR/core/services/webhook/validate_test.go: `eim.On("FindExternalInitiatorByName", mock.Anything, "bar").Return(bridges.ExternalInitiator{}, errors.New("something exploded")).Once()` $DIR/core/services/webhook/validate_test.go: `eim.On("FindExternalInitiatorByName", mock.Anything, "baz").Return(bridges.ExternalInitiator{}, errors.New("something exploded")).Once()` $DIR/core/services/webhook/validate_test.go: `t.Run(tc.name, func(t *testing.T) { t.Parallel() ctx := testutils.Context(t) eim := new(webhookmocks.ExternalInitiatorManager) if tc.mock != nil { tc.mock(t, eim) } s, err := webhook.ValidatedWebhookSpec(ctx, tc.toml, eim) tc.assertion(t, s, err) })` $DIR/core/services/webhook/validate_test.go: `tc.mock(t, eim)` $DIR/core/services/webhook/validate_test.go: `tc.assertion(t, s, err)` $DIR/core/services/webhook/validate_test.go: `.Marshal(s.WebhookSpec)` $DIR/core/services/webhook/validate_test.go: `.Unmarshal(b, &r)` $DIR/core/services/webhook/validate_test.go: `.On("FindExternalInitiatorByName", mock.Anything, "foo")` $DIR/core/services/webhook/validate_test.go: `.Return(bridges.ExternalInitiator{ID: 42}, nil)` $DIR/core/services/webhook/validate_test.go: `.Once()` $DIR/core/services/webhook/validate_test.go: `.On("FindExternalInitiatorByName", mock.Anything, "bar")` $DIR/core/services/webhook/validate_test.go: `.Return(bridges.ExternalInitiator{ID: 43}, nil)` $DIR/core/services/webhook/validate_test.go: `.Once()` $DIR/core/services/webhook/validate_test.go: `.Marshal(s.WebhookSpec)` $DIR/core/services/webhook/validate_test.go: `.Unmarshal(b, &r)` $DIR/core/services/webhook/validate_test.go: `.On("FindExternalInitiatorByName", mock.Anything, "foo")` $DIR/core/services/webhook/validate_test.go: `.Return(bridges.ExternalInitiator{ID: 42}, nil)` $DIR/core/services/webhook/validate_test.go: `.Once()` $DIR/core/services/webhook/validate_test.go: `.On("FindExternalInitiatorByName", mock.Anything, "bar")` $DIR/core/services/webhook/validate_test.go: `.Return(bridges.ExternalInitiator{}, errors.New("something exploded"))` $DIR/core/services/webhook/validate_test.go: `.New("something exploded")` $DIR/core/services/webhook/validate_test.go: `.Once()` $DIR/core/services/webhook/validate_test.go: `.On("FindExternalInitiatorByName", mock.Anything, "baz")` $DIR/core/services/webhook/validate_test.go: `.Return(bridges.ExternalInitiator{}, errors.New("something exploded"))` $DIR/core/services/webhook/validate_test.go: `.New("something exploded")` $DIR/core/services/webhook/validate_test.go: `.Once()` $DIR/core/services/webhook/validate_test.go: `.Run(tc.name, func(t *testing.T) { t.Parallel() ctx := testutils.Context(t) eim := new(webhookmocks.ExternalInitiatorManager) if tc.mock != nil { tc.mock(t, eim) } s, err := webhook.ValidatedWebhookSpec(ctx, tc.toml, eim) tc.assertion(t, s, err) })` $DIR/core/services/webhook/validate_test.go: `.Context(t)` $DIR/core/services/webhook/validate_test.go: `.mock(t, eim)` $DIR/core/services/webhook/validate_test.go: `.ValidatedWebhookSpec(ctx, tc.toml, eim)` $DIR/core/services/webhook/validate_test.go: `.assertion(t, s, err)` $DIR/core/services/workflows/delegate_test.go: `t.Run(tc.name, func(t *testing.T) { _, err := workflows.ValidatedWorkflowSpec(tc.workflowTomlFn()) if tc.valid { require.NoError(t, err) } else { require.Error(t, err) } })` $DIR/core/services/workflows/delegate_test.go: `.GenerateWorkflowSpec(workflowId, workflowOwner, "1234567890", "")` $DIR/core/services/workflows/delegate_test.go: `.Toml()` $DIR/core/services/workflows/delegate_test.go: `.GenerateWorkflowSpec(id, owner, validName, "")` $DIR/core/services/workflows/delegate_test.go: `.Toml()` $DIR/core/services/workflows/delegate_test.go: `.GenerateWorkflowSpec(id, owner, validName, "{}")` $DIR/core/services/workflows/delegate_test.go: `.Toml()` $DIR/core/services/workflows/delegate_test.go: `.GenerateWorkflowSpec(id, owner, "", wf)` $DIR/core/services/workflows/delegate_test.go: `.Toml()` $DIR/core/services/workflows/delegate_test.go: `.GenerateWorkflowSpec(id, owner, validName, wf)` $DIR/core/services/workflows/delegate_test.go: `.Toml()` $DIR/core/services/workflows/delegate_test.go: `.GenerateWorkflowSpec(id, owner, validName+"1", wf)` $DIR/core/services/workflows/delegate_test.go: `.Toml()` $DIR/core/services/workflows/delegate_test.go: `.GenerateWorkflowSpec(id, owner, validName, workflow)` $DIR/core/services/workflows/delegate_test.go: `.Toml()` $DIR/core/services/workflows/delegate_test.go: `.Run(tc.name, func(t *testing.T) { _, err := workflows.ValidatedWorkflowSpec(tc.workflowTomlFn()) if tc.valid { require.NoError(t, err) } else { require.Error(t, err) } })` $DIR/core/services/workflows/delegate_test.go: `.ValidatedWorkflowSpec(tc.workflowTomlFn())` $DIR/core/services/workflows/delegate_test.go: `.workflowTomlFn()` $DIR/core/services/workflows/engine_test.go: `t.Run(tc.name, func(t *testing.T) { ctx := testutils.Context(t) reg := coreCap.NewRegistry(logger.TestLogger(t)) trigger, cr := mockTrigger(t) require.NoError(t, reg.Add(ctx, trigger)) require.NoError(t, reg.Add(ctx, mockConsensus())) target1 := mockTarget() require.NoError(t, reg.Add(ctx, target1)) target2 := newMockCapability( capabilities.MustNewCapabilityInfo( "write_ethereum-testnet-sepolia@1.0.0", capabilities.CapabilityTypeTarget, "a write capability targeting ethereum sepolia testnet", ), func(req capabilities.CapabilityRequest) (capabilities.CapabilityResponse, error) { m := req.Inputs.Underlying["report"].(*values.Map) return capabilities.CapabilityResponse{ Value: m, }, nil }, ) require.NoError(t, reg.Add(ctx, target2)) eng, testHooks := newTestEngine( t, reg, hardcodedWorkflow, func(c *Config) { c.Store = tc.store }, ) err := eng.Start(ctx) require.NoError(t, err) defer eng.Close() eid := getExecutionId(t, eng, testHooks) assert.Equal(t, cr, <-target1.response) assert.Equal(t, cr, <-target2.response) state, err := eng.executionStates.Get(ctx, eid) require.NoError(t, err) assert.Equal(t, state.Status, store.StatusCompleted) })` $DIR/core/services/workflows/engine_test.go: `c.Store = tc.store` $DIR/core/services/workflows/engine_test.go: `err = dbstore.Add(ctx, ec)` $DIR/core/services/workflows/engine_test.go: `c.Store = dbstore` $DIR/core/services/workflows/engine_test.go: `err = eng.Start(ctx)` $DIR/core/services/workflows/engine_test.go: `err = dbstore.Add(ctx, ec)` $DIR/core/services/workflows/engine_test.go: `c.Store = dbstore` $DIR/core/services/workflows/engine_test.go: `c.clock = clock` $DIR/core/services/workflows/engine_test.go: `clock.Advance(15 * time.Minute)` $DIR/core/services/workflows/engine_test.go: `err = eng.Start(ctx)` $DIR/core/services/workflows/engine_test.go: `_ = getExecutionId(t, eng, hooks)` $DIR/core/services/workflows/engine_test.go: `.NewDBStore(pgtest.NewSqlxDB(t), clockwork.NewFakeClock())` $DIR/core/services/workflows/engine_test.go: `.NewSqlxDB(t)` $DIR/core/services/workflows/engine_test.go: `.NewFakeClock()` $DIR/core/services/workflows/engine_test.go: `.NewInMemoryStore()` $DIR/core/services/workflows/engine_test.go: `.Run(tc.name, func(t *testing.T) { ctx := testutils.Context(t) reg := coreCap.NewRegistry(logger.TestLogger(t)) trigger, cr := mockTrigger(t) require.NoError(t, reg.Add(ctx, trigger)) require.NoError(t, reg.Add(ctx, mockConsensus())) target1 := mockTarget() require.NoError(t, reg.Add(ctx, target1)) target2 := newMockCapability( capabilities.MustNewCapabilityInfo( "write_ethereum-testnet-sepolia@1.0.0", capabilities.CapabilityTypeTarget, "a write capability targeting ethereum sepolia testnet", ), func(req capabilities.CapabilityRequest) (capabilities.CapabilityResponse, error) { m := req.Inputs.Underlying["report"].(*values.Map) return capabilities.CapabilityResponse{ Value: m, }, nil }, ) require.NoError(t, reg.Add(ctx, target2)) eng, testHooks := newTestEngine( t, reg, hardcodedWorkflow, func(c *Config) { c.Store = tc.store }, ) err := eng.Start(ctx) require.NoError(t, err) defer eng.Close() eid := getExecutionId(t, eng, testHooks) assert.Equal(t, cr, <-target1.response) assert.Equal(t, cr, <-target2.response) state, err := eng.executionStates.Get(ctx, eid) require.NoError(t, err) assert.Equal(t, state.Status, store.StatusCompleted) })` $DIR/core/services/workflows/engine_test.go: `.Context(t)` $DIR/core/services/workflows/engine_test.go: `.NewRegistry(logger.TestLogger(t))` $DIR/core/services/workflows/engine_test.go: `.TestLogger(t)` $DIR/core/services/workflows/engine_test.go: `.MustNewCapabilityInfo( "write_ethereum-testnet-sepolia@1.0.0", capabilities.CapabilityTypeTarget, "a write capability targeting ethereum sepolia testnet", )` $DIR/core/services/workflows/engine_test.go: `.Start(ctx)` $DIR/core/services/workflows/engine_test.go: `.executionStates.Get(ctx, eid)` $DIR/core/services/workflows/engine_test.go: `.Context(t)` $DIR/core/services/workflows/engine_test.go: `.NewRegistry(logger.TestLogger(t))` $DIR/core/services/workflows/engine_test.go: `.TestLogger(t)` $DIR/core/services/workflows/engine_test.go: `.Start(ctx)` $DIR/core/services/workflows/engine_test.go: `.executionStates.Get(ctx, eid)` $DIR/core/services/workflows/engine_test.go: `.Context(t)` $DIR/core/services/workflows/engine_test.go: `.NewRegistry(logger.TestLogger(t))` $DIR/core/services/workflows/engine_test.go: `.TestLogger(t)` $DIR/core/services/workflows/engine_test.go: `.Start(ctx)` $DIR/core/services/workflows/engine_test.go: `.executionStates.Get(ctx, eid)` $DIR/core/services/workflows/engine_test.go: `.Context(t)` $DIR/core/services/workflows/engine_test.go: `.NewRegistry(logger.TestLogger(t))` $DIR/core/services/workflows/engine_test.go: `.TestLogger(t)` $DIR/core/services/workflows/engine_test.go: `.Start(ctx)` $DIR/core/services/workflows/engine_test.go: `.executionStates.Get(ctx, eid)` $DIR/core/services/workflows/engine_test.go: `.Unwrap(inputs)` $DIR/core/services/workflows/engine_test.go: `.Unwrap(cr.Value)` $DIR/core/services/workflows/engine_test.go: `.Unwrap(out)` $DIR/core/services/workflows/engine_test.go: `.Context(t)` $DIR/core/services/workflows/engine_test.go: `.NewRegistry(logger.TestLogger(t))` $DIR/core/services/workflows/engine_test.go: `.TestLogger(t)` $DIR/core/services/workflows/engine_test.go: `.NewMap(map[string]any{ "123": decimal.NewFromFloat(1.00), "456": decimal.NewFromFloat(1.25), "789": decimal.NewFromFloat(1.50), })` $DIR/core/services/workflows/engine_test.go: `.NewFromFloat(1.00)` $DIR/core/services/workflows/engine_test.go: `.NewFromFloat(1.25)` $DIR/core/services/workflows/engine_test.go: `.NewFromFloat(1.50)` $DIR/core/services/workflows/engine_test.go: `.NewDBStore(pgtest.NewSqlxDB(t), clockwork.NewFakeClock())` $DIR/core/services/workflows/engine_test.go: `.NewSqlxDB(t)` $DIR/core/services/workflows/engine_test.go: `.NewFakeClock()` $DIR/core/services/workflows/engine_test.go: `.Add(ctx, ec)` $DIR/core/services/workflows/engine_test.go: `.Start(ctx)` $DIR/core/services/workflows/engine_test.go: `.Get(ctx, eid)` $DIR/core/services/workflows/engine_test.go: `.Context(t)` $DIR/core/services/workflows/engine_test.go: `.NewRegistry(logger.TestLogger(t))` $DIR/core/services/workflows/engine_test.go: `.TestLogger(t)` $DIR/core/services/workflows/engine_test.go: `.NewMap(map[string]any{ "123": decimal.NewFromFloat(1.00), "456": decimal.NewFromFloat(1.25), "789": decimal.NewFromFloat(1.50), })` $DIR/core/services/workflows/engine_test.go: `.NewFromFloat(1.00)` $DIR/core/services/workflows/engine_test.go: `.NewFromFloat(1.25)` $DIR/core/services/workflows/engine_test.go: `.NewFromFloat(1.50)` $DIR/core/services/workflows/engine_test.go: `.NewFakeClock()` $DIR/core/services/workflows/engine_test.go: `.NewDBStore(pgtest.NewSqlxDB(t), clock)` $DIR/core/services/workflows/engine_test.go: `.NewSqlxDB(t)` $DIR/core/services/workflows/engine_test.go: `.Add(ctx, ec)` $DIR/core/services/workflows/engine_test.go: `.Advance(15 * time.Minute)` $DIR/core/services/workflows/engine_test.go: `.Start(ctx)` $DIR/core/services/workflows/engine_test.go: `.Get(ctx, "")` $DIR/core/services/workflows/models_test.go: `t.Run(tc.name, func(st *testing.T) { wf, err := Parse(tc.yaml) if tc.errMsg != "" { assert.ErrorContains(st, err, tc.errMsg) } else { require.NoError(st, err) adjacencies, err := wf.AdjacencyMap() require.NoError(t, err) got := map[string]map[string]struct{}{} for k, v := range adjacencies { if _, ok := got[k]; !ok { got[k] = map[string]struct{}{} } for adj := range v { got[k][adj] = struct{}{} } } assert.Equal(st, tc.graph, got, adjacencies) } })` $DIR/core/services/workflows/models_test.go: `got[k] = map[string]struct{}{}` $DIR/core/services/workflows/models_test.go: `got[k][adj] = struct{}{}` $DIR/core/services/workflows/models_test.go: `.Run(tc.name, func(st *testing.T) { wf, err := Parse(tc.yaml) if tc.errMsg != "" { assert.ErrorContains(st, err, tc.errMsg) } else { require.NoError(st, err) adjacencies, err := wf.AdjacencyMap() require.NoError(t, err) got := map[string]map[string]struct{}{} for k, v := range adjacencies { if _, ok := got[k]; !ok { got[k] = map[string]struct{}{} } for adj := range v { got[k][adj] = struct{}{} } } assert.Equal(st, tc.graph, got, adjacencies) } })` $DIR/core/services/workflows/models_test.go: `.AdjacencyMap()` $DIR/core/services/workflows/models_test.go: `.Vertex("evm_median")` $DIR/core/services/workflows/retryable_test.go: `retries++` $DIR/core/services/workflows/retryable_test.go: `attempts++` $DIR/core/services/workflows/retryable_test.go: `time.Sleep(150 * time.Millisecond)` $DIR/core/services/workflows/retryable_test.go: `cancel()` $DIR/core/services/workflows/retryable_test.go: `.WithTimeout(context.Background(), 500*time.Millisecond)` $DIR/core/services/workflows/retryable_test.go: `.Background()` $DIR/core/services/workflows/retryable_test.go: `.New("test error")` $DIR/core/services/workflows/retryable_test.go: `.WithCancel(context.Background())` $DIR/core/services/workflows/retryable_test.go: `.Background()` $DIR/core/services/workflows/retryable_test.go: `.WithCancel(context.Background())` $DIR/core/services/workflows/retryable_test.go: `.Background()` $DIR/core/services/workflows/retryable_test.go: `.New("test error")` $DIR/core/services/workflows/retryable_test.go: `.WithCancel(context.Background())` $DIR/core/services/workflows/retryable_test.go: `.Background()` $DIR/core/services/workflows/retryable_test.go: `.New("immediate failure")` $DIR/core/services/workflows/retryable_test.go: `.WithCancel(context.Background())` $DIR/core/services/workflows/retryable_test.go: `.Background()` $DIR/core/services/workflows/retryable_test.go: `.New("persistent error")` $DIR/core/services/workflows/retryable_test.go: `.WithCancel(context.Background())` $DIR/core/services/workflows/retryable_test.go: `.Background()` $DIR/core/services/workflows/retryable_test.go: `.New("test error")` $DIR/core/services/workflows/retryable_test.go: `.Sleep(150 * time.Millisecond)` $DIR/core/services/workflows/state_test.go: `t.Run(tc.name, func(st *testing.T) { got, err := interpolateKey(tc.key, tc.state) if tc.errMsg != "" { require.ErrorContains(st, err, tc.errMsg) } else { require.NoError(t, err) assert.Equal(t, tc.expected, got) } })` $DIR/core/services/workflows/state_test.go: `t.Run(tc.name, func(st *testing.T) { got, err := findAndInterpolateAllKeys(tc.inputs, tc.state) if tc.errMsg != "" { require.ErrorContains(st, err, tc.errMsg) } else { require.NoError(t, err) assert.Equal(t, tc.expected, got) } })` $DIR/core/services/workflows/state_test.go: `.NewMap( map[string]any{ "reports": map[string]any{ "inner": "key", }, "reportsList": []any{ "listElement", }, }, )` $DIR/core/services/workflows/state_test.go: `.NewString("")` $DIR/core/services/workflows/state_test.go: `.NewString("")` $DIR/core/services/workflows/state_test.go: `.New("catastrophic error")` $DIR/core/services/workflows/state_test.go: `.Run(tc.name, func(st *testing.T) { got, err := interpolateKey(tc.key, tc.state) if tc.errMsg != "" { require.ErrorContains(st, err, tc.errMsg) } else { require.NoError(t, err) assert.Equal(t, tc.expected, got) } })` $DIR/core/services/workflows/state_test.go: `.NewString("")` $DIR/core/services/workflows/state_test.go: `.NewString("")` $DIR/core/services/workflows/state_test.go: `.Run(tc.name, func(st *testing.T) { got, err := findAndInterpolateAllKeys(tc.inputs, tc.state) if tc.errMsg != "" { require.ErrorContains(st, err, tc.errMsg) } else { require.NoError(t, err) assert.Equal(t, tc.expected, got) } })` $DIR/core/services/workflows/store/store_db_test.go: `gotEs.CreatedAt = nil` $DIR/core/services/workflows/store/store_db_test.go: `err = store.Add(tests.Context(t), &es)` $DIR/core/services/workflows/store/store_db_test.go: `err = store.UpdateStatus(tests.Context(t), es.ExecutionID, "completed")` $DIR/core/services/workflows/store/store_db_test.go: `stepOne.Status = "completed"` $DIR/core/services/workflows/store/store_db_test.go: `stepOne.Inputs = nm` $DIR/core/services/workflows/store/store_db_test.go: `stepOne.Outputs = StepOutput{Err: errors.New("some error")}` $DIR/core/services/workflows/store/store_db_test.go: `es, err = store.UpsertStep(tests.Context(t), stepOne)` $DIR/core/services/workflows/store/store_db_test.go: `stepTwo.Outputs = StepOutput{Value: nm}` $DIR/core/services/workflows/store/store_db_test.go: `es, err = store.UpsertStep(tests.Context(t), stepTwo)` $DIR/core/services/workflows/store/store_db_test.go: `gotStep = es.Steps[stepTwo.Ref]` $DIR/core/services/workflows/store/store_db_test.go: `id = randomID()` $DIR/core/services/workflows/store/store_db_test.go: `err = store.Add(tests.Context(t), &esTwo)` $DIR/core/services/workflows/store/store_db_test.go: `states[0].CreatedAt = nil` $DIR/core/services/workflows/store/store_db_test.go: `.NewSqlxDB(t)` $DIR/core/services/workflows/store/store_db_test.go: `.NewFakeClock()` $DIR/core/services/workflows/store/store_db_test.go: `.Add(tests.Context(t), &es)` $DIR/core/services/workflows/store/store_db_test.go: `.Context(t)` $DIR/core/services/workflows/store/store_db_test.go: `.Get(tests.Context(t), es.ExecutionID)` $DIR/core/services/workflows/store/store_db_test.go: `.Context(t)` $DIR/core/services/workflows/store/store_db_test.go: `.NewSqlxDB(t)` $DIR/core/services/workflows/store/store_db_test.go: `.NewFakeClock()` $DIR/core/services/workflows/store/store_db_test.go: `.Add(tests.Context(t), &es)` $DIR/core/services/workflows/store/store_db_test.go: `.Context(t)` $DIR/core/services/workflows/store/store_db_test.go: `.Add(tests.Context(t), &es)` $DIR/core/services/workflows/store/store_db_test.go: `.Context(t)` $DIR/core/services/workflows/store/store_db_test.go: `.NewSqlxDB(t)` $DIR/core/services/workflows/store/store_db_test.go: `.NewFakeClock()` $DIR/core/services/workflows/store/store_db_test.go: `.Add(tests.Context(t), &es)` $DIR/core/services/workflows/store/store_db_test.go: `.Context(t)` $DIR/core/services/workflows/store/store_db_test.go: `.UpdateStatus(tests.Context(t), es.ExecutionID, "completed")` $DIR/core/services/workflows/store/store_db_test.go: `.Context(t)` $DIR/core/services/workflows/store/store_db_test.go: `.Get(tests.Context(t), es.ExecutionID)` $DIR/core/services/workflows/store/store_db_test.go: `.Context(t)` $DIR/core/services/workflows/store/store_db_test.go: `.NewSqlxDB(t)` $DIR/core/services/workflows/store/store_db_test.go: `.NewFakeClock()` $DIR/core/services/workflows/store/store_db_test.go: `.Add(tests.Context(t), &es)` $DIR/core/services/workflows/store/store_db_test.go: `.Context(t)` $DIR/core/services/workflows/store/store_db_test.go: `.NewMap(map[string]any{"hello": "world"})` $DIR/core/services/workflows/store/store_db_test.go: `.New("some error")` $DIR/core/services/workflows/store/store_db_test.go: `.UpsertStep(tests.Context(t), stepOne)` $DIR/core/services/workflows/store/store_db_test.go: `.Context(t)` $DIR/core/services/workflows/store/store_db_test.go: `.UpsertStep(tests.Context(t), stepTwo)` $DIR/core/services/workflows/store/store_db_test.go: `.Context(t)` $DIR/core/services/workflows/store/store_db_test.go: `.NewSqlxDB(t)` $DIR/core/services/workflows/store/store_db_test.go: `.NewFakeClock()` $DIR/core/services/workflows/store/store_db_test.go: `.Add(tests.Context(t), &es)` $DIR/core/services/workflows/store/store_db_test.go: `.Context(t)` $DIR/core/services/workflows/store/store_db_test.go: `.Add(tests.Context(t), &esTwo)` $DIR/core/services/workflows/store/store_db_test.go: `.Context(t)` $DIR/core/services/workflows/store/store_db_test.go: `.GetUnfinished(tests.Context(t), 0, 100)` $DIR/core/services/workflows/store/store_db_test.go: `.Context(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapClient.On("CreateEphemeralConnection").Return(mockLdapConnProvider, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapConnProvider.On("Close").Return(nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapConnProvider.On("Search", mock.AnythingOfType("*ldap.SearchRequest")).Return(&expectedResults, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapClient.On("CreateEphemeralConnection").Return(mockLdapConnProvider, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapConnProvider.On("Close").Return(nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapConnProvider.On("Search", mock.AnythingOfType("*ldap.SearchRequest")).Return(&expectedResults, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapClient.On("CreateEphemeralConnection").Return(mockLdapConnProvider, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapConnProvider.On("Close").Return(nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapConnProvider.On("Search", mock.AnythingOfType("*ldap.SearchRequest")).Return(&expectedResults, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapClient.On("CreateEphemeralConnection").Return(mockLdapConnProvider, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapConnProvider.On("Close").Return(nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapConnProvider.On("Search", mock.AnythingOfType("*ldap.SearchRequest")).Return(&expectedResults, nil).Once()` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapConnProvider.On("Search", mock.AnythingOfType("*ldap.SearchRequest")).Return(&expectedGroupResults, nil).Once()` $DIR/core/sessions/ldapauth/ldap_test.go: `_, err = ldapAuthProvider.FindUserByAPIToken(ctx, apiToken)` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapClient.On("CreateEphemeralConnection").Return(mockLdapConnProvider, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapConnProvider.On("Close").Return(nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapConnProvider.On("Search", mock.AnythingOfType("*ldap.SearchRequest")).Return(&ldap.SearchResult{ Entries: []*ldap.Entry{ { DN: fmt.Sprintf("cn=%s,ou=Groups,dc=example,dc=com", ldapauth.NodeAdminsGroupCN), Attributes: []*ldap.EntryAttribute{ { Name: ldapauth.UniqueMemberAttribute, Values: []string{ fmt.Sprintf("uid=%s,ou=users,dc=example,dc=com", user1.Email), fmt.Sprintf("uid=%s,ou=users,dc=example,dc=com", user2.Email), }, }, }, }, }, }, nil).Once()` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapConnProvider.On("Search", mock.AnythingOfType("*ldap.SearchRequest")).Return(&ldap.SearchResult{ Entries: []*ldap.Entry{ { DN: fmt.Sprintf("cn=%s,ou=Groups,dc=example,dc=com", ldapauth.NodeEditorsGroupCN), Attributes: []*ldap.EntryAttribute{ { Name: ldapauth.UniqueMemberAttribute, Values: []string{ fmt.Sprintf("uid=%s,ou=users,dc=example,dc=com", user3.Email), }, }, }, }, }, }, nil).Once()` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapConnProvider.On("Search", mock.AnythingOfType("*ldap.SearchRequest")).Return(&ldap.SearchResult{ Entries: []*ldap.Entry{ { DN: "cn=NodeRunners,ou=Groups,dc=example,dc=com", Attributes: []*ldap.EntryAttribute{ { Name: ldapauth.UniqueMemberAttribute, Values: []string{ fmt.Sprintf("uid=%s,ou=users,dc=example,dc=com", user4.Email), fmt.Sprintf("uid=%s,ou=users,dc=example,dc=com", user4.Email), // Test deduped fmt.Sprintf("uid=%s,ou=users,dc=example,dc=com", user5.Email), }, }, }, }, }, }, nil).Once()` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapConnProvider.On("Search", mock.AnythingOfType("*ldap.SearchRequest")).Return(&ldap.SearchResult{ Entries: []*ldap.Entry{ { DN: "cn=NodeReadOnly,ou=Groups,dc=example,dc=com", Attributes: []*ldap.EntryAttribute{ { Name: ldapauth.UniqueMemberAttribute, Values: []string{ fmt.Sprintf("uid=%s,ou=users,dc=example,dc=com", user6.Email), }, }, }, }, }, }, nil).Once()` $DIR/core/sessions/ldapauth/ldap_test.go: `listUpstreamUsersQuery.Entries = append(listUpstreamUsersQuery.Entries, &ldap.Entry{ DN: "cn=User,ou=Users,dc=example,dc=com", Attributes: []*ldap.EntryAttribute{ { Name: "organizationalStatus", Values: []string{upstreamUser.active}, }, { Name: "uid", Values: []string{upstreamUser.email}, }, }, }, )` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapConnProvider.On("Search", mock.AnythingOfType("*ldap.SearchRequest")).Return(&listUpstreamUsersQuery, nil).Once()` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapClient.On("CreateEphemeralConnection").Return(mockLdapConnProvider, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapConnProvider.On("Close").Return(nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapConnProvider.On("Search", mock.AnythingOfType("*ldap.SearchRequest")).Return(&expectedResults, nil).Once()` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapConnProvider.On("Search", mock.AnythingOfType("*ldap.SearchRequest")).Return(&expectedGroupResults, nil).Once()` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapConnProvider.On("Bind", mock.Anything, cltest.Password).Return(nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapClient.On("CreateEphemeralConnection").Return(mockLdapConnProvider, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapConnProvider.On("Close").Return(nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapConnProvider.On("Bind", mock.Anything, cltest.Password).Return(errors.New("unable to login via LDAP server")).Once()` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapConnProvider.On("Bind", mock.Anything, "incorrect-password").Return(errors.New("unable to login via LDAP server")).Once()` $DIR/core/sessions/ldapauth/ldap_test.go: `sessionRequest = sessions.SessionRequest{ Email: cltest.APIEmailAdmin, Password: "incorrect-password", }` $DIR/core/sessions/ldapauth/ldap_test.go: `_, err = ldapAuthProvider.CreateSession(ctx, sessionRequest)` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapClient.On("CreateEphemeralConnection").Return(mockLdapConnProvider, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapConnProvider.On("Close").Return(nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapConnProvider.On("Bind", mock.Anything, cltest.Password).Return(errors.New("unable to login via LDAP server")).Once()` $DIR/core/sessions/ldapauth/ldap_test.go: `mockLdapConnProvider.On("Bind", mock.Anything, "incorrect-password").Return(errors.New("unable to login via LDAP server")).Once()` $DIR/core/sessions/ldapauth/ldap_test.go: `sessionRequest = sessions.SessionRequest{ Email: cltest.APIEmailAdmin, Password: "incorrect-password", }` $DIR/core/sessions/ldapauth/ldap_test.go: `_, err = ldapAuthProvider.CreateSession(ctx, sessionRequest)` $DIR/core/sessions/ldapauth/ldap_test.go: `t.Run(test.name, func(t *testing.T) { role, err := ldapauth.GroupSearchResultsToUserRole( test.groupsQuerySearchResult, cfg.AdminUserGroupCN(), cfg.EditUserGroupCN(), cfg.RunUserGroupCN(), cfg.ReadUserGroupCN(), ) if test.wantErr != nil { assert.Equal(t, test.wantErr, err) } else { assert.Equal(t, test.wantMappedRole, role) } })` $DIR/core/sessions/ldapauth/ldap_test.go: `.Context(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.NewLDAPClient(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.NewLDAPConn(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("CreateEphemeralConnection")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(mockLdapConnProvider, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("Close")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("Search", mock.AnythingOfType("*ldap.SearchRequest"))` $DIR/core/sessions/ldapauth/ldap_test.go: `.AnythingOfType("*ldap.SearchRequest")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(&expectedResults, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.FindUser(ctx, "unknown-user")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Context(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.NewLDAPClient(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.NewLDAPConn(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("CreateEphemeralConnection")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(mockLdapConnProvider, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("Close")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.MustRandomUser(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("Search", mock.AnythingOfType("*ldap.SearchRequest"))` $DIR/core/sessions/ldapauth/ldap_test.go: `.AnythingOfType("*ldap.SearchRequest")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(&expectedResults, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.FindUser(ctx, user1.Email)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Context(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.NewLDAPClient(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.NewLDAPConn(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("CreateEphemeralConnection")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(mockLdapConnProvider, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("Close")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.MustRandomUser(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("Search", mock.AnythingOfType("*ldap.SearchRequest"))` $DIR/core/sessions/ldapauth/ldap_test.go: `.AnythingOfType("*ldap.SearchRequest")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(&expectedResults, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.FindUser(ctx, user1.Email)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Context(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.NewLDAPClient(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.NewLDAPConn(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("CreateEphemeralConnection")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(mockLdapConnProvider, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("Close")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.MustRandomUser(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("Search", mock.AnythingOfType("*ldap.SearchRequest"))` $DIR/core/sessions/ldapauth/ldap_test.go: `.AnythingOfType("*ldap.SearchRequest")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(&expectedResults, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Once()` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("Search", mock.AnythingOfType("*ldap.SearchRequest"))` $DIR/core/sessions/ldapauth/ldap_test.go: `.AnythingOfType("*ldap.SearchRequest")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(&expectedGroupResults, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Once()` $DIR/core/sessions/ldapauth/ldap_test.go: `.FindUser(ctx, user1.Email)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Context(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.NewLDAPClient(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.FindUser(ctx, cltest.APIEmailAdmin)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Context(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.NewLDAPClient(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Exec("INSERT INTO ldap_user_api_tokens values ($1, 'edit', false, $2, '', '', now())", testEmail, apiToken)` $DIR/core/sessions/ldapauth/ldap_test.go: `.FindUserByAPIToken(ctx, apiToken)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Context(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.NewLDAPClient(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Now()` $DIR/core/sessions/ldapauth/ldap_test.go: `.Add(-cfg.UserAPITokenDuration().Duration())` $DIR/core/sessions/ldapauth/ldap_test.go: `.UserAPITokenDuration()` $DIR/core/sessions/ldapauth/ldap_test.go: `.Duration()` $DIR/core/sessions/ldapauth/ldap_test.go: `.Exec("INSERT INTO ldap_user_api_tokens values ($1, 'edit', false, $2, '', '', $3)", testEmail, apiToken, expiredTime)` $DIR/core/sessions/ldapauth/ldap_test.go: `.FindUserByAPIToken(ctx, apiToken)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Context(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.NewLDAPClient(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.NewLDAPConn(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("CreateEphemeralConnection")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(mockLdapConnProvider, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("Close")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.MustRandomUser(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.MustRandomUser(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.MustRandomUser(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.MustRandomUser(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.MustRandomUser(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.MustRandomUser(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("Search", mock.AnythingOfType("*ldap.SearchRequest"))` $DIR/core/sessions/ldapauth/ldap_test.go: `.AnythingOfType("*ldap.SearchRequest")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(&ldap.SearchResult{ Entries: []*ldap.Entry{ { DN: fmt.Sprintf("cn=%s,ou=Groups,dc=example,dc=com", ldapauth.NodeAdminsGroupCN), Attributes: []*ldap.EntryAttribute{ { Name: ldapauth.UniqueMemberAttribute, Values: []string{ fmt.Sprintf("uid=%s,ou=users,dc=example,dc=com", user1.Email), fmt.Sprintf("uid=%s,ou=users,dc=example,dc=com", user2.Email), }, }, }, }, }, }, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Sprintf("cn=%s,ou=Groups,dc=example,dc=com", ldapauth.NodeAdminsGroupCN)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Sprintf("uid=%s,ou=users,dc=example,dc=com", user1.Email)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Sprintf("uid=%s,ou=users,dc=example,dc=com", user2.Email)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Once()` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("Search", mock.AnythingOfType("*ldap.SearchRequest"))` $DIR/core/sessions/ldapauth/ldap_test.go: `.AnythingOfType("*ldap.SearchRequest")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(&ldap.SearchResult{ Entries: []*ldap.Entry{ { DN: fmt.Sprintf("cn=%s,ou=Groups,dc=example,dc=com", ldapauth.NodeEditorsGroupCN), Attributes: []*ldap.EntryAttribute{ { Name: ldapauth.UniqueMemberAttribute, Values: []string{ fmt.Sprintf("uid=%s,ou=users,dc=example,dc=com", user3.Email), }, }, }, }, }, }, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Sprintf("cn=%s,ou=Groups,dc=example,dc=com", ldapauth.NodeEditorsGroupCN)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Sprintf("uid=%s,ou=users,dc=example,dc=com", user3.Email)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Once()` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("Search", mock.AnythingOfType("*ldap.SearchRequest"))` $DIR/core/sessions/ldapauth/ldap_test.go: `.AnythingOfType("*ldap.SearchRequest")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(&ldap.SearchResult{ Entries: []*ldap.Entry{ { DN: "cn=NodeRunners,ou=Groups,dc=example,dc=com", Attributes: []*ldap.EntryAttribute{ { Name: ldapauth.UniqueMemberAttribute, Values: []string{ fmt.Sprintf("uid=%s,ou=users,dc=example,dc=com", user4.Email), fmt.Sprintf("uid=%s,ou=users,dc=example,dc=com", user4.Email), // Test deduped fmt.Sprintf("uid=%s,ou=users,dc=example,dc=com", user5.Email), }, }, }, }, }, }, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Sprintf("uid=%s,ou=users,dc=example,dc=com", user4.Email)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Sprintf("uid=%s,ou=users,dc=example,dc=com", user4.Email)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Sprintf("uid=%s,ou=users,dc=example,dc=com", user5.Email)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Once()` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("Search", mock.AnythingOfType("*ldap.SearchRequest"))` $DIR/core/sessions/ldapauth/ldap_test.go: `.AnythingOfType("*ldap.SearchRequest")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(&ldap.SearchResult{ Entries: []*ldap.Entry{ { DN: "cn=NodeReadOnly,ou=Groups,dc=example,dc=com", Attributes: []*ldap.EntryAttribute{ { Name: ldapauth.UniqueMemberAttribute, Values: []string{ fmt.Sprintf("uid=%s,ou=users,dc=example,dc=com", user6.Email), }, }, }, }, }, }, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Sprintf("uid=%s,ou=users,dc=example,dc=com", user6.Email)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Once()` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("Search", mock.AnythingOfType("*ldap.SearchRequest"))` $DIR/core/sessions/ldapauth/ldap_test.go: `.AnythingOfType("*ldap.SearchRequest")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(&listUpstreamUsersQuery, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Once()` $DIR/core/sessions/ldapauth/ldap_test.go: `.ListUsers(ctx)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Context(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.NewLDAPClient(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.NewLDAPConn(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("CreateEphemeralConnection")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(mockLdapConnProvider, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("Close")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.MustRandomUser(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("Search", mock.AnythingOfType("*ldap.SearchRequest"))` $DIR/core/sessions/ldapauth/ldap_test.go: `.AnythingOfType("*ldap.SearchRequest")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(&expectedResults, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Once()` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("Search", mock.AnythingOfType("*ldap.SearchRequest"))` $DIR/core/sessions/ldapauth/ldap_test.go: `.AnythingOfType("*ldap.SearchRequest")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(&expectedGroupResults, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Once()` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("Bind", mock.Anything, cltest.Password)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.CreateSession(ctx, sessionRequest)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Context(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.NewLDAPClient(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.NewLDAPConn(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("CreateEphemeralConnection")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(mockLdapConnProvider, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("Close")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("Bind", mock.Anything, cltest.Password)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(errors.New("unable to login via LDAP server"))` $DIR/core/sessions/ldapauth/ldap_test.go: `.New("unable to login via LDAP server")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Once()` $DIR/core/sessions/ldapauth/ldap_test.go: `.CreateSession(ctx, sessionRequest)` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("Bind", mock.Anything, "incorrect-password")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(errors.New("unable to login via LDAP server"))` $DIR/core/sessions/ldapauth/ldap_test.go: `.New("unable to login via LDAP server")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Once()` $DIR/core/sessions/ldapauth/ldap_test.go: `.CreateSession(ctx, sessionRequest)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Context(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.NewLDAPClient(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.NewLDAPConn(t)` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("CreateEphemeralConnection")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(mockLdapConnProvider, nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("Close")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(nil)` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("Bind", mock.Anything, cltest.Password)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(errors.New("unable to login via LDAP server"))` $DIR/core/sessions/ldapauth/ldap_test.go: `.New("unable to login via LDAP server")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Once()` $DIR/core/sessions/ldapauth/ldap_test.go: `.CreateSession(ctx, sessionRequest)` $DIR/core/sessions/ldapauth/ldap_test.go: `.On("Bind", mock.Anything, "incorrect-password")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Return(errors.New("unable to login via LDAP server"))` $DIR/core/sessions/ldapauth/ldap_test.go: `.New("unable to login via LDAP server")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Once()` $DIR/core/sessions/ldapauth/ldap_test.go: `.CreateSession(ctx, sessionRequest)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Sprintf("cn=%s,ou=Groups,dc=example,dc=com", ldapauth.NodeAdminsGroupCN)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Sprintf("cn=%s,ou=Groups,dc=example,dc=com", ldapauth.NodeEditorsGroupCN)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Sprintf("cn=%s,ou=Groups,dc=example,dc=com", ldapauth.NodeRunnersGroupCN)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Sprintf("cn=%s,ou=Groups,dc=example,dc=com", ldapauth.NodeReadOnlyGroupCN)` $DIR/core/sessions/ldapauth/ldap_test.go: `.UserRole("")` $DIR/core/sessions/ldapauth/ldap_test.go: `.Sprintf("cn=%s,ou=Groups,dc=example,dc=com", ldapauth.NodeRunnersGroupCN)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Sprintf("cn=%s,ou=Groups,dc=example,dc=com", ldapauth.NodeReadOnlyGroupCN)` $DIR/core/sessions/ldapauth/ldap_test.go: `.Run(test.name, func(t *testing.T) { role, err := ldapauth.GroupSearchResultsToUserRole( test.groupsQuerySearchResult, cfg.AdminUserGroupCN(), cfg.EditUserGroupCN(), cfg.RunUserGroupCN(), cfg.ReadUserGroupCN(), ) if test.wantErr != nil { assert.Equal(t, test.wantErr, err) } else { assert.Equal(t, test.wantMappedRole, role) } })` $DIR/core/sessions/ldapauth/ldap_test.go: `.GroupSearchResultsToUserRole( test.groupsQuerySearchResult, cfg.AdminUserGroupCN(), cfg.EditUserGroupCN(), cfg.RunUserGroupCN(), cfg.ReadUserGroupCN(), )` $DIR/core/sessions/ldapauth/ldap_test.go: `.AdminUserGroupCN()` $DIR/core/sessions/ldapauth/ldap_test.go: `.EditUserGroupCN()` $DIR/core/sessions/ldapauth/ldap_test.go: `.RunUserGroupCN()` $DIR/core/sessions/ldapauth/ldap_test.go: `.ReadUserGroupCN()` $DIR/core/sessions/localauth/orm_test.go: `t.Run(test.name, func(t *testing.T) { ctx := testutils.Context(t) db := pgtest.NewSqlxDB(t) orm := localauth.NewORM(db, test.sessionDuration, logger.TestLogger(t), &audit.AuditLoggerService{}) user := cltest.MustRandomUser(t) require.NoError(t, orm.CreateUser(ctx, &user)) prevSession := cltest.NewSession("correctID") prevSession.LastUsed = time.Now().Add(-cltest.MustParseDuration(t, "2m")) _, err := db.Exec("INSERT INTO sessions (id, email, last_used, created_at) VALUES ($1, $2, $3, now())", prevSession.ID, user.Email, prevSession.LastUsed) require.NoError(t, err) expectedTime := utils.ISO8601UTC(time.Now()) actual, err := orm.AuthorizedUserWithSession(ctx, test.sessionID) if test.wantError != "" { require.EqualError(t, err, test.wantError) } else { require.NoError(t, err) assert.Equal(t, user.Email, actual.Email) var bumpedSession sessions.Session err = db.Get(&bumpedSession, "SELECT * FROM sessions WHERE ID = $1", prevSession.ID) require.NoError(t, err) assert.Equal(t, expectedTime[0:13], utils.ISO8601UTC(bumpedSession.LastUsed)[0:13]) // only compare up to the hour } })` $DIR/core/sessions/localauth/orm_test.go: `prevSession.LastUsed = time.Now().Add(-cltest.MustParseDuration(t, "2m"))` $DIR/core/sessions/localauth/orm_test.go: `err = db.Get(&bumpedSession, "SELECT * FROM sessions WHERE ID = $1", prevSession.ID)` $DIR/core/sessions/localauth/orm_test.go: `_, err = orm.FindUser(ctx, u.Email)` $DIR/core/sessions/localauth/orm_test.go: `err = orm.DeleteUserSession(ctx, session.ID)` $DIR/core/sessions/localauth/orm_test.go: `_, err = orm.FindUser(ctx, u.Email)` $DIR/core/sessions/localauth/orm_test.go: `err = orm.DeleteUser(ctx, u.Email)` $DIR/core/sessions/localauth/orm_test.go: `_, err = orm.FindUser(ctx, u.Email)` $DIR/core/sessions/localauth/orm_test.go: `t.Run(test.name, func(t *testing.T) { sessionRequest := sessions.SessionRequest{ Email: test.email, Password: test.password, } sessionID, err := orm.CreateSession(testutils.Context(t), sessionRequest) if test.wantSession { require.NoError(t, err) assert.NotEmpty(t, sessionID) } else { require.Error(t, err) assert.Empty(t, sessionID) } })` $DIR/core/sessions/localauth/orm_test.go: `was, err = orm.GetUserWebAuthn(ctx, initial.Email)` $DIR/core/sessions/localauth/orm_test.go: `_, err = orm.CreateSession(ctx, sessions.SessionRequest{ Email: initial.Email, Password: cltest.Password, })` $DIR/core/sessions/localauth/orm_test.go: `_, err = orm.CreateSession(ctx, sessions.SessionRequest{ Email: initial.Email, Password: cltest.Password, WebAuthnConfig: sessions.WebAuthnConfiguration{ RPID: "test-rpid", RPOrigin: "test-rporigin", }, SessionStore: ss, })` $DIR/core/sessions/localauth/orm_test.go: `_, err = orm.CreateSession(ctx, sessions.SessionRequest{ Email: initial.Email, Password: cltest.Password, WebAuthnConfig: sessions.WebAuthnConfiguration{ RPID: "test-rpid", RPOrigin: "test-rporigin", }, SessionStore: ss, WebAuthnData: "invalid-format", })` $DIR/core/sessions/localauth/orm_test.go: `_, err = orm.CreateSession(ctx, sessions.SessionRequest{ Email: initial.Email, Password: cltest.Password, WebAuthnConfig: sessions.WebAuthnConfiguration{ RPID: "test-rpid", RPOrigin: "test-rporigin", }, WebAuthnData: string(challengeResp), SessionStore: ss, })` $DIR/core/sessions/localauth/orm_test.go: `dbUser, err = orm.FindUser(ctx, initial.Email)` $DIR/core/sessions/localauth/orm_test.go: `.Context(t)` $DIR/core/sessions/localauth/orm_test.go: `.MustRandomUser(t)` $DIR/core/sessions/localauth/orm_test.go: `.MustRandomUser(t)` $DIR/core/sessions/localauth/orm_test.go: `.Exec("UPDATE users SET created_at = now() - interval '1 day' WHERE email = $1", user2.Email)` $DIR/core/sessions/localauth/orm_test.go: `.FindUser(ctx, user1.Email)` $DIR/core/sessions/localauth/orm_test.go: `.MustParseDuration(t, "3m")` $DIR/core/sessions/localauth/orm_test.go: `.MustParseDuration(t, "0m")` $DIR/core/sessions/localauth/orm_test.go: `.MustParseDuration(t, "3m")` $DIR/core/sessions/localauth/orm_test.go: `.MustParseDuration(t, "3m")` $DIR/core/sessions/localauth/orm_test.go: `.Run(test.name, func(t *testing.T) { ctx := testutils.Context(t) db := pgtest.NewSqlxDB(t) orm := localauth.NewORM(db, test.sessionDuration, logger.TestLogger(t), &audit.AuditLoggerService{}) user := cltest.MustRandomUser(t) require.NoError(t, orm.CreateUser(ctx, &user)) prevSession := cltest.NewSession("correctID") prevSession.LastUsed = time.Now().Add(-cltest.MustParseDuration(t, "2m")) _, err := db.Exec("INSERT INTO sessions (id, email, last_used, created_at) VALUES ($1, $2, $3, now())", prevSession.ID, user.Email, prevSession.LastUsed) require.NoError(t, err) expectedTime := utils.ISO8601UTC(time.Now()) actual, err := orm.AuthorizedUserWithSession(ctx, test.sessionID) if test.wantError != "" { require.EqualError(t, err, test.wantError) } else { require.NoError(t, err) assert.Equal(t, user.Email, actual.Email) var bumpedSession sessions.Session err = db.Get(&bumpedSession, "SELECT * FROM sessions WHERE ID = $1", prevSession.ID) require.NoError(t, err) assert.Equal(t, expectedTime[0:13], utils.ISO8601UTC(bumpedSession.LastUsed)[0:13]) // only compare up to the hour } })` $DIR/core/sessions/localauth/orm_test.go: `.Context(t)` $DIR/core/sessions/localauth/orm_test.go: `.NewSqlxDB(t)` $DIR/core/sessions/localauth/orm_test.go: `.NewORM(db, test.sessionDuration, logger.TestLogger(t), &audit.AuditLoggerService{})` $DIR/core/sessions/localauth/orm_test.go: `.TestLogger(t)` $DIR/core/sessions/localauth/orm_test.go: `.MustRandomUser(t)` $DIR/core/sessions/localauth/orm_test.go: `.NewSession("correctID")` $DIR/core/sessions/localauth/orm_test.go: `.Now()` $DIR/core/sessions/localauth/orm_test.go: `.Add(-cltest.MustParseDuration(t, "2m"))` $DIR/core/sessions/localauth/orm_test.go: `.MustParseDuration(t, "2m")` $DIR/core/sessions/localauth/orm_test.go: `.Exec("INSERT INTO sessions (id, email, last_used, created_at) VALUES ($1, $2, $3, now())", prevSession.ID, user.Email, prevSession.LastUsed)` $DIR/core/sessions/localauth/orm_test.go: `.ISO8601UTC(time.Now())` $DIR/core/sessions/localauth/orm_test.go: `.Now()` $DIR/core/sessions/localauth/orm_test.go: `.AuthorizedUserWithSession(ctx, test.sessionID)` $DIR/core/sessions/localauth/orm_test.go: `.Get(&bumpedSession, "SELECT * FROM sessions WHERE ID = $1", prevSession.ID)` $DIR/core/sessions/localauth/orm_test.go: `.Context(t)` $DIR/core/sessions/localauth/orm_test.go: `.MustRandomUser(t)` $DIR/core/sessions/localauth/orm_test.go: `.DeleteUser(ctx, u.Email)` $DIR/core/sessions/localauth/orm_test.go: `.FindUser(ctx, u.Email)` $DIR/core/sessions/localauth/orm_test.go: `.Context(t)` $DIR/core/sessions/localauth/orm_test.go: `.MustRandomUser(t)` $DIR/core/sessions/localauth/orm_test.go: `.NewSession()` $DIR/core/sessions/localauth/orm_test.go: `.Exec("INSERT INTO sessions (id, email, last_used, created_at) VALUES ($1, $2, now(), now())", session.ID, u.Email)` $DIR/core/sessions/localauth/orm_test.go: `.DeleteUserSession(ctx, session.ID)` $DIR/core/sessions/localauth/orm_test.go: `.FindUser(ctx, u.Email)` $DIR/core/sessions/localauth/orm_test.go: `.Sessions(ctx, 0, 10)` $DIR/core/sessions/localauth/orm_test.go: `.Context(t)` $DIR/core/sessions/localauth/orm_test.go: `.MustRandomUser(t)` $DIR/core/sessions/localauth/orm_test.go: `.NewSession()` $DIR/core/sessions/localauth/orm_test.go: `.Exec("INSERT INTO sessions (id, email, last_used, created_at) VALUES ($1, $2, now(), now())", session.ID, u.Email)` $DIR/core/sessions/localauth/orm_test.go: `.DeleteUser(ctx, u.Email)` $DIR/core/sessions/localauth/orm_test.go: `.FindUser(ctx, u.Email)` $DIR/core/sessions/localauth/orm_test.go: `.Sessions(ctx, 0, 10)` $DIR/core/sessions/localauth/orm_test.go: `.MustRandomUser(t)` $DIR/core/sessions/localauth/orm_test.go: `.Run(test.name, func(t *testing.T) { sessionRequest := sessions.SessionRequest{ Email: test.email, Password: test.password, } sessionID, err := orm.CreateSession(testutils.Context(t), sessionRequest) if test.wantSession { require.NoError(t, err) assert.NotEmpty(t, sessionID) } else { require.Error(t, err) assert.Empty(t, sessionID) } })` $DIR/core/sessions/localauth/orm_test.go: `.CreateSession(testutils.Context(t), sessionRequest)` $DIR/core/sessions/localauth/orm_test.go: `.Context(t)` $DIR/core/sessions/localauth/orm_test.go: `.Context(t)` $DIR/core/sessions/localauth/orm_test.go: `.MustRandomUser(t)` $DIR/core/sessions/localauth/orm_test.go: `.GetUserWebAuthn(ctx, initial.Email)` $DIR/core/sessions/localauth/orm_test.go: `.GetUserWebAuthn(ctx, initial.Email)` $DIR/core/sessions/localauth/orm_test.go: `.CreateSession(ctx, sessions.SessionRequest{ Email: initial.Email, Password: cltest.Password, })` $DIR/core/sessions/localauth/orm_test.go: `.NewWebAuthnSessionStore()` $DIR/core/sessions/localauth/orm_test.go: `.CreateSession(ctx, sessions.SessionRequest{ Email: initial.Email, Password: cltest.Password, WebAuthnConfig: sessions.WebAuthnConfiguration{ RPID: "test-rpid", RPOrigin: "test-rporigin", }, SessionStore: ss, })` $DIR/core/sessions/localauth/orm_test.go: `.CreateSession(ctx, sessions.SessionRequest{ Email: initial.Email, Password: cltest.Password, WebAuthnConfig: sessions.WebAuthnConfiguration{ RPID: "test-rpid", RPOrigin: "test-rporigin", }, SessionStore: ss, WebAuthnData: "invalid-format", })` $DIR/core/sessions/localauth/orm_test.go: `.Marshal(protocol.CredentialAssertionResponse{ PublicKeyCredential: protocol.PublicKeyCredential{ Credential: protocol.Credential{ ID: "test-id", Type: "test-type", }, }, })` $DIR/core/sessions/localauth/orm_test.go: `.CreateSession(ctx, sessions.SessionRequest{ Email: initial.Email, Password: cltest.Password, WebAuthnConfig: sessions.WebAuthnConfiguration{ RPID: "test-rpid", RPOrigin: "test-rporigin", }, WebAuthnData: string(challengeResp), SessionStore: ss, })` $DIR/core/sessions/localauth/orm_test.go: `.Context(t)` $DIR/core/sessions/localauth/orm_test.go: `.MustRandomUser(t)` $DIR/core/sessions/localauth/orm_test.go: `.CreateAndSetAuthToken(ctx, &initial)` $DIR/core/sessions/localauth/orm_test.go: `.FindUser(ctx, initial.Email)` $DIR/core/sessions/localauth/orm_test.go: `.HashedSecret(token, dbUser.TokenSalt.String)` $DIR/core/sessions/localauth/orm_test.go: `.FindUser(ctx, initial.Email)` $DIR/core/sessions/localauth/orm_test.go: `.TokenHashedSecret.ValueOrZero()` $DIR/core/sessions/localauth/reaper_test.go: `t.Cleanup(func() { assert.NoError(t, r.Stop()) })` $DIR/core/sessions/localauth/reaper_test.go: `t.Run(test.name, func(t *testing.T) { ctx := testutils.Context(t) t.Cleanup(func() { _, err2 := db.Exec("DELETE FROM sessions where email = $1", cltest.APIEmailAdmin) require.NoError(t, err2) }) _, err := db.Exec("INSERT INTO sessions (last_used, email, id, created_at) VALUES ($1, $2, $3, now())", test.lastUsed, cltest.APIEmailAdmin, test.name) require.NoError(t, err) r.WakeUp() if test.wantReap { gomega.NewWithT(t).Eventually(func() []sessions.Session { sessions, err := orm.Sessions(ctx, 0, 10) assert.NoError(t, err) return sessions }).Should(gomega.HaveLen(0)) } else { gomega.NewWithT(t).Consistently(func() []sessions.Session { sessions, err := orm.Sessions(ctx, 0, 10) assert.NoError(t, err) return sessions }).Should(gomega.HaveLen(1)) } })` $DIR/core/sessions/localauth/reaper_test.go: `t.Cleanup(func() { _, err2 := db.Exec("DELETE FROM sessions where email = $1", cltest.APIEmailAdmin) require.NoError(t, err2) })` $DIR/core/sessions/localauth/reaper_test.go: `r.WakeUp()` $DIR/core/sessions/localauth/reaper_test.go: `gomega.NewWithT(t).Eventually(func() []sessions.Session { sessions, err := orm.Sessions(ctx, 0, 10) assert.NoError(t, err) return sessions }).Should(gomega.HaveLen(0))` $DIR/core/sessions/localauth/reaper_test.go: `gomega.NewWithT(t).Consistently(func() []sessions.Session { sessions, err := orm.Sessions(ctx, 0, 10) assert.NoError(t, err) return sessions }).Should(gomega.HaveLen(1))` $DIR/core/sessions/localauth/reaper_test.go: `.NewSqlxDB(t)` $DIR/core/sessions/localauth/reaper_test.go: `.TestLogger(t)` $DIR/core/sessions/localauth/reaper_test.go: `.NewORM(db, config.SessionTimeout().Duration(), lggr, audit.NoopLogger)` $DIR/core/sessions/localauth/reaper_test.go: `.SessionTimeout()` $DIR/core/sessions/localauth/reaper_test.go: `.Duration()` $DIR/core/sessions/localauth/reaper_test.go: `.NewSessionReaper(db, config, lggr)` $DIR/core/sessions/localauth/reaper_test.go: `.Cleanup(func() { assert.NoError(t, r.Stop()) })` $DIR/core/sessions/localauth/reaper_test.go: `.Now()` $DIR/core/sessions/localauth/reaper_test.go: `.Now()` $DIR/core/sessions/localauth/reaper_test.go: `.Add(-config.SessionTimeout().Duration())` $DIR/core/sessions/localauth/reaper_test.go: `.SessionTimeout()` $DIR/core/sessions/localauth/reaper_test.go: `.Duration()` $DIR/core/sessions/localauth/reaper_test.go: `.Now()` $DIR/core/sessions/localauth/reaper_test.go: `.Add(-config.SessionReaperExpiration().Duration())` $DIR/core/sessions/localauth/reaper_test.go: `.SessionReaperExpiration()` $DIR/core/sessions/localauth/reaper_test.go: `.Duration()` $DIR/core/sessions/localauth/reaper_test.go: `.Now()` $DIR/core/sessions/localauth/reaper_test.go: `.Add(-config.SessionReaperExpiration().Duration())` $DIR/core/sessions/localauth/reaper_test.go: `.SessionReaperExpiration()` $DIR/core/sessions/localauth/reaper_test.go: `.Duration()` $DIR/core/sessions/localauth/reaper_test.go: `. Add(-config.SessionTimeout().Duration())` $DIR/core/sessions/localauth/reaper_test.go: `.SessionTimeout()` $DIR/core/sessions/localauth/reaper_test.go: `.Duration()` $DIR/core/sessions/localauth/reaper_test.go: `.Run(test.name, func(t *testing.T) { ctx := testutils.Context(t) t.Cleanup(func() { _, err2 := db.Exec("DELETE FROM sessions where email = $1", cltest.APIEmailAdmin) require.NoError(t, err2) }) _, err := db.Exec("INSERT INTO sessions (last_used, email, id, created_at) VALUES ($1, $2, $3, now())", test.lastUsed, cltest.APIEmailAdmin, test.name) require.NoError(t, err) r.WakeUp() if test.wantReap { gomega.NewWithT(t).Eventually(func() []sessions.Session { sessions, err := orm.Sessions(ctx, 0, 10) assert.NoError(t, err) return sessions }).Should(gomega.HaveLen(0)) } else { gomega.NewWithT(t).Consistently(func() []sessions.Session { sessions, err := orm.Sessions(ctx, 0, 10) assert.NoError(t, err) return sessions }).Should(gomega.HaveLen(1)) } })` $DIR/core/sessions/localauth/reaper_test.go: `.Context(t)` $DIR/core/sessions/localauth/reaper_test.go: `.Cleanup(func() { _, err2 := db.Exec("DELETE FROM sessions where email = $1", cltest.APIEmailAdmin) require.NoError(t, err2) })` $DIR/core/sessions/localauth/reaper_test.go: `.Exec("DELETE FROM sessions where email = $1", cltest.APIEmailAdmin)` $DIR/core/sessions/localauth/reaper_test.go: `.Exec("INSERT INTO sessions (last_used, email, id, created_at) VALUES ($1, $2, $3, now())", test.lastUsed, cltest.APIEmailAdmin, test.name)` $DIR/core/sessions/localauth/reaper_test.go: `.WakeUp()` $DIR/core/sessions/localauth/reaper_test.go: `.NewWithT(t)` $DIR/core/sessions/localauth/reaper_test.go: `.Eventually(func() []sessions.Session { sessions, err := orm.Sessions(ctx, 0, 10) assert.NoError(t, err) return sessions })` $DIR/core/sessions/localauth/reaper_test.go: `.Sessions(ctx, 0, 10)` $DIR/core/sessions/localauth/reaper_test.go: `.Should(gomega.HaveLen(0))` $DIR/core/sessions/localauth/reaper_test.go: `.HaveLen(0)` $DIR/core/sessions/localauth/reaper_test.go: `.NewWithT(t)` $DIR/core/sessions/localauth/reaper_test.go: `.Consistently(func() []sessions.Session { sessions, err := orm.Sessions(ctx, 0, 10) assert.NoError(t, err) return sessions })` $DIR/core/sessions/localauth/reaper_test.go: `.Sessions(ctx, 0, 10)` $DIR/core/sessions/localauth/reaper_test.go: `.Should(gomega.HaveLen(1))` $DIR/core/sessions/localauth/reaper_test.go: `.HaveLen(1)` $DIR/core/sessions/user_test.go: `t.Run(test.email, func(t *testing.T) { user, err := sessions.NewUser(test.email, test.pwd, test.role) if test.wantError { assert.Error(t, err) } else { assert.NoError(t, err) assert.Equal(t, test.email, user.Email) assert.Equal(t, test.role, user.Role) assert.NotEmpty(t, user.HashedPassword) newHash, _ := utils.HashPassword(test.pwd) assert.NotEqual(t, newHash, user.HashedPassword, "Salt should prevent equality") } })` $DIR/core/sessions/user_test.go: `_, err = user.GenerateAuthToken()` $DIR/core/sessions/user_test.go: `ok, err = sessions.AuthenticateUserByToken(token, &user)` $DIR/core/sessions/user_test.go: `.Run(test.email, func(t *testing.T) { user, err := sessions.NewUser(test.email, test.pwd, test.role) if test.wantError { assert.Error(t, err) } else { assert.NoError(t, err) assert.Equal(t, test.email, user.Email) assert.Equal(t, test.role, user.Role) assert.NotEmpty(t, user.HashedPassword) newHash, _ := utils.HashPassword(test.pwd) assert.NotEqual(t, newHash, user.HashedPassword, "Salt should prevent equality") } })` $DIR/core/sessions/user_test.go: `.NewUser(test.email, test.pwd, test.role)` $DIR/core/sessions/user_test.go: `.HashPassword(test.pwd)` $DIR/core/sessions/user_test.go: `.GenerateAuthToken()` $DIR/core/sessions/user_test.go: `.StringFrom(token.Secret)` $DIR/core/sessions/user_test.go: `.GenerateAuthToken()` $DIR/core/sessions/user_test.go: `.AuthenticateUserByToken(token, &user)` $DIR/core/sessions/user_test.go: `.GenerateAuthToken()` $DIR/core/sessions/user_test.go: `.AuthenticateUserByToken(token, &user)` $DIR/core/sessions/webauthn_test.go: `val, ok = s.take(key)` $DIR/core/sessions/webauthn_test.go: `_, err = s.GetWebauthnSession(key)` $DIR/core/sessions/webauthn_test.go: `_, err = s.FinishWebAuthnRegistration(user, uwas, nil, wcfg)` $DIR/core/sessions/webauthn_test.go: `.UserVerificationRequirement("test-user-verification")` $DIR/core/sessions/webauthn_test.go: `.take(key)` $DIR/core/sessions/webauthn_test.go: `.GetWebauthnSession(key)` $DIR/core/sessions/webauthn_test.go: `.take(key)` $DIR/core/sessions/webauthn_test.go: `.GetWebauthnSession(key)` $DIR/core/sessions/webauthn_test.go: `.Marshal(cred)` $DIR/core/sessions/webauthn_test.go: `.JSONText(credj)` $DIR/core/sessions/webauthn_test.go: `.BeginWebAuthnRegistration(user, uwas, wcfg)` $DIR/core/sessions/webauthn_test.go: `.FinishWebAuthnRegistration(user, uwas, nil, wcfg)` $DIR/core/shutdown/shutdown_test.go: `t.Run(name, func(t *testing.T) { ctx, cancel := context.WithCancel(testutils.Context(t)) go HandleShutdown(func(string) { cancel() }) // have to wait for ossignal.Notify time.Sleep(time.Second) err = proc.Signal(sig) require.NoError(t, err) select { case <-ctx.Done(): // all good case <-time.After(3 * time.Second): require.Fail(t, "context is not cancelled within 3 seconds") } })` $DIR/core/shutdown/shutdown_test.go: `cancel()` $DIR/core/shutdown/shutdown_test.go: `time.Sleep(time.Second)` $DIR/core/shutdown/shutdown_test.go: `err = proc.Signal(sig)` $DIR/core/shutdown/shutdown_test.go: `.FindProcess(os.Getpid())` $DIR/core/shutdown/shutdown_test.go: `.Getpid()` $DIR/core/shutdown/shutdown_test.go: `.Run(name, func(t *testing.T) { ctx, cancel := context.WithCancel(testutils.Context(t)) go HandleShutdown(func(string) { cancel() }) // have to wait for ossignal.Notify time.Sleep(time.Second) err = proc.Signal(sig) require.NoError(t, err) select { case <-ctx.Done(): // all good case <-time.After(3 * time.Second): require.Fail(t, "context is not cancelled within 3 seconds") } })` $DIR/core/shutdown/shutdown_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/shutdown/shutdown_test.go: `.Context(t)` $DIR/core/shutdown/shutdown_test.go: `.Sleep(time.Second)` $DIR/core/shutdown/shutdown_test.go: `.Signal(sig)` $DIR/core/shutdown/shutdown_test.go: `.Done()` $DIR/core/shutdown/shutdown_test.go: `.After(3 * time.Second)` $DIR/core/static/static_test.go: `t.Run(tt.ver+":"+tt.sha, func(t *testing.T) { sha, ver := short(tt.sha, tt.ver) assert.Equal(t, tt.expSha, sha) assert.Equal(t, tt.expVer, ver) })` $DIR/core/static/static_test.go: `.Run(tt.ver+":"+tt.sha, func(t *testing.T) { sha, ver := short(tt.sha, tt.ver) assert.Equal(t, tt.expSha, sha) assert.Equal(t, tt.expVer, ver) })` $DIR/core/store/migrate/migrate_test.go: `_, err = db.NamedExec(sql, jb.Offchainreporting2OracleSpec)` $DIR/core/store/migrate/migrate_test.go: `_, err = db.NamedExec(sql, nonBootstrapJob.Offchainreporting2OracleSpec)` $DIR/core/store/migrate/migrate_test.go: `_, err = db.NamedExec(sql, jb2.Offchainreporting2OracleSpec)` $DIR/core/store/migrate/migrate_test.go: `sql = `INSERT INTO bootstrap_specs (contract_id, relay, relay_config, monitoring_endpoint, blockchain_timeout, contract_config_tracker_poll_interval, contract_config_confirmations, created_at, updated_at) VALUES ( :contract_id, :relay, :relay_config, :monitoring_endpoint, :blockchain_timeout, :contract_config_tracker_poll_interval, :contract_config_confirmations, NOW(), NOW()) RETURNING id;`` $DIR/core/store/migrate/migrate_test.go: `_, err = db.NamedExec(sql, newFormatBootstrapJob.BootstrapSpec)` $DIR/core/store/migrate/migrate_test.go: `sql = `INSERT INTO jobs (id, pipeline_spec_id, external_job_id, schema_version, type, offchainreporting2_oracle_spec_id, bootstrap_spec_id, created_at) VALUES (:id, :pipeline_spec_id, :external_job_id, :schema_version, :type, :offchainreporting2_oracle_spec_id, :bootstrap_spec_id, NOW()) RETURNING *;`` $DIR/core/store/migrate/migrate_test.go: `_, err = db.NamedExec(sql, jb)` $DIR/core/store/migrate/migrate_test.go: `_, err = db.NamedExec(sql, nonBootstrapJob)` $DIR/core/store/migrate/migrate_test.go: `_, err = db.NamedExec(sql, jb2)` $DIR/core/store/migrate/migrate_test.go: `_, err = db.NamedExec(sql, newFormatBootstrapJob)` $DIR/core/store/migrate/migrate_test.go: `err = goose.UpByOne(db.DB, migrationDir)` $DIR/core/store/migrate/migrate_test.go: `sql = `SELECT * FROM bootstrap_specs;`` $DIR/core/store/migrate/migrate_test.go: `err = db.Select(&bootstrapSpecs, sql)` $DIR/core/store/migrate/migrate_test.go: `sql = `SELECT * FROM jobs ORDER BY created_at DESC, id DESC;`` $DIR/core/store/migrate/migrate_test.go: `err = db.Select(&jobs, sql)` $DIR/core/store/migrate/migrate_test.go: `err = db.Get(&resultingBootstrapSpec, `SELECT * FROM bootstrap_specs WHERE id = $1`, *migratedJob.BootstrapSpecID)` $DIR/core/store/migrate/migrate_test.go: `migratedJob.BootstrapSpec = &resultingBootstrapSpec` $DIR/core/store/migrate/migrate_test.go: `sql = `SELECT COUNT(*) FROM offchainreporting2_oracle_specs;`` $DIR/core/store/migrate/migrate_test.go: `err = db.Get(&count, sql)` $DIR/core/store/migrate/migrate_test.go: `err = goose.Down(db.DB, migrationDir)` $DIR/core/store/migrate/migrate_test.go: `sql = `SELECT * FROM jobs;`` $DIR/core/store/migrate/migrate_test.go: `err = db.Select(&oldJobs, sql)` $DIR/core/store/migrate/migrate_test.go: `sql = `SELECT contract_id, relay, relay_config, p2p_bootstrap_peers, ocr_key_bundle_id, transmitter_id, blockchain_timeout, contract_config_tracker_poll_interval, contract_config_confirmations, juels_per_fee_coin_pipeline, is_bootstrap_peer, monitoring_endpoint, created_at, updated_at FROM offchainreporting2_oracle_specs;`` $DIR/core/store/migrate/migrate_test.go: `err = db.Select(&oldOCR2Spec, sql)` $DIR/core/store/migrate/migrate_test.go: `sql = `SELECT COUNT(*) FROM bootstrap_specs;`` $DIR/core/store/migrate/migrate_test.go: `err = db.Get(&count, sql)` $DIR/core/store/migrate/migrate_test.go: `sql = `SELECT jobs.id, ocr2.contract_id FROM jobs INNER JOIN offchainreporting2_oracle_specs as ocr2 ON jobs.offchainreporting2_oracle_spec_id = ocr2.id`` $DIR/core/store/migrate/migrate_test.go: `err = db.Select(&jobsAndContracts, sql)` $DIR/core/store/migrate/migrate_test.go: `_, err = db.NamedExec(sql, spec)` $DIR/core/store/migrate/migrate_test.go: `err = goose.UpByOne(db.DB, migrationDir)` $DIR/core/store/migrate/migrate_test.go: `sql = `SELECT plugin_type, plugin_config FROM ocr2_oracle_specs`` $DIR/core/store/migrate/migrate_test.go: `err = db.Get(&pluginValues, sql)` $DIR/core/store/migrate/migrate_test.go: `err = goose.Down(db.DB, migrationDir)` $DIR/core/store/migrate/migrate_test.go: `sql = `SELECT plugin_type, plugin_config FROM offchainreporting2_oracle_specs`` $DIR/core/store/migrate/migrate_test.go: `err = db.Get(&pluginValues, sql)` $DIR/core/store/migrate/migrate_test.go: `sql = `SELECT juels_per_fee_coin_pipeline FROM offchainreporting2_oracle_specs`` $DIR/core/store/migrate/migrate_test.go: `err = db.Get(&juels, sql)` $DIR/core/store/migrate/migrate_test.go: `err = migrate.Status(ctx, db.DB)` $DIR/core/store/migrate/migrate_test.go: `err = migrate.Migrate(ctx, db.DB)` $DIR/core/store/migrate/migrate_test.go: `err = migrate.Rollback(ctx, db.DB, null.IntFrom(99))` $DIR/core/store/migrate/migrate_test.go: `ver, err = migrate.Current(ctx, db.DB)` $DIR/core/store/migrate/migrate_test.go: `t.Run("ValidEVMConfig", func(t *testing.T) { chainID := ubig.New(big.NewInt(1337)) testConfig := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { evmEnabled := true c.EVM = evmcfg.EVMConfigs{&evmcfg.EVMConfig{ ChainID: chainID, Enabled: &evmEnabled, }} }) require.NoError(t, migrate.SetMigrationENVVars(testConfig)) actualChainID := os.Getenv(env.EVMChainIDNotNullMigration0195) require.Equal(t, actualChainID, chainID.String()) })` $DIR/core/store/migrate/migrate_test.go: `c.EVM = evmcfg.EVMConfigs{&evmcfg.EVMConfig{ ChainID: chainID, Enabled: &evmEnabled, }}` $DIR/core/store/migrate/migrate_test.go: `c.EVM = nil` $DIR/core/store/migrate/migrate_test.go: `err = goose.UpTo(db.DB, migrationDir, 202)` $DIR/core/store/migrate/migrate_test.go: `t.Run(tt.name, func(t *testing.T) { block, err := tt.orm.SelectBlockByNumber(ctx, tt.blockNumber) require.NoError(t, err) require.Equal(t, tt.expectedFinalizedBlock, block.FinalizedBlockNumber) })` $DIR/core/store/migrate/migrate_test.go: `assert_num_triggers(0)` $DIR/core/store/migrate/migrate_test.go: `.FullTestDBEmptyV2(t, nil)` $DIR/core/store/migrate/migrate_test.go: `.TestLogger(t)` $DIR/core/store/migrate/migrate_test.go: `.UpTo(db.DB, migrationDir, 99)` $DIR/core/store/migrate/migrate_test.go: `.NewORM(db, lggr, cfg.JobPipeline().MaxSuccessfulRuns())` $DIR/core/store/migrate/migrate_test.go: `.JobPipeline()` $DIR/core/store/migrate/migrate_test.go: `.MaxSuccessfulRuns()` $DIR/core/store/migrate/migrate_test.go: `.Context(t)` $DIR/core/store/migrate/migrate_test.go: `.CreateSpec(ctx, pipeline.Pipeline{}, 0)` $DIR/core/store/migrate/migrate_test.go: `.CreateSpec(ctx, pipeline.Pipeline{}, 0)` $DIR/core/store/migrate/migrate_test.go: `.CreateSpec(ctx, pipeline.Pipeline{}, 0)` $DIR/core/store/migrate/migrate_test.go: `.CreateSpec(ctx, pipeline.Pipeline{}, 0)` $DIR/core/store/migrate/migrate_test.go: `.StringFrom("endpoint:chain.link.monitor")` $DIR/core/store/migrate/migrate_test.go: `.New()` $DIR/core/store/migrate/migrate_test.go: `.New()` $DIR/core/store/migrate/migrate_test.go: `.New()` $DIR/core/store/migrate/migrate_test.go: `.StringFrom("new:chain.link.monitor")` $DIR/core/store/migrate/migrate_test.go: `.New()` $DIR/core/store/migrate/migrate_test.go: `.NamedExec(sql, jb.Offchainreporting2OracleSpec)` $DIR/core/store/migrate/migrate_test.go: `.NamedExec(sql, nonBootstrapJob.Offchainreporting2OracleSpec)` $DIR/core/store/migrate/migrate_test.go: `.NamedExec(sql, jb2.Offchainreporting2OracleSpec)` $DIR/core/store/migrate/migrate_test.go: `.NamedExec(sql, newFormatBootstrapJob.BootstrapSpec)` $DIR/core/store/migrate/migrate_test.go: `.NamedExec(sql, jb)` $DIR/core/store/migrate/migrate_test.go: `.NamedExec(sql, nonBootstrapJob)` $DIR/core/store/migrate/migrate_test.go: `.NamedExec(sql, jb2)` $DIR/core/store/migrate/migrate_test.go: `.NamedExec(sql, newFormatBootstrapJob)` $DIR/core/store/migrate/migrate_test.go: `.UpByOne(db.DB, migrationDir)` $DIR/core/store/migrate/migrate_test.go: `.Select(&bootstrapSpecs, sql)` $DIR/core/store/migrate/migrate_test.go: `.Select(&jobs, sql)` $DIR/core/store/migrate/migrate_test.go: `.Get(&resultingBootstrapSpec, `SELECT * FROM bootstrap_specs WHERE id = $1`, *migratedJob.BootstrapSpecID)` $DIR/core/store/migrate/migrate_test.go: `.Get(&count, sql)` $DIR/core/store/migrate/migrate_test.go: `.Down(db.DB, migrationDir)` $DIR/core/store/migrate/migrate_test.go: `.Select(&oldJobs, sql)` $DIR/core/store/migrate/migrate_test.go: `.Select(&oldOCR2Spec, sql)` $DIR/core/store/migrate/migrate_test.go: `.Get(&count, sql)` $DIR/core/store/migrate/migrate_test.go: `.Select(&jobsAndContracts, sql)` $DIR/core/store/migrate/migrate_test.go: `.FullTestDBEmptyV2(t, nil)` $DIR/core/store/migrate/migrate_test.go: `.UpTo(db.DB, migrationDir, 100)` $DIR/core/store/migrate/migrate_test.go: `.NamedExec(sql, spec)` $DIR/core/store/migrate/migrate_test.go: `.UpByOne(db.DB, migrationDir)` $DIR/core/store/migrate/migrate_test.go: `.Get(&pluginValues, sql)` $DIR/core/store/migrate/migrate_test.go: `.Down(db.DB, migrationDir)` $DIR/core/store/migrate/migrate_test.go: `.Get(&pluginValues, sql)` $DIR/core/store/migrate/migrate_test.go: `.Get(&juels, sql)` $DIR/core/store/migrate/migrate_test.go: `.Context(t)` $DIR/core/store/migrate/migrate_test.go: `.FullTestDBEmptyV2(t, nil)` $DIR/core/store/migrate/migrate_test.go: `.UpTo(db.DB, migrationDir, 100)` $DIR/core/store/migrate/migrate_test.go: `.Status(ctx, db.DB)` $DIR/core/store/migrate/migrate_test.go: `.Current(ctx, db.DB)` $DIR/core/store/migrate/migrate_test.go: `.Migrate(ctx, db.DB)` $DIR/core/store/migrate/migrate_test.go: `.Rollback(ctx, db.DB, null.IntFrom(99))` $DIR/core/store/migrate/migrate_test.go: `.IntFrom(99)` $DIR/core/store/migrate/migrate_test.go: `.Current(ctx, db.DB)` $DIR/core/store/migrate/migrate_test.go: `.Run("ValidEVMConfig", func(t *testing.T) { chainID := ubig.New(big.NewInt(1337)) testConfig := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { evmEnabled := true c.EVM = evmcfg.EVMConfigs{&evmcfg.EVMConfig{ ChainID: chainID, Enabled: &evmEnabled, }} }) require.NoError(t, migrate.SetMigrationENVVars(testConfig)) actualChainID := os.Getenv(env.EVMChainIDNotNullMigration0195) require.Equal(t, actualChainID, chainID.String()) })` $DIR/core/store/migrate/migrate_test.go: `.New(big.NewInt(1337))` $DIR/core/store/migrate/migrate_test.go: `.NewInt(1337)` $DIR/core/store/migrate/migrate_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { evmEnabled := true c.EVM = evmcfg.EVMConfigs{&evmcfg.EVMConfig{ ChainID: chainID, Enabled: &evmEnabled, }} })` $DIR/core/store/migrate/migrate_test.go: `.Getenv(env.EVMChainIDNotNullMigration0195)` $DIR/core/store/migrate/migrate_test.go: `.New(big.NewInt(1337))` $DIR/core/store/migrate/migrate_test.go: `.NewInt(1337)` $DIR/core/store/migrate/migrate_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM = nil })` $DIR/core/store/migrate/migrate_test.go: `.Getenv(env.EVMChainIDNotNullMigration0195)` $DIR/core/store/migrate/migrate_test.go: `.FullTestDBEmptyV2(t, nil)` $DIR/core/store/migrate/migrate_test.go: `.Context(t)` $DIR/core/store/migrate/migrate_test.go: `.UpTo(db.DB, migrationDir, 201)` $DIR/core/store/migrate/migrate_test.go: `.NewORM(testutils.SimulatedChainID, db, logger.TestLogger(t))` $DIR/core/store/migrate/migrate_test.go: `.TestLogger(t)` $DIR/core/store/migrate/migrate_test.go: `.NewORM(big.NewInt(int64(84531)), db, logger.TestLogger(t))` $DIR/core/store/migrate/migrate_test.go: `.NewInt(int64(84531))` $DIR/core/store/migrate/migrate_test.go: `.TestLogger(t)` $DIR/core/store/migrate/migrate_test.go: `.NewORM(big.NewInt(int64(1001)), db, logger.TestLogger(t))` $DIR/core/store/migrate/migrate_test.go: `.NewInt(int64(1001))` $DIR/core/store/migrate/migrate_test.go: `.TestLogger(t)` $DIR/core/store/migrate/migrate_test.go: `.UpTo(db.DB, migrationDir, 202)` $DIR/core/store/migrate/migrate_test.go: `.Run(tt.name, func(t *testing.T) { block, err := tt.orm.SelectBlockByNumber(ctx, tt.blockNumber) require.NoError(t, err) require.Equal(t, tt.expectedFinalizedBlock, block.FinalizedBlockNumber) })` $DIR/core/store/migrate/migrate_test.go: `.orm.SelectBlockByNumber(ctx, tt.blockNumber)` $DIR/core/store/migrate/migrate_test.go: `.FullTestDBEmptyV2(t, nil)` $DIR/core/store/migrate/migrate_test.go: `.DB.QueryRow("select count(*) from information_schema.triggers")` $DIR/core/store/migrate/migrate_test.go: `.Scan(&count)` $DIR/core/store/migrate/migrate_test.go: `.UpTo(db.DB, migrationDir, int64(v))` $DIR/core/store/models/common_test.go: `t.Run(test.name, func(t *testing.T) { j1 := cltest.JSONFromString(t, test.original) j2 := cltest.JSONFromString(t, test.input) merged, err := models.Merge(j1, j2) if test.wantError { require.Error(t, err) } else { require.NoError(t, err) assert.JSONEq(t, test.want, merged.String()) assert.JSONEq(t, test.original, j1.String()) } })` $DIR/core/store/models/common_test.go: `t.Run(test.name, func(t *testing.T) { var j models.JSON err := json.Unmarshal([]byte(test.json), &j) assert.Equal(t, test.wantErrored, (err != nil)) })` $DIR/core/store/models/common_test.go: `t.Run(test.name, func(t *testing.T) { json, err := models.ParseJSON([]byte(test.in)) assert.Equal(t, test.want, json) assert.Equal(t, test.wantErrored, (err != nil)) })` $DIR/core/store/models/common_test.go: `t.Run(test.name, func(t *testing.T) { var actual models.Cron err := json.Unmarshal([]byte(test.input), &actual) assert.NoError(t, err) })` $DIR/core/store/models/common_test.go: `t.Run(test.name, func(t *testing.T) { var actual models.Cron err := json.Unmarshal([]byte(test.input), &actual) assert.EqualError(t, err, test.wantError) })` $DIR/core/store/models/common_test.go: `err = newHash.UnmarshalJSON(json)` $DIR/core/store/models/common_test.go: `_, err = models.Sha256HashFromHex("f5bf259689b26f1374efb3c9a9868796953a0f814bb2d39b968d0e61b58620a5")` $DIR/core/store/models/common_test.go: `_, err = models.Sha256HashFromHex("f5bf259689b26f1374e6")` $DIR/core/store/models/common_test.go: `err = newHash.Scan(val)` $DIR/core/store/models/common_test.go: `err = acNew.Scan(val)` $DIR/core/store/models/common_test.go: `i = models.NewInterval(1)` $DIR/core/store/models/common_test.go: `err = iNew.Scan(val)` $DIR/core/store/models/common_test.go: `err = iNew.UnmarshalText(txt)` $DIR/core/store/models/common_test.go: `err = wNew.Scan(val)` $DIR/core/store/models/common_test.go: `err = jsNew.Scan(val)` $DIR/core/store/models/common_test.go: `err = js.UnmarshalTOML(string(jsBytes))` $DIR/core/store/models/common_test.go: `.Run(test.name, func(t *testing.T) { j1 := cltest.JSONFromString(t, test.original) j2 := cltest.JSONFromString(t, test.input) merged, err := models.Merge(j1, j2) if test.wantError { require.Error(t, err) } else { require.NoError(t, err) assert.JSONEq(t, test.want, merged.String()) assert.JSONEq(t, test.original, j1.String()) } })` $DIR/core/store/models/common_test.go: `.JSONFromString(t, test.original)` $DIR/core/store/models/common_test.go: `.JSONFromString(t, test.input)` $DIR/core/store/models/common_test.go: `.Merge(j1, j2)` $DIR/core/store/models/common_test.go: `.Merge(models.JSON{}, models.JSON{})` $DIR/core/store/models/common_test.go: `.String()` $DIR/core/store/models/common_test.go: `.Run(test.name, func(t *testing.T) { var j models.JSON err := json.Unmarshal([]byte(test.json), &j) assert.Equal(t, test.wantErrored, (err != nil)) })` $DIR/core/store/models/common_test.go: `.Unmarshal([]byte(test.json), &j)` $DIR/core/store/models/common_test.go: `.JSONFromString(t, `{"num": 100}`)` $DIR/core/store/models/common_test.go: `.Run(test.name, func(t *testing.T) { json, err := models.ParseJSON([]byte(test.in)) assert.Equal(t, test.want, json) assert.Equal(t, test.wantErrored, (err != nil)) })` $DIR/core/store/models/common_test.go: `.ParseJSON([]byte(test.in))` $DIR/core/store/models/common_test.go: `.Unmarshal(j, wurl)` $DIR/core/store/models/common_test.go: `.Unmarshal(j, wurl)` $DIR/core/store/models/common_test.go: `.ParseRequestURI(str)` $DIR/core/store/models/common_test.go: `.WebURL(*parsed)` $DIR/core/store/models/common_test.go: `.Marshal(wurl)` $DIR/core/store/models/common_test.go: `.Parse("http://www.duckduckgo.com")` $DIR/core/store/models/common_test.go: `.WebURL(*u)` $DIR/core/store/models/common_test.go: `.String()` $DIR/core/store/models/common_test.go: `.String()` $DIR/core/store/models/common_test.go: `.Run(test.name, func(t *testing.T) { var actual models.Cron err := json.Unmarshal([]byte(test.input), &actual) assert.NoError(t, err) })` $DIR/core/store/models/common_test.go: `.Unmarshal([]byte(test.input), &actual)` $DIR/core/store/models/common_test.go: `.Run(test.name, func(t *testing.T) { var actual models.Cron err := json.Unmarshal([]byte(test.input), &actual) assert.EqualError(t, err, test.wantError) })` $DIR/core/store/models/common_test.go: `.Unmarshal([]byte(test.input), &actual)` $DIR/core/store/models/common_test.go: `.NewInterval(duration)` $DIR/core/store/models/common_test.go: `.Duration()` $DIR/core/store/models/common_test.go: `.MustSha256HashFromHex("f5bf259689b26f1374efb3c9a9868796953a0f814bb2d39b968d0e61b58620a5")` $DIR/core/store/models/common_test.go: `.MarshalJSON()` $DIR/core/store/models/common_test.go: `.UnmarshalJSON(json)` $DIR/core/store/models/common_test.go: `.Sha256HashFromHex("abczzz")` $DIR/core/store/models/common_test.go: `.Sha256HashFromHex("f5bf259689b26f1374efb3c9a9868796953a0f814bb2d39b968d0e61b58620a5")` $DIR/core/store/models/common_test.go: `.Sha256HashFromHex("f5bf259689b26f1374e6")` $DIR/core/store/models/common_test.go: `.MustSha256HashFromHex("f5bf259689b26f1374efb3c9a9868796953a0f814bb2d39b968d0e61b58620a5")` $DIR/core/store/models/common_test.go: `.String()` $DIR/core/store/models/common_test.go: `.MustSha256HashFromHex("f5bf259689b26f1374efb3c9a9868796953a0f814bb2d39b968d0e61b58620a5")` $DIR/core/store/models/common_test.go: `.Value()` $DIR/core/store/models/common_test.go: `.Scan(val)` $DIR/core/store/models/common_test.go: `.HexToAddress(strings.Repeat("AA", 20))` $DIR/core/store/models/common_test.go: `.Repeat("AA", 20)` $DIR/core/store/models/common_test.go: `.HexToAddress(strings.Repeat("BB", 20))` $DIR/core/store/models/common_test.go: `.Repeat("BB", 20)` $DIR/core/store/models/common_test.go: `.Value()` $DIR/core/store/models/common_test.go: `.Scan(val)` $DIR/core/store/models/common_test.go: `.HexToAddress(hex1)` $DIR/core/store/models/common_test.go: `.HexToAddress(hex2)` $DIR/core/store/models/common_test.go: `.ToStrings()` $DIR/core/store/models/common_test.go: `.NewInterval(0)` $DIR/core/store/models/common_test.go: `.NewInterval(1)` $DIR/core/store/models/common_test.go: `.IsZero()` $DIR/core/store/models/common_test.go: `.NewInterval(100)` $DIR/core/store/models/common_test.go: `.Value()` $DIR/core/store/models/common_test.go: `.NewInterval(0)` $DIR/core/store/models/common_test.go: `.Scan(val)` $DIR/core/store/models/common_test.go: `.NewInterval(100)` $DIR/core/store/models/common_test.go: `.MarshalText()` $DIR/core/store/models/common_test.go: `.NewInterval(0)` $DIR/core/store/models/common_test.go: `.UnmarshalText(txt)` $DIR/core/store/models/common_test.go: `.Parse("https://chain.link")` $DIR/core/store/models/common_test.go: `.WebURL(*u)` $DIR/core/store/models/common_test.go: `.Value()` $DIR/core/store/models/common_test.go: `.Scan(val)` $DIR/core/store/models/common_test.go: `.ParseJSON([]byte(`{"foo":123}`))` $DIR/core/store/models/common_test.go: `.Value()` $DIR/core/store/models/common_test.go: `.Scan(val)` $DIR/core/store/models/common_test.go: `.ParseJSON(jsBytes)` $DIR/core/store/models/common_test.go: `.Bytes()` $DIR/core/store/models/common_test.go: `.ParseJSON(jsBytes)` $DIR/core/store/models/common_test.go: `.MarshalJSON()` $DIR/core/store/models/common_test.go: `.UnmarshalTOML(jsBytes)` $DIR/core/store/models/common_test.go: `.UnmarshalTOML(string(jsBytes))` $DIR/core/store/models/common_test.go: `.Bytes()` $DIR/core/store/models/errors_test.go: `res.Add("bar")` $DIR/core/store/models/errors_test.go: `res = models.NewJSONAPIErrorsWith("foo")` $DIR/core/store/models/errors_test.go: `err = res.CoerceEmptyToNil()` $DIR/core/store/models/errors_test.go: `res1.Merge(res2)` $DIR/core/store/models/errors_test.go: `res1.Merge(errors.New("zet"))` $DIR/core/store/models/errors_test.go: `.NewJSONAPIErrors()` $DIR/core/store/models/errors_test.go: `.NewJSONAPIErrorsWith("foo")` $DIR/core/store/models/errors_test.go: `.NewJSONAPIErrorsWith("foo")` $DIR/core/store/models/errors_test.go: `.Add("bar")` $DIR/core/store/models/errors_test.go: `.NewJSONAPIErrors()` $DIR/core/store/models/errors_test.go: `.CoerceEmptyToNil()` $DIR/core/store/models/errors_test.go: `.NewJSONAPIErrorsWith("foo")` $DIR/core/store/models/errors_test.go: `.CoerceEmptyToNil()` $DIR/core/store/models/errors_test.go: `.NewJSONAPIErrorsWith("foo")` $DIR/core/store/models/errors_test.go: `.NewJSONAPIErrorsWith("bar")` $DIR/core/store/models/errors_test.go: `.Merge(res2)` $DIR/core/store/models/errors_test.go: `.Merge(errors.New("zet"))` $DIR/core/store/models/errors_test.go: `.New("zet")` $DIR/core/store/models/secrets_test.go: `t.Run(fmt.Sprintf("%T", v), func(t *testing.T) { assert.Equal(t, redacted, v.String()) got, err := v.MarshalText() if assert.NoError(t, err) { assert.Equal(t, redacted, string(got)) } assert.Equal(t, redacted, fmt.Sprint(v)) assert.Equal(t, redacted, fmt.Sprintf("%s", v)) //nolint:gosimple assert.Equal(t, redacted, fmt.Sprintf("%v", v)) assert.Equal(t, redacted, fmt.Sprintf("%#v", v)) got, err = json.Marshal(v) if assert.NoError(t, err) { assert.Equal(t, fmt.Sprintf(`"%s"`, redacted), string(got)) } })` $DIR/core/store/models/secrets_test.go: `got, err = json.Marshal(v)` $DIR/core/store/models/secrets_test.go: `.Run(fmt.Sprintf("%T", v), func(t *testing.T) { assert.Equal(t, redacted, v.String()) got, err := v.MarshalText() if assert.NoError(t, err) { assert.Equal(t, redacted, string(got)) } assert.Equal(t, redacted, fmt.Sprint(v)) assert.Equal(t, redacted, fmt.Sprintf("%s", v)) //nolint:gosimple assert.Equal(t, redacted, fmt.Sprintf("%v", v)) assert.Equal(t, redacted, fmt.Sprintf("%#v", v)) got, err = json.Marshal(v) if assert.NoError(t, err) { assert.Equal(t, fmt.Sprintf(`"%s"`, redacted), string(got)) } })` $DIR/core/store/models/secrets_test.go: `.Sprintf("%T", v)` $DIR/core/store/models/secrets_test.go: `.MarshalText()` $DIR/core/store/models/secrets_test.go: `.Marshal(v)` $DIR/core/utils/backoff_ticker_test.go: `ok = bt.Start()` $DIR/core/utils/backoff_ticker_test.go: `ok = bt.Stop()` $DIR/core/utils/backoff_ticker_test.go: `ok = bt.Stop()` $DIR/core/utils/backoff_ticker_test.go: `realTimer.C = chTime` $DIR/core/utils/backoff_ticker_test.go: `ok = bt.Stop()` $DIR/core/utils/backoff_ticker_test.go: `chTime <- time.Now()` $DIR/core/utils/backoff_ticker_test.go: `realTimer.C = chTime` $DIR/core/utils/backoff_ticker_test.go: `chTime <- tm` $DIR/core/utils/backoff_ticker_test.go: `newTimerCount.Add(1)` $DIR/core/utils/backoff_ticker_test.go: `ok = bt.Stop()` $DIR/core/utils/backoff_ticker_test.go: `ok = bt.Start()` $DIR/core/utils/backoff_ticker_test.go: `.Bounds()` $DIR/core/utils/backoff_ticker_test.go: `.Stop()` $DIR/core/utils/backoff_ticker_test.go: `.Start()` $DIR/core/utils/backoff_ticker_test.go: `.Start()` $DIR/core/utils/backoff_ticker_test.go: `.Start()` $DIR/core/utils/backoff_ticker_test.go: `.Stop()` $DIR/core/utils/backoff_ticker_test.go: `.Stop()` $DIR/core/utils/backoff_ticker_test.go: `.NewTimer(max)` $DIR/core/utils/backoff_ticker_test.go: `.Start()` $DIR/core/utils/backoff_ticker_test.go: `.Stop()` $DIR/core/utils/backoff_ticker_test.go: `.Now()` $DIR/core/utils/backoff_ticker_test.go: `.After(2 * min)` $DIR/core/utils/backoff_ticker_test.go: `.Ticks()` $DIR/core/utils/backoff_ticker_test.go: `.NewTimer(max)` $DIR/core/utils/backoff_ticker_test.go: `.Start()` $DIR/core/utils/backoff_ticker_test.go: `.Stop()` $DIR/core/utils/backoff_ticker_test.go: `.Now()` $DIR/core/utils/backoff_ticker_test.go: `.Add(1 * time.Second)` $DIR/core/utils/backoff_ticker_test.go: `.Add(1 * time.Second)` $DIR/core/utils/backoff_ticker_test.go: `.Ticks()` $DIR/core/utils/backoff_ticker_test.go: `.After(2 * min)` $DIR/core/utils/backoff_ticker_test.go: `.Ticks()` $DIR/core/utils/backoff_ticker_test.go: `.Add(1)` $DIR/core/utils/backoff_ticker_test.go: `.NewTimer(max)` $DIR/core/utils/backoff_ticker_test.go: `.Start()` $DIR/core/utils/backoff_ticker_test.go: `.Stop()` $DIR/core/utils/backoff_ticker_test.go: `.Start()` $DIR/core/utils/backoff_ticker_test.go: `.Stop()` $DIR/core/utils/backoff_ticker_test.go: `.Load()` $DIR/core/utils/big_math/big_math_test.go: `s = []*big.Int{}` $DIR/core/utils/big_math/big_math_test.go: `expected = big.NewInt(0)` $DIR/core/utils/big_math/big_math_test.go: `.NewInt(1)` $DIR/core/utils/big_math/big_math_test.go: `.NewInt(2)` $DIR/core/utils/big_math/big_math_test.go: `.NewInt(2)` $DIR/core/utils/big_math/big_math_test.go: `.Cmp(m)` $DIR/core/utils/big_math/big_math_test.go: `.NewInt(1)` $DIR/core/utils/big_math/big_math_test.go: `.NewInt(2)` $DIR/core/utils/big_math/big_math_test.go: `.NewInt(1)` $DIR/core/utils/big_math/big_math_test.go: `.Cmp(m)` $DIR/core/utils/big_math/big_math_test.go: `.NewInt(1)` $DIR/core/utils/big_math/big_math_test.go: `.NewInt(2)` $DIR/core/utils/big_math/big_math_test.go: `.NewInt(3)` $DIR/core/utils/big_math/big_math_test.go: `.NewInt(4)` $DIR/core/utils/big_math/big_math_test.go: `.NewInt(5)` $DIR/core/utils/big_math/big_math_test.go: `.NewInt(15)` $DIR/core/utils/big_math/big_math_test.go: `.NewInt(0)` $DIR/core/utils/collection_test.go: `list = append(list, i)` $DIR/core/utils/collection_test.go: `t.Run(r.name, func(t *testing.T) { batch, err := BatchSplit(r.input, r.max) if r.expectErr { assert.Error(t, err) return } assert.NoError(t, err) assert.Equal(t, r.num, len(batch)) // check number of batches temp := []int{} for i := 0; i < len(batch); i++ { expectedLen := r.max if i == len(batch)-1 { expectedLen = r.lastLen // expect last batch to be less than max } assert.Equal(t, expectedLen, len(batch[i])) // check length of batch temp = append(temp, batch[i]...) } // assert order has not changed when list is reconstructed assert.Equal(t, r.input, temp) })` $DIR/core/utils/collection_test.go: `expectedLen = r.lastLen` $DIR/core/utils/collection_test.go: `temp = append(temp, batch[i]...)` $DIR/core/utils/collection_test.go: `.Run(r.name, func(t *testing.T) { batch, err := BatchSplit(r.input, r.max) if r.expectErr { assert.Error(t, err) return } assert.NoError(t, err) assert.Equal(t, r.num, len(batch)) // check number of batches temp := []int{} for i := 0; i < len(batch); i++ { expectedLen := r.max if i == len(batch)-1 { expectedLen = r.lastLen // expect last batch to be less than max } assert.Equal(t, expectedLen, len(batch[i])) // check length of batch temp = append(temp, batch[i]...) } // assert order has not changed when list is reconstructed assert.Equal(t, r.input, temp) })` $DIR/core/utils/crypto/private_key_test.go: `err = actual.Scan("not bytes")` $DIR/core/utils/crypto/private_key_test.go: `err = actual.Scan(b)` $DIR/core/utils/crypto/private_key_test.go: `.Decrypt(passphrase)` $DIR/core/utils/crypto/private_key_test.go: `.GenerateKey(nil)` $DIR/core/utils/crypto/private_key_test.go: `.EncryptDataV3(privkey, passphrase, 2, 1)` $DIR/core/utils/crypto/private_key_test.go: `.Decrypt(string(passphrase))` $DIR/core/utils/crypto/private_key_test.go: `.GenerateKey(nil)` $DIR/core/utils/crypto/private_key_test.go: `.EncryptDataV3(privKey, []byte("passphrase"), 2, 1)` $DIR/core/utils/crypto/private_key_test.go: `.Marshal(encPrivkey)` $DIR/core/utils/crypto/private_key_test.go: `.Scan("not bytes")` $DIR/core/utils/crypto/private_key_test.go: `.Scan(b)` $DIR/core/utils/crypto/private_key_test.go: `.Marshal(EncryptedPrivateKey{CryptoJSON: encPrivkey})` $DIR/core/utils/crypto/private_key_test.go: `.Marshal(actual)` $DIR/core/utils/crypto/private_key_test.go: `.GenerateKey(nil)` $DIR/core/utils/crypto/private_key_test.go: `.EncryptDataV3(privKey, []byte("passphrase"), 2, 1)` $DIR/core/utils/crypto/private_key_test.go: `.Value()` $DIR/core/utils/crypto/private_key_test.go: `.Marshal(EncryptedPrivateKey{CryptoJSON: cryptoJSON})` $DIR/core/utils/crypto/public_key_test.go: `err = actual.UnmarshalJSON([]byte(fmt.Sprintf(`"%s"`, hexKey)))` $DIR/core/utils/crypto/public_key_test.go: `err = actual.Scan("not bytes")` $DIR/core/utils/crypto/public_key_test.go: `err = actual.Scan(nil)` $DIR/core/utils/crypto/public_key_test.go: `err = actual.Scan([]byte(pubKey))` $DIR/core/utils/crypto/public_key_test.go: `.GenerateKey(nil)` $DIR/core/utils/crypto/public_key_test.go: `.EncodeToString(pubKey)` $DIR/core/utils/crypto/public_key_test.go: `.String()` $DIR/core/utils/crypto/public_key_test.go: `.GenerateKey(nil)` $DIR/core/utils/crypto/public_key_test.go: `.EncodeToString(pubKey)` $DIR/core/utils/crypto/public_key_test.go: `.MarshalJSON()` $DIR/core/utils/crypto/public_key_test.go: `.Sprintf(`"%s"`, hexKey)` $DIR/core/utils/crypto/public_key_test.go: `.GenerateKey(nil)` $DIR/core/utils/crypto/public_key_test.go: `.EncodeToString(pubKey)` $DIR/core/utils/crypto/public_key_test.go: `.UnmarshalJSON([]byte(fmt.Sprintf(`"%s"`, hexKey)))` $DIR/core/utils/crypto/public_key_test.go: `.Sprintf(`"%s"`, hexKey)` $DIR/core/utils/crypto/public_key_test.go: `.GenerateKey(nil)` $DIR/core/utils/crypto/public_key_test.go: `.Scan("not bytes")` $DIR/core/utils/crypto/public_key_test.go: `.Scan(nil)` $DIR/core/utils/crypto/public_key_test.go: `.Scan([]byte(pubKey))` $DIR/core/utils/crypto/public_key_test.go: `.GenerateKey(nil)` $DIR/core/utils/crypto/public_key_test.go: `.Value()` $DIR/core/utils/decimal_test.go: `.New(1, 0)` $DIR/core/utils/decimal_test.go: `.NewInt(1)` $DIR/core/utils/decimal_test.go: `.Inf(1)` $DIR/core/utils/decimal_test.go: `.Inf(-1)` $DIR/core/utils/decimal_test.go: `.Inf(-1)` $DIR/core/utils/decimal_test.go: `.Inf(1)` $DIR/core/utils/decimal_test.go: `.NaN()` $DIR/core/utils/decimal_test.go: `.NaN()` $DIR/core/utils/deferable_write_closer_test.go: `_, err = wc.Write([]byte(wantStr))` $DIR/core/utils/deferable_write_closer_test.go: `_, err = f.Write([]byte("after close"))` $DIR/core/utils/deferable_write_closer_test.go: `_, err = wc.Write([]byte("write to wc after close"))` $DIR/core/utils/deferable_write_closer_test.go: `.TempDir()` $DIR/core/utils/deferable_write_closer_test.go: `.Create(filepath.Join(d, "test-file"))` $DIR/core/utils/deferable_write_closer_test.go: `.Join(d, "test-file")` $DIR/core/utils/deferable_write_closer_test.go: `.Write([]byte(wantStr))` $DIR/core/utils/deferable_write_closer_test.go: `.Write([]byte("after close"))` $DIR/core/utils/deferable_write_closer_test.go: `.Write([]byte("write to wc after close"))` $DIR/core/utils/deferable_write_closer_test.go: `.ReadFile(f.Name())` $DIR/core/utils/deferable_write_closer_test.go: `.Name()` $DIR/core/utils/eth_signatures_test.go: `.GenerateKey()` $DIR/core/utils/eth_signatures_test.go: `.PubkeyToAddress(privateKey.PublicKey)` $DIR/core/utils/eth_signatures_test.go: `.Keccak256Hash([]byte(expectedPrefix + "12" + string(msg)))` $DIR/core/utils/eth_signatures_test.go: `.GenerateKey()` $DIR/core/utils/eth_signatures_test.go: `.SigToPub(GenerateEthPrefixedMsgHash(msg).Bytes(), signature)` $DIR/core/utils/eth_signatures_test.go: `.Bytes()` $DIR/core/utils/files_test.go: `exists, err = FileExists(os.Args[0])` $DIR/core/utils/files_test.go: `res = TooPermissive(os.FileMode(0600), os.FileMode(0600))` $DIR/core/utils/files_test.go: `res = TooPermissive(os.FileMode(0600), os.FileMode(0700))` $DIR/core/utils/files_test.go: `t.Run(test.expected, func(t *testing.T) { t.Parallel() bstr, err := test.input.MarshalText() assert.NoError(t, err) assert.Equal(t, test.expected, string(bstr)) assert.Equal(t, test.expected, test.input.String()) })` $DIR/core/utils/files_test.go: `t.Run(test.input, func(t *testing.T) { t.Parallel() var fs FileSize err := fs.UnmarshalText([]byte(test.input)) if test.valid { assert.NoError(t, err) assert.Equal(t, test.expected, fs) } else { assert.Error(t, err) } })` $DIR/core/utils/files_test.go: `.FileMode(0700)` $DIR/core/utils/files_test.go: `.FileMode(0600)` $DIR/core/utils/files_test.go: `.FileMode(0600)` $DIR/core/utils/files_test.go: `.FileMode(0600)` $DIR/core/utils/files_test.go: `.FileMode(0600)` $DIR/core/utils/files_test.go: `.FileMode(0700)` $DIR/core/utils/files_test.go: `.Run(test.expected, func(t *testing.T) { t.Parallel() bstr, err := test.input.MarshalText() assert.NoError(t, err) assert.Equal(t, test.expected, string(bstr)) assert.Equal(t, test.expected, test.input.String()) })` $DIR/core/utils/files_test.go: `.input.MarshalText()` $DIR/core/utils/files_test.go: `.Run(test.input, func(t *testing.T) { t.Parallel() var fs FileSize err := fs.UnmarshalText([]byte(test.input)) if test.valid { assert.NoError(t, err) assert.Equal(t, test.expected, fs) } else { assert.Error(t, err) } })` $DIR/core/utils/files_test.go: `.UnmarshalText([]byte(test.input))` $DIR/core/utils/finite_ticker_test.go: `counter.Add(1)` $DIR/core/utils/finite_ticker_test.go: `stop()` $DIR/core/utils/finite_ticker_test.go: `time.Sleep(2 * testutils.TestInterval)` $DIR/core/utils/finite_ticker_test.go: `.Add(1)` $DIR/core/utils/finite_ticker_test.go: `.Now()` $DIR/core/utils/finite_ticker_test.go: `.FiniteTicker(testutils.TestInterval, onTick)` $DIR/core/utils/finite_ticker_test.go: `.Load()` $DIR/core/utils/finite_ticker_test.go: `.Sleep(2 * testutils.TestInterval)` $DIR/core/utils/finite_ticker_test.go: `.Load()` $DIR/core/utils/hash_test.go: `.Repeat("0", test.Size)` $DIR/core/utils/hash_test.go: `.UnmarshalText([]byte(input))` $DIR/core/utils/hash_test.go: `.Repeat("0", test.Size)` $DIR/core/utils/hash_test.go: `.Unmarshal([]byte(input), &v)` $DIR/core/utils/http/http_allowed_ips_test.go: `t.Run(test.ip.String(), func(t *testing.T) { r, err := isRestrictedIP(test.ip, emptyDBURLcfg{}) require.NoError(t, err) assert.Equal(t, test.isRestricted, r) })` $DIR/core/utils/http/http_allowed_ips_test.go: `t.Run("disallows queries to database IP", func(t *testing.T) { s := httptest.NewServer(http.HandlerFunc(func(_ http.ResponseWriter, _ *http.Request) {})) t.Cleanup(s.Close) u := testutils.MustParseURL(t, s.URL) r, err := isRestrictedIP(net.ParseIP(u.Host), testDBURLcfg{*u}) require.NoError(t, err) assert.True(t, r) })` $DIR/core/utils/http/http_allowed_ips_test.go: `t.Cleanup(s.Close)` $DIR/core/utils/http/http_allowed_ips_test.go: `.ParseIP("1.1.1.1")` $DIR/core/utils/http/http_allowed_ips_test.go: `.ParseIP("216.239.32.10")` $DIR/core/utils/http/http_allowed_ips_test.go: `.ParseIP("2001:4860:4860::8888")` $DIR/core/utils/http/http_allowed_ips_test.go: `.ParseIP("127.0.0.1")` $DIR/core/utils/http/http_allowed_ips_test.go: `.ParseIP("255.255.255.255")` $DIR/core/utils/http/http_allowed_ips_test.go: `.ParseIP("224.0.0.1")` $DIR/core/utils/http/http_allowed_ips_test.go: `.ParseIP("224.0.0.2")` $DIR/core/utils/http/http_allowed_ips_test.go: `.ParseIP("224.1.1.1")` $DIR/core/utils/http/http_allowed_ips_test.go: `.ParseIP("0.0.0.0")` $DIR/core/utils/http/http_allowed_ips_test.go: `.ParseIP("192.168.0.1")` $DIR/core/utils/http/http_allowed_ips_test.go: `.ParseIP("192.168.1.255")` $DIR/core/utils/http/http_allowed_ips_test.go: `.ParseIP("255.255.255.255")` $DIR/core/utils/http/http_allowed_ips_test.go: `.ParseIP("10.0.0.1")` $DIR/core/utils/http/http_allowed_ips_test.go: `.ParseIP("::1")` $DIR/core/utils/http/http_allowed_ips_test.go: `.ParseIP("fd57:03f9:9ef5:8a81::1")` $DIR/core/utils/http/http_allowed_ips_test.go: `.ParseIP("FD00::1")` $DIR/core/utils/http/http_allowed_ips_test.go: `.ParseIP("FF02::1")` $DIR/core/utils/http/http_allowed_ips_test.go: `.ParseIP("FE80:0000:0000:0000:abcd:abcd:abcd:abcd")` $DIR/core/utils/http/http_allowed_ips_test.go: `.Run(test.ip.String(), func(t *testing.T) { r, err := isRestrictedIP(test.ip, emptyDBURLcfg{}) require.NoError(t, err) assert.Equal(t, test.isRestricted, r) })` $DIR/core/utils/http/http_allowed_ips_test.go: `.ip.String()` $DIR/core/utils/http/http_allowed_ips_test.go: `.Run("disallows queries to database IP", func(t *testing.T) { s := httptest.NewServer(http.HandlerFunc(func(_ http.ResponseWriter, _ *http.Request) {})) t.Cleanup(s.Close) u := testutils.MustParseURL(t, s.URL) r, err := isRestrictedIP(net.ParseIP(u.Host), testDBURLcfg{*u}) require.NoError(t, err) assert.True(t, r) })` $DIR/core/utils/http/http_allowed_ips_test.go: `.NewServer(http.HandlerFunc(func(_ http.ResponseWriter, _ *http.Request) {}))` $DIR/core/utils/http/http_allowed_ips_test.go: `.HandlerFunc(func(_ http.ResponseWriter, _ *http.Request) {})` $DIR/core/utils/http/http_allowed_ips_test.go: `.Cleanup(s.Close)` $DIR/core/utils/http/http_allowed_ips_test.go: `.MustParseURL(t, s.URL)` $DIR/core/utils/http/http_allowed_ips_test.go: `.ParseIP(u.Host)` $DIR/core/utils/http/http_allowed_ips_test.go: `.MustParseURL(t, "postgresql://postgres@1.2.3.4:5432/chainlink_test?sslmode=disable")` $DIR/core/utils/http/http_allowed_ips_test.go: `.ParseIP("1.2.3.4")` $DIR/core/utils/http/http_test.go: `client.Transport = newMockTransport()` $DIR/core/utils/http/http_test.go: `.NewUnrestrictedHTTPClient()` $DIR/core/utils/http/http_test.go: `.NewRequestWithContext(testutils.Context(t), "GET", "http://localhost", bytes.NewReader([]byte{}))` $DIR/core/utils/http/http_test.go: `.Context(t)` $DIR/core/utils/http/http_test.go: `.NewReader([]byte{})` $DIR/core/utils/http/http_test.go: `.SendRequest()` $DIR/core/utils/json_normalization_test.go: `t.Run(test.name, func(t *testing.T) { jsonBytes, err := json.Marshal(test.input) assert.NoError(t, err) str, err := utils.NormalizedJSON(jsonBytes) cltest.AssertError(t, test.wantError, err) assert.Equal(t, test.want, str) })` $DIR/core/utils/json_normalization_test.go: `cltest.AssertError(t, test.wantError, err)` $DIR/core/utils/json_normalization_test.go: `.JSONFromString(t, `{"a": "!", "A": "1"}`)` $DIR/core/utils/json_normalization_test.go: `.JSONFromString(t, `{"a": "!", "A": "1", "B": "@", "b":"?", "c":"..."}`)` $DIR/core/utils/json_normalization_test.go: `.Run(test.name, func(t *testing.T) { jsonBytes, err := json.Marshal(test.input) assert.NoError(t, err) str, err := utils.NormalizedJSON(jsonBytes) cltest.AssertError(t, test.wantError, err) assert.Equal(t, test.want, str) })` $DIR/core/utils/json_normalization_test.go: `.Marshal(test.input)` $DIR/core/utils/json_normalization_test.go: `.NormalizedJSON(jsonBytes)` $DIR/core/utils/json_normalization_test.go: `.AssertError(t, test.wantError, err)` $DIR/core/utils/password_test.go: `t.Run(test.password, func(t *testing.T) { t.Parallel() var disallowedStrings []string if test.mustNotcontain != "" { disallowedStrings = []string{test.mustNotcontain} } err := utils.VerifyPasswordComplexity(test.password, disallowedStrings...) if len(test.errors) == 0 { assert.NoError(t, err) } else { assert.Error(t, err) assert.ErrorContains(t, err, utils.ErrMsgHeader) for _, subErr := range test.errors { assert.ErrorContains(t, err, subErr.Error()) } } })` $DIR/core/utils/password_test.go: `disallowedStrings = []string{test.mustNotcontain}` $DIR/core/utils/password_test.go: `t.Run(test.password, func(t *testing.T) { t.Parallel() pwdFile, err := os.CreateTemp("", "") assert.NoError(t, err) defer os.Remove(pwdFile.Name()) _, err = pwdFile.WriteString(test.password) assert.NoError(t, err) pwd, err := utils.PasswordFromFile(pwdFile.Name()) if test.err != nil { assert.Error(t, err) assert.ErrorContains(t, err, test.err.Error()) } else { assert.NoError(t, err) assert.Equal(t, pwd, test.password) } })` $DIR/core/utils/password_test.go: `_, err = pwdFile.WriteString(test.password)` $DIR/core/utils/password_test.go: `.New("password is less than 16 characters long")` $DIR/core/utils/password_test.go: `.New("password may not contain: \"bad\"")` $DIR/core/utils/password_test.go: `.New("password may not contain: \"bad\"")` $DIR/core/utils/password_test.go: `.Run(test.password, func(t *testing.T) { t.Parallel() var disallowedStrings []string if test.mustNotcontain != "" { disallowedStrings = []string{test.mustNotcontain} } err := utils.VerifyPasswordComplexity(test.password, disallowedStrings...) if len(test.errors) == 0 { assert.NoError(t, err) } else { assert.Error(t, err) assert.ErrorContains(t, err, utils.ErrMsgHeader) for _, subErr := range test.errors { assert.ErrorContains(t, err, subErr.Error()) } } })` $DIR/core/utils/password_test.go: `.VerifyPasswordComplexity(test.password, disallowedStrings...)` $DIR/core/utils/password_test.go: `.Run(test.password, func(t *testing.T) { t.Parallel() pwdFile, err := os.CreateTemp("", "") assert.NoError(t, err) defer os.Remove(pwdFile.Name()) _, err = pwdFile.WriteString(test.password) assert.NoError(t, err) pwd, err := utils.PasswordFromFile(pwdFile.Name()) if test.err != nil { assert.Error(t, err) assert.ErrorContains(t, err, test.err.Error()) } else { assert.NoError(t, err) assert.Equal(t, pwd, test.password) } })` $DIR/core/utils/password_test.go: `.CreateTemp("", "")` $DIR/core/utils/password_test.go: `.Remove(pwdFile.Name())` $DIR/core/utils/password_test.go: `.Name()` $DIR/core/utils/password_test.go: `.WriteString(test.password)` $DIR/core/utils/password_test.go: `.PasswordFromFile(pwdFile.Name())` $DIR/core/utils/password_test.go: `.Name()` $DIR/core/utils/plainhex_test.go: `.Unmarshal([]byte(test.input), &v)` $DIR/core/utils/plainhex_test.go: `.Equal(test.want.([]byte), v)` $DIR/core/utils/plainhex_test.go: `.Marshal(PlainHexBytes(in))` $DIR/core/utils/plainhex_test.go: `.String()` $DIR/core/utils/thread_control_test.go: `tc.Go(func(ctx context.Context) { <-ctx.Done() finished.Add(1) })` $DIR/core/utils/thread_control_test.go: `<-ctx.Done()` $DIR/core/utils/thread_control_test.go: `finished.Add(1)` $DIR/core/utils/thread_control_test.go: `wg.Add(1)` $DIR/core/utils/thread_control_test.go: `tc.GoCtx(ctx, func(c context.Context) { defer wg.Done() <-c.Done() finished.Add(1) })` $DIR/core/utils/thread_control_test.go: `<-c.Done()` $DIR/core/utils/thread_control_test.go: `finished.Add(1)` $DIR/core/utils/thread_control_test.go: `wg.Wait()` $DIR/core/utils/thread_control_test.go: `.Go(func(ctx context.Context) { <-ctx.Done() finished.Add(1) })` $DIR/core/utils/thread_control_test.go: `.Done()` $DIR/core/utils/thread_control_test.go: `.Add(1)` $DIR/core/utils/thread_control_test.go: `.Load()` $DIR/core/utils/thread_control_test.go: `.WithTimeout(context.Background(), timeout)` $DIR/core/utils/thread_control_test.go: `.Background()` $DIR/core/utils/thread_control_test.go: `.Add(1)` $DIR/core/utils/thread_control_test.go: `.GoCtx(ctx, func(c context.Context) { defer wg.Done() <-c.Done() finished.Add(1) })` $DIR/core/utils/thread_control_test.go: `.Done()` $DIR/core/utils/thread_control_test.go: `.Done()` $DIR/core/utils/thread_control_test.go: `.Add(1)` $DIR/core/utils/thread_control_test.go: `.Now()` $DIR/core/utils/thread_control_test.go: `.Wait()` $DIR/core/utils/thread_control_test.go: `.Since(start)` $DIR/core/utils/thread_control_test.go: `.Load()` $DIR/core/utils/tomlutils/toml_test.go: `.UnmarshalText([]byte("0.23"))` $DIR/core/utils/tomlutils/toml_test.go: `.UnmarshalText([]byte("13"))` $DIR/core/utils/tomlutils/toml_test.go: `.UnmarshalText([]byte("1s"))` $DIR/core/utils/tomlutils/toml_test.go: `.UnmarshalText([]byte("2.82"))` $DIR/core/utils/tomlutils/toml_test.go: `.UnmarshalText([]byte("3"))` $DIR/core/utils/tomlutils/toml_test.go: `.UnmarshalText([]byte("1s"))` $DIR/core/utils/utils_test.go: `t.Run(fmt.Sprintf("%d_%d", test.numOfBytes, test.wantStrLen), func(t *testing.T) { t.Parallel() secret := utils.NewSecret(test.numOfBytes) assert.Equal(t, test.wantStrLen, len(secret)) })` $DIR/core/utils/utils_test.go: `t.Run(test.utf8, func(t *testing.T) { t.Parallel() assert.Equal(t, test.hex, utils.StringToHex(test.utf8)) })` $DIR/core/utils/utils_test.go: `q.Add(1)` $DIR/core/utils/utils_test.go: `q.Add(1)` $DIR/core/utils/utils_test.go: `q.Add(2)` $DIR/core/utils/utils_test.go: `q.Add(3)` $DIR/core/utils/utils_test.go: `q.Add(4)` $DIR/core/utils/utils_test.go: `x = q.Take()` $DIR/core/utils/utils_test.go: `x = q.Take()` $DIR/core/utils/utils_test.go: `x = q.Take()` $DIR/core/utils/utils_test.go: `q.Add(1, 1)` $DIR/core/utils/utils_test.go: `q.Add(2, 1)` $DIR/core/utils/utils_test.go: `q.Add(1, 2)` $DIR/core/utils/utils_test.go: `q.Add(1, 3)` $DIR/core/utils/utils_test.go: `q.Add(1, 4)` $DIR/core/utils/utils_test.go: `x = q.Take()` $DIR/core/utils/utils_test.go: `x = q.Take()` $DIR/core/utils/utils_test.go: `x = q.Take()` $DIR/core/utils/utils_test.go: `x = q.Take()` $DIR/core/utils/utils_test.go: `q.Add(2, 1)` $DIR/core/utils/utils_test.go: `q.Add(2, 2)` $DIR/core/utils/utils_test.go: `x = q.Take()` $DIR/core/utils/utils_test.go: `b[10] = 1` $DIR/core/utils/utils_test.go: `ok = utils.CheckPasswordHash("God", h)` $DIR/core/utils/utils_test.go: `expected["foo"] = 123.45` $DIR/core/utils/utils_test.go: `utils.MustUnmarshalToMap("123")` $DIR/core/utils/utils_test.go: `t.Run("closing channel", func(t *testing.T) { t.Parallel() ch := make(chan struct{}) ctx, cancel := utils.WithCloseChan(testutils.Context(t), ch) defer cancel() close(ch) assertCtxCancelled(ctx, t) })` $DIR/core/utils/utils_test.go: `close(ch)` $DIR/core/utils/utils_test.go: `assertCtxCancelled(ctx, t)` $DIR/core/utils/utils_test.go: `t.Run("cancelling ctx", func(t *testing.T) { t.Parallel() ch := make(chan struct{}) defer close(ch) ctx, cancel := utils.WithCloseChan(testutils.Context(t), ch) cancel() assertCtxCancelled(ctx, t) })` $DIR/core/utils/utils_test.go: `cancel()` $DIR/core/utils/utils_test.go: `assertCtxCancelled(ctx, t)` $DIR/core/utils/utils_test.go: `pcancel()` $DIR/core/utils/utils_test.go: `assertCtxCancelled(ctx, t)` $DIR/core/utils/utils_test.go: `close(ch)` $DIR/core/utils/utils_test.go: `t.Run("small deadline", func(t *testing.T) { t.Parallel() ch := make(chan struct{}) ctx, cancel := utils.ContextFromChanWithTimeout(ch, testutils.TestInterval) defer cancel() assertCtxCancelled(ctx, t) })` $DIR/core/utils/utils_test.go: `assertCtxCancelled(ctx, t)` $DIR/core/utils/utils_test.go: `ch <- struct{}{}` $DIR/core/utils/utils_test.go: `assertCtxCancelled(ctx, t)` $DIR/core/utils/utils_test.go: `km.LockInt64(1)()` $DIR/core/utils/utils_test.go: `km.LockInt64(2)()` $DIR/core/utils/utils_test.go: `awaiter.ItHappened()` $DIR/core/utils/utils_test.go: `unlock2()` $DIR/core/utils/utils_test.go: `unlock1()` $DIR/core/utils/utils_test.go: `err = utils.ValidateCronSchedule("CRON_TZ=UTC 5 * * * *")` $DIR/core/utils/utils_test.go: `err = utils.ValidateCronSchedule("@every 1h30m")` $DIR/core/utils/utils_test.go: `err = utils.ValidateCronSchedule("@every xyz")` $DIR/core/utils/utils_test.go: `awaiter.ItHappened()` $DIR/core/utils/utils_test.go: `pt.Resume()` $DIR/core/utils/utils_test.go: `go followNTicks(10, wait10)` $DIR/core/utils/utils_test.go: `wait10.AwaitOrFail(t)` $DIR/core/utils/utils_test.go: `pt.Pause()` $DIR/core/utils/utils_test.go: `time.Sleep(10 * testutils.TestInterval)` $DIR/core/utils/utils_test.go: `pt.Resume()` $DIR/core/utils/utils_test.go: `go followNTicks(20, wait20)` $DIR/core/utils/utils_test.go: `awaiter.ItHappened()` $DIR/core/utils/utils_test.go: `awaiter.AwaitOrFail(t)` $DIR/core/utils/utils_test.go: `time.Sleep(1 * time.Second)` $DIR/core/utils/utils_test.go: `t.Run("happy path", func(t *testing.T) { t.Parallel() buff := utils.ErrorBuffer{} buff.Append(err1) buff.Append(err2) combined := buff.Flush() errs := utils.UnwrapError(combined) assert.Equal(t, 2, len(errs)) assert.Equal(t, err1.Error(), errs[0].Error()) assert.Equal(t, err2.Error(), errs[1].Error()) })` $DIR/core/utils/utils_test.go: `buff.Append(err1)` $DIR/core/utils/utils_test.go: `buff.Append(err2)` $DIR/core/utils/utils_test.go: `t.Run("ovewrite oldest error when cap exceeded", func(t *testing.T) { t.Parallel() buff := utils.ErrorBuffer{} buff.SetCap(2) buff.Append(err1) buff.Append(err2) buff.Append(err3) combined := buff.Flush() errs := utils.UnwrapError(combined) assert.Equal(t, 2, len(errs)) assert.Equal(t, err2.Error(), errs[0].Error()) assert.Equal(t, err3.Error(), errs[1].Error()) })` $DIR/core/utils/utils_test.go: `buff.SetCap(2)` $DIR/core/utils/utils_test.go: `buff.Append(err1)` $DIR/core/utils/utils_test.go: `buff.Append(err2)` $DIR/core/utils/utils_test.go: `buff.Append(err3)` $DIR/core/utils/utils_test.go: `t.Run("does not overwrite the buffer if cap == 0", func(t *testing.T) { t.Parallel() buff := utils.ErrorBuffer{} for i := 1; i <= 20; i++ { buff.Append(errors.Errorf("err#%d", i)) } combined := buff.Flush() errs := utils.UnwrapError(combined) assert.Equal(t, 20, len(errs)) assert.Equal(t, "err#20", errs[19].Error()) })` $DIR/core/utils/utils_test.go: `buff.Append(errors.Errorf("err#%d", i))` $DIR/core/utils/utils_test.go: `t.Run("UnwrapError returns the a single element err array if passed err is not a joinedError", func(t *testing.T) { t.Parallel() errs := utils.UnwrapError(err1) assert.Equal(t, 1, len(errs)) assert.Equal(t, err1.Error(), errs[0].Error()) })` $DIR/core/utils/utils_test.go: `.NewBytes32ID()` $DIR/core/utils/utils_test.go: `.Run(fmt.Sprintf("%d_%d", test.numOfBytes, test.wantStrLen), func(t *testing.T) { t.Parallel() secret := utils.NewSecret(test.numOfBytes) assert.Equal(t, test.wantStrLen, len(secret)) })` $DIR/core/utils/utils_test.go: `.Sprintf("%d_%d", test.numOfBytes, test.wantStrLen)` $DIR/core/utils/utils_test.go: `.NewSecret(test.numOfBytes)` $DIR/core/utils/utils_test.go: `.Run(test.utf8, func(t *testing.T) { t.Parallel() assert.Equal(t, test.hex, utils.StringToHex(test.utf8)) })` $DIR/core/utils/utils_test.go: `.Now()` $DIR/core/utils/utils_test.go: `.Add(time.Second)` $DIR/core/utils/utils_test.go: `.DurationFromNow(future)` $DIR/core/utils/utils_test.go: `.Add(1)` $DIR/core/utils/utils_test.go: `.Take()` $DIR/core/utils/utils_test.go: `.Add(1)` $DIR/core/utils/utils_test.go: `.Add(2)` $DIR/core/utils/utils_test.go: `.Add(3)` $DIR/core/utils/utils_test.go: `.Add(4)` $DIR/core/utils/utils_test.go: `.Take()` $DIR/core/utils/utils_test.go: `.Take()` $DIR/core/utils/utils_test.go: `.Take()` $DIR/core/utils/utils_test.go: `.Full()` $DIR/core/utils/utils_test.go: `.Add(1, 1)` $DIR/core/utils/utils_test.go: `.Take()` $DIR/core/utils/utils_test.go: `.Add(2, 1)` $DIR/core/utils/utils_test.go: `.Add(1, 2)` $DIR/core/utils/utils_test.go: `.Add(1, 3)` $DIR/core/utils/utils_test.go: `.Add(1, 4)` $DIR/core/utils/utils_test.go: `.Take()` $DIR/core/utils/utils_test.go: `.Take()` $DIR/core/utils/utils_test.go: `.Take()` $DIR/core/utils/utils_test.go: `.Take()` $DIR/core/utils/utils_test.go: `.Add(2, 1)` $DIR/core/utils/utils_test.go: `.Add(2, 2)` $DIR/core/utils/utils_test.go: `.Take()` $DIR/core/utils/utils_test.go: `.Take()` $DIR/core/utils/utils_test.go: `.WithJitter(d)` $DIR/core/utils/utils_test.go: `.IsEmpty(b)` $DIR/core/utils/utils_test.go: `.HashPassword("Qwerty123!")` $DIR/core/utils/utils_test.go: `.CheckPasswordHash("Qwerty123!", h)` $DIR/core/utils/utils_test.go: `.CheckPasswordHash("God", h)` $DIR/core/utils/utils_test.go: `.BoxOutput("some error %d %s", 123, "foo")` $DIR/core/utils/utils_test.go: `.Unix(1651818206, 0)` $DIR/core/utils/utils_test.go: `.ISO8601UTC(ts)` $DIR/core/utils/utils_test.go: `.FormatJSON(json)` $DIR/core/utils/utils_test.go: `.MustUnmarshalToMap(json)` $DIR/core/utils/utils_test.go: `.MustUnmarshalToMap("123")` $DIR/core/utils/utils_test.go: `.Sha256("test")` $DIR/core/utils/utils_test.go: `.DecodeString(hexHash)` $DIR/core/utils/utils_test.go: `.Done()` $DIR/core/utils/utils_test.go: `.After(testutils.WaitTimeout(t))` $DIR/core/utils/utils_test.go: `.WaitTimeout(t)` $DIR/core/utils/utils_test.go: `.Run("closing channel", func(t *testing.T) { t.Parallel() ch := make(chan struct{}) ctx, cancel := utils.WithCloseChan(testutils.Context(t), ch) defer cancel() close(ch) assertCtxCancelled(ctx, t) })` $DIR/core/utils/utils_test.go: `.WithCloseChan(testutils.Context(t), ch)` $DIR/core/utils/utils_test.go: `.Context(t)` $DIR/core/utils/utils_test.go: `.Run("cancelling ctx", func(t *testing.T) { t.Parallel() ch := make(chan struct{}) defer close(ch) ctx, cancel := utils.WithCloseChan(testutils.Context(t), ch) cancel() assertCtxCancelled(ctx, t) })` $DIR/core/utils/utils_test.go: `.WithCloseChan(testutils.Context(t), ch)` $DIR/core/utils/utils_test.go: `.Context(t)` $DIR/core/utils/utils_test.go: `.WithCancel(testutils.Context(t))` $DIR/core/utils/utils_test.go: `.Context(t)` $DIR/core/utils/utils_test.go: `.WithCloseChan(pctx, ch)` $DIR/core/utils/utils_test.go: `.ContextFromChan(ch)` $DIR/core/utils/utils_test.go: `.Done()` $DIR/core/utils/utils_test.go: `.After(testutils.WaitTimeout(t))` $DIR/core/utils/utils_test.go: `.WaitTimeout(t)` $DIR/core/utils/utils_test.go: `.Done()` $DIR/core/utils/utils_test.go: `.After(testutils.WaitTimeout(t))` $DIR/core/utils/utils_test.go: `.WaitTimeout(t)` $DIR/core/utils/utils_test.go: `.Run("small deadline", func(t *testing.T) { t.Parallel() ch := make(chan struct{}) ctx, cancel := utils.ContextFromChanWithTimeout(ch, testutils.TestInterval) defer cancel() assertCtxCancelled(ctx, t) })` $DIR/core/utils/utils_test.go: `.ContextFromChanWithTimeout(ch, testutils.TestInterval)` $DIR/core/utils/utils_test.go: `.ContextFromChanWithTimeout(ch, testutils.WaitTimeout(t))` $DIR/core/utils/utils_test.go: `.WaitTimeout(t)` $DIR/core/utils/utils_test.go: `.LeftPadBitString(test.str, test.len)` $DIR/core/utils/utils_test.go: `.LockInt64(1)` $DIR/core/utils/utils_test.go: `.LockInt64(2)` $DIR/core/utils/utils_test.go: `.NewAwaiter()` $DIR/core/utils/utils_test.go: `.LockInt64(1)` $DIR/core/utils/utils_test.go: `.LockInt64(2)` $DIR/core/utils/utils_test.go: `.ItHappened()` $DIR/core/utils/utils_test.go: `.ValidateCronSchedule("")` $DIR/core/utils/utils_test.go: `.ValidateCronSchedule("CRON_TZ=UTC 5 * * * *")` $DIR/core/utils/utils_test.go: `.ValidateCronSchedule("@every 1h30m")` $DIR/core/utils/utils_test.go: `.ValidateCronSchedule("@every xyz")` $DIR/core/utils/utils_test.go: `.NewPausableTicker(testutils.TestInterval)` $DIR/core/utils/utils_test.go: `.Destroy()` $DIR/core/utils/utils_test.go: `.Ticks()` $DIR/core/utils/utils_test.go: `.Add(1)` $DIR/core/utils/utils_test.go: `.ItHappened()` $DIR/core/utils/utils_test.go: `.Resume()` $DIR/core/utils/utils_test.go: `.NewAwaiter()` $DIR/core/utils/utils_test.go: `.AwaitOrFail(t)` $DIR/core/utils/utils_test.go: `.Pause()` $DIR/core/utils/utils_test.go: `.Sleep(10 * testutils.TestInterval)` $DIR/core/utils/utils_test.go: `.Resume()` $DIR/core/utils/utils_test.go: `.NewAwaiter()` $DIR/core/utils/utils_test.go: `.NewCronTicker("@every 100ms")` $DIR/core/utils/utils_test.go: `.NewAwaiter()` $DIR/core/utils/utils_test.go: `.Ticks()` $DIR/core/utils/utils_test.go: `.Add(1)` $DIR/core/utils/utils_test.go: `.ItHappened()` $DIR/core/utils/utils_test.go: `.AwaitOrFail(t)` $DIR/core/utils/utils_test.go: `.Load()` $DIR/core/utils/utils_test.go: `.Sleep(1 * time.Second)` $DIR/core/utils/utils_test.go: `.Load()` $DIR/core/utils/utils_test.go: `.New("err1")` $DIR/core/utils/utils_test.go: `.New("err2")` $DIR/core/utils/utils_test.go: `.New("err3")` $DIR/core/utils/utils_test.go: `.Run("happy path", func(t *testing.T) { t.Parallel() buff := utils.ErrorBuffer{} buff.Append(err1) buff.Append(err2) combined := buff.Flush() errs := utils.UnwrapError(combined) assert.Equal(t, 2, len(errs)) assert.Equal(t, err1.Error(), errs[0].Error()) assert.Equal(t, err2.Error(), errs[1].Error()) })` $DIR/core/utils/utils_test.go: `.Append(err1)` $DIR/core/utils/utils_test.go: `.Append(err2)` $DIR/core/utils/utils_test.go: `.Flush()` $DIR/core/utils/utils_test.go: `.UnwrapError(combined)` $DIR/core/utils/utils_test.go: `.Run("ovewrite oldest error when cap exceeded", func(t *testing.T) { t.Parallel() buff := utils.ErrorBuffer{} buff.SetCap(2) buff.Append(err1) buff.Append(err2) buff.Append(err3) combined := buff.Flush() errs := utils.UnwrapError(combined) assert.Equal(t, 2, len(errs)) assert.Equal(t, err2.Error(), errs[0].Error()) assert.Equal(t, err3.Error(), errs[1].Error()) })` $DIR/core/utils/utils_test.go: `.SetCap(2)` $DIR/core/utils/utils_test.go: `.Append(err1)` $DIR/core/utils/utils_test.go: `.Append(err2)` $DIR/core/utils/utils_test.go: `.Append(err3)` $DIR/core/utils/utils_test.go: `.Flush()` $DIR/core/utils/utils_test.go: `.UnwrapError(combined)` $DIR/core/utils/utils_test.go: `.Run("does not overwrite the buffer if cap == 0", func(t *testing.T) { t.Parallel() buff := utils.ErrorBuffer{} for i := 1; i <= 20; i++ { buff.Append(errors.Errorf("err#%d", i)) } combined := buff.Flush() errs := utils.UnwrapError(combined) assert.Equal(t, 20, len(errs)) assert.Equal(t, "err#20", errs[19].Error()) })` $DIR/core/utils/utils_test.go: `.Append(errors.Errorf("err#%d", i))` $DIR/core/utils/utils_test.go: `.Flush()` $DIR/core/utils/utils_test.go: `.UnwrapError(combined)` $DIR/core/utils/utils_test.go: `.Run("UnwrapError returns the a single element err array if passed err is not a joinedError", func(t *testing.T) { t.Parallel() errs := utils.UnwrapError(err1) assert.Equal(t, 1, len(errs)) assert.Equal(t, err1.Error(), errs[0].Error()) })` $DIR/core/utils/utils_test.go: `.UnwrapError(err1)` $DIR/core/utils/utils_test.go: `.Flush()` $DIR/core/web/api_test.go: `t.Run(test.name, func(t *testing.T) { size, page, offset, err := ParsePaginatedRequest(test.sizeParam, test.pageParam) if test.err { assert.Error(t, err) } else { assert.NoError(t, err) } assert.Equal(t, test.size, size) assert.Equal(t, test.page, page) assert.Equal(t, test.offset, offset) })` $DIR/core/web/api_test.go: `t.Run(test.name, func(t *testing.T) { url, err := url.Parse(test.path) assert.NoError(t, err) buffer, err := NewPaginatedResponse(*url, test.size, test.page, test.count, test.resource) if test.err { assert.Error(t, err) } else { assert.NoError(t, err) } assert.Equal(t, test.output, string(buffer)) })` $DIR/core/web/api_test.go: `err = ParsePaginatedResponse([]byte(`{"data":[{"type":"testNotResources","id":"1","attributes":{}}]}`), &docs, &links)` $DIR/core/web/api_test.go: `err = ParsePaginatedResponse([]byte(`{"links":[],"data":[{"type":"testResources","id":"1","attributes":{}}]}`), &docs, &links)` $DIR/core/web/api_test.go: `buffer, err = NewJSONAPIResponse(&r)` $DIR/core/web/api_test.go: `.Run(test.name, func(t *testing.T) { size, page, offset, err := ParsePaginatedRequest(test.sizeParam, test.pageParam) if test.err { assert.Error(t, err) } else { assert.NoError(t, err) } assert.Equal(t, test.size, size) assert.Equal(t, test.page, page) assert.Equal(t, test.offset, offset) })` $DIR/core/web/api_test.go: `.Run(test.name, func(t *testing.T) { url, err := url.Parse(test.path) assert.NoError(t, err) buffer, err := NewPaginatedResponse(*url, test.size, test.page, test.count, test.resource) if test.err { assert.Error(t, err) } else { assert.NoError(t, err) } assert.Equal(t, test.output, string(buffer)) })` $DIR/core/web/api_test.go: `.Parse(test.path)` $DIR/core/web/auth/auth_test.go: `router.Use(webauth.Authenticate(authr, webauth.AuthenticateByToken))` $DIR/core/web/auth/auth_test.go: `router.GET("/", func(c *gin.Context) { called = true c.String(http.StatusOK, "") })` $DIR/core/web/auth/auth_test.go: `called = true` $DIR/core/web/auth/auth_test.go: `c.String(http.StatusOK, "")` $DIR/core/web/auth/auth_test.go: `req.Header.Set(webauth.APIKey, key)` $DIR/core/web/auth/auth_test.go: `req.Header.Set(webauth.APISecret, secret)` $DIR/core/web/auth/auth_test.go: `router.ServeHTTP(w, req)` $DIR/core/web/auth/auth_test.go: `router.Use(webauth.Authenticate(authr, webauth.AuthenticateByToken))` $DIR/core/web/auth/auth_test.go: `router.GET("/", func(c *gin.Context) { called = true c.String(http.StatusOK, "") })` $DIR/core/web/auth/auth_test.go: `called = true` $DIR/core/web/auth/auth_test.go: `c.String(http.StatusOK, "")` $DIR/core/web/auth/auth_test.go: `req.Header.Set(webauth.APIKey, "bad-key")` $DIR/core/web/auth/auth_test.go: `req.Header.Set(webauth.APISecret, "bad-secret")` $DIR/core/web/auth/auth_test.go: `router.ServeHTTP(w, req)` $DIR/core/web/auth/auth_test.go: `router.Use(webauth.Authenticate(authr, webauth.AuthenticateByToken))` $DIR/core/web/auth/auth_test.go: `router.GET("/", func(c *gin.Context) { called = true c.String(http.StatusOK, "") })` $DIR/core/web/auth/auth_test.go: `called = true` $DIR/core/web/auth/auth_test.go: `c.String(http.StatusOK, "")` $DIR/core/web/auth/auth_test.go: `req.Header.Set(webauth.APIKey, key)` $DIR/core/web/auth/auth_test.go: `req.Header.Set(webauth.APISecret, secret)` $DIR/core/web/auth/auth_test.go: `router.ServeHTTP(w, req)` $DIR/core/web/auth/auth_test.go: `router.Use(webauth.Authenticate(authr))` $DIR/core/web/auth/auth_test.go: `router.GET("/", func(c *gin.Context) { called = true c.String(http.StatusOK, "") })` $DIR/core/web/auth/auth_test.go: `called = true` $DIR/core/web/auth/auth_test.go: `c.String(http.StatusOK, "")` $DIR/core/web/auth/auth_test.go: `router.ServeHTTP(w, req)` $DIR/core/web/auth/auth_test.go: `router.Use(webauth.Authenticate(authr, authFailure))` $DIR/core/web/auth/auth_test.go: `router.GET("/", func(c *gin.Context) { called = true c.String(http.StatusOK, "") })` $DIR/core/web/auth/auth_test.go: `called = true` $DIR/core/web/auth/auth_test.go: `c.String(http.StatusOK, "")` $DIR/core/web/auth/auth_test.go: `router.ServeHTTP(w, req)` $DIR/core/web/auth/auth_test.go: `router.Use(webauth.Authenticate(authr, authFailure, authSuccess))` $DIR/core/web/auth/auth_test.go: `router.GET("/", func(c *gin.Context) { called = true c.String(http.StatusOK, "") })` $DIR/core/web/auth/auth_test.go: `called = true` $DIR/core/web/auth/auth_test.go: `c.String(http.StatusOK, "")` $DIR/core/web/auth/auth_test.go: `router.ServeHTTP(w, req)` $DIR/core/web/auth/auth_test.go: `router.Use(webauth.Authenticate(authr, authError, authSuccess))` $DIR/core/web/auth/auth_test.go: `router.GET("/", func(c *gin.Context) { called = true c.String(http.StatusOK, "") })` $DIR/core/web/auth/auth_test.go: `called = true` $DIR/core/web/auth/auth_test.go: `c.String(http.StatusOK, "")` $DIR/core/web/auth/auth_test.go: `router.ServeHTTP(w, req)` $DIR/core/web/auth/auth_test.go: `func() { var resp *http.Response var cleanup func() switch route.verb { case "GET": resp, cleanup = client.Get(route.path) case "POST": resp, cleanup = client.Post(route.path, nil) case "DELETE": resp, cleanup = client.Delete(route.path) case "PATCH": resp, cleanup = client.Patch(route.path, nil) case "PUT": resp, cleanup = client.Put(route.path, nil) default: t.Fatalf("Unknown HTTP verb %s\n", route.verb) } defer cleanup() assert.NotEqual(t, http.StatusUnauthorized, resp.StatusCode) assert.NotEqual(t, http.StatusForbidden, resp.StatusCode) }()` $DIR/core/web/auth/auth_test.go: `resp, cleanup = client.Get(route.path)` $DIR/core/web/auth/auth_test.go: `resp, cleanup = client.Post(route.path, nil)` $DIR/core/web/auth/auth_test.go: `resp, cleanup = client.Delete(route.path)` $DIR/core/web/auth/auth_test.go: `resp, cleanup = client.Patch(route.path, nil)` $DIR/core/web/auth/auth_test.go: `resp, cleanup = client.Put(route.path, nil)` $DIR/core/web/auth/auth_test.go: `func() { var resp *http.Response var cleanup func() switch route.verb { case "GET": resp, cleanup = client.Get(route.path) case "POST": resp, cleanup = client.Post(route.path, nil) case "DELETE": resp, cleanup = client.Delete(route.path) case "PATCH": resp, cleanup = client.Patch(route.path, nil) case "PUT": resp, cleanup = client.Put(route.path, nil) default: t.Fatalf("Unknown HTTP verb %s\n", route.verb) } defer cleanup() // If this route allows up to an edit role, don't expect an unauthorized response if route.EditAllowed || route.editMinimalAllowed || route.viewOnlyAllowed { assert.NotEqual(t, http.StatusUnauthorized, resp.StatusCode) assert.NotEqual(t, http.StatusForbidden, resp.StatusCode) } else if !route.EditAllowed { assert.Equal(t, http.StatusForbidden, resp.StatusCode) } else { assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) } }()` $DIR/core/web/auth/auth_test.go: `resp, cleanup = client.Get(route.path)` $DIR/core/web/auth/auth_test.go: `resp, cleanup = client.Post(route.path, nil)` $DIR/core/web/auth/auth_test.go: `resp, cleanup = client.Delete(route.path)` $DIR/core/web/auth/auth_test.go: `resp, cleanup = client.Patch(route.path, nil)` $DIR/core/web/auth/auth_test.go: `resp, cleanup = client.Put(route.path, nil)` $DIR/core/web/auth/auth_test.go: `func() { var resp *http.Response var cleanup func() switch route.verb { case "GET": resp, cleanup = client.Get(route.path) case "POST": resp, cleanup = client.Post(route.path, nil) case "DELETE": resp, cleanup = client.Delete(route.path) case "PATCH": resp, cleanup = client.Patch(route.path, nil) case "PUT": resp, cleanup = client.Put(route.path, nil) default: t.Fatalf("Unknown HTTP verb %s\n", route.verb) } defer cleanup() // If this route allows up to an edit minimal role, don't expect an unauthorized response if route.editMinimalAllowed || route.viewOnlyAllowed { assert.NotEqual(t, http.StatusUnauthorized, resp.StatusCode) assert.NotEqual(t, http.StatusForbidden, resp.StatusCode) } else if !route.EditAllowed { assert.Equal(t, http.StatusForbidden, resp.StatusCode) } else { assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) } }()` $DIR/core/web/auth/auth_test.go: `resp, cleanup = client.Get(route.path)` $DIR/core/web/auth/auth_test.go: `resp, cleanup = client.Post(route.path, nil)` $DIR/core/web/auth/auth_test.go: `resp, cleanup = client.Delete(route.path)` $DIR/core/web/auth/auth_test.go: `resp, cleanup = client.Patch(route.path, nil)` $DIR/core/web/auth/auth_test.go: `resp, cleanup = client.Put(route.path, nil)` $DIR/core/web/auth/auth_test.go: `t.Run(fmt.Sprintf("%d-%s-%s", i, route.verb, route.path), func(t *testing.T) { var resp *http.Response var cleanup func() switch route.verb { case "GET": resp, cleanup = client.Get(route.path) case "POST": resp, cleanup = client.Post(route.path, nil) case "DELETE": resp, cleanup = client.Delete(route.path) case "PATCH": resp, cleanup = client.Patch(route.path, nil) case "PUT": resp, cleanup = client.Put(route.path, nil) default: t.Fatalf("Unknown HTTP verb %s\n", route.verb) } defer cleanup() // If this route only allows view only, don't expect an unauthorized response if route.viewOnlyAllowed { assert.NotEqual(t, http.StatusUnauthorized, resp.StatusCode) assert.NotEqual(t, http.StatusForbidden, resp.StatusCode) } else if !route.EditAllowed { assert.Equal(t, http.StatusForbidden, resp.StatusCode) } else { assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) } })` $DIR/core/web/auth/auth_test.go: `resp, cleanup = client.Get(route.path)` $DIR/core/web/auth/auth_test.go: `resp, cleanup = client.Post(route.path, nil)` $DIR/core/web/auth/auth_test.go: `resp, cleanup = client.Delete(route.path)` $DIR/core/web/auth/auth_test.go: `resp, cleanup = client.Patch(route.path, nil)` $DIR/core/web/auth/auth_test.go: `resp, cleanup = client.Put(route.path, nil)` $DIR/core/web/auth/auth_test.go: `.MustRandomUser(t)` $DIR/core/web/auth/auth_test.go: `.New()` $DIR/core/web/auth/auth_test.go: `.String()` $DIR/core/web/auth/auth_test.go: `.New()` $DIR/core/web/auth/auth_test.go: `.String()` $DIR/core/web/auth/auth_test.go: `.SetAuthToken(&apiToken)` $DIR/core/web/auth/auth_test.go: `.New()` $DIR/core/web/auth/auth_test.go: `.Use(webauth.Authenticate(authr, webauth.AuthenticateByToken))` $DIR/core/web/auth/auth_test.go: `.Authenticate(authr, webauth.AuthenticateByToken)` $DIR/core/web/auth/auth_test.go: `.GET("/", func(c *gin.Context) { called = true c.String(http.StatusOK, "") })` $DIR/core/web/auth/auth_test.go: `.String(http.StatusOK, "")` $DIR/core/web/auth/auth_test.go: `.NewRecorder()` $DIR/core/web/auth/auth_test.go: `.Header.Set(webauth.APIKey, key)` $DIR/core/web/auth/auth_test.go: `.Header.Set(webauth.APISecret, secret)` $DIR/core/web/auth/auth_test.go: `.ServeHTTP(w, req)` $DIR/core/web/auth/auth_test.go: `.StatusText(http.StatusOK)` $DIR/core/web/auth/auth_test.go: `.StatusText(w.Code)` $DIR/core/web/auth/auth_test.go: `.New()` $DIR/core/web/auth/auth_test.go: `.Use(webauth.Authenticate(authr, webauth.AuthenticateByToken))` $DIR/core/web/auth/auth_test.go: `.Authenticate(authr, webauth.AuthenticateByToken)` $DIR/core/web/auth/auth_test.go: `.GET("/", func(c *gin.Context) { called = true c.String(http.StatusOK, "") })` $DIR/core/web/auth/auth_test.go: `.String(http.StatusOK, "")` $DIR/core/web/auth/auth_test.go: `.NewRecorder()` $DIR/core/web/auth/auth_test.go: `.Header.Set(webauth.APIKey, "bad-key")` $DIR/core/web/auth/auth_test.go: `.Header.Set(webauth.APISecret, "bad-secret")` $DIR/core/web/auth/auth_test.go: `.ServeHTTP(w, req)` $DIR/core/web/auth/auth_test.go: `.StatusText(http.StatusUnauthorized)` $DIR/core/web/auth/auth_test.go: `.StatusText(w.Code)` $DIR/core/web/auth/auth_test.go: `.MustRandomUser(t)` $DIR/core/web/auth/auth_test.go: `.New()` $DIR/core/web/auth/auth_test.go: `.String()` $DIR/core/web/auth/auth_test.go: `.SetAuthToken(&apiToken)` $DIR/core/web/auth/auth_test.go: `.New()` $DIR/core/web/auth/auth_test.go: `.Use(webauth.Authenticate(authr, webauth.AuthenticateByToken))` $DIR/core/web/auth/auth_test.go: `.Authenticate(authr, webauth.AuthenticateByToken)` $DIR/core/web/auth/auth_test.go: `.GET("/", func(c *gin.Context) { called = true c.String(http.StatusOK, "") })` $DIR/core/web/auth/auth_test.go: `.String(http.StatusOK, "")` $DIR/core/web/auth/auth_test.go: `.NewRecorder()` $DIR/core/web/auth/auth_test.go: `.Header.Set(webauth.APIKey, key)` $DIR/core/web/auth/auth_test.go: `.Header.Set(webauth.APISecret, secret)` $DIR/core/web/auth/auth_test.go: `.ServeHTTP(w, req)` $DIR/core/web/auth/auth_test.go: `.StatusText(http.StatusUnauthorized)` $DIR/core/web/auth/auth_test.go: `.StatusText(w.Code)` $DIR/core/web/auth/auth_test.go: `.New()` $DIR/core/web/auth/auth_test.go: `.Use(webauth.Authenticate(authr))` $DIR/core/web/auth/auth_test.go: `.Authenticate(authr)` $DIR/core/web/auth/auth_test.go: `.GET("/", func(c *gin.Context) { called = true c.String(http.StatusOK, "") })` $DIR/core/web/auth/auth_test.go: `.String(http.StatusOK, "")` $DIR/core/web/auth/auth_test.go: `.NewRecorder()` $DIR/core/web/auth/auth_test.go: `.ServeHTTP(w, req)` $DIR/core/web/auth/auth_test.go: `.StatusText(http.StatusOK)` $DIR/core/web/auth/auth_test.go: `.StatusText(w.Code)` $DIR/core/web/auth/auth_test.go: `.New()` $DIR/core/web/auth/auth_test.go: `.Use(webauth.Authenticate(authr, authFailure))` $DIR/core/web/auth/auth_test.go: `.Authenticate(authr, authFailure)` $DIR/core/web/auth/auth_test.go: `.GET("/", func(c *gin.Context) { called = true c.String(http.StatusOK, "") })` $DIR/core/web/auth/auth_test.go: `.String(http.StatusOK, "")` $DIR/core/web/auth/auth_test.go: `.NewRecorder()` $DIR/core/web/auth/auth_test.go: `.ServeHTTP(w, req)` $DIR/core/web/auth/auth_test.go: `.StatusText(http.StatusUnauthorized)` $DIR/core/web/auth/auth_test.go: `.StatusText(w.Code)` $DIR/core/web/auth/auth_test.go: `.New()` $DIR/core/web/auth/auth_test.go: `.Use(webauth.Authenticate(authr, authFailure, authSuccess))` $DIR/core/web/auth/auth_test.go: `.Authenticate(authr, authFailure, authSuccess)` $DIR/core/web/auth/auth_test.go: `.GET("/", func(c *gin.Context) { called = true c.String(http.StatusOK, "") })` $DIR/core/web/auth/auth_test.go: `.String(http.StatusOK, "")` $DIR/core/web/auth/auth_test.go: `.NewRecorder()` $DIR/core/web/auth/auth_test.go: `.ServeHTTP(w, req)` $DIR/core/web/auth/auth_test.go: `.StatusText(http.StatusOK)` $DIR/core/web/auth/auth_test.go: `.StatusText(w.Code)` $DIR/core/web/auth/auth_test.go: `.New()` $DIR/core/web/auth/auth_test.go: `.Use(webauth.Authenticate(authr, authError, authSuccess))` $DIR/core/web/auth/auth_test.go: `.Authenticate(authr, authError, authSuccess)` $DIR/core/web/auth/auth_test.go: `.GET("/", func(c *gin.Context) { called = true c.String(http.StatusOK, "") })` $DIR/core/web/auth/auth_test.go: `.String(http.StatusOK, "")` $DIR/core/web/auth/auth_test.go: `.NewRecorder()` $DIR/core/web/auth/auth_test.go: `.ServeHTTP(w, req)` $DIR/core/web/auth/auth_test.go: `.StatusText(http.StatusUnauthorized)` $DIR/core/web/auth/auth_test.go: `.StatusText(w.Code)` $DIR/core/web/auth/auth_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/auth/auth_test.go: `.Router(t, app, nil)` $DIR/core/web/auth/auth_test.go: `.NewServer(router)` $DIR/core/web/auth/auth_test.go: `.NewHTTPClient(nil)` $DIR/core/web/auth/auth_test.go: `.Get(route.path)` $DIR/core/web/auth/auth_test.go: `.Post(route.path, nil)` $DIR/core/web/auth/auth_test.go: `.Delete(route.path)` $DIR/core/web/auth/auth_test.go: `.Patch(route.path, nil)` $DIR/core/web/auth/auth_test.go: `.Put(route.path, nil)` $DIR/core/web/auth/auth_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/auth/auth_test.go: `.Router(t, app, nil)` $DIR/core/web/auth/auth_test.go: `.NewServer(router)` $DIR/core/web/auth/auth_test.go: `.NewHTTPClient(u)` $DIR/core/web/auth/auth_test.go: `.Get(route.path)` $DIR/core/web/auth/auth_test.go: `.Post(route.path, nil)` $DIR/core/web/auth/auth_test.go: `.Delete(route.path)` $DIR/core/web/auth/auth_test.go: `.Patch(route.path, nil)` $DIR/core/web/auth/auth_test.go: `.Put(route.path, nil)` $DIR/core/web/auth/auth_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/auth/auth_test.go: `.Router(t, app, nil)` $DIR/core/web/auth/auth_test.go: `.NewServer(router)` $DIR/core/web/auth/auth_test.go: `.NewHTTPClient(u)` $DIR/core/web/auth/auth_test.go: `.Get(route.path)` $DIR/core/web/auth/auth_test.go: `.Post(route.path, nil)` $DIR/core/web/auth/auth_test.go: `.Delete(route.path)` $DIR/core/web/auth/auth_test.go: `.Patch(route.path, nil)` $DIR/core/web/auth/auth_test.go: `.Put(route.path, nil)` $DIR/core/web/auth/auth_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/auth/auth_test.go: `.Router(t, app, nil)` $DIR/core/web/auth/auth_test.go: `.NewServer(router)` $DIR/core/web/auth/auth_test.go: `.NewHTTPClient(u)` $DIR/core/web/auth/auth_test.go: `.Run(fmt.Sprintf("%d-%s-%s", i, route.verb, route.path), func(t *testing.T) { var resp *http.Response var cleanup func() switch route.verb { case "GET": resp, cleanup = client.Get(route.path) case "POST": resp, cleanup = client.Post(route.path, nil) case "DELETE": resp, cleanup = client.Delete(route.path) case "PATCH": resp, cleanup = client.Patch(route.path, nil) case "PUT": resp, cleanup = client.Put(route.path, nil) default: t.Fatalf("Unknown HTTP verb %s\n", route.verb) } defer cleanup() // If this route only allows view only, don't expect an unauthorized response if route.viewOnlyAllowed { assert.NotEqual(t, http.StatusUnauthorized, resp.StatusCode) assert.NotEqual(t, http.StatusForbidden, resp.StatusCode) } else if !route.EditAllowed { assert.Equal(t, http.StatusForbidden, resp.StatusCode) } else { assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) } })` $DIR/core/web/auth/auth_test.go: `.Sprintf("%d-%s-%s", i, route.verb, route.path)` $DIR/core/web/auth/auth_test.go: `.Get(route.path)` $DIR/core/web/auth/auth_test.go: `.Post(route.path, nil)` $DIR/core/web/auth/auth_test.go: `.Delete(route.path)` $DIR/core/web/auth/auth_test.go: `.Patch(route.path, nil)` $DIR/core/web/auth/auth_test.go: `.Put(route.path, nil)` $DIR/core/web/auth/gql_test.go: `r.Use(sessions.Sessions(auth.SessionName, sessionStore))` $DIR/core/web/auth/gql_test.go: `r.Use(auth.AuthenticateGQL(sessionORM, logger.TestLogger(t)))` $DIR/core/web/auth/gql_test.go: `r.GET("/", func(c *gin.Context) { session, ok := auth.GetGQLAuthenticatedSession(c) assert.False(t, ok) assert.Nil(t, session) c.String(http.StatusOK, "") })` $DIR/core/web/auth/gql_test.go: `c.String(http.StatusOK, "")` $DIR/core/web/auth/gql_test.go: `r.Use(sessions.Sessions(auth.SessionName, sessionStore))` $DIR/core/web/auth/gql_test.go: `r.Use(auth.AuthenticateGQL(sessionORM, logger.TestLogger(t)))` $DIR/core/web/auth/gql_test.go: `r.GET("/", func(c *gin.Context) { session, ok := auth.GetGQLAuthenticatedSession(c.Request.Context()) assert.True(t, ok) assert.NotNil(t, session) c.String(http.StatusOK, "") })` $DIR/core/web/auth/gql_test.go: `c.String(http.StatusOK, "")` $DIR/core/web/auth/gql_test.go: `sessionORM.On("AuthorizedUserWithSession", mock.Anything, sessionID).Return(clsessions.User{Email: cltest.APIEmailAdmin, Role: clsessions.UserRoleAdmin}, nil)` $DIR/core/web/auth/gql_test.go: `req.AddCookie(cookie)` $DIR/core/web/auth/gql_test.go: `ctx = auth.WithGQLAuthenticatedSession(ctx, user, "sessionID")` $DIR/core/web/auth/gql_test.go: `.NewAuthenticationProvider(t)` $DIR/core/web/auth/gql_test.go: `.NewStore([]byte("secret"))` $DIR/core/web/auth/gql_test.go: `.Default()` $DIR/core/web/auth/gql_test.go: `.Use(sessions.Sessions(auth.SessionName, sessionStore))` $DIR/core/web/auth/gql_test.go: `.Sessions(auth.SessionName, sessionStore)` $DIR/core/web/auth/gql_test.go: `.Use(auth.AuthenticateGQL(sessionORM, logger.TestLogger(t)))` $DIR/core/web/auth/gql_test.go: `.AuthenticateGQL(sessionORM, logger.TestLogger(t))` $DIR/core/web/auth/gql_test.go: `.TestLogger(t)` $DIR/core/web/auth/gql_test.go: `.GET("/", func(c *gin.Context) { session, ok := auth.GetGQLAuthenticatedSession(c) assert.False(t, ok) assert.Nil(t, session) c.String(http.StatusOK, "") })` $DIR/core/web/auth/gql_test.go: `.GetGQLAuthenticatedSession(c)` $DIR/core/web/auth/gql_test.go: `.String(http.StatusOK, "")` $DIR/core/web/auth/gql_test.go: `.NewRecorder()` $DIR/core/web/auth/gql_test.go: `.NewAuthenticationProvider(t)` $DIR/core/web/auth/gql_test.go: `.NewStore([]byte(cltest.SessionSecret))` $DIR/core/web/auth/gql_test.go: `.Default()` $DIR/core/web/auth/gql_test.go: `.Use(sessions.Sessions(auth.SessionName, sessionStore))` $DIR/core/web/auth/gql_test.go: `.Sessions(auth.SessionName, sessionStore)` $DIR/core/web/auth/gql_test.go: `.Use(auth.AuthenticateGQL(sessionORM, logger.TestLogger(t)))` $DIR/core/web/auth/gql_test.go: `.AuthenticateGQL(sessionORM, logger.TestLogger(t))` $DIR/core/web/auth/gql_test.go: `.TestLogger(t)` $DIR/core/web/auth/gql_test.go: `.GET("/", func(c *gin.Context) { session, ok := auth.GetGQLAuthenticatedSession(c.Request.Context()) assert.True(t, ok) assert.NotNil(t, session) c.String(http.StatusOK, "") })` $DIR/core/web/auth/gql_test.go: `.GetGQLAuthenticatedSession(c.Request.Context())` $DIR/core/web/auth/gql_test.go: `.Request.Context()` $DIR/core/web/auth/gql_test.go: `.String(http.StatusOK, "")` $DIR/core/web/auth/gql_test.go: `.On("AuthorizedUserWithSession", mock.Anything, sessionID)` $DIR/core/web/auth/gql_test.go: `.Return(clsessions.User{Email: cltest.APIEmailAdmin, Role: clsessions.UserRoleAdmin}, nil)` $DIR/core/web/auth/gql_test.go: `.NewRecorder()` $DIR/core/web/auth/gql_test.go: `.MustGenerateSessionCookie(t, sessionID)` $DIR/core/web/auth/gql_test.go: `.AddCookie(cookie)` $DIR/core/web/auth/gql_test.go: `.Context(t)` $DIR/core/web/auth/gql_test.go: `.WithGQLAuthenticatedSession(ctx, user, "sessionID")` $DIR/core/web/auth/gql_test.go: `.GetGQLAuthenticatedSession(ctx)` $DIR/core/web/bridge_types_controller_test.go: `t.Run(test.description, func(t *testing.T) { req := test.request result := web.ValidateBridgeType(&req) assert.Equal(t, test.want, result) })` $DIR/core/web/bridge_types_controller_test.go: `bt.Name = bridges.MustParseBridgeName("solargridreporting")` $DIR/core/web/bridge_types_controller_test.go: `bt.URL = cltest.WebURL(t, "https://denergy.eth")` $DIR/core/web/bridge_types_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/bridge_types_controller_test.go: `cltest.AssertServerResponse(t, resp, http.StatusUnprocessableEntity)` $DIR/core/web/bridge_types_controller_test.go: `resp, cleanup = client.Get("/v2/bridge_types?size=1")` $DIR/core/web/bridge_types_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/bridge_types_controller_test.go: `cltest.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/bridge_types_controller_test.go: `err = web.ParsePaginatedResponse(cltest.ParseResponseBody(t, resp), &resources, &links)` $DIR/core/web/bridge_types_controller_test.go: `resp, cleanup = client.Get(links["next"].Href)` $DIR/core/web/bridge_types_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/bridge_types_controller_test.go: `cltest.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/bridge_types_controller_test.go: `resources = []presenters.BridgeResource{}` $DIR/core/web/bridge_types_controller_test.go: `err = web.ParsePaginatedResponse(cltest.ParseResponseBody(t, resp), &resources, &links)` $DIR/core/web/bridge_types_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/bridge_types_controller_test.go: `cltest.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/bridge_types_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/bridge_types_controller_test.go: `cltest.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/bridge_types_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/bridge_types_controller_test.go: `resp, cleanup = client.Get("/v2/bridge_types/nosuchbridge")` $DIR/core/web/bridge_types_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/bridge_types_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/bridge_types_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/bridge_types_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/bridge_types_controller_test.go: `.WebURL(t, "https://denergy.eth")` $DIR/core/web/bridge_types_controller_test.go: `.NewJSONAPIErrorsWith("No name specified")` $DIR/core/web/bridge_types_controller_test.go: `.WebURL(t, "https://denergy.eth")` $DIR/core/web/bridge_types_controller_test.go: `.NewJSONAPIErrorsWith("task type validation: name invalid/adapter contains invalid characters")` $DIR/core/web/bridge_types_controller_test.go: `.WebURL(t, "")` $DIR/core/web/bridge_types_controller_test.go: `.NewJSONAPIErrorsWith("URL must be present")` $DIR/core/web/bridge_types_controller_test.go: `.WebURL(t, "//denergy")` $DIR/core/web/bridge_types_controller_test.go: `.WebURL(t, "http://chainlink_cmc-adapter_1:8080")` $DIR/core/web/bridge_types_controller_test.go: `.WebURL(t, "http://chainlink_cmc-adapter_1:8080")` $DIR/core/web/bridge_types_controller_test.go: `.NewLinkFromJuels(1)` $DIR/core/web/bridge_types_controller_test.go: `.WebURL(t, "http://chainlink_cmc-adapter_1:8080")` $DIR/core/web/bridge_types_controller_test.go: `.NewLinkFromJuels(-1)` $DIR/core/web/bridge_types_controller_test.go: `.NewJSONAPIErrorsWith("MinimumContractPayment must be positive")` $DIR/core/web/bridge_types_controller_test.go: `.WebURL(t, "https://denergy.eth")` $DIR/core/web/bridge_types_controller_test.go: `.WebURL(t, "https://denergy.eth")` $DIR/core/web/bridge_types_controller_test.go: `.Run(test.description, func(t *testing.T) { req := test.request result := web.ValidateBridgeType(&req) assert.Equal(t, test.want, result) })` $DIR/core/web/bridge_types_controller_test.go: `.ValidateBridgeType(&req)` $DIR/core/web/bridge_types_controller_test.go: `.Context(t)` $DIR/core/web/bridge_types_controller_test.go: `.NewSqlxDB(t)` $DIR/core/web/bridge_types_controller_test.go: `.NewORM(db)` $DIR/core/web/bridge_types_controller_test.go: `.MustParseBridgeName("solargridreporting")` $DIR/core/web/bridge_types_controller_test.go: `.WebURL(t, "https://denergy.eth")` $DIR/core/web/bridge_types_controller_test.go: `.NewJSONAPIErrorsWith("Bridge Type solargridreporting already exists")` $DIR/core/web/bridge_types_controller_test.go: `.ValidateBridgeTypeNotExist(ctx, &newBridge, orm)` $DIR/core/web/bridge_types_controller_test.go: `.NewApplication(t)` $DIR/core/web/bridge_types_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/bridge_types_controller_test.go: `.BridgeORM()` $DIR/core/web/bridge_types_controller_test.go: `.Get("/v2/bridge_types?size=x")` $DIR/core/web/bridge_types_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/bridge_types_controller_test.go: `.AssertServerResponse(t, resp, http.StatusUnprocessableEntity)` $DIR/core/web/bridge_types_controller_test.go: `.Get("/v2/bridge_types?size=1")` $DIR/core/web/bridge_types_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/bridge_types_controller_test.go: `.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/bridge_types_controller_test.go: `.ParsePaginatedResponse(cltest.ParseResponseBody(t, resp), &resources, &links)` $DIR/core/web/bridge_types_controller_test.go: `.ParseResponseBody(t, resp)` $DIR/core/web/bridge_types_controller_test.go: `.Get(links["next"].Href)` $DIR/core/web/bridge_types_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/bridge_types_controller_test.go: `.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/bridge_types_controller_test.go: `.ParsePaginatedResponse(cltest.ParseResponseBody(t, resp), &resources, &links)` $DIR/core/web/bridge_types_controller_test.go: `.ParseResponseBody(t, resp)` $DIR/core/web/bridge_types_controller_test.go: `.NewApplication(t)` $DIR/core/web/bridge_types_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/bridge_types_controller_test.go: `.Post( "/v2/bridge_types", bytes.NewBuffer(cltest.MustReadFile(t, "../testdata/apiresponses/create_random_number_bridge_type.json")), )` $DIR/core/web/bridge_types_controller_test.go: `.NewBuffer(cltest.MustReadFile(t, "../testdata/apiresponses/create_random_number_bridge_type.json"))` $DIR/core/web/bridge_types_controller_test.go: `.MustReadFile(t, "../testdata/apiresponses/create_random_number_bridge_type.json")` $DIR/core/web/bridge_types_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/bridge_types_controller_test.go: `.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/bridge_types_controller_test.go: `.ParseJSON(t, resp.Body)` $DIR/core/web/bridge_types_controller_test.go: `.Get("data.attributes.name")` $DIR/core/web/bridge_types_controller_test.go: `.String()` $DIR/core/web/bridge_types_controller_test.go: `.Context(t)` $DIR/core/web/bridge_types_controller_test.go: `.BridgeORM()` $DIR/core/web/bridge_types_controller_test.go: `.FindBridge(ctx, bridges.MustParseBridgeName(btName))` $DIR/core/web/bridge_types_controller_test.go: `.MustParseBridgeName(btName)` $DIR/core/web/bridge_types_controller_test.go: `.NewApplication(t)` $DIR/core/web/bridge_types_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/bridge_types_controller_test.go: `.RandomizeName("BRidgea")` $DIR/core/web/bridge_types_controller_test.go: `.MustParseBridgeName(bridgeName)` $DIR/core/web/bridge_types_controller_test.go: `.WebURL(t, "http://mybridge")` $DIR/core/web/bridge_types_controller_test.go: `.Context(t)` $DIR/core/web/bridge_types_controller_test.go: `.Sprintf(`{"name": "%s","url":"http://yourbridge"}`, bridgeName)` $DIR/core/web/bridge_types_controller_test.go: `.NewBuffer([]byte(body))` $DIR/core/web/bridge_types_controller_test.go: `.Patch("/v2/bridge_types/"+bridgeName, ud)` $DIR/core/web/bridge_types_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/bridge_types_controller_test.go: `.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/bridge_types_controller_test.go: `.BridgeORM()` $DIR/core/web/bridge_types_controller_test.go: `.FindBridge(ctx, bt.Name)` $DIR/core/web/bridge_types_controller_test.go: `.WebURL(t, "http://yourbridge")` $DIR/core/web/bridge_types_controller_test.go: `.NewApplication(t)` $DIR/core/web/bridge_types_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/bridge_types_controller_test.go: `.MustParseBridgeName(testutils.RandomizeName("showbridge"))` $DIR/core/web/bridge_types_controller_test.go: `.RandomizeName("showbridge")` $DIR/core/web/bridge_types_controller_test.go: `.WebURL(t, "https://testing.com/bridges")` $DIR/core/web/bridge_types_controller_test.go: `.Context(t)` $DIR/core/web/bridge_types_controller_test.go: `.Get("/v2/bridge_types/" + bt.Name.String())` $DIR/core/web/bridge_types_controller_test.go: `.Name.String()` $DIR/core/web/bridge_types_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/bridge_types_controller_test.go: `.Get("/v2/bridge_types/nosuchbridge")` $DIR/core/web/bridge_types_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/bridge_types_controller_test.go: `.NewApplication(t)` $DIR/core/web/bridge_types_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/bridge_types_controller_test.go: `.Post( "/v2/bridge_types", bytes.NewBuffer(cltest.MustReadFile(t, "../testdata/apiresponses/existing_core_adapter.json")), )` $DIR/core/web/bridge_types_controller_test.go: `.NewBuffer(cltest.MustReadFile(t, "../testdata/apiresponses/existing_core_adapter.json"))` $DIR/core/web/bridge_types_controller_test.go: `.MustReadFile(t, "../testdata/apiresponses/existing_core_adapter.json")` $DIR/core/web/bridge_types_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/bridge_types_controller_test.go: `.NewApplication(t)` $DIR/core/web/bridge_types_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/bridge_types_controller_test.go: `.Post( "/v2/bridge_types", bytes.NewBufferString("}"), )` $DIR/core/web/bridge_types_controller_test.go: `.NewBufferString("}")` $DIR/core/web/bridge_types_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/bridge_types_controller_test.go: `.NewApplication(t)` $DIR/core/web/bridge_types_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/bridge_types_controller_test.go: `.Post( "/v2/bridge_types", bytes.NewBufferString(`{"url":"http://without.a.name"}`), )` $DIR/core/web/bridge_types_controller_test.go: `.NewBufferString(`{"url":"http://without.a.name"}`)` $DIR/core/web/bridge_types_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/build_info_controller_test.go: `cltest.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/build_info_controller_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/build_info_controller_test.go: `.Context(t)` $DIR/core/web/build_info_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/build_info_controller_test.go: `.Get("/v2/build_info")` $DIR/core/web/build_info_controller_test.go: `.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/build_info_controller_test.go: `.ParseResponseBody(t, resp)` $DIR/core/web/build_info_controller_test.go: `.TrimSpace(body)` $DIR/core/web/build_info_controller_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/build_info_controller_test.go: `.Context(t)` $DIR/core/web/build_info_controller_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/web/build_info_controller_test.go: `.NewRequestWithContext(ctx, "GET", url, nil)` $DIR/core/web/build_info_controller_test.go: `.Do(req)` $DIR/core/web/cors_test.go: `c.WebServer.AllowOrigins = ptr("http://localhost:3000,http://localhost:6689")` $DIR/core/web/cors_test.go: `t.Run(test.origin, func(t *testing.T) { app := cltest.NewApplicationWithConfig(t, config) client := app.NewHTTPClient(nil) headers := map[string]string{"Origin": test.origin} resp, cleanup := client.Get("/v2/chains/evm", headers) defer cleanup() cltest.AssertServerResponse(t, resp, test.statusCode) })` $DIR/core/web/cors_test.go: `cltest.AssertServerResponse(t, resp, test.statusCode)` $DIR/core/web/cors_test.go: `t.Run(test.origin, func(t *testing.T) { config := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.WebServer.AllowOrigins = ptr(test.allow) }) app := cltest.NewApplicationWithConfig(t, config) client := app.NewHTTPClient(nil) headers := map[string]string{"Origin": test.origin} resp, cleanup := client.Get("/v2/chains/evm", headers) defer cleanup() cltest.AssertServerResponse(t, resp, test.statusCode) })` $DIR/core/web/cors_test.go: `c.WebServer.AllowOrigins = ptr(test.allow)` $DIR/core/web/cors_test.go: `cltest.AssertServerResponse(t, resp, test.statusCode)` $DIR/core/web/cors_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.WebServer.AllowOrigins = ptr("http://localhost:3000,http://localhost:6689") })` $DIR/core/web/cors_test.go: `.Run(test.origin, func(t *testing.T) { app := cltest.NewApplicationWithConfig(t, config) client := app.NewHTTPClient(nil) headers := map[string]string{"Origin": test.origin} resp, cleanup := client.Get("/v2/chains/evm", headers) defer cleanup() cltest.AssertServerResponse(t, resp, test.statusCode) })` $DIR/core/web/cors_test.go: `.NewApplicationWithConfig(t, config)` $DIR/core/web/cors_test.go: `.NewHTTPClient(nil)` $DIR/core/web/cors_test.go: `.Get("/v2/chains/evm", headers)` $DIR/core/web/cors_test.go: `.AssertServerResponse(t, resp, test.statusCode)` $DIR/core/web/cors_test.go: `.Run(test.origin, func(t *testing.T) { config := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.WebServer.AllowOrigins = ptr(test.allow) }) app := cltest.NewApplicationWithConfig(t, config) client := app.NewHTTPClient(nil) headers := map[string]string{"Origin": test.origin} resp, cleanup := client.Get("/v2/chains/evm", headers) defer cleanup() cltest.AssertServerResponse(t, resp, test.statusCode) })` $DIR/core/web/cors_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.WebServer.AllowOrigins = ptr(test.allow) })` $DIR/core/web/cors_test.go: `.NewApplicationWithConfig(t, config)` $DIR/core/web/cors_test.go: `.NewHTTPClient(nil)` $DIR/core/web/cors_test.go: `.Get("/v2/chains/evm", headers)` $DIR/core/web/cors_test.go: `.AssertServerResponse(t, resp, test.statusCode)` $DIR/core/web/cosmos_chains_controller_test.go: `t.Run(tc.name, func(t *testing.T) { t.Parallel() controller := setupCosmosChainsControllerTestV2(t, &coscfg.TOMLConfig{ ChainID: ptr(validId), Enabled: ptr(true), Chain: coscfg.Chain{ FallbackGasPrice: ptr(decimal.RequireFromString("9.999")), GasLimitMultiplier: ptr(decimal.RequireFromString("1.55555")), }}) wantedResult := tc.want(t, controller.app) resp, cleanup := controller.client.Get( fmt.Sprintf("/v2/chains/cosmos/%s", tc.inputId), ) t.Cleanup(cleanup) require.Equal(t, tc.wantStatusCode, resp.StatusCode) if wantedResult != nil { resource1 := presenters.CosmosChainResource{} err := web.ParseJSONAPIResponse(cltest.ParseResponseBody(t, resp), &resource1) require.NoError(t, err) assert.Equal(t, wantedResult.ID, resource1.ID) assert.Equal(t, wantedResult.Config, resource1.Config) } })` $DIR/core/web/cosmos_chains_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/cosmos_chains_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/cosmos_chains_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/cosmos_chains_controller_test.go: `err = web.ParsePaginatedResponse(body, &chains, &links)` $DIR/core/web/cosmos_chains_controller_test.go: `resp, cleanup = controller.client.Get(links["next"].Href)` $DIR/core/web/cosmos_chains_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/cosmos_chains_controller_test.go: `chains = []presenters.CosmosChainResource{}` $DIR/core/web/cosmos_chains_controller_test.go: `err = web.ParsePaginatedResponse(cltest.ParseResponseBody(t, resp), &chains, &links)` $DIR/core/web/cosmos_chains_controller_test.go: `.Run(tc.name, func(t *testing.T) { t.Parallel() controller := setupCosmosChainsControllerTestV2(t, &coscfg.TOMLConfig{ ChainID: ptr(validId), Enabled: ptr(true), Chain: coscfg.Chain{ FallbackGasPrice: ptr(decimal.RequireFromString("9.999")), GasLimitMultiplier: ptr(decimal.RequireFromString("1.55555")), }}) wantedResult := tc.want(t, controller.app) resp, cleanup := controller.client.Get( fmt.Sprintf("/v2/chains/cosmos/%s", tc.inputId), ) t.Cleanup(cleanup) require.Equal(t, tc.wantStatusCode, resp.StatusCode) if wantedResult != nil { resource1 := presenters.CosmosChainResource{} err := web.ParseJSONAPIResponse(cltest.ParseResponseBody(t, resp), &resource1) require.NoError(t, err) assert.Equal(t, wantedResult.ID, resource1.ID) assert.Equal(t, wantedResult.Config, resource1.Config) } })` $DIR/core/web/cosmos_chains_controller_test.go: `.RequireFromString("9.999")` $DIR/core/web/cosmos_chains_controller_test.go: `.RequireFromString("1.55555")` $DIR/core/web/cosmos_chains_controller_test.go: `.want(t, controller.app)` $DIR/core/web/cosmos_chains_controller_test.go: `.client.Get( fmt.Sprintf("/v2/chains/cosmos/%s", tc.inputId), )` $DIR/core/web/cosmos_chains_controller_test.go: `.Sprintf("/v2/chains/cosmos/%s", tc.inputId)` $DIR/core/web/cosmos_chains_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/cosmos_chains_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, resp), &resource1)` $DIR/core/web/cosmos_chains_controller_test.go: `.ParseResponseBody(t, resp)` $DIR/core/web/cosmos_chains_controller_test.go: `.RandomChainID()` $DIR/core/web/cosmos_chains_controller_test.go: `.RequireFromString("9.999")` $DIR/core/web/cosmos_chains_controller_test.go: `.RandomChainID()` $DIR/core/web/cosmos_chains_controller_test.go: `.RequireFromString("1.55555")` $DIR/core/web/cosmos_chains_controller_test.go: `.client.Get("/v2/chains/cosmos?size=asd")` $DIR/core/web/cosmos_chains_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/cosmos_chains_controller_test.go: `.client.Get("/v2/chains/cosmos?size=1")` $DIR/core/web/cosmos_chains_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/cosmos_chains_controller_test.go: `.ParseResponseBody(t, resp)` $DIR/core/web/cosmos_chains_controller_test.go: `.ParseJSONAPIResponseMetaCount(body)` $DIR/core/web/cosmos_chains_controller_test.go: `.ParsePaginatedResponse(body, &chains, &links)` $DIR/core/web/cosmos_chains_controller_test.go: `.TOMLString()` $DIR/core/web/cosmos_chains_controller_test.go: `.client.Get(links["next"].Href)` $DIR/core/web/cosmos_chains_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/cosmos_chains_controller_test.go: `.ParsePaginatedResponse(cltest.ParseResponseBody(t, resp), &chains, &links)` $DIR/core/web/cosmos_chains_controller_test.go: `.ParseResponseBody(t, resp)` $DIR/core/web/cosmos_chains_controller_test.go: `.TOMLString()` $DIR/core/web/cosmos_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/cosmos_keys_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/cosmos_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/cosmos_keys_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/cosmos_keys_controller_test.go: `_, err = keyStore.Cosmos().Get(resource.ID)` $DIR/core/web/cosmos_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/cosmos_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/cosmos_keys_controller_test.go: `keys, _ = keyStore.Cosmos().GetAll()` $DIR/core/web/cosmos_keys_controller_test.go: `.Cosmos()` $DIR/core/web/cosmos_keys_controller_test.go: `.GetAll()` $DIR/core/web/cosmos_keys_controller_test.go: `.Get("/v2/keys/cosmos")` $DIR/core/web/cosmos_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/cosmos_keys_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/cosmos_keys_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &resources)` $DIR/core/web/cosmos_keys_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/cosmos_keys_controller_test.go: `.PublicKeyStr()` $DIR/core/web/cosmos_keys_controller_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/cosmos_keys_controller_test.go: `.Context(t)` $DIR/core/web/cosmos_keys_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/cosmos_keys_controller_test.go: `.GetKeyStore()` $DIR/core/web/cosmos_keys_controller_test.go: `.Post("/v2/keys/cosmos", nil)` $DIR/core/web/cosmos_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/cosmos_keys_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/cosmos_keys_controller_test.go: `.Cosmos()` $DIR/core/web/cosmos_keys_controller_test.go: `.GetAll()` $DIR/core/web/cosmos_keys_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &resource)` $DIR/core/web/cosmos_keys_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/cosmos_keys_controller_test.go: `.Cosmos()` $DIR/core/web/cosmos_keys_controller_test.go: `.Get(resource.ID)` $DIR/core/web/cosmos_keys_controller_test.go: `.Delete("/v2/keys/cosmos/" + nonExistentCosmosKeyID)` $DIR/core/web/cosmos_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/cosmos_keys_controller_test.go: `.Context(t)` $DIR/core/web/cosmos_keys_controller_test.go: `.Cosmos()` $DIR/core/web/cosmos_keys_controller_test.go: `.GetAll()` $DIR/core/web/cosmos_keys_controller_test.go: `.Cosmos()` $DIR/core/web/cosmos_keys_controller_test.go: `.Create(ctx)` $DIR/core/web/cosmos_keys_controller_test.go: `.Delete(fmt.Sprintf("/v2/keys/cosmos/%s", key.ID()))` $DIR/core/web/cosmos_keys_controller_test.go: `.Sprintf("/v2/keys/cosmos/%s", key.ID())` $DIR/core/web/cosmos_keys_controller_test.go: `.ID()` $DIR/core/web/cosmos_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/cosmos_keys_controller_test.go: `.Cosmos()` $DIR/core/web/cosmos_keys_controller_test.go: `.GetAll()` $DIR/core/web/dkgencrypt_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/dkgencrypt_keys_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/dkgencrypt_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/dkgencrypt_keys_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/dkgencrypt_keys_controller_test.go: `found = true` $DIR/core/web/dkgencrypt_keys_controller_test.go: `_, err = keyStore.DKGEncrypt().Get(resource.ID)` $DIR/core/web/dkgencrypt_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/dkgencrypt_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/dkgencrypt_keys_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.DKGEncrypt()` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.GetAll()` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.Get("/v2/keys/dkgencrypt")` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &resources)` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.PublicKeyString()` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.Post("/v2/keys/dkgencrypt", nil)` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.DKGEncrypt()` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.GetAll()` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &resource)` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.ID()` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.DKGEncrypt()` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.Get(resource.ID)` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.Delete("/v2/keys/dkgencrypt/" + "nonexistentKey")` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.DKGEncrypt()` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.GetAll()` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.Delete(fmt.Sprintf("/v2/keys/dkgencrypt/%s", keys[0].ID()))` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.Sprintf("/v2/keys/dkgencrypt/%s", keys[0].ID())` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.ID()` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.DKGEncrypt()` $DIR/core/web/dkgencrypt_keys_controller_test.go: `.GetAll()` $DIR/core/web/dkgsign_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/dkgsign_keys_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/dkgsign_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/dkgsign_keys_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/dkgsign_keys_controller_test.go: `found = true` $DIR/core/web/dkgsign_keys_controller_test.go: `_, err = keyStore.DKGSign().Get(resource.ID)` $DIR/core/web/dkgsign_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/dkgsign_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/dkgsign_keys_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/dkgsign_keys_controller_test.go: `.DKGSign()` $DIR/core/web/dkgsign_keys_controller_test.go: `.GetAll()` $DIR/core/web/dkgsign_keys_controller_test.go: `.Get("/v2/keys/dkgsign")` $DIR/core/web/dkgsign_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/dkgsign_keys_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/dkgsign_keys_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &resources)` $DIR/core/web/dkgsign_keys_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/dkgsign_keys_controller_test.go: `.PublicKeyString()` $DIR/core/web/dkgsign_keys_controller_test.go: `.Post("/v2/keys/dkgsign", nil)` $DIR/core/web/dkgsign_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/dkgsign_keys_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/dkgsign_keys_controller_test.go: `.DKGSign()` $DIR/core/web/dkgsign_keys_controller_test.go: `.GetAll()` $DIR/core/web/dkgsign_keys_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &resource)` $DIR/core/web/dkgsign_keys_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/dkgsign_keys_controller_test.go: `.ID()` $DIR/core/web/dkgsign_keys_controller_test.go: `.DKGSign()` $DIR/core/web/dkgsign_keys_controller_test.go: `.Get(resource.ID)` $DIR/core/web/dkgsign_keys_controller_test.go: `.Delete("/v2/keys/dkgsign/" + "nonexistentKey")` $DIR/core/web/dkgsign_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/dkgsign_keys_controller_test.go: `.DKGSign()` $DIR/core/web/dkgsign_keys_controller_test.go: `.GetAll()` $DIR/core/web/dkgsign_keys_controller_test.go: `.Delete(fmt.Sprintf("/v2/keys/dkgsign/%s", keys[0].ID()))` $DIR/core/web/dkgsign_keys_controller_test.go: `.Sprintf("/v2/keys/dkgsign/%s", keys[0].ID())` $DIR/core/web/dkgsign_keys_controller_test.go: `.ID()` $DIR/core/web/dkgsign_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/dkgsign_keys_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/dkgsign_keys_controller_test.go: `.DKGSign()` $DIR/core/web/dkgsign_keys_controller_test.go: `.GetAll()` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("PendingNonceAt", mock.Anything, mock.Anything).Return(uint64(0), nil)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("BalanceAt", mock.Anything, addr0, mock.Anything).Return(big.NewInt(256), nil).Once()` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("BalanceAt", mock.Anything, addr1, mock.Anything).Return(big.NewInt(1), nil).Once()` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("BalanceAt", mock.Anything, addr2, mock.Anything).Return(big.NewInt(1), nil).Once()` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("LINKBalance", mock.Anything, addr0, mock.Anything).Return(assets.NewLinkFromJuels(256), nil).Once()` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("LINKBalance", mock.Anything, addr1, mock.Anything).Return(assets.NewLinkFromJuels(1), nil).Once()` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("LINKBalance", mock.Anything, addr2, mock.Anything).Return(assets.NewLinkFromJuels(1), nil).Once()` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("PendingNonceAt", mock.Anything, mock.Anything).Return(uint64(0), nil)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("BalanceAt", mock.Anything, addr, mock.Anything).Return(nil, errors.New("fake error")).Once()` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("LINKBalance", mock.Anything, addr, mock.Anything).Return(nil, errors.New("fake error")).Once()` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].Enabled = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("PendingNonceAt", mock.Anything, mock.Anything).Return(uint64(0), nil)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].GasEstimator.Mode = ptr("FixedPrice")` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything).Return(big.NewInt(256), nil).Once()` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("LINKBalance", mock.Anything, mock.Anything, mock.Anything).Return(assets.NewLinkFromJuels(256), nil).Once()` $DIR/core/web/eth_keys_controller_test.go: `err = cltest.ParseJSONAPIResponse(t, resp, &actualBalances)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `cltest.MockApplicationEthCalls(t, app, ethClient, sub)` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything).Return(ethBalanceInt, nil)` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("LINKBalance", mock.Anything, mock.Anything, mock.Anything).Return(linkBalance, nil)` $DIR/core/web/eth_keys_controller_test.go: `query.Set("evmChainID", cltest.FixtureChainID.String())` $DIR/core/web/eth_keys_controller_test.go: `chainURL.RawQuery = query.Encode()` $DIR/core/web/eth_keys_controller_test.go: `cltest.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("PendingNonceAt", mock.Anything, mock.Anything).Return(uint64(0), nil)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("BalanceAt", mock.Anything, addr, mock.Anything).Return(big.NewInt(1), nil).Once()` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("LINKBalance", mock.Anything, addr, mock.Anything).Return(assets.NewLinkFromJuels(1), nil).Once()` $DIR/core/web/eth_keys_controller_test.go: `query.Set("address", addr.Hex())` $DIR/core/web/eth_keys_controller_test.go: `query.Set("evmChainID", cltest.FixtureChainID.String())` $DIR/core/web/eth_keys_controller_test.go: `chainURL.RawQuery = query.Encode()` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("PendingNonceAt", mock.Anything, mock.Anything).Return(uint64(0), nil)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("BalanceAt", mock.Anything, addr, mock.Anything).Return(big.NewInt(1), nil).Once()` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("LINKBalance", mock.Anything, addr, mock.Anything).Return(assets.NewLinkFromJuels(1), nil).Once()` $DIR/core/web/eth_keys_controller_test.go: `query.Set("address", addr.Hex())` $DIR/core/web/eth_keys_controller_test.go: `query.Set("evmChainID", cltest.FixtureChainID.String())` $DIR/core/web/eth_keys_controller_test.go: `query.Set("enabled", enabled)` $DIR/core/web/eth_keys_controller_test.go: `chainURL.RawQuery = query.Encode()` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("BalanceAt", mock.Anything, addr, mock.Anything).Return(big.NewInt(1), nil).Once()` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("LINKBalance", mock.Anything, addr, mock.Anything).Return(assets.NewLinkFromJuels(1), nil).Once()` $DIR/core/web/eth_keys_controller_test.go: `query.Set("address", addr.Hex())` $DIR/core/web/eth_keys_controller_test.go: `query.Set("evmChainID", cltest.FixtureChainID.String())` $DIR/core/web/eth_keys_controller_test.go: `query.Set("enabled", enabled)` $DIR/core/web/eth_keys_controller_test.go: `chainURL.RawQuery = query.Encode()` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("PendingNonceAt", mock.Anything, mock.Anything).Return(uint64(0), nil)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("BalanceAt", mock.Anything, addr, mock.Anything).Return(big.NewInt(1), nil).Once()` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("LINKBalance", mock.Anything, addr, mock.Anything).Return(assets.NewLinkFromJuels(1), nil).Once()` $DIR/core/web/eth_keys_controller_test.go: `strategy.On("Subject").Return(uuid.NullUUID{UUID: subject, Valid: true})` $DIR/core/web/eth_keys_controller_test.go: `strategy.On("PruneQueue", mock.Anything, mock.AnythingOfType("*txmgr.evmTxStore")).Return(nil, nil)` $DIR/core/web/eth_keys_controller_test.go: `query.Set("address", addr.Hex())` $DIR/core/web/eth_keys_controller_test.go: `query.Set("evmChainID", cltest.FixtureChainID.String())` $DIR/core/web/eth_keys_controller_test.go: `query.Set("abandon", "true")` $DIR/core/web/eth_keys_controller_test.go: `chainURL.RawQuery = query.Encode()` $DIR/core/web/eth_keys_controller_test.go: `err = cltest.ParseJSONAPIResponse(t, resp, &updatedKey)` $DIR/core/web/eth_keys_controller_test.go: `txes, err = txStore.FindTxesByFromAddressAndState(testutils.Context(t), addr, "fatal_error")` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("PendingNonceAt", mock.Anything, mock.Anything).Return(uint64(0), nil)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `query.Set("address", addr.Hex())` $DIR/core/web/eth_keys_controller_test.go: `query.Set("evmChainID", cltest.FixtureChainID.String())` $DIR/core/web/eth_keys_controller_test.go: `query.Set("abandon", "invalid")` $DIR/core/web/eth_keys_controller_test.go: `chainURL.RawQuery = query.Encode()` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("PendingNonceAt", mock.Anything, mock.Anything).Return(uint64(0), nil)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `query.Set("address", addr.Hex())` $DIR/core/web/eth_keys_controller_test.go: `query.Set("evmChainID", cltest.FixtureChainID.String())` $DIR/core/web/eth_keys_controller_test.go: `query.Set("enabled", "invalid")` $DIR/core/web/eth_keys_controller_test.go: `chainURL.RawQuery = query.Encode()` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `query.Set("address", "invalid address")` $DIR/core/web/eth_keys_controller_test.go: `query.Set("evmChainID", cltest.FixtureChainID.String())` $DIR/core/web/eth_keys_controller_test.go: `chainURL.RawQuery = query.Encode()` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `query.Set("address", testutils.NewAddress().Hex())` $DIR/core/web/eth_keys_controller_test.go: `query.Set("evmChainID", cltest.FixtureChainID.String())` $DIR/core/web/eth_keys_controller_test.go: `chainURL.RawQuery = query.Encode()` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `query.Set("address", testutils.NewAddress().Hex())` $DIR/core/web/eth_keys_controller_test.go: `query.Set("evmChainID", "bad chain ID")` $DIR/core/web/eth_keys_controller_test.go: `chainURL.RawQuery = query.Encode()` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("PendingNonceAt", mock.Anything, mock.Anything).Return(uint64(0), nil)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `query.Set("address", addr.Hex())` $DIR/core/web/eth_keys_controller_test.go: `query.Set("evmChainID", "123456789")` $DIR/core/web/eth_keys_controller_test.go: `chainURL.RawQuery = query.Encode()` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("PendingNonceAt", mock.Anything, mock.Anything).Return(uint64(0), nil)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("BalanceAt", mock.Anything, addr0, mock.Anything).Return(big.NewInt(1), nil).Once()` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("BalanceAt", mock.Anything, addr1, mock.Anything).Return(big.NewInt(1), nil).Once()` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("LINKBalance", mock.Anything, addr0, mock.Anything).Return(assets.NewLinkFromJuels(1), nil).Once()` $DIR/core/web/eth_keys_controller_test.go: `ethClient.On("LINKBalance", mock.Anything, addr1, mock.Anything).Return(assets.NewLinkFromJuels(1), nil).Once()` $DIR/core/web/eth_keys_controller_test.go: `err = cltest.ParseJSONAPIResponse(t, resp, &actualBalances)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].NonceAutoSync = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/web/eth_keys_controller_test.go: `.Context(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewEthMocksWithStartupAssertions(t)` $DIR/core/web/eth_keys_controller_test.go: `.On("PendingNonceAt", mock.Anything, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(uint64(0), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].NonceAutoSync = ptr(false) c.EVM[0].BalanceMonitor.Enabled = ptr(false) })` $DIR/core/web/eth_keys_controller_test.go: `.NewApplicationWithConfig(t, cfg, ethClient)` $DIR/core/web/eth_keys_controller_test.go: `.MustInsertRandomKey(t, app.KeyStore.Eth())` $DIR/core/web/eth_keys_controller_test.go: `.KeyStore.Eth()` $DIR/core/web/eth_keys_controller_test.go: `.MustInsert(t, app.KeyStore.Eth())` $DIR/core/web/eth_keys_controller_test.go: `.KeyStore.Eth()` $DIR/core/web/eth_keys_controller_test.go: `.MustInsert(t, app.KeyStore.Eth())` $DIR/core/web/eth_keys_controller_test.go: `.KeyStore.Eth()` $DIR/core/web/eth_keys_controller_test.go: `.On("BalanceAt", mock.Anything, addr0, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(big.NewInt(256), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewInt(256)` $DIR/core/web/eth_keys_controller_test.go: `.Once()` $DIR/core/web/eth_keys_controller_test.go: `.On("BalanceAt", mock.Anything, addr1, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(big.NewInt(1), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewInt(1)` $DIR/core/web/eth_keys_controller_test.go: `.Once()` $DIR/core/web/eth_keys_controller_test.go: `.On("BalanceAt", mock.Anything, addr2, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(big.NewInt(1), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewInt(1)` $DIR/core/web/eth_keys_controller_test.go: `.Once()` $DIR/core/web/eth_keys_controller_test.go: `.On("LINKBalance", mock.Anything, addr0, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(assets.NewLinkFromJuels(256), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewLinkFromJuels(256)` $DIR/core/web/eth_keys_controller_test.go: `.Once()` $DIR/core/web/eth_keys_controller_test.go: `.On("LINKBalance", mock.Anything, addr1, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(assets.NewLinkFromJuels(1), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewLinkFromJuels(1)` $DIR/core/web/eth_keys_controller_test.go: `.Once()` $DIR/core/web/eth_keys_controller_test.go: `.On("LINKBalance", mock.Anything, addr2, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(assets.NewLinkFromJuels(1), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewLinkFromJuels(1)` $DIR/core/web/eth_keys_controller_test.go: `.Once()` $DIR/core/web/eth_keys_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/eth_keys_controller_test.go: `.Get("/v2/keys/evm")` $DIR/core/web/eth_keys_controller_test.go: `.ParseJSONAPIResponse(t, resp, &actualBalances)` $DIR/core/web/eth_keys_controller_test.go: `.Address.Hex()` $DIR/core/web/eth_keys_controller_test.go: `.Context(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewEthMocksWithStartupAssertions(t)` $DIR/core/web/eth_keys_controller_test.go: `.On("PendingNonceAt", mock.Anything, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(uint64(0), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].NonceAutoSync = ptr(false) c.EVM[0].BalanceMonitor.Enabled = ptr(false) })` $DIR/core/web/eth_keys_controller_test.go: `.NewApplicationWithConfig(t, cfg, ethClient)` $DIR/core/web/eth_keys_controller_test.go: `.MustInsertRandomKey(t, app.KeyStore.Eth())` $DIR/core/web/eth_keys_controller_test.go: `.KeyStore.Eth()` $DIR/core/web/eth_keys_controller_test.go: `.On("BalanceAt", mock.Anything, addr, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(nil, errors.New("fake error"))` $DIR/core/web/eth_keys_controller_test.go: `.New("fake error")` $DIR/core/web/eth_keys_controller_test.go: `.Once()` $DIR/core/web/eth_keys_controller_test.go: `.On("LINKBalance", mock.Anything, addr, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(nil, errors.New("fake error"))` $DIR/core/web/eth_keys_controller_test.go: `.New("fake error")` $DIR/core/web/eth_keys_controller_test.go: `.Once()` $DIR/core/web/eth_keys_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/eth_keys_controller_test.go: `.Get("/v2/keys/eth")` $DIR/core/web/eth_keys_controller_test.go: `.ParseJSONAPIResponse(t, resp, &actualBalances)` $DIR/core/web/eth_keys_controller_test.go: `.MaxGasPriceWei.String()` $DIR/core/web/eth_keys_controller_test.go: `.Context(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewEthMocksWithStartupAssertions(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].Enabled = ptr(false) })` $DIR/core/web/eth_keys_controller_test.go: `.NewApplicationWithConfig(t, cfg, ethClient)` $DIR/core/web/eth_keys_controller_test.go: `.MustInsertRandomKey(t, app.KeyStore.Eth())` $DIR/core/web/eth_keys_controller_test.go: `.KeyStore.Eth()` $DIR/core/web/eth_keys_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/eth_keys_controller_test.go: `.Get("/v2/keys/eth")` $DIR/core/web/eth_keys_controller_test.go: `.ParseJSONAPIResponse(t, resp, &actualBalances)` $DIR/core/web/eth_keys_controller_test.go: `.NewEthMocksWithStartupAssertions(t)` $DIR/core/web/eth_keys_controller_test.go: `.On("PendingNonceAt", mock.Anything, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(uint64(0), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].NonceAutoSync = ptr(false) c.EVM[0].BalanceMonitor.Enabled = ptr(false) c.EVM[0].GasEstimator.Mode = ptr("FixedPrice") })` $DIR/core/web/eth_keys_controller_test.go: `.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(big.NewInt(256), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewInt(256)` $DIR/core/web/eth_keys_controller_test.go: `.Once()` $DIR/core/web/eth_keys_controller_test.go: `.On("LINKBalance", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(assets.NewLinkFromJuels(256), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewLinkFromJuels(256)` $DIR/core/web/eth_keys_controller_test.go: `.Once()` $DIR/core/web/eth_keys_controller_test.go: `.NewApplicationWithConfigAndKey(t, cfg, ethClient)` $DIR/core/web/eth_keys_controller_test.go: `.Context(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/eth_keys_controller_test.go: `.Get("/v2/keys/eth")` $DIR/core/web/eth_keys_controller_test.go: `.KeyStore.Eth()` $DIR/core/web/eth_keys_controller_test.go: `.GetAll(testutils.Context(t))` $DIR/core/web/eth_keys_controller_test.go: `.Context(t)` $DIR/core/web/eth_keys_controller_test.go: `.ParseJSONAPIResponse(t, resp, &actualBalances)` $DIR/core/web/eth_keys_controller_test.go: `.LinkBalance.String()` $DIR/core/web/eth_keys_controller_test.go: `.NewApplication(t)` $DIR/core/web/eth_keys_controller_test.go: `.Context(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/eth_keys_controller_test.go: `.Get("/v2/keys/eth")` $DIR/core/web/eth_keys_controller_test.go: `.ParseJSONAPIResponse(t, resp, &balances)` $DIR/core/web/eth_keys_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].BalanceMonitor.Enabled = ptr(false) })` $DIR/core/web/eth_keys_controller_test.go: `.NewEthClientMockWithDefaultChain(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewApplicationWithConfigAndKey(t, config, ethClient)` $DIR/core/web/eth_keys_controller_test.go: `.NewSubscription(t)` $DIR/core/web/eth_keys_controller_test.go: `.MockApplicationEthCalls(t, app, ethClient, sub)` $DIR/core/web/eth_keys_controller_test.go: `.NewInt(100)` $DIR/core/web/eth_keys_controller_test.go: `.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(ethBalanceInt, nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewLinkFromJuels(42)` $DIR/core/web/eth_keys_controller_test.go: `.On("LINKBalance", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(linkBalance, nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/eth_keys_controller_test.go: `.Context(t)` $DIR/core/web/eth_keys_controller_test.go: `.Query()` $DIR/core/web/eth_keys_controller_test.go: `.Set("evmChainID", cltest.FixtureChainID.String())` $DIR/core/web/eth_keys_controller_test.go: `.FixtureChainID.String()` $DIR/core/web/eth_keys_controller_test.go: `.Encode()` $DIR/core/web/eth_keys_controller_test.go: `.Post(chainURL.String(), nil)` $DIR/core/web/eth_keys_controller_test.go: `.String()` $DIR/core/web/eth_keys_controller_test.go: `.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/eth_keys_controller_test.go: `.ParseJSONAPIResponse(t, resp, &balance)` $DIR/core/web/eth_keys_controller_test.go: `.MaxGasPriceWei.String()` $DIR/core/web/eth_keys_controller_test.go: `.Context(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewEthMocksWithStartupAssertions(t)` $DIR/core/web/eth_keys_controller_test.go: `.On("PendingNonceAt", mock.Anything, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(uint64(0), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].NonceAutoSync = ptr(false) c.EVM[0].BalanceMonitor.Enabled = ptr(false) })` $DIR/core/web/eth_keys_controller_test.go: `.NewApplicationWithConfig(t, cfg, ethClient)` $DIR/core/web/eth_keys_controller_test.go: `.MustInsertRandomKey(t, app.KeyStore.Eth())` $DIR/core/web/eth_keys_controller_test.go: `.KeyStore.Eth()` $DIR/core/web/eth_keys_controller_test.go: `.On("BalanceAt", mock.Anything, addr, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(big.NewInt(1), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewInt(1)` $DIR/core/web/eth_keys_controller_test.go: `.Once()` $DIR/core/web/eth_keys_controller_test.go: `.On("LINKBalance", mock.Anything, addr, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(assets.NewLinkFromJuels(1), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewLinkFromJuels(1)` $DIR/core/web/eth_keys_controller_test.go: `.Once()` $DIR/core/web/eth_keys_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/eth_keys_controller_test.go: `.Query()` $DIR/core/web/eth_keys_controller_test.go: `.Set("address", addr.Hex())` $DIR/core/web/eth_keys_controller_test.go: `.Hex()` $DIR/core/web/eth_keys_controller_test.go: `.Set("evmChainID", cltest.FixtureChainID.String())` $DIR/core/web/eth_keys_controller_test.go: `.FixtureChainID.String()` $DIR/core/web/eth_keys_controller_test.go: `.Encode()` $DIR/core/web/eth_keys_controller_test.go: `.Post(chainURL.String(), nil)` $DIR/core/web/eth_keys_controller_test.go: `.String()` $DIR/core/web/eth_keys_controller_test.go: `.ParseJSONAPIResponse(t, resp, &updatedKey)` $DIR/core/web/eth_keys_controller_test.go: `.Context(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewEthMocksWithStartupAssertions(t)` $DIR/core/web/eth_keys_controller_test.go: `.On("PendingNonceAt", mock.Anything, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(uint64(0), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].NonceAutoSync = ptr(false) c.EVM[0].BalanceMonitor.Enabled = ptr(false) })` $DIR/core/web/eth_keys_controller_test.go: `.NewApplicationWithConfig(t, cfg, ethClient)` $DIR/core/web/eth_keys_controller_test.go: `.MustInsertRandomKey(t, app.KeyStore.Eth())` $DIR/core/web/eth_keys_controller_test.go: `.KeyStore.Eth()` $DIR/core/web/eth_keys_controller_test.go: `.On("BalanceAt", mock.Anything, addr, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(big.NewInt(1), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewInt(1)` $DIR/core/web/eth_keys_controller_test.go: `.Once()` $DIR/core/web/eth_keys_controller_test.go: `.On("LINKBalance", mock.Anything, addr, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(assets.NewLinkFromJuels(1), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewLinkFromJuels(1)` $DIR/core/web/eth_keys_controller_test.go: `.Once()` $DIR/core/web/eth_keys_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/eth_keys_controller_test.go: `.Query()` $DIR/core/web/eth_keys_controller_test.go: `.Set("address", addr.Hex())` $DIR/core/web/eth_keys_controller_test.go: `.Hex()` $DIR/core/web/eth_keys_controller_test.go: `.Set("evmChainID", cltest.FixtureChainID.String())` $DIR/core/web/eth_keys_controller_test.go: `.FixtureChainID.String()` $DIR/core/web/eth_keys_controller_test.go: `.Set("enabled", enabled)` $DIR/core/web/eth_keys_controller_test.go: `.Encode()` $DIR/core/web/eth_keys_controller_test.go: `.Post(chainURL.String(), nil)` $DIR/core/web/eth_keys_controller_test.go: `.String()` $DIR/core/web/eth_keys_controller_test.go: `.ParseJSONAPIResponse(t, resp, &updatedKey)` $DIR/core/web/eth_keys_controller_test.go: `.Context(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewEthMocksWithStartupAssertions(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].NonceAutoSync = ptr(false) c.EVM[0].BalanceMonitor.Enabled = ptr(false) })` $DIR/core/web/eth_keys_controller_test.go: `.NewApplicationWithConfig(t, cfg, ethClient)` $DIR/core/web/eth_keys_controller_test.go: `.MustInsert(t, app.KeyStore.Eth())` $DIR/core/web/eth_keys_controller_test.go: `.KeyStore.Eth()` $DIR/core/web/eth_keys_controller_test.go: `.On("BalanceAt", mock.Anything, addr, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(big.NewInt(1), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewInt(1)` $DIR/core/web/eth_keys_controller_test.go: `.Once()` $DIR/core/web/eth_keys_controller_test.go: `.On("LINKBalance", mock.Anything, addr, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(assets.NewLinkFromJuels(1), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewLinkFromJuels(1)` $DIR/core/web/eth_keys_controller_test.go: `.Once()` $DIR/core/web/eth_keys_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/eth_keys_controller_test.go: `.Query()` $DIR/core/web/eth_keys_controller_test.go: `.Set("address", addr.Hex())` $DIR/core/web/eth_keys_controller_test.go: `.Hex()` $DIR/core/web/eth_keys_controller_test.go: `.Set("evmChainID", cltest.FixtureChainID.String())` $DIR/core/web/eth_keys_controller_test.go: `.FixtureChainID.String()` $DIR/core/web/eth_keys_controller_test.go: `.Set("enabled", enabled)` $DIR/core/web/eth_keys_controller_test.go: `.Encode()` $DIR/core/web/eth_keys_controller_test.go: `.Post(chainURL.String(), nil)` $DIR/core/web/eth_keys_controller_test.go: `.String()` $DIR/core/web/eth_keys_controller_test.go: `.ParseJSONAPIResponse(t, resp, &updatedKey)` $DIR/core/web/eth_keys_controller_test.go: `.Context(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewEthMocksWithStartupAssertions(t)` $DIR/core/web/eth_keys_controller_test.go: `.On("PendingNonceAt", mock.Anything, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(uint64(0), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].NonceAutoSync = ptr(false) c.EVM[0].BalanceMonitor.Enabled = ptr(false) })` $DIR/core/web/eth_keys_controller_test.go: `.NewApplicationWithConfig(t, cfg, ethClient)` $DIR/core/web/eth_keys_controller_test.go: `.MustInsertRandomKey(t, app.KeyStore.Eth())` $DIR/core/web/eth_keys_controller_test.go: `.KeyStore.Eth()` $DIR/core/web/eth_keys_controller_test.go: `.On("BalanceAt", mock.Anything, addr, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(big.NewInt(1), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewInt(1)` $DIR/core/web/eth_keys_controller_test.go: `.Once()` $DIR/core/web/eth_keys_controller_test.go: `.On("LINKBalance", mock.Anything, addr, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(assets.NewLinkFromJuels(1), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewLinkFromJuels(1)` $DIR/core/web/eth_keys_controller_test.go: `.Once()` $DIR/core/web/eth_keys_controller_test.go: `.GetRelayers()` $DIR/core/web/eth_keys_controller_test.go: `.LegacyEVMChains()` $DIR/core/web/eth_keys_controller_test.go: `.Slice()` $DIR/core/web/eth_keys_controller_test.go: `.New()` $DIR/core/web/eth_keys_controller_test.go: `.NewTxStrategy(t)` $DIR/core/web/eth_keys_controller_test.go: `.On("Subject")` $DIR/core/web/eth_keys_controller_test.go: `.Return(uuid.NullUUID{UUID: subject, Valid: true})` $DIR/core/web/eth_keys_controller_test.go: `.On("PruneQueue", mock.Anything, mock.AnythingOfType("*txmgr.evmTxStore"))` $DIR/core/web/eth_keys_controller_test.go: `.AnythingOfType("*txmgr.evmTxStore")` $DIR/core/web/eth_keys_controller_test.go: `.Return(nil, nil)` $DIR/core/web/eth_keys_controller_test.go: `.TxManager()` $DIR/core/web/eth_keys_controller_test.go: `.CreateTransaction(testutils.Context(t), txmgr.TxRequest{ FromAddress: addr, ToAddress: testutils.NewAddress(), EncodedPayload: []byte{1, 2, 3}, FeeLimit: uint64(1000), Meta: nil, Strategy: strategy, })` $DIR/core/web/eth_keys_controller_test.go: `.Context(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewAddress()` $DIR/core/web/eth_keys_controller_test.go: `.NewTxStore(app.GetDB(), logger.TestLogger(t))` $DIR/core/web/eth_keys_controller_test.go: `.GetDB()` $DIR/core/web/eth_keys_controller_test.go: `.TestLogger(t)` $DIR/core/web/eth_keys_controller_test.go: `.FindTxesByFromAddressAndState(testutils.Context(t), addr, "fatal_error")` $DIR/core/web/eth_keys_controller_test.go: `.Context(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/eth_keys_controller_test.go: `.Query()` $DIR/core/web/eth_keys_controller_test.go: `.Set("address", addr.Hex())` $DIR/core/web/eth_keys_controller_test.go: `.Hex()` $DIR/core/web/eth_keys_controller_test.go: `.Set("evmChainID", cltest.FixtureChainID.String())` $DIR/core/web/eth_keys_controller_test.go: `.FixtureChainID.String()` $DIR/core/web/eth_keys_controller_test.go: `.Set("abandon", "true")` $DIR/core/web/eth_keys_controller_test.go: `.Encode()` $DIR/core/web/eth_keys_controller_test.go: `.Post(chainURL.String(), nil)` $DIR/core/web/eth_keys_controller_test.go: `.String()` $DIR/core/web/eth_keys_controller_test.go: `.ParseJSONAPIResponse(t, resp, &updatedKey)` $DIR/core/web/eth_keys_controller_test.go: `.FindTxesByFromAddressAndState(testutils.Context(t), addr, "fatal_error")` $DIR/core/web/eth_keys_controller_test.go: `.Context(t)` $DIR/core/web/eth_keys_controller_test.go: `.Context(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewEthMocksWithStartupAssertions(t)` $DIR/core/web/eth_keys_controller_test.go: `.On("PendingNonceAt", mock.Anything, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(uint64(0), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].NonceAutoSync = ptr(false) c.EVM[0].BalanceMonitor.Enabled = ptr(false) })` $DIR/core/web/eth_keys_controller_test.go: `.NewApplicationWithConfig(t, cfg, ethClient)` $DIR/core/web/eth_keys_controller_test.go: `.MustInsertRandomKey(t, app.KeyStore.Eth())` $DIR/core/web/eth_keys_controller_test.go: `.KeyStore.Eth()` $DIR/core/web/eth_keys_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/eth_keys_controller_test.go: `.Query()` $DIR/core/web/eth_keys_controller_test.go: `.Set("address", addr.Hex())` $DIR/core/web/eth_keys_controller_test.go: `.Hex()` $DIR/core/web/eth_keys_controller_test.go: `.Set("evmChainID", cltest.FixtureChainID.String())` $DIR/core/web/eth_keys_controller_test.go: `.FixtureChainID.String()` $DIR/core/web/eth_keys_controller_test.go: `.Set("abandon", "invalid")` $DIR/core/web/eth_keys_controller_test.go: `.Encode()` $DIR/core/web/eth_keys_controller_test.go: `.Post(chainURL.String(), nil)` $DIR/core/web/eth_keys_controller_test.go: `.String()` $DIR/core/web/eth_keys_controller_test.go: `.Context(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewEthMocksWithStartupAssertions(t)` $DIR/core/web/eth_keys_controller_test.go: `.On("PendingNonceAt", mock.Anything, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(uint64(0), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].NonceAutoSync = ptr(false) c.EVM[0].BalanceMonitor.Enabled = ptr(false) })` $DIR/core/web/eth_keys_controller_test.go: `.NewApplicationWithConfig(t, cfg, ethClient)` $DIR/core/web/eth_keys_controller_test.go: `.MustInsertRandomKey(t, app.KeyStore.Eth())` $DIR/core/web/eth_keys_controller_test.go: `.KeyStore.Eth()` $DIR/core/web/eth_keys_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/eth_keys_controller_test.go: `.Query()` $DIR/core/web/eth_keys_controller_test.go: `.Set("address", addr.Hex())` $DIR/core/web/eth_keys_controller_test.go: `.Hex()` $DIR/core/web/eth_keys_controller_test.go: `.Set("evmChainID", cltest.FixtureChainID.String())` $DIR/core/web/eth_keys_controller_test.go: `.FixtureChainID.String()` $DIR/core/web/eth_keys_controller_test.go: `.Set("enabled", "invalid")` $DIR/core/web/eth_keys_controller_test.go: `.Encode()` $DIR/core/web/eth_keys_controller_test.go: `.Post(chainURL.String(), nil)` $DIR/core/web/eth_keys_controller_test.go: `.String()` $DIR/core/web/eth_keys_controller_test.go: `.Context(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewEthMocksWithStartupAssertions(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].NonceAutoSync = ptr(false) c.EVM[0].BalanceMonitor.Enabled = ptr(false) })` $DIR/core/web/eth_keys_controller_test.go: `.NewApplicationWithConfig(t, cfg, ethClient)` $DIR/core/web/eth_keys_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/eth_keys_controller_test.go: `.Query()` $DIR/core/web/eth_keys_controller_test.go: `.Set("address", "invalid address")` $DIR/core/web/eth_keys_controller_test.go: `.Set("evmChainID", cltest.FixtureChainID.String())` $DIR/core/web/eth_keys_controller_test.go: `.FixtureChainID.String()` $DIR/core/web/eth_keys_controller_test.go: `.Encode()` $DIR/core/web/eth_keys_controller_test.go: `.Post(chainURL.String(), nil)` $DIR/core/web/eth_keys_controller_test.go: `.String()` $DIR/core/web/eth_keys_controller_test.go: `.Context(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewEthMocksWithStartupAssertions(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].NonceAutoSync = ptr(false) c.EVM[0].BalanceMonitor.Enabled = ptr(false) })` $DIR/core/web/eth_keys_controller_test.go: `.NewApplicationWithConfig(t, cfg, ethClient)` $DIR/core/web/eth_keys_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/eth_keys_controller_test.go: `.Query()` $DIR/core/web/eth_keys_controller_test.go: `.Set("address", testutils.NewAddress().Hex())` $DIR/core/web/eth_keys_controller_test.go: `.NewAddress()` $DIR/core/web/eth_keys_controller_test.go: `.Hex()` $DIR/core/web/eth_keys_controller_test.go: `.Set("evmChainID", cltest.FixtureChainID.String())` $DIR/core/web/eth_keys_controller_test.go: `.FixtureChainID.String()` $DIR/core/web/eth_keys_controller_test.go: `.Encode()` $DIR/core/web/eth_keys_controller_test.go: `.Post(chainURL.String(), nil)` $DIR/core/web/eth_keys_controller_test.go: `.String()` $DIR/core/web/eth_keys_controller_test.go: `.Context(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewEthMocksWithStartupAssertions(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].NonceAutoSync = ptr(false) c.EVM[0].BalanceMonitor.Enabled = ptr(false) })` $DIR/core/web/eth_keys_controller_test.go: `.NewApplicationWithConfig(t, cfg, ethClient)` $DIR/core/web/eth_keys_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/eth_keys_controller_test.go: `.Query()` $DIR/core/web/eth_keys_controller_test.go: `.Set("address", testutils.NewAddress().Hex())` $DIR/core/web/eth_keys_controller_test.go: `.NewAddress()` $DIR/core/web/eth_keys_controller_test.go: `.Hex()` $DIR/core/web/eth_keys_controller_test.go: `.Set("evmChainID", "bad chain ID")` $DIR/core/web/eth_keys_controller_test.go: `.Encode()` $DIR/core/web/eth_keys_controller_test.go: `.Post(chainURL.String(), nil)` $DIR/core/web/eth_keys_controller_test.go: `.String()` $DIR/core/web/eth_keys_controller_test.go: `.Context(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewEthMocksWithStartupAssertions(t)` $DIR/core/web/eth_keys_controller_test.go: `.On("PendingNonceAt", mock.Anything, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(uint64(0), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].NonceAutoSync = ptr(false) c.EVM[0].BalanceMonitor.Enabled = ptr(false) })` $DIR/core/web/eth_keys_controller_test.go: `.NewApplicationWithConfig(t, cfg, ethClient)` $DIR/core/web/eth_keys_controller_test.go: `.MustInsertRandomKey(t, app.KeyStore.Eth())` $DIR/core/web/eth_keys_controller_test.go: `.KeyStore.Eth()` $DIR/core/web/eth_keys_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/eth_keys_controller_test.go: `.Query()` $DIR/core/web/eth_keys_controller_test.go: `.Set("address", addr.Hex())` $DIR/core/web/eth_keys_controller_test.go: `.Hex()` $DIR/core/web/eth_keys_controller_test.go: `.Set("evmChainID", "123456789")` $DIR/core/web/eth_keys_controller_test.go: `.Encode()` $DIR/core/web/eth_keys_controller_test.go: `.Post(chainURL.String(), nil)` $DIR/core/web/eth_keys_controller_test.go: `.String()` $DIR/core/web/eth_keys_controller_test.go: `.Context(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewEthMocksWithStartupAssertions(t)` $DIR/core/web/eth_keys_controller_test.go: `.On("PendingNonceAt", mock.Anything, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(uint64(0), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].NonceAutoSync = ptr(false) c.EVM[0].BalanceMonitor.Enabled = ptr(false) })` $DIR/core/web/eth_keys_controller_test.go: `.NewApplicationWithConfig(t, cfg, ethClient)` $DIR/core/web/eth_keys_controller_test.go: `.MustInsertRandomKey(t, app.KeyStore.Eth())` $DIR/core/web/eth_keys_controller_test.go: `.KeyStore.Eth()` $DIR/core/web/eth_keys_controller_test.go: `.MustInsertRandomKey(t, app.KeyStore.Eth())` $DIR/core/web/eth_keys_controller_test.go: `.KeyStore.Eth()` $DIR/core/web/eth_keys_controller_test.go: `.On("BalanceAt", mock.Anything, addr0, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(big.NewInt(1), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewInt(1)` $DIR/core/web/eth_keys_controller_test.go: `.Once()` $DIR/core/web/eth_keys_controller_test.go: `.On("BalanceAt", mock.Anything, addr1, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(big.NewInt(1), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewInt(1)` $DIR/core/web/eth_keys_controller_test.go: `.Once()` $DIR/core/web/eth_keys_controller_test.go: `.On("LINKBalance", mock.Anything, addr0, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(assets.NewLinkFromJuels(1), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewLinkFromJuels(1)` $DIR/core/web/eth_keys_controller_test.go: `.Once()` $DIR/core/web/eth_keys_controller_test.go: `.On("LINKBalance", mock.Anything, addr1, mock.Anything)` $DIR/core/web/eth_keys_controller_test.go: `.Return(assets.NewLinkFromJuels(1), nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewLinkFromJuels(1)` $DIR/core/web/eth_keys_controller_test.go: `.Once()` $DIR/core/web/eth_keys_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/eth_keys_controller_test.go: `.Hex()` $DIR/core/web/eth_keys_controller_test.go: `.Delete(chainURL.String())` $DIR/core/web/eth_keys_controller_test.go: `.String()` $DIR/core/web/eth_keys_controller_test.go: `.ParseJSONAPIResponse(t, resp, &deletedKey)` $DIR/core/web/eth_keys_controller_test.go: `.Get("/v2/keys/evm")` $DIR/core/web/eth_keys_controller_test.go: `.ParseJSONAPIResponse(t, resp, &actualBalances)` $DIR/core/web/eth_keys_controller_test.go: `.String()` $DIR/core/web/eth_keys_controller_test.go: `.Context(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewEthMocksWithStartupAssertions(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].NonceAutoSync = ptr(false) c.EVM[0].BalanceMonitor.Enabled = ptr(false) })` $DIR/core/web/eth_keys_controller_test.go: `.NewApplicationWithConfig(t, cfg, ethClient)` $DIR/core/web/eth_keys_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/eth_keys_controller_test.go: `.Delete(chainURL.String())` $DIR/core/web/eth_keys_controller_test.go: `.String()` $DIR/core/web/eth_keys_controller_test.go: `.Context(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewEthMocksWithStartupAssertions(t)` $DIR/core/web/eth_keys_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].NonceAutoSync = ptr(false) c.EVM[0].BalanceMonitor.Enabled = ptr(false) })` $DIR/core/web/eth_keys_controller_test.go: `.NewApplicationWithConfig(t, cfg, ethClient)` $DIR/core/web/eth_keys_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/eth_keys_controller_test.go: `.NewAddress()` $DIR/core/web/eth_keys_controller_test.go: `.Hex()` $DIR/core/web/eth_keys_controller_test.go: `.Delete(chainURL.String())` $DIR/core/web/eth_keys_controller_test.go: `.String()` $DIR/core/web/evm_chains_controller_test.go: `t.Run(tc.name, func(t *testing.T) { t.Parallel() controller := setupEVMChainsControllerTest(t, configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { if tc.want != nil { c.EVM = evmcfg.EVMConfigs{tc.want} } })) wantedResult := tc.want resp, cleanup := controller.client.Get( fmt.Sprintf("/v2/chains/evm/%s", tc.inputId), ) t.Cleanup(cleanup) require.Equal(t, tc.wantStatusCode, resp.StatusCode) if wantedResult != nil { resource1 := presenters.EVMChainResource{} err := web.ParseJSONAPIResponse(cltest.ParseResponseBody(t, resp), &resource1) require.NoError(t, err) assert.Equal(t, resource1.ID, wantedResult.ChainID.String()) toml, err := wantedResult.TOMLString() require.NoError(t, err) assert.Equal(t, toml, resource1.Config) } })` $DIR/core/web/evm_chains_controller_test.go: `c.EVM = evmcfg.EVMConfigs{tc.want}` $DIR/core/web/evm_chains_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/evm_chains_controller_test.go: `sort.Slice(chainIDs, func(i, j int) bool { return chainIDs[i].String() < chainIDs[j].String() })` $DIR/core/web/evm_chains_controller_test.go: `c.EVM = append(c.EVM, configuredChains...)` $DIR/core/web/evm_chains_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/evm_chains_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/evm_chains_controller_test.go: `err = web.ParsePaginatedResponse(body, &gotChains, &links)` $DIR/core/web/evm_chains_controller_test.go: `resp, cleanup = controller.client.Get(links["next"].Href)` $DIR/core/web/evm_chains_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/evm_chains_controller_test.go: `gotChains = []presenters.EVMChainResource{}` $DIR/core/web/evm_chains_controller_test.go: `err = web.ParsePaginatedResponse(cltest.ParseResponseBody(t, resp), &gotChains, &links)` $DIR/core/web/evm_chains_controller_test.go: `toml, err = configuredChains[2].TOMLString()` $DIR/core/web/evm_chains_controller_test.go: `.New(testutils.NewRandomEVMChainID())` $DIR/core/web/evm_chains_controller_test.go: `.NewRandomEVMChainID()` $DIR/core/web/evm_chains_controller_test.go: `.String()` $DIR/core/web/evm_chains_controller_test.go: `.Defaults(nil, &evmcfg.Chain{ GasEstimator: evmcfg.GasEstimator{ EIP1559DynamicFees: ptr(true), BlockHistory: evmcfg.BlockHistoryEstimator{ BlockHistorySize: ptr[uint16](50), }, }, RPCBlockQueryDelay: ptr[uint16](23), MinIncomingConfirmations: ptr[uint32](12), LinkContractAddress: ptr(types.EIP55AddressFromAddress(testutils.NewAddress())), })` $DIR/core/web/evm_chains_controller_test.go: `.EIP55AddressFromAddress(testutils.NewAddress())` $DIR/core/web/evm_chains_controller_test.go: `.NewAddress()` $DIR/core/web/evm_chains_controller_test.go: `.Run(tc.name, func(t *testing.T) { t.Parallel() controller := setupEVMChainsControllerTest(t, configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { if tc.want != nil { c.EVM = evmcfg.EVMConfigs{tc.want} } })) wantedResult := tc.want resp, cleanup := controller.client.Get( fmt.Sprintf("/v2/chains/evm/%s", tc.inputId), ) t.Cleanup(cleanup) require.Equal(t, tc.wantStatusCode, resp.StatusCode) if wantedResult != nil { resource1 := presenters.EVMChainResource{} err := web.ParseJSONAPIResponse(cltest.ParseResponseBody(t, resp), &resource1) require.NoError(t, err) assert.Equal(t, resource1.ID, wantedResult.ChainID.String()) toml, err := wantedResult.TOMLString() require.NoError(t, err) assert.Equal(t, toml, resource1.Config) } })` $DIR/core/web/evm_chains_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { if tc.want != nil { c.EVM = evmcfg.EVMConfigs{tc.want} } })` $DIR/core/web/evm_chains_controller_test.go: `.client.Get( fmt.Sprintf("/v2/chains/evm/%s", tc.inputId), )` $DIR/core/web/evm_chains_controller_test.go: `.Sprintf("/v2/chains/evm/%s", tc.inputId)` $DIR/core/web/evm_chains_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/evm_chains_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, resp), &resource1)` $DIR/core/web/evm_chains_controller_test.go: `.ParseResponseBody(t, resp)` $DIR/core/web/evm_chains_controller_test.go: `.TOMLString()` $DIR/core/web/evm_chains_controller_test.go: `.NewRandomEVMChainID()` $DIR/core/web/evm_chains_controller_test.go: `.NewRandomEVMChainID()` $DIR/core/web/evm_chains_controller_test.go: `.NewRandomEVMChainID()` $DIR/core/web/evm_chains_controller_test.go: `.Slice(chainIDs, func(i, j int) bool { return chainIDs[i].String() < chainIDs[j].String() })` $DIR/core/web/evm_chains_controller_test.go: `.String()` $DIR/core/web/evm_chains_controller_test.go: `.String()` $DIR/core/web/evm_chains_controller_test.go: `.New(chainIDs[0])` $DIR/core/web/evm_chains_controller_test.go: `.Defaults(nil)` $DIR/core/web/evm_chains_controller_test.go: `.New(chainIDs[1])` $DIR/core/web/evm_chains_controller_test.go: `.Defaults(nil, &evmcfg.Chain{ RPCBlockQueryDelay: ptr[uint16](13), GasEstimator: evmcfg.GasEstimator{ EIP1559DynamicFees: ptr(true), BlockHistory: evmcfg.BlockHistoryEstimator{ BlockHistorySize: ptr[uint16](1), }, }, MinIncomingConfirmations: ptr[uint32](120), })` $DIR/core/web/evm_chains_controller_test.go: `.New(chainIDs[2])` $DIR/core/web/evm_chains_controller_test.go: `.Defaults(nil, &evmcfg.Chain{ RPCBlockQueryDelay: ptr[uint16](5), GasEstimator: evmcfg.GasEstimator{ EIP1559DynamicFees: ptr(false), BlockHistory: evmcfg.BlockHistoryEstimator{ BlockHistorySize: ptr[uint16](2), }, }, MinIncomingConfirmations: ptr[uint32](30), })` $DIR/core/web/evm_chains_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM = append(c.EVM, configuredChains...) })` $DIR/core/web/evm_chains_controller_test.go: `.client.Get("/v2/chains/evm?size=asd")` $DIR/core/web/evm_chains_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/evm_chains_controller_test.go: `.client.Get("/v2/chains/evm?size=3")` $DIR/core/web/evm_chains_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/evm_chains_controller_test.go: `.ParseResponseBody(t, resp)` $DIR/core/web/evm_chains_controller_test.go: `.ParseJSONAPIResponseMetaCount(body)` $DIR/core/web/evm_chains_controller_test.go: `.ParsePaginatedResponse(body, &gotChains, &links)` $DIR/core/web/evm_chains_controller_test.go: `.TOMLString()` $DIR/core/web/evm_chains_controller_test.go: `.client.Get(links["next"].Href)` $DIR/core/web/evm_chains_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/evm_chains_controller_test.go: `.ParsePaginatedResponse(cltest.ParseResponseBody(t, resp), &gotChains, &links)` $DIR/core/web/evm_chains_controller_test.go: `.ParseResponseBody(t, resp)` $DIR/core/web/evm_chains_controller_test.go: `.TOMLString()` $DIR/core/web/evm_forwarders_controller_test.go: `c.EVM = evmcfg.EVMConfigs{ {ChainID: chainId, Enabled: ptr(true), Chain: evmcfg.Defaults(chainId)}, }` $DIR/core/web/evm_forwarders_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/evm_forwarders_controller_test.go: `err = web.ParseJSONAPIResponse(cltest.ParseResponseBody(t, resp), &resource)` $DIR/core/web/evm_forwarders_controller_test.go: `resp, cleanup = controller.client.Delete("/v2/nodes/evm/forwarders/" + resource.ID)` $DIR/core/web/evm_forwarders_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/evm_forwarders_controller_test.go: `c.EVM = evmcfg.EVMConfigs{ {ChainID: chainId, Enabled: ptr(true), Chain: evmcfg.Defaults(chainId)}, }` $DIR/core/web/evm_forwarders_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/evm_forwarders_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/evm_forwarders_controller_test.go: `err = web.ParsePaginatedResponse(body, &fwdrcs, &links)` $DIR/core/web/evm_forwarders_controller_test.go: `.New(testutils.NewRandomEVMChainID())` $DIR/core/web/evm_forwarders_controller_test.go: `.NewRandomEVMChainID()` $DIR/core/web/evm_forwarders_controller_test.go: `.Defaults(chainId)` $DIR/core/web/evm_forwarders_controller_test.go: `.RandomAddress()` $DIR/core/web/evm_forwarders_controller_test.go: `.Marshal(web.TrackEVMForwarderRequest{ EVMChainID: chainId, Address: address, }, )` $DIR/core/web/evm_forwarders_controller_test.go: `.client.Post("/v2/nodes/evm/forwarders/track", bytes.NewReader(body))` $DIR/core/web/evm_forwarders_controller_test.go: `.NewReader(body)` $DIR/core/web/evm_forwarders_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/evm_forwarders_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, resp), &resource)` $DIR/core/web/evm_forwarders_controller_test.go: `.ParseResponseBody(t, resp)` $DIR/core/web/evm_forwarders_controller_test.go: `.client.Delete("/v2/nodes/evm/forwarders/" + resource.ID)` $DIR/core/web/evm_forwarders_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/evm_forwarders_controller_test.go: `.New(testutils.NewRandomEVMChainID())` $DIR/core/web/evm_forwarders_controller_test.go: `.NewRandomEVMChainID()` $DIR/core/web/evm_forwarders_controller_test.go: `.Defaults(chainId)` $DIR/core/web/evm_forwarders_controller_test.go: `.RandomAddress()` $DIR/core/web/evm_forwarders_controller_test.go: `.RandomAddress()` $DIR/core/web/evm_forwarders_controller_test.go: `.Marshal(web.TrackEVMForwarderRequest{ EVMChainID: chainId, Address: fwdr.Address, }, )` $DIR/core/web/evm_forwarders_controller_test.go: `.client.Post("/v2/nodes/evm/forwarders/track", bytes.NewReader(body))` $DIR/core/web/evm_forwarders_controller_test.go: `.NewReader(body)` $DIR/core/web/evm_forwarders_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/evm_forwarders_controller_test.go: `.client.Get("/v2/nodes/evm/forwarders?size=2")` $DIR/core/web/evm_forwarders_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/evm_forwarders_controller_test.go: `.ParseResponseBody(t, resp)` $DIR/core/web/evm_forwarders_controller_test.go: `.ParseJSONAPIResponseMetaCount(body)` $DIR/core/web/evm_forwarders_controller_test.go: `.ParsePaginatedResponse(body, &fwdrcs, &links)` $DIR/core/web/evm_transactions_controller_test.go: `cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 0, 1, from)` $DIR/core/web/evm_transactions_controller_test.go: `cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 4, 4, from)` $DIR/core/web/evm_transactions_controller_test.go: `attempt.State = txmgrtypes.TxAttemptBroadcast` $DIR/core/web/evm_transactions_controller_test.go: `attempt.TxFee = gas.EvmFee{Legacy: assets.NewWeiI(3)}` $DIR/core/web/evm_transactions_controller_test.go: `attempt.BroadcastBeforeBlockNum = &blockNum` $DIR/core/web/evm_transactions_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/evm_transactions_controller_test.go: `cltest.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/evm_transactions_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/evm_transactions_controller_test.go: `attempt.Tx = tx` $DIR/core/web/evm_transactions_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/evm_transactions_controller_test.go: `cltest.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/evm_transactions_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/evm_transactions_controller_test.go: `.NewApplicationWithKey(t)` $DIR/core/web/evm_transactions_controller_test.go: `.Context(t)` $DIR/core/web/evm_transactions_controller_test.go: `.GetDB()` $DIR/core/web/evm_transactions_controller_test.go: `.NewTestTxStore(t, app.GetDB())` $DIR/core/web/evm_transactions_controller_test.go: `.GetDB()` $DIR/core/web/evm_transactions_controller_test.go: `.NewKeyStore(t, db)` $DIR/core/web/evm_transactions_controller_test.go: `.Eth()` $DIR/core/web/evm_transactions_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/evm_transactions_controller_test.go: `.MustInsertRandomKey(t, ethKeyStore)` $DIR/core/web/evm_transactions_controller_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 0, 1, from)` $DIR/core/web/evm_transactions_controller_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 3, 2, from)` $DIR/core/web/evm_transactions_controller_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 4, 4, from)` $DIR/core/web/evm_transactions_controller_test.go: `.NewLegacyEthTxAttempt(t, tx2.ID)` $DIR/core/web/evm_transactions_controller_test.go: `.NewWeiI(3)` $DIR/core/web/evm_transactions_controller_test.go: `.TransactionsWithAttempts(ctx, 0, 100)` $DIR/core/web/evm_transactions_controller_test.go: `.Get(fmt.Sprintf("/v2/transactions?size=%d", size))` $DIR/core/web/evm_transactions_controller_test.go: `.Sprintf("/v2/transactions?size=%d", size)` $DIR/core/web/evm_transactions_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/evm_transactions_controller_test.go: `.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/evm_transactions_controller_test.go: `.ParseResponseBody(t, resp)` $DIR/core/web/evm_transactions_controller_test.go: `.NewApplicationWithKey(t)` $DIR/core/web/evm_transactions_controller_test.go: `.Context(t)` $DIR/core/web/evm_transactions_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/evm_transactions_controller_test.go: `.Get("/v2/transactions?size=TrainingDay")` $DIR/core/web/evm_transactions_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/evm_transactions_controller_test.go: `.NewApplicationWithKey(t)` $DIR/core/web/evm_transactions_controller_test.go: `.Context(t)` $DIR/core/web/evm_transactions_controller_test.go: `.NewTestTxStore(t, app.GetDB())` $DIR/core/web/evm_transactions_controller_test.go: `.GetDB()` $DIR/core/web/evm_transactions_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/evm_transactions_controller_test.go: `.MustInsertRandomKey(t, app.KeyStore.Eth())` $DIR/core/web/evm_transactions_controller_test.go: `.KeyStore.Eth()` $DIR/core/web/evm_transactions_controller_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 1, from)` $DIR/core/web/evm_transactions_controller_test.go: `.Get("/v2/transactions/" + attempt.Hash.String())` $DIR/core/web/evm_transactions_controller_test.go: `.Hash.String()` $DIR/core/web/evm_transactions_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/evm_transactions_controller_test.go: `.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/evm_transactions_controller_test.go: `.NewEthTxResourceFromAttempt(attempt)` $DIR/core/web/evm_transactions_controller_test.go: `.NewApplicationWithKey(t)` $DIR/core/web/evm_transactions_controller_test.go: `.Context(t)` $DIR/core/web/evm_transactions_controller_test.go: `.NewTestTxStore(t, app.GetDB())` $DIR/core/web/evm_transactions_controller_test.go: `.GetDB()` $DIR/core/web/evm_transactions_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/evm_transactions_controller_test.go: `.MustInsertRandomKey(t, app.KeyStore.Eth())` $DIR/core/web/evm_transactions_controller_test.go: `.KeyStore.Eth()` $DIR/core/web/evm_transactions_controller_test.go: `.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 1, from)` $DIR/core/web/evm_transactions_controller_test.go: `.Get("/v2/transactions/" + (attempt.Hash.String() + "1"))` $DIR/core/web/evm_transactions_controller_test.go: `.Hash.String()` $DIR/core/web/evm_transactions_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/evm_transfer_controller_test.go: `ethClient.On("PendingNonceAt", mock.Anything, key.Address).Return(uint64(1), nil)` $DIR/core/web/evm_transfer_controller_test.go: `ethClient.On("BalanceAt", mock.Anything, key.Address, (*big.Int)(nil)).Return(balance.ToInt(), nil)` $DIR/core/web/evm_transfer_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/evm_transfer_controller_test.go: `ethClient.On("PendingNonceAt", mock.Anything, key.Address).Return(uint64(1), nil)` $DIR/core/web/evm_transfer_controller_test.go: `ethClient.On("BalanceAt", mock.Anything, key.Address, (*big.Int)(nil)).Return(balance.ToInt(), nil)` $DIR/core/web/evm_transfer_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/evm_transfer_controller_test.go: `ethClient.On("PendingNonceAt", mock.Anything, key.Address).Return(uint64(1), nil)` $DIR/core/web/evm_transfer_controller_test.go: `ethClient.On("BalanceAt", mock.Anything, key.Address, (*big.Int)(nil)).Return(balance.ToInt(), nil)` $DIR/core/web/evm_transfer_controller_test.go: `c.EVM[0].BalanceMonitor.Enabled = ptr(false)` $DIR/core/web/evm_transfer_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/evm_transfer_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/evm_transfer_controller_test.go: `ethClient.On("PendingNonceAt", mock.Anything, key.Address).Return(uint64(1), nil)` $DIR/core/web/evm_transfer_controller_test.go: `ethClient.On("BalanceAt", mock.Anything, key.Address, (*big.Int)(nil)).Return(assets.NewEth(10).ToInt(), nil)` $DIR/core/web/evm_transfer_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/evm_transfer_controller_test.go: `ethClient.On("PendingNonceAt", mock.Anything, key.Address).Return(uint64(1), nil)` $DIR/core/web/evm_transfer_controller_test.go: `ethClient.On("BalanceAt", mock.Anything, key.Address, (*big.Int)(nil)).Return(balance.ToInt(), nil)` $DIR/core/web/evm_transfer_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/evm_transfer_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/evm_transfer_controller_test.go: `ethClient.On("PendingNonceAt", mock.Anything, key.Address).Return(uint64(1), nil)` $DIR/core/web/evm_transfer_controller_test.go: `ethClient.On("BalanceAt", mock.Anything, key.Address, (*big.Int)(nil)).Return(balance.ToInt(), nil)` $DIR/core/web/evm_transfer_controller_test.go: `ethClient.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything).Return(evmtypes.Nonce(0), nil).Maybe()` $DIR/core/web/evm_transfer_controller_test.go: `c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(true)` $DIR/core/web/evm_transfer_controller_test.go: `c.EVM[0].GasEstimator.Mode = ptr("FixedPrice")` $DIR/core/web/evm_transfer_controller_test.go: `c.EVM[0].ChainID = (*ubig.Big)(testutils.FixtureChainID)` $DIR/core/web/evm_transfer_controller_test.go: `c.Database.Listener.FallbackPollInterval = commonconfig.MustNewDuration(time.Second)` $DIR/core/web/evm_transfer_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/evm_transfer_controller_test.go: `cltest.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/evm_transfer_controller_test.go: `err = web.ParseJSONAPIResponse(cltest.ParseResponseBody(t, resp), &resource)` $DIR/core/web/evm_transfer_controller_test.go: `validateTxCount(t, app.GetDB(), 1)` $DIR/core/web/evm_transfer_controller_test.go: `t.Run("happy_path", func(t *testing.T) { ctx := testutils.Context(t) timeout := 5 * time.Second var done bool find := func(_ context.Context, _ int64) (txmgr.Tx, error) { if !done { done = true return tx, nil } return txWithAttempt, nil } a, err := web.FindTxAttempt(ctx, timeout, tx, find) require.NoError(t, err) assert.Equal(t, tx.ID, a.Tx.ID) assert.Equal(t, attempt.ID, a.ID) })` $DIR/core/web/evm_transfer_controller_test.go: `done = true` $DIR/core/web/evm_transfer_controller_test.go: `t.Run("failed to find tx", func(t *testing.T) { ctx := testutils.Context(t) find := func(_ context.Context, _ int64) (txmgr.Tx, error) { return txmgr.Tx{}, fmt.Errorf("ERRORED") } _, err := web.FindTxAttempt(ctx, time.Second, tx, find) assert.ErrorContains(t, err, "failed to find transaction") })` $DIR/core/web/evm_transfer_controller_test.go: `t.Run("timeout", func(t *testing.T) { ctx := testutils.Context(t) find := func(_ context.Context, _ int64) (txmgr.Tx, error) { return tx, nil } _, err := web.FindTxAttempt(ctx, time.Second, tx, find) assert.ErrorContains(t, err, "context deadline exceeded") })` $DIR/core/web/evm_transfer_controller_test.go: `time.Sleep(1 * time.Second)` $DIR/core/web/evm_transfer_controller_test.go: `cancel()` $DIR/core/web/evm_transfer_controller_test.go: `.MustGenerateRandomKey(t)` $DIR/core/web/evm_transfer_controller_test.go: `.NewEthMocksWithTransactionsOnBlocksAssertions(t)` $DIR/core/web/evm_transfer_controller_test.go: `.NewEthValueS("200")` $DIR/core/web/evm_transfer_controller_test.go: `.On("PendingNonceAt", mock.Anything, key.Address)` $DIR/core/web/evm_transfer_controller_test.go: `.Return(uint64(1), nil)` $DIR/core/web/evm_transfer_controller_test.go: `.On("BalanceAt", mock.Anything, key.Address, (*big.Int)(nil))` $DIR/core/web/evm_transfer_controller_test.go: `.Return(balance.ToInt(), nil)` $DIR/core/web/evm_transfer_controller_test.go: `.ToInt()` $DIR/core/web/evm_transfer_controller_test.go: `.NewApplicationWithKey(t, ethClient, key)` $DIR/core/web/evm_transfer_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/evm_transfer_controller_test.go: `.NewEthValueS("100")` $DIR/core/web/evm_transfer_controller_test.go: `.HexToAddress("0xFA01FA015C8A5332987319823728982379128371")` $DIR/core/web/evm_transfer_controller_test.go: `.New(evmtest.MustGetDefaultChainID(t, app.Config.EVMConfigs()))` $DIR/core/web/evm_transfer_controller_test.go: `.MustGetDefaultChainID(t, app.Config.EVMConfigs())` $DIR/core/web/evm_transfer_controller_test.go: `.Config.EVMConfigs()` $DIR/core/web/evm_transfer_controller_test.go: `.Marshal(&request)` $DIR/core/web/evm_transfer_controller_test.go: `.Post("/v2/transfers", bytes.NewBuffer(body))` $DIR/core/web/evm_transfer_controller_test.go: `.NewBuffer(body)` $DIR/core/web/evm_transfer_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/evm_transfer_controller_test.go: `.ParseJSONAPIErrors(t, resp.Body)` $DIR/core/web/evm_transfer_controller_test.go: `.GetDB()` $DIR/core/web/evm_transfer_controller_test.go: `.MustGenerateRandomKey(t)` $DIR/core/web/evm_transfer_controller_test.go: `.NewEthMocksWithTransactionsOnBlocksAssertions(t)` $DIR/core/web/evm_transfer_controller_test.go: `.NewEthValueS("2")` $DIR/core/web/evm_transfer_controller_test.go: `.On("PendingNonceAt", mock.Anything, key.Address)` $DIR/core/web/evm_transfer_controller_test.go: `.Return(uint64(1), nil)` $DIR/core/web/evm_transfer_controller_test.go: `.On("BalanceAt", mock.Anything, key.Address, (*big.Int)(nil))` $DIR/core/web/evm_transfer_controller_test.go: `.Return(balance.ToInt(), nil)` $DIR/core/web/evm_transfer_controller_test.go: `.ToInt()` $DIR/core/web/evm_transfer_controller_test.go: `.NewApplicationWithKey(t, ethClient, key)` $DIR/core/web/evm_transfer_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/evm_transfer_controller_test.go: `.NewEthValue(1000000000000000000)` $DIR/core/web/evm_transfer_controller_test.go: `.HexToAddress("0xFA01FA015C8A5332987319823728982379128371")` $DIR/core/web/evm_transfer_controller_test.go: `.New(evmtest.MustGetDefaultChainID(t, app.Config.EVMConfigs()))` $DIR/core/web/evm_transfer_controller_test.go: `.MustGetDefaultChainID(t, app.Config.EVMConfigs())` $DIR/core/web/evm_transfer_controller_test.go: `.Config.EVMConfigs()` $DIR/core/web/evm_transfer_controller_test.go: `.Marshal(&request)` $DIR/core/web/evm_transfer_controller_test.go: `.Post("/v2/transfers", bytes.NewBuffer(body))` $DIR/core/web/evm_transfer_controller_test.go: `.NewBuffer(body)` $DIR/core/web/evm_transfer_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/evm_transfer_controller_test.go: `.ParseJSONAPIErrors(t, resp.Body)` $DIR/core/web/evm_transfer_controller_test.go: `.GetDB()` $DIR/core/web/evm_transfer_controller_test.go: `.MustGenerateRandomKey(t)` $DIR/core/web/evm_transfer_controller_test.go: `.NewEthMocksWithTransactionsOnBlocksAssertions(t)` $DIR/core/web/evm_transfer_controller_test.go: `.NewEthValueS("200")` $DIR/core/web/evm_transfer_controller_test.go: `.On("PendingNonceAt", mock.Anything, key.Address)` $DIR/core/web/evm_transfer_controller_test.go: `.Return(uint64(1), nil)` $DIR/core/web/evm_transfer_controller_test.go: `.On("BalanceAt", mock.Anything, key.Address, (*big.Int)(nil))` $DIR/core/web/evm_transfer_controller_test.go: `.Return(balance.ToInt(), nil)` $DIR/core/web/evm_transfer_controller_test.go: `.ToInt()` $DIR/core/web/evm_transfer_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].BalanceMonitor.Enabled = ptr(false) })` $DIR/core/web/evm_transfer_controller_test.go: `.NewApplicationWithConfigAndKey(t, config, ethClient, key)` $DIR/core/web/evm_transfer_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/evm_transfer_controller_test.go: `.NewEthValueS("100")` $DIR/core/web/evm_transfer_controller_test.go: `.HexToAddress("0xFA01FA015C8A5332987319823728982379128371")` $DIR/core/web/evm_transfer_controller_test.go: `.New(evmtest.MustGetDefaultChainID(t, app.Config.EVMConfigs()))` $DIR/core/web/evm_transfer_controller_test.go: `.MustGetDefaultChainID(t, app.Config.EVMConfigs())` $DIR/core/web/evm_transfer_controller_test.go: `.Config.EVMConfigs()` $DIR/core/web/evm_transfer_controller_test.go: `.Marshal(&request)` $DIR/core/web/evm_transfer_controller_test.go: `.Post("/v2/transfers", bytes.NewBuffer(body))` $DIR/core/web/evm_transfer_controller_test.go: `.NewBuffer(body)` $DIR/core/web/evm_transfer_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/evm_transfer_controller_test.go: `.ParseJSONAPIErrors(t, resp.Body)` $DIR/core/web/evm_transfer_controller_test.go: `.GetDB()` $DIR/core/web/evm_transfer_controller_test.go: `.NewApplicationWithKey(t)` $DIR/core/web/evm_transfer_controller_test.go: `.NewEthValueS("100")` $DIR/core/web/evm_transfer_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/evm_transfer_controller_test.go: `.HexToAddress("0xFA01FA015C8A5332987319823728982379128371")` $DIR/core/web/evm_transfer_controller_test.go: `.HexToAddress("0x0000000000000000000000000000000000000000")` $DIR/core/web/evm_transfer_controller_test.go: `.New(evmtest.MustGetDefaultChainID(t, app.Config.EVMConfigs()))` $DIR/core/web/evm_transfer_controller_test.go: `.MustGetDefaultChainID(t, app.Config.EVMConfigs())` $DIR/core/web/evm_transfer_controller_test.go: `.Config.EVMConfigs()` $DIR/core/web/evm_transfer_controller_test.go: `.Marshal(&request)` $DIR/core/web/evm_transfer_controller_test.go: `.Post("/v2/transfers", bytes.NewBuffer(body))` $DIR/core/web/evm_transfer_controller_test.go: `.NewBuffer(body)` $DIR/core/web/evm_transfer_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/evm_transfer_controller_test.go: `.MustGenerateRandomKey(t)` $DIR/core/web/evm_transfer_controller_test.go: `.NewEthMocksWithTransactionsOnBlocksAssertions(t)` $DIR/core/web/evm_transfer_controller_test.go: `.On("PendingNonceAt", mock.Anything, key.Address)` $DIR/core/web/evm_transfer_controller_test.go: `.Return(uint64(1), nil)` $DIR/core/web/evm_transfer_controller_test.go: `.On("BalanceAt", mock.Anything, key.Address, (*big.Int)(nil))` $DIR/core/web/evm_transfer_controller_test.go: `.Return(assets.NewEth(10).ToInt(), nil)` $DIR/core/web/evm_transfer_controller_test.go: `.NewEth(10)` $DIR/core/web/evm_transfer_controller_test.go: `.ToInt()` $DIR/core/web/evm_transfer_controller_test.go: `.NewApplicationWithKey(t, ethClient, key)` $DIR/core/web/evm_transfer_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/evm_transfer_controller_test.go: `.NewEthValueS("100")` $DIR/core/web/evm_transfer_controller_test.go: `.HexToAddress("0xFA01FA015C8A5332987319823728982379128371")` $DIR/core/web/evm_transfer_controller_test.go: `.New(evmtest.MustGetDefaultChainID(t, app.Config.EVMConfigs()))` $DIR/core/web/evm_transfer_controller_test.go: `.MustGetDefaultChainID(t, app.Config.EVMConfigs())` $DIR/core/web/evm_transfer_controller_test.go: `.Config.EVMConfigs()` $DIR/core/web/evm_transfer_controller_test.go: `.Marshal(&request)` $DIR/core/web/evm_transfer_controller_test.go: `.Post("/v2/transfers", bytes.NewBuffer(body))` $DIR/core/web/evm_transfer_controller_test.go: `.NewBuffer(body)` $DIR/core/web/evm_transfer_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/evm_transfer_controller_test.go: `.MustGenerateRandomKey(t)` $DIR/core/web/evm_transfer_controller_test.go: `.NewEthMocksWithTransactionsOnBlocksAssertions(t)` $DIR/core/web/evm_transfer_controller_test.go: `.NewEthValueS("0")` $DIR/core/web/evm_transfer_controller_test.go: `.On("PendingNonceAt", mock.Anything, key.Address)` $DIR/core/web/evm_transfer_controller_test.go: `.Return(uint64(1), nil)` $DIR/core/web/evm_transfer_controller_test.go: `.On("BalanceAt", mock.Anything, key.Address, (*big.Int)(nil))` $DIR/core/web/evm_transfer_controller_test.go: `.Return(balance.ToInt(), nil)` $DIR/core/web/evm_transfer_controller_test.go: `.ToInt()` $DIR/core/web/evm_transfer_controller_test.go: `.NewApplicationWithKey(t, ethClient, key)` $DIR/core/web/evm_transfer_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/evm_transfer_controller_test.go: `.NewEthValueS("100")` $DIR/core/web/evm_transfer_controller_test.go: `.HexToAddress("0xFA01FA015C8A5332987319823728982379128371")` $DIR/core/web/evm_transfer_controller_test.go: `.New(evmtest.MustGetDefaultChainID(t, app.Config.EVMConfigs()))` $DIR/core/web/evm_transfer_controller_test.go: `.MustGetDefaultChainID(t, app.Config.EVMConfigs())` $DIR/core/web/evm_transfer_controller_test.go: `.Config.EVMConfigs()` $DIR/core/web/evm_transfer_controller_test.go: `.Marshal(&request)` $DIR/core/web/evm_transfer_controller_test.go: `.Post("/v2/transfers", bytes.NewBuffer(body))` $DIR/core/web/evm_transfer_controller_test.go: `.NewBuffer(body)` $DIR/core/web/evm_transfer_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/evm_transfer_controller_test.go: `.NewApplicationWithKey(t)` $DIR/core/web/evm_transfer_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/evm_transfer_controller_test.go: `.Post("/v2/transfers", bytes.NewBuffer([]byte(`{"address":""}`)))` $DIR/core/web/evm_transfer_controller_test.go: `.NewBuffer([]byte(`{"address":""}`))` $DIR/core/web/evm_transfer_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/evm_transfer_controller_test.go: `.MustGenerateRandomKey(t)` $DIR/core/web/evm_transfer_controller_test.go: `.NewEthMocksWithTransactionsOnBlocksAssertions(t)` $DIR/core/web/evm_transfer_controller_test.go: `.NewEthValueS("200")` $DIR/core/web/evm_transfer_controller_test.go: `.On("PendingNonceAt", mock.Anything, key.Address)` $DIR/core/web/evm_transfer_controller_test.go: `.Return(uint64(1), nil)` $DIR/core/web/evm_transfer_controller_test.go: `.On("BalanceAt", mock.Anything, key.Address, (*big.Int)(nil))` $DIR/core/web/evm_transfer_controller_test.go: `.Return(balance.ToInt(), nil)` $DIR/core/web/evm_transfer_controller_test.go: `.ToInt()` $DIR/core/web/evm_transfer_controller_test.go: `.On("SequenceAt", mock.Anything, mock.Anything, mock.Anything)` $DIR/core/web/evm_transfer_controller_test.go: `.Return(evmtypes.Nonce(0), nil)` $DIR/core/web/evm_transfer_controller_test.go: `.Nonce(0)` $DIR/core/web/evm_transfer_controller_test.go: `.Maybe()` $DIR/core/web/evm_transfer_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].GasEstimator.EIP1559DynamicFees = ptr(true) c.EVM[0].GasEstimator.Mode = ptr("FixedPrice") c.EVM[0].ChainID = (*ubig.Big)(testutils.FixtureChainID) // NOTE: FallbackPollInterval is used in this test to quickly create TxAttempts // Testing triggers requires committing transactions and does not work with transactional tests c.Database.Listener.FallbackPollInterval = commonconfig.MustNewDuration(time.Second) })` $DIR/core/web/evm_transfer_controller_test.go: `.MustNewDuration(time.Second)` $DIR/core/web/evm_transfer_controller_test.go: `.NewApplicationWithConfigAndKey(t, config, ethClient, key)` $DIR/core/web/evm_transfer_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/evm_transfer_controller_test.go: `.NewEthValueS("100")` $DIR/core/web/evm_transfer_controller_test.go: `.HexToAddress("0xFA01FA015C8A5332987319823728982379128371")` $DIR/core/web/evm_transfer_controller_test.go: `.New(evmtest.MustGetDefaultChainID(t, config.EVMConfigs()))` $DIR/core/web/evm_transfer_controller_test.go: `.MustGetDefaultChainID(t, config.EVMConfigs())` $DIR/core/web/evm_transfer_controller_test.go: `.EVMConfigs()` $DIR/core/web/evm_transfer_controller_test.go: `.Marshal(&request)` $DIR/core/web/evm_transfer_controller_test.go: `.Post("/v2/transfers", bytes.NewBuffer(body))` $DIR/core/web/evm_transfer_controller_test.go: `.NewBuffer(body)` $DIR/core/web/evm_transfer_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/evm_transfer_controller_test.go: `.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/evm_transfer_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, resp), &resource)` $DIR/core/web/evm_transfer_controller_test.go: `.ParseResponseBody(t, resp)` $DIR/core/web/evm_transfer_controller_test.go: `.GetDB()` $DIR/core/web/evm_transfer_controller_test.go: `.Run("happy_path", func(t *testing.T) { ctx := testutils.Context(t) timeout := 5 * time.Second var done bool find := func(_ context.Context, _ int64) (txmgr.Tx, error) { if !done { done = true return tx, nil } return txWithAttempt, nil } a, err := web.FindTxAttempt(ctx, timeout, tx, find) require.NoError(t, err) assert.Equal(t, tx.ID, a.Tx.ID) assert.Equal(t, attempt.ID, a.ID) })` $DIR/core/web/evm_transfer_controller_test.go: `.Context(t)` $DIR/core/web/evm_transfer_controller_test.go: `.FindTxAttempt(ctx, timeout, tx, find)` $DIR/core/web/evm_transfer_controller_test.go: `.Run("failed to find tx", func(t *testing.T) { ctx := testutils.Context(t) find := func(_ context.Context, _ int64) (txmgr.Tx, error) { return txmgr.Tx{}, fmt.Errorf("ERRORED") } _, err := web.FindTxAttempt(ctx, time.Second, tx, find) assert.ErrorContains(t, err, "failed to find transaction") })` $DIR/core/web/evm_transfer_controller_test.go: `.Context(t)` $DIR/core/web/evm_transfer_controller_test.go: `.FindTxAttempt(ctx, time.Second, tx, find)` $DIR/core/web/evm_transfer_controller_test.go: `.Run("timeout", func(t *testing.T) { ctx := testutils.Context(t) find := func(_ context.Context, _ int64) (txmgr.Tx, error) { return tx, nil } _, err := web.FindTxAttempt(ctx, time.Second, tx, find) assert.ErrorContains(t, err, "context deadline exceeded") })` $DIR/core/web/evm_transfer_controller_test.go: `.Context(t)` $DIR/core/web/evm_transfer_controller_test.go: `.FindTxAttempt(ctx, time.Second, tx, find)` $DIR/core/web/evm_transfer_controller_test.go: `.Context(t)` $DIR/core/web/evm_transfer_controller_test.go: `.WithCancel(ctx)` $DIR/core/web/evm_transfer_controller_test.go: `.Sleep(1 * time.Second)` $DIR/core/web/evm_transfer_controller_test.go: `.FindTxAttempt(ctx, 5*time.Second, tx, find)` $DIR/core/web/evm_tx_attempts_controller_test.go: `cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 0, 1, from)` $DIR/core/web/evm_tx_attempts_controller_test.go: `cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 1, 2, from)` $DIR/core/web/evm_tx_attempts_controller_test.go: `cltest.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 2, 3, from)` $DIR/core/web/evm_tx_attempts_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/evm_tx_attempts_controller_test.go: `cltest.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/evm_tx_attempts_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/evm_tx_attempts_controller_test.go: `.NewApplicationWithKey(t)` $DIR/core/web/evm_tx_attempts_controller_test.go: `.NewTestTxStore(t, app.GetDB())` $DIR/core/web/evm_tx_attempts_controller_test.go: `.GetDB()` $DIR/core/web/evm_tx_attempts_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/evm_tx_attempts_controller_test.go: `.MustInsertRandomKey(t, app.KeyStore.Eth())` $DIR/core/web/evm_tx_attempts_controller_test.go: `.KeyStore.Eth()` $DIR/core/web/evm_tx_attempts_controller_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 0, 1, from)` $DIR/core/web/evm_tx_attempts_controller_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 1, 2, from)` $DIR/core/web/evm_tx_attempts_controller_test.go: `.MustInsertConfirmedEthTxWithLegacyAttempt(t, txStore, 2, 3, from)` $DIR/core/web/evm_tx_attempts_controller_test.go: `.Get("/v2/tx_attempts?size=2")` $DIR/core/web/evm_tx_attempts_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/evm_tx_attempts_controller_test.go: `.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/evm_tx_attempts_controller_test.go: `.ParseResponseBody(t, resp)` $DIR/core/web/evm_tx_attempts_controller_test.go: `.NewApplicationWithKey(t)` $DIR/core/web/evm_tx_attempts_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/evm_tx_attempts_controller_test.go: `.Get("/v2/tx_attempts?size=TrainingDay")` $DIR/core/web/evm_tx_attempts_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/external_initiators_controller_test.go: `t.Run(test.name, func(t *testing.T) { ctx := testutils.Context(t) var exr bridges.ExternalInitiatorRequest assert.NoError(t, json.Unmarshal([]byte(test.input), &exr)) result := web.ValidateExternalInitiator(ctx, &exr, orm) cltest.AssertError(t, test.wantError, result) })` $DIR/core/web/external_initiators_controller_test.go: `cltest.AssertError(t, test.wantError, result)` $DIR/core/web/external_initiators_controller_test.go: `c.JobPipeline.ExternalInitiatorsEnabled = ptr(true)` $DIR/core/web/external_initiators_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/external_initiators_controller_test.go: `cltest.AssertServerResponse(t, resp, http.StatusUnprocessableEntity)` $DIR/core/web/external_initiators_controller_test.go: `resp, cleanup = client.Get("/v2/external_initiators?size=1")` $DIR/core/web/external_initiators_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/external_initiators_controller_test.go: `cltest.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/external_initiators_controller_test.go: `err = web.ParsePaginatedResponse(body, &eis, &links)` $DIR/core/web/external_initiators_controller_test.go: `resp, cleanup = client.Get(links["next"].Href)` $DIR/core/web/external_initiators_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/external_initiators_controller_test.go: `cltest.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/external_initiators_controller_test.go: `eis = []presenters.ExternalInitiatorResource{}` $DIR/core/web/external_initiators_controller_test.go: `err = web.ParsePaginatedResponse(cltest.ParseResponseBody(t, resp), &eis, &links)` $DIR/core/web/external_initiators_controller_test.go: `c.JobPipeline.ExternalInitiatorsEnabled = ptr(true)` $DIR/core/web/external_initiators_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/external_initiators_controller_test.go: `cltest.AssertServerResponse(t, resp, http.StatusCreated)` $DIR/core/web/external_initiators_controller_test.go: `c.JobPipeline.ExternalInitiatorsEnabled = ptr(true)` $DIR/core/web/external_initiators_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/external_initiators_controller_test.go: `cltest.AssertServerResponse(t, resp, 201)` $DIR/core/web/external_initiators_controller_test.go: `c.JobPipeline.ExternalInitiatorsEnabled = ptr(true)` $DIR/core/web/external_initiators_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/external_initiators_controller_test.go: `c.JobPipeline.ExternalInitiatorsEnabled = ptr(true)` $DIR/core/web/external_initiators_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/external_initiators_controller_test.go: `c.JobPipeline.ExternalInitiatorsEnabled = ptr(true)` $DIR/core/web/external_initiators_controller_test.go: `t.Run(test.Name, func(t *testing.T) { resp, cleanup := client.Delete(test.URL) t.Cleanup(cleanup) assert.Equal(t, http.StatusText(http.StatusNotFound), http.StatusText(resp.StatusCode)) })` $DIR/core/web/external_initiators_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/external_initiators_controller_test.go: `.NewSqlxDB(t)` $DIR/core/web/external_initiators_controller_test.go: `.NewORM(db)` $DIR/core/web/external_initiators_controller_test.go: `.WebURL(t, "https://a.web.url")` $DIR/core/web/external_initiators_controller_test.go: `.Run(test.name, func(t *testing.T) { ctx := testutils.Context(t) var exr bridges.ExternalInitiatorRequest assert.NoError(t, json.Unmarshal([]byte(test.input), &exr)) result := web.ValidateExternalInitiator(ctx, &exr, orm) cltest.AssertError(t, test.wantError, result) })` $DIR/core/web/external_initiators_controller_test.go: `.Context(t)` $DIR/core/web/external_initiators_controller_test.go: `.ValidateExternalInitiator(ctx, &exr, orm)` $DIR/core/web/external_initiators_controller_test.go: `.AssertError(t, test.wantError, result)` $DIR/core/web/external_initiators_controller_test.go: `.NewApplicationWithConfig(t, configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.JobPipeline.ExternalInitiatorsEnabled = ptr(true) }))` $DIR/core/web/external_initiators_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.JobPipeline.ExternalInitiatorsEnabled = ptr(true) })` $DIR/core/web/external_initiators_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/external_initiators_controller_test.go: `.GetDB()` $DIR/core/web/external_initiators_controller_test.go: `.NewORM(db)` $DIR/core/web/external_initiators_controller_test.go: `.MustInsertExternalInitiatorWithOpts(t, borm, cltest.ExternalInitiatorOpts{ NamePrefix: "foo", URL: cltest.MustWebURL(t, "http://example.com/foo"), OutgoingToken: "outgoing_token", })` $DIR/core/web/external_initiators_controller_test.go: `.MustWebURL(t, "http://example.com/foo")` $DIR/core/web/external_initiators_controller_test.go: `.MustInsertExternalInitiatorWithOpts(t, borm, cltest.ExternalInitiatorOpts{NamePrefix: "bar"})` $DIR/core/web/external_initiators_controller_test.go: `.Get("/v2/external_initiators?size=x")` $DIR/core/web/external_initiators_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/external_initiators_controller_test.go: `.AssertServerResponse(t, resp, http.StatusUnprocessableEntity)` $DIR/core/web/external_initiators_controller_test.go: `.Get("/v2/external_initiators?size=1")` $DIR/core/web/external_initiators_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/external_initiators_controller_test.go: `.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/external_initiators_controller_test.go: `.ParseResponseBody(t, resp)` $DIR/core/web/external_initiators_controller_test.go: `.ParseJSONAPIResponseMetaCount(body)` $DIR/core/web/external_initiators_controller_test.go: `.ParsePaginatedResponse(body, &eis, &links)` $DIR/core/web/external_initiators_controller_test.go: `.Get(links["next"].Href)` $DIR/core/web/external_initiators_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/external_initiators_controller_test.go: `.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/external_initiators_controller_test.go: `.ParsePaginatedResponse(cltest.ParseResponseBody(t, resp), &eis, &links)` $DIR/core/web/external_initiators_controller_test.go: `.ParseResponseBody(t, resp)` $DIR/core/web/external_initiators_controller_test.go: `.NewApplicationWithConfig(t, configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.JobPipeline.ExternalInitiatorsEnabled = ptr(true) }))` $DIR/core/web/external_initiators_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.JobPipeline.ExternalInitiatorsEnabled = ptr(true) })` $DIR/core/web/external_initiators_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/external_initiators_controller_test.go: `.Post("/v2/external_initiators", bytes.NewBufferString(`{"name":"bitcoin","url":"http://without.a.name"}`), )` $DIR/core/web/external_initiators_controller_test.go: `.NewBufferString(`{"name":"bitcoin","url":"http://without.a.name"}`)` $DIR/core/web/external_initiators_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/external_initiators_controller_test.go: `.AssertServerResponse(t, resp, http.StatusCreated)` $DIR/core/web/external_initiators_controller_test.go: `.ParseJSONAPIResponse(t, resp, ei)` $DIR/core/web/external_initiators_controller_test.go: `.NewApplicationWithConfig(t, configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.JobPipeline.ExternalInitiatorsEnabled = ptr(true) }))` $DIR/core/web/external_initiators_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.JobPipeline.ExternalInitiatorsEnabled = ptr(true) })` $DIR/core/web/external_initiators_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/external_initiators_controller_test.go: `.Post("/v2/external_initiators", bytes.NewBufferString(`{"name":"no-url"}`), )` $DIR/core/web/external_initiators_controller_test.go: `.NewBufferString(`{"name":"no-url"}`)` $DIR/core/web/external_initiators_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/external_initiators_controller_test.go: `.AssertServerResponse(t, resp, 201)` $DIR/core/web/external_initiators_controller_test.go: `.ParseJSONAPIResponse(t, resp, ei)` $DIR/core/web/external_initiators_controller_test.go: `.NewApplicationWithConfig(t, configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.JobPipeline.ExternalInitiatorsEnabled = ptr(true) }))` $DIR/core/web/external_initiators_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.JobPipeline.ExternalInitiatorsEnabled = ptr(true) })` $DIR/core/web/external_initiators_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/external_initiators_controller_test.go: `.Post("/v2/external_initiators", bytes.NewBufferString(`{"url":"http://without.a.name"}`), )` $DIR/core/web/external_initiators_controller_test.go: `.NewBufferString(`{"url":"http://without.a.name"}`)` $DIR/core/web/external_initiators_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/external_initiators_controller_test.go: `.NewApplicationWithConfig(t, configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.JobPipeline.ExternalInitiatorsEnabled = ptr(true) }))` $DIR/core/web/external_initiators_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.JobPipeline.ExternalInitiatorsEnabled = ptr(true) })` $DIR/core/web/external_initiators_controller_test.go: `.BridgeORM()` $DIR/core/web/external_initiators_controller_test.go: `.CreateExternalInitiator(testutils.Context(t), &exi)` $DIR/core/web/external_initiators_controller_test.go: `.Context(t)` $DIR/core/web/external_initiators_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/external_initiators_controller_test.go: `.Delete("/v2/external_initiators/" + exi.Name)` $DIR/core/web/external_initiators_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/external_initiators_controller_test.go: `.NewApplicationWithConfig(t, configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.JobPipeline.ExternalInitiatorsEnabled = ptr(true) }))` $DIR/core/web/external_initiators_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.JobPipeline.ExternalInitiatorsEnabled = ptr(true) })` $DIR/core/web/external_initiators_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/external_initiators_controller_test.go: `.Run(test.Name, func(t *testing.T) { resp, cleanup := client.Delete(test.URL) t.Cleanup(cleanup) assert.Equal(t, http.StatusText(http.StatusNotFound), http.StatusText(resp.StatusCode)) })` $DIR/core/web/external_initiators_controller_test.go: `.Delete(test.URL)` $DIR/core/web/external_initiators_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/features_controller_test.go: `c.Feature.UICSAKeys = &csa` $DIR/core/web/features_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/features_controller_test.go: `.NewApplicationWithConfig(t, configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { csa := true c.Feature.UICSAKeys = &csa }))` $DIR/core/web/features_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { csa := true c.Feature.UICSAKeys = &csa })` $DIR/core/web/features_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/features_controller_test.go: `.Get("/v2/features")` $DIR/core/web/features_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/features_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, resp), &resources)` $DIR/core/web/features_controller_test.go: `.ParseResponseBody(t, resp)` $DIR/core/web/gui_assets_test.go: `t.Run(tc.name, func(t *testing.T) { t.Parallel() req, err := http.NewRequestWithContext(testutils.Context(t), "GET", app.Server.URL+tc.path, nil) require.NoError(t, err) resp, err := client.Do(req) require.NoError(t, err) cltest.AssertServerResponse(t, resp, http.StatusOK) })` $DIR/core/web/gui_assets_test.go: `cltest.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/gui_assets_test.go: `t.Run(tc.name, func(t *testing.T) { t.Parallel() req, err := http.NewRequestWithContext(testutils.Context(t), "GET", app.Server.URL+tc.path, nil) require.NoError(t, err) resp, err := client.Do(req) require.NoError(t, err) cltest.AssertServerResponse(t, resp, http.StatusNotFound) })` $DIR/core/web/gui_assets_test.go: `cltest.AssertServerResponse(t, resp, http.StatusNotFound)` $DIR/core/web/gui_assets_test.go: `cltest.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/gui_assets_test.go: `t.Run("it get exact assets if Accept-Encoding is not specified", func(t *testing.T) { recorder := httptest.NewRecorder() c, _ := gin.CreateTestContext(recorder) var err error c.Request, err = http.NewRequestWithContext(c, "GET", "http://localhost:6688/fixtures/operator_ui/assets/main.js", nil) require.NoError(t, err) handler(c) require.Equal(t, http.StatusOK, recorder.Result().StatusCode) recorder = httptest.NewRecorder() c, _ = gin.CreateTestContext(recorder) c.Request, err = http.NewRequestWithContext(c, "GET", "http://localhost:6688/fixtures/operator_ui/assets/kinda_main.js", nil) require.NoError(t, err) handler(c) require.Equal(t, http.StatusNotFound, recorder.Result().StatusCode) })` $DIR/core/web/gui_assets_test.go: `c.Request, err = http.NewRequestWithContext(c, "GET", "http://localhost:6688/fixtures/operator_ui/assets/main.js", nil)` $DIR/core/web/gui_assets_test.go: `handler(c)` $DIR/core/web/gui_assets_test.go: `recorder = httptest.NewRecorder()` $DIR/core/web/gui_assets_test.go: `c, _ = gin.CreateTestContext(recorder)` $DIR/core/web/gui_assets_test.go: `c.Request, err = http.NewRequestWithContext(c, "GET", "http://localhost:6688/fixtures/operator_ui/assets/kinda_main.js", nil)` $DIR/core/web/gui_assets_test.go: `handler(c)` $DIR/core/web/gui_assets_test.go: `c.Request, err = http.NewRequestWithContext(c, "GET", "http://localhost:6688/fixtures/operator_ui/assets/main.js", nil)` $DIR/core/web/gui_assets_test.go: `c.Request.Header.Set("Accept-Encoding", "gzip")` $DIR/core/web/gui_assets_test.go: `handler(c)` $DIR/core/web/gui_assets_test.go: `recorder = httptest.NewRecorder()` $DIR/core/web/gui_assets_test.go: `c, _ = gin.CreateTestContext(recorder)` $DIR/core/web/gui_assets_test.go: `c.Request, err = http.NewRequestWithContext(c, "GET", "http://localhost:6688/fixtures/operator_ui/assets/kinda_main.js", nil)` $DIR/core/web/gui_assets_test.go: `c.Request.Header.Set("Accept-Encoding", "gzip")` $DIR/core/web/gui_assets_test.go: `handler(c)` $DIR/core/web/gui_assets_test.go: `.NewApplication(t)` $DIR/core/web/gui_assets_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/web/gui_assets_test.go: `.Run(tc.name, func(t *testing.T) { t.Parallel() req, err := http.NewRequestWithContext(testutils.Context(t), "GET", app.Server.URL+tc.path, nil) require.NoError(t, err) resp, err := client.Do(req) require.NoError(t, err) cltest.AssertServerResponse(t, resp, http.StatusOK) })` $DIR/core/web/gui_assets_test.go: `.NewRequestWithContext(testutils.Context(t), "GET", app.Server.URL+tc.path, nil)` $DIR/core/web/gui_assets_test.go: `.Context(t)` $DIR/core/web/gui_assets_test.go: `.Do(req)` $DIR/core/web/gui_assets_test.go: `.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/gui_assets_test.go: `.NewApplication(t)` $DIR/core/web/gui_assets_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/web/gui_assets_test.go: `.Run(tc.name, func(t *testing.T) { t.Parallel() req, err := http.NewRequestWithContext(testutils.Context(t), "GET", app.Server.URL+tc.path, nil) require.NoError(t, err) resp, err := client.Do(req) require.NoError(t, err) cltest.AssertServerResponse(t, resp, http.StatusNotFound) })` $DIR/core/web/gui_assets_test.go: `.NewRequestWithContext(testutils.Context(t), "GET", app.Server.URL+tc.path, nil)` $DIR/core/web/gui_assets_test.go: `.Context(t)` $DIR/core/web/gui_assets_test.go: `.Do(req)` $DIR/core/web/gui_assets_test.go: `.AssertServerResponse(t, resp, http.StatusNotFound)` $DIR/core/web/gui_assets_test.go: `.NewGeneralConfig(t, nil)` $DIR/core/web/gui_assets_test.go: `.NewApplicationWithConfig(t, config)` $DIR/core/web/gui_assets_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/web/gui_assets_test.go: `.NewRequestWithContext(testutils.Context(t), "GET", app.Server.URL+"/", nil)` $DIR/core/web/gui_assets_test.go: `.Context(t)` $DIR/core/web/gui_assets_test.go: `.Do(req)` $DIR/core/web/gui_assets_test.go: `.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/gui_assets_test.go: `.NewRequestWithContext(testutils.Context(t), "GET", app.Server.URL+"/", nil)` $DIR/core/web/gui_assets_test.go: `.Context(t)` $DIR/core/web/gui_assets_test.go: `.Do(req)` $DIR/core/web/gui_assets_test.go: `.NewEmbedFileSystem(testFs, "fixtures/operator_ui")` $DIR/core/web/gui_assets_test.go: `.ServeGzippedAssets("/fixtures/operator_ui/", efs, logger.TestLogger(t))` $DIR/core/web/gui_assets_test.go: `.TestLogger(t)` $DIR/core/web/gui_assets_test.go: `.Run("it get exact assets if Accept-Encoding is not specified", func(t *testing.T) { recorder := httptest.NewRecorder() c, _ := gin.CreateTestContext(recorder) var err error c.Request, err = http.NewRequestWithContext(c, "GET", "http://localhost:6688/fixtures/operator_ui/assets/main.js", nil) require.NoError(t, err) handler(c) require.Equal(t, http.StatusOK, recorder.Result().StatusCode) recorder = httptest.NewRecorder() c, _ = gin.CreateTestContext(recorder) c.Request, err = http.NewRequestWithContext(c, "GET", "http://localhost:6688/fixtures/operator_ui/assets/kinda_main.js", nil) require.NoError(t, err) handler(c) require.Equal(t, http.StatusNotFound, recorder.Result().StatusCode) })` $DIR/core/web/gui_assets_test.go: `.NewRecorder()` $DIR/core/web/gui_assets_test.go: `.CreateTestContext(recorder)` $DIR/core/web/gui_assets_test.go: `.NewRequestWithContext(c, "GET", "http://localhost:6688/fixtures/operator_ui/assets/main.js", nil)` $DIR/core/web/gui_assets_test.go: `.NewRecorder()` $DIR/core/web/gui_assets_test.go: `.CreateTestContext(recorder)` $DIR/core/web/gui_assets_test.go: `.NewRequestWithContext(c, "GET", "http://localhost:6688/fixtures/operator_ui/assets/kinda_main.js", nil)` $DIR/core/web/gui_assets_test.go: `.NewRecorder()` $DIR/core/web/gui_assets_test.go: `.CreateTestContext(recorder)` $DIR/core/web/gui_assets_test.go: `.NewRequestWithContext(c, "GET", "http://localhost:6688/fixtures/operator_ui/assets/main.js", nil)` $DIR/core/web/gui_assets_test.go: `.Request.Header.Set("Accept-Encoding", "gzip")` $DIR/core/web/gui_assets_test.go: `.NewRecorder()` $DIR/core/web/gui_assets_test.go: `.CreateTestContext(recorder)` $DIR/core/web/gui_assets_test.go: `.NewRequestWithContext(c, "GET", "http://localhost:6688/fixtures/operator_ui/assets/kinda_main.js", nil)` $DIR/core/web/gui_assets_test.go: `.Request.Header.Set("Accept-Encoding", "gzip")` $DIR/core/web/health_controller_test.go: `t.Run(tc.name, func(t *testing.T) { app := cltest.NewApplicationWithKey(t) healthChecker := new(mocks.Checker) healthChecker.On("Start").Return(nil).Once() healthChecker.On("IsReady").Return(tc.ready, nil).Once() healthChecker.On("Close").Return(nil).Once() app.HealthChecker = healthChecker require.NoError(t, app.Start(testutils.Context(t))) client := app.NewHTTPClient(nil) resp, cleanup := client.Get("/readyz") t.Cleanup(cleanup) assert.Equal(t, tc.status, resp.StatusCode) })` $DIR/core/web/health_controller_test.go: `healthChecker.On("Start").Return(nil).Once()` $DIR/core/web/health_controller_test.go: `healthChecker.On("IsReady").Return(tc.ready, nil).Once()` $DIR/core/web/health_controller_test.go: `healthChecker.On("Close").Return(nil).Once()` $DIR/core/web/health_controller_test.go: `app.HealthChecker = healthChecker` $DIR/core/web/health_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/health_controller_test.go: `t.Run(tc.name, func(t *testing.T) { app := cltest.NewApplicationWithKey(t) healthChecker := new(mocks.Checker) healthChecker.On("Start").Return(nil).Once() healthChecker.On("IsHealthy").Return(tc.ready, nil).Once() healthChecker.On("Close").Return(nil).Once() app.HealthChecker = healthChecker require.NoError(t, app.Start(testutils.Context(t))) client := app.NewHTTPClient(nil) resp, cleanup := client.Get("/health") t.Cleanup(cleanup) assert.Equal(t, tc.status, resp.StatusCode) })` $DIR/core/web/health_controller_test.go: `healthChecker.On("Start").Return(nil).Once()` $DIR/core/web/health_controller_test.go: `healthChecker.On("IsHealthy").Return(tc.ready, nil).Once()` $DIR/core/web/health_controller_test.go: `healthChecker.On("Close").Return(nil).Once()` $DIR/core/web/health_controller_test.go: `app.HealthChecker = healthChecker` $DIR/core/web/health_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/health_controller_test.go: `t.Run(tc.name, func(t *testing.T) { app := cltest.NewApplicationWithKey(t) require.NoError(t, app.Start(testutils.Context(t))) client := app.NewHTTPClient(nil) resp, cleanup := client.Get(tc.path, tc.headers) t.Cleanup(cleanup) assert.Equal(t, http.StatusMultiStatus, resp.StatusCode) body, err := io.ReadAll(resp.Body) require.NoError(t, err) if tc.expBody == bodyJSON { // pretty print for comparison var b bytes.Buffer require.NoError(t, json.Indent(&b, body, "", " ")) body = b.Bytes() } assert.Equal(t, tc.expBody, string(body)) })` $DIR/core/web/health_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/health_controller_test.go: `body = b.Bytes()` $DIR/core/web/health_controller_test.go: `.Run(tc.name, func(t *testing.T) { app := cltest.NewApplicationWithKey(t) healthChecker := new(mocks.Checker) healthChecker.On("Start").Return(nil).Once() healthChecker.On("IsReady").Return(tc.ready, nil).Once() healthChecker.On("Close").Return(nil).Once() app.HealthChecker = healthChecker require.NoError(t, app.Start(testutils.Context(t))) client := app.NewHTTPClient(nil) resp, cleanup := client.Get("/readyz") t.Cleanup(cleanup) assert.Equal(t, tc.status, resp.StatusCode) })` $DIR/core/web/health_controller_test.go: `.NewApplicationWithKey(t)` $DIR/core/web/health_controller_test.go: `.On("Start")` $DIR/core/web/health_controller_test.go: `.Return(nil)` $DIR/core/web/health_controller_test.go: `.Once()` $DIR/core/web/health_controller_test.go: `.On("IsReady")` $DIR/core/web/health_controller_test.go: `.Return(tc.ready, nil)` $DIR/core/web/health_controller_test.go: `.Once()` $DIR/core/web/health_controller_test.go: `.On("Close")` $DIR/core/web/health_controller_test.go: `.Return(nil)` $DIR/core/web/health_controller_test.go: `.Once()` $DIR/core/web/health_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/health_controller_test.go: `.Get("/readyz")` $DIR/core/web/health_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/health_controller_test.go: `.Run(tc.name, func(t *testing.T) { app := cltest.NewApplicationWithKey(t) healthChecker := new(mocks.Checker) healthChecker.On("Start").Return(nil).Once() healthChecker.On("IsHealthy").Return(tc.ready, nil).Once() healthChecker.On("Close").Return(nil).Once() app.HealthChecker = healthChecker require.NoError(t, app.Start(testutils.Context(t))) client := app.NewHTTPClient(nil) resp, cleanup := client.Get("/health") t.Cleanup(cleanup) assert.Equal(t, tc.status, resp.StatusCode) })` $DIR/core/web/health_controller_test.go: `.NewApplicationWithKey(t)` $DIR/core/web/health_controller_test.go: `.On("Start")` $DIR/core/web/health_controller_test.go: `.Return(nil)` $DIR/core/web/health_controller_test.go: `.Once()` $DIR/core/web/health_controller_test.go: `.On("IsHealthy")` $DIR/core/web/health_controller_test.go: `.Return(tc.ready, nil)` $DIR/core/web/health_controller_test.go: `.Once()` $DIR/core/web/health_controller_test.go: `.On("Close")` $DIR/core/web/health_controller_test.go: `.Return(nil)` $DIR/core/web/health_controller_test.go: `.Once()` $DIR/core/web/health_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/health_controller_test.go: `.Get("/health")` $DIR/core/web/health_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/health_controller_test.go: `.Run(tc.name, func(t *testing.T) { app := cltest.NewApplicationWithKey(t) require.NoError(t, app.Start(testutils.Context(t))) client := app.NewHTTPClient(nil) resp, cleanup := client.Get(tc.path, tc.headers) t.Cleanup(cleanup) assert.Equal(t, http.StatusMultiStatus, resp.StatusCode) body, err := io.ReadAll(resp.Body) require.NoError(t, err) if tc.expBody == bodyJSON { // pretty print for comparison var b bytes.Buffer require.NoError(t, json.Indent(&b, body, "", " ")) body = b.Bytes() } assert.Equal(t, tc.expBody, string(body)) })` $DIR/core/web/health_controller_test.go: `.NewApplicationWithKey(t)` $DIR/core/web/health_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/health_controller_test.go: `.Get(tc.path, tc.headers)` $DIR/core/web/health_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/health_controller_test.go: `.ReadAll(resp.Body)` $DIR/core/web/health_controller_test.go: `.Bytes()` $DIR/core/web/health_template_test.go: `.String()` $DIR/core/web/health_template_test.go: `.String()` $DIR/core/web/jobs_controller_test.go: `t.Run(tc.name, func(t *testing.T) { ctx := testutils.Context(t) ta, client := setupJobsControllerTests(t) var address types.EIP55Address if tc.taExists { key, _ := cltest.MustInsertRandomKey(t, ta.KeyStore.Eth()) address = key.EIP55Address } else { address = cltest.NewEIP55Address() } require.NoError(t, ta.KeyStore.OCR().Add(ctx, cltest.DefaultOCRKey)) sp := cltest.MinimalOCRNonBootstrapSpec(contractAddress, address, tc.pid, tc.kb) body, _ := json.Marshal(web.CreateJobRequest{ TOML: sp, }) resp, cleanup := client.Post("/v2/jobs", bytes.NewReader(body)) t.Cleanup(cleanup) assert.Equal(t, http.StatusBadRequest, resp.StatusCode) b, err := io.ReadAll(resp.Body) require.NoError(t, err) assert.Contains(t, string(b), tc.expectedErr.Error()) })` $DIR/core/web/jobs_controller_test.go: `address = key.EIP55Address` $DIR/core/web/jobs_controller_test.go: `address = cltest.NewEIP55Address()` $DIR/core/web/jobs_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/jobs_controller_test.go: `wg.Add(1)` $DIR/core/web/jobs_controller_test.go: `wg.Wait()` $DIR/core/web/jobs_controller_test.go: `pks, err = app.KeyStore.VRF().GetAll()` $DIR/core/web/jobs_controller_test.go: `k, err = app.KeyStore.P2P().GetAll()` $DIR/core/web/jobs_controller_test.go: `t.Run(c.name, func(t *testing.T) { nameAndExternalJobID := uuid.New().String() toml := c.tomlTemplate(nameAndExternalJobID) body, err := json.Marshal(web.CreateJobRequest{ TOML: toml, }) require.NoError(t, err) response, cleanup := client.Post("/v2/jobs", bytes.NewReader(body)) defer cleanup() c.assertion(t, nameAndExternalJobID, response) })` $DIR/core/web/jobs_controller_test.go: `c.assertion(t, nameAndExternalJobID, response)` $DIR/core/web/jobs_controller_test.go: `_, err = jorm.FindJob(testutils.Context(t), mustInt32FromString(t, resource.ID))` $DIR/core/web/jobs_controller_test.go: `query.Set("evmChainID", cltest.FixtureChainID.String())` $DIR/core/web/jobs_controller_test.go: `url.RawQuery = query.Encode()` $DIR/core/web/jobs_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/jobs_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/jobs_controller_test.go: `runDirectRequestJobSpecAssertions(t, ereJobSpecFromFile, resources[0])` $DIR/core/web/jobs_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/jobs_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/jobs_controller_test.go: `runOCRJobSpecAssertions(t, ocrJobSpecFromFile, ocrJob)` $DIR/core/web/jobs_controller_test.go: `response, cleanup = client.Get("/v2/jobs/" + ocrJobSpecFromFile.ExternalJobID.String())` $DIR/core/web/jobs_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/jobs_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/jobs_controller_test.go: `ocrJob = presenters.JobResource{}` $DIR/core/web/jobs_controller_test.go: `err = web.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &ocrJob)` $DIR/core/web/jobs_controller_test.go: `runOCRJobSpecAssertions(t, ocrJobSpecFromFile, ocrJob)` $DIR/core/web/jobs_controller_test.go: `response, cleanup = client.Get("/v2/jobs/" + fmt.Sprintf("%v", jobID2))` $DIR/core/web/jobs_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/jobs_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/jobs_controller_test.go: `err = web.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &ereJob)` $DIR/core/web/jobs_controller_test.go: `runDirectRequestJobSpecAssertions(t, ereJobSpecFromFile, ereJob)` $DIR/core/web/jobs_controller_test.go: `response, cleanup = client.Get("/v2/jobs/" + ereJobSpecFromFile.ExternalJobID.String())` $DIR/core/web/jobs_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/jobs_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/jobs_controller_test.go: `ereJob = presenters.JobResource{}` $DIR/core/web/jobs_controller_test.go: `err = web.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &ereJob)` $DIR/core/web/jobs_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/jobs_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/jobs_controller_test.go: `c.OCR.Enabled = ptr(true)` $DIR/core/web/jobs_controller_test.go: `c.P2P.V2.Enabled = ptr(true)` $DIR/core/web/jobs_controller_test.go: `c.P2P.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", freeport.GetOne(t))}` $DIR/core/web/jobs_controller_test.go: `c.P2P.PeerID = &cltest.DefaultP2PPeerID` $DIR/core/web/jobs_controller_test.go: `err = toml.Unmarshal([]byte(ocrspec.Toml()), &ocrSpec)` $DIR/core/web/jobs_controller_test.go: `jb.OCROracleSpec = &ocrSpec` $DIR/core/web/jobs_controller_test.go: `jb.OCROracleSpec.TransmitterAddress = &app.Keys[0].EIP55Address` $DIR/core/web/jobs_controller_test.go: `err = app.AddJobV2(ctx, &jb)` $DIR/core/web/jobs_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/jobs_controller_test.go: `dbJb, err = app.JobORM().FindJob(ctx, jb.ID)` $DIR/core/web/jobs_controller_test.go: `c.OCR.Enabled = ptr(true)` $DIR/core/web/jobs_controller_test.go: `c.P2P.V2.Enabled = ptr(true)` $DIR/core/web/jobs_controller_test.go: `c.P2P.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", freeport.GetOne(t))}` $DIR/core/web/jobs_controller_test.go: `c.P2P.PeerID = &cltest.DefaultP2PPeerID` $DIR/core/web/jobs_controller_test.go: `err = toml.Unmarshal([]byte(ocrspec.Toml()), &ocrSpec)` $DIR/core/web/jobs_controller_test.go: `jb.OCROracleSpec = &ocrSpec` $DIR/core/web/jobs_controller_test.go: `jb.OCROracleSpec.TransmitterAddress = &app.Keys[0].EIP55Address` $DIR/core/web/jobs_controller_test.go: `err = app.AddJobV2(ctx, &jb)` $DIR/core/web/jobs_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/jobs_controller_test.go: `.NewEIP55Address()` $DIR/core/web/jobs_controller_test.go: `.Random32Byte()` $DIR/core/web/jobs_controller_test.go: `.PeerID(peerID)` $DIR/core/web/jobs_controller_test.go: `.EncodeToString(randomBytes[:])` $DIR/core/web/jobs_controller_test.go: `.PeerID(peerID)` $DIR/core/web/jobs_controller_test.go: `.Run(tc.name, func(t *testing.T) { ctx := testutils.Context(t) ta, client := setupJobsControllerTests(t) var address types.EIP55Address if tc.taExists { key, _ := cltest.MustInsertRandomKey(t, ta.KeyStore.Eth()) address = key.EIP55Address } else { address = cltest.NewEIP55Address() } require.NoError(t, ta.KeyStore.OCR().Add(ctx, cltest.DefaultOCRKey)) sp := cltest.MinimalOCRNonBootstrapSpec(contractAddress, address, tc.pid, tc.kb) body, _ := json.Marshal(web.CreateJobRequest{ TOML: sp, }) resp, cleanup := client.Post("/v2/jobs", bytes.NewReader(body)) t.Cleanup(cleanup) assert.Equal(t, http.StatusBadRequest, resp.StatusCode) b, err := io.ReadAll(resp.Body) require.NoError(t, err) assert.Contains(t, string(b), tc.expectedErr.Error()) })` $DIR/core/web/jobs_controller_test.go: `.Context(t)` $DIR/core/web/jobs_controller_test.go: `.MustInsertRandomKey(t, ta.KeyStore.Eth())` $DIR/core/web/jobs_controller_test.go: `.KeyStore.Eth()` $DIR/core/web/jobs_controller_test.go: `.NewEIP55Address()` $DIR/core/web/jobs_controller_test.go: `.MinimalOCRNonBootstrapSpec(contractAddress, address, tc.pid, tc.kb)` $DIR/core/web/jobs_controller_test.go: `.Marshal(web.CreateJobRequest{ TOML: sp, })` $DIR/core/web/jobs_controller_test.go: `.Post("/v2/jobs", bytes.NewReader(body))` $DIR/core/web/jobs_controller_test.go: `.NewReader(body)` $DIR/core/web/jobs_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/jobs_controller_test.go: `.ReadAll(resp.Body)` $DIR/core/web/jobs_controller_test.go: `.Context(t)` $DIR/core/web/jobs_controller_test.go: `.Add(1)` $DIR/core/web/jobs_controller_test.go: `.Done()` $DIR/core/web/jobs_controller_test.go: `.Marshal(web.CreateJobRequest{ TOML: fmt.Sprintf(testspecs.DirectRequestSpecNoExternalJobID, i), })` $DIR/core/web/jobs_controller_test.go: `.Sprintf(testspecs.DirectRequestSpecNoExternalJobID, i)` $DIR/core/web/jobs_controller_test.go: `.Post("/v2/jobs", bytes.NewReader(body))` $DIR/core/web/jobs_controller_test.go: `.NewReader(body)` $DIR/core/web/jobs_controller_test.go: `.Wait()` $DIR/core/web/jobs_controller_test.go: `.GetDB()` $DIR/core/web/jobs_controller_test.go: `.Context(t)` $DIR/core/web/jobs_controller_test.go: `.GetDB()` $DIR/core/web/jobs_controller_test.go: `.KeyStore.VRF()` $DIR/core/web/jobs_controller_test.go: `.GetAll()` $DIR/core/web/jobs_controller_test.go: `.KeyStore.P2P()` $DIR/core/web/jobs_controller_test.go: `.GetAll()` $DIR/core/web/jobs_controller_test.go: `.JobORM()` $DIR/core/web/jobs_controller_test.go: `.GenerateOCRSpec(testspecs.OCRSpecParams{ TransmitterAddress: app.Keys[0].Address.Hex(), DS1BridgeName: b1, DS2BridgeName: b2, Name: nameAndExternalJobID, })` $DIR/core/web/jobs_controller_test.go: `.Address.Hex()` $DIR/core/web/jobs_controller_test.go: `.Toml()` $DIR/core/web/jobs_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, r), &resource)` $DIR/core/web/jobs_controller_test.go: `.ParseResponseBody(t, r)` $DIR/core/web/jobs_controller_test.go: `.FindJob(testutils.Context(t), mustInt32FromString(t, resource.ID))` $DIR/core/web/jobs_controller_test.go: `.Context(t)` $DIR/core/web/jobs_controller_test.go: `.Sprintf(` type = "keeper" schemaVersion = 1 name = "%s" contractAddress = "0x9E40733cC9df84636505f4e6Db28DCa0dC5D1bba" fromAddress = "0xa8037A20989AFcBC51798de9762b351D63ff462e" evmChainID = 0 minIncomingConfigurations = 1 externalJobID = "%s" `, nameAndExternalJobID, nameAndExternalJobID)` $DIR/core/web/jobs_controller_test.go: `.ParseJSONAPIErrors(t, r.Body)` $DIR/core/web/jobs_controller_test.go: `.Context(t)` $DIR/core/web/jobs_controller_test.go: `.FindJobByExternalJobID(ctx, uuid.MustParse(nameAndExternalJobID))` $DIR/core/web/jobs_controller_test.go: `.MustParse(nameAndExternalJobID)` $DIR/core/web/jobs_controller_test.go: `.Sprintf(testspecs.CronSpecTemplate, nameAndExternalJobID)` $DIR/core/web/jobs_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, r), &resource)` $DIR/core/web/jobs_controller_test.go: `.ParseResponseBody(t, r)` $DIR/core/web/jobs_controller_test.go: `.FindJob(testutils.Context(t), mustInt32FromString(t, resource.ID))` $DIR/core/web/jobs_controller_test.go: `.Context(t)` $DIR/core/web/jobs_controller_test.go: `.Sprintf(testspecs.CronSpecDotSepTemplate, nameAndExternalJobID)` $DIR/core/web/jobs_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, r), &resource)` $DIR/core/web/jobs_controller_test.go: `.ParseResponseBody(t, r)` $DIR/core/web/jobs_controller_test.go: `.FindJob(testutils.Context(t), mustInt32FromString(t, resource.ID))` $DIR/core/web/jobs_controller_test.go: `.Context(t)` $DIR/core/web/jobs_controller_test.go: `.GetDirectRequestSpecWithUUID(uuid.MustParse(nameAndExternalJobID))` $DIR/core/web/jobs_controller_test.go: `.MustParse(nameAndExternalJobID)` $DIR/core/web/jobs_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, r), &resource)` $DIR/core/web/jobs_controller_test.go: `.ParseResponseBody(t, r)` $DIR/core/web/jobs_controller_test.go: `.FindJob(testutils.Context(t), mustInt32FromString(t, resource.ID))` $DIR/core/web/jobs_controller_test.go: `.Context(t)` $DIR/core/web/jobs_controller_test.go: `.Sprintf(testspecs.DirectRequestSpecWithRequestersAndMinContractPaymentTemplate, nameAndExternalJobID, nameAndExternalJobID)` $DIR/core/web/jobs_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, r), &resource)` $DIR/core/web/jobs_controller_test.go: `.ParseResponseBody(t, r)` $DIR/core/web/jobs_controller_test.go: `.FindJob(testutils.Context(t), mustInt32FromString(t, resource.ID))` $DIR/core/web/jobs_controller_test.go: `.Context(t)` $DIR/core/web/jobs_controller_test.go: `.Sprintf(testspecs.FluxMonitorSpecTemplate, nameAndExternalJobID, nameAndExternalJobID)` $DIR/core/web/jobs_controller_test.go: `.ParseJSONAPIErrors(t, r.Body)` $DIR/core/web/jobs_controller_test.go: `.Context(t)` $DIR/core/web/jobs_controller_test.go: `.FindJobByExternalJobID(ctx, uuid.MustParse(nameAndExternalJobID))` $DIR/core/web/jobs_controller_test.go: `.MustParse(nameAndExternalJobID)` $DIR/core/web/jobs_controller_test.go: `.GenerateVRFSpec(testspecs.VRFSpecParams{PublicKey: pks[0].PublicKey.String()})` $DIR/core/web/jobs_controller_test.go: `.PublicKey.String()` $DIR/core/web/jobs_controller_test.go: `.Toml()` $DIR/core/web/jobs_controller_test.go: `.ParseResponseBody(t, r)` $DIR/core/web/jobs_controller_test.go: `.ParseJSONAPIResponse(resp, &resource)` $DIR/core/web/jobs_controller_test.go: `.FindJob(testutils.Context(t), mustInt32FromString(t, resource.ID))` $DIR/core/web/jobs_controller_test.go: `.Context(t)` $DIR/core/web/jobs_controller_test.go: `.GenerateStreamSpec(testspecs.StreamSpecParams{Name: "ETH/USD", StreamID: 32})` $DIR/core/web/jobs_controller_test.go: `.Toml()` $DIR/core/web/jobs_controller_test.go: `.ParseResponseBody(t, r)` $DIR/core/web/jobs_controller_test.go: `.ParseJSONAPIResponse(resp, &resource)` $DIR/core/web/jobs_controller_test.go: `.FindJob(testutils.Context(t), mustInt32FromString(t, resource.ID))` $DIR/core/web/jobs_controller_test.go: `.Context(t)` $DIR/core/web/jobs_controller_test.go: `.GenerateWorkflowSpec(id, owner, name, workflow)` $DIR/core/web/jobs_controller_test.go: `.Toml()` $DIR/core/web/jobs_controller_test.go: `.ParseResponseBody(t, r)` $DIR/core/web/jobs_controller_test.go: `.ParseJSONAPIResponse(resp, &resource)` $DIR/core/web/jobs_controller_test.go: `.FindJob(testutils.Context(t), mustInt32FromString(t, resource.ID))` $DIR/core/web/jobs_controller_test.go: `.Context(t)` $DIR/core/web/jobs_controller_test.go: `.Run(c.name, func(t *testing.T) { nameAndExternalJobID := uuid.New().String() toml := c.tomlTemplate(nameAndExternalJobID) body, err := json.Marshal(web.CreateJobRequest{ TOML: toml, }) require.NoError(t, err) response, cleanup := client.Post("/v2/jobs", bytes.NewReader(body)) defer cleanup() c.assertion(t, nameAndExternalJobID, response) })` $DIR/core/web/jobs_controller_test.go: `.New()` $DIR/core/web/jobs_controller_test.go: `.String()` $DIR/core/web/jobs_controller_test.go: `.tomlTemplate(nameAndExternalJobID)` $DIR/core/web/jobs_controller_test.go: `.Marshal(web.CreateJobRequest{ TOML: toml, })` $DIR/core/web/jobs_controller_test.go: `.Post("/v2/jobs", bytes.NewReader(body))` $DIR/core/web/jobs_controller_test.go: `.NewReader(body)` $DIR/core/web/jobs_controller_test.go: `.assertion(t, nameAndExternalJobID, response)` $DIR/core/web/jobs_controller_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/jobs_controller_test.go: `.MustCreateBridge(t, app.GetDB(), cltest.BridgeOpts{})` $DIR/core/web/jobs_controller_test.go: `.GetDB()` $DIR/core/web/jobs_controller_test.go: `.MustCreateBridge(t, app.GetDB(), cltest.BridgeOpts{})` $DIR/core/web/jobs_controller_test.go: `.GetDB()` $DIR/core/web/jobs_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/jobs_controller_test.go: `.GetWebhookSpecNoBody(uuid.New(), fetchBridge.Name.String(), submitBridge.Name.String())` $DIR/core/web/jobs_controller_test.go: `.New()` $DIR/core/web/jobs_controller_test.go: `.Name.String()` $DIR/core/web/jobs_controller_test.go: `.Name.String()` $DIR/core/web/jobs_controller_test.go: `.Marshal(web.CreateJobRequest{ TOML: tomlStr, })` $DIR/core/web/jobs_controller_test.go: `.Post("/v2/jobs", bytes.NewReader(body))` $DIR/core/web/jobs_controller_test.go: `.NewReader(body)` $DIR/core/web/jobs_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &resource)` $DIR/core/web/jobs_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/jobs_controller_test.go: `.JobORM()` $DIR/core/web/jobs_controller_test.go: `.FindJob(testutils.Context(t), mustInt32FromString(t, resource.ID))` $DIR/core/web/jobs_controller_test.go: `.Context(t)` $DIR/core/web/jobs_controller_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/jobs_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/jobs_controller_test.go: `.New()` $DIR/core/web/jobs_controller_test.go: `.Sprintf(webhookSpecTemplate, nameAndExternalJobID, nameAndExternalJobID)` $DIR/core/web/jobs_controller_test.go: `.Marshal(web.CreateJobRequest{ TOML: spec, })` $DIR/core/web/jobs_controller_test.go: `.Post("/v2/jobs", bytes.NewReader(body))` $DIR/core/web/jobs_controller_test.go: `.NewReader(body)` $DIR/core/web/jobs_controller_test.go: `.ReadAll(response.Body)` $DIR/core/web/jobs_controller_test.go: `.Query()` $DIR/core/web/jobs_controller_test.go: `.Set("evmChainID", cltest.FixtureChainID.String())` $DIR/core/web/jobs_controller_test.go: `.FixtureChainID.String()` $DIR/core/web/jobs_controller_test.go: `.Encode()` $DIR/core/web/jobs_controller_test.go: `.Get(url.String())` $DIR/core/web/jobs_controller_test.go: `.String()` $DIR/core/web/jobs_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/jobs_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/jobs_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &resources)` $DIR/core/web/jobs_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/jobs_controller_test.go: `.Get("/v2/jobs/" + fmt.Sprintf("%v", jobID))` $DIR/core/web/jobs_controller_test.go: `.Sprintf("%v", jobID)` $DIR/core/web/jobs_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/jobs_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/jobs_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &ocrJob)` $DIR/core/web/jobs_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/jobs_controller_test.go: `.Get("/v2/jobs/" + ocrJobSpecFromFile.ExternalJobID.String())` $DIR/core/web/jobs_controller_test.go: `.ExternalJobID.String()` $DIR/core/web/jobs_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/jobs_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/jobs_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &ocrJob)` $DIR/core/web/jobs_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/jobs_controller_test.go: `.Get("/v2/jobs/" + fmt.Sprintf("%v", jobID2))` $DIR/core/web/jobs_controller_test.go: `.Sprintf("%v", jobID2)` $DIR/core/web/jobs_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/jobs_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/jobs_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &ereJob)` $DIR/core/web/jobs_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/jobs_controller_test.go: `.Get("/v2/jobs/" + ereJobSpecFromFile.ExternalJobID.String())` $DIR/core/web/jobs_controller_test.go: `.ExternalJobID.String()` $DIR/core/web/jobs_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/jobs_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/jobs_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &ereJob)` $DIR/core/web/jobs_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/jobs_controller_test.go: `.Get("/v2/jobs/uuidLikeString")` $DIR/core/web/jobs_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/jobs_controller_test.go: `.Get("/v2/jobs/999999999")` $DIR/core/web/jobs_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/jobs_controller_test.go: `.Context(t)` $DIR/core/web/jobs_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.OCR.Enabled = ptr(true) c.P2P.V2.Enabled = ptr(true) c.P2P.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", freeport.GetOne(t))} c.P2P.PeerID = &cltest.DefaultP2PPeerID })` $DIR/core/web/jobs_controller_test.go: `.Sprintf("127.0.0.1:%d", freeport.GetOne(t))` $DIR/core/web/jobs_controller_test.go: `.GetOne(t)` $DIR/core/web/jobs_controller_test.go: `.NewApplicationWithConfigAndKey(t, cfg, cltest.DefaultP2PKey)` $DIR/core/web/jobs_controller_test.go: `.MustCreateBridge(t, app.GetDB(), cltest.BridgeOpts{})` $DIR/core/web/jobs_controller_test.go: `.GetDB()` $DIR/core/web/jobs_controller_test.go: `.MustCreateBridge(t, app.GetDB(), cltest.BridgeOpts{})` $DIR/core/web/jobs_controller_test.go: `.GetDB()` $DIR/core/web/jobs_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/jobs_controller_test.go: `.GenerateOCRSpec(testspecs.OCRSpecParams{ DS1BridgeName: bridge.Name.String(), DS2BridgeName: bridge2.Name.String(), Name: "old OCR job", })` $DIR/core/web/jobs_controller_test.go: `.Name.String()` $DIR/core/web/jobs_controller_test.go: `.Name.String()` $DIR/core/web/jobs_controller_test.go: `.Unmarshal([]byte(ocrspec.Toml()), &jb)` $DIR/core/web/jobs_controller_test.go: `.Toml()` $DIR/core/web/jobs_controller_test.go: `.Unmarshal([]byte(ocrspec.Toml()), &ocrSpec)` $DIR/core/web/jobs_controller_test.go: `.Toml()` $DIR/core/web/jobs_controller_test.go: `.AddJobV2(ctx, &jb)` $DIR/core/web/jobs_controller_test.go: `.JobORM()` $DIR/core/web/jobs_controller_test.go: `.FindJob(ctx, jb.ID)` $DIR/core/web/jobs_controller_test.go: `.GenerateOCRSpec(testspecs.OCRSpecParams{ DS1BridgeName: bridge2.Name.String(), DS2BridgeName: bridge.Name.String(), Name: "updated OCR job", TransmitterAddress: app.Keys[0].Address.Hex(), })` $DIR/core/web/jobs_controller_test.go: `.Name.String()` $DIR/core/web/jobs_controller_test.go: `.Name.String()` $DIR/core/web/jobs_controller_test.go: `.Address.Hex()` $DIR/core/web/jobs_controller_test.go: `.Marshal(web.UpdateJobRequest{ TOML: updatedSpec.Toml(), })` $DIR/core/web/jobs_controller_test.go: `.Toml()` $DIR/core/web/jobs_controller_test.go: `.Put("/v2/jobs/"+fmt.Sprintf("%v", jb.ID), bytes.NewReader(body))` $DIR/core/web/jobs_controller_test.go: `.Sprintf("%v", jb.ID)` $DIR/core/web/jobs_controller_test.go: `.NewReader(body)` $DIR/core/web/jobs_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/jobs_controller_test.go: `.JobORM()` $DIR/core/web/jobs_controller_test.go: `.FindJob(ctx, jb.ID)` $DIR/core/web/jobs_controller_test.go: `.Context(t)` $DIR/core/web/jobs_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.OCR.Enabled = ptr(true) c.P2P.V2.Enabled = ptr(true) c.P2P.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", freeport.GetOne(t))} c.P2P.PeerID = &cltest.DefaultP2PPeerID })` $DIR/core/web/jobs_controller_test.go: `.Sprintf("127.0.0.1:%d", freeport.GetOne(t))` $DIR/core/web/jobs_controller_test.go: `.GetOne(t)` $DIR/core/web/jobs_controller_test.go: `.NewApplicationWithConfigAndKey(t, cfg, cltest.DefaultP2PKey)` $DIR/core/web/jobs_controller_test.go: `.MustCreateBridge(t, app.GetDB(), cltest.BridgeOpts{})` $DIR/core/web/jobs_controller_test.go: `.GetDB()` $DIR/core/web/jobs_controller_test.go: `.MustCreateBridge(t, app.GetDB(), cltest.BridgeOpts{})` $DIR/core/web/jobs_controller_test.go: `.GetDB()` $DIR/core/web/jobs_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/jobs_controller_test.go: `.GenerateOCRSpec(testspecs.OCRSpecParams{ DS1BridgeName: bridge.Name.String(), DS2BridgeName: bridge2.Name.String(), Name: "old OCR job", })` $DIR/core/web/jobs_controller_test.go: `.Name.String()` $DIR/core/web/jobs_controller_test.go: `.Name.String()` $DIR/core/web/jobs_controller_test.go: `.Unmarshal([]byte(ocrspec.Toml()), &jb)` $DIR/core/web/jobs_controller_test.go: `.Toml()` $DIR/core/web/jobs_controller_test.go: `.Unmarshal([]byte(ocrspec.Toml()), &ocrSpec)` $DIR/core/web/jobs_controller_test.go: `.Toml()` $DIR/core/web/jobs_controller_test.go: `.AddJobV2(ctx, &jb)` $DIR/core/web/jobs_controller_test.go: `.GenerateOCRSpec(testspecs.OCRSpecParams{ DS1BridgeName: bridge2.Name.String(), DS2BridgeName: bridge.Name.String(), Name: "updated OCR job", TransmitterAddress: app.Keys[0].EIP55Address.String(), })` $DIR/core/web/jobs_controller_test.go: `.Name.String()` $DIR/core/web/jobs_controller_test.go: `.Name.String()` $DIR/core/web/jobs_controller_test.go: `.EIP55Address.String()` $DIR/core/web/jobs_controller_test.go: `.Marshal(web.UpdateJobRequest{ TOML: updatedSpec.Toml(), })` $DIR/core/web/jobs_controller_test.go: `.Toml()` $DIR/core/web/jobs_controller_test.go: `.Put("/v2/jobs/99999", bytes.NewReader(body))` $DIR/core/web/jobs_controller_test.go: `.NewReader(body)` $DIR/core/web/jobs_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/lca_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/lca_controller_test.go: `.NewTestGeneralConfig(t)` $DIR/core/web/lca_controller_test.go: `.NewApplicationWithConfigAndKey(t, cfg, cltest.DefaultP2PKey, ec)` $DIR/core/web/lca_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/lca_controller_test.go: `.Get("/v2/find_lca?evmChainID=1")` $DIR/core/web/lca_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/lca_controller_test.go: `.ReadAll(resp.Body)` $DIR/core/web/loader/loader_test.go: `app.On("GetRelayers").Return(&chainlinkmocks.FakeRelayerChainInteroperators{Relayers: []loop.Relayer{ testutils2.MockRelayer{ChainStatus: commontypes.ChainStatus{ ID: "1", Enabled: true, Config: config1, }}, testutils2.MockRelayer{ChainStatus: commontypes.ChainStatus{ ID: "2", Enabled: true, Config: config2, }}, }})` $DIR/core/web/loader/loader_test.go: `app.On("GetRelayers").Return(rcInterops)` $DIR/core/web/loader/loader_test.go: `fsvc.On("ListManagersByIDs", mock.Anything, []int64{3, 1, 2, 5}).Return([]feeds.FeedsManager{ mgr1, mgr2, mgr3, }, nil)` $DIR/core/web/loader/loader_test.go: `app.On("GetFeedsService").Return(fsvc)` $DIR/core/web/loader/loader_test.go: `fsvc.On("ListJobProposalsByManagersIDs", mock.Anything, []int64{3, 1, 2}).Return([]feeds.JobProposal{ jp1, jp3, jp2, }, nil)` $DIR/core/web/loader/loader_test.go: `app.On("GetFeedsService").Return(fsvc)` $DIR/core/web/loader/loader_test.go: `jobsORM.On("FindPipelineRunsByIDs", mock.Anything, []int64{3, 1, 2}).Return([]pipeline.Run{ run3, run1, run2, }, nil)` $DIR/core/web/loader/loader_test.go: `app.On("JobORM").Return(jobsORM)` $DIR/core/web/loader/loader_test.go: `t.Run("with out errors", func(t *testing.T) { t.Parallel() jobsORM := jobORMMocks.NewORM(t) app := coremocks.NewApplication(t) ctx := InjectDataloader(testutils.Context(t), app) job1 := job.Job{ID: int32(2), PipelineSpecID: int32(1)} job2 := job.Job{ID: int32(3), PipelineSpecID: int32(2)} job3 := job.Job{ID: int32(4), PipelineSpecID: int32(3)} jobsORM.On("FindJobsByPipelineSpecIDs", mock.Anything, []int32{3, 1, 2}).Return([]job.Job{ job1, job2, job3, }, nil) app.On("JobORM").Return(jobsORM) batcher := jobBatcher{app} keys := dataloader.NewKeysFromStrings([]string{"3", "1", "2"}) found := batcher.loadByPipelineSpecIDs(ctx, keys) require.Len(t, found, 3) assert.Equal(t, job3, found[0].Data) assert.Equal(t, job1, found[1].Data) assert.Equal(t, job2, found[2].Data) })` $DIR/core/web/loader/loader_test.go: `jobsORM.On("FindJobsByPipelineSpecIDs", mock.Anything, []int32{3, 1, 2}).Return([]job.Job{ job1, job2, job3, }, nil)` $DIR/core/web/loader/loader_test.go: `app.On("JobORM").Return(jobsORM)` $DIR/core/web/loader/loader_test.go: `jobsORM.On("FindJobsByPipelineSpecIDs", mock.Anything, []int32{3, 1, 2}).Return([]job.Job{}, sql.ErrNoRows)` $DIR/core/web/loader/loader_test.go: `app.On("JobORM").Return(jobsORM)` $DIR/core/web/loader/loader_test.go: `jobsORM.On("FindJobByExternalJobID", mock.Anything, ejID).Return(job, nil)` $DIR/core/web/loader/loader_test.go: `app.On("JobORM").Return(jobsORM)` $DIR/core/web/loader/loader_test.go: `txStore.On("FindTxAttemptConfirmedByTxIDs", ctx, []int64{ethTxIDs[2], ethTxIDs[1], ethTxIDs[0]}).Return([]txmgr.TxAttempt{ attempt1, attempt2, }, nil)` $DIR/core/web/loader/loader_test.go: `app.On("TxmStorageService").Return(txStore)` $DIR/core/web/loader/loader_test.go: `t.Run("without errors", func(t *testing.T) { t.Parallel() jobsORM := jobORMMocks.NewORM(t) app := coremocks.NewApplication(t) ctx := InjectDataloader(testutils.Context(t), app) specErr1 := job.SpecError{ID: int64(2), JobID: int32(1)} specErr2 := job.SpecError{ID: int64(3), JobID: int32(2)} specErr3 := job.SpecError{ID: int64(4), JobID: int32(3)} jobsORM.On("FindSpecErrorsByJobIDs", mock.Anything, []int32{3, 1, 2}, mock.Anything).Return([]job.SpecError{ specErr1, specErr2, specErr3, }, nil) app.On("JobORM").Return(jobsORM) batcher := jobSpecErrorsBatcher{app} keys := dataloader.NewKeysFromStrings([]string{"3", "1", "2"}) found := batcher.loadByJobIDs(ctx, keys) require.Len(t, found, 3) assert.Equal(t, []job.SpecError{specErr3}, found[0].Data) assert.Equal(t, []job.SpecError{specErr1}, found[1].Data) assert.Equal(t, []job.SpecError{specErr2}, found[2].Data) })` $DIR/core/web/loader/loader_test.go: `jobsORM.On("FindSpecErrorsByJobIDs", mock.Anything, []int32{3, 1, 2}, mock.Anything).Return([]job.SpecError{ specErr1, specErr2, specErr3, }, nil)` $DIR/core/web/loader/loader_test.go: `app.On("JobORM").Return(jobsORM)` $DIR/core/web/loader/loader_test.go: `jobsORM.On("FindSpecErrorsByJobIDs", mock.Anything, []int32{3, 1, 2}, mock.Anything).Return([]job.SpecError{}, sql.ErrNoRows)` $DIR/core/web/loader/loader_test.go: `app.On("JobORM").Return(jobsORM)` $DIR/core/web/loader/loader_test.go: `txStore.On("FindTxAttemptConfirmedByTxIDs", ctx, []int64{ethTxID}).Return([]txmgr.TxAttempt{ attempt1, }, nil)` $DIR/core/web/loader/loader_test.go: `app.On("TxmStorageService").Return(txStore)` $DIR/core/web/loader/loader_test.go: `.NewApplication(t)` $DIR/core/web/loader/loader_test.go: `.Context(t)` $DIR/core/web/loader/loader_test.go: `.NewI(1)` $DIR/core/web/loader/loader_test.go: `.Defaults(one)` $DIR/core/web/loader/loader_test.go: `.NewI(2)` $DIR/core/web/loader/loader_test.go: `.Defaults(two)` $DIR/core/web/loader/loader_test.go: `.TOMLString()` $DIR/core/web/loader/loader_test.go: `.TOMLString()` $DIR/core/web/loader/loader_test.go: `.On("GetRelayers")` $DIR/core/web/loader/loader_test.go: `.Return(&chainlinkmocks.FakeRelayerChainInteroperators{Relayers: []loop.Relayer{ testutils2.MockRelayer{ChainStatus: commontypes.ChainStatus{ ID: "1", Enabled: true, Config: config1, }}, testutils2.MockRelayer{ChainStatus: commontypes.ChainStatus{ ID: "2", Enabled: true, Config: config2, }}, }})` $DIR/core/web/loader/loader_test.go: `.NewKeysFromStrings([]string{"2", "1", "3"})` $DIR/core/web/loader/loader_test.go: `.loadByIDs(ctx, keys)` $DIR/core/web/loader/loader_test.go: `.NewApplication(t)` $DIR/core/web/loader/loader_test.go: `.Context(t)` $DIR/core/web/loader/loader_test.go: `.NewInt(1)` $DIR/core/web/loader/loader_test.go: `.NewInt(2)` $DIR/core/web/loader/loader_test.go: `.NewInt(3)` $DIR/core/web/loader/loader_test.go: `.String()` $DIR/core/web/loader/loader_test.go: `.String()` $DIR/core/web/loader/loader_test.go: `.On("GetRelayers")` $DIR/core/web/loader/loader_test.go: `.Return(rcInterops)` $DIR/core/web/loader/loader_test.go: `.NewKeysFromStrings([]string{chainID2.String(), chainID1.String(), notAnID.String()})` $DIR/core/web/loader/loader_test.go: `.String()` $DIR/core/web/loader/loader_test.go: `.String()` $DIR/core/web/loader/loader_test.go: `.String()` $DIR/core/web/loader/loader_test.go: `.loadByChainIDs(ctx, keys)` $DIR/core/web/loader/loader_test.go: `.NewService(t)` $DIR/core/web/loader/loader_test.go: `.NewApplication(t)` $DIR/core/web/loader/loader_test.go: `.Context(t)` $DIR/core/web/loader/loader_test.go: `.On("ListManagersByIDs", mock.Anything, []int64{3, 1, 2, 5})` $DIR/core/web/loader/loader_test.go: `.Return([]feeds.FeedsManager{ mgr1, mgr2, mgr3, }, nil)` $DIR/core/web/loader/loader_test.go: `.On("GetFeedsService")` $DIR/core/web/loader/loader_test.go: `.Return(fsvc)` $DIR/core/web/loader/loader_test.go: `.NewKeysFromStrings([]string{"3", "1", "2", "5"})` $DIR/core/web/loader/loader_test.go: `.loadByIDs(ctx, keys)` $DIR/core/web/loader/loader_test.go: `.NewService(t)` $DIR/core/web/loader/loader_test.go: `.NewApplication(t)` $DIR/core/web/loader/loader_test.go: `.Context(t)` $DIR/core/web/loader/loader_test.go: `.On("ListJobProposalsByManagersIDs", mock.Anything, []int64{3, 1, 2})` $DIR/core/web/loader/loader_test.go: `.Return([]feeds.JobProposal{ jp1, jp3, jp2, }, nil)` $DIR/core/web/loader/loader_test.go: `.On("GetFeedsService")` $DIR/core/web/loader/loader_test.go: `.Return(fsvc)` $DIR/core/web/loader/loader_test.go: `.NewKeysFromStrings([]string{"3", "1", "2"})` $DIR/core/web/loader/loader_test.go: `.loadByManagersIDs(ctx, keys)` $DIR/core/web/loader/loader_test.go: `.NewORM(t)` $DIR/core/web/loader/loader_test.go: `.NewApplication(t)` $DIR/core/web/loader/loader_test.go: `.Context(t)` $DIR/core/web/loader/loader_test.go: `.On("FindPipelineRunsByIDs", mock.Anything, []int64{3, 1, 2})` $DIR/core/web/loader/loader_test.go: `.Return([]pipeline.Run{ run3, run1, run2, }, nil)` $DIR/core/web/loader/loader_test.go: `.On("JobORM")` $DIR/core/web/loader/loader_test.go: `.Return(jobsORM)` $DIR/core/web/loader/loader_test.go: `.NewKeysFromStrings([]string{"3", "1", "2"})` $DIR/core/web/loader/loader_test.go: `.loadByIDs(ctx, keys)` $DIR/core/web/loader/loader_test.go: `.Run("with out errors", func(t *testing.T) { t.Parallel() jobsORM := jobORMMocks.NewORM(t) app := coremocks.NewApplication(t) ctx := InjectDataloader(testutils.Context(t), app) job1 := job.Job{ID: int32(2), PipelineSpecID: int32(1)} job2 := job.Job{ID: int32(3), PipelineSpecID: int32(2)} job3 := job.Job{ID: int32(4), PipelineSpecID: int32(3)} jobsORM.On("FindJobsByPipelineSpecIDs", mock.Anything, []int32{3, 1, 2}).Return([]job.Job{ job1, job2, job3, }, nil) app.On("JobORM").Return(jobsORM) batcher := jobBatcher{app} keys := dataloader.NewKeysFromStrings([]string{"3", "1", "2"}) found := batcher.loadByPipelineSpecIDs(ctx, keys) require.Len(t, found, 3) assert.Equal(t, job3, found[0].Data) assert.Equal(t, job1, found[1].Data) assert.Equal(t, job2, found[2].Data) })` $DIR/core/web/loader/loader_test.go: `.NewORM(t)` $DIR/core/web/loader/loader_test.go: `.NewApplication(t)` $DIR/core/web/loader/loader_test.go: `.Context(t)` $DIR/core/web/loader/loader_test.go: `.On("FindJobsByPipelineSpecIDs", mock.Anything, []int32{3, 1, 2})` $DIR/core/web/loader/loader_test.go: `.Return([]job.Job{ job1, job2, job3, }, nil)` $DIR/core/web/loader/loader_test.go: `.On("JobORM")` $DIR/core/web/loader/loader_test.go: `.Return(jobsORM)` $DIR/core/web/loader/loader_test.go: `.NewKeysFromStrings([]string{"3", "1", "2"})` $DIR/core/web/loader/loader_test.go: `.loadByPipelineSpecIDs(ctx, keys)` $DIR/core/web/loader/loader_test.go: `.NewORM(t)` $DIR/core/web/loader/loader_test.go: `.NewApplication(t)` $DIR/core/web/loader/loader_test.go: `.Context(t)` $DIR/core/web/loader/loader_test.go: `.On("FindJobsByPipelineSpecIDs", mock.Anything, []int32{3, 1, 2})` $DIR/core/web/loader/loader_test.go: `.Return([]job.Job{}, sql.ErrNoRows)` $DIR/core/web/loader/loader_test.go: `.On("JobORM")` $DIR/core/web/loader/loader_test.go: `.Return(jobsORM)` $DIR/core/web/loader/loader_test.go: `.NewKeysFromStrings([]string{"3", "1", "2"})` $DIR/core/web/loader/loader_test.go: `.loadByPipelineSpecIDs(ctx, keys)` $DIR/core/web/loader/loader_test.go: `.NewORM(t)` $DIR/core/web/loader/loader_test.go: `.NewApplication(t)` $DIR/core/web/loader/loader_test.go: `.Context(t)` $DIR/core/web/loader/loader_test.go: `.New()` $DIR/core/web/loader/loader_test.go: `.On("FindJobByExternalJobID", mock.Anything, ejID)` $DIR/core/web/loader/loader_test.go: `.Return(job, nil)` $DIR/core/web/loader/loader_test.go: `.On("JobORM")` $DIR/core/web/loader/loader_test.go: `.Return(jobsORM)` $DIR/core/web/loader/loader_test.go: `.NewKeysFromStrings([]string{ejID.String()})` $DIR/core/web/loader/loader_test.go: `.String()` $DIR/core/web/loader/loader_test.go: `.loadByExternalJobIDs(ctx, keys)` $DIR/core/web/loader/loader_test.go: `.NewEvmTxStore(t)` $DIR/core/web/loader/loader_test.go: `.NewApplication(t)` $DIR/core/web/loader/loader_test.go: `.Context(t)` $DIR/core/web/loader/loader_test.go: `.On("FindTxAttemptConfirmedByTxIDs", ctx, []int64{ethTxIDs[2], ethTxIDs[1], ethTxIDs[0]})` $DIR/core/web/loader/loader_test.go: `.Return([]txmgr.TxAttempt{ attempt1, attempt2, }, nil)` $DIR/core/web/loader/loader_test.go: `.On("TxmStorageService")` $DIR/core/web/loader/loader_test.go: `.Return(txStore)` $DIR/core/web/loader/loader_test.go: `.NewKeysFromStrings([]string{"3", "2", "1"})` $DIR/core/web/loader/loader_test.go: `.loadByEthTransactionIDs(ctx, keys)` $DIR/core/web/loader/loader_test.go: `.Run("without errors", func(t *testing.T) { t.Parallel() jobsORM := jobORMMocks.NewORM(t) app := coremocks.NewApplication(t) ctx := InjectDataloader(testutils.Context(t), app) specErr1 := job.SpecError{ID: int64(2), JobID: int32(1)} specErr2 := job.SpecError{ID: int64(3), JobID: int32(2)} specErr3 := job.SpecError{ID: int64(4), JobID: int32(3)} jobsORM.On("FindSpecErrorsByJobIDs", mock.Anything, []int32{3, 1, 2}, mock.Anything).Return([]job.SpecError{ specErr1, specErr2, specErr3, }, nil) app.On("JobORM").Return(jobsORM) batcher := jobSpecErrorsBatcher{app} keys := dataloader.NewKeysFromStrings([]string{"3", "1", "2"}) found := batcher.loadByJobIDs(ctx, keys) require.Len(t, found, 3) assert.Equal(t, []job.SpecError{specErr3}, found[0].Data) assert.Equal(t, []job.SpecError{specErr1}, found[1].Data) assert.Equal(t, []job.SpecError{specErr2}, found[2].Data) })` $DIR/core/web/loader/loader_test.go: `.NewORM(t)` $DIR/core/web/loader/loader_test.go: `.NewApplication(t)` $DIR/core/web/loader/loader_test.go: `.Context(t)` $DIR/core/web/loader/loader_test.go: `.On("FindSpecErrorsByJobIDs", mock.Anything, []int32{3, 1, 2}, mock.Anything)` $DIR/core/web/loader/loader_test.go: `.Return([]job.SpecError{ specErr1, specErr2, specErr3, }, nil)` $DIR/core/web/loader/loader_test.go: `.On("JobORM")` $DIR/core/web/loader/loader_test.go: `.Return(jobsORM)` $DIR/core/web/loader/loader_test.go: `.NewKeysFromStrings([]string{"3", "1", "2"})` $DIR/core/web/loader/loader_test.go: `.loadByJobIDs(ctx, keys)` $DIR/core/web/loader/loader_test.go: `.NewORM(t)` $DIR/core/web/loader/loader_test.go: `.NewApplication(t)` $DIR/core/web/loader/loader_test.go: `.Context(t)` $DIR/core/web/loader/loader_test.go: `.On("FindSpecErrorsByJobIDs", mock.Anything, []int32{3, 1, 2}, mock.Anything)` $DIR/core/web/loader/loader_test.go: `.Return([]job.SpecError{}, sql.ErrNoRows)` $DIR/core/web/loader/loader_test.go: `.On("JobORM")` $DIR/core/web/loader/loader_test.go: `.Return(jobsORM)` $DIR/core/web/loader/loader_test.go: `.NewKeysFromStrings([]string{"3", "1", "2"})` $DIR/core/web/loader/loader_test.go: `.loadByJobIDs(ctx, keys)` $DIR/core/web/loader/loader_test.go: `.NewEvmTxStore(t)` $DIR/core/web/loader/loader_test.go: `.NewApplication(t)` $DIR/core/web/loader/loader_test.go: `.Context(t)` $DIR/core/web/loader/loader_test.go: `.NewHash()` $DIR/core/web/loader/loader_test.go: `.DbReceiptToEvmReceipt(&receipt)` $DIR/core/web/loader/loader_test.go: `.On("FindTxAttemptConfirmedByTxIDs", ctx, []int64{ethTxID})` $DIR/core/web/loader/loader_test.go: `.Return([]txmgr.TxAttempt{ attempt1, }, nil)` $DIR/core/web/loader/loader_test.go: `.On("TxmStorageService")` $DIR/core/web/loader/loader_test.go: `.Return(txStore)` $DIR/core/web/loader/loader_test.go: `.NewKeysFromStrings([]string{"3"})` $DIR/core/web/loader/loader_test.go: `.loadByEthTransactionIDs(ctx, keys)` $DIR/core/web/log_controller_test.go: `c.Log.Level = ptr(toml.LogLevel(zapcore.WarnLevel))` $DIR/core/web/log_controller_test.go: `c.Database.LogQueries = ptr(true)` $DIR/core/web/log_controller_test.go: `t.Cleanup(clean)` $DIR/core/web/log_controller_test.go: `cltest.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/log_controller_test.go: `t.Run(tc.Description, func(t *testing.T) { app := cltest.NewApplicationEVMDisabled(t) require.NoError(t, app.Start(testutils.Context(t))) client := app.NewHTTPClient(nil) request := web.LogPatchRequest{Level: tc.logLevel, SqlEnabled: tc.logSql} requestData, _ := json.Marshal(request) buf := bytes.NewBuffer(requestData) resp, cleanup := client.Patch("/v2/log", buf) defer cleanup() svcLogConfig := presenters.ServiceLogConfigResource{} if tc.expectedErrorCode != 0 { cltest.AssertServerResponse(t, resp, tc.expectedErrorCode) } else { cltest.AssertServerResponse(t, resp, http.StatusOK) require.NoError(t, cltest.ParseJSONAPIResponse(t, resp, &svcLogConfig)) for i, svcName := range svcLogConfig.ServiceName { if svcName == "Global" { assert.Equal(t, tc.expectedLogLevel.String(), svcLogConfig.LogLevel[i]) } if svcName == "IsSqlEnabled" { assert.Equal(t, strconv.FormatBool(tc.expectedLogSQL), svcLogConfig.LogLevel[i]) } } } })` $DIR/core/web/log_controller_test.go: `cltest.AssertServerResponse(t, resp, tc.expectedErrorCode)` $DIR/core/web/log_controller_test.go: `cltest.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/log_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Log.Level = ptr(toml.LogLevel(zapcore.WarnLevel)) c.Database.LogQueries = ptr(true) })` $DIR/core/web/log_controller_test.go: `.LogLevel(zapcore.WarnLevel)` $DIR/core/web/log_controller_test.go: `.NewApplicationWithConfig(t, cfg)` $DIR/core/web/log_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/log_controller_test.go: `.Get("/v2/log")` $DIR/core/web/log_controller_test.go: `.Cleanup(clean)` $DIR/core/web/log_controller_test.go: `.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/log_controller_test.go: `.Run(tc.Description, func(t *testing.T) { app := cltest.NewApplicationEVMDisabled(t) require.NoError(t, app.Start(testutils.Context(t))) client := app.NewHTTPClient(nil) request := web.LogPatchRequest{Level: tc.logLevel, SqlEnabled: tc.logSql} requestData, _ := json.Marshal(request) buf := bytes.NewBuffer(requestData) resp, cleanup := client.Patch("/v2/log", buf) defer cleanup() svcLogConfig := presenters.ServiceLogConfigResource{} if tc.expectedErrorCode != 0 { cltest.AssertServerResponse(t, resp, tc.expectedErrorCode) } else { cltest.AssertServerResponse(t, resp, http.StatusOK) require.NoError(t, cltest.ParseJSONAPIResponse(t, resp, &svcLogConfig)) for i, svcName := range svcLogConfig.ServiceName { if svcName == "Global" { assert.Equal(t, tc.expectedLogLevel.String(), svcLogConfig.LogLevel[i]) } if svcName == "IsSqlEnabled" { assert.Equal(t, strconv.FormatBool(tc.expectedLogSQL), svcLogConfig.LogLevel[i]) } } } })` $DIR/core/web/log_controller_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/log_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/log_controller_test.go: `.Marshal(request)` $DIR/core/web/log_controller_test.go: `.NewBuffer(requestData)` $DIR/core/web/log_controller_test.go: `.Patch("/v2/log", buf)` $DIR/core/web/log_controller_test.go: `.AssertServerResponse(t, resp, tc.expectedErrorCode)` $DIR/core/web/log_controller_test.go: `.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/loop_registry_internal_test.go: `s.discoveryHandler(rw, &http.Request{})` $DIR/core/web/loop_registry_internal_test.go: `s.discoveryHandler(rw, &http.Request{})` $DIR/core/web/loop_registry_internal_test.go: `.TestLoggerObserved(t, zap.ErrorLevel)` $DIR/core/web/loop_registry_internal_test.go: `.NewLoopRegistry(l, nil)` $DIR/core/web/loop_registry_internal_test.go: `.discoveryHandler(rw, &http.Request{})` $DIR/core/web/loop_registry_internal_test.go: `.FilterMessageSnippet("could not write to response")` $DIR/core/web/loop_registry_internal_test.go: `.Len()` $DIR/core/web/loop_registry_internal_test.go: `.TestLoggerObserved(t, zap.ErrorLevel)` $DIR/core/web/loop_registry_internal_test.go: `.NewLoopRegistry(l, nil)` $DIR/core/web/loop_registry_internal_test.go: `.New("can't unmarshal")` $DIR/core/web/loop_registry_internal_test.go: `.discoveryHandler(rw, &http.Request{})` $DIR/core/web/loop_registry_internal_test.go: `.FilterMessageSnippet("could not write to response")` $DIR/core/web/loop_registry_internal_test.go: `.Len()` $DIR/core/web/loop_registry_test.go: `c.OCR.Enabled = ptr(true)` $DIR/core/web/loop_registry_test.go: `c.P2P.V2.Enabled = ptr(true)` $DIR/core/web/loop_registry_test.go: `c.P2P.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", freeport.GetOne(t))}` $DIR/core/web/loop_registry_test.go: `c.P2P.PeerID = &cltest.DefaultP2PPeerID` $DIR/core/web/loop_registry_test.go: `configurePromRegistry()` $DIR/core/web/loop_registry_test.go: `mockLoop.start()` $DIR/core/web/loop_registry_test.go: `mockLoop.run()` $DIR/core/web/loop_registry_test.go: `t.Run("discovery endpoint", func(t *testing.T) { // under the covers this is routing thru the app into loop registry resp, cleanup := client.Get("/discovery") t.Cleanup(cleanup) cltest.AssertServerResponse(t, resp, http.StatusOK) b, err := io.ReadAll(resp.Body) require.NoError(t, err) t.Logf("discovery response %s", b) var got []*targetgroup.Group require.NoError(t, json.Unmarshal(b, &got)) gotLabels := make([]model.LabelSet, 0) for _, ls := range got { gotLabels = append(gotLabels, ls.Labels) } assert.Equal(t, len(expectedLabels), len(gotLabels)) for i := range expectedLabels { assert.EqualValues(t, expectedLabels[i], gotLabels[i]) } })` $DIR/core/web/loop_registry_test.go: `t.Cleanup(cleanup)` $DIR/core/web/loop_registry_test.go: `cltest.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/loop_registry_test.go: `gotLabels = append(gotLabels, ls.Labels)` $DIR/core/web/loop_registry_test.go: `t.Run("plugin metrics OK", func(t *testing.T) { // plugin name `mockLoopImpl` matches key in PluginConfigs resp, cleanup := client.Get(expectedLooppEndPoint) t.Cleanup(cleanup) cltest.AssertServerResponse(t, resp, http.StatusOK) b, err := io.ReadAll(resp.Body) require.NoError(t, err) t.Logf("plugin metrics response %s", b) var ( exceptedCount = 1 expectedMetric = fmt.Sprintf("%s %d", testMetricName, exceptedCount) ) require.Contains(t, string(b), expectedMetric) })` $DIR/core/web/loop_registry_test.go: `t.Cleanup(cleanup)` $DIR/core/web/loop_registry_test.go: `cltest.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/loop_registry_test.go: `t.Run("core metrics OK", func(t *testing.T) { // core node metrics endpoint resp, cleanup := client.Get(expectedCoreEndPoint) t.Cleanup(cleanup) cltest.AssertServerResponse(t, resp, http.StatusOK) b, err := io.ReadAll(resp.Body) require.NoError(t, err) t.Logf("core metrics response %s", b) })` $DIR/core/web/loop_registry_test.go: `t.Cleanup(cleanup)` $DIR/core/web/loop_registry_test.go: `cltest.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/loop_registry_test.go: `t.Cleanup(cleanup)` $DIR/core/web/loop_registry_test.go: `cltest.AssertServerResponse(t, resp, http.StatusNotFound)` $DIR/core/web/loop_registry_test.go: `.Context(t)` $DIR/core/web/loop_registry_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.OCR.Enabled = ptr(true) c.P2P.V2.Enabled = ptr(true) c.P2P.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", freeport.GetOne(t))} c.P2P.PeerID = &cltest.DefaultP2PPeerID })` $DIR/core/web/loop_registry_test.go: `.Sprintf("127.0.0.1:%d", freeport.GetOne(t))` $DIR/core/web/loop_registry_test.go: `.GetOne(t)` $DIR/core/web/loop_registry_test.go: `.NewApplicationWithConfigAndKey(t, cfg, cltest.DefaultP2PKey)` $DIR/core/web/loop_registry_test.go: `.LabelValue(expectedCoreEndPoint)` $DIR/core/web/loop_registry_test.go: `.LabelValue(expectedLooppEndPoint)` $DIR/core/web/loop_registry_test.go: `.GetLoopRegistry()` $DIR/core/web/loop_registry_test.go: `.Register("mockLoopImpl")` $DIR/core/web/loop_registry_test.go: `.start()` $DIR/core/web/loop_registry_test.go: `.close()` $DIR/core/web/loop_registry_test.go: `.run()` $DIR/core/web/loop_registry_test.go: `.NewHTTPClient(nil)` $DIR/core/web/loop_registry_test.go: `.Run("discovery endpoint", func(t *testing.T) { // under the covers this is routing thru the app into loop registry resp, cleanup := client.Get("/discovery") t.Cleanup(cleanup) cltest.AssertServerResponse(t, resp, http.StatusOK) b, err := io.ReadAll(resp.Body) require.NoError(t, err) t.Logf("discovery response %s", b) var got []*targetgroup.Group require.NoError(t, json.Unmarshal(b, &got)) gotLabels := make([]model.LabelSet, 0) for _, ls := range got { gotLabels = append(gotLabels, ls.Labels) } assert.Equal(t, len(expectedLabels), len(gotLabels)) for i := range expectedLabels { assert.EqualValues(t, expectedLabels[i], gotLabels[i]) } })` $DIR/core/web/loop_registry_test.go: `.Get("/discovery")` $DIR/core/web/loop_registry_test.go: `.Cleanup(cleanup)` $DIR/core/web/loop_registry_test.go: `.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/loop_registry_test.go: `.ReadAll(resp.Body)` $DIR/core/web/loop_registry_test.go: `.Run("plugin metrics OK", func(t *testing.T) { // plugin name `mockLoopImpl` matches key in PluginConfigs resp, cleanup := client.Get(expectedLooppEndPoint) t.Cleanup(cleanup) cltest.AssertServerResponse(t, resp, http.StatusOK) b, err := io.ReadAll(resp.Body) require.NoError(t, err) t.Logf("plugin metrics response %s", b) var ( exceptedCount = 1 expectedMetric = fmt.Sprintf("%s %d", testMetricName, exceptedCount) ) require.Contains(t, string(b), expectedMetric) })` $DIR/core/web/loop_registry_test.go: `.Get(expectedLooppEndPoint)` $DIR/core/web/loop_registry_test.go: `.Cleanup(cleanup)` $DIR/core/web/loop_registry_test.go: `.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/loop_registry_test.go: `.ReadAll(resp.Body)` $DIR/core/web/loop_registry_test.go: `.Sprintf("%s %d", testMetricName, exceptedCount)` $DIR/core/web/loop_registry_test.go: `.Run("core metrics OK", func(t *testing.T) { // core node metrics endpoint resp, cleanup := client.Get(expectedCoreEndPoint) t.Cleanup(cleanup) cltest.AssertServerResponse(t, resp, http.StatusOK) b, err := io.ReadAll(resp.Body) require.NoError(t, err) t.Logf("core metrics response %s", b) })` $DIR/core/web/loop_registry_test.go: `.Get(expectedCoreEndPoint)` $DIR/core/web/loop_registry_test.go: `.Cleanup(cleanup)` $DIR/core/web/loop_registry_test.go: `.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/loop_registry_test.go: `.ReadAll(resp.Body)` $DIR/core/web/loop_registry_test.go: `.Get("/plugins/noexist/metrics")` $DIR/core/web/loop_registry_test.go: `.Cleanup(cleanup)` $DIR/core/web/loop_registry_test.go: `.AssertServerResponse(t, resp, http.StatusNotFound)` $DIR/core/web/ocr2_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/ocr2_keys_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/ocr2_keys_controller_test.go: `t.Run(test.name, func(tt *testing.T) { keys, _ := OCRKeyStore.GetAll() initialLength := len(keys) response, cleanup := client.Post(fmt.Sprintf("/v2/keys/ocr2/%s", test.chainType), nil) t.Cleanup(cleanup) cltest.AssertServerResponse(t, response, http.StatusOK) keys, _ = OCRKeyStore.GetAll() require.Len(t, keys, initialLength+1) resource := presenters.OCR2KeysBundleResource{} err := web.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &resource) assert.NoError(t, err) var ids []string for _, key := range keys { ids = append(ids, key.ID()) } require.Contains(t, ids, resource.ID) _, err = OCRKeyStore.Get(resource.ID) require.NoError(t, err) })` $DIR/core/web/ocr2_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/ocr2_keys_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/ocr2_keys_controller_test.go: `keys, _ = OCRKeyStore.GetAll()` $DIR/core/web/ocr2_keys_controller_test.go: `ids = append(ids, key.ID())` $DIR/core/web/ocr2_keys_controller_test.go: `_, err = OCRKeyStore.Get(resource.ID)` $DIR/core/web/ocr2_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/ocr2_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/ocr2_keys_controller_test.go: `keys, _ = OCRKeyStore.GetAll()` $DIR/core/web/ocr2_keys_controller_test.go: `.GetAll()` $DIR/core/web/ocr2_keys_controller_test.go: `.Get("/v2/keys/ocr2")` $DIR/core/web/ocr2_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/ocr2_keys_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/ocr2_keys_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &resources)` $DIR/core/web/ocr2_keys_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/ocr2_keys_controller_test.go: `.ID()` $DIR/core/web/ocr2_keys_controller_test.go: `.Run(test.name, func(tt *testing.T) { keys, _ := OCRKeyStore.GetAll() initialLength := len(keys) response, cleanup := client.Post(fmt.Sprintf("/v2/keys/ocr2/%s", test.chainType), nil) t.Cleanup(cleanup) cltest.AssertServerResponse(t, response, http.StatusOK) keys, _ = OCRKeyStore.GetAll() require.Len(t, keys, initialLength+1) resource := presenters.OCR2KeysBundleResource{} err := web.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &resource) assert.NoError(t, err) var ids []string for _, key := range keys { ids = append(ids, key.ID()) } require.Contains(t, ids, resource.ID) _, err = OCRKeyStore.Get(resource.ID) require.NoError(t, err) })` $DIR/core/web/ocr2_keys_controller_test.go: `.GetAll()` $DIR/core/web/ocr2_keys_controller_test.go: `.Post(fmt.Sprintf("/v2/keys/ocr2/%s", test.chainType), nil)` $DIR/core/web/ocr2_keys_controller_test.go: `.Sprintf("/v2/keys/ocr2/%s", test.chainType)` $DIR/core/web/ocr2_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/ocr2_keys_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/ocr2_keys_controller_test.go: `.GetAll()` $DIR/core/web/ocr2_keys_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &resource)` $DIR/core/web/ocr2_keys_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/ocr2_keys_controller_test.go: `.ID()` $DIR/core/web/ocr2_keys_controller_test.go: `.Get(resource.ID)` $DIR/core/web/ocr2_keys_controller_test.go: `.Delete("/v2/keys/ocr2/" + nonExistentOCRKeyID)` $DIR/core/web/ocr2_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/ocr2_keys_controller_test.go: `.Context(t)` $DIR/core/web/ocr2_keys_controller_test.go: `.GetAll()` $DIR/core/web/ocr2_keys_controller_test.go: `.Create(ctx, "evm")` $DIR/core/web/ocr2_keys_controller_test.go: `.Delete("/v2/keys/ocr2/" + key.ID())` $DIR/core/web/ocr2_keys_controller_test.go: `.ID()` $DIR/core/web/ocr2_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/ocr2_keys_controller_test.go: `.GetAll()` $DIR/core/web/ocr_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/ocr_keys_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/ocr_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/ocr_keys_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/ocr_keys_controller_test.go: `keys, _ = OCRKeyStore.GetAll()` $DIR/core/web/ocr_keys_controller_test.go: `ids = append(ids, key.ID())` $DIR/core/web/ocr_keys_controller_test.go: `_, err = OCRKeyStore.Get(resource.ID)` $DIR/core/web/ocr_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/ocr_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/ocr_keys_controller_test.go: `keys, _ = OCRKeyStore.GetAll()` $DIR/core/web/ocr_keys_controller_test.go: `.GetAll()` $DIR/core/web/ocr_keys_controller_test.go: `.Get("/v2/keys/ocr")` $DIR/core/web/ocr_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/ocr_keys_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/ocr_keys_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &resources)` $DIR/core/web/ocr_keys_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/ocr_keys_controller_test.go: `.ID()` $DIR/core/web/ocr_keys_controller_test.go: `.GetAll()` $DIR/core/web/ocr_keys_controller_test.go: `.Post("/v2/keys/ocr", nil)` $DIR/core/web/ocr_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/ocr_keys_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/ocr_keys_controller_test.go: `.GetAll()` $DIR/core/web/ocr_keys_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &resource)` $DIR/core/web/ocr_keys_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/ocr_keys_controller_test.go: `.ID()` $DIR/core/web/ocr_keys_controller_test.go: `.Get(resource.ID)` $DIR/core/web/ocr_keys_controller_test.go: `.Delete("/v2/keys/ocr/" + nonExistentOCRKeyID)` $DIR/core/web/ocr_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/ocr_keys_controller_test.go: `.Context(t)` $DIR/core/web/ocr_keys_controller_test.go: `.GetAll()` $DIR/core/web/ocr_keys_controller_test.go: `.Create(ctx)` $DIR/core/web/ocr_keys_controller_test.go: `.Delete("/v2/keys/ocr/" + key.ID())` $DIR/core/web/ocr_keys_controller_test.go: `.ID()` $DIR/core/web/ocr_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/ocr_keys_controller_test.go: `.GetAll()` $DIR/core/web/p2p_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/p2p_keys_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/p2p_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/p2p_keys_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/p2p_keys_controller_test.go: `_, err = keyStore.P2P().Get(peerID)` $DIR/core/web/p2p_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/p2p_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/p2p_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/p2p_keys_controller_test.go: `keys, _ = keyStore.P2P().GetAll()` $DIR/core/web/p2p_keys_controller_test.go: `.P2P()` $DIR/core/web/p2p_keys_controller_test.go: `.GetAll()` $DIR/core/web/p2p_keys_controller_test.go: `.Get("/v2/keys/p2p")` $DIR/core/web/p2p_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/p2p_keys_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/p2p_keys_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &resources)` $DIR/core/web/p2p_keys_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/p2p_keys_controller_test.go: `.PeerID()` $DIR/core/web/p2p_keys_controller_test.go: `.String()` $DIR/core/web/p2p_keys_controller_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/p2p_keys_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/p2p_keys_controller_test.go: `.GetKeyStore()` $DIR/core/web/p2p_keys_controller_test.go: `.Post("/v2/keys/p2p", nil)` $DIR/core/web/p2p_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/p2p_keys_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/p2p_keys_controller_test.go: `.P2P()` $DIR/core/web/p2p_keys_controller_test.go: `.GetAll()` $DIR/core/web/p2p_keys_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &resource)` $DIR/core/web/p2p_keys_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/p2p_keys_controller_test.go: `.P2P()` $DIR/core/web/p2p_keys_controller_test.go: `.Get(peerID)` $DIR/core/web/p2p_keys_controller_test.go: `.Delete("/v2/keys/p2p/" + nonExistentP2PKeyID)` $DIR/core/web/p2p_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/p2p_keys_controller_test.go: `.Delete("/v2/keys/p2p/" + nonExistentP2PKeyID)` $DIR/core/web/p2p_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/p2p_keys_controller_test.go: `.Context(t)` $DIR/core/web/p2p_keys_controller_test.go: `.P2P()` $DIR/core/web/p2p_keys_controller_test.go: `.GetAll()` $DIR/core/web/p2p_keys_controller_test.go: `.P2P()` $DIR/core/web/p2p_keys_controller_test.go: `.Create(ctx)` $DIR/core/web/p2p_keys_controller_test.go: `.Delete(fmt.Sprintf("/v2/keys/p2p/%s", key.ID()))` $DIR/core/web/p2p_keys_controller_test.go: `.Sprintf("/v2/keys/p2p/%s", key.ID())` $DIR/core/web/p2p_keys_controller_test.go: `.ID()` $DIR/core/web/p2p_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/p2p_keys_controller_test.go: `.P2P()` $DIR/core/web/p2p_keys_controller_test.go: `.GetAll()` $DIR/core/web/ping_controller_test.go: `cltest.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/ping_controller_test.go: `err = app.BridgeORM().CreateExternalInitiator(ctx, ei)` $DIR/core/web/ping_controller_test.go: `request.Header.Set("Content-Type", web.MediaType)` $DIR/core/web/ping_controller_test.go: `request.Header.Set("X-Chainlink-EA-AccessKey", eia.AccessKey)` $DIR/core/web/ping_controller_test.go: `request.Header.Set("X-Chainlink-EA-Secret", eia.Secret)` $DIR/core/web/ping_controller_test.go: `cltest.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/ping_controller_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/ping_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/ping_controller_test.go: `.Get("/v2/ping")` $DIR/core/web/ping_controller_test.go: `.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/ping_controller_test.go: `.ParseResponseBody(t, resp)` $DIR/core/web/ping_controller_test.go: `.TrimSpace(body)` $DIR/core/web/ping_controller_test.go: `.Context(t)` $DIR/core/web/ping_controller_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/ping_controller_test.go: `.WebURL(t, "http://localhost:8888")` $DIR/core/web/ping_controller_test.go: `.New()` $DIR/core/web/ping_controller_test.go: `.String()` $DIR/core/web/ping_controller_test.go: `.NewExternalInitiator(eia, eir)` $DIR/core/web/ping_controller_test.go: `.BridgeORM()` $DIR/core/web/ping_controller_test.go: `.CreateExternalInitiator(ctx, ei)` $DIR/core/web/ping_controller_test.go: `.NewRequestWithContext(ctx, "GET", url, nil)` $DIR/core/web/ping_controller_test.go: `.Header.Set("Content-Type", web.MediaType)` $DIR/core/web/ping_controller_test.go: `.Header.Set("X-Chainlink-EA-AccessKey", eia.AccessKey)` $DIR/core/web/ping_controller_test.go: `.Header.Set("X-Chainlink-EA-Secret", eia.Secret)` $DIR/core/web/ping_controller_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/web/ping_controller_test.go: `.Do(request)` $DIR/core/web/ping_controller_test.go: `.AssertServerResponse(t, resp, http.StatusOK)` $DIR/core/web/ping_controller_test.go: `.ParseResponseBody(t, resp)` $DIR/core/web/ping_controller_test.go: `.TrimSpace(body)` $DIR/core/web/ping_controller_test.go: `.Context(t)` $DIR/core/web/ping_controller_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/ping_controller_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/web/ping_controller_test.go: `.NewRequestWithContext(ctx, "GET", url, nil)` $DIR/core/web/ping_controller_test.go: `.Do(req)` $DIR/core/web/pipeline_job_spec_errors_controller_test.go: `id = jse.ID` $DIR/core/web/pipeline_job_spec_errors_controller_test.go: `cltest.AssertServerResponse(t, resp, http.StatusNoContent)` $DIR/core/web/pipeline_job_spec_errors_controller_test.go: `j, err = app.JobORM().FindJob(testutils.Context(t), j.ID)` $DIR/core/web/pipeline_job_spec_errors_controller_test.go: `.Context(t)` $DIR/core/web/pipeline_job_spec_errors_controller_test.go: `.JobORM()` $DIR/core/web/pipeline_job_spec_errors_controller_test.go: `.FindJob(testutils.Context(t), jID)` $DIR/core/web/pipeline_job_spec_errors_controller_test.go: `.Context(t)` $DIR/core/web/pipeline_job_spec_errors_controller_test.go: `.Delete(fmt.Sprintf("/v2/pipeline/job_spec_errors/%v", id))` $DIR/core/web/pipeline_job_spec_errors_controller_test.go: `.Sprintf("/v2/pipeline/job_spec_errors/%v", id)` $DIR/core/web/pipeline_job_spec_errors_controller_test.go: `.AssertServerResponse(t, resp, http.StatusNoContent)` $DIR/core/web/pipeline_job_spec_errors_controller_test.go: `.JobORM()` $DIR/core/web/pipeline_job_spec_errors_controller_test.go: `.FindJob(testutils.Context(t), j.ID)` $DIR/core/web/pipeline_job_spec_errors_controller_test.go: `.Context(t)` $DIR/core/web/pipeline_job_spec_errors_controller_test.go: `.Delete("/v2/pipeline/job_spec_errors/1")` $DIR/core/web/pipeline_runs_controller_test.go: `c.JobPipeline.HTTPRequest.DefaultTimeout = commonconfig.MustNewDuration(2 * time.Second)` $DIR/core/web/pipeline_runs_controller_test.go: `c.Database.Listener.FallbackPollInterval = commonconfig.MustNewDuration(10 * time.Millisecond)` $DIR/core/web/pipeline_runs_controller_test.go: `err = app.AddJobV2(testutils.Context(t), &jb)` $DIR/core/web/pipeline_runs_controller_test.go: `time.Sleep(3 * time.Second)` $DIR/core/web/pipeline_runs_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/pipeline_runs_controller_test.go: `c.JobPipeline.HTTPRequest.DefaultTimeout = commonconfig.MustNewDuration(2 * time.Second)` $DIR/core/web/pipeline_runs_controller_test.go: `c.Database.Listener.FallbackPollInterval = commonconfig.MustNewDuration(10 * time.Millisecond)` $DIR/core/web/pipeline_runs_controller_test.go: `err = app.AddJobV2(testutils.Context(t), &jb)` $DIR/core/web/pipeline_runs_controller_test.go: `time.Sleep(3 * time.Second)` $DIR/core/web/pipeline_runs_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/pipeline_runs_controller_test.go: `query.Set("evmChainID", cltest.FixtureChainID.String())` $DIR/core/web/pipeline_runs_controller_test.go: `url.RawQuery = query.Encode()` $DIR/core/web/pipeline_runs_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/pipeline_runs_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/pipeline_runs_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/pipeline_runs_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/pipeline_runs_controller_test.go: `.Context(t)` $DIR/core/web/pipeline_runs_controller_test.go: `.NewEthMocksWithStartupAssertions(t)` $DIR/core/web/pipeline_runs_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.JobPipeline.HTTPRequest.DefaultTimeout = commonconfig.MustNewDuration(2 * time.Second) c.Database.Listener.FallbackPollInterval = commonconfig.MustNewDuration(10 * time.Millisecond) })` $DIR/core/web/pipeline_runs_controller_test.go: `.MustNewDuration(2 * time.Second)` $DIR/core/web/pipeline_runs_controller_test.go: `.MustNewDuration(10 * time.Millisecond)` $DIR/core/web/pipeline_runs_controller_test.go: `.NewApplicationWithConfig(t, cfg, ethClient)` $DIR/core/web/pipeline_runs_controller_test.go: `.NewHTTPMockServerWithRequest(t, 200, `{}`, func(r *http.Request) { defer r.Body.Close() bs, err := io.ReadAll(r.Body) require.NoError(t, err) require.Equal(t, `{"result":"12345"}`, string(bs)) })` $DIR/core/web/pipeline_runs_controller_test.go: `.ReadAll(r.Body)` $DIR/core/web/pipeline_runs_controller_test.go: `.MustCreateBridge(t, app.GetDB(), cltest.BridgeOpts{URL: mockServer.URL})` $DIR/core/web/pipeline_runs_controller_test.go: `.GetDB()` $DIR/core/web/pipeline_runs_controller_test.go: `.New()` $DIR/core/web/pipeline_runs_controller_test.go: `.Sprintf(testspecs.WebhookSpecWithBodyTemplate, uuid, bridge.Name.String())` $DIR/core/web/pipeline_runs_controller_test.go: `.Name.String()` $DIR/core/web/pipeline_runs_controller_test.go: `.ValidatedWebhookSpec(ctx, tomlStr, app.GetExternalInitiatorManager())` $DIR/core/web/pipeline_runs_controller_test.go: `.GetExternalInitiatorManager()` $DIR/core/web/pipeline_runs_controller_test.go: `.AddJobV2(testutils.Context(t), &jb)` $DIR/core/web/pipeline_runs_controller_test.go: `.Context(t)` $DIR/core/web/pipeline_runs_controller_test.go: `.Sleep(3 * time.Second)` $DIR/core/web/pipeline_runs_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/pipeline_runs_controller_test.go: `.NewReader(`{"data":{"result":"123.45"}}`)` $DIR/core/web/pipeline_runs_controller_test.go: `.Post("/v2/jobs/"+uuid.String()+"/runs", body)` $DIR/core/web/pipeline_runs_controller_test.go: `.String()` $DIR/core/web/pipeline_runs_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/pipeline_runs_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &parsedResponse)` $DIR/core/web/pipeline_runs_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/pipeline_runs_controller_test.go: `.Context(t)` $DIR/core/web/pipeline_runs_controller_test.go: `.NewEthMocksWithStartupAssertions(t)` $DIR/core/web/pipeline_runs_controller_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.JobPipeline.HTTPRequest.DefaultTimeout = commonconfig.MustNewDuration(2 * time.Second) c.Database.Listener.FallbackPollInterval = commonconfig.MustNewDuration(10 * time.Millisecond) })` $DIR/core/web/pipeline_runs_controller_test.go: `.MustNewDuration(2 * time.Second)` $DIR/core/web/pipeline_runs_controller_test.go: `.MustNewDuration(10 * time.Millisecond)` $DIR/core/web/pipeline_runs_controller_test.go: `.NewApplicationWithConfig(t, cfg, ethClient)` $DIR/core/web/pipeline_runs_controller_test.go: `.NewHTTPMockServer(t, 200, "POST", `{"data":{"result":"123.45"}}`)` $DIR/core/web/pipeline_runs_controller_test.go: `.MustCreateBridge(t, app.GetDB(), cltest.BridgeOpts{URL: mockServer.URL})` $DIR/core/web/pipeline_runs_controller_test.go: `.GetDB()` $DIR/core/web/pipeline_runs_controller_test.go: `.NewHTTPMockServerWithRequest(t, 200, `{}`, func(r *http.Request) { defer r.Body.Close() bs, err := io.ReadAll(r.Body) require.NoError(t, err) require.Equal(t, `{"result":"12345"}`, string(bs)) })` $DIR/core/web/pipeline_runs_controller_test.go: `.ReadAll(r.Body)` $DIR/core/web/pipeline_runs_controller_test.go: `.MustCreateBridge(t, app.GetDB(), cltest.BridgeOpts{URL: mockServer.URL})` $DIR/core/web/pipeline_runs_controller_test.go: `.GetDB()` $DIR/core/web/pipeline_runs_controller_test.go: `.New()` $DIR/core/web/pipeline_runs_controller_test.go: `.GetWebhookSpecNoBody(uuid, bridge.Name.String(), submitBridge.Name.String())` $DIR/core/web/pipeline_runs_controller_test.go: `.Name.String()` $DIR/core/web/pipeline_runs_controller_test.go: `.Name.String()` $DIR/core/web/pipeline_runs_controller_test.go: `.ValidatedWebhookSpec(ctx, tomlStr, app.GetExternalInitiatorManager())` $DIR/core/web/pipeline_runs_controller_test.go: `.GetExternalInitiatorManager()` $DIR/core/web/pipeline_runs_controller_test.go: `.AddJobV2(testutils.Context(t), &jb)` $DIR/core/web/pipeline_runs_controller_test.go: `.Context(t)` $DIR/core/web/pipeline_runs_controller_test.go: `.Sleep(3 * time.Second)` $DIR/core/web/pipeline_runs_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/pipeline_runs_controller_test.go: `.Post("/v2/jobs/"+uuid.String()+"/runs", nil)` $DIR/core/web/pipeline_runs_controller_test.go: `.String()` $DIR/core/web/pipeline_runs_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/pipeline_runs_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &parsedResponse)` $DIR/core/web/pipeline_runs_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/pipeline_runs_controller_test.go: `.MarshalIndent(parsedResponse, "", " ")` $DIR/core/web/pipeline_runs_controller_test.go: `.Query()` $DIR/core/web/pipeline_runs_controller_test.go: `.Set("evmChainID", cltest.FixtureChainID.String())` $DIR/core/web/pipeline_runs_controller_test.go: `.FixtureChainID.String()` $DIR/core/web/pipeline_runs_controller_test.go: `.Encode()` $DIR/core/web/pipeline_runs_controller_test.go: `.Get(url.String())` $DIR/core/web/pipeline_runs_controller_test.go: `.String()` $DIR/core/web/pipeline_runs_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/pipeline_runs_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/pipeline_runs_controller_test.go: `.ParseJSONAPIResponse(responseBytes, &parsedResponse)` $DIR/core/web/pipeline_runs_controller_test.go: `.Get("/v2/jobs/" + fmt.Sprintf("%v", jobID) + "/runs")` $DIR/core/web/pipeline_runs_controller_test.go: `.Sprintf("%v", jobID)` $DIR/core/web/pipeline_runs_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/pipeline_runs_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/pipeline_runs_controller_test.go: `.ParseJSONAPIResponse(responseBytes, &parsedResponse)` $DIR/core/web/pipeline_runs_controller_test.go: `.Get("/v2/jobs/" + fmt.Sprintf("%v", jobID) + "/runs?page=1&size=1")` $DIR/core/web/pipeline_runs_controller_test.go: `.Sprintf("%v", jobID)` $DIR/core/web/pipeline_runs_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/pipeline_runs_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/pipeline_runs_controller_test.go: `.ParseJSONAPIResponse(responseBytes, &parsedResponse)` $DIR/core/web/pipeline_runs_controller_test.go: `.Get("/v2/jobs/" + fmt.Sprintf("%v", jobID) + "/runs/" + fmt.Sprintf("%v", runIDs[0]))` $DIR/core/web/pipeline_runs_controller_test.go: `.Sprintf("%v", jobID)` $DIR/core/web/pipeline_runs_controller_test.go: `.Sprintf("%v", runIDs[0])` $DIR/core/web/pipeline_runs_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/pipeline_runs_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/pipeline_runs_controller_test.go: `.ParseJSONAPIResponse(responseBytes, &parsedResponse)` $DIR/core/web/pipeline_runs_controller_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/pipeline_runs_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/pipeline_runs_controller_test.go: `.Get("/v2/jobs/1/runs/invalid-run-ID")` $DIR/core/web/presenters/bridges_test.go: `r.IncomingToken = "cd+OfGXy3UHEDAlD0y27F6/rJE14X1UI"` $DIR/core/web/presenters/bridges_test.go: `b, err = jsonapi.Marshal(r)` $DIR/core/web/presenters/bridges_test.go: `expected = ` { "data": { "type":"bridges", "id":"test", "attributes":{ "name":"test", "url":"https://bridge.example.com/api", "confirmations":1, "incomingToken": "cd+OfGXy3UHEDAlD0y27F6/rJE14X1UI", "outgoingToken":"vjNL7X8Ea6GFJoa6PBsvK2ECzNK3b8IZ", "minimumContractPayment":"1", "createdAt":"2000-01-01T00:00:00Z" } } } `` $DIR/core/web/presenters/bridges_test.go: `.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)` $DIR/core/web/presenters/bridges_test.go: `.Parse("https://bridge.example.com/api")` $DIR/core/web/presenters/bridges_test.go: `.WebURL(*url)` $DIR/core/web/presenters/bridges_test.go: `.NewLinkFromJuels(1)` $DIR/core/web/presenters/bridges_test.go: `.Marshal(r)` $DIR/core/web/presenters/bridges_test.go: `.Marshal(r)` $DIR/core/web/presenters/chain_msg_test.go: `.RandomChainID()` $DIR/core/web/presenters/chain_msg_test.go: `.Marshal(r)` $DIR/core/web/presenters/chain_msg_test.go: `.Sprintf(` { "data":{ "type":"solana_messages", "id":"%s/%s", "attributes":{ "ChainID":"%s", "from":"", "to":"", "amount":0 } } } `, chainID, id, chainID)` $DIR/core/web/presenters/chain_msg_test.go: `.RandomChainID()` $DIR/core/web/presenters/chain_msg_test.go: `.Marshal(r)` $DIR/core/web/presenters/chain_msg_test.go: `.Sprintf(` { "data":{ "type":"cosmos_messages", "id":"%s/%s", "attributes":{ "ChainID":"%s", "ContractID":"%s", "State":"", "TxHash":null } } } `, chainID, id, chainID, contractID)` $DIR/core/web/presenters/csa_key_test.go: `key.ID = 1` $DIR/core/web/presenters/csa_key_test.go: `.New("passphrase", utils.FastScryptParams)` $DIR/core/web/presenters/csa_key_test.go: `.ToV2()` $DIR/core/web/presenters/csa_key_test.go: `.Marshal(r)` $DIR/core/web/presenters/csa_key_test.go: `.Sprintf(` { "data":{ "type":"csaKeys", "id":"%s", "attributes":{ "publicKey": "csa_%s", "version": 1 } } }`, key.PublicKey.String(), key.PublicKey.String())` $DIR/core/web/presenters/csa_key_test.go: `.PublicKey.String()` $DIR/core/web/presenters/csa_key_test.go: `.PublicKey.String()` $DIR/core/web/presenters/eth_key_test.go: `r = NewETHKeyResource(key, state, SetETHKeyEthBalance(nil), SetETHKeyLinkBalance(nil), SetETHKeyMaxGasPriceWei(nil), )` $DIR/core/web/presenters/eth_key_test.go: `b, err = jsonapi.Marshal(r)` $DIR/core/web/presenters/eth_key_test.go: `expected = fmt.Sprintf(` { "data": { "type":"eTHKeys", "id":"42/%s", "attributes":{ "address":"%s", "evmChainID":"42", "ethBalance":null, "linkBalance":null, "disabled":true, "createdAt":"2000-01-01T00:00:00Z", "updatedAt":"2000-01-01T00:00:00Z", "maxGasPriceWei":null } } }`, addressStr, addressStr, )` $DIR/core/web/presenters/eth_key_test.go: `.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)` $DIR/core/web/presenters/eth_key_test.go: `.HexToAddress(addressStr)` $DIR/core/web/presenters/eth_key_test.go: `.NewEIP55Address(addressStr)` $DIR/core/web/presenters/eth_key_test.go: `.NewI(42)` $DIR/core/web/presenters/eth_key_test.go: `.NewEth(1)` $DIR/core/web/presenters/eth_key_test.go: `.NewLinkFromJuels(1)` $DIR/core/web/presenters/eth_key_test.go: `.NewI(12345)` $DIR/core/web/presenters/eth_key_test.go: `.Marshal(r)` $DIR/core/web/presenters/eth_key_test.go: `.Sprintf(` { "data":{ "type":"eTHKeys", "id":"42/%s", "attributes":{ "address":"%s", "evmChainID":"42", "ethBalance":"1", "linkBalance":"1", "disabled":true, "createdAt":"2000-01-01T00:00:00Z", "updatedAt":"2000-01-01T00:00:00Z", "maxGasPriceWei":"12345" } } } `, addressStr, addressStr)` $DIR/core/web/presenters/eth_key_test.go: `.Marshal(r)` $DIR/core/web/presenters/eth_key_test.go: `.Sprintf(` { "data": { "type":"eTHKeys", "id":"42/%s", "attributes":{ "address":"%s", "evmChainID":"42", "ethBalance":null, "linkBalance":null, "disabled":true, "createdAt":"2000-01-01T00:00:00Z", "updatedAt":"2000-01-01T00:00:00Z", "maxGasPriceWei":null } } }`, addressStr, addressStr, )` $DIR/core/web/presenters/eth_tx_test.go: `tx.Sequence = &nonce` $DIR/core/web/presenters/eth_tx_test.go: `r = NewEthTxResourceFromAttempt(txa)` $DIR/core/web/presenters/eth_tx_test.go: `b, err = jsonapi.Marshal(r)` $DIR/core/web/presenters/eth_tx_test.go: `expected = ` { "data": { "type": "evm_transactions", "id": "54321/0x0000000000000000000000000000000000000000000000000000000000010203", "attributes": { "state": "confirmed", "data": "0x7b2264617461223a202269732077696c64696e67206f7574227d", "from": "0x0000000000000000000000000000000000000001", "gasLimit": "5000", "gasPrice": "1000", "hash": "0x0000000000000000000000000000000000000000000000000000000000010203", "rawHex": "0xcafe", "nonce": "100", "sentAt": "300", "to": "0x0000000000000000000000000000000000000002", "value": "0.000000000000000001", "evmChainID": "54321" } } } `` $DIR/core/web/presenters/eth_tx_test.go: `.NewInt(54321)` $DIR/core/web/presenters/eth_tx_test.go: `.HexToAddress("0x1")` $DIR/core/web/presenters/eth_tx_test.go: `.HexToAddress("0x2")` $DIR/core/web/presenters/eth_tx_test.go: `.Int(assets.NewEthValue(1))` $DIR/core/web/presenters/eth_tx_test.go: `.NewEthValue(1)` $DIR/core/web/presenters/eth_tx_test.go: `.Marshal(r)` $DIR/core/web/presenters/eth_tx_test.go: `.Nonce(100)` $DIR/core/web/presenters/eth_tx_test.go: `.BytesToHash([]byte{1, 2, 3})` $DIR/core/web/presenters/eth_tx_test.go: `.NewWeiI(1000)` $DIR/core/web/presenters/eth_tx_test.go: `.MustDecode("0xcafe")` $DIR/core/web/presenters/eth_tx_test.go: `.Marshal(r)` $DIR/core/web/presenters/evm_forwarder_test.go: `.RandomAddress()` $DIR/core/web/presenters/evm_forwarder_test.go: `.NewI(4)` $DIR/core/web/presenters/evm_forwarder_test.go: `.Now()` $DIR/core/web/presenters/evm_forwarder_test.go: `.Now()` $DIR/core/web/presenters/evm_forwarder_test.go: `.Add(time.Second)` $DIR/core/web/presenters/evm_forwarder_test.go: `.Marshal(r)` $DIR/core/web/presenters/evm_forwarder_test.go: `.MarshalText()` $DIR/core/web/presenters/evm_forwarder_test.go: `.MarshalText()` $DIR/core/web/presenters/evm_forwarder_test.go: `.Sprintf(` { "data":{ "type":"evm_forwarder", "id":"%d", "attributes":{ "address":"%s", "evmChainId":"%s", "createdAt":"%s", "updatedAt":"%s" } } } `, ID, strings.ToLower(address.String()), chainID.String(), string(createdAtMarshalled), string(updatedAtMarshalled))` $DIR/core/web/presenters/evm_forwarder_test.go: `.ToLower(address.String())` $DIR/core/web/presenters/evm_forwarder_test.go: `.String()` $DIR/core/web/presenters/evm_forwarder_test.go: `.String()` $DIR/core/web/presenters/job_test.go: `t.Run(tc.name, func(t *testing.T) { t.Parallel() r := presenters.NewJobResource(tc.job) b, err := jsonapi.Marshal(r) require.NoError(t, err) assert.JSONEq(t, tc.want, string(b)) })` $DIR/core/web/presenters/job_test.go: `.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)` $DIR/core/web/presenters/job_test.go: `.NewEIP55Address("0x9E40733cC9df84636505f4e6Db28DCa0dC5D1bba")` $DIR/core/web/presenters/job_test.go: `.NewI(42)` $DIR/core/web/presenters/job_test.go: `.NewEIP55Address("0xa8037A20989AFcBC51798de9762b351D63ff462e")` $DIR/core/web/presenters/job_test.go: `.MustSha256HashFromHex(ocrKeyBundleID)` $DIR/core/web/presenters/job_test.go: `.NewEIP55Address("0x27548a32b9aD5D64c5945EaE9Da5337bc3169D15")` $DIR/core/web/presenters/job_test.go: `.NewEIP55Address("0x16988483b46e695f6c8D58e6e1461DC703e008e1")` $DIR/core/web/presenters/job_test.go: `.NewEIP55Address("0x2C409DD6D4eBDdA190B5174Cc19616DD13884262")` $DIR/core/web/presenters/job_test.go: `.NewEIP55Address("0x92B5e28Ac583812874e4271380c7d070C5FB6E6b")` $DIR/core/web/presenters/job_test.go: `.NewEIP55Address("0xF6bB415b033D19EFf24A872a4785c6e1C4426103")` $DIR/core/web/presenters/job_test.go: `.NewEIP55Address("0x0ad9FE7a58216242a8475ca92F222b0640E26B63")` $DIR/core/web/presenters/job_test.go: `.NewPublicKeyFromHex("0xede539e216e3a50e69d1c68aa9cc472085876c4002f6e1e6afee0ea63b50a78b00")` $DIR/core/web/presenters/job_test.go: `.Uint32From(specGasLimit)` $DIR/core/web/presenters/job_test.go: `.MustParse("0EEC7E1D-D0D2-476C-A1A8-72DFB6633F46")` $DIR/core/web/presenters/job_test.go: `.StringFrom("test")` $DIR/core/web/presenters/job_test.go: `.Interval(1 * time.Minute)` $DIR/core/web/presenters/job_test.go: `.Sprintf(` { "data":{ "type":"jobs", "id":"1", "attributes":{ "name": "test", "schemaVersion": 1, "type": "directrequest", "maxTaskDuration": "1m0s", "externalJobID":"0eec7e1d-d0d2-476c-a1a8-72dfb6633f46", "pipelineSpec": { "id": 1, "dotDagSource": "ds1 [type=http method=GET url=\"https://pricesource1.com\"", "jobID": 0 }, "directRequestSpec": { "contractAddress": "%s", "minIncomingConfirmations": null, "minContractPaymentLinkJuels": null, "requesters": null, "initiator": "runlog", "createdAt":"2000-01-01T00:00:00Z", "updatedAt":"2000-01-01T00:00:00Z", "evmChainID": "42" }, "offChainReportingOracleSpec": null, "offChainReporting2OracleSpec": null, "fluxMonitorSpec": null, "gasLimit": 1000, "forwardingAllowed": false, "keeperSpec": null, "cronSpec": null, "vrfSpec": null, "webhookSpec": null, "workflowSpec": null, "blockhashStoreSpec": null, "blockHeaderFeederSpec": null, "bootstrapSpec": null, "gatewaySpec": null, "standardCapabilitiesSpec": null, "errors": [] } } }`, contractAddress)` $DIR/core/web/presenters/job_test.go: `.NewLinkFromJuels(1)` $DIR/core/web/presenters/job_test.go: `.MustParse("0EEC7E1D-D0D2-476C-A1A8-72DFB6633F46")` $DIR/core/web/presenters/job_test.go: `.StringFrom("test")` $DIR/core/web/presenters/job_test.go: `.Interval(1 * time.Minute)` $DIR/core/web/presenters/job_test.go: `.Sprintf(` { "data":{ "type":"jobs", "id":"1", "attributes":{ "name": "test", "schemaVersion": 1, "type": "fluxmonitor", "maxTaskDuration": "1m0s", "externalJobID":"0eec7e1d-d0d2-476c-a1a8-72dfb6633f46", "pipelineSpec": { "id": 1, "dotDagSource": "ds1 [type=http method=GET url=\"https://pricesource1.com\"", "jobID": 0 }, "fluxMonitorSpec": { "contractAddress": "%s", "threshold": 0.5, "absoluteThreshold": 0, "idleTimerPeriod": "1m0s", "idleTimerDisabled": false, "pollTimerPeriod": "1s", "pollTimerDisabled": false, "drumbeatEnabled": false, "drumbeatRandomDelay": null, "drumbeatSchedule": null, "minPayment": "1", "createdAt":"2000-01-01T00:00:00Z", "updatedAt":"2000-01-01T00:00:00Z", "evmChainID": "42" }, "gasLimit": null, "forwardingAllowed": false, "offChainReportingOracleSpec": null, "offChainReporting2OracleSpec": null, "directRequestSpec": null, "keeperSpec": null, "cronSpec": null, "vrfSpec": null, "webhookSpec": null, "workflowSpec": null, "blockhashStoreSpec": null, "blockHeaderFeederSpec": null, "bootstrapSpec": null, "gatewaySpec": null, "standardCapabilitiesSpec": null, "errors": [] } } }`, contractAddress)` $DIR/core/web/presenters/job_test.go: `.Interval(1 * time.Minute)` $DIR/core/web/presenters/job_test.go: `.Interval(1 * time.Minute)` $DIR/core/web/presenters/job_test.go: `.Interval(1 * time.Minute)` $DIR/core/web/presenters/job_test.go: `.Interval(1 * time.Minute)` $DIR/core/web/presenters/job_test.go: `.NewInterval(2 * time.Second)` $DIR/core/web/presenters/job_test.go: `.NewInterval(3 * time.Second)` $DIR/core/web/presenters/job_test.go: `.NewInterval(444 * time.Millisecond)` $DIR/core/web/presenters/job_test.go: `.MustParse("0EEC7E1D-D0D2-476C-A1A8-72DFB6633F46")` $DIR/core/web/presenters/job_test.go: `.StringFrom("test")` $DIR/core/web/presenters/job_test.go: `.Uint32From(123)` $DIR/core/web/presenters/job_test.go: `.Interval(1 * time.Minute)` $DIR/core/web/presenters/job_test.go: `.Sprintf(` { "data":{ "type":"jobs", "id":"1", "attributes":{ "name": "test", "schemaVersion": 1, "type": "offchainreporting", "maxTaskDuration": "1m0s", "externalJobID":"0eec7e1d-d0d2-476c-a1a8-72dfb6633f46", "pipelineSpec": { "id": 1, "dotDagSource": "ds1 [type=http method=GET url=\"https://pricesource1.com\"", "jobID": 0 }, "offChainReportingOracleSpec": { "contractAddress": "%s", "p2pv2Bootstrappers": ["xxx:5001"], "isBootstrapPeer": true, "keyBundleID": "%s", "transmitterAddress": "%s", "observationTimeout": "1m0s", "blockchainTimeout": "1m0s", "contractConfigTrackerSubscribeInterval": "1m0s", "contractConfigTrackerPollInterval": "1m0s", "contractConfigConfirmations": 1, "createdAt":"2000-01-01T00:00:00Z", "updatedAt":"2000-01-01T00:00:00Z", "evmChainID": "42", "databaseTimeout": "2s", "observationGracePeriod": "3s", "contractTransmitterTransmitTimeout": "444ms" }, "offChainReporting2OracleSpec": null, "fluxMonitorSpec": null, "gasLimit": 123, "forwardingAllowed": true, "directRequestSpec": null, "keeperSpec": null, "cronSpec": null, "vrfSpec": null, "webhookSpec": null, "workflowSpec": null, "blockhashStoreSpec": null, "blockHeaderFeederSpec": null, "bootstrapSpec": null, "gatewaySpec": null, "standardCapabilitiesSpec": null, "errors": [] } } }`, contractAddress, ocrKeyBundleID, transmitterAddress)` $DIR/core/web/presenters/job_test.go: `.MustParse("0EEC7E1D-D0D2-476C-A1A8-72DFB6633F46")` $DIR/core/web/presenters/job_test.go: `.StringFrom("test")` $DIR/core/web/presenters/job_test.go: `.Interval(1 * time.Minute)` $DIR/core/web/presenters/job_test.go: `.Sprintf(` { "data":{ "type":"jobs", "id":"1", "attributes":{ "name": "test", "schemaVersion": 1, "type": "keeper", "maxTaskDuration": "1m0s", "externalJobID":"0eec7e1d-d0d2-476c-a1a8-72dfb6633f46", "pipelineSpec": { "id": 1, "dotDagSource": "", "jobID": 0 }, "keeperSpec": { "contractAddress": "%s", "fromAddress": "%s", "createdAt":"2000-01-01T00:00:00Z", "updatedAt":"2000-01-01T00:00:00Z", "evmChainID": "42" }, "fluxMonitorSpec": null, "gasLimit": null, "forwardingAllowed": false, "directRequestSpec": null, "cronSpec": null, "webhookSpec": null, "workflowSpec": null, "offChainReportingOracleSpec": null, "offChainReporting2OracleSpec": null, "cronSpec": null, "vrfSpec": null, "blockhashStoreSpec": null, "blockHeaderFeederSpec": null, "bootstrapSpec": null, "gatewaySpec": null, "standardCapabilitiesSpec": null, "errors": [] } } }`, contractAddress, fromAddress)` $DIR/core/web/presenters/job_test.go: `.MustParse("0EEC7E1D-D0D2-476C-A1A8-72DFB6633F46")` $DIR/core/web/presenters/job_test.go: `.StringFrom("test")` $DIR/core/web/presenters/job_test.go: `.Interval(1 * time.Minute)` $DIR/core/web/presenters/job_test.go: `.Sprintf(` { "data":{ "type":"jobs", "id":"1", "attributes":{ "name": "test", "schemaVersion": 1, "type": "cron", "maxTaskDuration": "1m0s", "externalJobID":"0eec7e1d-d0d2-476c-a1a8-72dfb6633f46", "pipelineSpec": { "id": 1, "dotDagSource": "", "jobID": 0 }, "cronSpec": { "schedule": "%s", "createdAt":"2000-01-01T00:00:00Z", "updatedAt":"2000-01-01T00:00:00Z" }, "fluxMonitorSpec": null, "gasLimit": null, "forwardingAllowed": false, "directRequestSpec": null, "keeperSpec": null, "offChainReportingOracleSpec": null, "offChainReporting2OracleSpec": null, "vrfSpec": null, "webhookSpec": null, "workflowSpec": null, "blockhashStoreSpec": null, "blockHeaderFeederSpec": null, "bootstrapSpec": null, "gatewaySpec": null, "standardCapabilitiesSpec": null, "errors": [] } } }`, cronSchedule)` $DIR/core/web/presenters/job_test.go: `.MustParse("0eec7e1d-d0d2-476c-a1a8-72dfb6633f46")` $DIR/core/web/presenters/job_test.go: `.StringFrom("test")` $DIR/core/web/presenters/job_test.go: `.Interval(1 * time.Minute)` $DIR/core/web/presenters/job_test.go: `.StringFrom("vrf_test")` $DIR/core/web/presenters/job_test.go: `.MustParse("0eec7e1d-d0d2-476c-a1a8-72dfb6633f47")` $DIR/core/web/presenters/job_test.go: `.GWei(200)` $DIR/core/web/presenters/job_test.go: `.Sprintf(` { "data": { "type": "jobs", "id": "1", "attributes": { "name": "vrf_test", "type": "vrf", "schemaVersion": 1, "maxTaskDuration": "0s", "externalJobID": "0eec7e1d-d0d2-476c-a1a8-72dfb6633f47", "directRequestSpec": null, "fluxMonitorSpec": null, "gasLimit": null, "forwardingAllowed": false, "cronSpec": null, "offChainReportingOracleSpec": null, "offChainReporting2OracleSpec": null, "keeperSpec": null, "vrfSpec": { "batchCoordinatorAddress": "%s", "batchFulfillmentEnabled": true, "customRevertsPipelineEnabled": true, "confirmations": 1, "coordinatorAddress": "%s", "createdAt": "2000-01-01T00:00:00Z", "updatedAt": "2000-01-01T00:00:00Z", "evmChainID": "42", "fromAddresses": ["%s"], "pollPeriod": "0s", "publicKey": "%s", "requestedConfsDelay": 10, "requestTimeout": "0s", "chunkSize": 25, "batchFulfillmentGasMultiplier": 1, "backoffInitialDelay": "0s", "backoffMaxDelay": "0s", "gasLanePrice": "200 gwei" }, "webhookSpec": null, "workflowSpec": null, "blockhashStoreSpec": null, "blockHeaderFeederSpec": null, "bootstrapSpec": null, "pipelineSpec": { "id": 1, "jobID": 0, "dotDagSource": "" }, "gatewaySpec": null, "standardCapabilitiesSpec": null, "errors": [] } } }`, contractAddress, contractAddress, fromAddress, vrfPubKey.String())` $DIR/core/web/presenters/job_test.go: `.String()` $DIR/core/web/presenters/job_test.go: `.NewI(4)` $DIR/core/web/presenters/job_test.go: `.MustParse("0eec7e1d-d0d2-476c-a1a8-72dfb6633f46")` $DIR/core/web/presenters/job_test.go: `.StringFrom("test")` $DIR/core/web/presenters/job_test.go: `.NewI(4)` $DIR/core/web/presenters/job_test.go: `.MustParse("0eec7e1d-d0d2-476c-a1a8-72dfb6633f47")` $DIR/core/web/presenters/job_test.go: `.StringFrom("blockheaderfeeder")` $DIR/core/web/presenters/job_test.go: `.MustParse("0eec7e1d-d0d2-476c-a1a8-72dfb6633f46")` $DIR/core/web/presenters/job_test.go: `.StringFrom("test")` $DIR/core/web/presenters/job_test.go: `.MustParse("0eec7e1d-d0d2-476c-a1a8-72dfb6633f46")` $DIR/core/web/presenters/job_test.go: `.StringFrom("gateway test")` $DIR/core/web/presenters/job_test.go: `.MustParse("0eec7e1d-d0d2-476c-a1a8-72dfb6633f46")` $DIR/core/web/presenters/job_test.go: `.StringFrom("workflow test")` $DIR/core/web/presenters/job_test.go: `.MustParse("0eec7e1d-d0d2-476c-a1a8-72dfb6633f46")` $DIR/core/web/presenters/job_test.go: `.StringFrom("standardcapabilities test")` $DIR/core/web/presenters/job_test.go: `.MustParse("0EEC7E1D-D0D2-476C-A1A8-72DFB6633F46")` $DIR/core/web/presenters/job_test.go: `.StringFrom("test")` $DIR/core/web/presenters/job_test.go: `.Interval(1 * time.Minute)` $DIR/core/web/presenters/job_test.go: `.Sprintf(` { "data":{ "type":"jobs", "id":"1", "attributes":{ "name": "test", "schemaVersion": 1, "type": "keeper", "maxTaskDuration": "1m0s", "externalJobID":"0eec7e1d-d0d2-476c-a1a8-72dfb6633f46", "pipelineSpec": { "id": 1, "dotDagSource": "", "jobID": 0 }, "keeperSpec": { "contractAddress": "%s", "fromAddress": "%s", "createdAt":"2000-01-01T00:00:00Z", "updatedAt":"2000-01-01T00:00:00Z", "evmChainID": "42" }, "fluxMonitorSpec": null, "gasLimit": null, "forwardingAllowed": false, "directRequestSpec": null, "cronSpec": null, "webhookSpec": null, "workflowSpec": null, "offChainReportingOracleSpec": null, "offChainReporting2OracleSpec": null, "vrfSpec": null, "blockhashStoreSpec": null, "blockHeaderFeederSpec": null, "bootstrapSpec": null, "gatewaySpec": null, "standardCapabilitiesSpec": null, "errors": [{ "id": 200, "description": "some error", "occurrences": 1, "createdAt":"2000-01-01T00:00:00Z", "updatedAt":"2000-01-01T00:00:00Z" }] } } }`, contractAddress, fromAddress)` $DIR/core/web/presenters/job_test.go: `.Run(tc.name, func(t *testing.T) { t.Parallel() r := presenters.NewJobResource(tc.job) b, err := jsonapi.Marshal(r) require.NoError(t, err) assert.JSONEq(t, tc.want, string(b)) })` $DIR/core/web/presenters/job_test.go: `.NewJobResource(tc.job)` $DIR/core/web/presenters/job_test.go: `.Marshal(r)` $DIR/core/web/presenters/node_test.go: `r = evmNodeResource` $DIR/core/web/presenters/node_test.go: `nodeResource = evmNodeResource.NodeResource` $DIR/core/web/presenters/node_test.go: `r = solanaNodeResource` $DIR/core/web/presenters/node_test.go: `nodeResource = solanaNodeResource.NodeResource` $DIR/core/web/presenters/node_test.go: `r = cosmosNodeResource` $DIR/core/web/presenters/node_test.go: `nodeResource = cosmosNodeResource.NodeResource` $DIR/core/web/presenters/node_test.go: `r = starknetNodeResource` $DIR/core/web/presenters/node_test.go: `nodeResource = starknetNodeResource.NodeResource` $DIR/core/web/presenters/node_test.go: `.Sprintf("%s chain ID", tc)` $DIR/core/web/presenters/node_test.go: `.Sprintf("%s_node", tc)` $DIR/core/web/presenters/node_test.go: `.Marshal(r)` $DIR/core/web/presenters/node_test.go: `.Sprintf(` { "data":{ "type":"%s_node", "id":"%s/%s", "attributes":{ "chainID":"%s", "name":"%s", "config":"%s", "state":"%s" } } } `, tc, chainID, nodeName, chainID, nodeName, cfg, state)` $DIR/core/web/presenters/p2p_key_test.go: `r = NewP2PKeyResource(key)` $DIR/core/web/presenters/p2p_key_test.go: `b, err = jsonapi.Marshal(r)` $DIR/core/web/presenters/p2p_key_test.go: `expected = fmt.Sprintf(` { "data": { "type":"encryptedP2PKeys", "id":"%s", "attributes":{ "peerId":"%s", "publicKey": "%s" } } }`, key.ID(), peerIDStr, key.PublicKeyHex())` $DIR/core/web/presenters/p2p_key_test.go: `.NewP2PKeyV2(t)` $DIR/core/web/presenters/p2p_key_test.go: `.PeerID()` $DIR/core/web/presenters/p2p_key_test.go: `.String()` $DIR/core/web/presenters/p2p_key_test.go: `.Marshal(r)` $DIR/core/web/presenters/p2p_key_test.go: `.Sprintf(` { "data":{ "type":"encryptedP2PKeys", "id":"%s", "attributes":{ "peerId":"%s", "publicKey": "%s" } } }`, key.ID(), peerIDStr, key.PublicKeyHex())` $DIR/core/web/presenters/p2p_key_test.go: `.ID()` $DIR/core/web/presenters/p2p_key_test.go: `.PublicKeyHex()` $DIR/core/web/presenters/p2p_key_test.go: `.Marshal(r)` $DIR/core/web/presenters/p2p_key_test.go: `.Sprintf(` { "data": { "type":"encryptedP2PKeys", "id":"%s", "attributes":{ "peerId":"%s", "publicKey": "%s" } } }`, key.ID(), peerIDStr, key.PublicKeyHex())` $DIR/core/web/presenters/p2p_key_test.go: `.ID()` $DIR/core/web/presenters/p2p_key_test.go: `.PublicKeyHex()` $DIR/core/web/presenters/user_test.go: `.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)` $DIR/core/web/presenters/user_test.go: `.Marshal(r)` $DIR/core/web/resolver/api_token_test.go: `session.User.HashedPassword = pwd` $DIR/core/web/resolver/api_token_test.go: `f.Mocks.authProvider.On("FindUser", mock.Anything, session.User.Email).Return(*session.User, nil)` $DIR/core/web/resolver/api_token_test.go: `f.Mocks.authProvider.On("TestPassword", mock.Anything, session.User.Email, defaultPassword).Return(nil)` $DIR/core/web/resolver/api_token_test.go: `f.Mocks.authProvider.On("CreateAndSetAuthToken", mock.Anything, session.User).Return(&auth.Token{ Secret: "new-secret", AccessKey: "new-access-key", }, nil)` $DIR/core/web/resolver/api_token_test.go: `f.App.On("AuthenticationProvider").Return(f.Mocks.authProvider)` $DIR/core/web/resolver/api_token_test.go: `f.Mocks.authProvider.On("FindUser", mock.Anything, session.User.Email).Return(*session.User, nil)` $DIR/core/web/resolver/api_token_test.go: `f.Mocks.authProvider.On("TestPassword", mock.Anything, session.User.Email, "wrong-password").Return(gError)` $DIR/core/web/resolver/api_token_test.go: `f.App.On("AuthenticationProvider").Return(f.Mocks.authProvider)` $DIR/core/web/resolver/api_token_test.go: `session.User.HashedPassword = pwd` $DIR/core/web/resolver/api_token_test.go: `f.Mocks.authProvider.On("FindUser", mock.Anything, session.User.Email).Return(*session.User, gError)` $DIR/core/web/resolver/api_token_test.go: `f.App.On("AuthenticationProvider").Return(f.Mocks.authProvider)` $DIR/core/web/resolver/api_token_test.go: `session.User.HashedPassword = pwd` $DIR/core/web/resolver/api_token_test.go: `f.Mocks.authProvider.On("FindUser", mock.Anything, session.User.Email).Return(*session.User, nil)` $DIR/core/web/resolver/api_token_test.go: `f.Mocks.authProvider.On("TestPassword", mock.Anything, session.User.Email, defaultPassword).Return(nil)` $DIR/core/web/resolver/api_token_test.go: `f.Mocks.authProvider.On("CreateAndSetAuthToken", mock.Anything, session.User).Return(nil, gError)` $DIR/core/web/resolver/api_token_test.go: `f.App.On("AuthenticationProvider").Return(f.Mocks.authProvider)` $DIR/core/web/resolver/api_token_test.go: `session.User.HashedPassword = pwd` $DIR/core/web/resolver/api_token_test.go: `err = session.User.TokenKey.UnmarshalText([]byte("new-access-key"))` $DIR/core/web/resolver/api_token_test.go: `f.Mocks.authProvider.On("FindUser", mock.Anything, session.User.Email).Return(*session.User, nil)` $DIR/core/web/resolver/api_token_test.go: `f.Mocks.authProvider.On("TestPassword", mock.Anything, session.User.Email, defaultPassword).Return(nil)` $DIR/core/web/resolver/api_token_test.go: `f.Mocks.authProvider.On("DeleteAuthToken", mock.Anything, session.User).Return(nil)` $DIR/core/web/resolver/api_token_test.go: `f.App.On("AuthenticationProvider").Return(f.Mocks.authProvider)` $DIR/core/web/resolver/api_token_test.go: `f.Mocks.authProvider.On("FindUser", mock.Anything, session.User.Email).Return(*session.User, nil)` $DIR/core/web/resolver/api_token_test.go: `f.Mocks.authProvider.On("TestPassword", mock.Anything, session.User.Email, "wrong-password").Return(gError)` $DIR/core/web/resolver/api_token_test.go: `f.App.On("AuthenticationProvider").Return(f.Mocks.authProvider)` $DIR/core/web/resolver/api_token_test.go: `session.User.HashedPassword = pwd` $DIR/core/web/resolver/api_token_test.go: `f.Mocks.authProvider.On("FindUser", mock.Anything, session.User.Email).Return(*session.User, gError)` $DIR/core/web/resolver/api_token_test.go: `f.App.On("AuthenticationProvider").Return(f.Mocks.authProvider)` $DIR/core/web/resolver/api_token_test.go: `session.User.HashedPassword = pwd` $DIR/core/web/resolver/api_token_test.go: `f.Mocks.authProvider.On("FindUser", mock.Anything, session.User.Email).Return(*session.User, nil)` $DIR/core/web/resolver/api_token_test.go: `f.Mocks.authProvider.On("TestPassword", mock.Anything, session.User.Email, defaultPassword).Return(nil)` $DIR/core/web/resolver/api_token_test.go: `f.Mocks.authProvider.On("DeleteAuthToken", mock.Anything, session.User).Return(gError)` $DIR/core/web/resolver/api_token_test.go: `f.App.On("AuthenticationProvider").Return(f.Mocks.authProvider)` $DIR/core/web/resolver/api_token_test.go: `.New("error")` $DIR/core/web/resolver/api_token_test.go: `.GetGQLAuthenticatedSession(ctx)` $DIR/core/web/resolver/api_token_test.go: `.HashPassword(defaultPassword)` $DIR/core/web/resolver/api_token_test.go: `.Mocks.authProvider.On("FindUser", mock.Anything, session.User.Email)` $DIR/core/web/resolver/api_token_test.go: `.Return(*session.User, nil)` $DIR/core/web/resolver/api_token_test.go: `.Mocks.authProvider.On("TestPassword", mock.Anything, session.User.Email, defaultPassword)` $DIR/core/web/resolver/api_token_test.go: `.Return(nil)` $DIR/core/web/resolver/api_token_test.go: `.Mocks.authProvider.On("CreateAndSetAuthToken", mock.Anything, session.User)` $DIR/core/web/resolver/api_token_test.go: `.Return(&auth.Token{ Secret: "new-secret", AccessKey: "new-access-key", }, nil)` $DIR/core/web/resolver/api_token_test.go: `.App.On("AuthenticationProvider")` $DIR/core/web/resolver/api_token_test.go: `.Return(f.Mocks.authProvider)` $DIR/core/web/resolver/api_token_test.go: `.GetGQLAuthenticatedSession(ctx)` $DIR/core/web/resolver/api_token_test.go: `.Mocks.authProvider.On("FindUser", mock.Anything, session.User.Email)` $DIR/core/web/resolver/api_token_test.go: `.Return(*session.User, nil)` $DIR/core/web/resolver/api_token_test.go: `.Mocks.authProvider.On("TestPassword", mock.Anything, session.User.Email, "wrong-password")` $DIR/core/web/resolver/api_token_test.go: `.Return(gError)` $DIR/core/web/resolver/api_token_test.go: `.App.On("AuthenticationProvider")` $DIR/core/web/resolver/api_token_test.go: `.Return(f.Mocks.authProvider)` $DIR/core/web/resolver/api_token_test.go: `.GetGQLAuthenticatedSession(ctx)` $DIR/core/web/resolver/api_token_test.go: `.HashPassword(defaultPassword)` $DIR/core/web/resolver/api_token_test.go: `.Mocks.authProvider.On("FindUser", mock.Anything, session.User.Email)` $DIR/core/web/resolver/api_token_test.go: `.Return(*session.User, gError)` $DIR/core/web/resolver/api_token_test.go: `.App.On("AuthenticationProvider")` $DIR/core/web/resolver/api_token_test.go: `.Return(f.Mocks.authProvider)` $DIR/core/web/resolver/api_token_test.go: `.GetGQLAuthenticatedSession(ctx)` $DIR/core/web/resolver/api_token_test.go: `.HashPassword(defaultPassword)` $DIR/core/web/resolver/api_token_test.go: `.Mocks.authProvider.On("FindUser", mock.Anything, session.User.Email)` $DIR/core/web/resolver/api_token_test.go: `.Return(*session.User, nil)` $DIR/core/web/resolver/api_token_test.go: `.Mocks.authProvider.On("TestPassword", mock.Anything, session.User.Email, defaultPassword)` $DIR/core/web/resolver/api_token_test.go: `.Return(nil)` $DIR/core/web/resolver/api_token_test.go: `.Mocks.authProvider.On("CreateAndSetAuthToken", mock.Anything, session.User)` $DIR/core/web/resolver/api_token_test.go: `.Return(nil, gError)` $DIR/core/web/resolver/api_token_test.go: `.App.On("AuthenticationProvider")` $DIR/core/web/resolver/api_token_test.go: `.Return(f.Mocks.authProvider)` $DIR/core/web/resolver/api_token_test.go: `.New("error")` $DIR/core/web/resolver/api_token_test.go: `.GetGQLAuthenticatedSession(ctx)` $DIR/core/web/resolver/api_token_test.go: `.HashPassword(defaultPassword)` $DIR/core/web/resolver/api_token_test.go: `.User.TokenKey.UnmarshalText([]byte("new-access-key"))` $DIR/core/web/resolver/api_token_test.go: `.Mocks.authProvider.On("FindUser", mock.Anything, session.User.Email)` $DIR/core/web/resolver/api_token_test.go: `.Return(*session.User, nil)` $DIR/core/web/resolver/api_token_test.go: `.Mocks.authProvider.On("TestPassword", mock.Anything, session.User.Email, defaultPassword)` $DIR/core/web/resolver/api_token_test.go: `.Return(nil)` $DIR/core/web/resolver/api_token_test.go: `.Mocks.authProvider.On("DeleteAuthToken", mock.Anything, session.User)` $DIR/core/web/resolver/api_token_test.go: `.Return(nil)` $DIR/core/web/resolver/api_token_test.go: `.App.On("AuthenticationProvider")` $DIR/core/web/resolver/api_token_test.go: `.Return(f.Mocks.authProvider)` $DIR/core/web/resolver/api_token_test.go: `.GetGQLAuthenticatedSession(ctx)` $DIR/core/web/resolver/api_token_test.go: `.Mocks.authProvider.On("FindUser", mock.Anything, session.User.Email)` $DIR/core/web/resolver/api_token_test.go: `.Return(*session.User, nil)` $DIR/core/web/resolver/api_token_test.go: `.Mocks.authProvider.On("TestPassword", mock.Anything, session.User.Email, "wrong-password")` $DIR/core/web/resolver/api_token_test.go: `.Return(gError)` $DIR/core/web/resolver/api_token_test.go: `.App.On("AuthenticationProvider")` $DIR/core/web/resolver/api_token_test.go: `.Return(f.Mocks.authProvider)` $DIR/core/web/resolver/api_token_test.go: `.GetGQLAuthenticatedSession(ctx)` $DIR/core/web/resolver/api_token_test.go: `.HashPassword(defaultPassword)` $DIR/core/web/resolver/api_token_test.go: `.Mocks.authProvider.On("FindUser", mock.Anything, session.User.Email)` $DIR/core/web/resolver/api_token_test.go: `.Return(*session.User, gError)` $DIR/core/web/resolver/api_token_test.go: `.App.On("AuthenticationProvider")` $DIR/core/web/resolver/api_token_test.go: `.Return(f.Mocks.authProvider)` $DIR/core/web/resolver/api_token_test.go: `.GetGQLAuthenticatedSession(ctx)` $DIR/core/web/resolver/api_token_test.go: `.HashPassword(defaultPassword)` $DIR/core/web/resolver/api_token_test.go: `.Mocks.authProvider.On("FindUser", mock.Anything, session.User.Email)` $DIR/core/web/resolver/api_token_test.go: `.Return(*session.User, nil)` $DIR/core/web/resolver/api_token_test.go: `.Mocks.authProvider.On("TestPassword", mock.Anything, session.User.Email, defaultPassword)` $DIR/core/web/resolver/api_token_test.go: `.Return(nil)` $DIR/core/web/resolver/api_token_test.go: `.Mocks.authProvider.On("DeleteAuthToken", mock.Anything, session.User)` $DIR/core/web/resolver/api_token_test.go: `.Return(gError)` $DIR/core/web/resolver/api_token_test.go: `.App.On("AuthenticationProvider")` $DIR/core/web/resolver/api_token_test.go: `.Return(f.Mocks.authProvider)` $DIR/core/web/resolver/bridge_test.go: `f.App.On("BridgeORM").Return(f.Mocks.bridgeORM)` $DIR/core/web/resolver/bridge_test.go: `f.Mocks.bridgeORM.On("BridgeTypes", mock.Anything, PageDefaultOffset, PageDefaultLimit).Return([]bridges.BridgeType{ { Name: "bridge1", URL: models.WebURL(*bridgeURL), Confirmations: uint32(1), OutgoingToken: "outgoingToken", MinimumContractPayment: assets.NewLinkFromJuels(1), CreatedAt: f.Timestamp(), }, }, 1, nil)` $DIR/core/web/resolver/bridge_test.go: `f.App.On("BridgeORM").Return(f.Mocks.bridgeORM)` $DIR/core/web/resolver/bridge_test.go: `f.Mocks.bridgeORM.On("FindBridge", mock.Anything, name).Return(bridges.BridgeType{ Name: name, URL: models.WebURL(*bridgeURL), Confirmations: uint32(1), OutgoingToken: "outgoingToken", MinimumContractPayment: assets.NewLinkFromJuels(1), CreatedAt: f.Timestamp(), }, nil)` $DIR/core/web/resolver/bridge_test.go: `f.App.On("BridgeORM").Return(f.Mocks.bridgeORM)` $DIR/core/web/resolver/bridge_test.go: `f.Mocks.bridgeORM.On("FindBridge", mock.Anything, name).Return(bridges.BridgeType{}, sql.ErrNoRows)` $DIR/core/web/resolver/bridge_test.go: `f.App.On("BridgeORM").Return(f.Mocks.bridgeORM)` $DIR/core/web/resolver/bridge_test.go: `f.Mocks.bridgeORM.On("FindBridge", mock.Anything, name).Return(bridges.BridgeType{}, sql.ErrNoRows)` $DIR/core/web/resolver/bridge_test.go: `f.Mocks.bridgeORM.On("CreateBridgeType", mock.Anything, mock.IsType(&bridges.BridgeType{})). Run(func(args mock.Arguments) { arg := args.Get(1).(*bridges.BridgeType) *arg = bridges.BridgeType{ Name: name, URL: models.WebURL(*bridgeURL), Confirmations: uint32(1), OutgoingToken: "outgoingToken", MinimumContractPayment: assets.NewLinkFromJuels(1), CreatedAt: f.Timestamp(), } }). Return(nil)` $DIR/core/web/resolver/bridge_test.go: `*arg = bridges.BridgeType{ Name: name, URL: models.WebURL(*bridgeURL), Confirmations: uint32(1), OutgoingToken: "outgoingToken", MinimumContractPayment: assets.NewLinkFromJuels(1), CreatedAt: f.Timestamp(), }` $DIR/core/web/resolver/bridge_test.go: `f.App.On("BridgeORM").Return(f.Mocks.bridgeORM)` $DIR/core/web/resolver/bridge_test.go: `f.Mocks.bridgeORM.On("FindBridge", mock.Anything, name).Return(bridge, nil)` $DIR/core/web/resolver/bridge_test.go: `f.Mocks.bridgeORM.On("UpdateBridgeType", mock.Anything, mock.IsType(&bridges.BridgeType{}), btr). Run(func(args mock.Arguments) { arg := args.Get(1).(*bridges.BridgeType) *arg = bridges.BridgeType{ Name: "bridge-updated", URL: models.WebURL(*newBridgeURL), Confirmations: 2, OutgoingToken: "outgoingToken", MinimumContractPayment: assets.NewLinkFromJuels(2), CreatedAt: f.Timestamp(), } }). Return(nil)` $DIR/core/web/resolver/bridge_test.go: `*arg = bridges.BridgeType{ Name: "bridge-updated", URL: models.WebURL(*newBridgeURL), Confirmations: 2, OutgoingToken: "outgoingToken", MinimumContractPayment: assets.NewLinkFromJuels(2), CreatedAt: f.Timestamp(), }` $DIR/core/web/resolver/bridge_test.go: `f.App.On("BridgeORM").Return(f.Mocks.bridgeORM)` $DIR/core/web/resolver/bridge_test.go: `f.Mocks.bridgeORM.On("FindBridge", mock.Anything, name).Return(bridges.BridgeType{}, sql.ErrNoRows)` $DIR/core/web/resolver/bridge_test.go: `err = json.Unmarshal([]byte(`"1"`), &link)` $DIR/core/web/resolver/bridge_test.go: `f.Mocks.bridgeORM.On("FindBridge", mock.Anything, name).Return(bridge, nil)` $DIR/core/web/resolver/bridge_test.go: `f.Mocks.bridgeORM.On("DeleteBridgeType", mock.Anything, &bridge).Return(nil)` $DIR/core/web/resolver/bridge_test.go: `f.Mocks.jobORM.On("FindJobIDsWithBridge", mock.Anything, name.String()).Return([]int32{}, nil)` $DIR/core/web/resolver/bridge_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/bridge_test.go: `f.App.On("BridgeORM").Return(f.Mocks.bridgeORM)` $DIR/core/web/resolver/bridge_test.go: `f.Mocks.bridgeORM.On("FindBridge", mock.Anything, name).Return(bridges.BridgeType{}, sql.ErrNoRows)` $DIR/core/web/resolver/bridge_test.go: `f.App.On("BridgeORM").Return(f.Mocks.bridgeORM)` $DIR/core/web/resolver/bridge_test.go: `f.Mocks.bridgeORM.On("FindBridge", mock.Anything, name).Return(bridges.BridgeType{}, nil)` $DIR/core/web/resolver/bridge_test.go: `f.Mocks.jobORM.On("FindJobIDsWithBridge", mock.Anything, name.String()).Return([]int32{1}, nil)` $DIR/core/web/resolver/bridge_test.go: `f.App.On("BridgeORM").Return(f.Mocks.bridgeORM)` $DIR/core/web/resolver/bridge_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/bridge_test.go: `.Parse("https://external.adapter")` $DIR/core/web/resolver/bridge_test.go: `.App.On("BridgeORM")` $DIR/core/web/resolver/bridge_test.go: `.Return(f.Mocks.bridgeORM)` $DIR/core/web/resolver/bridge_test.go: `.Mocks.bridgeORM.On("BridgeTypes", mock.Anything, PageDefaultOffset, PageDefaultLimit)` $DIR/core/web/resolver/bridge_test.go: `.Return([]bridges.BridgeType{ { Name: "bridge1", URL: models.WebURL(*bridgeURL), Confirmations: uint32(1), OutgoingToken: "outgoingToken", MinimumContractPayment: assets.NewLinkFromJuels(1), CreatedAt: f.Timestamp(), }, }, 1, nil)` $DIR/core/web/resolver/bridge_test.go: `.WebURL(*bridgeURL)` $DIR/core/web/resolver/bridge_test.go: `.NewLinkFromJuels(1)` $DIR/core/web/resolver/bridge_test.go: `.Timestamp()` $DIR/core/web/resolver/bridge_test.go: `.BridgeName("bridge1")` $DIR/core/web/resolver/bridge_test.go: `.Parse("https://external.adapter")` $DIR/core/web/resolver/bridge_test.go: `.App.On("BridgeORM")` $DIR/core/web/resolver/bridge_test.go: `.Return(f.Mocks.bridgeORM)` $DIR/core/web/resolver/bridge_test.go: `.Mocks.bridgeORM.On("FindBridge", mock.Anything, name)` $DIR/core/web/resolver/bridge_test.go: `.Return(bridges.BridgeType{ Name: name, URL: models.WebURL(*bridgeURL), Confirmations: uint32(1), OutgoingToken: "outgoingToken", MinimumContractPayment: assets.NewLinkFromJuels(1), CreatedAt: f.Timestamp(), }, nil)` $DIR/core/web/resolver/bridge_test.go: `.WebURL(*bridgeURL)` $DIR/core/web/resolver/bridge_test.go: `.NewLinkFromJuels(1)` $DIR/core/web/resolver/bridge_test.go: `.Timestamp()` $DIR/core/web/resolver/bridge_test.go: `.App.On("BridgeORM")` $DIR/core/web/resolver/bridge_test.go: `.Return(f.Mocks.bridgeORM)` $DIR/core/web/resolver/bridge_test.go: `.Mocks.bridgeORM.On("FindBridge", mock.Anything, name)` $DIR/core/web/resolver/bridge_test.go: `.Return(bridges.BridgeType{}, sql.ErrNoRows)` $DIR/core/web/resolver/bridge_test.go: `.BridgeName("bridge1")` $DIR/core/web/resolver/bridge_test.go: `.Parse("https://external.adapter")` $DIR/core/web/resolver/bridge_test.go: `.App.On("BridgeORM")` $DIR/core/web/resolver/bridge_test.go: `.Return(f.Mocks.bridgeORM)` $DIR/core/web/resolver/bridge_test.go: `.Mocks.bridgeORM.On("FindBridge", mock.Anything, name)` $DIR/core/web/resolver/bridge_test.go: `.Return(bridges.BridgeType{}, sql.ErrNoRows)` $DIR/core/web/resolver/bridge_test.go: `.Mocks.bridgeORM.On("CreateBridgeType", mock.Anything, mock.IsType(&bridges.BridgeType{}))` $DIR/core/web/resolver/bridge_test.go: `.IsType(&bridges.BridgeType{})` $DIR/core/web/resolver/bridge_test.go: `. Run(func(args mock.Arguments) { arg := args.Get(1).(*bridges.BridgeType) *arg = bridges.BridgeType{ Name: name, URL: models.WebURL(*bridgeURL), Confirmations: uint32(1), OutgoingToken: "outgoingToken", MinimumContractPayment: assets.NewLinkFromJuels(1), CreatedAt: f.Timestamp(), } })` $DIR/core/web/resolver/bridge_test.go: `.Get(1)` $DIR/core/web/resolver/bridge_test.go: `.WebURL(*bridgeURL)` $DIR/core/web/resolver/bridge_test.go: `.NewLinkFromJuels(1)` $DIR/core/web/resolver/bridge_test.go: `.Timestamp()` $DIR/core/web/resolver/bridge_test.go: `. Return(nil)` $DIR/core/web/resolver/bridge_test.go: `.BridgeName("bridge1")` $DIR/core/web/resolver/bridge_test.go: `.Parse("https://external.adapter")` $DIR/core/web/resolver/bridge_test.go: `.Parse("https://external.adapter.new")` $DIR/core/web/resolver/bridge_test.go: `.WebURL(*bridgeURL)` $DIR/core/web/resolver/bridge_test.go: `.NewLinkFromJuels(1)` $DIR/core/web/resolver/bridge_test.go: `.Timestamp()` $DIR/core/web/resolver/bridge_test.go: `.App.On("BridgeORM")` $DIR/core/web/resolver/bridge_test.go: `.Return(f.Mocks.bridgeORM)` $DIR/core/web/resolver/bridge_test.go: `.Mocks.bridgeORM.On("FindBridge", mock.Anything, name)` $DIR/core/web/resolver/bridge_test.go: `.Return(bridge, nil)` $DIR/core/web/resolver/bridge_test.go: `.BridgeName("bridge-updated")` $DIR/core/web/resolver/bridge_test.go: `.WebURL(*newBridgeURL)` $DIR/core/web/resolver/bridge_test.go: `.NewLinkFromJuels(2)` $DIR/core/web/resolver/bridge_test.go: `.Mocks.bridgeORM.On("UpdateBridgeType", mock.Anything, mock.IsType(&bridges.BridgeType{}), btr)` $DIR/core/web/resolver/bridge_test.go: `.IsType(&bridges.BridgeType{})` $DIR/core/web/resolver/bridge_test.go: `. Run(func(args mock.Arguments) { arg := args.Get(1).(*bridges.BridgeType) *arg = bridges.BridgeType{ Name: "bridge-updated", URL: models.WebURL(*newBridgeURL), Confirmations: 2, OutgoingToken: "outgoingToken", MinimumContractPayment: assets.NewLinkFromJuels(2), CreatedAt: f.Timestamp(), } })` $DIR/core/web/resolver/bridge_test.go: `.Get(1)` $DIR/core/web/resolver/bridge_test.go: `.WebURL(*newBridgeURL)` $DIR/core/web/resolver/bridge_test.go: `.NewLinkFromJuels(2)` $DIR/core/web/resolver/bridge_test.go: `.Timestamp()` $DIR/core/web/resolver/bridge_test.go: `. Return(nil)` $DIR/core/web/resolver/bridge_test.go: `.App.On("BridgeORM")` $DIR/core/web/resolver/bridge_test.go: `.Return(f.Mocks.bridgeORM)` $DIR/core/web/resolver/bridge_test.go: `.Mocks.bridgeORM.On("FindBridge", mock.Anything, name)` $DIR/core/web/resolver/bridge_test.go: `.Return(bridges.BridgeType{}, sql.ErrNoRows)` $DIR/core/web/resolver/bridge_test.go: `.BridgeName("bridge1")` $DIR/core/web/resolver/bridge_test.go: `.Parse("https://test-url.com")` $DIR/core/web/resolver/bridge_test.go: `.Unmarshal([]byte(`"1"`), &link)` $DIR/core/web/resolver/bridge_test.go: `.String()` $DIR/core/web/resolver/bridge_test.go: `.WebURL(*bridgeURL)` $DIR/core/web/resolver/bridge_test.go: `.Mocks.bridgeORM.On("FindBridge", mock.Anything, name)` $DIR/core/web/resolver/bridge_test.go: `.Return(bridge, nil)` $DIR/core/web/resolver/bridge_test.go: `.Mocks.bridgeORM.On("DeleteBridgeType", mock.Anything, &bridge)` $DIR/core/web/resolver/bridge_test.go: `.Return(nil)` $DIR/core/web/resolver/bridge_test.go: `.Mocks.jobORM.On("FindJobIDsWithBridge", mock.Anything, name.String())` $DIR/core/web/resolver/bridge_test.go: `.String()` $DIR/core/web/resolver/bridge_test.go: `.Return([]int32{}, nil)` $DIR/core/web/resolver/bridge_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/bridge_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/bridge_test.go: `.App.On("BridgeORM")` $DIR/core/web/resolver/bridge_test.go: `.Return(f.Mocks.bridgeORM)` $DIR/core/web/resolver/bridge_test.go: `.Mocks.bridgeORM.On("FindBridge", mock.Anything, name)` $DIR/core/web/resolver/bridge_test.go: `.Return(bridges.BridgeType{}, sql.ErrNoRows)` $DIR/core/web/resolver/bridge_test.go: `.App.On("BridgeORM")` $DIR/core/web/resolver/bridge_test.go: `.Return(f.Mocks.bridgeORM)` $DIR/core/web/resolver/bridge_test.go: `.Mocks.bridgeORM.On("FindBridge", mock.Anything, name)` $DIR/core/web/resolver/bridge_test.go: `.Return(bridges.BridgeType{}, nil)` $DIR/core/web/resolver/bridge_test.go: `.Mocks.jobORM.On("FindJobIDsWithBridge", mock.Anything, name.String())` $DIR/core/web/resolver/bridge_test.go: `.String()` $DIR/core/web/resolver/bridge_test.go: `.Return([]int32{1}, nil)` $DIR/core/web/resolver/bridge_test.go: `.App.On("BridgeORM")` $DIR/core/web/resolver/bridge_test.go: `.Return(f.Mocks.bridgeORM)` $DIR/core/web/resolver/bridge_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/bridge_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/chain_test.go: `f.App.On("GetRelayers").Return(&chainlinkmocks.FakeRelayerChainInteroperators{Relayers: []loop.Relayer{ testutils.MockRelayer{ChainStatus: commontypes.ChainStatus{ ID: chainID.String(), Enabled: *chain.Enabled, Config: chainConfToml, }}, }})` $DIR/core/web/resolver/chain_test.go: `f.App.On("GetRelayers").Return(&chainlinkmocks.FakeRelayerChainInteroperators{Relayers: []loop.Relayer{}})` $DIR/core/web/resolver/chain_test.go: `f.App.On("EVMORM").Return(f.Mocks.evmORM)` $DIR/core/web/resolver/chain_test.go: `f.Mocks.evmORM.PutChains(evmtoml.EVMConfig{ ChainID: &chainID, Chain: chain, })` $DIR/core/web/resolver/chain_test.go: `f.App.On("EVMORM").Return(f.Mocks.evmORM)` $DIR/core/web/resolver/chain_test.go: `.NewI(1)` $DIR/core/web/resolver/chain_test.go: `.Unmarshal([]byte(configTOML), &chain)` $DIR/core/web/resolver/chain_test.go: `.Marshal(configTOML)` $DIR/core/web/resolver/chain_test.go: `.TOMLString()` $DIR/core/web/resolver/chain_test.go: `.App.On("GetRelayers")` $DIR/core/web/resolver/chain_test.go: `.Return(&chainlinkmocks.FakeRelayerChainInteroperators{Relayers: []loop.Relayer{ testutils.MockRelayer{ChainStatus: commontypes.ChainStatus{ ID: chainID.String(), Enabled: *chain.Enabled, Config: chainConfToml, }}, }})` $DIR/core/web/resolver/chain_test.go: `.String()` $DIR/core/web/resolver/chain_test.go: `.Sprintf(` { "chains": { "results": [{ "id": "1", "enabled": true, "config": %s }], "metadata": { "total": 1 } } }`, configTOMLEscaped)` $DIR/core/web/resolver/chain_test.go: `.App.On("GetRelayers")` $DIR/core/web/resolver/chain_test.go: `.Return(&chainlinkmocks.FakeRelayerChainInteroperators{Relayers: []loop.Relayer{}})` $DIR/core/web/resolver/chain_test.go: `.NewI(1)` $DIR/core/web/resolver/chain_test.go: `.Unmarshal([]byte(configTOML), &chain)` $DIR/core/web/resolver/chain_test.go: `.Marshal(configTOML)` $DIR/core/web/resolver/chain_test.go: `.App.On("EVMORM")` $DIR/core/web/resolver/chain_test.go: `.Return(f.Mocks.evmORM)` $DIR/core/web/resolver/chain_test.go: `.Mocks.evmORM.PutChains(evmtoml.EVMConfig{ ChainID: &chainID, Chain: chain, })` $DIR/core/web/resolver/chain_test.go: `.Sprintf(` { "chain": { "id": "1", "enabled": true, "config": %s } }`, configTOMLEscaped)` $DIR/core/web/resolver/chain_test.go: `.App.On("EVMORM")` $DIR/core/web/resolver/chain_test.go: `.Return(f.Mocks.evmORM)` $DIR/core/web/resolver/config_test.go: `f.App.On("GetConfig").Return(cfg)` $DIR/core/web/resolver/config_test.go: `f.App.On("GetConfig").Return(cfg)` $DIR/core/web/resolver/config_test.go: `f.App.On("GetConfig").Return(cfg)` $DIR/core/web/resolver/config_test.go: `.New()` $DIR/core/web/resolver/config_test.go: `.App.On("GetConfig")` $DIR/core/web/resolver/config_test.go: `.Return(cfg)` $DIR/core/web/resolver/config_test.go: `.Sprintf(`{"configv2":{"user":"","effective":%s}}`, mustJSONMarshal(t, configEmptyEffective))` $DIR/core/web/resolver/config_test.go: `.New()` $DIR/core/web/resolver/config_test.go: `.App.On("GetConfig")` $DIR/core/web/resolver/config_test.go: `.Return(cfg)` $DIR/core/web/resolver/config_test.go: `.Sprintf(`{"configv2":{"user":%s,"effective":%s}}`, mustJSONMarshal(t, configFull), mustJSONMarshal(t, configFull))` $DIR/core/web/resolver/config_test.go: `.New()` $DIR/core/web/resolver/config_test.go: `.App.On("GetConfig")` $DIR/core/web/resolver/config_test.go: `.Return(cfg)` $DIR/core/web/resolver/config_test.go: `.Sprintf(`{"configv2":{"user":%s,"effective":%s}}`, mustJSONMarshal(t, configMulti), mustJSONMarshal(t, configMultiEffective))` $DIR/core/web/resolver/csa_keys_test.go: `fakeKeys = append(fakeKeys, k)` $DIR/core/web/resolver/csa_keys_test.go: `expectedKeys = append(expectedKeys, expectedKey{ ID: k.ID(), Version: k.Version, PubKey: fmt.Sprintf("csa_%s", k.PublicKeyString()), })` $DIR/core/web/resolver/csa_keys_test.go: `f.Mocks.csa.On("GetAll").Return(fakeKeys, nil)` $DIR/core/web/resolver/csa_keys_test.go: `f.Mocks.keystore.On("CSA").Return(f.Mocks.csa)` $DIR/core/web/resolver/csa_keys_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/csa_keys_test.go: `f.Mocks.csa.On("Create", mock.Anything).Return(fakeKey, nil)` $DIR/core/web/resolver/csa_keys_test.go: `f.Mocks.keystore.On("CSA").Return(f.Mocks.csa)` $DIR/core/web/resolver/csa_keys_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/csa_keys_test.go: `f.Mocks.csa.On("Create", mock.Anything).Return(csakey.KeyV2{}, keystore.ErrCSAKeyExists)` $DIR/core/web/resolver/csa_keys_test.go: `f.Mocks.keystore.On("CSA").Return(f.Mocks.csa)` $DIR/core/web/resolver/csa_keys_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/csa_keys_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/csa_keys_test.go: `f.Mocks.keystore.On("CSA").Return(f.Mocks.csa)` $DIR/core/web/resolver/csa_keys_test.go: `f.Mocks.csa.On("Delete", mock.Anything, fakeKey.ID()).Return(fakeKey, nil)` $DIR/core/web/resolver/csa_keys_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/csa_keys_test.go: `f.Mocks.keystore.On("CSA").Return(f.Mocks.csa)` $DIR/core/web/resolver/csa_keys_test.go: `f.Mocks.csa. On("Delete", mock.Anything, fakeKey.ID()). Return(csakey.KeyV2{}, keystore.KeyNotFoundError{ID: fakeKey.ID(), KeyType: "CSA"})` $DIR/core/web/resolver/csa_keys_test.go: `.NewV2()` $DIR/core/web/resolver/csa_keys_test.go: `.ID()` $DIR/core/web/resolver/csa_keys_test.go: `.Sprintf("csa_%s", k.PublicKeyString())` $DIR/core/web/resolver/csa_keys_test.go: `.PublicKeyString()` $DIR/core/web/resolver/csa_keys_test.go: `.Marshal(map[string]interface{}{ "csaKeys": map[string]interface{}{ "results": expectedKeys, }, })` $DIR/core/web/resolver/csa_keys_test.go: `.Mocks.csa.On("GetAll")` $DIR/core/web/resolver/csa_keys_test.go: `.Return(fakeKeys, nil)` $DIR/core/web/resolver/csa_keys_test.go: `.Mocks.keystore.On("CSA")` $DIR/core/web/resolver/csa_keys_test.go: `.Return(f.Mocks.csa)` $DIR/core/web/resolver/csa_keys_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/csa_keys_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/csa_keys_test.go: `.NewV2()` $DIR/core/web/resolver/csa_keys_test.go: `.Mocks.csa.On("Create", mock.Anything)` $DIR/core/web/resolver/csa_keys_test.go: `.Return(fakeKey, nil)` $DIR/core/web/resolver/csa_keys_test.go: `.Mocks.keystore.On("CSA")` $DIR/core/web/resolver/csa_keys_test.go: `.Return(f.Mocks.csa)` $DIR/core/web/resolver/csa_keys_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/csa_keys_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/csa_keys_test.go: `.Sprintf(expected, fakeKey.ID(), fakeKey.Version, fakeKey.PublicKeyString())` $DIR/core/web/resolver/csa_keys_test.go: `.ID()` $DIR/core/web/resolver/csa_keys_test.go: `.PublicKeyString()` $DIR/core/web/resolver/csa_keys_test.go: `.Mocks.csa.On("Create", mock.Anything)` $DIR/core/web/resolver/csa_keys_test.go: `.Return(csakey.KeyV2{}, keystore.ErrCSAKeyExists)` $DIR/core/web/resolver/csa_keys_test.go: `.Mocks.keystore.On("CSA")` $DIR/core/web/resolver/csa_keys_test.go: `.Return(f.Mocks.csa)` $DIR/core/web/resolver/csa_keys_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/csa_keys_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/csa_keys_test.go: `.Sprintf(` { "createCSAKey": { "message": "%s", "code": "UNPROCESSABLE" } }`, keystore.ErrCSAKeyExists.Error())` $DIR/core/web/resolver/csa_keys_test.go: `.NewV2()` $DIR/core/web/resolver/csa_keys_test.go: `.ID()` $DIR/core/web/resolver/csa_keys_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/csa_keys_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/csa_keys_test.go: `.Mocks.keystore.On("CSA")` $DIR/core/web/resolver/csa_keys_test.go: `.Return(f.Mocks.csa)` $DIR/core/web/resolver/csa_keys_test.go: `.Mocks.csa.On("Delete", mock.Anything, fakeKey.ID())` $DIR/core/web/resolver/csa_keys_test.go: `.ID()` $DIR/core/web/resolver/csa_keys_test.go: `.Return(fakeKey, nil)` $DIR/core/web/resolver/csa_keys_test.go: `.Sprintf(expected, fakeKey.ID(), fakeKey.Version, fakeKey.PublicKeyString())` $DIR/core/web/resolver/csa_keys_test.go: `.ID()` $DIR/core/web/resolver/csa_keys_test.go: `.PublicKeyString()` $DIR/core/web/resolver/csa_keys_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/csa_keys_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/csa_keys_test.go: `.Mocks.keystore.On("CSA")` $DIR/core/web/resolver/csa_keys_test.go: `.Return(f.Mocks.csa)` $DIR/core/web/resolver/csa_keys_test.go: `.Mocks.csa. On("Delete", mock.Anything, fakeKey.ID())` $DIR/core/web/resolver/csa_keys_test.go: `.ID()` $DIR/core/web/resolver/csa_keys_test.go: `. Return(csakey.KeyV2{}, keystore.KeyNotFoundError{ID: fakeKey.ID(), KeyType: "CSA"})` $DIR/core/web/resolver/csa_keys_test.go: `.ID()` $DIR/core/web/resolver/csa_keys_test.go: `.Sprintf(` { "deleteCSAKey": { "message": "unable to find CSA key with id %s", "code": "NOT_FOUND" } }`, fakeKey.ID())` $DIR/core/web/resolver/csa_keys_test.go: `.ID()` $DIR/core/web/resolver/eth_key_test.go: `evmMockConfig.gasEstimatorMock.On("PriceMaxKey", mock.Anything).Return(assets.NewWeiI(1))` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.ethKs.On("GetStatesForKeys", mock.Anything, keys).Return(states, nil)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.ethKs.On("Get", mock.Anything, keys[0].Address.Hex()).Return(keys[0], nil)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.ethKs.On("GetAll", mock.Anything).Return(keys, nil)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.ethClient.On("LINKBalance", mock.Anything, address, linkAddr).Return(commonassets.NewLinkFromJuels(12), nil)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.chain.On("Client").Return(f.Mocks.ethClient)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.balM.On("GetEthBalance", address).Return(assets.NewEth(1))` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.chain.On("BalanceMonitor").Return(f.Mocks.balM)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.chain.On("Config").Return(f.Mocks.scfg)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.relayerChainInterops.EVMChains = legacyEVMChains` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.relayerChainInterops.Relayers = []loop.Relayer{ testutils.MockRelayer{ ChainStatus: types.ChainStatus{ ID: "12", Enabled: true, }, NodeStatuses: nil, }, }` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.evmORM.PutChains(toml.EVMConfig{ChainID: &chainID})` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.keystore.On("Eth").Return(f.Mocks.ethKs)` $DIR/core/web/resolver/eth_key_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/eth_key_test.go: `f.App.On("GetRelayers").Return(f.Mocks.relayerChainInterops)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.scfg.On("EVM").Return(&evmMockConfig)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.legacyEVMChains.On("Get", states[0].EVMChainID.String()).Return(nil, evmrelay.ErrNoChains)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.ethKs.On("GetStatesForKeys", mock.Anything, keys).Return(states, nil)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.ethKs.On("Get", mock.Anything, keys[0].Address.Hex()).Return(keys[0], nil)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.ethKs.On("GetAll", mock.Anything).Return(keys, nil)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.relayerChainInterops.EVMChains = f.Mocks.legacyEVMChains` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.evmORM.PutChains(toml.EVMConfig{ChainID: &chainID})` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.relayerChainInterops.Relayers = []loop.Relayer{ testutils.MockRelayer{ ChainStatus: types.ChainStatus{ ID: "12", Enabled: true, }, NodeStatuses: nil, }, }` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.keystore.On("Eth").Return(f.Mocks.ethKs)` $DIR/core/web/resolver/eth_key_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/eth_key_test.go: `f.App.On("GetRelayers").Return(f.Mocks.relayerChainInterops)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.ethKs.On("GetAll", mock.Anything).Return(nil, gError)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.keystore.On("Eth").Return(f.Mocks.ethKs)` $DIR/core/web/resolver/eth_key_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.ethKs.On("GetAll", mock.Anything).Return(keys, nil)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.ethKs.On("GetStatesForKeys", mock.Anything, keys).Return(nil, gError)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.keystore.On("Eth").Return(f.Mocks.ethKs)` $DIR/core/web/resolver/eth_key_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.ethKs.On("GetStatesForKeys", mock.Anything, keys).Return(states, nil)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.ethKs.On("Get", mock.Anything, keys[0].Address.Hex()).Return(ethkey.KeyV2{}, gError)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.ethKs.On("GetAll", mock.Anything).Return(keys, nil)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.keystore.On("Eth").Return(f.Mocks.ethKs)` $DIR/core/web/resolver/eth_key_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.ethKs.On("GetStatesForKeys", mock.Anything, keys).Return(states, nil)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.ethKs.On("Get", mock.Anything, keys[0].Address.Hex()).Return(ethkey.KeyV2{}, nil)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.ethKs.On("GetAll", mock.Anything).Return(keys, nil)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.keystore.On("Eth").Return(f.Mocks.ethKs)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.legacyEVMChains.On("Get", states[0].EVMChainID.String()).Return(f.Mocks.chain, gError)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.relayerChainInterops.EVMChains = f.Mocks.legacyEVMChains` $DIR/core/web/resolver/eth_key_test.go: `f.App.On("GetRelayers").Return(f.Mocks.relayerChainInterops)` $DIR/core/web/resolver/eth_key_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.ethKs.On("GetStatesForKeys", mock.Anything, keys).Return(states, nil)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.ethKs.On("Get", mock.Anything, keys[0].Address.Hex()).Return(keys[0], nil)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.ethKs.On("GetAll", mock.Anything).Return(keys, nil)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.keystore.On("Eth").Return(f.Mocks.ethKs)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.ethClient.On("LINKBalance", mock.Anything, address, linkAddr).Return(commonassets.NewLinkFromJuels(12), gError)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.legacyEVMChains.On("Get", states[0].EVMChainID.String()).Return(f.Mocks.chain, nil)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.relayerChainInterops.EVMChains = f.Mocks.legacyEVMChains` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.relayerChainInterops.Relayers = []loop.Relayer{ testutils.MockRelayer{ ChainStatus: types.ChainStatus{ ID: "12", Enabled: true, }, NodeStatuses: nil, }, }` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.chain.On("Client").Return(f.Mocks.ethClient)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.balM.On("GetEthBalance", address).Return(assets.NewEth(1))` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.chain.On("BalanceMonitor").Return(f.Mocks.balM)` $DIR/core/web/resolver/eth_key_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.chain.On("Config").Return(f.Mocks.scfg)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.evmORM.PutChains(toml.EVMConfig{ChainID: &chainID})` $DIR/core/web/resolver/eth_key_test.go: `f.App.On("GetRelayers").Return(f.Mocks.relayerChainInterops)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.scfg.On("EVM").Return(&evmMockConfig)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.ethKs.On("GetStatesForKeys", mock.Anything, keys).Return(states, nil)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.ethKs.On("Get", mock.Anything, keys[0].Address.Hex()).Return(keys[0], nil)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.ethKs.On("GetAll", mock.Anything).Return(keys, nil)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.ethClient.On("LINKBalance", mock.Anything, address, linkAddr).Return(commonassets.NewLinkFromJuels(12), nil)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.chain.On("Client").Return(f.Mocks.ethClient)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.chain.On("BalanceMonitor").Return(nil)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.chain.On("Config").Return(f.Mocks.scfg)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.legacyEVMChains.On("Get", states[0].EVMChainID.String()).Return(f.Mocks.chain, nil)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.relayerChainInterops.EVMChains = f.Mocks.legacyEVMChains` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.evmORM.PutChains(toml.EVMConfig{ChainID: &chainID})` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.relayerChainInterops.Relayers = []loop.Relayer{ testutils.MockRelayer{ ChainStatus: types.ChainStatus{ ID: "12", Enabled: true, }, NodeStatuses: nil, }, }` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.keystore.On("Eth").Return(f.Mocks.ethKs)` $DIR/core/web/resolver/eth_key_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/eth_key_test.go: `f.App.On("GetRelayers").Return(f.Mocks.relayerChainInterops)` $DIR/core/web/resolver/eth_key_test.go: `f.Mocks.scfg.On("EVM").Return(&evmMockConfig)` $DIR/core/web/resolver/eth_key_test.go: `.HexToAddress("0x5431F5F973781809D18643b87B44921b11355d81")` $DIR/core/web/resolver/eth_key_test.go: `.HexToAddress("0x1438087186fdbfd4c256fa2df446921e30e54df8")` $DIR/core/web/resolver/eth_key_test.go: `.EIP55AddressFromAddress(address)` $DIR/core/web/resolver/eth_key_test.go: `.EIP55AddressFromAddress(secondAddress)` $DIR/core/web/resolver/eth_key_test.go: `.New("error")` $DIR/core/web/resolver/eth_key_test.go: `.NewGasEstimator(t)` $DIR/core/web/resolver/eth_key_test.go: `.gasEstimatorMock.On("PriceMaxKey", mock.Anything)` $DIR/core/web/resolver/eth_key_test.go: `.Return(assets.NewWeiI(1))` $DIR/core/web/resolver/eth_key_test.go: `.NewWeiI(1)` $DIR/core/web/resolver/eth_key_test.go: `.MustEIP55Address(address.Hex())` $DIR/core/web/resolver/eth_key_test.go: `.Hex()` $DIR/core/web/resolver/eth_key_test.go: `.NewI(12)` $DIR/core/web/resolver/eth_key_test.go: `.Timestamp()` $DIR/core/web/resolver/eth_key_test.go: `.Timestamp()` $DIR/core/web/resolver/eth_key_test.go: `.NewI(12)` $DIR/core/web/resolver/eth_key_test.go: `.HexToAddress("0x5431F5F973781809D18643b87B44921b11355d81")` $DIR/core/web/resolver/eth_key_test.go: `.NewGeneralConfig(t, nil)` $DIR/core/web/resolver/eth_key_test.go: `.EVMChainID.String()` $DIR/core/web/resolver/eth_key_test.go: `.NewLegacyChains(m, cfg.EVMConfigs())` $DIR/core/web/resolver/eth_key_test.go: `.EVMConfigs()` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.ethKs.On("GetStatesForKeys", mock.Anything, keys)` $DIR/core/web/resolver/eth_key_test.go: `.Return(states, nil)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.ethKs.On("Get", mock.Anything, keys[0].Address.Hex())` $DIR/core/web/resolver/eth_key_test.go: `.Address.Hex()` $DIR/core/web/resolver/eth_key_test.go: `.Return(keys[0], nil)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.ethKs.On("GetAll", mock.Anything)` $DIR/core/web/resolver/eth_key_test.go: `.Return(keys, nil)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.ethClient.On("LINKBalance", mock.Anything, address, linkAddr)` $DIR/core/web/resolver/eth_key_test.go: `.Return(commonassets.NewLinkFromJuels(12), nil)` $DIR/core/web/resolver/eth_key_test.go: `.NewLinkFromJuels(12)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.chain.On("Client")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.ethClient)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.balM.On("GetEthBalance", address)` $DIR/core/web/resolver/eth_key_test.go: `.Return(assets.NewEth(1))` $DIR/core/web/resolver/eth_key_test.go: `.NewEth(1)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.chain.On("BalanceMonitor")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.balM)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.chain.On("Config")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.scfg)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.evmORM.PutChains(toml.EVMConfig{ChainID: &chainID})` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.keystore.On("Eth")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.ethKs)` $DIR/core/web/resolver/eth_key_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/eth_key_test.go: `.App.On("GetRelayers")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.relayerChainInterops)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.scfg.On("EVM")` $DIR/core/web/resolver/eth_key_test.go: `.Return(&evmMockConfig)` $DIR/core/web/resolver/eth_key_test.go: `.MustEIP55Address(address.Hex())` $DIR/core/web/resolver/eth_key_test.go: `.Hex()` $DIR/core/web/resolver/eth_key_test.go: `.NewI(12)` $DIR/core/web/resolver/eth_key_test.go: `.Timestamp()` $DIR/core/web/resolver/eth_key_test.go: `.Timestamp()` $DIR/core/web/resolver/eth_key_test.go: `.NewI(12)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.legacyEVMChains.On("Get", states[0].EVMChainID.String())` $DIR/core/web/resolver/eth_key_test.go: `.EVMChainID.String()` $DIR/core/web/resolver/eth_key_test.go: `.Return(nil, evmrelay.ErrNoChains)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.ethKs.On("GetStatesForKeys", mock.Anything, keys)` $DIR/core/web/resolver/eth_key_test.go: `.Return(states, nil)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.ethKs.On("Get", mock.Anything, keys[0].Address.Hex())` $DIR/core/web/resolver/eth_key_test.go: `.Address.Hex()` $DIR/core/web/resolver/eth_key_test.go: `.Return(keys[0], nil)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.ethKs.On("GetAll", mock.Anything)` $DIR/core/web/resolver/eth_key_test.go: `.Return(keys, nil)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.evmORM.PutChains(toml.EVMConfig{ChainID: &chainID})` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.keystore.On("Eth")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.ethKs)` $DIR/core/web/resolver/eth_key_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/eth_key_test.go: `.App.On("GetRelayers")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.relayerChainInterops)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.ethKs.On("GetAll", mock.Anything)` $DIR/core/web/resolver/eth_key_test.go: `.Return(nil, gError)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.keystore.On("Eth")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.ethKs)` $DIR/core/web/resolver/eth_key_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.ethKs.On("GetAll", mock.Anything)` $DIR/core/web/resolver/eth_key_test.go: `.Return(keys, nil)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.ethKs.On("GetStatesForKeys", mock.Anything, keys)` $DIR/core/web/resolver/eth_key_test.go: `.Return(nil, gError)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.keystore.On("Eth")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.ethKs)` $DIR/core/web/resolver/eth_key_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/eth_key_test.go: `.MustEIP55Address(address.Hex())` $DIR/core/web/resolver/eth_key_test.go: `.Hex()` $DIR/core/web/resolver/eth_key_test.go: `.NewI(12)` $DIR/core/web/resolver/eth_key_test.go: `.Timestamp()` $DIR/core/web/resolver/eth_key_test.go: `.Timestamp()` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.ethKs.On("GetStatesForKeys", mock.Anything, keys)` $DIR/core/web/resolver/eth_key_test.go: `.Return(states, nil)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.ethKs.On("Get", mock.Anything, keys[0].Address.Hex())` $DIR/core/web/resolver/eth_key_test.go: `.Address.Hex()` $DIR/core/web/resolver/eth_key_test.go: `.Return(ethkey.KeyV2{}, gError)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.ethKs.On("GetAll", mock.Anything)` $DIR/core/web/resolver/eth_key_test.go: `.Return(keys, nil)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.keystore.On("Eth")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.ethKs)` $DIR/core/web/resolver/eth_key_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/eth_key_test.go: `.MustEIP55Address(address.Hex())` $DIR/core/web/resolver/eth_key_test.go: `.Hex()` $DIR/core/web/resolver/eth_key_test.go: `.NewI(12)` $DIR/core/web/resolver/eth_key_test.go: `.Timestamp()` $DIR/core/web/resolver/eth_key_test.go: `.Timestamp()` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.ethKs.On("GetStatesForKeys", mock.Anything, keys)` $DIR/core/web/resolver/eth_key_test.go: `.Return(states, nil)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.ethKs.On("Get", mock.Anything, keys[0].Address.Hex())` $DIR/core/web/resolver/eth_key_test.go: `.Address.Hex()` $DIR/core/web/resolver/eth_key_test.go: `.Return(ethkey.KeyV2{}, nil)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.ethKs.On("GetAll", mock.Anything)` $DIR/core/web/resolver/eth_key_test.go: `.Return(keys, nil)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.keystore.On("Eth")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.ethKs)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.legacyEVMChains.On("Get", states[0].EVMChainID.String())` $DIR/core/web/resolver/eth_key_test.go: `.EVMChainID.String()` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.chain, gError)` $DIR/core/web/resolver/eth_key_test.go: `.App.On("GetRelayers")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.relayerChainInterops)` $DIR/core/web/resolver/eth_key_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/eth_key_test.go: `.MustEIP55Address(address.Hex())` $DIR/core/web/resolver/eth_key_test.go: `.Hex()` $DIR/core/web/resolver/eth_key_test.go: `.NewI(12)` $DIR/core/web/resolver/eth_key_test.go: `.Timestamp()` $DIR/core/web/resolver/eth_key_test.go: `.Timestamp()` $DIR/core/web/resolver/eth_key_test.go: `.NewI(12)` $DIR/core/web/resolver/eth_key_test.go: `.HexToAddress("0x5431F5F973781809D18643b87B44921b11355d81")` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.ethKs.On("GetStatesForKeys", mock.Anything, keys)` $DIR/core/web/resolver/eth_key_test.go: `.Return(states, nil)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.ethKs.On("Get", mock.Anything, keys[0].Address.Hex())` $DIR/core/web/resolver/eth_key_test.go: `.Address.Hex()` $DIR/core/web/resolver/eth_key_test.go: `.Return(keys[0], nil)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.ethKs.On("GetAll", mock.Anything)` $DIR/core/web/resolver/eth_key_test.go: `.Return(keys, nil)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.keystore.On("Eth")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.ethKs)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.ethClient.On("LINKBalance", mock.Anything, address, linkAddr)` $DIR/core/web/resolver/eth_key_test.go: `.Return(commonassets.NewLinkFromJuels(12), gError)` $DIR/core/web/resolver/eth_key_test.go: `.NewLinkFromJuels(12)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.legacyEVMChains.On("Get", states[0].EVMChainID.String())` $DIR/core/web/resolver/eth_key_test.go: `.EVMChainID.String()` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.chain, nil)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.chain.On("Client")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.ethClient)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.balM.On("GetEthBalance", address)` $DIR/core/web/resolver/eth_key_test.go: `.Return(assets.NewEth(1))` $DIR/core/web/resolver/eth_key_test.go: `.NewEth(1)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.chain.On("BalanceMonitor")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.balM)` $DIR/core/web/resolver/eth_key_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.chain.On("Config")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.scfg)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.evmORM.PutChains(toml.EVMConfig{ChainID: &chainID})` $DIR/core/web/resolver/eth_key_test.go: `.App.On("GetRelayers")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.relayerChainInterops)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.scfg.On("EVM")` $DIR/core/web/resolver/eth_key_test.go: `.Return(&evmMockConfig)` $DIR/core/web/resolver/eth_key_test.go: `.EIP55AddressFromAddress(address)` $DIR/core/web/resolver/eth_key_test.go: `.NewI(12)` $DIR/core/web/resolver/eth_key_test.go: `.Timestamp()` $DIR/core/web/resolver/eth_key_test.go: `.Timestamp()` $DIR/core/web/resolver/eth_key_test.go: `.NewI(12)` $DIR/core/web/resolver/eth_key_test.go: `.HexToAddress("0x5431F5F973781809D18643b87B44921b11355d81")` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.ethKs.On("GetStatesForKeys", mock.Anything, keys)` $DIR/core/web/resolver/eth_key_test.go: `.Return(states, nil)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.ethKs.On("Get", mock.Anything, keys[0].Address.Hex())` $DIR/core/web/resolver/eth_key_test.go: `.Address.Hex()` $DIR/core/web/resolver/eth_key_test.go: `.Return(keys[0], nil)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.ethKs.On("GetAll", mock.Anything)` $DIR/core/web/resolver/eth_key_test.go: `.Return(keys, nil)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.ethClient.On("LINKBalance", mock.Anything, address, linkAddr)` $DIR/core/web/resolver/eth_key_test.go: `.Return(commonassets.NewLinkFromJuels(12), nil)` $DIR/core/web/resolver/eth_key_test.go: `.NewLinkFromJuels(12)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.chain.On("Client")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.ethClient)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.chain.On("BalanceMonitor")` $DIR/core/web/resolver/eth_key_test.go: `.Return(nil)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.chain.On("Config")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.scfg)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.legacyEVMChains.On("Get", states[0].EVMChainID.String())` $DIR/core/web/resolver/eth_key_test.go: `.EVMChainID.String()` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.chain, nil)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.evmORM.PutChains(toml.EVMConfig{ChainID: &chainID})` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.keystore.On("Eth")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.ethKs)` $DIR/core/web/resolver/eth_key_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/eth_key_test.go: `.App.On("GetRelayers")` $DIR/core/web/resolver/eth_key_test.go: `.Return(f.Mocks.relayerChainInterops)` $DIR/core/web/resolver/eth_key_test.go: `.Mocks.scfg.On("EVM")` $DIR/core/web/resolver/eth_key_test.go: `.Return(&evmMockConfig)` $DIR/core/web/resolver/eth_transaction_test.go: `f.Mocks.txmStore.On("FindTxByHash", mock.Anything, hash).Return(&txmgr.Tx{ ID: 1, ToAddress: common.HexToAddress("0x5431F5F973781809D18643b87B44921b11355d81"), FromAddress: common.HexToAddress("0x5431F5F973781809D18643b87B44921b11355d81"), State: txmgrcommon.TxInProgress, EncodedPayload: []byte("encoded payload"), FeeLimit: 100, Value: big.Int(assets.NewEthValue(100)), ChainID: big.NewInt(22), Sequence: nil, }, nil)` $DIR/core/web/resolver/eth_transaction_test.go: `f.Mocks.txmStore.On("FindTxAttemptConfirmedByTxIDs", mock.Anything, []int64{1}).Return([]txmgr.TxAttempt{ { TxID: 1, Hash: hash, TxFee: gas.EvmFee{Legacy: assets.NewWeiI(12)}, SignedRawTx: []byte("something"), BroadcastBeforeBlockNum: nil, }, }, nil)` $DIR/core/web/resolver/eth_transaction_test.go: `f.App.On("TxmStorageService").Return(f.Mocks.txmStore)` $DIR/core/web/resolver/eth_transaction_test.go: `f.Mocks.evmORM.PutChains(toml.EVMConfig{ChainID: &chainID})` $DIR/core/web/resolver/eth_transaction_test.go: `f.App.On("GetRelayers").Return(&chainlinkmocks.FakeRelayerChainInteroperators{ Relayers: []loop.Relayer{ testutils.MockRelayer{ChainStatus: types.ChainStatus{ ID: "22", Enabled: true, Config: "", }}, }, })` $DIR/core/web/resolver/eth_transaction_test.go: `f.Mocks.txmStore.On("FindTxByHash", mock.Anything, hash).Return(&txmgr.Tx{ ID: 1, ToAddress: common.HexToAddress("0x5431F5F973781809D18643b87B44921b11355d81"), FromAddress: common.HexToAddress("0x5431F5F973781809D18643b87B44921b11355d81"), State: txmgrcommon.TxInProgress, EncodedPayload: []byte("encoded payload"), FeeLimit: 100, Value: big.Int(assets.NewEthValue(100)), ChainID: big.NewInt(22), Sequence: &nonce, }, nil)` $DIR/core/web/resolver/eth_transaction_test.go: `f.Mocks.txmStore.On("FindTxAttemptConfirmedByTxIDs", mock.Anything, []int64{1}).Return([]txmgr.TxAttempt{ { TxID: 1, Hash: hash, TxFee: gas.EvmFee{Legacy: assets.NewWeiI(12)}, SignedRawTx: []byte("something"), BroadcastBeforeBlockNum: &num, }, }, nil)` $DIR/core/web/resolver/eth_transaction_test.go: `f.App.On("TxmStorageService").Return(f.Mocks.txmStore)` $DIR/core/web/resolver/eth_transaction_test.go: `f.Mocks.evmORM.PutChains(toml.EVMConfig{ChainID: &chainID})` $DIR/core/web/resolver/eth_transaction_test.go: `f.App.On("GetRelayers").Return(&chainlinkmocks.FakeRelayerChainInteroperators{ Relayers: []loop.Relayer{ testutils.MockRelayer{ChainStatus: types.ChainStatus{ ID: "22", Enabled: true, Config: "", }}, }, })` $DIR/core/web/resolver/eth_transaction_test.go: `f.Mocks.txmStore.On("FindTxByHash", mock.Anything, hash).Return(nil, sql.ErrNoRows)` $DIR/core/web/resolver/eth_transaction_test.go: `f.App.On("TxmStorageService").Return(f.Mocks.txmStore)` $DIR/core/web/resolver/eth_transaction_test.go: `f.Mocks.txmStore.On("FindTxByHash", mock.Anything, hash).Return(nil, gError)` $DIR/core/web/resolver/eth_transaction_test.go: `f.App.On("TxmStorageService").Return(f.Mocks.txmStore)` $DIR/core/web/resolver/eth_transaction_test.go: `f.Mocks.txmStore.On("Transactions", mock.Anything, PageDefaultOffset, PageDefaultLimit).Return([]txmgr.Tx{ { ID: 1, ToAddress: common.HexToAddress("0x5431F5F973781809D18643b87B44921b11355d81"), FromAddress: common.HexToAddress("0x5431F5F973781809D18643b87B44921b11355d81"), State: txmgrcommon.TxInProgress, EncodedPayload: []byte("encoded payload"), FeeLimit: 100, Value: big.Int(assets.NewEthValue(100)), ChainID: big.NewInt(22), }, }, 1, nil)` $DIR/core/web/resolver/eth_transaction_test.go: `f.Mocks.txmStore.On("FindTxAttemptConfirmedByTxIDs", mock.Anything, []int64{1}).Return([]txmgr.TxAttempt{ { TxID: 1, Hash: hash, TxFee: gas.EvmFee{Legacy: assets.NewWeiI(12)}, SignedRawTx: []byte("something"), BroadcastBeforeBlockNum: &num, }, }, nil)` $DIR/core/web/resolver/eth_transaction_test.go: `f.App.On("TxmStorageService").Return(f.Mocks.txmStore)` $DIR/core/web/resolver/eth_transaction_test.go: `f.Mocks.txmStore.On("Transactions", mock.Anything, PageDefaultOffset, PageDefaultLimit).Return(nil, 0, gError)` $DIR/core/web/resolver/eth_transaction_test.go: `f.App.On("TxmStorageService").Return(f.Mocks.txmStore)` $DIR/core/web/resolver/eth_transaction_test.go: `f.Mocks.txmStore.On("TxAttempts", mock.Anything, PageDefaultOffset, PageDefaultLimit).Return([]txmgr.TxAttempt{ { Hash: hash, TxFee: gas.EvmFee{Legacy: assets.NewWeiI(12)}, SignedRawTx: []byte("something"), BroadcastBeforeBlockNum: &num, Tx: txmgr.Tx{}, }, }, 1, nil)` $DIR/core/web/resolver/eth_transaction_test.go: `f.App.On("TxmStorageService").Return(f.Mocks.txmStore)` $DIR/core/web/resolver/eth_transaction_test.go: `f.Mocks.txmStore.On("TxAttempts", mock.Anything, PageDefaultOffset, PageDefaultLimit).Return([]txmgr.TxAttempt{ { Hash: hash, TxFee: gas.EvmFee{Legacy: assets.NewWeiI(12)}, SignedRawTx: []byte("something"), BroadcastBeforeBlockNum: nil, }, }, 1, nil)` $DIR/core/web/resolver/eth_transaction_test.go: `f.App.On("TxmStorageService").Return(f.Mocks.txmStore)` $DIR/core/web/resolver/eth_transaction_test.go: `f.Mocks.txmStore.On("TxAttempts", mock.Anything, PageDefaultOffset, PageDefaultLimit).Return(nil, 0, gError)` $DIR/core/web/resolver/eth_transaction_test.go: `f.App.On("TxmStorageService").Return(f.Mocks.txmStore)` $DIR/core/web/resolver/eth_transaction_test.go: `.HexToHash("0x5431F5F973781809D18643b87B44921b11355d81")` $DIR/core/web/resolver/eth_transaction_test.go: `.NewI(22)` $DIR/core/web/resolver/eth_transaction_test.go: `.New("error")` $DIR/core/web/resolver/eth_transaction_test.go: `.Mocks.txmStore.On("FindTxByHash", mock.Anything, hash)` $DIR/core/web/resolver/eth_transaction_test.go: `.Return(&txmgr.Tx{ ID: 1, ToAddress: common.HexToAddress("0x5431F5F973781809D18643b87B44921b11355d81"), FromAddress: common.HexToAddress("0x5431F5F973781809D18643b87B44921b11355d81"), State: txmgrcommon.TxInProgress, EncodedPayload: []byte("encoded payload"), FeeLimit: 100, Value: big.Int(assets.NewEthValue(100)), ChainID: big.NewInt(22), Sequence: nil, }, nil)` $DIR/core/web/resolver/eth_transaction_test.go: `.HexToAddress("0x5431F5F973781809D18643b87B44921b11355d81")` $DIR/core/web/resolver/eth_transaction_test.go: `.HexToAddress("0x5431F5F973781809D18643b87B44921b11355d81")` $DIR/core/web/resolver/eth_transaction_test.go: `.Int(assets.NewEthValue(100))` $DIR/core/web/resolver/eth_transaction_test.go: `.NewEthValue(100)` $DIR/core/web/resolver/eth_transaction_test.go: `.NewInt(22)` $DIR/core/web/resolver/eth_transaction_test.go: `.Mocks.txmStore.On("FindTxAttemptConfirmedByTxIDs", mock.Anything, []int64{1})` $DIR/core/web/resolver/eth_transaction_test.go: `.Return([]txmgr.TxAttempt{ { TxID: 1, Hash: hash, TxFee: gas.EvmFee{Legacy: assets.NewWeiI(12)}, SignedRawTx: []byte("something"), BroadcastBeforeBlockNum: nil, }, }, nil)` $DIR/core/web/resolver/eth_transaction_test.go: `.NewWeiI(12)` $DIR/core/web/resolver/eth_transaction_test.go: `.App.On("TxmStorageService")` $DIR/core/web/resolver/eth_transaction_test.go: `.Return(f.Mocks.txmStore)` $DIR/core/web/resolver/eth_transaction_test.go: `.Mocks.evmORM.PutChains(toml.EVMConfig{ChainID: &chainID})` $DIR/core/web/resolver/eth_transaction_test.go: `.App.On("GetRelayers")` $DIR/core/web/resolver/eth_transaction_test.go: `.Return(&chainlinkmocks.FakeRelayerChainInteroperators{ Relayers: []loop.Relayer{ testutils.MockRelayer{ChainStatus: types.ChainStatus{ ID: "22", Enabled: true, Config: "", }}, }, })` $DIR/core/web/resolver/eth_transaction_test.go: `.Nonce(num)` $DIR/core/web/resolver/eth_transaction_test.go: `.Mocks.txmStore.On("FindTxByHash", mock.Anything, hash)` $DIR/core/web/resolver/eth_transaction_test.go: `.Return(&txmgr.Tx{ ID: 1, ToAddress: common.HexToAddress("0x5431F5F973781809D18643b87B44921b11355d81"), FromAddress: common.HexToAddress("0x5431F5F973781809D18643b87B44921b11355d81"), State: txmgrcommon.TxInProgress, EncodedPayload: []byte("encoded payload"), FeeLimit: 100, Value: big.Int(assets.NewEthValue(100)), ChainID: big.NewInt(22), Sequence: &nonce, }, nil)` $DIR/core/web/resolver/eth_transaction_test.go: `.HexToAddress("0x5431F5F973781809D18643b87B44921b11355d81")` $DIR/core/web/resolver/eth_transaction_test.go: `.HexToAddress("0x5431F5F973781809D18643b87B44921b11355d81")` $DIR/core/web/resolver/eth_transaction_test.go: `.Int(assets.NewEthValue(100))` $DIR/core/web/resolver/eth_transaction_test.go: `.NewEthValue(100)` $DIR/core/web/resolver/eth_transaction_test.go: `.NewInt(22)` $DIR/core/web/resolver/eth_transaction_test.go: `.Mocks.txmStore.On("FindTxAttemptConfirmedByTxIDs", mock.Anything, []int64{1})` $DIR/core/web/resolver/eth_transaction_test.go: `.Return([]txmgr.TxAttempt{ { TxID: 1, Hash: hash, TxFee: gas.EvmFee{Legacy: assets.NewWeiI(12)}, SignedRawTx: []byte("something"), BroadcastBeforeBlockNum: &num, }, }, nil)` $DIR/core/web/resolver/eth_transaction_test.go: `.NewWeiI(12)` $DIR/core/web/resolver/eth_transaction_test.go: `.App.On("TxmStorageService")` $DIR/core/web/resolver/eth_transaction_test.go: `.Return(f.Mocks.txmStore)` $DIR/core/web/resolver/eth_transaction_test.go: `.Mocks.evmORM.PutChains(toml.EVMConfig{ChainID: &chainID})` $DIR/core/web/resolver/eth_transaction_test.go: `.App.On("GetRelayers")` $DIR/core/web/resolver/eth_transaction_test.go: `.Return(&chainlinkmocks.FakeRelayerChainInteroperators{ Relayers: []loop.Relayer{ testutils.MockRelayer{ChainStatus: types.ChainStatus{ ID: "22", Enabled: true, Config: "", }}, }, })` $DIR/core/web/resolver/eth_transaction_test.go: `.Mocks.txmStore.On("FindTxByHash", mock.Anything, hash)` $DIR/core/web/resolver/eth_transaction_test.go: `.Return(nil, sql.ErrNoRows)` $DIR/core/web/resolver/eth_transaction_test.go: `.App.On("TxmStorageService")` $DIR/core/web/resolver/eth_transaction_test.go: `.Return(f.Mocks.txmStore)` $DIR/core/web/resolver/eth_transaction_test.go: `.Mocks.txmStore.On("FindTxByHash", mock.Anything, hash)` $DIR/core/web/resolver/eth_transaction_test.go: `.Return(nil, gError)` $DIR/core/web/resolver/eth_transaction_test.go: `.App.On("TxmStorageService")` $DIR/core/web/resolver/eth_transaction_test.go: `.Return(f.Mocks.txmStore)` $DIR/core/web/resolver/eth_transaction_test.go: `.HexToHash("0x5431F5F973781809D18643b87B44921b11355d81")` $DIR/core/web/resolver/eth_transaction_test.go: `.New("error")` $DIR/core/web/resolver/eth_transaction_test.go: `.Mocks.txmStore.On("Transactions", mock.Anything, PageDefaultOffset, PageDefaultLimit)` $DIR/core/web/resolver/eth_transaction_test.go: `.Return([]txmgr.Tx{ { ID: 1, ToAddress: common.HexToAddress("0x5431F5F973781809D18643b87B44921b11355d81"), FromAddress: common.HexToAddress("0x5431F5F973781809D18643b87B44921b11355d81"), State: txmgrcommon.TxInProgress, EncodedPayload: []byte("encoded payload"), FeeLimit: 100, Value: big.Int(assets.NewEthValue(100)), ChainID: big.NewInt(22), }, }, 1, nil)` $DIR/core/web/resolver/eth_transaction_test.go: `.HexToAddress("0x5431F5F973781809D18643b87B44921b11355d81")` $DIR/core/web/resolver/eth_transaction_test.go: `.HexToAddress("0x5431F5F973781809D18643b87B44921b11355d81")` $DIR/core/web/resolver/eth_transaction_test.go: `.Int(assets.NewEthValue(100))` $DIR/core/web/resolver/eth_transaction_test.go: `.NewEthValue(100)` $DIR/core/web/resolver/eth_transaction_test.go: `.NewInt(22)` $DIR/core/web/resolver/eth_transaction_test.go: `.Mocks.txmStore.On("FindTxAttemptConfirmedByTxIDs", mock.Anything, []int64{1})` $DIR/core/web/resolver/eth_transaction_test.go: `.Return([]txmgr.TxAttempt{ { TxID: 1, Hash: hash, TxFee: gas.EvmFee{Legacy: assets.NewWeiI(12)}, SignedRawTx: []byte("something"), BroadcastBeforeBlockNum: &num, }, }, nil)` $DIR/core/web/resolver/eth_transaction_test.go: `.NewWeiI(12)` $DIR/core/web/resolver/eth_transaction_test.go: `.App.On("TxmStorageService")` $DIR/core/web/resolver/eth_transaction_test.go: `.Return(f.Mocks.txmStore)` $DIR/core/web/resolver/eth_transaction_test.go: `.Mocks.txmStore.On("Transactions", mock.Anything, PageDefaultOffset, PageDefaultLimit)` $DIR/core/web/resolver/eth_transaction_test.go: `.Return(nil, 0, gError)` $DIR/core/web/resolver/eth_transaction_test.go: `.App.On("TxmStorageService")` $DIR/core/web/resolver/eth_transaction_test.go: `.Return(f.Mocks.txmStore)` $DIR/core/web/resolver/eth_transaction_test.go: `.HexToHash("0x5431F5F973781809D18643b87B44921b11355d81")` $DIR/core/web/resolver/eth_transaction_test.go: `.New("error")` $DIR/core/web/resolver/eth_transaction_test.go: `.Mocks.txmStore.On("TxAttempts", mock.Anything, PageDefaultOffset, PageDefaultLimit)` $DIR/core/web/resolver/eth_transaction_test.go: `.Return([]txmgr.TxAttempt{ { Hash: hash, TxFee: gas.EvmFee{Legacy: assets.NewWeiI(12)}, SignedRawTx: []byte("something"), BroadcastBeforeBlockNum: &num, Tx: txmgr.Tx{}, }, }, 1, nil)` $DIR/core/web/resolver/eth_transaction_test.go: `.NewWeiI(12)` $DIR/core/web/resolver/eth_transaction_test.go: `.App.On("TxmStorageService")` $DIR/core/web/resolver/eth_transaction_test.go: `.Return(f.Mocks.txmStore)` $DIR/core/web/resolver/eth_transaction_test.go: `.Mocks.txmStore.On("TxAttempts", mock.Anything, PageDefaultOffset, PageDefaultLimit)` $DIR/core/web/resolver/eth_transaction_test.go: `.Return([]txmgr.TxAttempt{ { Hash: hash, TxFee: gas.EvmFee{Legacy: assets.NewWeiI(12)}, SignedRawTx: []byte("something"), BroadcastBeforeBlockNum: nil, }, }, 1, nil)` $DIR/core/web/resolver/eth_transaction_test.go: `.NewWeiI(12)` $DIR/core/web/resolver/eth_transaction_test.go: `.App.On("TxmStorageService")` $DIR/core/web/resolver/eth_transaction_test.go: `.Return(f.Mocks.txmStore)` $DIR/core/web/resolver/eth_transaction_test.go: `.Mocks.txmStore.On("TxAttempts", mock.Anything, PageDefaultOffset, PageDefaultLimit)` $DIR/core/web/resolver/eth_transaction_test.go: `.Return(nil, 0, gError)` $DIR/core/web/resolver/eth_transaction_test.go: `.App.On("TxmStorageService")` $DIR/core/web/resolver/eth_transaction_test.go: `.Return(f.Mocks.txmStore)` $DIR/core/web/resolver/features_test.go: `f.App.On("GetConfig").Return(configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { t, f := true, false c.Feature.UICSAKeys = &f c.Feature.FeedsManager = &t }))` $DIR/core/web/resolver/features_test.go: `c.Feature.UICSAKeys = &f` $DIR/core/web/resolver/features_test.go: `c.Feature.FeedsManager = &t` $DIR/core/web/resolver/features_test.go: `.App.On("GetConfig")` $DIR/core/web/resolver/features_test.go: `.Return(configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { t, f := true, false c.Feature.UICSAKeys = &f c.Feature.FeedsManager = &t }))` $DIR/core/web/resolver/features_test.go: `.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { t, f := true, false c.Feature.UICSAKeys = &f c.Feature.FeedsManager = &t })` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `f.Mocks.feedsSvc.On("CreateChainConfig", mock.Anything, feeds.ChainConfig{ FeedsManagerID: mgrID, ChainType: feeds.ChainTypeEVM, ChainID: chainID, AccountAddress: accountAddr, AccountAddressPublicKey: null.StringFrom(acctAddrPubKey), AdminAddress: adminAddr, FluxMonitorConfig: feeds.FluxMonitorConfig{ Enabled: false, }, OCR1Config: feeds.OCR1Config{ Enabled: true, P2PPeerID: peerID, KeyBundleID: keyBundleID, }, OCR2Config: feeds.OCR2ConfigModel{ Enabled: true, P2PPeerID: peerID, KeyBundleID: keyBundleID, ForwarderAddress: null.StringFrom(forwarderAddr), Plugins: feeds.Plugins{ Commit: true, Execute: true, Median: false, Mercury: true, Rebalancer: true, }, }, }).Return(cfgID, nil)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `f.Mocks.feedsSvc.On("GetChainConfig", mock.Anything, cfgID).Return(&feeds.ChainConfig{ ID: cfgID, ChainType: feeds.ChainTypeEVM, ChainID: chainID, AccountAddress: accountAddr, AccountAddressPublicKey: null.StringFrom(acctAddrPubKey), AdminAddress: adminAddr, FluxMonitorConfig: feeds.FluxMonitorConfig{ Enabled: false, }, OCR1Config: feeds.OCR1Config{ Enabled: true, P2PPeerID: peerID, KeyBundleID: keyBundleID, }, OCR2Config: feeds.OCR2ConfigModel{ Enabled: true, P2PPeerID: peerID, KeyBundleID: keyBundleID, ForwarderAddress: null.StringFrom(forwarderAddr), Plugins: feeds.Plugins{ Commit: true, Execute: true, Median: false, Mercury: true, Rebalancer: true, }, }, }, nil)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `f.Mocks.feedsSvc.On("CreateChainConfig", mock.Anything, mock.IsType(feeds.ChainConfig{})).Return(int64(0), sql.ErrNoRows)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `f.Mocks.feedsSvc.On("CreateChainConfig", mock.Anything, mock.IsType(feeds.ChainConfig{})).Return(cfgID, nil)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `f.Mocks.feedsSvc.On("GetChainConfig", mock.Anything, cfgID).Return(nil, sql.ErrNoRows)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `f.Mocks.feedsSvc.On("GetChainConfig", mock.Anything, cfgID).Return(&feeds.ChainConfig{ ID: cfgID, }, nil)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `f.Mocks.feedsSvc.On("DeleteChainConfig", mock.Anything, cfgID).Return(cfgID, nil)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `f.Mocks.feedsSvc.On("GetChainConfig", mock.Anything, cfgID).Return(nil, sql.ErrNoRows)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `f.Mocks.feedsSvc.On("GetChainConfig", mock.Anything, cfgID).Return(&feeds.ChainConfig{ ID: cfgID, }, nil)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `f.Mocks.feedsSvc.On("DeleteChainConfig", mock.Anything, cfgID).Return(int64(0), sql.ErrNoRows)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `f.Mocks.feedsSvc.On("UpdateChainConfig", mock.Anything, feeds.ChainConfig{ ID: cfgID, AccountAddress: accountAddr, AccountAddressPublicKey: null.StringFrom(accountAddrPubKey), AdminAddress: adminAddr, FluxMonitorConfig: feeds.FluxMonitorConfig{ Enabled: false, }, OCR1Config: feeds.OCR1Config{ Enabled: true, P2PPeerID: null.StringFrom(peerID.String), KeyBundleID: null.StringFrom(keyBundleID.String), }, OCR2Config: feeds.OCR2ConfigModel{ Enabled: true, P2PPeerID: peerID, KeyBundleID: keyBundleID, ForwarderAddress: null.StringFrom(forwarderAddr), Plugins: feeds.Plugins{ Commit: true, Execute: true, Median: false, Mercury: true, Rebalancer: true, }, }, }).Return(cfgID, nil)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `f.Mocks.feedsSvc.On("GetChainConfig", mock.Anything, cfgID).Return(&feeds.ChainConfig{ ID: cfgID, AccountAddress: accountAddr, AdminAddress: adminAddr, AccountAddressPublicKey: null.StringFrom(accountAddrPubKey), FluxMonitorConfig: feeds.FluxMonitorConfig{ Enabled: false, }, OCR1Config: feeds.OCR1Config{ Enabled: true, P2PPeerID: null.StringFrom(peerID.String), KeyBundleID: null.StringFrom(keyBundleID.String), }, OCR2Config: feeds.OCR2ConfigModel{ Enabled: true, P2PPeerID: peerID, KeyBundleID: keyBundleID, ForwarderAddress: null.StringFrom(forwarderAddr), Plugins: feeds.Plugins{ Commit: true, Execute: true, Median: false, Mercury: true, Rebalancer: true, }, }, }, nil)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `f.Mocks.feedsSvc.On("UpdateChainConfig", mock.Anything, mock.IsType(feeds.ChainConfig{})).Return(int64(0), sql.ErrNoRows)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `f.Mocks.feedsSvc.On("UpdateChainConfig", mock.Anything, mock.IsType(feeds.ChainConfig{})).Return(cfgID, nil)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `f.Mocks.feedsSvc.On("GetChainConfig", mock.Anything, cfgID).Return(nil, sql.ErrNoRows)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.StringFrom("p2p_12D3KooWMoejJznyDuEk5aX6GvbjaG12UzeornPCBNzMRqdwrFJw")` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.StringFrom("6fdb8235e16e099de91df7ef8a8088e9deea0ed6ae106b133e5d985a8a9e1562")` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.FromInt64(mgrID)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Mocks.feedsSvc.On("CreateChainConfig", mock.Anything, feeds.ChainConfig{ FeedsManagerID: mgrID, ChainType: feeds.ChainTypeEVM, ChainID: chainID, AccountAddress: accountAddr, AccountAddressPublicKey: null.StringFrom(acctAddrPubKey), AdminAddress: adminAddr, FluxMonitorConfig: feeds.FluxMonitorConfig{ Enabled: false, }, OCR1Config: feeds.OCR1Config{ Enabled: true, P2PPeerID: peerID, KeyBundleID: keyBundleID, }, OCR2Config: feeds.OCR2ConfigModel{ Enabled: true, P2PPeerID: peerID, KeyBundleID: keyBundleID, ForwarderAddress: null.StringFrom(forwarderAddr), Plugins: feeds.Plugins{ Commit: true, Execute: true, Median: false, Mercury: true, Rebalancer: true, }, }, })` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.StringFrom(acctAddrPubKey)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.StringFrom(forwarderAddr)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Return(cfgID, nil)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Mocks.feedsSvc.On("GetChainConfig", mock.Anything, cfgID)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Return(&feeds.ChainConfig{ ID: cfgID, ChainType: feeds.ChainTypeEVM, ChainID: chainID, AccountAddress: accountAddr, AccountAddressPublicKey: null.StringFrom(acctAddrPubKey), AdminAddress: adminAddr, FluxMonitorConfig: feeds.FluxMonitorConfig{ Enabled: false, }, OCR1Config: feeds.OCR1Config{ Enabled: true, P2PPeerID: peerID, KeyBundleID: keyBundleID, }, OCR2Config: feeds.OCR2ConfigModel{ Enabled: true, P2PPeerID: peerID, KeyBundleID: keyBundleID, ForwarderAddress: null.StringFrom(forwarderAddr), Plugins: feeds.Plugins{ Commit: true, Execute: true, Median: false, Mercury: true, Rebalancer: true, }, }, }, nil)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.StringFrom(acctAddrPubKey)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.StringFrom(forwarderAddr)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Mocks.feedsSvc.On("CreateChainConfig", mock.Anything, mock.IsType(feeds.ChainConfig{}))` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.IsType(feeds.ChainConfig{})` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Return(int64(0), sql.ErrNoRows)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Mocks.feedsSvc.On("CreateChainConfig", mock.Anything, mock.IsType(feeds.ChainConfig{}))` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.IsType(feeds.ChainConfig{})` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Return(cfgID, nil)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Mocks.feedsSvc.On("GetChainConfig", mock.Anything, cfgID)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Return(nil, sql.ErrNoRows)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Mocks.feedsSvc.On("GetChainConfig", mock.Anything, cfgID)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Return(&feeds.ChainConfig{ ID: cfgID, }, nil)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Mocks.feedsSvc.On("DeleteChainConfig", mock.Anything, cfgID)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Return(cfgID, nil)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Mocks.feedsSvc.On("GetChainConfig", mock.Anything, cfgID)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Return(nil, sql.ErrNoRows)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Mocks.feedsSvc.On("GetChainConfig", mock.Anything, cfgID)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Return(&feeds.ChainConfig{ ID: cfgID, }, nil)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Mocks.feedsSvc.On("DeleteChainConfig", mock.Anything, cfgID)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Return(int64(0), sql.ErrNoRows)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.StringFrom("p2p_12D3KooWMoejJznyDuEk5aX6GvbjaG12UzeornPCBNzMRqdwrFJw")` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.StringFrom("6fdb8235e16e099de91df7ef8a8088e9deea0ed6ae106b133e5d985a8a9e1562")` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Mocks.feedsSvc.On("UpdateChainConfig", mock.Anything, feeds.ChainConfig{ ID: cfgID, AccountAddress: accountAddr, AccountAddressPublicKey: null.StringFrom(accountAddrPubKey), AdminAddress: adminAddr, FluxMonitorConfig: feeds.FluxMonitorConfig{ Enabled: false, }, OCR1Config: feeds.OCR1Config{ Enabled: true, P2PPeerID: null.StringFrom(peerID.String), KeyBundleID: null.StringFrom(keyBundleID.String), }, OCR2Config: feeds.OCR2ConfigModel{ Enabled: true, P2PPeerID: peerID, KeyBundleID: keyBundleID, ForwarderAddress: null.StringFrom(forwarderAddr), Plugins: feeds.Plugins{ Commit: true, Execute: true, Median: false, Mercury: true, Rebalancer: true, }, }, })` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.StringFrom(accountAddrPubKey)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.StringFrom(peerID.String)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.StringFrom(keyBundleID.String)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.StringFrom(forwarderAddr)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Return(cfgID, nil)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Mocks.feedsSvc.On("GetChainConfig", mock.Anything, cfgID)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Return(&feeds.ChainConfig{ ID: cfgID, AccountAddress: accountAddr, AdminAddress: adminAddr, AccountAddressPublicKey: null.StringFrom(accountAddrPubKey), FluxMonitorConfig: feeds.FluxMonitorConfig{ Enabled: false, }, OCR1Config: feeds.OCR1Config{ Enabled: true, P2PPeerID: null.StringFrom(peerID.String), KeyBundleID: null.StringFrom(keyBundleID.String), }, OCR2Config: feeds.OCR2ConfigModel{ Enabled: true, P2PPeerID: peerID, KeyBundleID: keyBundleID, ForwarderAddress: null.StringFrom(forwarderAddr), Plugins: feeds.Plugins{ Commit: true, Execute: true, Median: false, Mercury: true, Rebalancer: true, }, }, }, nil)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.StringFrom(accountAddrPubKey)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.StringFrom(peerID.String)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.StringFrom(keyBundleID.String)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.StringFrom(forwarderAddr)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Mocks.feedsSvc.On("UpdateChainConfig", mock.Anything, mock.IsType(feeds.ChainConfig{}))` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.IsType(feeds.ChainConfig{})` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Return(int64(0), sql.ErrNoRows)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Mocks.feedsSvc.On("UpdateChainConfig", mock.Anything, mock.IsType(feeds.ChainConfig{}))` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.IsType(feeds.ChainConfig{})` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Return(cfgID, nil)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Mocks.feedsSvc.On("GetChainConfig", mock.Anything, cfgID)` $DIR/core/web/resolver/feeds_manager_chain_config_test.go: `.Return(nil, sql.ErrNoRows)` $DIR/core/web/resolver/feeds_manager_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_test.go: `f.Mocks.feedsSvc.On("ListJobProposalsByManagersIDs", mock.Anything, []int64{1}).Return([]feeds.JobProposal{ { ID: int64(100), FeedsManagerID: int64(1), Status: feeds.JobProposalStatusApproved, }, }, nil)` $DIR/core/web/resolver/feeds_manager_test.go: `f.Mocks.feedsSvc.On("ListManagers", mock.Anything).Return([]feeds.FeedsManager{ { ID: 1, Name: "manager1", URI: "localhost:2000", PublicKey: *pubKey, IsConnectionActive: true, CreatedAt: f.Timestamp(), }, }, nil)` $DIR/core/web/resolver/feeds_manager_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_test.go: `f.Mocks.feedsSvc.On("GetManager", mock.Anything, mgrID).Return(&feeds.FeedsManager{ ID: mgrID, Name: "manager1", URI: "localhost:2000", PublicKey: *pubKey, IsConnectionActive: true, CreatedAt: f.Timestamp(), }, nil)` $DIR/core/web/resolver/feeds_manager_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_test.go: `f.Mocks.feedsSvc.On("GetManager", mock.Anything, mgrID).Return(nil, sql.ErrNoRows)` $DIR/core/web/resolver/feeds_manager_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_test.go: `f.Mocks.feedsSvc.On("RegisterManager", mock.Anything, feeds.RegisterManagerParams{ Name: name, URI: uri, PublicKey: *pubKey, }).Return(mgrID, nil)` $DIR/core/web/resolver/feeds_manager_test.go: `f.Mocks.feedsSvc.On("GetManager", mock.Anything, mgrID).Return(&feeds.FeedsManager{ ID: mgrID, Name: name, URI: uri, PublicKey: *pubKey, IsConnectionActive: false, CreatedAt: f.Timestamp(), }, nil)` $DIR/core/web/resolver/feeds_manager_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_test.go: `f.Mocks.feedsSvc. On("RegisterManager", mock.Anything, mock.IsType(feeds.RegisterManagerParams{})). Return(int64(0), feeds.ErrSingleFeedsManager)` $DIR/core/web/resolver/feeds_manager_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_test.go: `f.Mocks.feedsSvc.On("RegisterManager", mock.Anything, mock.IsType(feeds.RegisterManagerParams{})).Return(mgrID, nil)` $DIR/core/web/resolver/feeds_manager_test.go: `f.Mocks.feedsSvc.On("GetManager", mock.Anything, mgrID).Return(nil, sql.ErrNoRows)` $DIR/core/web/resolver/feeds_manager_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_test.go: `f.Mocks.feedsSvc.On("UpdateManager", mock.Anything, feeds.FeedsManager{ ID: mgrID, Name: name, URI: uri, PublicKey: *pubKey, }).Return(nil)` $DIR/core/web/resolver/feeds_manager_test.go: `f.Mocks.feedsSvc.On("GetManager", mock.Anything, mgrID).Return(&feeds.FeedsManager{ ID: mgrID, Name: name, URI: uri, PublicKey: *pubKey, IsConnectionActive: false, CreatedAt: f.Timestamp(), }, nil)` $DIR/core/web/resolver/feeds_manager_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_test.go: `f.Mocks.feedsSvc.On("UpdateManager", mock.Anything, mock.IsType(feeds.FeedsManager{})).Return(nil)` $DIR/core/web/resolver/feeds_manager_test.go: `f.Mocks.feedsSvc.On("GetManager", mock.Anything, mgrID).Return(nil, sql.ErrNoRows)` $DIR/core/web/resolver/feeds_manager_test.go: `.PublicKeyFromHex("3b0f149627adb7b6fafe1497a9dfc357f22295a5440786c3bc566dfdb0176808")` $DIR/core/web/resolver/feeds_manager_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/feeds_manager_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_test.go: `.Mocks.feedsSvc.On("ListJobProposalsByManagersIDs", mock.Anything, []int64{1})` $DIR/core/web/resolver/feeds_manager_test.go: `.Return([]feeds.JobProposal{ { ID: int64(100), FeedsManagerID: int64(1), Status: feeds.JobProposalStatusApproved, }, }, nil)` $DIR/core/web/resolver/feeds_manager_test.go: `.Mocks.feedsSvc.On("ListManagers", mock.Anything)` $DIR/core/web/resolver/feeds_manager_test.go: `.Return([]feeds.FeedsManager{ { ID: 1, Name: "manager1", URI: "localhost:2000", PublicKey: *pubKey, IsConnectionActive: true, CreatedAt: f.Timestamp(), }, }, nil)` $DIR/core/web/resolver/feeds_manager_test.go: `.Timestamp()` $DIR/core/web/resolver/feeds_manager_test.go: `.PublicKeyFromHex("3b0f149627adb7b6fafe1497a9dfc357f22295a5440786c3bc566dfdb0176808")` $DIR/core/web/resolver/feeds_manager_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/feeds_manager_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_test.go: `.Mocks.feedsSvc.On("GetManager", mock.Anything, mgrID)` $DIR/core/web/resolver/feeds_manager_test.go: `.Return(&feeds.FeedsManager{ ID: mgrID, Name: "manager1", URI: "localhost:2000", PublicKey: *pubKey, IsConnectionActive: true, CreatedAt: f.Timestamp(), }, nil)` $DIR/core/web/resolver/feeds_manager_test.go: `.Timestamp()` $DIR/core/web/resolver/feeds_manager_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/feeds_manager_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_test.go: `.Mocks.feedsSvc.On("GetManager", mock.Anything, mgrID)` $DIR/core/web/resolver/feeds_manager_test.go: `.Return(nil, sql.ErrNoRows)` $DIR/core/web/resolver/feeds_manager_test.go: `.PublicKeyFromHex(pubKeyHex)` $DIR/core/web/resolver/feeds_manager_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/feeds_manager_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_test.go: `.Mocks.feedsSvc.On("RegisterManager", mock.Anything, feeds.RegisterManagerParams{ Name: name, URI: uri, PublicKey: *pubKey, })` $DIR/core/web/resolver/feeds_manager_test.go: `.Return(mgrID, nil)` $DIR/core/web/resolver/feeds_manager_test.go: `.Mocks.feedsSvc.On("GetManager", mock.Anything, mgrID)` $DIR/core/web/resolver/feeds_manager_test.go: `.Return(&feeds.FeedsManager{ ID: mgrID, Name: name, URI: uri, PublicKey: *pubKey, IsConnectionActive: false, CreatedAt: f.Timestamp(), }, nil)` $DIR/core/web/resolver/feeds_manager_test.go: `.Timestamp()` $DIR/core/web/resolver/feeds_manager_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/feeds_manager_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_test.go: `.Mocks.feedsSvc. On("RegisterManager", mock.Anything, mock.IsType(feeds.RegisterManagerParams{}))` $DIR/core/web/resolver/feeds_manager_test.go: `.IsType(feeds.RegisterManagerParams{})` $DIR/core/web/resolver/feeds_manager_test.go: `. Return(int64(0), feeds.ErrSingleFeedsManager)` $DIR/core/web/resolver/feeds_manager_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/feeds_manager_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_test.go: `.Mocks.feedsSvc.On("RegisterManager", mock.Anything, mock.IsType(feeds.RegisterManagerParams{}))` $DIR/core/web/resolver/feeds_manager_test.go: `.IsType(feeds.RegisterManagerParams{})` $DIR/core/web/resolver/feeds_manager_test.go: `.Return(mgrID, nil)` $DIR/core/web/resolver/feeds_manager_test.go: `.Mocks.feedsSvc.On("GetManager", mock.Anything, mgrID)` $DIR/core/web/resolver/feeds_manager_test.go: `.Return(nil, sql.ErrNoRows)` $DIR/core/web/resolver/feeds_manager_test.go: `.PublicKeyFromHex(pubKeyHex)` $DIR/core/web/resolver/feeds_manager_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/feeds_manager_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_test.go: `.Mocks.feedsSvc.On("UpdateManager", mock.Anything, feeds.FeedsManager{ ID: mgrID, Name: name, URI: uri, PublicKey: *pubKey, })` $DIR/core/web/resolver/feeds_manager_test.go: `.Return(nil)` $DIR/core/web/resolver/feeds_manager_test.go: `.Mocks.feedsSvc.On("GetManager", mock.Anything, mgrID)` $DIR/core/web/resolver/feeds_manager_test.go: `.Return(&feeds.FeedsManager{ ID: mgrID, Name: name, URI: uri, PublicKey: *pubKey, IsConnectionActive: false, CreatedAt: f.Timestamp(), }, nil)` $DIR/core/web/resolver/feeds_manager_test.go: `.Timestamp()` $DIR/core/web/resolver/feeds_manager_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/feeds_manager_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/feeds_manager_test.go: `.Mocks.feedsSvc.On("UpdateManager", mock.Anything, mock.IsType(feeds.FeedsManager{}))` $DIR/core/web/resolver/feeds_manager_test.go: `.IsType(feeds.FeedsManager{})` $DIR/core/web/resolver/feeds_manager_test.go: `.Return(nil)` $DIR/core/web/resolver/feeds_manager_test.go: `.Mocks.feedsSvc.On("GetManager", mock.Anything, mgrID)` $DIR/core/web/resolver/feeds_manager_test.go: `.Return(nil, sql.ErrNoRows)` $DIR/core/web/resolver/job_error_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_error_test.go: `f.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id).Return(job.Job{ ID: int32(1), }, nil)` $DIR/core/web/resolver/job_error_test.go: `f.Mocks.jobORM.On("FindSpecErrorsByJobIDs", mock.Anything, []int32{1}, mock.Anything).Return([]job.SpecError{ { ID: errorID, Description: "no contract code at given address", Occurrences: 1, CreatedAt: f.Timestamp(), JobID: int32(1), }, }, nil)` $DIR/core/web/resolver/job_error_test.go: `f.Mocks.jobORM.On("FindSpecError", mock.Anything, id).Return(job.SpecError{ ID: id, Occurrences: 5, Description: "test-description", CreatedAt: f.Timestamp(), }, nil)` $DIR/core/web/resolver/job_error_test.go: `f.Mocks.jobORM.On("DismissError", mock.Anything, id).Return(nil)` $DIR/core/web/resolver/job_error_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_error_test.go: `f.Mocks.jobORM.On("FindSpecError", mock.Anything, id).Return(job.SpecError{}, sql.ErrNoRows)` $DIR/core/web/resolver/job_error_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_error_test.go: `f.Mocks.jobORM.On("FindSpecError", mock.Anything, id).Return(job.SpecError{}, nil)` $DIR/core/web/resolver/job_error_test.go: `f.Mocks.jobORM.On("DismissError", mock.Anything, id).Return(sql.ErrNoRows)` $DIR/core/web/resolver/job_error_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_error_test.go: `f.Mocks.jobORM.On("FindSpecError", mock.Anything, id).Return(job.SpecError{}, gError)` $DIR/core/web/resolver/job_error_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_error_test.go: `f.Mocks.jobORM.On("FindSpecError", mock.Anything, id).Return(job.SpecError{}, nil)` $DIR/core/web/resolver/job_error_test.go: `f.Mocks.jobORM.On("DismissError", mock.Anything, id).Return(gError)` $DIR/core/web/resolver/job_error_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_error_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/job_error_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_error_test.go: `.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id)` $DIR/core/web/resolver/job_error_test.go: `.Return(job.Job{ ID: int32(1), }, nil)` $DIR/core/web/resolver/job_error_test.go: `.Mocks.jobORM.On("FindSpecErrorsByJobIDs", mock.Anything, []int32{1}, mock.Anything)` $DIR/core/web/resolver/job_error_test.go: `.Return([]job.SpecError{ { ID: errorID, Description: "no contract code at given address", Occurrences: 1, CreatedAt: f.Timestamp(), JobID: int32(1), }, }, nil)` $DIR/core/web/resolver/job_error_test.go: `.Timestamp()` $DIR/core/web/resolver/job_error_test.go: `.Marshal(map[string]interface{}{ "dismissJobError": map[string]interface{}{ "jobError": map[string]interface{}{ "id": "1", "occurrences": 5, "description": "test-description", "createdAt": "2021-01-01T00:00:00Z", }, }, })` $DIR/core/web/resolver/job_error_test.go: `.New("error")` $DIR/core/web/resolver/job_error_test.go: `.ToInt64("asdadada")` $DIR/core/web/resolver/job_error_test.go: `.Mocks.jobORM.On("FindSpecError", mock.Anything, id)` $DIR/core/web/resolver/job_error_test.go: `.Return(job.SpecError{ ID: id, Occurrences: 5, Description: "test-description", CreatedAt: f.Timestamp(), }, nil)` $DIR/core/web/resolver/job_error_test.go: `.Timestamp()` $DIR/core/web/resolver/job_error_test.go: `.Mocks.jobORM.On("DismissError", mock.Anything, id)` $DIR/core/web/resolver/job_error_test.go: `.Return(nil)` $DIR/core/web/resolver/job_error_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/job_error_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_error_test.go: `.Mocks.jobORM.On("FindSpecError", mock.Anything, id)` $DIR/core/web/resolver/job_error_test.go: `.Return(job.SpecError{}, sql.ErrNoRows)` $DIR/core/web/resolver/job_error_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/job_error_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_error_test.go: `.Mocks.jobORM.On("FindSpecError", mock.Anything, id)` $DIR/core/web/resolver/job_error_test.go: `.Return(job.SpecError{}, nil)` $DIR/core/web/resolver/job_error_test.go: `.Mocks.jobORM.On("DismissError", mock.Anything, id)` $DIR/core/web/resolver/job_error_test.go: `.Return(sql.ErrNoRows)` $DIR/core/web/resolver/job_error_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/job_error_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_error_test.go: `.Mocks.jobORM.On("FindSpecError", mock.Anything, id)` $DIR/core/web/resolver/job_error_test.go: `.Return(job.SpecError{}, gError)` $DIR/core/web/resolver/job_error_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/job_error_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_error_test.go: `.Mocks.jobORM.On("FindSpecError", mock.Anything, id)` $DIR/core/web/resolver/job_error_test.go: `.Return(job.SpecError{}, nil)` $DIR/core/web/resolver/job_error_test.go: `.Mocks.jobORM.On("DismissError", mock.Anything, id)` $DIR/core/web/resolver/job_error_test.go: `.Return(gError)` $DIR/core/web/resolver/job_error_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/job_error_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.Mocks.feedsSvc.On("ApproveSpec", mock.Anything, specID, false).Return(nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.Mocks.feedsSvc.On("GetSpec", mock.Anything, specID).Return(&feeds.JobProposalSpec{ ID: specID, }, nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.Mocks.feedsSvc.On("ApproveSpec", mock.Anything, specID, false).Return(sql.ErrNoRows)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.Mocks.feedsSvc.On("ApproveSpec", mock.Anything, specID, false).Return(nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.Mocks.feedsSvc.On("GetSpec", mock.Anything, specID).Return(nil, sql.ErrNoRows)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.Mocks.feedsSvc.On("ApproveSpec", mock.Anything, specID, false).Return(feeds.ErrJobAlreadyExists)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.Mocks.feedsSvc.On("CancelSpec", mock.Anything, specID).Return(nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.Mocks.feedsSvc.On("GetSpec", mock.Anything, specID).Return(&feeds.JobProposalSpec{ ID: specID, }, nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.Mocks.feedsSvc.On("CancelSpec", mock.Anything, specID).Return(sql.ErrNoRows)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.Mocks.feedsSvc.On("CancelSpec", mock.Anything, specID).Return(nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.Mocks.feedsSvc.On("GetSpec", mock.Anything, specID).Return(nil, sql.ErrNoRows)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.Mocks.feedsSvc.On("RejectSpec", mock.Anything, specID).Return(nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.Mocks.feedsSvc.On("GetSpec", mock.Anything, specID).Return(&feeds.JobProposalSpec{ ID: specID, }, nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.Mocks.feedsSvc.On("RejectSpec", mock.Anything, specID).Return(sql.ErrNoRows)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.Mocks.feedsSvc.On("RejectSpec", mock.Anything, specID).Return(nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.Mocks.feedsSvc.On("GetSpec", mock.Anything, specID).Return(nil, sql.ErrNoRows)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.Mocks.feedsSvc.On("UpdateSpecDefinition", mock.Anything, specID, "").Return(nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.Mocks.feedsSvc.On("GetSpec", mock.Anything, specID).Return(&feeds.JobProposalSpec{ ID: specID, }, nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.Mocks.feedsSvc.On("UpdateSpecDefinition", mock.Anything, specID, "").Return(sql.ErrNoRows)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.Mocks.feedsSvc.On("UpdateSpecDefinition", mock.Anything, specID, "").Return(nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.Mocks.feedsSvc.On("GetSpec", mock.Anything, specID).Return(nil, sql.ErrNoRows)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.Mocks.feedsSvc.On("GetJobProposal", mock.Anything, jpID).Return(&feeds.JobProposal{ ID: jpID, Status: feeds.JobProposalStatusApproved, FeedsManagerID: 1, Multiaddrs: []string{"1", "2"}, PendingUpdate: false, }, nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.Mocks.feedsSvc. On("ListSpecsByJobProposalIDs", mock.Anything, []int64{jpID}). Return(specs, nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Mocks.feedsSvc.On("ApproveSpec", mock.Anything, specID, false)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Mocks.feedsSvc.On("GetSpec", mock.Anything, specID)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(&feeds.JobProposalSpec{ ID: specID, }, nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Mocks.feedsSvc.On("ApproveSpec", mock.Anything, specID, false)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(sql.ErrNoRows)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Mocks.feedsSvc.On("ApproveSpec", mock.Anything, specID, false)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Mocks.feedsSvc.On("GetSpec", mock.Anything, specID)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(nil, sql.ErrNoRows)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Mocks.feedsSvc.On("ApproveSpec", mock.Anything, specID, false)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(feeds.ErrJobAlreadyExists)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Mocks.feedsSvc.On("CancelSpec", mock.Anything, specID)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Mocks.feedsSvc.On("GetSpec", mock.Anything, specID)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(&feeds.JobProposalSpec{ ID: specID, }, nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Mocks.feedsSvc.On("CancelSpec", mock.Anything, specID)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(sql.ErrNoRows)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Mocks.feedsSvc.On("CancelSpec", mock.Anything, specID)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Mocks.feedsSvc.On("GetSpec", mock.Anything, specID)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(nil, sql.ErrNoRows)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Mocks.feedsSvc.On("RejectSpec", mock.Anything, specID)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Mocks.feedsSvc.On("GetSpec", mock.Anything, specID)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(&feeds.JobProposalSpec{ ID: specID, }, nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Mocks.feedsSvc.On("RejectSpec", mock.Anything, specID)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(sql.ErrNoRows)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Mocks.feedsSvc.On("RejectSpec", mock.Anything, specID)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Mocks.feedsSvc.On("GetSpec", mock.Anything, specID)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(nil, sql.ErrNoRows)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Mocks.feedsSvc.On("UpdateSpecDefinition", mock.Anything, specID, "")` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Mocks.feedsSvc.On("GetSpec", mock.Anything, specID)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(&feeds.JobProposalSpec{ ID: specID, }, nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Mocks.feedsSvc.On("UpdateSpecDefinition", mock.Anything, specID, "")` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(sql.ErrNoRows)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Mocks.feedsSvc.On("UpdateSpecDefinition", mock.Anything, specID, "")` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Mocks.feedsSvc.On("GetSpec", mock.Anything, specID)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(nil, sql.ErrNoRows)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Date(2021, 1, 1, 0, 0, 0, 0, time.UTC)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Mocks.feedsSvc.On("GetJobProposal", mock.Anything, jpID)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(&feeds.JobProposal{ ID: jpID, Status: feeds.JobProposalStatusApproved, FeedsManagerID: 1, Multiaddrs: []string{"1", "2"}, PendingUpdate: false, }, nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Mocks.feedsSvc. On("ListSpecsByJobProposalIDs", mock.Anything, []int64{jpID})` $DIR/core/web/resolver/job_proposal_spec_test.go: `. Return(specs, nil)` $DIR/core/web/resolver/job_proposal_spec_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/job_proposal_spec_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_test.go: `f.Mocks.feedsSvc.On("ListManagersByIDs", mock.Anything, []int64{1}).Return([]feeds.FeedsManager{ { ID: 1, Name: "manager", }, }, nil)` $DIR/core/web/resolver/job_proposal_test.go: `f.Mocks.feedsSvc.On("GetJobProposal", mock.Anything, jpID).Return(&feeds.JobProposal{ ID: jpID, Name: null.StringFrom(name), Status: feeds.JobProposalStatusApproved, ExternalJobID: ejID, RemoteUUID: rUUID, FeedsManagerID: 1, Multiaddrs: []string{"1", "2"}, PendingUpdate: false, }, nil)` $DIR/core/web/resolver/job_proposal_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_test.go: `f.Mocks.feedsSvc.On("GetJobProposal", mock.Anything, jpID).Return(nil, sql.ErrNoRows)` $DIR/core/web/resolver/job_proposal_test.go: `f.App.On("GetFeedsService").Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_test.go: `.New()` $DIR/core/web/resolver/job_proposal_test.go: `.New()` $DIR/core/web/resolver/job_proposal_test.go: `.Mocks.feedsSvc.On("ListManagersByIDs", mock.Anything, []int64{1})` $DIR/core/web/resolver/job_proposal_test.go: `.Return([]feeds.FeedsManager{ { ID: 1, Name: "manager", }, }, nil)` $DIR/core/web/resolver/job_proposal_test.go: `.Mocks.feedsSvc.On("GetJobProposal", mock.Anything, jpID)` $DIR/core/web/resolver/job_proposal_test.go: `.Return(&feeds.JobProposal{ ID: jpID, Name: null.StringFrom(name), Status: feeds.JobProposalStatusApproved, ExternalJobID: ejID, RemoteUUID: rUUID, FeedsManagerID: 1, Multiaddrs: []string{"1", "2"}, PendingUpdate: false, }, nil)` $DIR/core/web/resolver/job_proposal_test.go: `.StringFrom(name)` $DIR/core/web/resolver/job_proposal_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/job_proposal_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_proposal_test.go: `.Sprintf(result, name, ejID.UUID.String(), rUUID.String())` $DIR/core/web/resolver/job_proposal_test.go: `.UUID.String()` $DIR/core/web/resolver/job_proposal_test.go: `.String()` $DIR/core/web/resolver/job_proposal_test.go: `.Mocks.feedsSvc.On("GetJobProposal", mock.Anything, jpID)` $DIR/core/web/resolver/job_proposal_test.go: `.Return(nil, sql.ErrNoRows)` $DIR/core/web/resolver/job_proposal_test.go: `.App.On("GetFeedsService")` $DIR/core/web/resolver/job_proposal_test.go: `.Return(f.Mocks.feedsSvc)` $DIR/core/web/resolver/job_run_test.go: `f.Mocks.jobORM.On("PipelineRuns", mock.Anything, (*int32)(nil), PageDefaultOffset, PageDefaultLimit).Return([]pipeline.Run{ { ID: int64(200), }, }, 1, nil)` $DIR/core/web/resolver/job_run_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_run_test.go: `f.Mocks.jobORM.On("PipelineRuns", mock.Anything, (*int32)(nil), PageDefaultOffset, PageDefaultLimit).Return(nil, 0, gError)` $DIR/core/web/resolver/job_run_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_run_test.go: `err = outputs.UnmarshalJSON([]byte(`[{"baz": "bar"}]`))` $DIR/core/web/resolver/job_run_test.go: `f.Mocks.jobORM.On("FindPipelineRunByID", mock.Anything, int64(2)).Return(pipeline.Run{ ID: 2, PipelineSpecID: 5, CreatedAt: f.Timestamp(), FinishedAt: null.TimeFrom(f.Timestamp()), AllErrors: pipeline.RunErrors{null.StringFrom("fatal error"), null.String{}}, FatalErrors: pipeline.RunErrors{null.StringFrom("fatal error"), null.String{}}, Inputs: inputs, Outputs: outputs, State: pipeline.RunStatusErrored, }, nil)` $DIR/core/web/resolver/job_run_test.go: `f.Mocks.jobORM.On("FindJobsByPipelineSpecIDs", mock.Anything, []int32{5}).Return([]job.Job{ { ID: 1, PipelineSpecID: 2, Name: null.StringFrom("first-one"), }, { ID: 2, PipelineSpecID: 5, Name: null.StringFrom("second-one"), }, }, nil)` $DIR/core/web/resolver/job_run_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_run_test.go: `f.Mocks.jobORM.On("FindPipelineRunByID", mock.Anything, int64(2)).Return(pipeline.Run{}, sql.ErrNoRows)` $DIR/core/web/resolver/job_run_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_run_test.go: `f.Mocks.jobORM.On("FindPipelineRunByID", mock.Anything, int64(2)).Return(pipeline.Run{}, gError)` $DIR/core/web/resolver/job_run_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_run_test.go: `err = outputs.UnmarshalJSON([]byte(`[{"baz": "bar"}]`))` $DIR/core/web/resolver/job_run_test.go: `f.App.On("RunJobV2", mock.Anything, id, (map[string]interface{})(nil)).Return(int64(25), nil)` $DIR/core/web/resolver/job_run_test.go: `f.Mocks.pipelineORM.On("FindRun", mock.Anything, int64(25)).Return(pipeline.Run{ ID: 2, PipelineSpecID: 5, CreatedAt: f.Timestamp(), FinishedAt: null.TimeFrom(f.Timestamp()), AllErrors: pipeline.RunErrors{null.StringFrom("fatal error"), null.String{}}, FatalErrors: pipeline.RunErrors{null.StringFrom("fatal error"), null.String{}}, Inputs: inputs, Outputs: outputs, State: pipeline.RunStatusErrored, }, nil)` $DIR/core/web/resolver/job_run_test.go: `f.App.On("PipelineORM").Return(f.Mocks.pipelineORM)` $DIR/core/web/resolver/job_run_test.go: `f.App.On("RunJobV2", mock.Anything, id, (map[string]interface{})(nil)).Return(int64(25), webhook.ErrJobNotExists)` $DIR/core/web/resolver/job_run_test.go: `f.App.On("RunJobV2", mock.Anything, id, (map[string]interface{})(nil)).Return(int64(25), gError)` $DIR/core/web/resolver/job_run_test.go: `f.App.On("RunJobV2", mock.Anything, id, (map[string]interface{})(nil)).Return(int64(25), nil)` $DIR/core/web/resolver/job_run_test.go: `f.Mocks.pipelineORM.On("FindRun", mock.Anything, int64(25)).Return(pipeline.Run{}, gError)` $DIR/core/web/resolver/job_run_test.go: `f.App.On("PipelineORM").Return(f.Mocks.pipelineORM)` $DIR/core/web/resolver/job_run_test.go: `.New("error")` $DIR/core/web/resolver/job_run_test.go: `.Mocks.jobORM.On("PipelineRuns", mock.Anything, (*int32)(nil), PageDefaultOffset, PageDefaultLimit)` $DIR/core/web/resolver/job_run_test.go: `.Return([]pipeline.Run{ { ID: int64(200), }, }, 1, nil)` $DIR/core/web/resolver/job_run_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/job_run_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_run_test.go: `.Mocks.jobORM.On("PipelineRuns", mock.Anything, (*int32)(nil), PageDefaultOffset, PageDefaultLimit)` $DIR/core/web/resolver/job_run_test.go: `.Return(nil, 0, gError)` $DIR/core/web/resolver/job_run_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/job_run_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_run_test.go: `.New("error")` $DIR/core/web/resolver/job_run_test.go: `.ToInt64("asdasads")` $DIR/core/web/resolver/job_run_test.go: `.UnmarshalJSON([]byte(`{"foo": "bar"}`))` $DIR/core/web/resolver/job_run_test.go: `.UnmarshalJSON([]byte(`[{"baz": "bar"}]`))` $DIR/core/web/resolver/job_run_test.go: `.Mocks.jobORM.On("FindPipelineRunByID", mock.Anything, int64(2))` $DIR/core/web/resolver/job_run_test.go: `.Return(pipeline.Run{ ID: 2, PipelineSpecID: 5, CreatedAt: f.Timestamp(), FinishedAt: null.TimeFrom(f.Timestamp()), AllErrors: pipeline.RunErrors{null.StringFrom("fatal error"), null.String{}}, FatalErrors: pipeline.RunErrors{null.StringFrom("fatal error"), null.String{}}, Inputs: inputs, Outputs: outputs, State: pipeline.RunStatusErrored, }, nil)` $DIR/core/web/resolver/job_run_test.go: `.Timestamp()` $DIR/core/web/resolver/job_run_test.go: `.TimeFrom(f.Timestamp())` $DIR/core/web/resolver/job_run_test.go: `.Timestamp()` $DIR/core/web/resolver/job_run_test.go: `.StringFrom("fatal error")` $DIR/core/web/resolver/job_run_test.go: `.StringFrom("fatal error")` $DIR/core/web/resolver/job_run_test.go: `.Mocks.jobORM.On("FindJobsByPipelineSpecIDs", mock.Anything, []int32{5})` $DIR/core/web/resolver/job_run_test.go: `.Return([]job.Job{ { ID: 1, PipelineSpecID: 2, Name: null.StringFrom("first-one"), }, { ID: 2, PipelineSpecID: 5, Name: null.StringFrom("second-one"), }, }, nil)` $DIR/core/web/resolver/job_run_test.go: `.StringFrom("first-one")` $DIR/core/web/resolver/job_run_test.go: `.StringFrom("second-one")` $DIR/core/web/resolver/job_run_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/job_run_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_run_test.go: `.Mocks.jobORM.On("FindPipelineRunByID", mock.Anything, int64(2))` $DIR/core/web/resolver/job_run_test.go: `.Return(pipeline.Run{}, sql.ErrNoRows)` $DIR/core/web/resolver/job_run_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/job_run_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_run_test.go: `.Mocks.jobORM.On("FindPipelineRunByID", mock.Anything, int64(2))` $DIR/core/web/resolver/job_run_test.go: `.Return(pipeline.Run{}, gError)` $DIR/core/web/resolver/job_run_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/job_run_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_run_test.go: `.FromInt32(id)` $DIR/core/web/resolver/job_run_test.go: `.UnmarshalJSON([]byte(`{"foo": "bar"}`))` $DIR/core/web/resolver/job_run_test.go: `.UnmarshalJSON([]byte(`[{"baz": "bar"}]`))` $DIR/core/web/resolver/job_run_test.go: `.New("error")` $DIR/core/web/resolver/job_run_test.go: `.ToInt32("some random ID with some specific length that should not work")` $DIR/core/web/resolver/job_run_test.go: `.App.On("RunJobV2", mock.Anything, id, (map[string]interface{})(nil))` $DIR/core/web/resolver/job_run_test.go: `.Return(int64(25), nil)` $DIR/core/web/resolver/job_run_test.go: `.Mocks.pipelineORM.On("FindRun", mock.Anything, int64(25))` $DIR/core/web/resolver/job_run_test.go: `.Return(pipeline.Run{ ID: 2, PipelineSpecID: 5, CreatedAt: f.Timestamp(), FinishedAt: null.TimeFrom(f.Timestamp()), AllErrors: pipeline.RunErrors{null.StringFrom("fatal error"), null.String{}}, FatalErrors: pipeline.RunErrors{null.StringFrom("fatal error"), null.String{}}, Inputs: inputs, Outputs: outputs, State: pipeline.RunStatusErrored, }, nil)` $DIR/core/web/resolver/job_run_test.go: `.Timestamp()` $DIR/core/web/resolver/job_run_test.go: `.TimeFrom(f.Timestamp())` $DIR/core/web/resolver/job_run_test.go: `.Timestamp()` $DIR/core/web/resolver/job_run_test.go: `.StringFrom("fatal error")` $DIR/core/web/resolver/job_run_test.go: `.StringFrom("fatal error")` $DIR/core/web/resolver/job_run_test.go: `.App.On("PipelineORM")` $DIR/core/web/resolver/job_run_test.go: `.Return(f.Mocks.pipelineORM)` $DIR/core/web/resolver/job_run_test.go: `.App.On("RunJobV2", mock.Anything, id, (map[string]interface{})(nil))` $DIR/core/web/resolver/job_run_test.go: `.Return(int64(25), webhook.ErrJobNotExists)` $DIR/core/web/resolver/job_run_test.go: `.App.On("RunJobV2", mock.Anything, id, (map[string]interface{})(nil))` $DIR/core/web/resolver/job_run_test.go: `.Return(int64(25), gError)` $DIR/core/web/resolver/job_run_test.go: `.App.On("RunJobV2", mock.Anything, id, (map[string]interface{})(nil))` $DIR/core/web/resolver/job_run_test.go: `.Return(int64(25), nil)` $DIR/core/web/resolver/job_run_test.go: `.Mocks.pipelineORM.On("FindRun", mock.Anything, int64(25))` $DIR/core/web/resolver/job_run_test.go: `.Return(pipeline.Run{}, gError)` $DIR/core/web/resolver/job_run_test.go: `.App.On("PipelineORM")` $DIR/core/web/resolver/job_run_test.go: `.Return(f.Mocks.pipelineORM)` $DIR/core/web/resolver/job_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_test.go: `f.Mocks.jobORM.On("FindJobs", mock.Anything, 0, 50).Return([]job.Job{ { ID: 1, Name: null.StringFrom("job1"), SchemaVersion: 1, MaxTaskDuration: models.Interval(1 * time.Second), ExternalJobID: externalJobID, CreatedAt: f.Timestamp(), Type: job.OffchainReporting, PipelineSpecID: plnSpecID, OCROracleSpec: &job.OCROracleSpec{}, PipelineSpec: &pipeline.Spec{ DotDagSource: "ds1 [type=bridge name=voter_turnout];", }, }, }, 1, nil)` $DIR/core/web/resolver/job_test.go: `f.Mocks.jobORM. On("FindPipelineRunIDsByJobID", mock.Anything, int32(1), 0, 50). Return([]int64{200}, nil)` $DIR/core/web/resolver/job_test.go: `f.Mocks.jobORM. On("FindPipelineRunsByIDs", mock.Anything, []int64{200}). Return([]pipeline.Run{{ID: 200}}, nil)` $DIR/core/web/resolver/job_test.go: `f.Mocks.jobORM. On("CountPipelineRunsByJobID", mock.Anything, int32(1)). Return(int32(1), nil)` $DIR/core/web/resolver/job_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_test.go: `f.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id).Return(job.Job{ ID: 1, Name: null.StringFrom("job1"), SchemaVersion: 1, GasLimit: clnull.Uint32From(123), MaxTaskDuration: models.Interval(1 * time.Second), ExternalJobID: externalJobID, CreatedAt: f.Timestamp(), Type: job.OffchainReporting, OCROracleSpec: &job.OCROracleSpec{}, PipelineSpec: &pipeline.Spec{ DotDagSource: "ds1 [type=bridge name=voter_turnout];", }, }, nil)` $DIR/core/web/resolver/job_test.go: `f.Mocks.jobORM. On("FindPipelineRunIDsByJobID", mock.Anything, int32(1), 0, 50). Return([]int64{200}, nil)` $DIR/core/web/resolver/job_test.go: `f.Mocks.jobORM. On("FindPipelineRunsByIDs", mock.Anything, []int64{200}). Return([]pipeline.Run{{ID: 200}}, nil)` $DIR/core/web/resolver/job_test.go: `f.Mocks.jobORM. On("CountPipelineRunsByJobID", mock.Anything, int32(1)). Return(int32(1), nil)` $DIR/core/web/resolver/job_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_test.go: `f.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/web/resolver/job_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_test.go: `f.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id).Return(job.Job{ ID: 1, Name: null.StringFrom("job1"), SchemaVersion: 1, GasLimit: clnull.Uint32From(123), MaxTaskDuration: models.Interval(1 * time.Second), ExternalJobID: externalJobID, CreatedAt: f.Timestamp(), Type: job.OffchainReporting, OCROracleSpec: &job.OCROracleSpec{}, PipelineSpec: &pipeline.Spec{ DotDagSource: "ds1 [type=bridge name=voter_turnout];", }, }, chains.ErrNoSuchChainID)` $DIR/core/web/resolver/job_test.go: `f.Mocks.jobORM. On("FindPipelineRunIDsByJobID", mock.Anything, int32(1), 0, 50). Return([]int64{200}, nil)` $DIR/core/web/resolver/job_test.go: `f.Mocks.jobORM. On("FindPipelineRunsByIDs", mock.Anything, []int64{200}). Return([]pipeline.Run{{ID: 200}}, nil)` $DIR/core/web/resolver/job_test.go: `f.Mocks.jobORM. On("CountPipelineRunsByJobID", mock.Anything, int32(1)). Return(int32(1), nil)` $DIR/core/web/resolver/job_test.go: `f.App.On("GetConfig").Return(f.Mocks.cfg)` $DIR/core/web/resolver/job_test.go: `f.App.On("AddJobV2", mock.Anything, &jb).Return(nil)` $DIR/core/web/resolver/job_test.go: `f.App.On("GetConfig").Return(f.Mocks.cfg)` $DIR/core/web/resolver/job_test.go: `f.App.On("AddJobV2", mock.Anything, &jb).Return(gError)` $DIR/core/web/resolver/job_test.go: `f.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id).Return(job.Job{ ID: id, Name: null.StringFrom("test-job"), ExternalJobID: extJID, MaxTaskDuration: models.Interval(2 * time.Second), CreatedAt: f.Timestamp(), }, nil)` $DIR/core/web/resolver/job_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_test.go: `f.App.On("DeleteJob", mock.Anything, id).Return(nil)` $DIR/core/web/resolver/job_test.go: `f.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id).Return(job.Job{}, sql.ErrNoRows)` $DIR/core/web/resolver/job_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_test.go: `f.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id).Return(job.Job{}, nil)` $DIR/core/web/resolver/job_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_test.go: `f.App.On("DeleteJob", mock.Anything, id).Return(sql.ErrNoRows)` $DIR/core/web/resolver/job_test.go: `f.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id).Return(job.Job{}, gError)` $DIR/core/web/resolver/job_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_test.go: `f.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id).Return(job.Job{}, nil)` $DIR/core/web/resolver/job_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_test.go: `f.App.On("DeleteJob", mock.Anything, id).Return(gError)` $DIR/core/web/resolver/job_test.go: `.MustParse(("00000000-0000-0000-0000-000000000001"))` $DIR/core/web/resolver/job_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/job_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_test.go: `.Mocks.jobORM.On("FindJobs", mock.Anything, 0, 50)` $DIR/core/web/resolver/job_test.go: `.Return([]job.Job{ { ID: 1, Name: null.StringFrom("job1"), SchemaVersion: 1, MaxTaskDuration: models.Interval(1 * time.Second), ExternalJobID: externalJobID, CreatedAt: f.Timestamp(), Type: job.OffchainReporting, PipelineSpecID: plnSpecID, OCROracleSpec: &job.OCROracleSpec{}, PipelineSpec: &pipeline.Spec{ DotDagSource: "ds1 [type=bridge name=voter_turnout];", }, }, }, 1, nil)` $DIR/core/web/resolver/job_test.go: `.StringFrom("job1")` $DIR/core/web/resolver/job_test.go: `.Interval(1 * time.Second)` $DIR/core/web/resolver/job_test.go: `.Timestamp()` $DIR/core/web/resolver/job_test.go: `.Mocks.jobORM. On("FindPipelineRunIDsByJobID", mock.Anything, int32(1), 0, 50)` $DIR/core/web/resolver/job_test.go: `. Return([]int64{200}, nil)` $DIR/core/web/resolver/job_test.go: `.Mocks.jobORM. On("FindPipelineRunsByIDs", mock.Anything, []int64{200})` $DIR/core/web/resolver/job_test.go: `. Return([]pipeline.Run{{ID: 200}}, nil)` $DIR/core/web/resolver/job_test.go: `.Mocks.jobORM. On("CountPipelineRunsByJobID", mock.Anything, int32(1))` $DIR/core/web/resolver/job_test.go: `. Return(int32(1), nil)` $DIR/core/web/resolver/job_test.go: `.MustParse(("00000000-0000-0000-0000-000000000001"))` $DIR/core/web/resolver/job_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/job_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_test.go: `.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id)` $DIR/core/web/resolver/job_test.go: `.Return(job.Job{ ID: 1, Name: null.StringFrom("job1"), SchemaVersion: 1, GasLimit: clnull.Uint32From(123), MaxTaskDuration: models.Interval(1 * time.Second), ExternalJobID: externalJobID, CreatedAt: f.Timestamp(), Type: job.OffchainReporting, OCROracleSpec: &job.OCROracleSpec{}, PipelineSpec: &pipeline.Spec{ DotDagSource: "ds1 [type=bridge name=voter_turnout];", }, }, nil)` $DIR/core/web/resolver/job_test.go: `.StringFrom("job1")` $DIR/core/web/resolver/job_test.go: `.Uint32From(123)` $DIR/core/web/resolver/job_test.go: `.Interval(1 * time.Second)` $DIR/core/web/resolver/job_test.go: `.Timestamp()` $DIR/core/web/resolver/job_test.go: `.Mocks.jobORM. On("FindPipelineRunIDsByJobID", mock.Anything, int32(1), 0, 50)` $DIR/core/web/resolver/job_test.go: `. Return([]int64{200}, nil)` $DIR/core/web/resolver/job_test.go: `.Mocks.jobORM. On("FindPipelineRunsByIDs", mock.Anything, []int64{200})` $DIR/core/web/resolver/job_test.go: `. Return([]pipeline.Run{{ID: 200}}, nil)` $DIR/core/web/resolver/job_test.go: `.Mocks.jobORM. On("CountPipelineRunsByJobID", mock.Anything, int32(1))` $DIR/core/web/resolver/job_test.go: `. Return(int32(1), nil)` $DIR/core/web/resolver/job_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/job_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_test.go: `.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id)` $DIR/core/web/resolver/job_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/web/resolver/job_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/job_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_test.go: `.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id)` $DIR/core/web/resolver/job_test.go: `.Return(job.Job{ ID: 1, Name: null.StringFrom("job1"), SchemaVersion: 1, GasLimit: clnull.Uint32From(123), MaxTaskDuration: models.Interval(1 * time.Second), ExternalJobID: externalJobID, CreatedAt: f.Timestamp(), Type: job.OffchainReporting, OCROracleSpec: &job.OCROracleSpec{}, PipelineSpec: &pipeline.Spec{ DotDagSource: "ds1 [type=bridge name=voter_turnout];", }, }, chains.ErrNoSuchChainID)` $DIR/core/web/resolver/job_test.go: `.StringFrom("job1")` $DIR/core/web/resolver/job_test.go: `.Uint32From(123)` $DIR/core/web/resolver/job_test.go: `.Interval(1 * time.Second)` $DIR/core/web/resolver/job_test.go: `.Timestamp()` $DIR/core/web/resolver/job_test.go: `.Mocks.jobORM. On("FindPipelineRunIDsByJobID", mock.Anything, int32(1), 0, 50)` $DIR/core/web/resolver/job_test.go: `. Return([]int64{200}, nil)` $DIR/core/web/resolver/job_test.go: `.Mocks.jobORM. On("FindPipelineRunsByIDs", mock.Anything, []int64{200})` $DIR/core/web/resolver/job_test.go: `. Return([]pipeline.Run{{ID: 200}}, nil)` $DIR/core/web/resolver/job_test.go: `.Mocks.jobORM. On("CountPipelineRunsByJobID", mock.Anything, int32(1))` $DIR/core/web/resolver/job_test.go: `. Return(int32(1), nil)` $DIR/core/web/resolver/job_test.go: `.New()` $DIR/core/web/resolver/job_test.go: `.Sprintf(testspecs.DirectRequestSpecTemplate, uuid, uuid)` $DIR/core/web/resolver/job_test.go: `.ValidatedDirectRequestSpec(spec)` $DIR/core/web/resolver/job_test.go: `.Marshal(map[string]interface{}{ "createJob": map[string]interface{}{ "job": map[string]interface{}{ "id": "0", "maxTaskDuration": "0s", "name": jb.Name, "schemaVersion": 1, "createdAt": "0001-01-01T00:00:00Z", "externalJobID": jb.ExternalJobID.String(), }, }, })` $DIR/core/web/resolver/job_test.go: `.ExternalJobID.String()` $DIR/core/web/resolver/job_test.go: `.New("error")` $DIR/core/web/resolver/job_test.go: `.App.On("GetConfig")` $DIR/core/web/resolver/job_test.go: `.Return(f.Mocks.cfg)` $DIR/core/web/resolver/job_test.go: `.App.On("AddJobV2", mock.Anything, &jb)` $DIR/core/web/resolver/job_test.go: `.Return(nil)` $DIR/core/web/resolver/job_test.go: `.App.On("GetConfig")` $DIR/core/web/resolver/job_test.go: `.Return(f.Mocks.cfg)` $DIR/core/web/resolver/job_test.go: `.App.On("AddJobV2", mock.Anything, &jb)` $DIR/core/web/resolver/job_test.go: `.Return(gError)` $DIR/core/web/resolver/job_test.go: `.New()` $DIR/core/web/resolver/job_test.go: `.Marshal(map[string]interface{}{ "deleteJob": map[string]interface{}{ "job": map[string]interface{}{ "id": "123", "maxTaskDuration": "2s", "name": "test-job", "schemaVersion": 0, "createdAt": "2021-01-01T00:00:00Z", "externalJobID": extJID.String(), }, }, })` $DIR/core/web/resolver/job_test.go: `.String()` $DIR/core/web/resolver/job_test.go: `.New("error")` $DIR/core/web/resolver/job_test.go: `.ToInt64("asdadada")` $DIR/core/web/resolver/job_test.go: `.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id)` $DIR/core/web/resolver/job_test.go: `.Return(job.Job{ ID: id, Name: null.StringFrom("test-job"), ExternalJobID: extJID, MaxTaskDuration: models.Interval(2 * time.Second), CreatedAt: f.Timestamp(), }, nil)` $DIR/core/web/resolver/job_test.go: `.StringFrom("test-job")` $DIR/core/web/resolver/job_test.go: `.Interval(2 * time.Second)` $DIR/core/web/resolver/job_test.go: `.Timestamp()` $DIR/core/web/resolver/job_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/job_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_test.go: `.App.On("DeleteJob", mock.Anything, id)` $DIR/core/web/resolver/job_test.go: `.Return(nil)` $DIR/core/web/resolver/job_test.go: `.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id)` $DIR/core/web/resolver/job_test.go: `.Return(job.Job{}, sql.ErrNoRows)` $DIR/core/web/resolver/job_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/job_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_test.go: `.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id)` $DIR/core/web/resolver/job_test.go: `.Return(job.Job{}, nil)` $DIR/core/web/resolver/job_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/job_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_test.go: `.App.On("DeleteJob", mock.Anything, id)` $DIR/core/web/resolver/job_test.go: `.Return(sql.ErrNoRows)` $DIR/core/web/resolver/job_test.go: `.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id)` $DIR/core/web/resolver/job_test.go: `.Return(job.Job{}, gError)` $DIR/core/web/resolver/job_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/job_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_test.go: `.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id)` $DIR/core/web/resolver/job_test.go: `.Return(job.Job{}, nil)` $DIR/core/web/resolver/job_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/job_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/job_test.go: `.App.On("DeleteJob", mock.Anything, id)` $DIR/core/web/resolver/job_test.go: `.Return(gError)` $DIR/core/web/resolver/log_test.go: `f.Mocks.cfg.On("SetLogSQL", true).Return(nil)` $DIR/core/web/resolver/log_test.go: `f.App.On("GetConfig").Return(f.Mocks.cfg)` $DIR/core/web/resolver/log_test.go: `f.Mocks.cfg.On("Database").Return(&databaseConfig{logSQL: false})` $DIR/core/web/resolver/log_test.go: `f.App.On("GetConfig").Return(f.Mocks.cfg)` $DIR/core/web/resolver/log_test.go: `f.Mocks.cfg.On("Log").Return(&log{level: warnLvl})` $DIR/core/web/resolver/log_test.go: `f.App.On("GetConfig").Return(f.Mocks.cfg)` $DIR/core/web/resolver/log_test.go: `f.App.On("SetLogLevel", errorLvl).Return(nil)` $DIR/core/web/resolver/log_test.go: `f.App.On("SetLogLevel", errorLvl).Return(gError)` $DIR/core/web/resolver/log_test.go: `.Mocks.cfg.On("SetLogSQL", true)` $DIR/core/web/resolver/log_test.go: `.Return(nil)` $DIR/core/web/resolver/log_test.go: `.App.On("GetConfig")` $DIR/core/web/resolver/log_test.go: `.Return(f.Mocks.cfg)` $DIR/core/web/resolver/log_test.go: `.Mocks.cfg.On("Database")` $DIR/core/web/resolver/log_test.go: `.Return(&databaseConfig{logSQL: false})` $DIR/core/web/resolver/log_test.go: `.App.On("GetConfig")` $DIR/core/web/resolver/log_test.go: `.Return(f.Mocks.cfg)` $DIR/core/web/resolver/log_test.go: `.UnmarshalText([]byte("warn"))` $DIR/core/web/resolver/log_test.go: `.Mocks.cfg.On("Log")` $DIR/core/web/resolver/log_test.go: `.Return(&log{level: warnLvl})` $DIR/core/web/resolver/log_test.go: `.App.On("GetConfig")` $DIR/core/web/resolver/log_test.go: `.Return(f.Mocks.cfg)` $DIR/core/web/resolver/log_test.go: `.UnmarshalText([]byte("error"))` $DIR/core/web/resolver/log_test.go: `.New("error")` $DIR/core/web/resolver/log_test.go: `.App.On("SetLogLevel", errorLvl)` $DIR/core/web/resolver/log_test.go: `.Return(nil)` $DIR/core/web/resolver/log_test.go: `.App.On("SetLogLevel", errorLvl)` $DIR/core/web/resolver/log_test.go: `.Return(gError)` $DIR/core/web/resolver/node_test.go: `f.App.On("GetRelayers").Return(&chainlinkmocks.FakeRelayerChainInteroperators{ Nodes: []types.NodeStatus{ { ChainID: "1", Name: "node-name", Config: "Name='node-name'\nOrder=11\nHTTPURL='http://some-url'\nWSURL='ws://some-url'", State: "alive", }, }, Relayers: []loop.Relayer{ testutils.MockRelayer{ChainStatus: types.ChainStatus{ ID: "1", Enabled: true, Config: "", }}, }, })` $DIR/core/web/resolver/node_test.go: `f.Mocks.relayerChainInterops.NodesErr = gError` $DIR/core/web/resolver/node_test.go: `f.App.On("GetRelayers").Return(f.Mocks.relayerChainInterops)` $DIR/core/web/resolver/node_test.go: `f.App.On("GetRelayers").Return(&chainlinkmocks.FakeRelayerChainInteroperators{Relayers: []loop.Relayer{ testutils.MockRelayer{NodeStatuses: []types.NodeStatus{ { Name: "node-name", Config: "Name='node-name'\nOrder=11\nHTTPURL='http://some-url'\nWSURL='ws://some-url'", }, }}, }})` $DIR/core/web/resolver/node_test.go: `f.App.On("GetRelayers").Return(&chainlinkmocks.FakeRelayerChainInteroperators{Relayers: []loop.Relayer{}})` $DIR/core/web/resolver/node_test.go: `.New("error")` $DIR/core/web/resolver/node_test.go: `.App.On("GetRelayers")` $DIR/core/web/resolver/node_test.go: `.Return(&chainlinkmocks.FakeRelayerChainInteroperators{ Nodes: []types.NodeStatus{ { ChainID: "1", Name: "node-name", Config: "Name='node-name'\nOrder=11\nHTTPURL='http://some-url'\nWSURL='ws://some-url'", State: "alive", }, }, Relayers: []loop.Relayer{ testutils.MockRelayer{ChainStatus: types.ChainStatus{ ID: "1", Enabled: true, Config: "", }}, }, })` $DIR/core/web/resolver/node_test.go: `.App.On("GetRelayers")` $DIR/core/web/resolver/node_test.go: `.Return(f.Mocks.relayerChainInterops)` $DIR/core/web/resolver/node_test.go: `.App.On("GetRelayers")` $DIR/core/web/resolver/node_test.go: `.Return(&chainlinkmocks.FakeRelayerChainInteroperators{Relayers: []loop.Relayer{ testutils.MockRelayer{NodeStatuses: []types.NodeStatus{ { Name: "node-name", Config: "Name='node-name'\nOrder=11\nHTTPURL='http://some-url'\nWSURL='ws://some-url'", }, }}, }})` $DIR/core/web/resolver/node_test.go: `.App.On("GetRelayers")` $DIR/core/web/resolver/node_test.go: `.Return(&chainlinkmocks.FakeRelayerChainInteroperators{Relayers: []loop.Relayer{}})` $DIR/core/web/resolver/ocr2_keys_test.go: `expectedBundles = append(expectedBundles, map[string]interface{}{ "id": k.ID(), "chainType": ct, "onChainPublicKey": fmt.Sprintf("ocr2on_%s_%s", k.ChainType(), k.OnChainPublicKey()), "configPublicKey": fmt.Sprintf("ocr2cfg_%s_%s", k.ChainType(), hex.EncodeToString(configPublic[:])), "offChainPublicKey": fmt.Sprintf("ocr2off_%s_%s", k.ChainType(), hex.EncodeToString(pubKey[:])), })` $DIR/core/web/resolver/ocr2_keys_test.go: `f.Mocks.ocr2.On("GetAll").Return(fakeKeys, nil)` $DIR/core/web/resolver/ocr2_keys_test.go: `f.Mocks.keystore.On("OCR2").Return(f.Mocks.ocr2)` $DIR/core/web/resolver/ocr2_keys_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/ocr2_keys_test.go: `f.Mocks.ocr2.On("GetAll").Return(nil, gError)` $DIR/core/web/resolver/ocr2_keys_test.go: `f.Mocks.keystore.On("OCR2").Return(f.Mocks.ocr2)` $DIR/core/web/resolver/ocr2_keys_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/ocr2_keys_test.go: `f.Mocks.ocr2.On("Create", mock.Anything, chaintype.ChainType("evm")).Return(fakeKey, nil)` $DIR/core/web/resolver/ocr2_keys_test.go: `f.Mocks.keystore.On("OCR2").Return(f.Mocks.ocr2)` $DIR/core/web/resolver/ocr2_keys_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/ocr2_keys_test.go: `f.Mocks.ocr2.On("Create", mock.Anything, chaintype.ChainType("evm")).Return(nil, gError)` $DIR/core/web/resolver/ocr2_keys_test.go: `f.Mocks.keystore.On("OCR2").Return(f.Mocks.ocr2)` $DIR/core/web/resolver/ocr2_keys_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/ocr2_keys_test.go: `f.Mocks.ocr2.On("Delete", mock.Anything, fakeKey.ID()).Return(nil)` $DIR/core/web/resolver/ocr2_keys_test.go: `f.Mocks.ocr2.On("Get", fakeKey.ID()).Return(fakeKey, nil)` $DIR/core/web/resolver/ocr2_keys_test.go: `f.Mocks.keystore.On("OCR2").Return(f.Mocks.ocr2)` $DIR/core/web/resolver/ocr2_keys_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/ocr2_keys_test.go: `f.Mocks.ocr2.On("Get", fakeKey.ID()).Return(fakeKey, gError)` $DIR/core/web/resolver/ocr2_keys_test.go: `f.Mocks.keystore.On("OCR2").Return(f.Mocks.ocr2)` $DIR/core/web/resolver/ocr2_keys_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/ocr2_keys_test.go: `f.Mocks.ocr2.On("Delete", mock.Anything, fakeKey.ID()).Return(gError)` $DIR/core/web/resolver/ocr2_keys_test.go: `f.Mocks.ocr2.On("Get", fakeKey.ID()).Return(fakeKey, nil)` $DIR/core/web/resolver/ocr2_keys_test.go: `f.Mocks.keystore.On("OCR2").Return(f.Mocks.ocr2)` $DIR/core/web/resolver/ocr2_keys_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/ocr2_keys_test.go: `.New("error")` $DIR/core/web/resolver/ocr2_keys_test.go: `.MustNewInsecure(keystest.NewRandReaderFromSeed(1), "evm")` $DIR/core/web/resolver/ocr2_keys_test.go: `.NewRandReaderFromSeed(1)` $DIR/core/web/resolver/ocr2_keys_test.go: `.MustNewInsecure(keystest.NewRandReaderFromSeed(1), "cosmos")` $DIR/core/web/resolver/ocr2_keys_test.go: `.NewRandReaderFromSeed(1)` $DIR/core/web/resolver/ocr2_keys_test.go: `.MustNewInsecure(keystest.NewRandReaderFromSeed(1), "solana")` $DIR/core/web/resolver/ocr2_keys_test.go: `.NewRandReaderFromSeed(1)` $DIR/core/web/resolver/ocr2_keys_test.go: `.MustNewInsecure(keystest.NewRandReaderFromSeed(1), "starknet")` $DIR/core/web/resolver/ocr2_keys_test.go: `.NewRandReaderFromSeed(1)` $DIR/core/web/resolver/ocr2_keys_test.go: `.ConfigEncryptionPublicKey()` $DIR/core/web/resolver/ocr2_keys_test.go: `.ChainType()` $DIR/core/web/resolver/ocr2_keys_test.go: `.OffchainPublicKey()` $DIR/core/web/resolver/ocr2_keys_test.go: `.ID()` $DIR/core/web/resolver/ocr2_keys_test.go: `.Sprintf("ocr2on_%s_%s", k.ChainType(), k.OnChainPublicKey())` $DIR/core/web/resolver/ocr2_keys_test.go: `.ChainType()` $DIR/core/web/resolver/ocr2_keys_test.go: `.OnChainPublicKey()` $DIR/core/web/resolver/ocr2_keys_test.go: `.Sprintf("ocr2cfg_%s_%s", k.ChainType(), hex.EncodeToString(configPublic[:]))` $DIR/core/web/resolver/ocr2_keys_test.go: `.ChainType()` $DIR/core/web/resolver/ocr2_keys_test.go: `.EncodeToString(configPublic[:])` $DIR/core/web/resolver/ocr2_keys_test.go: `.Sprintf("ocr2off_%s_%s", k.ChainType(), hex.EncodeToString(pubKey[:]))` $DIR/core/web/resolver/ocr2_keys_test.go: `.ChainType()` $DIR/core/web/resolver/ocr2_keys_test.go: `.EncodeToString(pubKey[:])` $DIR/core/web/resolver/ocr2_keys_test.go: `.Marshal(map[string]interface{}{ "ocr2KeyBundles": map[string]interface{}{ "results": expectedBundles, }, })` $DIR/core/web/resolver/ocr2_keys_test.go: `.Mocks.ocr2.On("GetAll")` $DIR/core/web/resolver/ocr2_keys_test.go: `.Return(fakeKeys, nil)` $DIR/core/web/resolver/ocr2_keys_test.go: `.Mocks.keystore.On("OCR2")` $DIR/core/web/resolver/ocr2_keys_test.go: `.Return(f.Mocks.ocr2)` $DIR/core/web/resolver/ocr2_keys_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/ocr2_keys_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/ocr2_keys_test.go: `.Mocks.ocr2.On("GetAll")` $DIR/core/web/resolver/ocr2_keys_test.go: `.Return(nil, gError)` $DIR/core/web/resolver/ocr2_keys_test.go: `.Mocks.keystore.On("OCR2")` $DIR/core/web/resolver/ocr2_keys_test.go: `.Return(f.Mocks.ocr2)` $DIR/core/web/resolver/ocr2_keys_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/ocr2_keys_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/ocr2_keys_test.go: `.New("error")` $DIR/core/web/resolver/ocr2_keys_test.go: `.MustNewInsecure(keystest.NewRandReaderFromSeed(1), "evm")` $DIR/core/web/resolver/ocr2_keys_test.go: `.NewRandReaderFromSeed(1)` $DIR/core/web/resolver/ocr2_keys_test.go: `.ChainType()` $DIR/core/web/resolver/ocr2_keys_test.go: `.ConfigEncryptionPublicKey()` $DIR/core/web/resolver/ocr2_keys_test.go: `.OffchainPublicKey()` $DIR/core/web/resolver/ocr2_keys_test.go: `.Marshal(map[string]interface{}{ "createOCR2KeyBundle": map[string]interface{}{ "bundle": map[string]interface{}{ "id": fakeKey.ID(), "chainType": ct, "onChainPublicKey": fmt.Sprintf("ocr2on_%s_%s", fakeKey.ChainType(), fakeKey.OnChainPublicKey()), "configPublicKey": fmt.Sprintf("ocr2cfg_%s_%s", fakeKey.ChainType(), hex.EncodeToString(configPublic[:])), "offChainPublicKey": fmt.Sprintf("ocr2off_%s_%s", fakeKey.ChainType(), hex.EncodeToString(pubKey[:])), }, }, })` $DIR/core/web/resolver/ocr2_keys_test.go: `.ID()` $DIR/core/web/resolver/ocr2_keys_test.go: `.Sprintf("ocr2on_%s_%s", fakeKey.ChainType(), fakeKey.OnChainPublicKey())` $DIR/core/web/resolver/ocr2_keys_test.go: `.ChainType()` $DIR/core/web/resolver/ocr2_keys_test.go: `.OnChainPublicKey()` $DIR/core/web/resolver/ocr2_keys_test.go: `.Sprintf("ocr2cfg_%s_%s", fakeKey.ChainType(), hex.EncodeToString(configPublic[:]))` $DIR/core/web/resolver/ocr2_keys_test.go: `.ChainType()` $DIR/core/web/resolver/ocr2_keys_test.go: `.EncodeToString(configPublic[:])` $DIR/core/web/resolver/ocr2_keys_test.go: `.Sprintf("ocr2off_%s_%s", fakeKey.ChainType(), hex.EncodeToString(pubKey[:]))` $DIR/core/web/resolver/ocr2_keys_test.go: `.ChainType()` $DIR/core/web/resolver/ocr2_keys_test.go: `.EncodeToString(pubKey[:])` $DIR/core/web/resolver/ocr2_keys_test.go: `.Mocks.ocr2.On("Create", mock.Anything, chaintype.ChainType("evm"))` $DIR/core/web/resolver/ocr2_keys_test.go: `.ChainType("evm")` $DIR/core/web/resolver/ocr2_keys_test.go: `.Return(fakeKey, nil)` $DIR/core/web/resolver/ocr2_keys_test.go: `.Mocks.keystore.On("OCR2")` $DIR/core/web/resolver/ocr2_keys_test.go: `.Return(f.Mocks.ocr2)` $DIR/core/web/resolver/ocr2_keys_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/ocr2_keys_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/ocr2_keys_test.go: `.Mocks.ocr2.On("Create", mock.Anything, chaintype.ChainType("evm"))` $DIR/core/web/resolver/ocr2_keys_test.go: `.ChainType("evm")` $DIR/core/web/resolver/ocr2_keys_test.go: `.Return(nil, gError)` $DIR/core/web/resolver/ocr2_keys_test.go: `.Mocks.keystore.On("OCR2")` $DIR/core/web/resolver/ocr2_keys_test.go: `.Return(f.Mocks.ocr2)` $DIR/core/web/resolver/ocr2_keys_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/ocr2_keys_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/ocr2_keys_test.go: `.MustNewInsecure(keystest.NewRandReaderFromSeed(1), "evm")` $DIR/core/web/resolver/ocr2_keys_test.go: `.NewRandReaderFromSeed(1)` $DIR/core/web/resolver/ocr2_keys_test.go: `.ID()` $DIR/core/web/resolver/ocr2_keys_test.go: `.ChainType()` $DIR/core/web/resolver/ocr2_keys_test.go: `.ConfigEncryptionPublicKey()` $DIR/core/web/resolver/ocr2_keys_test.go: `.OffchainPublicKey()` $DIR/core/web/resolver/ocr2_keys_test.go: `.Marshal(map[string]interface{}{ "deleteOCR2KeyBundle": map[string]interface{}{ "bundle": map[string]interface{}{ "id": fakeKey.ID(), "chainType": ct, "onChainPublicKey": fmt.Sprintf("ocr2on_%s_%s", fakeKey.ChainType(), fakeKey.OnChainPublicKey()), "configPublicKey": fmt.Sprintf("ocr2cfg_%s_%s", fakeKey.ChainType(), hex.EncodeToString(configPublic[:])), "offChainPublicKey": fmt.Sprintf("ocr2off_%s_%s", fakeKey.ChainType(), hex.EncodeToString(pubKey[:])), }, }, })` $DIR/core/web/resolver/ocr2_keys_test.go: `.ID()` $DIR/core/web/resolver/ocr2_keys_test.go: `.Sprintf("ocr2on_%s_%s", fakeKey.ChainType(), fakeKey.OnChainPublicKey())` $DIR/core/web/resolver/ocr2_keys_test.go: `.ChainType()` $DIR/core/web/resolver/ocr2_keys_test.go: `.OnChainPublicKey()` $DIR/core/web/resolver/ocr2_keys_test.go: `.Sprintf("ocr2cfg_%s_%s", fakeKey.ChainType(), hex.EncodeToString(configPublic[:]))` $DIR/core/web/resolver/ocr2_keys_test.go: `.ChainType()` $DIR/core/web/resolver/ocr2_keys_test.go: `.EncodeToString(configPublic[:])` $DIR/core/web/resolver/ocr2_keys_test.go: `.Sprintf("ocr2off_%s_%s", fakeKey.ChainType(), hex.EncodeToString(pubKey[:]))` $DIR/core/web/resolver/ocr2_keys_test.go: `.ChainType()` $DIR/core/web/resolver/ocr2_keys_test.go: `.EncodeToString(pubKey[:])` $DIR/core/web/resolver/ocr2_keys_test.go: `.New("error")` $DIR/core/web/resolver/ocr2_keys_test.go: `.Mocks.ocr2.On("Delete", mock.Anything, fakeKey.ID())` $DIR/core/web/resolver/ocr2_keys_test.go: `.ID()` $DIR/core/web/resolver/ocr2_keys_test.go: `.Return(nil)` $DIR/core/web/resolver/ocr2_keys_test.go: `.Mocks.ocr2.On("Get", fakeKey.ID())` $DIR/core/web/resolver/ocr2_keys_test.go: `.ID()` $DIR/core/web/resolver/ocr2_keys_test.go: `.Return(fakeKey, nil)` $DIR/core/web/resolver/ocr2_keys_test.go: `.Mocks.keystore.On("OCR2")` $DIR/core/web/resolver/ocr2_keys_test.go: `.Return(f.Mocks.ocr2)` $DIR/core/web/resolver/ocr2_keys_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/ocr2_keys_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/ocr2_keys_test.go: `.Mocks.ocr2.On("Get", fakeKey.ID())` $DIR/core/web/resolver/ocr2_keys_test.go: `.ID()` $DIR/core/web/resolver/ocr2_keys_test.go: `.Return(fakeKey, gError)` $DIR/core/web/resolver/ocr2_keys_test.go: `.Mocks.keystore.On("OCR2")` $DIR/core/web/resolver/ocr2_keys_test.go: `.Return(f.Mocks.ocr2)` $DIR/core/web/resolver/ocr2_keys_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/ocr2_keys_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/ocr2_keys_test.go: `.Mocks.ocr2.On("Delete", mock.Anything, fakeKey.ID())` $DIR/core/web/resolver/ocr2_keys_test.go: `.ID()` $DIR/core/web/resolver/ocr2_keys_test.go: `.Return(gError)` $DIR/core/web/resolver/ocr2_keys_test.go: `.Mocks.ocr2.On("Get", fakeKey.ID())` $DIR/core/web/resolver/ocr2_keys_test.go: `.ID()` $DIR/core/web/resolver/ocr2_keys_test.go: `.Return(fakeKey, nil)` $DIR/core/web/resolver/ocr2_keys_test.go: `.Mocks.keystore.On("OCR2")` $DIR/core/web/resolver/ocr2_keys_test.go: `.Return(f.Mocks.ocr2)` $DIR/core/web/resolver/ocr2_keys_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/ocr2_keys_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/ocr_test.go: `fakeKeys = append(fakeKeys, k)` $DIR/core/web/resolver/ocr_test.go: `expectedBundles = append(expectedBundles, map[string]string{ "id": k.ID(), "configPublicKey": ocrkey.ConfigPublicKey(k.PublicKeyConfig()).String(), "offChainPublicKey": k.OffChainSigning.PublicKey().String(), "onChainSigningAddress": k.OnChainSigning.Address().String(), })` $DIR/core/web/resolver/ocr_test.go: `f.Mocks.ocr.On("GetAll").Return(fakeKeys, nil)` $DIR/core/web/resolver/ocr_test.go: `f.Mocks.keystore.On("OCR").Return(f.Mocks.ocr)` $DIR/core/web/resolver/ocr_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/ocr_test.go: `f.Mocks.ocr.On("Create", mock.Anything).Return(fakeKey, nil)` $DIR/core/web/resolver/ocr_test.go: `f.Mocks.keystore.On("OCR").Return(f.Mocks.ocr)` $DIR/core/web/resolver/ocr_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/ocr_test.go: `f.Mocks.ocr.On("Delete", mock.Anything, fakeKey.ID()).Return(fakeKey, nil)` $DIR/core/web/resolver/ocr_test.go: `f.Mocks.keystore.On("OCR").Return(f.Mocks.ocr)` $DIR/core/web/resolver/ocr_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/ocr_test.go: `f.Mocks.ocr. On("Delete", mock.Anything, fakeKey.ID()). Return(ocrkey.KeyV2{}, keystore.KeyNotFoundError{ID: "helloWorld", KeyType: "OCR"})` $DIR/core/web/resolver/ocr_test.go: `f.Mocks.keystore.On("OCR").Return(f.Mocks.ocr)` $DIR/core/web/resolver/ocr_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/ocr_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(1))` $DIR/core/web/resolver/ocr_test.go: `.NewInt(1)` $DIR/core/web/resolver/ocr_test.go: `.ID()` $DIR/core/web/resolver/ocr_test.go: `.ConfigPublicKey(k.PublicKeyConfig())` $DIR/core/web/resolver/ocr_test.go: `.PublicKeyConfig()` $DIR/core/web/resolver/ocr_test.go: `.String()` $DIR/core/web/resolver/ocr_test.go: `.OffChainSigning.PublicKey()` $DIR/core/web/resolver/ocr_test.go: `.String()` $DIR/core/web/resolver/ocr_test.go: `.OnChainSigning.Address()` $DIR/core/web/resolver/ocr_test.go: `.String()` $DIR/core/web/resolver/ocr_test.go: `.Marshal(map[string]interface{}{ "ocrKeyBundles": map[string]interface{}{ "results": expectedBundles, }, })` $DIR/core/web/resolver/ocr_test.go: `.Mocks.ocr.On("GetAll")` $DIR/core/web/resolver/ocr_test.go: `.Return(fakeKeys, nil)` $DIR/core/web/resolver/ocr_test.go: `.Mocks.keystore.On("OCR")` $DIR/core/web/resolver/ocr_test.go: `.Return(f.Mocks.ocr)` $DIR/core/web/resolver/ocr_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/ocr_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/ocr_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(1))` $DIR/core/web/resolver/ocr_test.go: `.NewInt(1)` $DIR/core/web/resolver/ocr_test.go: `.Marshal(map[string]interface{}{ "createOCRKeyBundle": map[string]interface{}{ "bundle": map[string]interface{}{ "id": fakeKey.ID(), "configPublicKey": ocrkey.ConfigPublicKey(fakeKey.PublicKeyConfig()).String(), "offChainPublicKey": fakeKey.OffChainSigning.PublicKey().String(), "onChainSigningAddress": fakeKey.OnChainSigning.Address().String(), }, }, })` $DIR/core/web/resolver/ocr_test.go: `.ID()` $DIR/core/web/resolver/ocr_test.go: `.ConfigPublicKey(fakeKey.PublicKeyConfig())` $DIR/core/web/resolver/ocr_test.go: `.PublicKeyConfig()` $DIR/core/web/resolver/ocr_test.go: `.String()` $DIR/core/web/resolver/ocr_test.go: `.OffChainSigning.PublicKey()` $DIR/core/web/resolver/ocr_test.go: `.String()` $DIR/core/web/resolver/ocr_test.go: `.OnChainSigning.Address()` $DIR/core/web/resolver/ocr_test.go: `.String()` $DIR/core/web/resolver/ocr_test.go: `.Mocks.ocr.On("Create", mock.Anything)` $DIR/core/web/resolver/ocr_test.go: `.Return(fakeKey, nil)` $DIR/core/web/resolver/ocr_test.go: `.Mocks.keystore.On("OCR")` $DIR/core/web/resolver/ocr_test.go: `.Return(f.Mocks.ocr)` $DIR/core/web/resolver/ocr_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/ocr_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/ocr_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(1))` $DIR/core/web/resolver/ocr_test.go: `.NewInt(1)` $DIR/core/web/resolver/ocr_test.go: `.ID()` $DIR/core/web/resolver/ocr_test.go: `.Marshal(map[string]interface{}{ "deleteOCRKeyBundle": map[string]interface{}{ "bundle": map[string]interface{}{ "id": fakeKey.ID(), "configPublicKey": ocrkey.ConfigPublicKey(fakeKey.PublicKeyConfig()).String(), "offChainPublicKey": fakeKey.OffChainSigning.PublicKey().String(), "onChainSigningAddress": fakeKey.OnChainSigning.Address().String(), }, }, })` $DIR/core/web/resolver/ocr_test.go: `.ID()` $DIR/core/web/resolver/ocr_test.go: `.ConfigPublicKey(fakeKey.PublicKeyConfig())` $DIR/core/web/resolver/ocr_test.go: `.PublicKeyConfig()` $DIR/core/web/resolver/ocr_test.go: `.String()` $DIR/core/web/resolver/ocr_test.go: `.OffChainSigning.PublicKey()` $DIR/core/web/resolver/ocr_test.go: `.String()` $DIR/core/web/resolver/ocr_test.go: `.OnChainSigning.Address()` $DIR/core/web/resolver/ocr_test.go: `.String()` $DIR/core/web/resolver/ocr_test.go: `.Mocks.ocr.On("Delete", mock.Anything, fakeKey.ID())` $DIR/core/web/resolver/ocr_test.go: `.ID()` $DIR/core/web/resolver/ocr_test.go: `.Return(fakeKey, nil)` $DIR/core/web/resolver/ocr_test.go: `.Mocks.keystore.On("OCR")` $DIR/core/web/resolver/ocr_test.go: `.Return(f.Mocks.ocr)` $DIR/core/web/resolver/ocr_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/ocr_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/ocr_test.go: `.Mocks.ocr. On("Delete", mock.Anything, fakeKey.ID())` $DIR/core/web/resolver/ocr_test.go: `.ID()` $DIR/core/web/resolver/ocr_test.go: `. Return(ocrkey.KeyV2{}, keystore.KeyNotFoundError{ID: "helloWorld", KeyType: "OCR"})` $DIR/core/web/resolver/ocr_test.go: `.Mocks.keystore.On("OCR")` $DIR/core/web/resolver/ocr_test.go: `.Return(f.Mocks.ocr)` $DIR/core/web/resolver/ocr_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/ocr_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/p2p_test.go: `fakeKeys = append(fakeKeys, k)` $DIR/core/web/resolver/p2p_test.go: `expectedKeys = append(expectedKeys, map[string]string{ "id": k.ID(), "peerID": k.PeerID().String(), "publicKey": k.PublicKeyHex(), })` $DIR/core/web/resolver/p2p_test.go: `f.Mocks.p2p.On("GetAll").Return(fakeKeys, nil)` $DIR/core/web/resolver/p2p_test.go: `f.Mocks.keystore.On("P2P").Return(f.Mocks.p2p)` $DIR/core/web/resolver/p2p_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/p2p_test.go: `f.Mocks.p2p.On("Create", mock.Anything).Return(fakeKey, nil)` $DIR/core/web/resolver/p2p_test.go: `f.Mocks.keystore.On("P2P").Return(f.Mocks.p2p)` $DIR/core/web/resolver/p2p_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/p2p_test.go: `f.Mocks.p2p.On("Delete", mock.Anything, peerID).Return(fakeKey, nil)` $DIR/core/web/resolver/p2p_test.go: `f.Mocks.keystore.On("P2P").Return(f.Mocks.p2p)` $DIR/core/web/resolver/p2p_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/p2p_test.go: `f.Mocks.p2p. On("Delete", mock.Anything, peerID). Return( p2pkey.KeyV2{}, keystore.KeyNotFoundError{ID: peerID.String(), KeyType: "P2P"}, )` $DIR/core/web/resolver/p2p_test.go: `f.Mocks.keystore.On("P2P").Return(f.Mocks.p2p)` $DIR/core/web/resolver/p2p_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/p2p_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(1))` $DIR/core/web/resolver/p2p_test.go: `.NewInt(1)` $DIR/core/web/resolver/p2p_test.go: `.ID()` $DIR/core/web/resolver/p2p_test.go: `.PeerID()` $DIR/core/web/resolver/p2p_test.go: `.String()` $DIR/core/web/resolver/p2p_test.go: `.PublicKeyHex()` $DIR/core/web/resolver/p2p_test.go: `.Marshal(map[string]interface{}{ "p2pKeys": map[string]interface{}{ "results": expectedKeys, }, })` $DIR/core/web/resolver/p2p_test.go: `.Mocks.p2p.On("GetAll")` $DIR/core/web/resolver/p2p_test.go: `.Return(fakeKeys, nil)` $DIR/core/web/resolver/p2p_test.go: `.Mocks.keystore.On("P2P")` $DIR/core/web/resolver/p2p_test.go: `.Return(f.Mocks.p2p)` $DIR/core/web/resolver/p2p_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/p2p_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/p2p_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(1))` $DIR/core/web/resolver/p2p_test.go: `.NewInt(1)` $DIR/core/web/resolver/p2p_test.go: `.Marshal(map[string]interface{}{ "createP2PKey": map[string]interface{}{ "p2pKey": map[string]interface{}{ "id": fakeKey.ID(), "peerID": fakeKey.PeerID().String(), "publicKey": fakeKey.PublicKeyHex(), }, }, })` $DIR/core/web/resolver/p2p_test.go: `.ID()` $DIR/core/web/resolver/p2p_test.go: `.PeerID()` $DIR/core/web/resolver/p2p_test.go: `.String()` $DIR/core/web/resolver/p2p_test.go: `.PublicKeyHex()` $DIR/core/web/resolver/p2p_test.go: `.Mocks.p2p.On("Create", mock.Anything)` $DIR/core/web/resolver/p2p_test.go: `.Return(fakeKey, nil)` $DIR/core/web/resolver/p2p_test.go: `.Mocks.keystore.On("P2P")` $DIR/core/web/resolver/p2p_test.go: `.Return(f.Mocks.p2p)` $DIR/core/web/resolver/p2p_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/p2p_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/p2p_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(1))` $DIR/core/web/resolver/p2p_test.go: `.NewInt(1)` $DIR/core/web/resolver/p2p_test.go: `.ID()` $DIR/core/web/resolver/p2p_test.go: `.MakePeerID(fakeKey.ID())` $DIR/core/web/resolver/p2p_test.go: `.ID()` $DIR/core/web/resolver/p2p_test.go: `.Marshal(map[string]interface{}{ "deleteP2PKey": map[string]interface{}{ "p2pKey": map[string]interface{}{ "id": fakeKey.ID(), "peerID": fakeKey.PeerID().String(), "publicKey": fakeKey.PublicKeyHex(), }, }, })` $DIR/core/web/resolver/p2p_test.go: `.ID()` $DIR/core/web/resolver/p2p_test.go: `.PeerID()` $DIR/core/web/resolver/p2p_test.go: `.String()` $DIR/core/web/resolver/p2p_test.go: `.PublicKeyHex()` $DIR/core/web/resolver/p2p_test.go: `.Mocks.p2p.On("Delete", mock.Anything, peerID)` $DIR/core/web/resolver/p2p_test.go: `.Return(fakeKey, nil)` $DIR/core/web/resolver/p2p_test.go: `.Mocks.keystore.On("P2P")` $DIR/core/web/resolver/p2p_test.go: `.Return(f.Mocks.p2p)` $DIR/core/web/resolver/p2p_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/p2p_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/p2p_test.go: `.Mocks.p2p. On("Delete", mock.Anything, peerID)` $DIR/core/web/resolver/p2p_test.go: `. Return( p2pkey.KeyV2{}, keystore.KeyNotFoundError{ID: peerID.String(), KeyType: "P2P"}, )` $DIR/core/web/resolver/p2p_test.go: `.String()` $DIR/core/web/resolver/p2p_test.go: `.Mocks.keystore.On("P2P")` $DIR/core/web/resolver/p2p_test.go: `.Return(f.Mocks.p2p)` $DIR/core/web/resolver/p2p_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/p2p_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/p2p_test.go: `.Sprintf(`{ "deleteP2PKey": { "code":"NOT_FOUND", "message":"unable to find P2P key with id %s" } }`, peerID.String())` $DIR/core/web/resolver/p2p_test.go: `.String()` $DIR/core/web/resolver/solana_key_test.go: `f.Mocks.solana.On("GetAll").Return([]solkey.Key{k}, nil)` $DIR/core/web/resolver/solana_key_test.go: `f.Mocks.keystore.On("Solana").Return(f.Mocks.solana)` $DIR/core/web/resolver/solana_key_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/solana_key_test.go: `f.Mocks.solana.On("GetAll").Return([]solkey.Key{}, gError)` $DIR/core/web/resolver/solana_key_test.go: `f.Mocks.keystore.On("Solana").Return(f.Mocks.solana)` $DIR/core/web/resolver/solana_key_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/solana_key_test.go: `.MustNewInsecure(keystest.NewRandReaderFromSeed(1))` $DIR/core/web/resolver/solana_key_test.go: `.NewRandReaderFromSeed(1)` $DIR/core/web/resolver/solana_key_test.go: `.Sprintf(` { "solanaKeys": { "results": [ { "id": "%s" } ] } }`, k.PublicKeyStr())` $DIR/core/web/resolver/solana_key_test.go: `.PublicKeyStr()` $DIR/core/web/resolver/solana_key_test.go: `.New("error")` $DIR/core/web/resolver/solana_key_test.go: `.Mocks.solana.On("GetAll")` $DIR/core/web/resolver/solana_key_test.go: `.Return([]solkey.Key{k}, nil)` $DIR/core/web/resolver/solana_key_test.go: `.Mocks.keystore.On("Solana")` $DIR/core/web/resolver/solana_key_test.go: `.Return(f.Mocks.solana)` $DIR/core/web/resolver/solana_key_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/solana_key_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/solana_key_test.go: `.Mocks.solana.On("GetAll")` $DIR/core/web/resolver/solana_key_test.go: `.Return([]solkey.Key{}, gError)` $DIR/core/web/resolver/solana_key_test.go: `.Mocks.keystore.On("Solana")` $DIR/core/web/resolver/solana_key_test.go: `.Return(f.Mocks.solana)` $DIR/core/web/resolver/solana_key_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/solana_key_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/spec_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `f.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id).Return(job.Job{ Type: job.Cron, CronSpec: &job.CronSpec{ CronSchedule: "CRON_TZ=UTC 0 0 1 1 *", CreatedAt: f.Timestamp(), }, }, nil)` $DIR/core/web/resolver/spec_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `f.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id).Return(job.Job{ Type: job.DirectRequest, DirectRequestSpec: &job.DirectRequestSpec{ ContractAddress: contractAddress, CreatedAt: f.Timestamp(), EVMChainID: ubig.NewI(42), MinIncomingConfirmations: clnull.NewUint32(1, true), MinContractPayment: commonassets.NewLinkFromJuels(1000), Requesters: models.AddressCollection{requesterAddress}, }, }, nil)` $DIR/core/web/resolver/spec_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `f.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id).Return(job.Job{ Type: job.FluxMonitor, FluxMonitorSpec: &job.FluxMonitorSpec{ ContractAddress: contractAddress, CreatedAt: f.Timestamp(), EVMChainID: ubig.NewI(42), DrumbeatEnabled: false, IdleTimerDisabled: false, IdleTimerPeriod: 1 * time.Hour, MinPayment: commonassets.NewLinkFromJuels(1000), PollTimerDisabled: false, PollTimerPeriod: 1 * time.Minute, }, }, nil)` $DIR/core/web/resolver/spec_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `f.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id).Return(job.Job{ Type: job.FluxMonitor, FluxMonitorSpec: &job.FluxMonitorSpec{ ContractAddress: contractAddress, CreatedAt: f.Timestamp(), EVMChainID: ubig.NewI(42), DrumbeatEnabled: true, DrumbeatRandomDelay: 1 * time.Second, DrumbeatSchedule: "CRON_TZ=UTC 0 0 1 1 *", IdleTimerDisabled: true, IdleTimerPeriod: 1 * time.Hour, MinPayment: commonassets.NewLinkFromJuels(1000), PollTimerDisabled: true, PollTimerPeriod: 1 * time.Minute, }, }, nil)` $DIR/core/web/resolver/spec_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `f.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id).Return(job.Job{ Type: job.Keeper, KeeperSpec: &job.KeeperSpec{ ContractAddress: contractAddress, CreatedAt: f.Timestamp(), EVMChainID: ubig.NewI(42), FromAddress: evmtypes.EIP55AddressFromAddress(fromAddress), }, }, nil)` $DIR/core/web/resolver/spec_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `f.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id).Return(job.Job{ Type: job.OffchainReporting, OCROracleSpec: &job.OCROracleSpec{ BlockchainTimeout: models.Interval(1 * time.Minute), ContractAddress: contractAddress, ContractConfigConfirmations: 1, ContractConfigTrackerPollInterval: models.Interval(1 * time.Minute), ContractConfigTrackerSubscribeInterval: models.Interval(2 * time.Minute), DatabaseTimeout: models.NewInterval(3 * time.Second), ObservationGracePeriod: models.NewInterval(4 * time.Second), ContractTransmitterTransmitTimeout: models.NewInterval(555 * time.Millisecond), CreatedAt: f.Timestamp(), EVMChainID: ubig.NewI(42), IsBootstrapPeer: false, EncryptedOCRKeyBundleID: &keyBundleID, ObservationTimeout: models.Interval(2 * time.Minute), P2PV2Bootstrappers: pq.StringArray{"12D3KooWL3XJ9EMCyZvmmGXL2LMiVBtrVa2BuESsJiXkSj7333Jw@localhost:5001"}, TransmitterAddress: &transmitterAddress, }, }, nil)` $DIR/core/web/resolver/spec_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `f.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id).Return(job.Job{ Type: job.OffchainReporting2, OCR2OracleSpec: &job.OCR2OracleSpec{ BlockchainTimeout: models.Interval(1 * time.Minute), ContractID: contractAddress.String(), ContractConfigConfirmations: 1, ContractConfigTrackerPollInterval: models.Interval(1 * time.Minute), CreatedAt: f.Timestamp(), OCRKeyBundleID: null.StringFrom(keyBundleID.String()), MonitoringEndpoint: null.StringFrom("https://monitor.endpoint"), P2PV2Bootstrappers: pq.StringArray{"12D3KooWL3XJ9EMCyZvmmGXL2LMiVBtrVa2BuESsJiXkSj7333Jw@localhost:5001"}, Relay: types.NetworkEVM, RelayConfig: relayConfig, TransmitterID: null.StringFrom(transmitterAddress.String()), PluginType: types.Median, PluginConfig: pluginConfig, }, }, nil)` $DIR/core/web/resolver/spec_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `f.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id).Return(job.Job{ Type: job.VRF, VRFSpec: &job.VRFSpec{ BatchCoordinatorAddress: &batchCoordinatorAddress, BatchFulfillmentEnabled: true, CustomRevertsPipelineEnabled: true, MinIncomingConfirmations: 1, CoordinatorAddress: coordinatorAddress, CreatedAt: f.Timestamp(), EVMChainID: ubig.NewI(42), FromAddresses: []evmtypes.EIP55Address{fromAddress1, fromAddress2}, PollPeriod: 1 * time.Minute, PublicKey: pubKey, RequestedConfsDelay: 10, RequestTimeout: 24 * time.Hour, ChunkSize: 25, BatchFulfillmentGasMultiplier: 1, BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(200), }, }, nil)` $DIR/core/web/resolver/spec_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `f.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id).Return(job.Job{ Type: job.Webhook, WebhookSpec: &job.WebhookSpec{ CreatedAt: f.Timestamp(), }, }, nil)` $DIR/core/web/resolver/spec_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `f.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id).Return(job.Job{ Type: job.BlockhashStore, BlockhashStoreSpec: &job.BlockhashStoreSpec{ CoordinatorV1Address: &coordinatorV1Address, CoordinatorV2Address: &coordinatorV2Address, CoordinatorV2PlusAddress: &coordinatorV2PlusAddress, CreatedAt: f.Timestamp(), EVMChainID: ubig.NewI(42), FromAddresses: []evmtypes.EIP55Address{fromAddress1, fromAddress2}, PollPeriod: 1 * time.Minute, RunTimeout: 37 * time.Second, WaitBlocks: 100, LookbackBlocks: 200, HeartbeatPeriod: 450 * time.Second, BlockhashStoreAddress: blockhashStoreAddress, TrustedBlockhashStoreAddress: &trustedBlockhashStoreAddress, TrustedBlockhashStoreBatchSize: trustedBlockhashStoreBatchSize, }, }, nil)` $DIR/core/web/resolver/spec_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `f.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id).Return(job.Job{ Type: job.BlockHeaderFeeder, BlockHeaderFeederSpec: &job.BlockHeaderFeederSpec{ CoordinatorV1Address: &coordinatorV1Address, CoordinatorV2Address: &coordinatorV2Address, CoordinatorV2PlusAddress: &coordinatorV2PlusAddress, CreatedAt: f.Timestamp(), EVMChainID: ubig.NewI(42), FromAddresses: []evmtypes.EIP55Address{fromAddress}, PollPeriod: 1 * time.Minute, RunTimeout: 37 * time.Second, WaitBlocks: 100, LookbackBlocks: 200, BlockhashStoreAddress: blockhashStoreAddress, BatchBlockhashStoreAddress: batchBHSAddress, GetBlockhashesBatchSize: 5, StoreBlockhashesBatchSize: 3, }, }, nil)` $DIR/core/web/resolver/spec_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `f.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id).Return(job.Job{ Type: job.Bootstrap, BootstrapSpec: &job.BootstrapSpec{ ID: id, ContractID: "0x613a38AC1659769640aaE063C651F48E0250454C", Relay: "evm", RelayConfig: map[string]interface{}{}, MonitoringEndpoint: null.String{}, BlockchainTimeout: models.Interval(2 * time.Minute), ContractConfigTrackerPollInterval: models.Interval(2 * time.Minute), ContractConfigConfirmations: 100, CreatedAt: f.Timestamp(), }, }, nil)` $DIR/core/web/resolver/spec_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `f.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id).Return(job.Job{ Type: job.Workflow, WorkflowSpec: &job.WorkflowSpec{ ID: id, WorkflowID: "", Workflow: "", }, }, nil)` $DIR/core/web/resolver/spec_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `f.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id).Return(job.Job{ Type: job.Gateway, GatewaySpec: &job.GatewaySpec{ ID: id, GatewayConfig: gatewayConfig, CreatedAt: f.Timestamp(), }, }, nil)` $DIR/core/web/resolver/spec_test.go: `f.App.On("JobORM").Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `f.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id).Return(job.Job{ Type: job.StandardCapabilities, StandardCapabilitiesSpec: &job.StandardCapabilitiesSpec{ ID: id, CreatedAt: f.Timestamp(), Command: "testcommand", Config: "testconfig", }, }, nil)` $DIR/core/web/resolver/spec_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/spec_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id)` $DIR/core/web/resolver/spec_test.go: `.Return(job.Job{ Type: job.Cron, CronSpec: &job.CronSpec{ CronSchedule: "CRON_TZ=UTC 0 0 1 1 *", CreatedAt: f.Timestamp(), }, }, nil)` $DIR/core/web/resolver/spec_test.go: `.Timestamp()` $DIR/core/web/resolver/spec_test.go: `.HexToAddress("0x3cCad4715152693fE3BC4460591e3D3Fbd071b42")` $DIR/core/web/resolver/spec_test.go: `.NewEIP55Address("0x613a38AC1659769640aaE063C651F48E0250454C")` $DIR/core/web/resolver/spec_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/spec_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id)` $DIR/core/web/resolver/spec_test.go: `.Return(job.Job{ Type: job.DirectRequest, DirectRequestSpec: &job.DirectRequestSpec{ ContractAddress: contractAddress, CreatedAt: f.Timestamp(), EVMChainID: ubig.NewI(42), MinIncomingConfirmations: clnull.NewUint32(1, true), MinContractPayment: commonassets.NewLinkFromJuels(1000), Requesters: models.AddressCollection{requesterAddress}, }, }, nil)` $DIR/core/web/resolver/spec_test.go: `.Timestamp()` $DIR/core/web/resolver/spec_test.go: `.NewI(42)` $DIR/core/web/resolver/spec_test.go: `.NewUint32(1, true)` $DIR/core/web/resolver/spec_test.go: `.NewLinkFromJuels(1000)` $DIR/core/web/resolver/spec_test.go: `.NewEIP55Address("0x613a38AC1659769640aaE063C651F48E0250454C")` $DIR/core/web/resolver/spec_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/spec_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id)` $DIR/core/web/resolver/spec_test.go: `.Return(job.Job{ Type: job.FluxMonitor, FluxMonitorSpec: &job.FluxMonitorSpec{ ContractAddress: contractAddress, CreatedAt: f.Timestamp(), EVMChainID: ubig.NewI(42), DrumbeatEnabled: false, IdleTimerDisabled: false, IdleTimerPeriod: 1 * time.Hour, MinPayment: commonassets.NewLinkFromJuels(1000), PollTimerDisabled: false, PollTimerPeriod: 1 * time.Minute, }, }, nil)` $DIR/core/web/resolver/spec_test.go: `.Timestamp()` $DIR/core/web/resolver/spec_test.go: `.NewI(42)` $DIR/core/web/resolver/spec_test.go: `.NewLinkFromJuels(1000)` $DIR/core/web/resolver/spec_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/spec_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id)` $DIR/core/web/resolver/spec_test.go: `.Return(job.Job{ Type: job.FluxMonitor, FluxMonitorSpec: &job.FluxMonitorSpec{ ContractAddress: contractAddress, CreatedAt: f.Timestamp(), EVMChainID: ubig.NewI(42), DrumbeatEnabled: true, DrumbeatRandomDelay: 1 * time.Second, DrumbeatSchedule: "CRON_TZ=UTC 0 0 1 1 *", IdleTimerDisabled: true, IdleTimerPeriod: 1 * time.Hour, MinPayment: commonassets.NewLinkFromJuels(1000), PollTimerDisabled: true, PollTimerPeriod: 1 * time.Minute, }, }, nil)` $DIR/core/web/resolver/spec_test.go: `.Timestamp()` $DIR/core/web/resolver/spec_test.go: `.NewI(42)` $DIR/core/web/resolver/spec_test.go: `.NewLinkFromJuels(1000)` $DIR/core/web/resolver/spec_test.go: `.HexToAddress("0x3cCad4715152693fE3BC4460591e3D3Fbd071b42")` $DIR/core/web/resolver/spec_test.go: `.NewEIP55Address("0x613a38AC1659769640aaE063C651F48E0250454C")` $DIR/core/web/resolver/spec_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/spec_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id)` $DIR/core/web/resolver/spec_test.go: `.Return(job.Job{ Type: job.Keeper, KeeperSpec: &job.KeeperSpec{ ContractAddress: contractAddress, CreatedAt: f.Timestamp(), EVMChainID: ubig.NewI(42), FromAddress: evmtypes.EIP55AddressFromAddress(fromAddress), }, }, nil)` $DIR/core/web/resolver/spec_test.go: `.Timestamp()` $DIR/core/web/resolver/spec_test.go: `.NewI(42)` $DIR/core/web/resolver/spec_test.go: `.EIP55AddressFromAddress(fromAddress)` $DIR/core/web/resolver/spec_test.go: `.NewEIP55Address("0x613a38AC1659769640aaE063C651F48E0250454C")` $DIR/core/web/resolver/spec_test.go: `.NewEIP55Address("0x3cCad4715152693fE3BC4460591e3D3Fbd071b42")` $DIR/core/web/resolver/spec_test.go: `.MustSha256HashFromHex("f5bf259689b26f1374efb3c9a9868796953a0f814bb2d39b968d0e61b58620a5")` $DIR/core/web/resolver/spec_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/spec_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id)` $DIR/core/web/resolver/spec_test.go: `.Return(job.Job{ Type: job.OffchainReporting, OCROracleSpec: &job.OCROracleSpec{ BlockchainTimeout: models.Interval(1 * time.Minute), ContractAddress: contractAddress, ContractConfigConfirmations: 1, ContractConfigTrackerPollInterval: models.Interval(1 * time.Minute), ContractConfigTrackerSubscribeInterval: models.Interval(2 * time.Minute), DatabaseTimeout: models.NewInterval(3 * time.Second), ObservationGracePeriod: models.NewInterval(4 * time.Second), ContractTransmitterTransmitTimeout: models.NewInterval(555 * time.Millisecond), CreatedAt: f.Timestamp(), EVMChainID: ubig.NewI(42), IsBootstrapPeer: false, EncryptedOCRKeyBundleID: &keyBundleID, ObservationTimeout: models.Interval(2 * time.Minute), P2PV2Bootstrappers: pq.StringArray{"12D3KooWL3XJ9EMCyZvmmGXL2LMiVBtrVa2BuESsJiXkSj7333Jw@localhost:5001"}, TransmitterAddress: &transmitterAddress, }, }, nil)` $DIR/core/web/resolver/spec_test.go: `.Interval(1 * time.Minute)` $DIR/core/web/resolver/spec_test.go: `.Interval(1 * time.Minute)` $DIR/core/web/resolver/spec_test.go: `.Interval(2 * time.Minute)` $DIR/core/web/resolver/spec_test.go: `.NewInterval(3 * time.Second)` $DIR/core/web/resolver/spec_test.go: `.NewInterval(4 * time.Second)` $DIR/core/web/resolver/spec_test.go: `.NewInterval(555 * time.Millisecond)` $DIR/core/web/resolver/spec_test.go: `.Timestamp()` $DIR/core/web/resolver/spec_test.go: `.NewI(42)` $DIR/core/web/resolver/spec_test.go: `.Interval(2 * time.Minute)` $DIR/core/web/resolver/spec_test.go: `.NewEIP55Address("0x613a38AC1659769640aaE063C651F48E0250454C")` $DIR/core/web/resolver/spec_test.go: `.NewEIP55Address("0x3cCad4715152693fE3BC4460591e3D3Fbd071b42")` $DIR/core/web/resolver/spec_test.go: `.MustSha256HashFromHex("f5bf259689b26f1374efb3c9a9868796953a0f814bb2d39b968d0e61b58620a5")` $DIR/core/web/resolver/spec_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/spec_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id)` $DIR/core/web/resolver/spec_test.go: `.Return(job.Job{ Type: job.OffchainReporting2, OCR2OracleSpec: &job.OCR2OracleSpec{ BlockchainTimeout: models.Interval(1 * time.Minute), ContractID: contractAddress.String(), ContractConfigConfirmations: 1, ContractConfigTrackerPollInterval: models.Interval(1 * time.Minute), CreatedAt: f.Timestamp(), OCRKeyBundleID: null.StringFrom(keyBundleID.String()), MonitoringEndpoint: null.StringFrom("https://monitor.endpoint"), P2PV2Bootstrappers: pq.StringArray{"12D3KooWL3XJ9EMCyZvmmGXL2LMiVBtrVa2BuESsJiXkSj7333Jw@localhost:5001"}, Relay: types.NetworkEVM, RelayConfig: relayConfig, TransmitterID: null.StringFrom(transmitterAddress.String()), PluginType: types.Median, PluginConfig: pluginConfig, }, }, nil)` $DIR/core/web/resolver/spec_test.go: `.Interval(1 * time.Minute)` $DIR/core/web/resolver/spec_test.go: `.String()` $DIR/core/web/resolver/spec_test.go: `.Interval(1 * time.Minute)` $DIR/core/web/resolver/spec_test.go: `.Timestamp()` $DIR/core/web/resolver/spec_test.go: `.StringFrom(keyBundleID.String())` $DIR/core/web/resolver/spec_test.go: `.String()` $DIR/core/web/resolver/spec_test.go: `.StringFrom("https://monitor.endpoint")` $DIR/core/web/resolver/spec_test.go: `.StringFrom(transmitterAddress.String())` $DIR/core/web/resolver/spec_test.go: `.String()` $DIR/core/web/resolver/spec_test.go: `.NewEIP55Address("0x613a38AC1659769640aaE063C651F48E0250454C")` $DIR/core/web/resolver/spec_test.go: `.NewEIP55Address("0x0ad9FE7a58216242a8475ca92F222b0640E26B63")` $DIR/core/web/resolver/spec_test.go: `.NewEIP55Address("0x3cCad4715152693fE3BC4460591e3D3Fbd071b42")` $DIR/core/web/resolver/spec_test.go: `.NewEIP55Address("0x2301958F1BFbC9A068C2aC9c6166Bf483b95864C")` $DIR/core/web/resolver/spec_test.go: `.NewPublicKeyFromHex("0x9dc09a0f898f3b5e8047204e7ce7e44b587920932f08431e29c9bf6923b8450a01")` $DIR/core/web/resolver/spec_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/spec_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id)` $DIR/core/web/resolver/spec_test.go: `.Return(job.Job{ Type: job.VRF, VRFSpec: &job.VRFSpec{ BatchCoordinatorAddress: &batchCoordinatorAddress, BatchFulfillmentEnabled: true, CustomRevertsPipelineEnabled: true, MinIncomingConfirmations: 1, CoordinatorAddress: coordinatorAddress, CreatedAt: f.Timestamp(), EVMChainID: ubig.NewI(42), FromAddresses: []evmtypes.EIP55Address{fromAddress1, fromAddress2}, PollPeriod: 1 * time.Minute, PublicKey: pubKey, RequestedConfsDelay: 10, RequestTimeout: 24 * time.Hour, ChunkSize: 25, BatchFulfillmentGasMultiplier: 1, BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(200), }, }, nil)` $DIR/core/web/resolver/spec_test.go: `.Timestamp()` $DIR/core/web/resolver/spec_test.go: `.NewI(42)` $DIR/core/web/resolver/spec_test.go: `.GWei(200)` $DIR/core/web/resolver/spec_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/spec_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id)` $DIR/core/web/resolver/spec_test.go: `.Return(job.Job{ Type: job.Webhook, WebhookSpec: &job.WebhookSpec{ CreatedAt: f.Timestamp(), }, }, nil)` $DIR/core/web/resolver/spec_test.go: `.Timestamp()` $DIR/core/web/resolver/spec_test.go: `.NewEIP55Address("0x613a38AC1659769640aaE063C651F48E0250454C")` $DIR/core/web/resolver/spec_test.go: `.NewEIP55Address("0x2fcA960AF066cAc46085588a66dA2D614c7Cd337")` $DIR/core/web/resolver/spec_test.go: `.NewEIP55Address("0x92B5e28Ac583812874e4271380c7d070C5FB6E6b")` $DIR/core/web/resolver/spec_test.go: `.NewEIP55Address("0x3cCad4715152693fE3BC4460591e3D3Fbd071b42")` $DIR/core/web/resolver/spec_test.go: `.NewEIP55Address("0xD479d7c994D298cA05bF270136ED9627b7E684D3")` $DIR/core/web/resolver/spec_test.go: `.NewEIP55Address("0xb26A6829D454336818477B946f03Fb21c9706f3A")` $DIR/core/web/resolver/spec_test.go: `.NewEIP55Address("0x0ad9FE7a58216242a8475ca92F222b0640E26B63")` $DIR/core/web/resolver/spec_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/spec_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id)` $DIR/core/web/resolver/spec_test.go: `.Return(job.Job{ Type: job.BlockhashStore, BlockhashStoreSpec: &job.BlockhashStoreSpec{ CoordinatorV1Address: &coordinatorV1Address, CoordinatorV2Address: &coordinatorV2Address, CoordinatorV2PlusAddress: &coordinatorV2PlusAddress, CreatedAt: f.Timestamp(), EVMChainID: ubig.NewI(42), FromAddresses: []evmtypes.EIP55Address{fromAddress1, fromAddress2}, PollPeriod: 1 * time.Minute, RunTimeout: 37 * time.Second, WaitBlocks: 100, LookbackBlocks: 200, HeartbeatPeriod: 450 * time.Second, BlockhashStoreAddress: blockhashStoreAddress, TrustedBlockhashStoreAddress: &trustedBlockhashStoreAddress, TrustedBlockhashStoreBatchSize: trustedBlockhashStoreBatchSize, }, }, nil)` $DIR/core/web/resolver/spec_test.go: `.Timestamp()` $DIR/core/web/resolver/spec_test.go: `.NewI(42)` $DIR/core/web/resolver/spec_test.go: `.NewEIP55Address("0x613a38AC1659769640aaE063C651F48E0250454C")` $DIR/core/web/resolver/spec_test.go: `.NewEIP55Address("0x2fcA960AF066cAc46085588a66dA2D614c7Cd337")` $DIR/core/web/resolver/spec_test.go: `.NewEIP55Address("0x92B5e28Ac583812874e4271380c7d070C5FB6E6b")` $DIR/core/web/resolver/spec_test.go: `.NewEIP55Address("0x3cCad4715152693fE3BC4460591e3D3Fbd071b42")` $DIR/core/web/resolver/spec_test.go: `.NewEIP55Address("0xb26A6829D454336818477B946f03Fb21c9706f3A")` $DIR/core/web/resolver/spec_test.go: `.NewEIP55Address("0xd23BAE30019853Caf1D08b4C03291b10AD7743Df")` $DIR/core/web/resolver/spec_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/spec_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id)` $DIR/core/web/resolver/spec_test.go: `.Return(job.Job{ Type: job.BlockHeaderFeeder, BlockHeaderFeederSpec: &job.BlockHeaderFeederSpec{ CoordinatorV1Address: &coordinatorV1Address, CoordinatorV2Address: &coordinatorV2Address, CoordinatorV2PlusAddress: &coordinatorV2PlusAddress, CreatedAt: f.Timestamp(), EVMChainID: ubig.NewI(42), FromAddresses: []evmtypes.EIP55Address{fromAddress}, PollPeriod: 1 * time.Minute, RunTimeout: 37 * time.Second, WaitBlocks: 100, LookbackBlocks: 200, BlockhashStoreAddress: blockhashStoreAddress, BatchBlockhashStoreAddress: batchBHSAddress, GetBlockhashesBatchSize: 5, StoreBlockhashesBatchSize: 3, }, }, nil)` $DIR/core/web/resolver/spec_test.go: `.Timestamp()` $DIR/core/web/resolver/spec_test.go: `.NewI(42)` $DIR/core/web/resolver/spec_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/spec_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id)` $DIR/core/web/resolver/spec_test.go: `.Return(job.Job{ Type: job.Bootstrap, BootstrapSpec: &job.BootstrapSpec{ ID: id, ContractID: "0x613a38AC1659769640aaE063C651F48E0250454C", Relay: "evm", RelayConfig: map[string]interface{}{}, MonitoringEndpoint: null.String{}, BlockchainTimeout: models.Interval(2 * time.Minute), ContractConfigTrackerPollInterval: models.Interval(2 * time.Minute), ContractConfigConfirmations: 100, CreatedAt: f.Timestamp(), }, }, nil)` $DIR/core/web/resolver/spec_test.go: `.Interval(2 * time.Minute)` $DIR/core/web/resolver/spec_test.go: `.Interval(2 * time.Minute)` $DIR/core/web/resolver/spec_test.go: `.Timestamp()` $DIR/core/web/resolver/spec_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/spec_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id)` $DIR/core/web/resolver/spec_test.go: `.Return(job.Job{ Type: job.Workflow, WorkflowSpec: &job.WorkflowSpec{ ID: id, WorkflowID: "", Workflow: "", }, }, nil)` $DIR/core/web/resolver/spec_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/spec_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id)` $DIR/core/web/resolver/spec_test.go: `.Return(job.Job{ Type: job.Gateway, GatewaySpec: &job.GatewaySpec{ ID: id, GatewayConfig: gatewayConfig, CreatedAt: f.Timestamp(), }, }, nil)` $DIR/core/web/resolver/spec_test.go: `.Timestamp()` $DIR/core/web/resolver/spec_test.go: `.App.On("JobORM")` $DIR/core/web/resolver/spec_test.go: `.Return(f.Mocks.jobORM)` $DIR/core/web/resolver/spec_test.go: `.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id)` $DIR/core/web/resolver/spec_test.go: `.Return(job.Job{ Type: job.StandardCapabilities, StandardCapabilitiesSpec: &job.StandardCapabilitiesSpec{ ID: id, CreatedAt: f.Timestamp(), Command: "testcommand", Config: "testconfig", }, }, nil)` $DIR/core/web/resolver/spec_test.go: `.Timestamp()` $DIR/core/web/resolver/user_test.go: `session.User.HashedPassword = pwd` $DIR/core/web/resolver/user_test.go: `f.Mocks.authProvider.On("FindUser", mock.Anything, session.User.Email).Return(*session.User, nil)` $DIR/core/web/resolver/user_test.go: `f.Mocks.authProvider.On("SetPassword", mock.Anything, session.User, "new").Return(nil)` $DIR/core/web/resolver/user_test.go: `f.Mocks.authProvider.On("ClearNonCurrentSessions", mock.Anything, session.SessionID).Return(nil)` $DIR/core/web/resolver/user_test.go: `f.App.On("AuthenticationProvider").Return(f.Mocks.authProvider)` $DIR/core/web/resolver/user_test.go: `session.User.HashedPassword = "random-string"` $DIR/core/web/resolver/user_test.go: `f.Mocks.authProvider.On("FindUser", mock.Anything, session.User.Email).Return(*session.User, nil)` $DIR/core/web/resolver/user_test.go: `f.App.On("AuthenticationProvider").Return(f.Mocks.authProvider)` $DIR/core/web/resolver/user_test.go: `session.User.HashedPassword = pwd` $DIR/core/web/resolver/user_test.go: `f.Mocks.authProvider.On("FindUser", mock.Anything, session.User.Email).Return(*session.User, nil)` $DIR/core/web/resolver/user_test.go: `f.Mocks.authProvider.On("ClearNonCurrentSessions", mock.Anything, session.SessionID).Return( clearSessionsError{}, )` $DIR/core/web/resolver/user_test.go: `f.App.On("AuthenticationProvider").Return(f.Mocks.authProvider)` $DIR/core/web/resolver/user_test.go: `session.User.HashedPassword = pwd` $DIR/core/web/resolver/user_test.go: `f.Mocks.authProvider.On("FindUser", mock.Anything, session.User.Email).Return(*session.User, nil)` $DIR/core/web/resolver/user_test.go: `f.Mocks.authProvider.On("ClearNonCurrentSessions", mock.Anything, session.SessionID).Return(nil)` $DIR/core/web/resolver/user_test.go: `f.Mocks.authProvider.On("SetPassword", mock.Anything, session.User, "new").Return(failedPasswordUpdateError{})` $DIR/core/web/resolver/user_test.go: `f.App.On("AuthenticationProvider").Return(f.Mocks.authProvider)` $DIR/core/web/resolver/user_test.go: `.GetGQLAuthenticatedSession(ctx)` $DIR/core/web/resolver/user_test.go: `.HashPassword(oldPassword)` $DIR/core/web/resolver/user_test.go: `.Mocks.authProvider.On("FindUser", mock.Anything, session.User.Email)` $DIR/core/web/resolver/user_test.go: `.Return(*session.User, nil)` $DIR/core/web/resolver/user_test.go: `.Mocks.authProvider.On("SetPassword", mock.Anything, session.User, "new")` $DIR/core/web/resolver/user_test.go: `.Return(nil)` $DIR/core/web/resolver/user_test.go: `.Mocks.authProvider.On("ClearNonCurrentSessions", mock.Anything, session.SessionID)` $DIR/core/web/resolver/user_test.go: `.Return(nil)` $DIR/core/web/resolver/user_test.go: `.App.On("AuthenticationProvider")` $DIR/core/web/resolver/user_test.go: `.Return(f.Mocks.authProvider)` $DIR/core/web/resolver/user_test.go: `.GetGQLAuthenticatedSession(ctx)` $DIR/core/web/resolver/user_test.go: `.Mocks.authProvider.On("FindUser", mock.Anything, session.User.Email)` $DIR/core/web/resolver/user_test.go: `.Return(*session.User, nil)` $DIR/core/web/resolver/user_test.go: `.App.On("AuthenticationProvider")` $DIR/core/web/resolver/user_test.go: `.Return(f.Mocks.authProvider)` $DIR/core/web/resolver/user_test.go: `.GetGQLAuthenticatedSession(ctx)` $DIR/core/web/resolver/user_test.go: `.HashPassword(oldPassword)` $DIR/core/web/resolver/user_test.go: `.Mocks.authProvider.On("FindUser", mock.Anything, session.User.Email)` $DIR/core/web/resolver/user_test.go: `.Return(*session.User, nil)` $DIR/core/web/resolver/user_test.go: `.Mocks.authProvider.On("ClearNonCurrentSessions", mock.Anything, session.SessionID)` $DIR/core/web/resolver/user_test.go: `.Return( clearSessionsError{}, )` $DIR/core/web/resolver/user_test.go: `.App.On("AuthenticationProvider")` $DIR/core/web/resolver/user_test.go: `.Return(f.Mocks.authProvider)` $DIR/core/web/resolver/user_test.go: `.GetGQLAuthenticatedSession(ctx)` $DIR/core/web/resolver/user_test.go: `.HashPassword(oldPassword)` $DIR/core/web/resolver/user_test.go: `.Mocks.authProvider.On("FindUser", mock.Anything, session.User.Email)` $DIR/core/web/resolver/user_test.go: `.Return(*session.User, nil)` $DIR/core/web/resolver/user_test.go: `.Mocks.authProvider.On("ClearNonCurrentSessions", mock.Anything, session.SessionID)` $DIR/core/web/resolver/user_test.go: `.Return(nil)` $DIR/core/web/resolver/user_test.go: `.Mocks.authProvider.On("SetPassword", mock.Anything, session.User, "new")` $DIR/core/web/resolver/user_test.go: `.Return(failedPasswordUpdateError{})` $DIR/core/web/resolver/user_test.go: `.App.On("AuthenticationProvider")` $DIR/core/web/resolver/user_test.go: `.Return(f.Mocks.authProvider)` $DIR/core/web/resolver/vrf_test.go: `f.Mocks.vrf.On("Get", fakeKey.PublicKey.String()).Return(fakeKey, nil)` $DIR/core/web/resolver/vrf_test.go: `f.Mocks.keystore.On("VRF").Return(f.Mocks.vrf)` $DIR/core/web/resolver/vrf_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/vrf_test.go: `f.Mocks.vrf. On("Get", fakeKey.PublicKey.String()). Return(vrfkey.KeyV2{}, errors.Wrapf( keystore.ErrMissingVRFKey, "unable to find VRF key with id %s", fakeKey.PublicKey.String(), ))` $DIR/core/web/resolver/vrf_test.go: `f.Mocks.keystore.On("VRF").Return(f.Mocks.vrf)` $DIR/core/web/resolver/vrf_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/vrf_test.go: `fakeKeys = append(fakeKeys, fakeKey)` $DIR/core/web/resolver/vrf_test.go: `expectedKeys = append(expectedKeys, map[string]string{ "id": fakeKey.PublicKey.String(), "compressed": fakeKey.PublicKey.String(), "uncompressed": uncompressed, "hash": fakeKey.PublicKey.MustHash().String(), })` $DIR/core/web/resolver/vrf_test.go: `f.Mocks.vrf.On("GetAll").Return(fakeKeys, nil)` $DIR/core/web/resolver/vrf_test.go: `f.Mocks.keystore.On("VRF").Return(f.Mocks.vrf)` $DIR/core/web/resolver/vrf_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/vrf_test.go: `f.Mocks.vrf.On("Create", mock.Anything).Return(fakeKey, nil)` $DIR/core/web/resolver/vrf_test.go: `f.Mocks.keystore.On("VRF").Return(f.Mocks.vrf)` $DIR/core/web/resolver/vrf_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/vrf_test.go: `f.Mocks.vrf.On("Delete", mock.Anything, fakeKey.PublicKey.String()).Return(fakeKey, nil)` $DIR/core/web/resolver/vrf_test.go: `f.Mocks.keystore.On("VRF").Return(f.Mocks.vrf)` $DIR/core/web/resolver/vrf_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/vrf_test.go: `f.Mocks.vrf. On("Delete", mock.Anything, fakeKey.PublicKey.String()). Return(vrfkey.KeyV2{}, errors.Wrapf( keystore.ErrMissingVRFKey, "unable to find VRF key with id %s", fakeKey.PublicKey.String(), ))` $DIR/core/web/resolver/vrf_test.go: `f.Mocks.keystore.On("VRF").Return(f.Mocks.vrf)` $DIR/core/web/resolver/vrf_test.go: `f.App.On("GetKeyStore").Return(f.Mocks.keystore)` $DIR/core/web/resolver/vrf_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(1))` $DIR/core/web/resolver/vrf_test.go: `.NewInt(1)` $DIR/core/web/resolver/vrf_test.go: `.PublicKey.StringUncompressed()` $DIR/core/web/resolver/vrf_test.go: `.Marshal(map[string]interface{}{ "vrfKey": map[string]interface{}{ "key": map[string]interface{}{ "id": fakeKey.PublicKey.String(), "compressed": fakeKey.PublicKey.String(), "uncompressed": uncompressed, "hash": fakeKey.PublicKey.MustHash().String(), }, }, })` $DIR/core/web/resolver/vrf_test.go: `.PublicKey.String()` $DIR/core/web/resolver/vrf_test.go: `.PublicKey.String()` $DIR/core/web/resolver/vrf_test.go: `.PublicKey.MustHash()` $DIR/core/web/resolver/vrf_test.go: `.String()` $DIR/core/web/resolver/vrf_test.go: `.PublicKey.String()` $DIR/core/web/resolver/vrf_test.go: `.Mocks.vrf.On("Get", fakeKey.PublicKey.String())` $DIR/core/web/resolver/vrf_test.go: `.PublicKey.String()` $DIR/core/web/resolver/vrf_test.go: `.Return(fakeKey, nil)` $DIR/core/web/resolver/vrf_test.go: `.Mocks.keystore.On("VRF")` $DIR/core/web/resolver/vrf_test.go: `.Return(f.Mocks.vrf)` $DIR/core/web/resolver/vrf_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/vrf_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/vrf_test.go: `.Mocks.vrf. On("Get", fakeKey.PublicKey.String())` $DIR/core/web/resolver/vrf_test.go: `.PublicKey.String()` $DIR/core/web/resolver/vrf_test.go: `. Return(vrfkey.KeyV2{}, errors.Wrapf( keystore.ErrMissingVRFKey, "unable to find VRF key with id %s", fakeKey.PublicKey.String(), ))` $DIR/core/web/resolver/vrf_test.go: `.Wrapf( keystore.ErrMissingVRFKey, "unable to find VRF key with id %s", fakeKey.PublicKey.String(), )` $DIR/core/web/resolver/vrf_test.go: `.PublicKey.String()` $DIR/core/web/resolver/vrf_test.go: `.Mocks.keystore.On("VRF")` $DIR/core/web/resolver/vrf_test.go: `.Return(f.Mocks.vrf)` $DIR/core/web/resolver/vrf_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/vrf_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/vrf_test.go: `.Sprintf(`{ "vrfKey": { "code": "NOT_FOUND", "message": "unable to find VRF key with id %s: unable to find VRF key" } }`, fakeKey.PublicKey.String())` $DIR/core/web/resolver/vrf_test.go: `.PublicKey.String()` $DIR/core/web/resolver/vrf_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(1))` $DIR/core/web/resolver/vrf_test.go: `.NewInt(1)` $DIR/core/web/resolver/vrf_test.go: `.PublicKey.StringUncompressed()` $DIR/core/web/resolver/vrf_test.go: `.PublicKey.String()` $DIR/core/web/resolver/vrf_test.go: `.PublicKey.String()` $DIR/core/web/resolver/vrf_test.go: `.PublicKey.MustHash()` $DIR/core/web/resolver/vrf_test.go: `.String()` $DIR/core/web/resolver/vrf_test.go: `.Marshal(map[string]interface{}{ "vrfKeys": map[string]interface{}{ "results": expectedKeys, }, })` $DIR/core/web/resolver/vrf_test.go: `.Mocks.vrf.On("GetAll")` $DIR/core/web/resolver/vrf_test.go: `.Return(fakeKeys, nil)` $DIR/core/web/resolver/vrf_test.go: `.Mocks.keystore.On("VRF")` $DIR/core/web/resolver/vrf_test.go: `.Return(f.Mocks.vrf)` $DIR/core/web/resolver/vrf_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/vrf_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/vrf_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(1))` $DIR/core/web/resolver/vrf_test.go: `.NewInt(1)` $DIR/core/web/resolver/vrf_test.go: `.PublicKey.StringUncompressed()` $DIR/core/web/resolver/vrf_test.go: `.Marshal(map[string]interface{}{ "createVRFKey": map[string]interface{}{ "key": map[string]interface{}{ "id": fakeKey.PublicKey.String(), "compressed": fakeKey.PublicKey.String(), "uncompressed": uncompressed, "hash": fakeKey.PublicKey.MustHash().String(), }, }, })` $DIR/core/web/resolver/vrf_test.go: `.PublicKey.String()` $DIR/core/web/resolver/vrf_test.go: `.PublicKey.String()` $DIR/core/web/resolver/vrf_test.go: `.PublicKey.MustHash()` $DIR/core/web/resolver/vrf_test.go: `.String()` $DIR/core/web/resolver/vrf_test.go: `.Mocks.vrf.On("Create", mock.Anything)` $DIR/core/web/resolver/vrf_test.go: `.Return(fakeKey, nil)` $DIR/core/web/resolver/vrf_test.go: `.Mocks.keystore.On("VRF")` $DIR/core/web/resolver/vrf_test.go: `.Return(f.Mocks.vrf)` $DIR/core/web/resolver/vrf_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/vrf_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/vrf_test.go: `.MustNewV2XXXTestingOnly(big.NewInt(1))` $DIR/core/web/resolver/vrf_test.go: `.NewInt(1)` $DIR/core/web/resolver/vrf_test.go: `.PublicKey.StringUncompressed()` $DIR/core/web/resolver/vrf_test.go: `.Marshal(map[string]interface{}{ "deleteVRFKey": map[string]interface{}{ "key": map[string]interface{}{ "id": fakeKey.PublicKey.String(), "compressed": fakeKey.PublicKey.String(), "uncompressed": uncompressed, "hash": fakeKey.PublicKey.MustHash().String(), }, }, })` $DIR/core/web/resolver/vrf_test.go: `.PublicKey.String()` $DIR/core/web/resolver/vrf_test.go: `.PublicKey.String()` $DIR/core/web/resolver/vrf_test.go: `.PublicKey.MustHash()` $DIR/core/web/resolver/vrf_test.go: `.String()` $DIR/core/web/resolver/vrf_test.go: `.PublicKey.String()` $DIR/core/web/resolver/vrf_test.go: `.Mocks.vrf.On("Delete", mock.Anything, fakeKey.PublicKey.String())` $DIR/core/web/resolver/vrf_test.go: `.PublicKey.String()` $DIR/core/web/resolver/vrf_test.go: `.Return(fakeKey, nil)` $DIR/core/web/resolver/vrf_test.go: `.Mocks.keystore.On("VRF")` $DIR/core/web/resolver/vrf_test.go: `.Return(f.Mocks.vrf)` $DIR/core/web/resolver/vrf_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/vrf_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/vrf_test.go: `.Mocks.vrf. On("Delete", mock.Anything, fakeKey.PublicKey.String())` $DIR/core/web/resolver/vrf_test.go: `.PublicKey.String()` $DIR/core/web/resolver/vrf_test.go: `. Return(vrfkey.KeyV2{}, errors.Wrapf( keystore.ErrMissingVRFKey, "unable to find VRF key with id %s", fakeKey.PublicKey.String(), ))` $DIR/core/web/resolver/vrf_test.go: `.Wrapf( keystore.ErrMissingVRFKey, "unable to find VRF key with id %s", fakeKey.PublicKey.String(), )` $DIR/core/web/resolver/vrf_test.go: `.PublicKey.String()` $DIR/core/web/resolver/vrf_test.go: `.Mocks.keystore.On("VRF")` $DIR/core/web/resolver/vrf_test.go: `.Return(f.Mocks.vrf)` $DIR/core/web/resolver/vrf_test.go: `.App.On("GetKeyStore")` $DIR/core/web/resolver/vrf_test.go: `.Return(f.Mocks.keystore)` $DIR/core/web/resolver/vrf_test.go: `.Sprintf(`{ "deleteVRFKey": { "message": "unable to find VRF key with id %s: unable to find VRF key", "code": "NOT_FOUND" } }`, fakeKey.PublicKey.String())` $DIR/core/web/resolver/vrf_test.go: `.PublicKey.String()` $DIR/core/web/router_test.go: `req.Header.Set("Content-Type", web.MediaType)` $DIR/core/web/router_test.go: `err = app.BridgeORM().CreateExternalInitiator(ctx, ea)` $DIR/core/web/router_test.go: `request.Header.Set("Content-Type", web.MediaType)` $DIR/core/web/router_test.go: `request.Header.Set("X-Chainlink-EA-AccessKey", eia.AccessKey)` $DIR/core/web/router_test.go: `request.Header.Set("X-Chainlink-EA-Secret", eia.Secret)` $DIR/core/web/router_test.go: `err = app.BridgeORM().CreateExternalInitiator(ctx, ea)` $DIR/core/web/router_test.go: `request.Header.Set("Content-Type", web.MediaType)` $DIR/core/web/router_test.go: `request.Header.Set("X-Chainlink-EA-AccessKey", eia.AccessKey)` $DIR/core/web/router_test.go: `request.Header.Set("X-Chainlink-EA-Secret", "every unpleasant commercial color from aquamarine to beige")` $DIR/core/web/router_test.go: `.Context(t)` $DIR/core/web/router_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/router_test.go: `.Router(t, app, nil)` $DIR/core/web/router_test.go: `.NewServer(router)` $DIR/core/web/router_test.go: `.NewRequestWithContext(ctx, "POST", ts.URL+"/v2/jobs/", bytes.NewBufferString("{}"))` $DIR/core/web/router_test.go: `.NewBufferString("{}")` $DIR/core/web/router_test.go: `.Header.Set("Content-Type", web.MediaType)` $DIR/core/web/router_test.go: `.DefaultClient.Do(req)` $DIR/core/web/router_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/router_test.go: `.Router(t, app, nil)` $DIR/core/web/router_test.go: `.NewServer(router)` $DIR/core/web/router_test.go: `.NewHTTPClient(nil)` $DIR/core/web/router_test.go: `.Post("/v2/bridge_types/", nil)` $DIR/core/web/router_test.go: `.Context(t)` $DIR/core/web/router_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/router_test.go: `.Router(t, app, nil)` $DIR/core/web/router_test.go: `.NewServer(router)` $DIR/core/web/router_test.go: `.NewToken()` $DIR/core/web/router_test.go: `.WebURL(t, "http://localhost:8888")` $DIR/core/web/router_test.go: `.New()` $DIR/core/web/router_test.go: `.String()` $DIR/core/web/router_test.go: `.NewExternalInitiator(eia, eir)` $DIR/core/web/router_test.go: `.BridgeORM()` $DIR/core/web/router_test.go: `.CreateExternalInitiator(ctx, ea)` $DIR/core/web/router_test.go: `.NewRequestWithContext(ctx, "GET", ts.URL+"/v2/ping/", bytes.NewBufferString("{}"))` $DIR/core/web/router_test.go: `.NewBufferString("{}")` $DIR/core/web/router_test.go: `.Header.Set("Content-Type", web.MediaType)` $DIR/core/web/router_test.go: `.Header.Set("X-Chainlink-EA-AccessKey", eia.AccessKey)` $DIR/core/web/router_test.go: `.Header.Set("X-Chainlink-EA-Secret", eia.Secret)` $DIR/core/web/router_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/web/router_test.go: `.Do(request)` $DIR/core/web/router_test.go: `.Context(t)` $DIR/core/web/router_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/router_test.go: `.Router(t, app, nil)` $DIR/core/web/router_test.go: `.NewServer(router)` $DIR/core/web/router_test.go: `.NewToken()` $DIR/core/web/router_test.go: `.WebURL(t, "http://localhost:8888")` $DIR/core/web/router_test.go: `.New()` $DIR/core/web/router_test.go: `.String()` $DIR/core/web/router_test.go: `.NewExternalInitiator(eia, eir)` $DIR/core/web/router_test.go: `.BridgeORM()` $DIR/core/web/router_test.go: `.CreateExternalInitiator(ctx, ea)` $DIR/core/web/router_test.go: `.NewRequestWithContext(ctx, "GET", ts.URL+"/v2/ping/", bytes.NewBufferString("{}"))` $DIR/core/web/router_test.go: `.NewBufferString("{}")` $DIR/core/web/router_test.go: `.Header.Set("Content-Type", web.MediaType)` $DIR/core/web/router_test.go: `.Header.Set("X-Chainlink-EA-AccessKey", eia.AccessKey)` $DIR/core/web/router_test.go: `.Header.Set("X-Chainlink-EA-Secret", "every unpleasant commercial color from aquamarine to beige")` $DIR/core/web/router_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/web/router_test.go: `.Do(request)` $DIR/core/web/router_test.go: `.Context(t)` $DIR/core/web/router_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/router_test.go: `.Router(t, app, nil)` $DIR/core/web/router_test.go: `.NewServer(router)` $DIR/core/web/router_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/web/router_test.go: `.NewRequestWithContext(ctx, "POST", ts.URL+"/sessions", bytes.NewBufferString(input))` $DIR/core/web/router_test.go: `.NewBufferString(input)` $DIR/core/web/router_test.go: `.Do(request)` $DIR/core/web/router_test.go: `.NewRequestWithContext(ctx, "POST", ts.URL+"/sessions", bytes.NewBufferString(input))` $DIR/core/web/router_test.go: `.NewBufferString(input)` $DIR/core/web/router_test.go: `.Do(request)` $DIR/core/web/router_test.go: `.Context(t)` $DIR/core/web/router_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/router_test.go: `.Router(t, app, nil)` $DIR/core/web/router_test.go: `.NewServer(router)` $DIR/core/web/router_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/web/router_test.go: `.NewRequestWithContext(ctx, "POST", ts.URL+"/sessions", bytes.NewBufferString(body))` $DIR/core/web/router_test.go: `.NewBufferString(body)` $DIR/core/web/router_test.go: `.Do(request)` $DIR/core/web/router_test.go: `.Context(t)` $DIR/core/web/router_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/router_test.go: `.Router(t, app, nil)` $DIR/core/web/router_test.go: `.NewServer(router)` $DIR/core/web/router_test.go: `.NewRequestWithContext(ctx, "GET", ts.URL, nil)` $DIR/core/web/router_test.go: `.DefaultClient.Do(req)` $DIR/core/web/sessions_controller_test.go: `t.Run(test.name, func(t *testing.T) { ctx := testutils.Context(t) body := fmt.Sprintf(`{"email":"%s","password":"%s"}`, test.email, test.password) request, err := http.NewRequestWithContext(ctx, "POST", app.Server.URL+"/sessions", bytes.NewBufferString(body)) assert.NoError(t, err) resp, err := client.Do(request) assert.NoError(t, err) defer func() { assert.NoError(t, resp.Body.Close()) }() if test.wantSession { require.Equal(t, http.StatusOK, resp.StatusCode) cookies := resp.Cookies() sessionCookie := web.FindSessionCookie(cookies) require.NotNil(t, sessionCookie) decrypted, err := cltest.DecodeSessionCookie(sessionCookie.Value) require.NoError(t, err) user, err := app.AuthenticationProvider().AuthorizedUserWithSession(ctx, decrypted) assert.NoError(t, err) assert.Equal(t, test.email, user.Email) b, err := io.ReadAll(resp.Body) assert.NoError(t, err) assert.Contains(t, string(b), `"attributes":{"authenticated":true}`) } else { require.True(t, resp.StatusCode >= 400, "Should not be able to create session") // Ignore fixture session sessions, err := app.AuthenticationProvider().Sessions(ctx, 1, 2) assert.NoError(t, err) assert.Empty(t, sessions) } })` $DIR/core/web/sessions_controller_test.go: `staleSession.LastUsed = time.Now().Add(-cltest.MustParseDuration(t, "241h"))` $DIR/core/web/sessions_controller_test.go: `staleSession.Email = user.Email` $DIR/core/web/sessions_controller_test.go: `mustInsertSession(t, app.GetDB(), &staleSession)` $DIR/core/web/sessions_controller_test.go: `req.Header.Set("Content-Type", "application/json")` $DIR/core/web/sessions_controller_test.go: `gomega.NewWithT(t).Eventually(func() []sessions.Session { s, err = app.AuthenticationProvider().Sessions(ctx, 0, 10) assert.NoError(t, err) return s }).Should(gomega.HaveLen(1))` $DIR/core/web/sessions_controller_test.go: `s, err = app.AuthenticationProvider().Sessions(ctx, 0, 10)` $DIR/core/web/sessions_controller_test.go: `correctSession.Email = user.Email` $DIR/core/web/sessions_controller_test.go: `mustInsertSession(t, app.GetDB(), &correctSession)` $DIR/core/web/sessions_controller_test.go: `t.Run(test.name, func(t *testing.T) { ctx := testutils.Context(t) cookie := cltest.MustGenerateSessionCookie(t, test.sessionID) request, err := http.NewRequestWithContext(ctx, "DELETE", app.Server.URL+"/sessions", nil) assert.NoError(t, err) request.AddCookie(cookie) resp, err := client.Do(request) assert.NoError(t, err) _, err = app.AuthenticationProvider().AuthorizedUserWithSession(ctx, test.sessionID) assert.Error(t, err) if test.success { assert.Equal(t, http.StatusOK, resp.StatusCode) } else { assert.True(t, resp.StatusCode >= 400, "Should get an erroneous status code for deleting a nonexistent session id") } })` $DIR/core/web/sessions_controller_test.go: `request.AddCookie(cookie)` $DIR/core/web/sessions_controller_test.go: `_, err = app.AuthenticationProvider().AuthorizedUserWithSession(ctx, test.sessionID)` $DIR/core/web/sessions_controller_test.go: `correctSession.Email = user.Email` $DIR/core/web/sessions_controller_test.go: `mustInsertSession(t, app.GetDB(), &correctSession)` $DIR/core/web/sessions_controller_test.go: `staleSession.Email = user.Email` $DIR/core/web/sessions_controller_test.go: `staleSession.LastUsed = time.Now().Add(-cltest.MustParseDuration(t, "241h"))` $DIR/core/web/sessions_controller_test.go: `mustInsertSession(t, app.GetDB(), &staleSession)` $DIR/core/web/sessions_controller_test.go: `request.AddCookie(cookie)` $DIR/core/web/sessions_controller_test.go: `.Context(t)` $DIR/core/web/sessions_controller_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/sessions_controller_test.go: `.MustRandomUser(t)` $DIR/core/web/sessions_controller_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/web/sessions_controller_test.go: `.Run(test.name, func(t *testing.T) { ctx := testutils.Context(t) body := fmt.Sprintf(`{"email":"%s","password":"%s"}`, test.email, test.password) request, err := http.NewRequestWithContext(ctx, "POST", app.Server.URL+"/sessions", bytes.NewBufferString(body)) assert.NoError(t, err) resp, err := client.Do(request) assert.NoError(t, err) defer func() { assert.NoError(t, resp.Body.Close()) }() if test.wantSession { require.Equal(t, http.StatusOK, resp.StatusCode) cookies := resp.Cookies() sessionCookie := web.FindSessionCookie(cookies) require.NotNil(t, sessionCookie) decrypted, err := cltest.DecodeSessionCookie(sessionCookie.Value) require.NoError(t, err) user, err := app.AuthenticationProvider().AuthorizedUserWithSession(ctx, decrypted) assert.NoError(t, err) assert.Equal(t, test.email, user.Email) b, err := io.ReadAll(resp.Body) assert.NoError(t, err) assert.Contains(t, string(b), `"attributes":{"authenticated":true}`) } else { require.True(t, resp.StatusCode >= 400, "Should not be able to create session") // Ignore fixture session sessions, err := app.AuthenticationProvider().Sessions(ctx, 1, 2) assert.NoError(t, err) assert.Empty(t, sessions) } })` $DIR/core/web/sessions_controller_test.go: `.Context(t)` $DIR/core/web/sessions_controller_test.go: `.Sprintf(`{"email":"%s","password":"%s"}`, test.email, test.password)` $DIR/core/web/sessions_controller_test.go: `.NewRequestWithContext(ctx, "POST", app.Server.URL+"/sessions", bytes.NewBufferString(body))` $DIR/core/web/sessions_controller_test.go: `.NewBufferString(body)` $DIR/core/web/sessions_controller_test.go: `.Do(request)` $DIR/core/web/sessions_controller_test.go: `.Cookies()` $DIR/core/web/sessions_controller_test.go: `.FindSessionCookie(cookies)` $DIR/core/web/sessions_controller_test.go: `.DecodeSessionCookie(sessionCookie.Value)` $DIR/core/web/sessions_controller_test.go: `.AuthenticationProvider()` $DIR/core/web/sessions_controller_test.go: `.AuthorizedUserWithSession(ctx, decrypted)` $DIR/core/web/sessions_controller_test.go: `.ReadAll(resp.Body)` $DIR/core/web/sessions_controller_test.go: `.AuthenticationProvider()` $DIR/core/web/sessions_controller_test.go: `.Sessions(ctx, 1, 2)` $DIR/core/web/sessions_controller_test.go: `.Context(t)` $DIR/core/web/sessions_controller_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/sessions_controller_test.go: `.MustRandomUser(t)` $DIR/core/web/sessions_controller_test.go: `.NewSession()` $DIR/core/web/sessions_controller_test.go: `.Now()` $DIR/core/web/sessions_controller_test.go: `.Add(-cltest.MustParseDuration(t, "241h"))` $DIR/core/web/sessions_controller_test.go: `.MustParseDuration(t, "241h")` $DIR/core/web/sessions_controller_test.go: `.GetDB()` $DIR/core/web/sessions_controller_test.go: `.Sprintf(`{"email":"%s","password":"%s"}`, user.Email, cltest.Password)` $DIR/core/web/sessions_controller_test.go: `.NewRequestWithContext(ctx, "POST", app.Server.URL+"/sessions", bytes.NewBufferString(body))` $DIR/core/web/sessions_controller_test.go: `.NewBufferString(body)` $DIR/core/web/sessions_controller_test.go: `.Header.Set("Content-Type", "application/json")` $DIR/core/web/sessions_controller_test.go: `.DefaultClient.Do(req)` $DIR/core/web/sessions_controller_test.go: `.NewWithT(t)` $DIR/core/web/sessions_controller_test.go: `.Eventually(func() []sessions.Session { s, err = app.AuthenticationProvider().Sessions(ctx, 0, 10) assert.NoError(t, err) return s })` $DIR/core/web/sessions_controller_test.go: `.AuthenticationProvider()` $DIR/core/web/sessions_controller_test.go: `.Sessions(ctx, 0, 10)` $DIR/core/web/sessions_controller_test.go: `.Should(gomega.HaveLen(1))` $DIR/core/web/sessions_controller_test.go: `.HaveLen(1)` $DIR/core/web/sessions_controller_test.go: `.Context(t)` $DIR/core/web/sessions_controller_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/sessions_controller_test.go: `.MustRandomUser(t)` $DIR/core/web/sessions_controller_test.go: `.NewSession()` $DIR/core/web/sessions_controller_test.go: `.GetDB()` $DIR/core/web/sessions_controller_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/web/sessions_controller_test.go: `.Run(test.name, func(t *testing.T) { ctx := testutils.Context(t) cookie := cltest.MustGenerateSessionCookie(t, test.sessionID) request, err := http.NewRequestWithContext(ctx, "DELETE", app.Server.URL+"/sessions", nil) assert.NoError(t, err) request.AddCookie(cookie) resp, err := client.Do(request) assert.NoError(t, err) _, err = app.AuthenticationProvider().AuthorizedUserWithSession(ctx, test.sessionID) assert.Error(t, err) if test.success { assert.Equal(t, http.StatusOK, resp.StatusCode) } else { assert.True(t, resp.StatusCode >= 400, "Should get an erroneous status code for deleting a nonexistent session id") } })` $DIR/core/web/sessions_controller_test.go: `.Context(t)` $DIR/core/web/sessions_controller_test.go: `.MustGenerateSessionCookie(t, test.sessionID)` $DIR/core/web/sessions_controller_test.go: `.NewRequestWithContext(ctx, "DELETE", app.Server.URL+"/sessions", nil)` $DIR/core/web/sessions_controller_test.go: `.AddCookie(cookie)` $DIR/core/web/sessions_controller_test.go: `.Do(request)` $DIR/core/web/sessions_controller_test.go: `.AuthenticationProvider()` $DIR/core/web/sessions_controller_test.go: `.AuthorizedUserWithSession(ctx, test.sessionID)` $DIR/core/web/sessions_controller_test.go: `.Context(t)` $DIR/core/web/sessions_controller_test.go: `.NewTestLocalOnlyHTTPClient()` $DIR/core/web/sessions_controller_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/sessions_controller_test.go: `.MustRandomUser(t)` $DIR/core/web/sessions_controller_test.go: `.NewSession()` $DIR/core/web/sessions_controller_test.go: `.GetDB()` $DIR/core/web/sessions_controller_test.go: `.MustGenerateSessionCookie(t, correctSession.ID)` $DIR/core/web/sessions_controller_test.go: `.NewSession()` $DIR/core/web/sessions_controller_test.go: `.Now()` $DIR/core/web/sessions_controller_test.go: `.Add(-cltest.MustParseDuration(t, "241h"))` $DIR/core/web/sessions_controller_test.go: `.MustParseDuration(t, "241h")` $DIR/core/web/sessions_controller_test.go: `.GetDB()` $DIR/core/web/sessions_controller_test.go: `.NewRequestWithContext(ctx, "DELETE", app.Server.URL+"/sessions", nil)` $DIR/core/web/sessions_controller_test.go: `.AddCookie(cookie)` $DIR/core/web/sessions_controller_test.go: `.Do(request)` $DIR/core/web/sessions_controller_test.go: `.NewWithT(t)` $DIR/core/web/sessions_controller_test.go: `.Eventually(func() []sessions.Session { sessions, err := app.AuthenticationProvider().Sessions(ctx, 0, 10) assert.NoError(t, err) return sessions })` $DIR/core/web/sessions_controller_test.go: `.AuthenticationProvider()` $DIR/core/web/sessions_controller_test.go: `.Sessions(ctx, 0, 10)` $DIR/core/web/sessions_controller_test.go: `.HaveLen(0)` $DIR/core/web/solana_chains_controller_test.go: `t.Run(tc.name, func(t *testing.T) { t.Parallel() controller := setupSolanaChainsControllerTestV2(t, &config.TOMLConfig{ ChainID: ptr(validId), Chain: config.Chain{ SkipPreflight: ptr(false), TxTimeout: commoncfg.MustNewDuration(time.Hour), }, }) wantedResult := tc.want(t, controller.app) resp, cleanup := controller.client.Get( fmt.Sprintf("/v2/chains/solana/%s", tc.inputId), ) t.Cleanup(cleanup) require.Equal(t, tc.wantStatusCode, resp.StatusCode) if wantedResult != nil { resource1 := presenters.SolanaChainResource{} err := web.ParseJSONAPIResponse(cltest.ParseResponseBody(t, resp), &resource1) require.NoError(t, err) assert.Equal(t, wantedResult.ID, resource1.ID) assert.Equal(t, wantedResult.Enabled, resource1.Enabled) assert.Equal(t, wantedResult.Config, resource1.Config) } })` $DIR/core/web/solana_chains_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/solana_chains_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/solana_chains_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/solana_chains_controller_test.go: `err = web.ParsePaginatedResponse(body, &chains, &links)` $DIR/core/web/solana_chains_controller_test.go: `resp, cleanup = controller.client.Get(links["next"].Href)` $DIR/core/web/solana_chains_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/solana_chains_controller_test.go: `chains = []presenters.SolanaChainResource{}` $DIR/core/web/solana_chains_controller_test.go: `err = web.ParsePaginatedResponse(cltest.ParseResponseBody(t, resp), &chains, &links)` $DIR/core/web/solana_chains_controller_test.go: `.Run(tc.name, func(t *testing.T) { t.Parallel() controller := setupSolanaChainsControllerTestV2(t, &config.TOMLConfig{ ChainID: ptr(validId), Chain: config.Chain{ SkipPreflight: ptr(false), TxTimeout: commoncfg.MustNewDuration(time.Hour), }, }) wantedResult := tc.want(t, controller.app) resp, cleanup := controller.client.Get( fmt.Sprintf("/v2/chains/solana/%s", tc.inputId), ) t.Cleanup(cleanup) require.Equal(t, tc.wantStatusCode, resp.StatusCode) if wantedResult != nil { resource1 := presenters.SolanaChainResource{} err := web.ParseJSONAPIResponse(cltest.ParseResponseBody(t, resp), &resource1) require.NoError(t, err) assert.Equal(t, wantedResult.ID, resource1.ID) assert.Equal(t, wantedResult.Enabled, resource1.Enabled) assert.Equal(t, wantedResult.Config, resource1.Config) } })` $DIR/core/web/solana_chains_controller_test.go: `.MustNewDuration(time.Hour)` $DIR/core/web/solana_chains_controller_test.go: `.want(t, controller.app)` $DIR/core/web/solana_chains_controller_test.go: `.client.Get( fmt.Sprintf("/v2/chains/solana/%s", tc.inputId), )` $DIR/core/web/solana_chains_controller_test.go: `.Sprintf("/v2/chains/solana/%s", tc.inputId)` $DIR/core/web/solana_chains_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/solana_chains_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, resp), &resource1)` $DIR/core/web/solana_chains_controller_test.go: `.ParseResponseBody(t, resp)` $DIR/core/web/solana_chains_controller_test.go: `.Sprintf("ChainlinktestA-%d", rand.Int31n(999999))` $DIR/core/web/solana_chains_controller_test.go: `.Int31n(999999)` $DIR/core/web/solana_chains_controller_test.go: `.MustNewDuration(time.Hour)` $DIR/core/web/solana_chains_controller_test.go: `.Sprintf("ChainlinktestB-%d", rand.Int31n(999999))` $DIR/core/web/solana_chains_controller_test.go: `.Int31n(999999)` $DIR/core/web/solana_chains_controller_test.go: `.client.Get("/v2/chains/solana?size=asd")` $DIR/core/web/solana_chains_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/solana_chains_controller_test.go: `.client.Get("/v2/chains/solana?size=1")` $DIR/core/web/solana_chains_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/solana_chains_controller_test.go: `.ParseResponseBody(t, resp)` $DIR/core/web/solana_chains_controller_test.go: `.ParseJSONAPIResponseMetaCount(body)` $DIR/core/web/solana_chains_controller_test.go: `.ParsePaginatedResponse(body, &chains, &links)` $DIR/core/web/solana_chains_controller_test.go: `.TOMLString()` $DIR/core/web/solana_chains_controller_test.go: `.client.Get(links["next"].Href)` $DIR/core/web/solana_chains_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/solana_chains_controller_test.go: `.ParsePaginatedResponse(cltest.ParseResponseBody(t, resp), &chains, &links)` $DIR/core/web/solana_chains_controller_test.go: `.ParseResponseBody(t, resp)` $DIR/core/web/solana_chains_controller_test.go: `.TOMLString()` $DIR/core/web/solana_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/solana_keys_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/solana_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/solana_keys_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/solana_keys_controller_test.go: `_, err = keyStore.Solana().Get(resource.ID)` $DIR/core/web/solana_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/solana_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/solana_keys_controller_test.go: `keys, _ = keyStore.Solana().GetAll()` $DIR/core/web/solana_keys_controller_test.go: `.Solana()` $DIR/core/web/solana_keys_controller_test.go: `.GetAll()` $DIR/core/web/solana_keys_controller_test.go: `.Get("/v2/keys/solana")` $DIR/core/web/solana_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/solana_keys_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/solana_keys_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &resources)` $DIR/core/web/solana_keys_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/solana_keys_controller_test.go: `.PublicKeyStr()` $DIR/core/web/solana_keys_controller_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/solana_keys_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/solana_keys_controller_test.go: `.GetKeyStore()` $DIR/core/web/solana_keys_controller_test.go: `.Post("/v2/keys/solana", nil)` $DIR/core/web/solana_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/solana_keys_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/solana_keys_controller_test.go: `.Solana()` $DIR/core/web/solana_keys_controller_test.go: `.GetAll()` $DIR/core/web/solana_keys_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &resource)` $DIR/core/web/solana_keys_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/solana_keys_controller_test.go: `.Solana()` $DIR/core/web/solana_keys_controller_test.go: `.Get(resource.ID)` $DIR/core/web/solana_keys_controller_test.go: `.Delete("/v2/keys/solana/" + nonExistentSolanaKeyID)` $DIR/core/web/solana_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/solana_keys_controller_test.go: `.Context(t)` $DIR/core/web/solana_keys_controller_test.go: `.Solana()` $DIR/core/web/solana_keys_controller_test.go: `.GetAll()` $DIR/core/web/solana_keys_controller_test.go: `.Solana()` $DIR/core/web/solana_keys_controller_test.go: `.Create(ctx)` $DIR/core/web/solana_keys_controller_test.go: `.Delete(fmt.Sprintf("/v2/keys/solana/%s", key.ID()))` $DIR/core/web/solana_keys_controller_test.go: `.Sprintf("/v2/keys/solana/%s", key.ID())` $DIR/core/web/solana_keys_controller_test.go: `.ID()` $DIR/core/web/solana_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/solana_keys_controller_test.go: `.Solana()` $DIR/core/web/solana_keys_controller_test.go: `.GetAll()` $DIR/core/web/starknet_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/starknet_keys_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/starknet_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/starknet_keys_controller_test.go: `cltest.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/starknet_keys_controller_test.go: `_, err = keyStore.StarkNet().Get(resource.ID)` $DIR/core/web/starknet_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/starknet_keys_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/starknet_keys_controller_test.go: `keys, _ = keyStore.StarkNet().GetAll()` $DIR/core/web/starknet_keys_controller_test.go: `.StarkNet()` $DIR/core/web/starknet_keys_controller_test.go: `.GetAll()` $DIR/core/web/starknet_keys_controller_test.go: `.Get("/v2/keys/starknet")` $DIR/core/web/starknet_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/starknet_keys_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/starknet_keys_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &resources)` $DIR/core/web/starknet_keys_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/starknet_keys_controller_test.go: `.StarkKeyStr()` $DIR/core/web/starknet_keys_controller_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/starknet_keys_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/starknet_keys_controller_test.go: `.GetKeyStore()` $DIR/core/web/starknet_keys_controller_test.go: `.Post("/v2/keys/starknet", nil)` $DIR/core/web/starknet_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/starknet_keys_controller_test.go: `.AssertServerResponse(t, response, http.StatusOK)` $DIR/core/web/starknet_keys_controller_test.go: `.StarkNet()` $DIR/core/web/starknet_keys_controller_test.go: `.GetAll()` $DIR/core/web/starknet_keys_controller_test.go: `.ParseJSONAPIResponse(cltest.ParseResponseBody(t, response), &resource)` $DIR/core/web/starknet_keys_controller_test.go: `.ParseResponseBody(t, response)` $DIR/core/web/starknet_keys_controller_test.go: `.StarkNet()` $DIR/core/web/starknet_keys_controller_test.go: `.Get(resource.ID)` $DIR/core/web/starknet_keys_controller_test.go: `.Delete("/v2/keys/starknet/" + nonExistentStarkNetKeyID)` $DIR/core/web/starknet_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/starknet_keys_controller_test.go: `.Context(t)` $DIR/core/web/starknet_keys_controller_test.go: `.StarkNet()` $DIR/core/web/starknet_keys_controller_test.go: `.GetAll()` $DIR/core/web/starknet_keys_controller_test.go: `.StarkNet()` $DIR/core/web/starknet_keys_controller_test.go: `.Create(ctx)` $DIR/core/web/starknet_keys_controller_test.go: `.Delete(fmt.Sprintf("/v2/keys/starknet/%s", key.ID()))` $DIR/core/web/starknet_keys_controller_test.go: `.Sprintf("/v2/keys/starknet/%s", key.ID())` $DIR/core/web/starknet_keys_controller_test.go: `.ID()` $DIR/core/web/starknet_keys_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/starknet_keys_controller_test.go: `.StarkNet()` $DIR/core/web/starknet_keys_controller_test.go: `.GetAll()` $DIR/core/web/user_controller_test.go: `t.Run(tc.name, func(t *testing.T) { resp, cleanup := client.Patch("/v2/user/password", bytes.NewBufferString(tc.reqBody)) t.Cleanup(cleanup) errors := cltest.ParseJSONAPIErrors(t, resp.Body) require.Equal(t, tc.wantStatusCode, resp.StatusCode) assert.Len(t, errors.Errors, tc.wantErrCount) if tc.wantErrMessage != "" { assert.Equal(t, tc.wantErrMessage, errors.Errors[0].Detail) } })` $DIR/core/web/user_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/user_controller_test.go: `t.Run(tc.name, func(t *testing.T) { resp, cleanup := client.Post("/v2/users", bytes.NewBufferString(tc.reqBody)) t.Cleanup(cleanup) errors := cltest.ParseJSONAPIErrors(t, resp.Body) require.Equal(t, tc.wantStatusCode, resp.StatusCode) assert.Len(t, errors.Errors, tc.wantErrCount) if tc.wantErrMessage != "" { assert.Contains(t, errors.Errors[0].Detail, tc.wantErrMessage) } })` $DIR/core/web/user_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/user_controller_test.go: `t.Run(tc.name, func(t *testing.T) { resp, cleanup := client.Patch("/v2/users", bytes.NewBufferString(tc.reqBody)) t.Cleanup(cleanup) errors := cltest.ParseJSONAPIErrors(t, resp.Body) require.Equal(t, tc.wantStatusCode, resp.StatusCode) assert.Len(t, errors.Errors, tc.wantErrCount) if tc.wantErrMessage != "" { assert.Contains(t, errors.Errors[0].Detail, tc.wantErrMessage) } })` $DIR/core/web/user_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/user_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/user_controller_test.go: `resp, cleanup = client.Delete(fmt.Sprintf("/v2/users/%s", url.QueryEscape(user.Email)))` $DIR/core/web/user_controller_test.go: `t.Cleanup(cleanup)` $DIR/core/web/user_controller_test.go: `errors = cltest.ParseJSONAPIErrors(t, resp.Body)` $DIR/core/web/user_controller_test.go: `err = cltest.ParseJSONAPIResponse(t, resp, &authToken)` $DIR/core/web/user_controller_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/user_controller_test.go: `.NewHTTPClient(&u)` $DIR/core/web/user_controller_test.go: `.Sprintf(`{"newPassword": "%v", "oldPassword": "%v"}`, "foo", cltest.Password)` $DIR/core/web/user_controller_test.go: `.Sprintf("%s %s\n", utils.ErrMsgHeader, "password is less than 16 characters long")` $DIR/core/web/user_controller_test.go: `.Sprintf(`{"newPassword": "%slonglonglonglong", "oldPassword": "%s"}`, u.Email, cltest.Password)` $DIR/core/web/user_controller_test.go: `.Sprintf("%s %s%s\n", utils.ErrMsgHeader, "password may not contain: ", fmt.Sprintf(`"%s"`, u.Email))` $DIR/core/web/user_controller_test.go: `.Sprintf(`"%s"`, u.Email)` $DIR/core/web/user_controller_test.go: `.Sprintf(`{"newPassword": "%v", "oldPassword": "%v"}`, cltest.Password, cltest.Password)` $DIR/core/web/user_controller_test.go: `.Run(tc.name, func(t *testing.T) { resp, cleanup := client.Patch("/v2/user/password", bytes.NewBufferString(tc.reqBody)) t.Cleanup(cleanup) errors := cltest.ParseJSONAPIErrors(t, resp.Body) require.Equal(t, tc.wantStatusCode, resp.StatusCode) assert.Len(t, errors.Errors, tc.wantErrCount) if tc.wantErrMessage != "" { assert.Equal(t, tc.wantErrMessage, errors.Errors[0].Detail) } })` $DIR/core/web/user_controller_test.go: `.Patch("/v2/user/password", bytes.NewBufferString(tc.reqBody))` $DIR/core/web/user_controller_test.go: `.NewBufferString(tc.reqBody)` $DIR/core/web/user_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/user_controller_test.go: `.ParseJSONAPIErrors(t, resp.Body)` $DIR/core/web/user_controller_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/user_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/user_controller_test.go: `.Repeat("x", sessions.MaxBcryptPasswordLength+1)` $DIR/core/web/user_controller_test.go: `.Sprintf(`{"email": "12345678", "role": "view", "password": "%v"}`, cltest.Password)` $DIR/core/web/user_controller_test.go: `.Sprintf(`{"email": "", "role": "view", "password": "%v"}`, cltest.Password)` $DIR/core/web/user_controller_test.go: `.Sprintf(`{"email": "abc@email.com", "role": "", "password": "%v"}`, cltest.Password)` $DIR/core/web/user_controller_test.go: `.Sprintf(`{"email": "abc@email.com", "role": "view", "password": "%v"}`, longPassword)` $DIR/core/web/user_controller_test.go: `.Sprintf(`{"email": "%s", "role": "edit", "password": "%v"}`, cltest.MustRandomUser(t).Email, cltest.Password)` $DIR/core/web/user_controller_test.go: `.MustRandomUser(t)` $DIR/core/web/user_controller_test.go: `.Run(tc.name, func(t *testing.T) { resp, cleanup := client.Post("/v2/users", bytes.NewBufferString(tc.reqBody)) t.Cleanup(cleanup) errors := cltest.ParseJSONAPIErrors(t, resp.Body) require.Equal(t, tc.wantStatusCode, resp.StatusCode) assert.Len(t, errors.Errors, tc.wantErrCount) if tc.wantErrMessage != "" { assert.Contains(t, errors.Errors[0].Detail, tc.wantErrMessage) } })` $DIR/core/web/user_controller_test.go: `.Post("/v2/users", bytes.NewBufferString(tc.reqBody))` $DIR/core/web/user_controller_test.go: `.NewBufferString(tc.reqBody)` $DIR/core/web/user_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/user_controller_test.go: `.ParseJSONAPIErrors(t, resp.Body)` $DIR/core/web/user_controller_test.go: `.Context(t)` $DIR/core/web/user_controller_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/user_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/user_controller_test.go: `.MustRandomUser(t)` $DIR/core/web/user_controller_test.go: `.AuthenticationProvider()` $DIR/core/web/user_controller_test.go: `.CreateUser(ctx, &user)` $DIR/core/web/user_controller_test.go: `.Sprintf(`{"email": "%s", "newRole": "edit"}`, user.Email)` $DIR/core/web/user_controller_test.go: `.Run(tc.name, func(t *testing.T) { resp, cleanup := client.Patch("/v2/users", bytes.NewBufferString(tc.reqBody)) t.Cleanup(cleanup) errors := cltest.ParseJSONAPIErrors(t, resp.Body) require.Equal(t, tc.wantStatusCode, resp.StatusCode) assert.Len(t, errors.Errors, tc.wantErrCount) if tc.wantErrMessage != "" { assert.Contains(t, errors.Errors[0].Detail, tc.wantErrMessage) } })` $DIR/core/web/user_controller_test.go: `.Patch("/v2/users", bytes.NewBufferString(tc.reqBody))` $DIR/core/web/user_controller_test.go: `.NewBufferString(tc.reqBody)` $DIR/core/web/user_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/user_controller_test.go: `.ParseJSONAPIErrors(t, resp.Body)` $DIR/core/web/user_controller_test.go: `.Context(t)` $DIR/core/web/user_controller_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/user_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/user_controller_test.go: `.MustRandomUser(t)` $DIR/core/web/user_controller_test.go: `.AuthenticationProvider()` $DIR/core/web/user_controller_test.go: `.CreateUser(ctx, &user)` $DIR/core/web/user_controller_test.go: `.Delete(fmt.Sprintf("/v2/users/%s", url.QueryEscape(user.Email)))` $DIR/core/web/user_controller_test.go: `.Sprintf("/v2/users/%s", url.QueryEscape(user.Email))` $DIR/core/web/user_controller_test.go: `.QueryEscape(user.Email)` $DIR/core/web/user_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/user_controller_test.go: `.ParseJSONAPIErrors(t, resp.Body)` $DIR/core/web/user_controller_test.go: `.Delete(fmt.Sprintf("/v2/users/%s", url.QueryEscape(user.Email)))` $DIR/core/web/user_controller_test.go: `.Sprintf("/v2/users/%s", url.QueryEscape(user.Email))` $DIR/core/web/user_controller_test.go: `.QueryEscape(user.Email)` $DIR/core/web/user_controller_test.go: `.Cleanup(cleanup)` $DIR/core/web/user_controller_test.go: `.ParseJSONAPIErrors(t, resp.Body)` $DIR/core/web/user_controller_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/user_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/user_controller_test.go: `.Marshal(sessions.ChangeAuthTokenRequest{ Password: cltest.Password, })` $DIR/core/web/user_controller_test.go: `.Post("/v2/user/token", bytes.NewBuffer(req))` $DIR/core/web/user_controller_test.go: `.NewBuffer(req)` $DIR/core/web/user_controller_test.go: `.ParseJSONAPIResponse(t, resp, &authToken)` $DIR/core/web/user_controller_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/user_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/user_controller_test.go: `.Marshal(sessions.ChangeAuthTokenRequest{ Password: "wrong-password", })` $DIR/core/web/user_controller_test.go: `.Post("/v2/user/token", bytes.NewBuffer(req))` $DIR/core/web/user_controller_test.go: `.NewBuffer(req)` $DIR/core/web/user_controller_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/user_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/user_controller_test.go: `.Marshal(sessions.ChangeAuthTokenRequest{ Password: cltest.Password, })` $DIR/core/web/user_controller_test.go: `.Post("/v2/user/token/delete", bytes.NewBuffer(req))` $DIR/core/web/user_controller_test.go: `.NewBuffer(req)` $DIR/core/web/user_controller_test.go: `.NewApplicationEVMDisabled(t)` $DIR/core/web/user_controller_test.go: `.NewHTTPClient(nil)` $DIR/core/web/user_controller_test.go: `.Marshal(sessions.ChangeAuthTokenRequest{ Password: "wrong-password", })` $DIR/core/web/user_controller_test.go: `.Post("/v2/user/token/delete", bytes.NewBuffer(req))` $DIR/core/web/user_controller_test.go: `.NewBuffer(req)` $DIR/integration-tests/benchmark/keeper_test.go: `l.Info().Str("Test Name", testName).Msg("Running Benchmark Test")` $DIR/integration-tests/benchmark/keeper_test.go: `l.Info().Str("Namespace", testEnvironment.Cfg.Namespace).Msg("Connected to Keepers Benchmark Environment")` $DIR/integration-tests/benchmark/keeper_test.go: `t.Cleanup(func() { if err = actions_seth.TeardownRemoteSuite(keeperBenchmarkTest.TearDownVals(t)); err != nil { l.Error().Err(err).Msg("Error when tearing down remote suite") } })` $DIR/integration-tests/benchmark/keeper_test.go: `keeperBenchmarkTest.Setup(testEnvironment, &config)` $DIR/integration-tests/benchmark/keeper_test.go: `.GetTestLogger(t)` $DIR/integration-tests/benchmark/keeper_test.go: `.GetConfigurationNameFromEnv()` $DIR/integration-tests/benchmark/keeper_test.go: `.GetConfig(testType, tc.Keeper)` $DIR/integration-tests/benchmark/keeper_test.go: `.WillUseRemoteRunner()` $DIR/integration-tests/benchmark/keeper_test.go: `.ReplaceAll(benchmarkNetwork.Name, " ", "")` $DIR/integration-tests/benchmark/keeper_test.go: `.Sprintf("%s%s", networkName, *config.Keeper.Common.RegistryToTest)` $DIR/integration-tests/benchmark/keeper_test.go: `.Info()` $DIR/integration-tests/benchmark/keeper_test.go: `.Str("Test Name", testName)` $DIR/integration-tests/benchmark/keeper_test.go: `.Msg("Running Benchmark Test")` $DIR/integration-tests/benchmark/keeper_test.go: `.Info()` $DIR/integration-tests/benchmark/keeper_test.go: `.Str("Namespace", testEnvironment.Cfg.Namespace)` $DIR/integration-tests/benchmark/keeper_test.go: `.Msg("Connected to Keepers Benchmark Environment")` $DIR/integration-tests/benchmark/keeper_test.go: `.MustReplaceSimulatedNetworkUrlWithK8(l, benchmarkNetwork, *testEnvironment)` $DIR/integration-tests/benchmark/keeper_test.go: `.GetChainClientWithConfigFunction(&config, testNetwork, actions_seth.OneEphemeralKeysLiveTestnetAutoFixFn)` $DIR/integration-tests/benchmark/keeper_test.go: `.NewKeeperBenchmarkTest(t, testsetups.KeeperBenchmarkTestInputs{ BlockchainClient: chainClient, RegistryVersions: registryVersions, KeeperRegistrySettings: &contracts.KeeperRegistrySettings{ PaymentPremiumPPB: uint32(0), FlatFeeMicroLINK: uint32(40000), BlockCountPerTurn: big.NewInt(100), CheckGasLimit: uint32(45_000_000), //45M StalenessSeconds: big.NewInt(90_000), GasCeilingMultiplier: uint16(2), MaxPerformGas: uint32(*config.Keeper.Common.MaxPerformGas), MinUpkeepSpend: big.NewInt(0), FallbackGasPrice: big.NewInt(2e11), FallbackLinkPrice: big.NewInt(2e18), MaxCheckDataSize: uint32(5_000), MaxPerformDataSize: uint32(5_000), MaxRevertDataSize: uint32(5_000), }, Upkeeps: &testsetups.UpkeepConfig{ NumberOfUpkeeps: *config.Keeper.Common.NumberOfUpkeeps, CheckGasToBurn: *config.Keeper.Common.CheckGasToBurn, PerformGasToBurn: *config.Keeper.Common.PerformGasToBurn, BlockRange: *config.Keeper.Common.BlockRange, BlockInterval: *config.Keeper.Common.BlockInterval, UpkeepGasLimit: *config.Keeper.Common.UpkeepGasLimit, FirstEligibleBuffer: 1, }, Contracts: &testsetups.PreDeployedContracts{ RegistrarAddress: *config.Keeper.Common.RegistrarAddress, RegistryAddress: *config.Keeper.Common.RegistryAddress, LinkTokenAddress: *config.Keeper.Common.LinkTokenAddress, EthFeedAddress: *config.Keeper.Common.EthFeedAddress, GasFeedAddress: *config.Keeper.Common.GasFeedAddress, }, ChainlinkNodeFunding: benchmarkTestNetwork.funding, UpkeepSLA: benchmarkTestNetwork.upkeepSLA, BlockTime: benchmarkTestNetwork.blockTime, DeltaStage: benchmarkTestNetwork.deltaStage, ForceSingleTxnKey: *config.Keeper.Common.ForceSingleTxKey, DeleteJobsOnEnd: *config.Keeper.Common.DeleteJobsOnEnd, }, )` $DIR/integration-tests/benchmark/keeper_test.go: `.NewInt(100)` $DIR/integration-tests/benchmark/keeper_test.go: `.NewInt(90_000)` $DIR/integration-tests/benchmark/keeper_test.go: `.NewInt(0)` $DIR/integration-tests/benchmark/keeper_test.go: `.NewInt(2e11)` $DIR/integration-tests/benchmark/keeper_test.go: `.NewInt(2e18)` $DIR/integration-tests/benchmark/keeper_test.go: `.Cleanup(func() { if err = actions_seth.TeardownRemoteSuite(keeperBenchmarkTest.TearDownVals(t)); err != nil { l.Error().Err(err).Msg("Error when tearing down remote suite") } })` $DIR/integration-tests/benchmark/keeper_test.go: `.TeardownRemoteSuite(keeperBenchmarkTest.TearDownVals(t))` $DIR/integration-tests/benchmark/keeper_test.go: `.TearDownVals(t)` $DIR/integration-tests/benchmark/keeper_test.go: `.Setup(testEnvironment, &config)` $DIR/integration-tests/chaos/automation_chaos_test.go: `t.Run(name, func(t *testing.T) { t.Parallel() config, err := tc.GetConfig("Chaos", tc.Automation) if err != nil { t.Fatal(err) } var overrideFn = func(_ interface{}, target interface{}) { ctf_config.MustConfigOverrideChainlinkVersion(config.GetChainlinkImageConfig(), target) ctf_config.MightConfigOverridePyroscopeKey(config.GetPyroscopeConfig(), target) } chainlinkCfg := chainlink.NewWithOverride(0, getDefaultAutomationSettings(&config), config.ChainlinkImage, overrideFn) testCases := map[string]struct { networkChart environment.ConnectedChart clChart environment.ConnectedChart chaosFunc chaos.ManifestFunc chaosProps *chaos.Props }{ // see ocr_chaos.test.go for comments PodChaosFailMinorityNodes: { ethereum.New(getDefaultEthereumSettings(&config)), chainlinkCfg, chaos.NewFailPods, &chaos.Props{ LabelsSelector: &map[string]*string{ChaosGroupMinority: ptr.Ptr("1")}, DurationStr: "1m", }, }, PodChaosFailMajorityNodes: { ethereum.New(getDefaultEthereumSettings(&config)), chainlinkCfg, chaos.NewFailPods, &chaos.Props{ LabelsSelector: &map[string]*string{ChaosGroupMajority: ptr.Ptr("1")}, DurationStr: "1m", }, }, PodChaosFailMajorityDB: { ethereum.New(getDefaultEthereumSettings(&config)), chainlinkCfg, chaos.NewFailPods, &chaos.Props{ LabelsSelector: &map[string]*string{ChaosGroupMajority: ptr.Ptr("1")}, DurationStr: "1m", ContainerNames: &[]*string{ptr.Ptr("chainlink-db")}, }, }, NetworkChaosFailMajorityNetwork: { ethereum.New(getDefaultEthereumSettings(&config)), chainlinkCfg, chaos.NewNetworkPartition, &chaos.Props{ FromLabels: &map[string]*string{ChaosGroupMajority: ptr.Ptr("1")}, ToLabels: &map[string]*string{ChaosGroupMinority: ptr.Ptr("1")}, DurationStr: "1m", }, }, NetworkChaosFailBlockchainNode: { ethereum.New(getDefaultEthereumSettings(&config)), chainlinkCfg, chaos.NewNetworkPartition, &chaos.Props{ FromLabels: &map[string]*string{"app": ptr.Ptr("geth")}, ToLabels: &map[string]*string{ChaosGroupMajorityPlus: ptr.Ptr("1")}, DurationStr: "1m", }, }, } for name, testCase := range testCases { name := name testCase := testCase t.Run(fmt.Sprintf("Automation_%s", name), func(t *testing.T) { t.Parallel() network := networks.MustGetSelectedNetworkConfig(config.Network)[0] // Need a new copy of the network for each test testEnvironment := environment. New(&environment.Config{ NamespacePrefix: fmt.Sprintf("chaos-automation-%s", name), TTL: time.Hour * 1, Test: t, }). AddHelm(testCase.networkChart). AddHelm(testCase.clChart) // TODO we need to update the image in CTF, the old one is not available anymore // deploy blockscout if running on simulated // AddHelm(testCase.clChart). // AddChart(blockscout.New(&blockscout.Props{ // Name: "geth-blockscout", // WsURL: network.URL, // HttpURL: network.HTTPURLs[0], // }) err = testEnvironment.Run() require.NoError(t, err, "Error setting up test environment") if testEnvironment.WillUseRemoteRunner() { return } err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 1, 2, ChaosGroupMinority) require.NoError(t, err) err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 3, 5, ChaosGroupMajority) require.NoError(t, err) err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 2, 5, ChaosGroupMajorityPlus) require.NoError(t, err) chainlinkNodes, err := client.ConnectChainlinkNodes(testEnvironment) require.NoError(t, err, "Error connecting to Chainlink nodes") network = seth_utils.MustReplaceSimulatedNetworkUrlWithK8(l, network, *testEnvironment) chainClient, err := actions_seth.GetChainClientWithConfigFunction(&config, network, actions_seth.OneEphemeralKeysLiveTestnetAutoFixFn) require.NoError(t, err, "Error creating seth client") // Register cleanup for any test t.Cleanup(func() { err := actions_seth.TeardownSuite(t, chainClient, testEnvironment, chainlinkNodes, nil, zapcore.PanicLevel, &config) require.NoError(t, err, "Error tearing down environment") }) txCost, err := actions_seth.EstimateCostForChainlinkOperations(l, chainClient, network, 1000) require.NoError(t, err, "Error estimating cost for Chainlink Operations") err = actions_seth.FundChainlinkNodesFromRootAddress(l, chainClient, contracts.ChainlinkK8sClientToChainlinkNodeWithKeysAndAddress(chainlinkNodes), txCost) require.NoError(t, err, "Error funding Chainlink nodes") linkToken, err := contracts.DeployLinkTokenContract(l, chainClient) require.NoError(t, err, "Error deploying LINK token") registry, registrar := actions_seth.DeployAutoOCRRegistryAndRegistrar( t, chainClient, rv, defaultOCRRegistryConfig, linkToken, ) // Fund the registry with LINK err = linkToken.Transfer(registry.Address(), big.NewInt(0).Mul(big.NewInt(1e18), big.NewInt(int64(numberOfUpkeeps)))) require.NoError(t, err, "Funding keeper registry contract shouldn't fail") actions.CreateOCRKeeperJobs(t, chainlinkNodes, registry.Address(), network.ChainID, 0, rv) nodesWithoutBootstrap := chainlinkNodes[1:] defaultOCRRegistryConfig.RegistryVersion = rv ocrConfig, err := actions.BuildAutoOCR2ConfigVars(t, nodesWithoutBootstrap, defaultOCRRegistryConfig, registrar.Address(), 30*time.Second, registry.ChainModuleAddress(), registry.ReorgProtectionEnabled()) require.NoError(t, err, "Error building OCR config vars") if rv == eth_contracts.RegistryVersion_2_0 { err = registry.SetConfig(defaultOCRRegistryConfig, ocrConfig) } else { err = registry.SetConfigTypeSafe(ocrConfig) } require.NoError(t, err, "Error setting OCR config") consumersConditional, upkeepidsConditional := actions_seth.DeployConsumers(t, chainClient, registry, registrar, linkToken, numberOfUpkeeps, big.NewInt(defaultLinkFunds), defaultUpkeepGasLimit, false, false) consumersLogtrigger, upkeepidsLogtrigger := actions_seth.DeployConsumers(t, chainClient, registry, registrar, linkToken, numberOfUpkeeps, big.NewInt(defaultLinkFunds), defaultUpkeepGasLimit, true, false) consumers := append(consumersConditional, consumersLogtrigger...) upkeepIDs := append(upkeepidsConditional, upkeepidsLogtrigger...) for _, c := range consumersLogtrigger { err = c.Start() require.NoError(t, err, "Error starting consumer") } l.Info().Msg("Waiting for all upkeeps to be performed") gom := gomega.NewGomegaWithT(t) gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 10 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := 5 l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep ID", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64()) } }, "5m", "1s").Should(gomega.Succeed()) // ~1m for cluster setup, ~2m for performing each upkeep 5 times, ~2m buffer _, err = testEnvironment.Chaos.Run(testCase.chaosFunc(testEnvironment.Cfg.Namespace, testCase.chaosProps)) require.NoError(t, err) gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 10 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := 10 l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep ID", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64()) } }, "3m", "1s").Should(gomega.Succeed()) // ~1m for cluster setup, ~2m for performing each upkeep 5 times, ~2m buffer }) } })` $DIR/integration-tests/chaos/automation_chaos_test.go: `ctf_config.MustConfigOverrideChainlinkVersion(config.GetChainlinkImageConfig(), target)` $DIR/integration-tests/chaos/automation_chaos_test.go: `ctf_config.MightConfigOverridePyroscopeKey(config.GetPyroscopeConfig(), target)` $DIR/integration-tests/chaos/automation_chaos_test.go: `t.Run(fmt.Sprintf("Automation_%s", name), func(t *testing.T) { t.Parallel() network := networks.MustGetSelectedNetworkConfig(config.Network)[0] // Need a new copy of the network for each test testEnvironment := environment. New(&environment.Config{ NamespacePrefix: fmt.Sprintf("chaos-automation-%s", name), TTL: time.Hour * 1, Test: t, }). AddHelm(testCase.networkChart). AddHelm(testCase.clChart) // TODO we need to update the image in CTF, the old one is not available anymore // deploy blockscout if running on simulated // AddHelm(testCase.clChart). // AddChart(blockscout.New(&blockscout.Props{ // Name: "geth-blockscout", // WsURL: network.URL, // HttpURL: network.HTTPURLs[0], // }) err = testEnvironment.Run() require.NoError(t, err, "Error setting up test environment") if testEnvironment.WillUseRemoteRunner() { return } err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 1, 2, ChaosGroupMinority) require.NoError(t, err) err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 3, 5, ChaosGroupMajority) require.NoError(t, err) err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 2, 5, ChaosGroupMajorityPlus) require.NoError(t, err) chainlinkNodes, err := client.ConnectChainlinkNodes(testEnvironment) require.NoError(t, err, "Error connecting to Chainlink nodes") network = seth_utils.MustReplaceSimulatedNetworkUrlWithK8(l, network, *testEnvironment) chainClient, err := actions_seth.GetChainClientWithConfigFunction(&config, network, actions_seth.OneEphemeralKeysLiveTestnetAutoFixFn) require.NoError(t, err, "Error creating seth client") // Register cleanup for any test t.Cleanup(func() { err := actions_seth.TeardownSuite(t, chainClient, testEnvironment, chainlinkNodes, nil, zapcore.PanicLevel, &config) require.NoError(t, err, "Error tearing down environment") }) txCost, err := actions_seth.EstimateCostForChainlinkOperations(l, chainClient, network, 1000) require.NoError(t, err, "Error estimating cost for Chainlink Operations") err = actions_seth.FundChainlinkNodesFromRootAddress(l, chainClient, contracts.ChainlinkK8sClientToChainlinkNodeWithKeysAndAddress(chainlinkNodes), txCost) require.NoError(t, err, "Error funding Chainlink nodes") linkToken, err := contracts.DeployLinkTokenContract(l, chainClient) require.NoError(t, err, "Error deploying LINK token") registry, registrar := actions_seth.DeployAutoOCRRegistryAndRegistrar( t, chainClient, rv, defaultOCRRegistryConfig, linkToken, ) // Fund the registry with LINK err = linkToken.Transfer(registry.Address(), big.NewInt(0).Mul(big.NewInt(1e18), big.NewInt(int64(numberOfUpkeeps)))) require.NoError(t, err, "Funding keeper registry contract shouldn't fail") actions.CreateOCRKeeperJobs(t, chainlinkNodes, registry.Address(), network.ChainID, 0, rv) nodesWithoutBootstrap := chainlinkNodes[1:] defaultOCRRegistryConfig.RegistryVersion = rv ocrConfig, err := actions.BuildAutoOCR2ConfigVars(t, nodesWithoutBootstrap, defaultOCRRegistryConfig, registrar.Address(), 30*time.Second, registry.ChainModuleAddress(), registry.ReorgProtectionEnabled()) require.NoError(t, err, "Error building OCR config vars") if rv == eth_contracts.RegistryVersion_2_0 { err = registry.SetConfig(defaultOCRRegistryConfig, ocrConfig) } else { err = registry.SetConfigTypeSafe(ocrConfig) } require.NoError(t, err, "Error setting OCR config") consumersConditional, upkeepidsConditional := actions_seth.DeployConsumers(t, chainClient, registry, registrar, linkToken, numberOfUpkeeps, big.NewInt(defaultLinkFunds), defaultUpkeepGasLimit, false, false) consumersLogtrigger, upkeepidsLogtrigger := actions_seth.DeployConsumers(t, chainClient, registry, registrar, linkToken, numberOfUpkeeps, big.NewInt(defaultLinkFunds), defaultUpkeepGasLimit, true, false) consumers := append(consumersConditional, consumersLogtrigger...) upkeepIDs := append(upkeepidsConditional, upkeepidsLogtrigger...) for _, c := range consumersLogtrigger { err = c.Start() require.NoError(t, err, "Error starting consumer") } l.Info().Msg("Waiting for all upkeeps to be performed") gom := gomega.NewGomegaWithT(t) gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 10 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := 5 l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep ID", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64()) } }, "5m", "1s").Should(gomega.Succeed()) // ~1m for cluster setup, ~2m for performing each upkeep 5 times, ~2m buffer _, err = testEnvironment.Chaos.Run(testCase.chaosFunc(testEnvironment.Cfg.Namespace, testCase.chaosProps)) require.NoError(t, err) gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 10 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := 10 l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep ID", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64()) } }, "3m", "1s").Should(gomega.Succeed()) // ~1m for cluster setup, ~2m for performing each upkeep 5 times, ~2m buffer })` $DIR/integration-tests/chaos/automation_chaos_test.go: `err = testEnvironment.Run()` $DIR/integration-tests/chaos/automation_chaos_test.go: `err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 1, 2, ChaosGroupMinority)` $DIR/integration-tests/chaos/automation_chaos_test.go: `err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 3, 5, ChaosGroupMajority)` $DIR/integration-tests/chaos/automation_chaos_test.go: `err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 2, 5, ChaosGroupMajorityPlus)` $DIR/integration-tests/chaos/automation_chaos_test.go: `network = seth_utils.MustReplaceSimulatedNetworkUrlWithK8(l, network, *testEnvironment)` $DIR/integration-tests/chaos/automation_chaos_test.go: `t.Cleanup(func() { err := actions_seth.TeardownSuite(t, chainClient, testEnvironment, chainlinkNodes, nil, zapcore.PanicLevel, &config) require.NoError(t, err, "Error tearing down environment") })` $DIR/integration-tests/chaos/automation_chaos_test.go: `err = actions_seth.FundChainlinkNodesFromRootAddress(l, chainClient, contracts.ChainlinkK8sClientToChainlinkNodeWithKeysAndAddress(chainlinkNodes), txCost)` $DIR/integration-tests/chaos/automation_chaos_test.go: `err = linkToken.Transfer(registry.Address(), big.NewInt(0).Mul(big.NewInt(1e18), big.NewInt(int64(numberOfUpkeeps))))` $DIR/integration-tests/chaos/automation_chaos_test.go: `actions.CreateOCRKeeperJobs(t, chainlinkNodes, registry.Address(), network.ChainID, 0, rv)` $DIR/integration-tests/chaos/automation_chaos_test.go: `defaultOCRRegistryConfig.RegistryVersion = rv` $DIR/integration-tests/chaos/automation_chaos_test.go: `err = registry.SetConfig(defaultOCRRegistryConfig, ocrConfig)` $DIR/integration-tests/chaos/automation_chaos_test.go: `err = registry.SetConfigTypeSafe(ocrConfig)` $DIR/integration-tests/chaos/automation_chaos_test.go: `err = c.Start()` $DIR/integration-tests/chaos/automation_chaos_test.go: `l.Info().Msg("Waiting for all upkeeps to be performed")` $DIR/integration-tests/chaos/automation_chaos_test.go: `gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 10 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := 5 l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep ID", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64()) } }, "5m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/chaos/automation_chaos_test.go: `l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep ID", i).Msg("Number of upkeeps performed")` $DIR/integration-tests/chaos/automation_chaos_test.go: `g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64())` $DIR/integration-tests/chaos/automation_chaos_test.go: `_, err = testEnvironment.Chaos.Run(testCase.chaosFunc(testEnvironment.Cfg.Namespace, testCase.chaosProps))` $DIR/integration-tests/chaos/automation_chaos_test.go: `gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 10 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := 10 l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep ID", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64()) } }, "3m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/chaos/automation_chaos_test.go: `l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep ID", i).Msg("Number of upkeeps performed")` $DIR/integration-tests/chaos/automation_chaos_test.go: `g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64())` $DIR/integration-tests/chaos/automation_chaos_test.go: `.GetTestLogger(t)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Run(name, func(t *testing.T) { t.Parallel() config, err := tc.GetConfig("Chaos", tc.Automation) if err != nil { t.Fatal(err) } var overrideFn = func(_ interface{}, target interface{}) { ctf_config.MustConfigOverrideChainlinkVersion(config.GetChainlinkImageConfig(), target) ctf_config.MightConfigOverridePyroscopeKey(config.GetPyroscopeConfig(), target) } chainlinkCfg := chainlink.NewWithOverride(0, getDefaultAutomationSettings(&config), config.ChainlinkImage, overrideFn) testCases := map[string]struct { networkChart environment.ConnectedChart clChart environment.ConnectedChart chaosFunc chaos.ManifestFunc chaosProps *chaos.Props }{ // see ocr_chaos.test.go for comments PodChaosFailMinorityNodes: { ethereum.New(getDefaultEthereumSettings(&config)), chainlinkCfg, chaos.NewFailPods, &chaos.Props{ LabelsSelector: &map[string]*string{ChaosGroupMinority: ptr.Ptr("1")}, DurationStr: "1m", }, }, PodChaosFailMajorityNodes: { ethereum.New(getDefaultEthereumSettings(&config)), chainlinkCfg, chaos.NewFailPods, &chaos.Props{ LabelsSelector: &map[string]*string{ChaosGroupMajority: ptr.Ptr("1")}, DurationStr: "1m", }, }, PodChaosFailMajorityDB: { ethereum.New(getDefaultEthereumSettings(&config)), chainlinkCfg, chaos.NewFailPods, &chaos.Props{ LabelsSelector: &map[string]*string{ChaosGroupMajority: ptr.Ptr("1")}, DurationStr: "1m", ContainerNames: &[]*string{ptr.Ptr("chainlink-db")}, }, }, NetworkChaosFailMajorityNetwork: { ethereum.New(getDefaultEthereumSettings(&config)), chainlinkCfg, chaos.NewNetworkPartition, &chaos.Props{ FromLabels: &map[string]*string{ChaosGroupMajority: ptr.Ptr("1")}, ToLabels: &map[string]*string{ChaosGroupMinority: ptr.Ptr("1")}, DurationStr: "1m", }, }, NetworkChaosFailBlockchainNode: { ethereum.New(getDefaultEthereumSettings(&config)), chainlinkCfg, chaos.NewNetworkPartition, &chaos.Props{ FromLabels: &map[string]*string{"app": ptr.Ptr("geth")}, ToLabels: &map[string]*string{ChaosGroupMajorityPlus: ptr.Ptr("1")}, DurationStr: "1m", }, }, } for name, testCase := range testCases { name := name testCase := testCase t.Run(fmt.Sprintf("Automation_%s", name), func(t *testing.T) { t.Parallel() network := networks.MustGetSelectedNetworkConfig(config.Network)[0] // Need a new copy of the network for each test testEnvironment := environment. New(&environment.Config{ NamespacePrefix: fmt.Sprintf("chaos-automation-%s", name), TTL: time.Hour * 1, Test: t, }). AddHelm(testCase.networkChart). AddHelm(testCase.clChart) // TODO we need to update the image in CTF, the old one is not available anymore // deploy blockscout if running on simulated // AddHelm(testCase.clChart). // AddChart(blockscout.New(&blockscout.Props{ // Name: "geth-blockscout", // WsURL: network.URL, // HttpURL: network.HTTPURLs[0], // }) err = testEnvironment.Run() require.NoError(t, err, "Error setting up test environment") if testEnvironment.WillUseRemoteRunner() { return } err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 1, 2, ChaosGroupMinority) require.NoError(t, err) err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 3, 5, ChaosGroupMajority) require.NoError(t, err) err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 2, 5, ChaosGroupMajorityPlus) require.NoError(t, err) chainlinkNodes, err := client.ConnectChainlinkNodes(testEnvironment) require.NoError(t, err, "Error connecting to Chainlink nodes") network = seth_utils.MustReplaceSimulatedNetworkUrlWithK8(l, network, *testEnvironment) chainClient, err := actions_seth.GetChainClientWithConfigFunction(&config, network, actions_seth.OneEphemeralKeysLiveTestnetAutoFixFn) require.NoError(t, err, "Error creating seth client") // Register cleanup for any test t.Cleanup(func() { err := actions_seth.TeardownSuite(t, chainClient, testEnvironment, chainlinkNodes, nil, zapcore.PanicLevel, &config) require.NoError(t, err, "Error tearing down environment") }) txCost, err := actions_seth.EstimateCostForChainlinkOperations(l, chainClient, network, 1000) require.NoError(t, err, "Error estimating cost for Chainlink Operations") err = actions_seth.FundChainlinkNodesFromRootAddress(l, chainClient, contracts.ChainlinkK8sClientToChainlinkNodeWithKeysAndAddress(chainlinkNodes), txCost) require.NoError(t, err, "Error funding Chainlink nodes") linkToken, err := contracts.DeployLinkTokenContract(l, chainClient) require.NoError(t, err, "Error deploying LINK token") registry, registrar := actions_seth.DeployAutoOCRRegistryAndRegistrar( t, chainClient, rv, defaultOCRRegistryConfig, linkToken, ) // Fund the registry with LINK err = linkToken.Transfer(registry.Address(), big.NewInt(0).Mul(big.NewInt(1e18), big.NewInt(int64(numberOfUpkeeps)))) require.NoError(t, err, "Funding keeper registry contract shouldn't fail") actions.CreateOCRKeeperJobs(t, chainlinkNodes, registry.Address(), network.ChainID, 0, rv) nodesWithoutBootstrap := chainlinkNodes[1:] defaultOCRRegistryConfig.RegistryVersion = rv ocrConfig, err := actions.BuildAutoOCR2ConfigVars(t, nodesWithoutBootstrap, defaultOCRRegistryConfig, registrar.Address(), 30*time.Second, registry.ChainModuleAddress(), registry.ReorgProtectionEnabled()) require.NoError(t, err, "Error building OCR config vars") if rv == eth_contracts.RegistryVersion_2_0 { err = registry.SetConfig(defaultOCRRegistryConfig, ocrConfig) } else { err = registry.SetConfigTypeSafe(ocrConfig) } require.NoError(t, err, "Error setting OCR config") consumersConditional, upkeepidsConditional := actions_seth.DeployConsumers(t, chainClient, registry, registrar, linkToken, numberOfUpkeeps, big.NewInt(defaultLinkFunds), defaultUpkeepGasLimit, false, false) consumersLogtrigger, upkeepidsLogtrigger := actions_seth.DeployConsumers(t, chainClient, registry, registrar, linkToken, numberOfUpkeeps, big.NewInt(defaultLinkFunds), defaultUpkeepGasLimit, true, false) consumers := append(consumersConditional, consumersLogtrigger...) upkeepIDs := append(upkeepidsConditional, upkeepidsLogtrigger...) for _, c := range consumersLogtrigger { err = c.Start() require.NoError(t, err, "Error starting consumer") } l.Info().Msg("Waiting for all upkeeps to be performed") gom := gomega.NewGomegaWithT(t) gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 10 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := 5 l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep ID", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64()) } }, "5m", "1s").Should(gomega.Succeed()) // ~1m for cluster setup, ~2m for performing each upkeep 5 times, ~2m buffer _, err = testEnvironment.Chaos.Run(testCase.chaosFunc(testEnvironment.Cfg.Namespace, testCase.chaosProps)) require.NoError(t, err) gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 10 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := 10 l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep ID", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64()) } }, "3m", "1s").Should(gomega.Succeed()) // ~1m for cluster setup, ~2m for performing each upkeep 5 times, ~2m buffer }) } })` $DIR/integration-tests/chaos/automation_chaos_test.go: `.GetConfig("Chaos", tc.Automation)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.MustConfigOverrideChainlinkVersion(config.GetChainlinkImageConfig(), target)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.GetChainlinkImageConfig()` $DIR/integration-tests/chaos/automation_chaos_test.go: `.MightConfigOverridePyroscopeKey(config.GetPyroscopeConfig(), target)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.GetPyroscopeConfig()` $DIR/integration-tests/chaos/automation_chaos_test.go: `.NewWithOverride(0, getDefaultAutomationSettings(&config), config.ChainlinkImage, overrideFn)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.New(getDefaultEthereumSettings(&config))` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Ptr("1")` $DIR/integration-tests/chaos/automation_chaos_test.go: `.New(getDefaultEthereumSettings(&config))` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Ptr("1")` $DIR/integration-tests/chaos/automation_chaos_test.go: `.New(getDefaultEthereumSettings(&config))` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Ptr("1")` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Ptr("chainlink-db")` $DIR/integration-tests/chaos/automation_chaos_test.go: `.New(getDefaultEthereumSettings(&config))` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Ptr("1")` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Ptr("1")` $DIR/integration-tests/chaos/automation_chaos_test.go: `.New(getDefaultEthereumSettings(&config))` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Ptr("geth")` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Ptr("1")` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Run(fmt.Sprintf("Automation_%s", name), func(t *testing.T) { t.Parallel() network := networks.MustGetSelectedNetworkConfig(config.Network)[0] // Need a new copy of the network for each test testEnvironment := environment. New(&environment.Config{ NamespacePrefix: fmt.Sprintf("chaos-automation-%s", name), TTL: time.Hour * 1, Test: t, }). AddHelm(testCase.networkChart). AddHelm(testCase.clChart) // TODO we need to update the image in CTF, the old one is not available anymore // deploy blockscout if running on simulated // AddHelm(testCase.clChart). // AddChart(blockscout.New(&blockscout.Props{ // Name: "geth-blockscout", // WsURL: network.URL, // HttpURL: network.HTTPURLs[0], // }) err = testEnvironment.Run() require.NoError(t, err, "Error setting up test environment") if testEnvironment.WillUseRemoteRunner() { return } err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 1, 2, ChaosGroupMinority) require.NoError(t, err) err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 3, 5, ChaosGroupMajority) require.NoError(t, err) err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 2, 5, ChaosGroupMajorityPlus) require.NoError(t, err) chainlinkNodes, err := client.ConnectChainlinkNodes(testEnvironment) require.NoError(t, err, "Error connecting to Chainlink nodes") network = seth_utils.MustReplaceSimulatedNetworkUrlWithK8(l, network, *testEnvironment) chainClient, err := actions_seth.GetChainClientWithConfigFunction(&config, network, actions_seth.OneEphemeralKeysLiveTestnetAutoFixFn) require.NoError(t, err, "Error creating seth client") // Register cleanup for any test t.Cleanup(func() { err := actions_seth.TeardownSuite(t, chainClient, testEnvironment, chainlinkNodes, nil, zapcore.PanicLevel, &config) require.NoError(t, err, "Error tearing down environment") }) txCost, err := actions_seth.EstimateCostForChainlinkOperations(l, chainClient, network, 1000) require.NoError(t, err, "Error estimating cost for Chainlink Operations") err = actions_seth.FundChainlinkNodesFromRootAddress(l, chainClient, contracts.ChainlinkK8sClientToChainlinkNodeWithKeysAndAddress(chainlinkNodes), txCost) require.NoError(t, err, "Error funding Chainlink nodes") linkToken, err := contracts.DeployLinkTokenContract(l, chainClient) require.NoError(t, err, "Error deploying LINK token") registry, registrar := actions_seth.DeployAutoOCRRegistryAndRegistrar( t, chainClient, rv, defaultOCRRegistryConfig, linkToken, ) // Fund the registry with LINK err = linkToken.Transfer(registry.Address(), big.NewInt(0).Mul(big.NewInt(1e18), big.NewInt(int64(numberOfUpkeeps)))) require.NoError(t, err, "Funding keeper registry contract shouldn't fail") actions.CreateOCRKeeperJobs(t, chainlinkNodes, registry.Address(), network.ChainID, 0, rv) nodesWithoutBootstrap := chainlinkNodes[1:] defaultOCRRegistryConfig.RegistryVersion = rv ocrConfig, err := actions.BuildAutoOCR2ConfigVars(t, nodesWithoutBootstrap, defaultOCRRegistryConfig, registrar.Address(), 30*time.Second, registry.ChainModuleAddress(), registry.ReorgProtectionEnabled()) require.NoError(t, err, "Error building OCR config vars") if rv == eth_contracts.RegistryVersion_2_0 { err = registry.SetConfig(defaultOCRRegistryConfig, ocrConfig) } else { err = registry.SetConfigTypeSafe(ocrConfig) } require.NoError(t, err, "Error setting OCR config") consumersConditional, upkeepidsConditional := actions_seth.DeployConsumers(t, chainClient, registry, registrar, linkToken, numberOfUpkeeps, big.NewInt(defaultLinkFunds), defaultUpkeepGasLimit, false, false) consumersLogtrigger, upkeepidsLogtrigger := actions_seth.DeployConsumers(t, chainClient, registry, registrar, linkToken, numberOfUpkeeps, big.NewInt(defaultLinkFunds), defaultUpkeepGasLimit, true, false) consumers := append(consumersConditional, consumersLogtrigger...) upkeepIDs := append(upkeepidsConditional, upkeepidsLogtrigger...) for _, c := range consumersLogtrigger { err = c.Start() require.NoError(t, err, "Error starting consumer") } l.Info().Msg("Waiting for all upkeeps to be performed") gom := gomega.NewGomegaWithT(t) gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 10 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := 5 l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep ID", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64()) } }, "5m", "1s").Should(gomega.Succeed()) // ~1m for cluster setup, ~2m for performing each upkeep 5 times, ~2m buffer _, err = testEnvironment.Chaos.Run(testCase.chaosFunc(testEnvironment.Cfg.Namespace, testCase.chaosProps)) require.NoError(t, err) gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 10 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := 10 l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep ID", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64()) } }, "3m", "1s").Should(gomega.Succeed()) // ~1m for cluster setup, ~2m for performing each upkeep 5 times, ~2m buffer })` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Sprintf("Automation_%s", name)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.MustGetSelectedNetworkConfig(config.Network)` $DIR/integration-tests/chaos/automation_chaos_test.go: `. New(&environment.Config{ NamespacePrefix: fmt.Sprintf("chaos-automation-%s", name), TTL: time.Hour * 1, Test: t, })` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Sprintf("chaos-automation-%s", name)` $DIR/integration-tests/chaos/automation_chaos_test.go: `. AddHelm(testCase.networkChart)` $DIR/integration-tests/chaos/automation_chaos_test.go: `. AddHelm(testCase.clChart)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Run()` $DIR/integration-tests/chaos/automation_chaos_test.go: `.WillUseRemoteRunner()` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 1, 2, ChaosGroupMinority)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 3, 5, ChaosGroupMajority)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 2, 5, ChaosGroupMajorityPlus)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.ConnectChainlinkNodes(testEnvironment)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.MustReplaceSimulatedNetworkUrlWithK8(l, network, *testEnvironment)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.GetChainClientWithConfigFunction(&config, network, actions_seth.OneEphemeralKeysLiveTestnetAutoFixFn)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Cleanup(func() { err := actions_seth.TeardownSuite(t, chainClient, testEnvironment, chainlinkNodes, nil, zapcore.PanicLevel, &config) require.NoError(t, err, "Error tearing down environment") })` $DIR/integration-tests/chaos/automation_chaos_test.go: `.TeardownSuite(t, chainClient, testEnvironment, chainlinkNodes, nil, zapcore.PanicLevel, &config)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.EstimateCostForChainlinkOperations(l, chainClient, network, 1000)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.FundChainlinkNodesFromRootAddress(l, chainClient, contracts.ChainlinkK8sClientToChainlinkNodeWithKeysAndAddress(chainlinkNodes), txCost)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.ChainlinkK8sClientToChainlinkNodeWithKeysAndAddress(chainlinkNodes)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.DeployLinkTokenContract(l, chainClient)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.DeployAutoOCRRegistryAndRegistrar( t, chainClient, rv, defaultOCRRegistryConfig, linkToken, )` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Transfer(registry.Address(), big.NewInt(0).Mul(big.NewInt(1e18), big.NewInt(int64(numberOfUpkeeps))))` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Address()` $DIR/integration-tests/chaos/automation_chaos_test.go: `.NewInt(0)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Mul(big.NewInt(1e18), big.NewInt(int64(numberOfUpkeeps)))` $DIR/integration-tests/chaos/automation_chaos_test.go: `.NewInt(1e18)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.NewInt(int64(numberOfUpkeeps))` $DIR/integration-tests/chaos/automation_chaos_test.go: `.CreateOCRKeeperJobs(t, chainlinkNodes, registry.Address(), network.ChainID, 0, rv)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Address()` $DIR/integration-tests/chaos/automation_chaos_test.go: `.BuildAutoOCR2ConfigVars(t, nodesWithoutBootstrap, defaultOCRRegistryConfig, registrar.Address(), 30*time.Second, registry.ChainModuleAddress(), registry.ReorgProtectionEnabled())` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Address()` $DIR/integration-tests/chaos/automation_chaos_test.go: `.ChainModuleAddress()` $DIR/integration-tests/chaos/automation_chaos_test.go: `.ReorgProtectionEnabled()` $DIR/integration-tests/chaos/automation_chaos_test.go: `.SetConfig(defaultOCRRegistryConfig, ocrConfig)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.SetConfigTypeSafe(ocrConfig)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.DeployConsumers(t, chainClient, registry, registrar, linkToken, numberOfUpkeeps, big.NewInt(defaultLinkFunds), defaultUpkeepGasLimit, false, false)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.NewInt(defaultLinkFunds)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.DeployConsumers(t, chainClient, registry, registrar, linkToken, numberOfUpkeeps, big.NewInt(defaultLinkFunds), defaultUpkeepGasLimit, true, false)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.NewInt(defaultLinkFunds)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Start()` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Info()` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Msg("Waiting for all upkeeps to be performed")` $DIR/integration-tests/chaos/automation_chaos_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 10 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := 5 l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep ID", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64()) } }, "5m", "1s")` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Get(t)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Info()` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Int64("Upkeeps Performed", counter.Int64())` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Int64()` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Int("Upkeep ID", i)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Msg("Number of upkeeps performed")` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Int64()` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64())` $DIR/integration-tests/chaos/automation_chaos_test.go: `.BeNumerically(">=", int64(expect))` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Int64()` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Succeed()` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Chaos.Run(testCase.chaosFunc(testEnvironment.Cfg.Namespace, testCase.chaosProps))` $DIR/integration-tests/chaos/automation_chaos_test.go: `.chaosFunc(testEnvironment.Cfg.Namespace, testCase.chaosProps)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 10 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := 10 l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep ID", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64()) } }, "3m", "1s")` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Get(t)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Info()` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Int64("Upkeeps Performed", counter.Int64())` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Int64()` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Int("Upkeep ID", i)` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Msg("Number of upkeeps performed")` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Int64()` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64())` $DIR/integration-tests/chaos/automation_chaos_test.go: `.BeNumerically(">=", int64(expect))` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Int64()` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/chaos/automation_chaos_test.go: `.Succeed()` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `ctf_config.MustConfigOverrideChainlinkVersion(testconfig.GetChainlinkImageConfig(), target)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `ctf_config.MightConfigOverridePyroscopeKey(testconfig.GetPyroscopeConfig(), target)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `t.Run(fmt.Sprintf("OCR2VRF_%s", testCaseName), func(t *testing.T) { t.Parallel() testNetwork := networks.MustGetSelectedNetworkConfig(testconfig.Network)[0] // Need a new copy of the network for each test testEnvironment := environment. New(&environment.Config{ NamespacePrefix: fmt.Sprintf( "chaos-ocr2vrf-%s", strings.ReplaceAll(strings.ToLower(testNetwork.Name), " ", "-"), ), Test: t, }). AddHelm(testCase.networkChart). AddHelm(testCase.clChart) err := testEnvironment.Run() require.NoError(t, err, "Error running test environment") if testEnvironment.WillUseRemoteRunner() { return } err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 1, 2, ChaosGroupMinority) require.NoError(t, err) err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 3, 5, ChaosGroupMajority) require.NoError(t, err) testNetwork = seth_utils.MustReplaceSimulatedNetworkUrlWithK8(l, testNetwork, *testEnvironment) chainClient, err := actions_seth.GetChainClientWithConfigFunction(testconfig, testNetwork, actions_seth.OneEphemeralKeysLiveTestnetCheckFn) require.NoError(t, err, "Error creating seth client") chainlinkNodes, err := client.ConnectChainlinkNodes(testEnvironment) require.NoError(t, err, "Error connecting to Chainlink nodes") nodeAddresses, err := actions.ChainlinkNodeAddresses(chainlinkNodes) require.NoError(t, err, "Retrieving on-chain wallet addresses for chainlink nodes shouldn't fail") t.Cleanup(func() { err := actions_seth.TeardownSuite(t, chainClient, testEnvironment, chainlinkNodes, nil, zapcore.PanicLevel, &testconfig) require.NoError(t, err, "Error tearing down environment") }) linkToken, err := contracts.DeployLinkTokenContract(l, chainClient) require.NoError(t, err, "Error deploying LINK token") mockETHLinkFeed, err := contracts.DeployMockETHLINKFeed(chainClient, ocr2vrf_constants.LinkEthFeedResponse) require.NoError(t, err, "Error deploying Mock ETH/LINK Feed") _, _, vrfBeaconContract, consumerContract, subID := ocr2vrf_actions.SetupOCR2VRFUniverse( t, linkToken, mockETHLinkFeed, chainClient, nodeAddresses, chainlinkNodes, testNetwork, ) //Request and Redeem Randomness to verify that process works fine requestID := ocr2vrf_actions.RequestAndRedeemRandomness( t, consumerContract, vrfBeaconContract, ocr2vrf_constants.NumberOfRandomWordsToRequest, subID, ocr2vrf_constants.ConfirmationDelay, ocr2vrf_constants.RandomnessRedeemTransmissionEventTimeout, ) for i := uint16(0); i < ocr2vrf_constants.NumberOfRandomWordsToRequest; i++ { randomness, err := consumerContract.GetRandomnessByRequestId(testcontext.Get(t), requestID, big.NewInt(int64(i))) require.NoError(t, err) l.Info().Interface("Random Number", randomness).Interface("Randomness Number Index", i).Msg("Randomness retrieved from Consumer contract") require.NotEqual(t, 0, randomness.Uint64(), "Randomness retrieved from Consumer contract give an answer other than 0") } id, err := testEnvironment.Chaos.Run(testCase.chaosFunc(testEnvironment.Cfg.Namespace, testCase.chaosProps)) require.NoError(t, err, "Error running Chaos Experiment") l.Info().Msg("Chaos Applied") err = testEnvironment.Chaos.WaitForAllRecovered(id, time.Minute) require.NoError(t, err, "Error waiting for Chaos Experiment to end") l.Info().Msg("Chaos Recovered") //Request and Redeem Randomness again to see that after Chaos Experiment whole process is still working requestID = ocr2vrf_actions.RequestAndRedeemRandomness( t, consumerContract, vrfBeaconContract, ocr2vrf_constants.NumberOfRandomWordsToRequest, subID, ocr2vrf_constants.ConfirmationDelay, ocr2vrf_constants.RandomnessRedeemTransmissionEventTimeout, ) for i := uint16(0); i < ocr2vrf_constants.NumberOfRandomWordsToRequest; i++ { randomness, err := consumerContract.GetRandomnessByRequestId(testcontext.Get(t), requestID, big.NewInt(int64(i))) require.NoError(t, err, "Error getting Randomness result from Consumer Contract") l.Info().Interface("Random Number", randomness).Interface("Randomness Number Index", i).Msg("Randomness retrieved from Consumer contract") require.NotEqual(t, 0, randomness.Uint64(), "Randomness retrieved from Consumer contract give an answer other than 0") } })` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 1, 2, ChaosGroupMinority)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 3, 5, ChaosGroupMajority)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `testNetwork = seth_utils.MustReplaceSimulatedNetworkUrlWithK8(l, testNetwork, *testEnvironment)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `t.Cleanup(func() { err := actions_seth.TeardownSuite(t, chainClient, testEnvironment, chainlinkNodes, nil, zapcore.PanicLevel, &testconfig) require.NoError(t, err, "Error tearing down environment") })` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `l.Info().Interface("Random Number", randomness).Interface("Randomness Number Index", i).Msg("Randomness retrieved from Consumer contract")` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `l.Info().Msg("Chaos Applied")` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `err = testEnvironment.Chaos.WaitForAllRecovered(id, time.Minute)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `l.Info().Msg("Chaos Recovered")` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `requestID = ocr2vrf_actions.RequestAndRedeemRandomness( t, consumerContract, vrfBeaconContract, ocr2vrf_constants.NumberOfRandomWordsToRequest, subID, ocr2vrf_constants.ConfirmationDelay, ocr2vrf_constants.RandomnessRedeemTransmissionEventTimeout, )` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `l.Info().Interface("Random Number", randomness).Interface("Randomness Number Index", i).Msg("Randomness retrieved from Consumer contract")` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.GetTestLogger(t)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.GetConfig("Chaos", tc.OCR2VRF)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.MustGetSelectedNetworkConfig(testconfig.Network)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.AddNetworkDetailedConfig( config.BaseOCR2Config, testconfig.Pyroscope, config.DefaultOCR2VRFNetworkDetailTomlConfig, loadedNetwork, )` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.MustConfigOverrideChainlinkVersion(testconfig.GetChainlinkImageConfig(), target)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.GetChainlinkImageConfig()` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.MightConfigOverridePyroscopeKey(testconfig.GetPyroscopeConfig(), target)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.GetPyroscopeConfig()` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.NewWithOverride(0, defaultOCR2VRFSettings, testconfig.ChainlinkImage, overrideFn)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.New(defaultOCR2VRFEthereumSettings)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.Ptr("1")` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.Run(fmt.Sprintf("OCR2VRF_%s", testCaseName), func(t *testing.T) { t.Parallel() testNetwork := networks.MustGetSelectedNetworkConfig(testconfig.Network)[0] // Need a new copy of the network for each test testEnvironment := environment. New(&environment.Config{ NamespacePrefix: fmt.Sprintf( "chaos-ocr2vrf-%s", strings.ReplaceAll(strings.ToLower(testNetwork.Name), " ", "-"), ), Test: t, }). AddHelm(testCase.networkChart). AddHelm(testCase.clChart) err := testEnvironment.Run() require.NoError(t, err, "Error running test environment") if testEnvironment.WillUseRemoteRunner() { return } err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 1, 2, ChaosGroupMinority) require.NoError(t, err) err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 3, 5, ChaosGroupMajority) require.NoError(t, err) testNetwork = seth_utils.MustReplaceSimulatedNetworkUrlWithK8(l, testNetwork, *testEnvironment) chainClient, err := actions_seth.GetChainClientWithConfigFunction(testconfig, testNetwork, actions_seth.OneEphemeralKeysLiveTestnetCheckFn) require.NoError(t, err, "Error creating seth client") chainlinkNodes, err := client.ConnectChainlinkNodes(testEnvironment) require.NoError(t, err, "Error connecting to Chainlink nodes") nodeAddresses, err := actions.ChainlinkNodeAddresses(chainlinkNodes) require.NoError(t, err, "Retrieving on-chain wallet addresses for chainlink nodes shouldn't fail") t.Cleanup(func() { err := actions_seth.TeardownSuite(t, chainClient, testEnvironment, chainlinkNodes, nil, zapcore.PanicLevel, &testconfig) require.NoError(t, err, "Error tearing down environment") }) linkToken, err := contracts.DeployLinkTokenContract(l, chainClient) require.NoError(t, err, "Error deploying LINK token") mockETHLinkFeed, err := contracts.DeployMockETHLINKFeed(chainClient, ocr2vrf_constants.LinkEthFeedResponse) require.NoError(t, err, "Error deploying Mock ETH/LINK Feed") _, _, vrfBeaconContract, consumerContract, subID := ocr2vrf_actions.SetupOCR2VRFUniverse( t, linkToken, mockETHLinkFeed, chainClient, nodeAddresses, chainlinkNodes, testNetwork, ) //Request and Redeem Randomness to verify that process works fine requestID := ocr2vrf_actions.RequestAndRedeemRandomness( t, consumerContract, vrfBeaconContract, ocr2vrf_constants.NumberOfRandomWordsToRequest, subID, ocr2vrf_constants.ConfirmationDelay, ocr2vrf_constants.RandomnessRedeemTransmissionEventTimeout, ) for i := uint16(0); i < ocr2vrf_constants.NumberOfRandomWordsToRequest; i++ { randomness, err := consumerContract.GetRandomnessByRequestId(testcontext.Get(t), requestID, big.NewInt(int64(i))) require.NoError(t, err) l.Info().Interface("Random Number", randomness).Interface("Randomness Number Index", i).Msg("Randomness retrieved from Consumer contract") require.NotEqual(t, 0, randomness.Uint64(), "Randomness retrieved from Consumer contract give an answer other than 0") } id, err := testEnvironment.Chaos.Run(testCase.chaosFunc(testEnvironment.Cfg.Namespace, testCase.chaosProps)) require.NoError(t, err, "Error running Chaos Experiment") l.Info().Msg("Chaos Applied") err = testEnvironment.Chaos.WaitForAllRecovered(id, time.Minute) require.NoError(t, err, "Error waiting for Chaos Experiment to end") l.Info().Msg("Chaos Recovered") //Request and Redeem Randomness again to see that after Chaos Experiment whole process is still working requestID = ocr2vrf_actions.RequestAndRedeemRandomness( t, consumerContract, vrfBeaconContract, ocr2vrf_constants.NumberOfRandomWordsToRequest, subID, ocr2vrf_constants.ConfirmationDelay, ocr2vrf_constants.RandomnessRedeemTransmissionEventTimeout, ) for i := uint16(0); i < ocr2vrf_constants.NumberOfRandomWordsToRequest; i++ { randomness, err := consumerContract.GetRandomnessByRequestId(testcontext.Get(t), requestID, big.NewInt(int64(i))) require.NoError(t, err, "Error getting Randomness result from Consumer Contract") l.Info().Interface("Random Number", randomness).Interface("Randomness Number Index", i).Msg("Randomness retrieved from Consumer contract") require.NotEqual(t, 0, randomness.Uint64(), "Randomness retrieved from Consumer contract give an answer other than 0") } })` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.Sprintf("OCR2VRF_%s", testCaseName)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.MustGetSelectedNetworkConfig(testconfig.Network)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `. New(&environment.Config{ NamespacePrefix: fmt.Sprintf( "chaos-ocr2vrf-%s", strings.ReplaceAll(strings.ToLower(testNetwork.Name), " ", "-"), ), Test: t, })` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.Sprintf( "chaos-ocr2vrf-%s", strings.ReplaceAll(strings.ToLower(testNetwork.Name), " ", "-"), )` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.ReplaceAll(strings.ToLower(testNetwork.Name), " ", "-")` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.ToLower(testNetwork.Name)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `. AddHelm(testCase.networkChart)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `. AddHelm(testCase.clChart)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.Run()` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.WillUseRemoteRunner()` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 1, 2, ChaosGroupMinority)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 3, 5, ChaosGroupMajority)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.MustReplaceSimulatedNetworkUrlWithK8(l, testNetwork, *testEnvironment)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.GetChainClientWithConfigFunction(testconfig, testNetwork, actions_seth.OneEphemeralKeysLiveTestnetCheckFn)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.ConnectChainlinkNodes(testEnvironment)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.ChainlinkNodeAddresses(chainlinkNodes)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.Cleanup(func() { err := actions_seth.TeardownSuite(t, chainClient, testEnvironment, chainlinkNodes, nil, zapcore.PanicLevel, &testconfig) require.NoError(t, err, "Error tearing down environment") })` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.TeardownSuite(t, chainClient, testEnvironment, chainlinkNodes, nil, zapcore.PanicLevel, &testconfig)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.DeployLinkTokenContract(l, chainClient)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.DeployMockETHLINKFeed(chainClient, ocr2vrf_constants.LinkEthFeedResponse)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.SetupOCR2VRFUniverse( t, linkToken, mockETHLinkFeed, chainClient, nodeAddresses, chainlinkNodes, testNetwork, )` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.RequestAndRedeemRandomness( t, consumerContract, vrfBeaconContract, ocr2vrf_constants.NumberOfRandomWordsToRequest, subID, ocr2vrf_constants.ConfirmationDelay, ocr2vrf_constants.RandomnessRedeemTransmissionEventTimeout, )` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.GetRandomnessByRequestId(testcontext.Get(t), requestID, big.NewInt(int64(i)))` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.Get(t)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.NewInt(int64(i))` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.Info()` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.Interface("Random Number", randomness)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.Interface("Randomness Number Index", i)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.Msg("Randomness retrieved from Consumer contract")` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.Chaos.Run(testCase.chaosFunc(testEnvironment.Cfg.Namespace, testCase.chaosProps))` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.chaosFunc(testEnvironment.Cfg.Namespace, testCase.chaosProps)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.Info()` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.Msg("Chaos Applied")` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.Chaos.WaitForAllRecovered(id, time.Minute)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.Info()` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.Msg("Chaos Recovered")` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.RequestAndRedeemRandomness( t, consumerContract, vrfBeaconContract, ocr2vrf_constants.NumberOfRandomWordsToRequest, subID, ocr2vrf_constants.ConfirmationDelay, ocr2vrf_constants.RandomnessRedeemTransmissionEventTimeout, )` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.GetRandomnessByRequestId(testcontext.Get(t), requestID, big.NewInt(int64(i)))` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.Get(t)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.NewInt(int64(i))` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.Info()` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.Interface("Random Number", randomness)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.Interface("Randomness Number Index", i)` $DIR/integration-tests/chaos/ocr2vrf_chaos_test.go: `.Msg("Randomness retrieved from Consumer contract")` $DIR/integration-tests/chaos/ocr_chaos_test.go: `ctf_config.MustConfigOverrideChainlinkVersion(config.GetChainlinkImageConfig(), target)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `ctf_config.MightConfigOverridePyroscopeKey(config.GetPyroscopeConfig(), target)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `t.Run(fmt.Sprintf("OCR_%s", name), func(t *testing.T) { t.Parallel() testEnvironment := environment.New(&environment.Config{ NamespacePrefix: fmt.Sprintf("chaos-ocr-%s", name), Test: t, }). AddHelm(mockservercfg.New(nil)). AddHelm(mockserver.New(nil)). AddHelm(testCase.networkChart). AddHelm(testCase.clChart) err := testEnvironment.Run() require.NoError(t, err) if testEnvironment.WillUseRemoteRunner() { return } err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 1, 2, ChaosGroupMinority) require.NoError(t, err) err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 3, 5, ChaosGroupMajority) require.NoError(t, err) err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 2, 5, ChaosGroupMajorityPlus) require.NoError(t, err) cfg := config.MustCopy().(tc.TestConfig) network := networks.MustGetSelectedNetworkConfig(cfg.GetNetworkConfig())[0] network = seth_utils.MustReplaceSimulatedNetworkUrlWithK8(l, network, *testEnvironment) seth, err := actions_seth.GetChainClient(&cfg, network) require.NoError(t, err, "Error creating seth client") chainlinkNodes, err := client.ConnectChainlinkNodes(testEnvironment) require.NoError(t, err, "Connecting to chainlink nodes shouldn't fail") bootstrapNode, workerNodes := chainlinkNodes[0], chainlinkNodes[1:] t.Cleanup(func() { err := actions_seth.TeardownRemoteSuite(t, seth, testEnvironment.Cfg.Namespace, chainlinkNodes, nil, &cfg) require.NoError(t, err, "Error tearing down environment") }) ms, err := ctfClient.ConnectMockServer(testEnvironment) require.NoError(t, err, "Creating mockserver clients shouldn't fail") linkContract, err := contracts.DeployLinkTokenContract(l, seth) require.NoError(t, err, "Error deploying link token contract") err = actions_seth.FundChainlinkNodesFromRootAddress(l, seth, contracts.ChainlinkK8sClientToChainlinkNodeWithKeysAndAddress(chainlinkNodes), big.NewFloat(10)) require.NoError(t, err) ocrInstances, err := actions_seth.DeployOCRv1Contracts(l, seth, 1, common.HexToAddress(linkContract.Address()), contracts.ChainlinkK8sClientToChainlinkNodeWithKeysAndAddress(workerNodes)) require.NoError(t, err) err = actions.CreateOCRJobs(ocrInstances, bootstrapNode, workerNodes, 5, ms, fmt.Sprint(seth.ChainID)) require.NoError(t, err) chaosApplied := false gom := gomega.NewGomegaWithT(t) gom.Eventually(func(g gomega.Gomega) { for _, ocr := range ocrInstances { err := ocr.RequestNewRound() require.NoError(t, err, "Error requesting new round") } round, err := ocrInstances[0].GetLatestRound(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred()) l.Info().Int64("RoundID", round.RoundId.Int64()).Msg("Latest OCR Round") if round.RoundId.Int64() == chaosStartRound && !chaosApplied { chaosApplied = true _, err = testEnvironment.Chaos.Run(testCase.chaosFunc(testEnvironment.Cfg.Namespace, testCase.chaosProps)) require.NoError(t, err) } g.Expect(round.RoundId.Int64()).Should(gomega.BeNumerically(">=", chaosEndRound)) }, "6m", "3s").Should(gomega.Succeed()) })` $DIR/integration-tests/chaos/ocr_chaos_test.go: `err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 1, 2, ChaosGroupMinority)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 3, 5, ChaosGroupMajority)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 2, 5, ChaosGroupMajorityPlus)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `network = seth_utils.MustReplaceSimulatedNetworkUrlWithK8(l, network, *testEnvironment)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `t.Cleanup(func() { err := actions_seth.TeardownRemoteSuite(t, seth, testEnvironment.Cfg.Namespace, chainlinkNodes, nil, &cfg) require.NoError(t, err, "Error tearing down environment") })` $DIR/integration-tests/chaos/ocr_chaos_test.go: `err = actions_seth.FundChainlinkNodesFromRootAddress(l, seth, contracts.ChainlinkK8sClientToChainlinkNodeWithKeysAndAddress(chainlinkNodes), big.NewFloat(10))` $DIR/integration-tests/chaos/ocr_chaos_test.go: `err = actions.CreateOCRJobs(ocrInstances, bootstrapNode, workerNodes, 5, ms, fmt.Sprint(seth.ChainID))` $DIR/integration-tests/chaos/ocr_chaos_test.go: `gom.Eventually(func(g gomega.Gomega) { for _, ocr := range ocrInstances { err := ocr.RequestNewRound() require.NoError(t, err, "Error requesting new round") } round, err := ocrInstances[0].GetLatestRound(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred()) l.Info().Int64("RoundID", round.RoundId.Int64()).Msg("Latest OCR Round") if round.RoundId.Int64() == chaosStartRound && !chaosApplied { chaosApplied = true _, err = testEnvironment.Chaos.Run(testCase.chaosFunc(testEnvironment.Cfg.Namespace, testCase.chaosProps)) require.NoError(t, err) } g.Expect(round.RoundId.Int64()).Should(gomega.BeNumerically(">=", chaosEndRound)) }, "6m", "3s").Should(gomega.Succeed())` $DIR/integration-tests/chaos/ocr_chaos_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred())` $DIR/integration-tests/chaos/ocr_chaos_test.go: `l.Info().Int64("RoundID", round.RoundId.Int64()).Msg("Latest OCR Round")` $DIR/integration-tests/chaos/ocr_chaos_test.go: `chaosApplied = true` $DIR/integration-tests/chaos/ocr_chaos_test.go: `_, err = testEnvironment.Chaos.Run(testCase.chaosFunc(testEnvironment.Cfg.Namespace, testCase.chaosProps))` $DIR/integration-tests/chaos/ocr_chaos_test.go: `g.Expect(round.RoundId.Int64()).Should(gomega.BeNumerically(">=", chaosEndRound))` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.GetTestLogger(t)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.GetConfig("Chaos", tc.OCR)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.MustConfigOverrideChainlinkVersion(config.GetChainlinkImageConfig(), target)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.GetChainlinkImageConfig()` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.MightConfigOverridePyroscopeKey(config.GetPyroscopeConfig(), target)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.GetPyroscopeConfig()` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.NewWithOverride(0, getDefaultOcrSettings(&config), config.ChainlinkImage, overrideFn)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.New(nil)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Ptr("1")` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Ptr("1")` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.New(nil)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Ptr("geth")` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Ptr("1")` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.New(nil)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Ptr("1")` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.New(nil)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Ptr("1")` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.New(nil)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Ptr("1")` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Ptr("chainlink-db")` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Run(fmt.Sprintf("OCR_%s", name), func(t *testing.T) { t.Parallel() testEnvironment := environment.New(&environment.Config{ NamespacePrefix: fmt.Sprintf("chaos-ocr-%s", name), Test: t, }). AddHelm(mockservercfg.New(nil)). AddHelm(mockserver.New(nil)). AddHelm(testCase.networkChart). AddHelm(testCase.clChart) err := testEnvironment.Run() require.NoError(t, err) if testEnvironment.WillUseRemoteRunner() { return } err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 1, 2, ChaosGroupMinority) require.NoError(t, err) err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 3, 5, ChaosGroupMajority) require.NoError(t, err) err = testEnvironment.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 2, 5, ChaosGroupMajorityPlus) require.NoError(t, err) cfg := config.MustCopy().(tc.TestConfig) network := networks.MustGetSelectedNetworkConfig(cfg.GetNetworkConfig())[0] network = seth_utils.MustReplaceSimulatedNetworkUrlWithK8(l, network, *testEnvironment) seth, err := actions_seth.GetChainClient(&cfg, network) require.NoError(t, err, "Error creating seth client") chainlinkNodes, err := client.ConnectChainlinkNodes(testEnvironment) require.NoError(t, err, "Connecting to chainlink nodes shouldn't fail") bootstrapNode, workerNodes := chainlinkNodes[0], chainlinkNodes[1:] t.Cleanup(func() { err := actions_seth.TeardownRemoteSuite(t, seth, testEnvironment.Cfg.Namespace, chainlinkNodes, nil, &cfg) require.NoError(t, err, "Error tearing down environment") }) ms, err := ctfClient.ConnectMockServer(testEnvironment) require.NoError(t, err, "Creating mockserver clients shouldn't fail") linkContract, err := contracts.DeployLinkTokenContract(l, seth) require.NoError(t, err, "Error deploying link token contract") err = actions_seth.FundChainlinkNodesFromRootAddress(l, seth, contracts.ChainlinkK8sClientToChainlinkNodeWithKeysAndAddress(chainlinkNodes), big.NewFloat(10)) require.NoError(t, err) ocrInstances, err := actions_seth.DeployOCRv1Contracts(l, seth, 1, common.HexToAddress(linkContract.Address()), contracts.ChainlinkK8sClientToChainlinkNodeWithKeysAndAddress(workerNodes)) require.NoError(t, err) err = actions.CreateOCRJobs(ocrInstances, bootstrapNode, workerNodes, 5, ms, fmt.Sprint(seth.ChainID)) require.NoError(t, err) chaosApplied := false gom := gomega.NewGomegaWithT(t) gom.Eventually(func(g gomega.Gomega) { for _, ocr := range ocrInstances { err := ocr.RequestNewRound() require.NoError(t, err, "Error requesting new round") } round, err := ocrInstances[0].GetLatestRound(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred()) l.Info().Int64("RoundID", round.RoundId.Int64()).Msg("Latest OCR Round") if round.RoundId.Int64() == chaosStartRound && !chaosApplied { chaosApplied = true _, err = testEnvironment.Chaos.Run(testCase.chaosFunc(testEnvironment.Cfg.Namespace, testCase.chaosProps)) require.NoError(t, err) } g.Expect(round.RoundId.Int64()).Should(gomega.BeNumerically(">=", chaosEndRound)) }, "6m", "3s").Should(gomega.Succeed()) })` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Sprintf("OCR_%s", name)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.New(&environment.Config{ NamespacePrefix: fmt.Sprintf("chaos-ocr-%s", name), Test: t, })` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Sprintf("chaos-ocr-%s", name)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `. AddHelm(mockservercfg.New(nil))` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.New(nil)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `. AddHelm(mockserver.New(nil))` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.New(nil)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `. AddHelm(testCase.networkChart)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `. AddHelm(testCase.clChart)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Run()` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.WillUseRemoteRunner()` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 1, 2, ChaosGroupMinority)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 3, 5, ChaosGroupMajority)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Client.LabelChaosGroup(testEnvironment.Cfg.Namespace, "instance=node-", 2, 5, ChaosGroupMajorityPlus)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.MustCopy()` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.MustGetSelectedNetworkConfig(cfg.GetNetworkConfig())` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.GetNetworkConfig()` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.MustReplaceSimulatedNetworkUrlWithK8(l, network, *testEnvironment)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.GetChainClient(&cfg, network)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.ConnectChainlinkNodes(testEnvironment)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Cleanup(func() { err := actions_seth.TeardownRemoteSuite(t, seth, testEnvironment.Cfg.Namespace, chainlinkNodes, nil, &cfg) require.NoError(t, err, "Error tearing down environment") })` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.TeardownRemoteSuite(t, seth, testEnvironment.Cfg.Namespace, chainlinkNodes, nil, &cfg)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.ConnectMockServer(testEnvironment)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.DeployLinkTokenContract(l, seth)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.FundChainlinkNodesFromRootAddress(l, seth, contracts.ChainlinkK8sClientToChainlinkNodeWithKeysAndAddress(chainlinkNodes), big.NewFloat(10))` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.ChainlinkK8sClientToChainlinkNodeWithKeysAndAddress(chainlinkNodes)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.NewFloat(10)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.DeployOCRv1Contracts(l, seth, 1, common.HexToAddress(linkContract.Address()), contracts.ChainlinkK8sClientToChainlinkNodeWithKeysAndAddress(workerNodes))` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.HexToAddress(linkContract.Address())` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Address()` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.ChainlinkK8sClientToChainlinkNodeWithKeysAndAddress(workerNodes)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.CreateOCRJobs(ocrInstances, bootstrapNode, workerNodes, 5, ms, fmt.Sprint(seth.ChainID))` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Sprint(seth.ChainID)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Eventually(func(g gomega.Gomega) { for _, ocr := range ocrInstances { err := ocr.RequestNewRound() require.NoError(t, err, "Error requesting new round") } round, err := ocrInstances[0].GetLatestRound(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred()) l.Info().Int64("RoundID", round.RoundId.Int64()).Msg("Latest OCR Round") if round.RoundId.Int64() == chaosStartRound && !chaosApplied { chaosApplied = true _, err = testEnvironment.Chaos.Run(testCase.chaosFunc(testEnvironment.Cfg.Namespace, testCase.chaosProps)) require.NoError(t, err) } g.Expect(round.RoundId.Int64()).Should(gomega.BeNumerically(">=", chaosEndRound)) }, "6m", "3s")` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.RequestNewRound()` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.GetLatestRound(testcontext.Get(t))` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Get(t)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Expect(err)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.ShouldNot(gomega.HaveOccurred())` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.HaveOccurred()` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Info()` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Int64("RoundID", round.RoundId.Int64())` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.RoundId.Int64()` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Msg("Latest OCR Round")` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.RoundId.Int64()` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Chaos.Run(testCase.chaosFunc(testEnvironment.Cfg.Namespace, testCase.chaosProps))` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.chaosFunc(testEnvironment.Cfg.Namespace, testCase.chaosProps)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Expect(round.RoundId.Int64())` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.RoundId.Int64()` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Should(gomega.BeNumerically(">=", chaosEndRound))` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.BeNumerically(">=", chaosEndRound)` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/chaos/ocr_chaos_test.go: `.Succeed()` $DIR/integration-tests/client/chainlink_models_test.go: `t.Run(tt.name, func(t *testing.T) { got, err := tt.spec.String() require.NoError(t, err) require.Equal(t, tt.exp, got) })` $DIR/integration-tests/client/chainlink_models_test.go: `.Run(tt.name, func(t *testing.T) { got, err := tt.spec.String() require.NoError(t, err) require.Equal(t, tt.exp, got) })` $DIR/integration-tests/client/chainlink_models_test.go: `.spec.String()` $DIR/integration-tests/experiments/gas_test.go: `_, err = actions_seth.SendFunds(l, seth, actions_seth.FundsToSendPayload{ ToAddress: seth.Addresses[0], Amount: big.NewInt(10_000_000), PrivateKey: seth.PrivateKeys[0], })` $DIR/integration-tests/experiments/gas_test.go: `_, err = contracts.DeployLinkTokenContract(l, seth)` $DIR/integration-tests/experiments/gas_test.go: `time.Sleep(2 * time.Second)` $DIR/integration-tests/experiments/gas_test.go: `.GetTestLogger(t)` $DIR/integration-tests/experiments/gas_test.go: `.GetConfig("Soak", tc.OCR)` $DIR/integration-tests/experiments/gas_test.go: `.MustGetSelectedNetworkConfig(config.GetNetworkConfig())` $DIR/integration-tests/experiments/gas_test.go: `.GetNetworkConfig()` $DIR/integration-tests/experiments/gas_test.go: `.GetChainClient(&config, network)` $DIR/integration-tests/experiments/gas_test.go: `.SendFunds(l, seth, actions_seth.FundsToSendPayload{ ToAddress: seth.Addresses[0], Amount: big.NewInt(10_000_000), PrivateKey: seth.PrivateKeys[0], })` $DIR/integration-tests/experiments/gas_test.go: `.NewInt(10_000_000)` $DIR/integration-tests/experiments/gas_test.go: `.DeployLinkTokenContract(l, seth)` $DIR/integration-tests/experiments/gas_test.go: `.Sleep(2 * time.Second)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Info().Interface("loadedTestConfig", loadedTestConfig).Msg("Loaded Test Config")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Info().Msg("Starting automation v2.1 log trigger load test")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Info(). Int("Number of Nodes", *loadedTestConfig.Automation.General.NumberOfNodes). Int("Duration", *loadedTestConfig.Automation.General.Duration). Int("Block Time", *loadedTestConfig.Automation.General.BlockTime). Str("Spec Type", *loadedTestConfig.Automation.General.SpecType). Str("Log Level", *loadedTestConfig.Automation.General.ChainlinkNodeLogLevel). Str("Image", image). Str("Tag", version). Msg("Test Config")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Info().Str("testConfig", testConfig).Msg("Test Config")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `testEnvironment. AddHelm(ethereum.New(ðereum.Props{ NetworkName: testNetwork.Name, Simulated: testNetwork.Simulated, WsURLs: testNetwork.URLs, Values: map[string]interface{}{ "resources": gethNodeSpec, "geth": map[string]interface{}{ "blocktime": *loadedTestConfig.Automation.General.BlockTime, "capacity": "20Gi", "startGaslimit": "20000000", "targetGasLimit": "30000000", }, }, }))` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `err = testEnvironment.Run()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `nodeSpec = recNodeSpec` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `dbSpec = recDbSpec` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `nodeSpec = map[string]interface{}{}` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `dbSpec = map[string]interface{}{"stateful": true}` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `loadedTestConfig.Pyroscope.Environment = &testEnvironment.Cfg.Namespace` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `testEnvironment.AddHelm(wiremock.New(nil))` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `secretsTOML = fmt.Sprintf( secretsTOML, "cred1", wiremockURL, wiremockURL, "username", "password", )` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `wiremockURL = testEnvironment.URLs[wiremock.LocalURLsKey][0]` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `err = setUpDataStreamsWireMock(wiremockURL)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `secretsTOML = fmt.Sprintf( secretsTOML, "cred1", *loadedTestConfig.Automation.DataStreams.URL, *loadedTestConfig.Automation.DataStreams.URL, *loadedTestConfig.Automation.DataStreams.Username, *loadedTestConfig.Automation.DataStreams.Password, )` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `secretsTOML = ""` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `nodeTOML = fmt.Sprintf("%s\n\n[Log]\nLevel = \"%s\"", baseTOML, *loadedTestConfig.Automation.General.ChainlinkNodeLogLevel)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `nodeTOML = fmt.Sprintf("%s\n\n[Log]\nLevel = \"info\"", baseTOML)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `nodeTOML = networks.AddNetworksConfig(nodeTOML, loadedTestConfig.Pyroscope, testNetwork)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `ctfconfig.MustConfigOverrideChainlinkVersion(loadedTestConfig.GetChainlinkImageConfig(), target)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `ctfconfig.MightConfigOverridePyroscopeKey(loadedTestConfig.GetPyroscopeConfig(), target)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `testEnvironment.AddHelm(cd)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `err = testEnvironment.Run()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `testNetwork = seth_utils.MustReplaceSimulatedNetworkUrlWithK8(l, testNetwork, *testEnvironment)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `a.RegistrySettings = contracts.KeeperRegistrySettings{ PaymentPremiumPPB: *conf.RegistrySettings.PaymentPremiumPPB, FlatFeeMicroLINK: *conf.RegistrySettings.FlatFeeMicroLINK, CheckGasLimit: *conf.RegistrySettings.CheckGasLimit, StalenessSeconds: conf.RegistrySettings.StalenessSeconds, GasCeilingMultiplier: *conf.RegistrySettings.GasCeilingMultiplier, MaxPerformGas: *conf.RegistrySettings.MaxPerformGas, MinUpkeepSpend: conf.RegistrySettings.MinUpkeepSpend, FallbackGasPrice: conf.RegistrySettings.FallbackGasPrice, FallbackLinkPrice: conf.RegistrySettings.FallbackLinkPrice, MaxCheckDataSize: *conf.RegistrySettings.MaxCheckDataSize, MaxPerformDataSize: *conf.RegistrySettings.MaxPerformDataSize, MaxRevertDataSize: *conf.RegistrySettings.MaxRevertDataSize, RegistryVersion: contractseth.RegistryVersion_2_1, }` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `a.RegistrarSettings = contracts.KeeperRegistrarSettings{ AutoApproveConfigType: uint8(2), AutoApproveMaxAllowed: math.MaxUint16, MinLinkJuels: big.NewInt(0), }` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `a.PluginConfig = ocr2keepers30config.OffchainConfig{ TargetProbability: *conf.PluginConfig.TargetProbability, TargetInRounds: *conf.PluginConfig.TargetInRounds, PerformLockoutWindow: *conf.PluginConfig.PerformLockoutWindow, GasLimitPerReport: *conf.PluginConfig.GasLimitPerReport, GasOverheadPerUpkeep: *conf.PluginConfig.GasOverheadPerUpkeep, MinConfirmations: *conf.PluginConfig.MinConfirmations, MaxUpkeepBatchSize: *conf.PluginConfig.MaxUpkeepBatchSize, LogProviderConfig: ocr2keepers30config.LogProviderConfig{ BlockRate: *conf.PluginConfig.LogProviderConfig.BlockRate, LogLimit: *conf.PluginConfig.LogProviderConfig.LogLimit, }, }` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `a.PublicConfig = ocr3.PublicConfig{ DeltaProgress: *conf.PublicConfig.DeltaProgress, DeltaResend: *conf.PublicConfig.DeltaResend, DeltaInitial: *conf.PublicConfig.DeltaInitial, DeltaRound: *conf.PublicConfig.DeltaRound, DeltaGrace: *conf.PublicConfig.DeltaGrace, DeltaCertifiedCommitRequest: *conf.PublicConfig.DeltaCertifiedCommitRequest, DeltaStage: *conf.PublicConfig.DeltaStage, RMax: *conf.PublicConfig.RMax, MaxDurationQuery: *conf.PublicConfig.MaxDurationQuery, MaxDurationObservation: *conf.PublicConfig.MaxDurationObservation, MaxDurationShouldAcceptAttestedReport: *conf.PublicConfig.MaxDurationShouldAcceptAttestedReport, MaxDurationShouldTransmitAcceptedReport: *conf.PublicConfig.MaxDurationShouldTransmitAcceptedReport, F: *conf.PublicConfig.F, }` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `a.SetMercuryCredentialName("cred1")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `a.SetUseLogBufferV1(true)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Info().Str("START_TIME", startTimeTestSetup.String()).Msg("Test setup started")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `a.SetupAutomationDeployment(t)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `err = actions_seth.FundChainlinkNodesFromRootAddress(l, a.ChainClient, contracts.ChainlinkK8sClientToChainlinkNodeWithKeysAndAddress(chainlinkNodes[1:]), big.NewFloat(*loadedTestConfig.Common.ChainlinkNodeFunding))` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `expectedTotalUpkeepCount += *u.NumberOfUpkeeps` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `consumerContracts = append(consumerContracts, deploymentData.ConsumerContracts...)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `triggerContracts = append(triggerContracts, deploymentData.TriggerContracts...)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `triggerAddresses = append(triggerAddresses, deploymentData.TriggerAddresses...)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `loadConfigs = append(loadConfigs, deploymentData.LoadConfigs...)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Debug(). Interface("logTriggerConfigStruct", logTriggerConfigStruct). Str("Encoded Log Trigger Config", hex.EncodeToString(encodedLogTriggerConfig)).Msg("Encoded Log Trigger Config")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Debug(). Interface("checkDataStruct", checkDataStruct). Str("Encoded Check Data Struct", hex.EncodeToString(encodedCheckDataStruct)).Msg("Encoded Check Data Struct")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Debug().Interface("Upkeep Config", upkeepConfig).Msg("Upkeep Config")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `upkeepConfigs = append(upkeepConfigs, upkeepConfig)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Info().Msg("Successfully registered all Automation Upkeeps")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Info().Interface("Upkeep IDs", upkeepIds).Msg("Upkeeps Registered")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Info().Str("STARTUP_WAIT_TIME", StartupWaitTime.String()).Msg("Waiting for plugin to start")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `time.Sleep(StartupWaitTime)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `numberOfEventsEmittedPerSec = numberOfEventsEmittedPerSec + int64(*loadConfigs[i].NumberOfEvents)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `configs = append(configs, c)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Info(). Str("END_TIME", endTimeTestSetup.String()). Str("Duration", testSetupDuration.String()). Msg("Test setup ended")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `p.Add(g, err)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Info().Str("START_TIME", startTimeTestEx.String()).Msg("Test execution started")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Info().Msg("Starting load generators")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `_, err = p.Run(true)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Info().Msg("Finished load generators")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Info().Str("STOP_WAIT_TIME", StopWaitTime.String()).Msg("Waiting for upkeeps to be performed")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `time.Sleep(StopWaitTime)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Info().Msg("Finished waiting 60s for upkeeps to be performed")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Info(). Str("END_TIME", endTimeTestEx.String()). Str("Duration", testExDuration.String()). Msg("Test execution ended")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Info().Str("Duration", testExDuration.String()).Msg("Test Execution Duration")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Info().Uint64("Starting Block", startBlock).Uint64("Ending Block", endBlock).Msg("Test Block Range")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Info().Str("START_TIME", startTimeTestReport.String()).Msg("Test reporting started")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `batchSize = endBlock - startBlock` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `err = fmt.Errorf("initial error")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `logsInBatch, err = a.ChainClient.Client.FilterLogs(ctx2, filterQuery)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `cancel()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `timeout = time.Duration(math.Min(float64(timeout)*2, float64(2*time.Minute)))` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Debug(). Interface("FilterQuery", filterQuery). Str("Contract Address", consumerContract.Address()). Str("Timeout", timeout.String()). Int("Number of Logs", len(logsInBatch)). Msg("Collected consumer contract logs")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `logs = append(logs, logsInBatch...)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `delayRecovery = append(delayRecovery, parsedLog.TimeToPerform.Int64())` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `delayFast = append(delayFast, parsedLog.TimeToPerform.Int64())` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `upkeepDelaysFast = append(upkeepDelaysFast, delayFast)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `upkeepDelaysRecovery = append(upkeepDelaysRecovery, delayRecovery)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `err = fmt.Errorf("initial error")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `logsInBatch, err = chainClient.Client.FilterLogs(ctx2, filterQuery)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `cancel()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `timeout = time.Duration(math.Min(float64(timeout)*2, float64(2*time.Minute)))` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Debug(). Interface("FilterQuery", filterQuery). Str("Contract Address", address.Hex()). Str("Timeout", timeout.String()). Int("Number of Logs", len(logsInBatch)). Msg("Collected trigger contract logs")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `logs = append(logs, logsInBatch...)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `numberOfEventsEmitted = numberOfEventsEmitted + int64(len(logs))` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Info().Int64("Number of Events Emitted", numberOfEventsEmitted).Msg("Number of Events Emitted")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Info(). Interface("Upkeep Delays Fast", upkeepDelaysFast). Interface("Upkeep Delays Recovered", upkeepDelaysRecovery). Msg("Upkeep Delays")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `allUpkeepDelays = append(allUpkeepDelays, upkeepDelay...)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `allUpkeepDelaysFast = append(allUpkeepDelaysFast, upkeepDelay...)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `allUpkeepDelays = append(allUpkeepDelays, upkeepDelay...)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `allUpkeepDelaysRecovery = append(allUpkeepDelaysRecovery, upkeepDelay...)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Info(). Float64("Average", avgF).Int64("Median", medianF). Int64("90th Percentile", ninetyPctF).Int64("99th Percentile", ninetyNinePctF). Int64("Max", maximumF).Msg("Upkeep Delays Fast Execution in seconds")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Info(). Float64("Average", avgR).Int64("Median", medianR). Int64("90th Percentile", ninetyPctR).Int64("99th Percentile", ninetyNinePctR). Int64("Max", maximumR).Msg("Upkeep Delays Recovery Execution in seconds")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Info(). Int("Total Perform Count", len(allUpkeepDelays)). Int("Perform Count Fast Execution", len(allUpkeepDelaysFast)). Int("Perform Count Recovery Execution", len(allUpkeepDelaysRecovery)). Int64("Total Events Emitted", numberOfEventsEmitted). Int64("Total Events Missed", eventsMissed). Float64("Percent Missed", percentMissed). Msg("Test completed")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Info(). Str("END_TIME", endTimeTestReport.String()). Str("Duration", testReDuration.String()). Msg("Test reporting ended")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `l.Info().Str("Test Report", testReport).Msg("Test Report prepared")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `testStatus = "Finished :white_check_mark:"` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `_, err = sendSlackNotification(testStatus, l, &loadedTestConfig, testEnvironment.Cfg.Namespace, strconv.Itoa(*loadedTestConfig.Automation.General.NumberOfNodes), strconv.FormatInt(startTimeTestSetup.UnixMilli(), 10), strconv.FormatInt(time.Now().UnixMilli(), 10), []slack.Block{extraBlockWithText("\bTest Report\b\n```" + testReport + "```")}, slack.MsgOptionTS(ts))` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `testEnvironment.Cfg.TTL += time.Hour * 48` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Context(t)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.GetTestLogger(t)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.GetConfig("Load", tc.Automation)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Info()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Interface("loadedTestConfig", loadedTestConfig)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Msg("Loaded Test Config")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Info()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Msg("Starting automation v2.1 log trigger load test")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Info()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Int("Number of Nodes", *loadedTestConfig.Automation.General.NumberOfNodes)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Int("Duration", *loadedTestConfig.Automation.General.Duration)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Int("Block Time", *loadedTestConfig.Automation.General.BlockTime)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Str("Spec Type", *loadedTestConfig.Automation.General.SpecType)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Str("Log Level", *loadedTestConfig.Automation.General.ChainlinkNodeLogLevel)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Str("Image", image)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Str("Tag", version)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Msg("Test Config")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Marshal(loadedTestConfig.Automation.Load)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Sprintf(testConfigFormat, *loadedTestConfig.Automation.General.NumberOfNodes, *loadedTestConfig.Automation.General.Duration, *loadedTestConfig.Automation.General.BlockTime, *loadedTestConfig.Automation.General.SpecType, *loadedTestConfig.Automation.General.ChainlinkNodeLogLevel, image, version, string(prettyLoadConfig))` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Info()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Str("testConfig", testConfig)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Msg("Test Config")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.MustGetSelectedNetworkConfig(loadedTestConfig.Network)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Duration(*loadedTestConfig.Automation.General.Duration)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.NewInt(0)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Mul(big.NewInt(1e18), big.NewInt(int64(10000)))` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.NewInt(1e18)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.NewInt(int64(10000))` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.New(&environment.Config{ TTL: loadDuration.Round(time.Hour) + time.Hour, NamespacePrefix: fmt.Sprintf( "automation-%s-%s", testType, strings.ReplaceAll(strings.ToLower(testNetwork.Name), " ", "-"), ), Test: t, PreventPodEviction: true, })` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Round(time.Hour)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Sprintf( "automation-%s-%s", testType, strings.ReplaceAll(strings.ToLower(testNetwork.Name), " ", "-"), )` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.ReplaceAll(strings.ToLower(testNetwork.Name), " ", "-")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.ToLower(testNetwork.Name)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. AddHelm(ethereum.New(ðereum.Props{ NetworkName: testNetwork.Name, Simulated: testNetwork.Simulated, WsURLs: testNetwork.URLs, Values: map[string]interface{}{ "resources": gethNodeSpec, "geth": map[string]interface{}{ "blocktime": *loadedTestConfig.Automation.General.BlockTime, "capacity": "20Gi", "startGaslimit": "20000000", "targetGasLimit": "30000000", }, }, }))` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.New(ðereum.Props{ NetworkName: testNetwork.Name, Simulated: testNetwork.Simulated, WsURLs: testNetwork.URLs, Values: map[string]interface{}{ "resources": gethNodeSpec, "geth": map[string]interface{}{ "blocktime": *loadedTestConfig.Automation.General.BlockTime, "capacity": "20Gi", "startGaslimit": "20000000", "targetGasLimit": "30000000", }, }, })` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Run()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.WillUseRemoteRunner()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.AddHelm(wiremock.New(nil))` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.New(nil)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Run()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Sprintf( secretsTOML, "cred1", wiremockURL, wiremockURL, "username", "password", )` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Sprintf( secretsTOML, "cred1", *loadedTestConfig.Automation.DataStreams.URL, *loadedTestConfig.Automation.DataStreams.URL, *loadedTestConfig.Automation.DataStreams.Username, *loadedTestConfig.Automation.DataStreams.Password, )` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Sprintf("%s\n\n[Log]\nLevel = \"%s\"", baseTOML, *loadedTestConfig.Automation.General.ChainlinkNodeLogLevel)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Sprintf("%s\n\n[Log]\nLevel = \"info\"", baseTOML)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.AddNetworksConfig(nodeTOML, loadedTestConfig.Pyroscope, testNetwork)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.MustConfigOverrideChainlinkVersion(loadedTestConfig.GetChainlinkImageConfig(), target)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.GetChainlinkImageConfig()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.MightConfigOverridePyroscopeKey(loadedTestConfig.GetPyroscopeConfig(), target)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.GetPyroscopeConfig()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.NewWithOverride(i, map[string]any{ "toml": nodeTOML, "chainlink": nodeSpec, "db": dbSpec, "prometheus": *loadedTestConfig.Automation.General.UsePrometheus, "secretsToml": secretsTOML, }, loadedTestConfig.ChainlinkImage, overrideFn)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.AddHelm(cd)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Run()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.MustReplaceSimulatedNetworkUrlWithK8(l, testNetwork, *testEnvironment)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.GetChainClientWithConfigFunction(loadedTestConfig, testNetwork, actions_seth.OneEphemeralKeysLiveTestnetCheckFn)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.ConnectChainlinkNodes(testEnvironment)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.DeployMultiCallContract(chainClient)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.NewAutomationTestK8s(l, chainClient, chainlinkNodes)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.NewInt(0)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.SetMercuryCredentialName("cred1")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.SetUseLogBufferV1(true)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Now()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Info()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Str("START_TIME", startTimeTestSetup.String())` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.String()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Msg("Test setup started")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.SetupAutomationDeployment(t)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.FundChainlinkNodesFromRootAddress(l, a.ChainClient, contracts.ChainlinkK8sClientToChainlinkNodeWithKeysAndAddress(chainlinkNodes[1:]), big.NewFloat(*loadedTestConfig.Common.ChainlinkNodeFunding))` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.ChainlinkK8sClientToChainlinkNodeWithKeysAndAddress(chainlinkNodes[1:])` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.NewFloat(*loadedTestConfig.Common.ChainlinkNodeFunding)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.AutomationCompatibleUtilsMetaData.GetAbi()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.LogEmitterMetaData.GetAbi()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.SimpleLogUpkeepCounterMetaData.GetAbi()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Inputs.Pack(&logTriggerConfigStruct)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Debug()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Interface("logTriggerConfigStruct", logTriggerConfigStruct)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Str("Encoded Log Trigger Config", hex.EncodeToString(encodedLogTriggerConfig))` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.EncodeToString(encodedLogTriggerConfig)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Msg("Encoded Log Trigger Config")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Inputs.Pack(&checkDataStruct)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Debug()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Interface("checkDataStruct", checkDataStruct)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Str("Encoded Check Data Struct", hex.EncodeToString(encodedCheckDataStruct))` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.EncodeToString(encodedCheckDataStruct)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Msg("Encoded Check Data Struct")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Sprintf("LogTriggerUpkeep-%d", i)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.HexToAddress(consumerContract.Address())` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Address()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Debug()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Interface("Upkeep Config", upkeepConfig)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Msg("Upkeep Config")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.RegisterUpkeeps(upkeepConfigs, maxDeploymentConcurrency)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.ConfirmUpkeepsRegistered(registrationTxHashes, maxDeploymentConcurrency)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Info()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Msg("Successfully registered all Automation Upkeeps")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Info()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Interface("Upkeep IDs", upkeepIds)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Msg("Upkeeps Registered")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Info()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Str("STARTUP_WAIT_TIME", StartupWaitTime.String())` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.String()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Msg("Waiting for plugin to start")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Sleep(StartupWaitTime)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.ChainClient.Client.BlockNumber(ctx)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.NewProfile()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Address()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.String()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Now()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Sub(startTimeTestSetup)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Info()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Str("END_TIME", endTimeTestSetup.String())` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.String()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Str("Duration", testSetupDuration.String())` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.String()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Msg("Test setup ended")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Itoa(*loadedTestConfig.Automation.General.NumberOfNodes)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.FormatInt(startTimeTestSetup.UnixMilli(), 10)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.UnixMilli()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.MsgOptionBlocks()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "log_trigger_gen", CallTimeout: time.Minute * 3, Schedule: wasp.Plain( 1, loadDuration, ), Gun: NewLogTriggerUser( l, configs, a.ChainClient, multicallAddress.Hex(), ), CallResultBufLen: 1000, })` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Plain( 1, loadDuration, )` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Hex()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Add(g, err)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Now()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Info()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Str("START_TIME", startTimeTestEx.String())` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.String()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Msg("Test execution started")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Info()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Msg("Starting load generators")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Run(true)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Info()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Msg("Finished load generators")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Info()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Str("STOP_WAIT_TIME", StopWaitTime.String())` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.String()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Msg("Waiting for upkeeps to be performed")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Sleep(StopWaitTime)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Info()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Msg("Finished waiting 60s for upkeeps to be performed")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Now()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Sub(startTimeTestEx)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Info()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Str("END_TIME", endTimeTestEx.String())` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.String()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Str("Duration", testExDuration.String())` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.String()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Msg("Test execution ended")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Info()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Str("Duration", testExDuration.String())` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.String()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Msg("Test Execution Duration")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Client.BlockNumber(ctx)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Info()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Uint64("Starting Block", startBlock)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Uint64("Ending Block", endBlock)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Msg("Test Block Range")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Now()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Info()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Str("START_TIME", startTimeTestReport.String())` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.String()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Msg("Test reporting started")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Errors()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.HexToAddress(consumerContract.Address())` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Address()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.NewInt(0)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.SetUint64(fromBlock)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.NewInt(0)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.SetUint64(fromBlock + batchSize)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.WithTimeout(ctx, timeout)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.ChainClient.Client.FilterLogs(ctx2, filterQuery)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Duration(math.Min(float64(timeout)*2, float64(2*time.Minute)))` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Min(float64(timeout)*2, float64(2*time.Minute))` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Debug()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Interface("FilterQuery", filterQuery)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Str("Contract Address", consumerContract.Address())` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Address()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Str("Timeout", timeout.String())` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.String()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Int("Number of Logs", len(logsInBatch))` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Msg("Collected consumer contract logs")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.EventByID(log.Topics[0])` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.NewSimpleLogUpkeepCounter( address, a.ChainClient.Client, )` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.ParsePerformingUpkeep(log)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.TimeToPerform.Int64()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.TimeToPerform.Int64()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Address()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.NewInt(0)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.SetUint64(fromBlock)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.NewInt(0)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.SetUint64(fromBlock + batchSize)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.WithTimeout(ctx, timeout)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Client.FilterLogs(ctx2, filterQuery)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Duration(math.Min(float64(timeout)*2, float64(2*time.Minute)))` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Min(float64(timeout)*2, float64(2*time.Minute))` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Debug()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Interface("FilterQuery", filterQuery)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Str("Contract Address", address.Hex())` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Hex()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Str("Timeout", timeout.String())` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.String()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Int("Number of Logs", len(logsInBatch))` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Msg("Collected trigger contract logs")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Info()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Int64("Number of Events Emitted", numberOfEventsEmitted)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Msg("Number of Events Emitted")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Info()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Interface("Upkeep Delays Fast", upkeepDelaysFast)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Interface("Upkeep Delays Recovered", upkeepDelaysRecovery)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Msg("Upkeep Delays")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.IntListStats(allUpkeepDelaysFast)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.IntListStats(allUpkeepDelaysRecovery)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Info()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Float64("Average", avgF)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Int64("Median", medianF)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Int64("90th Percentile", ninetyPctF)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Int64("99th Percentile", ninetyNinePctF)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Int64("Max", maximumF)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Msg("Upkeep Delays Fast Execution in seconds")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Info()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Float64("Average", avgR)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Int64("Median", medianR)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Int64("90th Percentile", ninetyPctR)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Int64("99th Percentile", ninetyNinePctR)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Int64("Max", maximumR)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Msg("Upkeep Delays Recovery Execution in seconds")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Info()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Int("Total Perform Count", len(allUpkeepDelays))` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Int("Perform Count Fast Execution", len(allUpkeepDelaysFast))` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Int("Perform Count Recovery Execution", len(allUpkeepDelaysRecovery))` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Int64("Total Events Emitted", numberOfEventsEmitted)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Int64("Total Events Missed", eventsMissed)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Float64("Percent Missed", percentMissed)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Msg("Test completed")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Now()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Sub(startTimeTestReport)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Info()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Str("END_TIME", endTimeTestReport.String())` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.String()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Str("Duration", testReDuration.String())` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.String()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `. Msg("Test reporting ended")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Seconds()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Sprintf(testReportFormat, avgF, medianF, ninetyPctF, ninetyNinePctF, maximumF, avgR, medianR, ninetyPctR, ninetyNinePctR, maximumR, len(allUpkeepDelays), len(allUpkeepDelaysFast), len(allUpkeepDelaysRecovery), numberOfExpectedEvents, numberOfEventsEmitted, eventsMissed, percentMissed, testExDuration.String())` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.String()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Info()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Str("Test Report", testReport)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Msg("Test Report prepared")` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Failed()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Itoa(*loadedTestConfig.Automation.General.NumberOfNodes)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.FormatInt(startTimeTestSetup.UnixMilli(), 10)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.UnixMilli()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.FormatInt(time.Now().UnixMilli(), 10)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Now()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.UnixMilli()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.MsgOptionTS(ts)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.TeardownRemoteSuite(t, chainClient, testEnvironment.Cfg.Namespace, chainlinkNodes, nil, &loadedTestConfig)` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Run()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Cfg.IsSimulatedNetwork()` $DIR/integration-tests/load/automationv2_1/automationv2_1_test.go: `.Client.RemoveNamespace(testEnvironment.Cfg.Namespace)` $DIR/integration-tests/load/functions/functions_test.go: `MonitorLoadStats(t, ft, labels, &generalConfig)` $DIR/integration-tests/load/functions/functions_test.go: `t.Run("mumbai functions soak test http", func(t *testing.T) { config, err := tc.GetConfig("Soak", tc.Functions) require.NoError(t, err, "failed to get config") cfg := config.Functions cfgl := config.Logging.Loki _, err = wasp.NewProfile(). Add(wasp.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_soak_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeHTTPPayload, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadHTTP, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), })). Run(true) require.NoError(t, err) })` $DIR/integration-tests/load/functions/functions_test.go: `_, err = wasp.NewProfile(). Add(wasp.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_soak_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeHTTPPayload, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadHTTP, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), })). Run(true)` $DIR/integration-tests/load/functions/functions_test.go: `t.Run("mumbai functions stress test http", func(t *testing.T) { config, err := tc.GetConfig("Stress", tc.Functions) require.NoError(t, err, "failed to get config") cfg := config.Functions cfgl := config.Logging.Loki _, err = wasp.NewProfile(). Add(wasp.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_stress_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeHTTPPayload, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadHTTP, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), })). Run(true) require.NoError(t, err) })` $DIR/integration-tests/load/functions/functions_test.go: `_, err = wasp.NewProfile(). Add(wasp.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_stress_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeHTTPPayload, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadHTTP, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), })). Run(true)` $DIR/integration-tests/load/functions/functions_test.go: `t.Run("mumbai functions soak test only secrets", func(t *testing.T) { config, err := tc.GetConfig("SecretsSoak", tc.Functions) require.NoError(t, err, "failed to get config") cfg := config.Functions cfgl := config.Logging.Loki _, err = wasp.NewProfile(). Add(wasp.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_soak_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeSecretsOnlyPayload, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadWithSecrets, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), })). Run(true) require.NoError(t, err) })` $DIR/integration-tests/load/functions/functions_test.go: `_, err = wasp.NewProfile(). Add(wasp.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_soak_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeSecretsOnlyPayload, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadWithSecrets, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), })). Run(true)` $DIR/integration-tests/load/functions/functions_test.go: `t.Run("mumbai functions stress test only secrets", func(t *testing.T) { config, err := tc.GetConfig("SecretsStress", tc.Functions) require.NoError(t, err, "failed to get config") cfg := config.Functions cfgl := config.Logging.Loki _, err = wasp.NewProfile(). Add(wasp.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_stress_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeSecretsOnlyPayload, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadWithSecrets, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), })). Run(true) require.NoError(t, err) })` $DIR/integration-tests/load/functions/functions_test.go: `_, err = wasp.NewProfile(). Add(wasp.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_stress_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeSecretsOnlyPayload, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadWithSecrets, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), })). Run(true)` $DIR/integration-tests/load/functions/functions_test.go: `t.Run("mumbai functions soak test real", func(t *testing.T) { config, err := tc.GetConfig("RealSoak", tc.Functions) require.NoError(t, err, "failed to get config") cfg := config.Functions cfgl := config.Logging.Loki _, err = wasp.NewProfile(). Add(wasp.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_soak_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeReal, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadReal, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{"1", "2", "3", "4"}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), })). Run(true) require.NoError(t, err) })` $DIR/integration-tests/load/functions/functions_test.go: `_, err = wasp.NewProfile(). Add(wasp.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_soak_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeReal, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadReal, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{"1", "2", "3", "4"}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), })). Run(true)` $DIR/integration-tests/load/functions/functions_test.go: `_, err = wasp.NewProfile(). Add(wasp.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_stress_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeReal, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadReal, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{"1", "2", "3", "4"}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), })). Run(true)` $DIR/integration-tests/load/functions/functions_test.go: `.GetConfig(tc.NoKey, tc.Functions)` $DIR/integration-tests/load/functions/functions_test.go: `.Run("mumbai functions soak test http", func(t *testing.T) { config, err := tc.GetConfig("Soak", tc.Functions) require.NoError(t, err, "failed to get config") cfg := config.Functions cfgl := config.Logging.Loki _, err = wasp.NewProfile(). Add(wasp.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_soak_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeHTTPPayload, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadHTTP, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), })). Run(true) require.NoError(t, err) })` $DIR/integration-tests/load/functions/functions_test.go: `.GetConfig("Soak", tc.Functions)` $DIR/integration-tests/load/functions/functions_test.go: `.NewProfile()` $DIR/integration-tests/load/functions/functions_test.go: `. Add(wasp.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_soak_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeHTTPPayload, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadHTTP, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), }))` $DIR/integration-tests/load/functions/functions_test.go: `.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_soak_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeHTTPPayload, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadHTTP, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), })` $DIR/integration-tests/load/functions/functions_test.go: `.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, )` $DIR/integration-tests/load/functions/functions_test.go: `.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken)` $DIR/integration-tests/load/functions/functions_test.go: `. Run(true)` $DIR/integration-tests/load/functions/functions_test.go: `.Run("mumbai functions stress test http", func(t *testing.T) { config, err := tc.GetConfig("Stress", tc.Functions) require.NoError(t, err, "failed to get config") cfg := config.Functions cfgl := config.Logging.Loki _, err = wasp.NewProfile(). Add(wasp.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_stress_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeHTTPPayload, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadHTTP, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), })). Run(true) require.NoError(t, err) })` $DIR/integration-tests/load/functions/functions_test.go: `.GetConfig("Stress", tc.Functions)` $DIR/integration-tests/load/functions/functions_test.go: `.NewProfile()` $DIR/integration-tests/load/functions/functions_test.go: `. Add(wasp.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_stress_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeHTTPPayload, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadHTTP, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), }))` $DIR/integration-tests/load/functions/functions_test.go: `.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_stress_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeHTTPPayload, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadHTTP, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), })` $DIR/integration-tests/load/functions/functions_test.go: `.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, )` $DIR/integration-tests/load/functions/functions_test.go: `.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken)` $DIR/integration-tests/load/functions/functions_test.go: `. Run(true)` $DIR/integration-tests/load/functions/functions_test.go: `.Run("mumbai functions soak test only secrets", func(t *testing.T) { config, err := tc.GetConfig("SecretsSoak", tc.Functions) require.NoError(t, err, "failed to get config") cfg := config.Functions cfgl := config.Logging.Loki _, err = wasp.NewProfile(). Add(wasp.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_soak_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeSecretsOnlyPayload, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadWithSecrets, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), })). Run(true) require.NoError(t, err) })` $DIR/integration-tests/load/functions/functions_test.go: `.GetConfig("SecretsSoak", tc.Functions)` $DIR/integration-tests/load/functions/functions_test.go: `.NewProfile()` $DIR/integration-tests/load/functions/functions_test.go: `. Add(wasp.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_soak_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeSecretsOnlyPayload, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadWithSecrets, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), }))` $DIR/integration-tests/load/functions/functions_test.go: `.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_soak_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeSecretsOnlyPayload, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadWithSecrets, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), })` $DIR/integration-tests/load/functions/functions_test.go: `.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, )` $DIR/integration-tests/load/functions/functions_test.go: `.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken)` $DIR/integration-tests/load/functions/functions_test.go: `. Run(true)` $DIR/integration-tests/load/functions/functions_test.go: `.Run("mumbai functions stress test only secrets", func(t *testing.T) { config, err := tc.GetConfig("SecretsStress", tc.Functions) require.NoError(t, err, "failed to get config") cfg := config.Functions cfgl := config.Logging.Loki _, err = wasp.NewProfile(). Add(wasp.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_stress_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeSecretsOnlyPayload, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadWithSecrets, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), })). Run(true) require.NoError(t, err) })` $DIR/integration-tests/load/functions/functions_test.go: `.GetConfig("SecretsStress", tc.Functions)` $DIR/integration-tests/load/functions/functions_test.go: `.NewProfile()` $DIR/integration-tests/load/functions/functions_test.go: `. Add(wasp.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_stress_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeSecretsOnlyPayload, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadWithSecrets, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), }))` $DIR/integration-tests/load/functions/functions_test.go: `.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_stress_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeSecretsOnlyPayload, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadWithSecrets, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), })` $DIR/integration-tests/load/functions/functions_test.go: `.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, )` $DIR/integration-tests/load/functions/functions_test.go: `.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken)` $DIR/integration-tests/load/functions/functions_test.go: `. Run(true)` $DIR/integration-tests/load/functions/functions_test.go: `.Run("mumbai functions soak test real", func(t *testing.T) { config, err := tc.GetConfig("RealSoak", tc.Functions) require.NoError(t, err, "failed to get config") cfg := config.Functions cfgl := config.Logging.Loki _, err = wasp.NewProfile(). Add(wasp.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_soak_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeReal, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadReal, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{"1", "2", "3", "4"}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), })). Run(true) require.NoError(t, err) })` $DIR/integration-tests/load/functions/functions_test.go: `.GetConfig("RealSoak", tc.Functions)` $DIR/integration-tests/load/functions/functions_test.go: `.NewProfile()` $DIR/integration-tests/load/functions/functions_test.go: `. Add(wasp.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_soak_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeReal, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadReal, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{"1", "2", "3", "4"}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), }))` $DIR/integration-tests/load/functions/functions_test.go: `.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_soak_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeReal, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadReal, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{"1", "2", "3", "4"}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), })` $DIR/integration-tests/load/functions/functions_test.go: `.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, )` $DIR/integration-tests/load/functions/functions_test.go: `.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken)` $DIR/integration-tests/load/functions/functions_test.go: `. Run(true)` $DIR/integration-tests/load/functions/functions_test.go: `.GetConfig("RealStress", tc.Functions)` $DIR/integration-tests/load/functions/functions_test.go: `.NewProfile()` $DIR/integration-tests/load/functions/functions_test.go: `. Add(wasp.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_stress_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeReal, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadReal, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{"1", "2", "3", "4"}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), }))` $DIR/integration-tests/load/functions/functions_test.go: `.NewGenerator(&wasp.Config{ T: t, LoadType: wasp.RPS, GenName: "functions_stress_gen", RateLimitUnitDuration: 5 * time.Second, CallTimeout: 3 * time.Minute, Schedule: wasp.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, ), Gun: NewSingleFunctionCallGun( ft, ModeReal, *cfg.Performance.RequestsPerCall, *cfg.Common.FunctionsCallPayloadReal, *cfg.Common.SecretsSlotID, *cfg.Common.SecretsVersionID, []string{"1", "2", "3", "4"}, *cfg.Common.SubscriptionID, StringToByte32(*cfg.Common.DONID), ), Labels: labels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), })` $DIR/integration-tests/load/functions/functions_test.go: `.Plain( *cfg.Performance.RPS, cfg.Performance.Duration.Duration, )` $DIR/integration-tests/load/functions/functions_test.go: `.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken)` $DIR/integration-tests/load/functions/functions_test.go: `. Run(true)` $DIR/integration-tests/load/functions/gateway_test.go: `t.Run("gateway secrets list soak test", func(t *testing.T) { secretsListCfg.T = t _, err := wasp.NewProfile(). Add(wasp.NewGenerator(secretsListCfg)). Run(true) require.NoError(t, err) })` $DIR/integration-tests/load/functions/gateway_test.go: `secretsListCfg.T = t` $DIR/integration-tests/load/functions/gateway_test.go: `secretsListCfg.T = t` $DIR/integration-tests/load/functions/gateway_test.go: `.GetConfig("GatewayList", tc.Functions)` $DIR/integration-tests/load/functions/gateway_test.go: `.Plain( *listConfig.Functions.Performance.RPS, listConfig.Functions.Performance.Duration.Duration, )` $DIR/integration-tests/load/functions/gateway_test.go: `.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken)` $DIR/integration-tests/load/functions/gateway_test.go: `.GetConfig("GatewaySet", tc.Functions)` $DIR/integration-tests/load/functions/gateway_test.go: `.Plain( *setConfig.Functions.Performance.RPS, setConfig.Functions.Performance.Duration.Duration, )` $DIR/integration-tests/load/functions/gateway_test.go: `.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken)` $DIR/integration-tests/load/functions/gateway_test.go: `.Run("gateway secrets list soak test", func(t *testing.T) { secretsListCfg.T = t _, err := wasp.NewProfile(). Add(wasp.NewGenerator(secretsListCfg)). Run(true) require.NoError(t, err) })` $DIR/integration-tests/load/functions/gateway_test.go: `.NewProfile()` $DIR/integration-tests/load/functions/gateway_test.go: `. Add(wasp.NewGenerator(secretsListCfg))` $DIR/integration-tests/load/functions/gateway_test.go: `.NewGenerator(secretsListCfg)` $DIR/integration-tests/load/functions/gateway_test.go: `. Run(true)` $DIR/integration-tests/load/functions/gateway_test.go: `.NewProfile()` $DIR/integration-tests/load/functions/gateway_test.go: `. Add(wasp.NewGenerator(secretsSetCfg))` $DIR/integration-tests/load/functions/gateway_test.go: `.NewGenerator(secretsSetCfg)` $DIR/integration-tests/load/functions/gateway_test.go: `. Run(true)` $DIR/integration-tests/load/ocr/ocr_test.go: `SimulateEAActivity(l, cfg.Load.EAChangeInterval.Duration, ocrInstances, workerNodes, msClient)` $DIR/integration-tests/load/ocr/ocr_test.go: `p.Add(wasp.NewGenerator(&wasp.Config{ T: t, GenName: "ocr", LoadType: wasp.RPS, CallTimeout: cfg.Load.VerificationTimeout.Duration, RateLimitUnitDuration: cfg.Load.RateLimitUnitDuration.Duration, Schedule: wasp.Plain(*cfg.Load.Rate, cfg.Load.TestDuration.Duration), Gun: NewGun(l, seth, ocrInstances), Labels: CommonTestLabels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), }))` $DIR/integration-tests/load/ocr/ocr_test.go: `_, err = p.Run(true)` $DIR/integration-tests/load/ocr/ocr_test.go: `p.Add(wasp.NewGenerator(&wasp.Config{ T: t, GenName: "ocr", LoadType: wasp.VU, CallTimeout: cfg.Volume.VerificationTimeout.Duration, Schedule: wasp.Plain(*cfg.Volume.Rate, cfg.Volume.TestDuration.Duration), VU: NewVU(l, seth, *cfg.Volume.VURequestsPerUnit, cfg.Volume.RateLimitUnitDuration.Duration, lta, bootstrapNode, workerNodes, msClient), Labels: CommonTestLabels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), }))` $DIR/integration-tests/load/ocr/ocr_test.go: `_, err = p.Run(true)` $DIR/integration-tests/load/ocr/ocr_test.go: `.GetTestLogger(t)` $DIR/integration-tests/load/ocr/ocr_test.go: `.GetConfig("Load", tc.OCR)` $DIR/integration-tests/load/ocr/ocr_test.go: `.ConnectRemote()` $DIR/integration-tests/load/ocr/ocr_test.go: `.GetChainClient(config, *evmNetwork)` $DIR/integration-tests/load/ocr/ocr_test.go: `.NewProfile()` $DIR/integration-tests/load/ocr/ocr_test.go: `.Add(wasp.NewGenerator(&wasp.Config{ T: t, GenName: "ocr", LoadType: wasp.RPS, CallTimeout: cfg.Load.VerificationTimeout.Duration, RateLimitUnitDuration: cfg.Load.RateLimitUnitDuration.Duration, Schedule: wasp.Plain(*cfg.Load.Rate, cfg.Load.TestDuration.Duration), Gun: NewGun(l, seth, ocrInstances), Labels: CommonTestLabels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), }))` $DIR/integration-tests/load/ocr/ocr_test.go: `.NewGenerator(&wasp.Config{ T: t, GenName: "ocr", LoadType: wasp.RPS, CallTimeout: cfg.Load.VerificationTimeout.Duration, RateLimitUnitDuration: cfg.Load.RateLimitUnitDuration.Duration, Schedule: wasp.Plain(*cfg.Load.Rate, cfg.Load.TestDuration.Duration), Gun: NewGun(l, seth, ocrInstances), Labels: CommonTestLabels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), })` $DIR/integration-tests/load/ocr/ocr_test.go: `.Plain(*cfg.Load.Rate, cfg.Load.TestDuration.Duration)` $DIR/integration-tests/load/ocr/ocr_test.go: `.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken)` $DIR/integration-tests/load/ocr/ocr_test.go: `.Run(true)` $DIR/integration-tests/load/ocr/ocr_test.go: `.GetTestLogger(t)` $DIR/integration-tests/load/ocr/ocr_test.go: `.GetConfig("Volume", tc.OCR)` $DIR/integration-tests/load/ocr/ocr_test.go: `.ConnectRemote()` $DIR/integration-tests/load/ocr/ocr_test.go: `.GetChainClient(config, *evmNetwork)` $DIR/integration-tests/load/ocr/ocr_test.go: `.NewProfile()` $DIR/integration-tests/load/ocr/ocr_test.go: `.Add(wasp.NewGenerator(&wasp.Config{ T: t, GenName: "ocr", LoadType: wasp.VU, CallTimeout: cfg.Volume.VerificationTimeout.Duration, Schedule: wasp.Plain(*cfg.Volume.Rate, cfg.Volume.TestDuration.Duration), VU: NewVU(l, seth, *cfg.Volume.VURequestsPerUnit, cfg.Volume.RateLimitUnitDuration.Duration, lta, bootstrapNode, workerNodes, msClient), Labels: CommonTestLabels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), }))` $DIR/integration-tests/load/ocr/ocr_test.go: `.NewGenerator(&wasp.Config{ T: t, GenName: "ocr", LoadType: wasp.VU, CallTimeout: cfg.Volume.VerificationTimeout.Duration, Schedule: wasp.Plain(*cfg.Volume.Rate, cfg.Volume.TestDuration.Duration), VU: NewVU(l, seth, *cfg.Volume.VURequestsPerUnit, cfg.Volume.RateLimitUnitDuration.Duration, lta, bootstrapNode, workerNodes, msClient), Labels: CommonTestLabels, LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken), })` $DIR/integration-tests/load/ocr/ocr_test.go: `.Plain(*cfg.Volume.Rate, cfg.Volume.TestDuration.Duration)` $DIR/integration-tests/load/ocr/ocr_test.go: `.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken)` $DIR/integration-tests/load/ocr/ocr_test.go: `.Run(true)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `l.Info(). Str("Test Type", testType). Str("Test Duration", vrfv2Config.Performance.TestDuration.Duration.Truncate(time.Second).String()). Int64("RPS", *vrfv2Config.Performance.RPS). Str("RateLimitUnitDuration", vrfv2Config.Performance.RateLimitUnitDuration.String()). Uint16("RandomnessRequestCountPerRequest", *vrfv2Config.General.RandomnessRequestCountPerRequest). Uint16("RandomnessRequestCountPerRequestDeviation", *vrfv2Config.General.RandomnessRequestCountPerRequestDeviation). Bool("UseExistingEnv", *vrfv2Config.General.UseExistingEnv). Msg("Performance Test Configuration")` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `teardown(t, vrfContracts.VRFV2Consumers[0], lc, updatedLabels, testReporter, testType, &testConfig)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `l.Info(). Str("Network Name", sethClient.Cfg.Network.Name). Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `vrfv2.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `testEnv, vrfContracts, vrfKey, _, err = vrfv2.SetupVRFV2Universe(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `vrfcommon.LogSubDetails(l, subscription, strconv.FormatUint(subID, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `subIDsForCancellingAfterTest = subIDs` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `l.Debug().Int("Number of Subs", len(subIDs)).Msg("Subs involved in the test")` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `vrfContracts.VRFV2Consumers = consumers` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `err = vrfContracts.VRFV2Consumers[0].ResetMetrics()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `MonitorLoadStats(testcontext.Get(t), lc, vrfContracts.VRFV2Consumers[0], updatedLabels)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `singleFeedConfig.Schedule = wasp.Plain( *vrfv2Config.Performance.RPS, vrfv2Config.Performance.TestDuration.Duration, )` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `_, err = wasp.NewProfile(). Add(wasp.NewGenerator(singleFeedConfig)). Run(true)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `wg.Add(1)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `wg.Wait()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `l.Info(). Interface("Request Count", requestCount). Interface("Fulfilment Count", fulfilmentCount). Msg("Final Request/Fulfilment Stats")` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `l.Info(). Str("Test Type", testType). Str("Test Duration", vrfv2Config.Performance.TestDuration.Duration.Truncate(time.Second).String()). Int64("RPS", *vrfv2Config.Performance.RPS). Str("RateLimitUnitDuration", vrfv2Config.Performance.RateLimitUnitDuration.String()). Uint16("RandomnessRequestCountPerRequest", *vrfv2Config.General.RandomnessRequestCountPerRequest). Uint16("RandomnessRequestCountPerRequestDeviation", *vrfv2Config.General.RandomnessRequestCountPerRequestDeviation). Bool("UseExistingEnv", *vrfv2Config.General.UseExistingEnv). Msg("Performance Test Configuration")` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `teardown(t, vrfContracts.VRFV2Consumers[0], lc, updatedLabels, testReporter, testType, &testConfig)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `l.Info(). Str("Network Name", sethClient.Cfg.Network.Name). Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `vrfv2.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `testEnv, vrfContracts, vrfKey, _, err = vrfv2.SetupVRFV2Universe(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `configCopy.VRFv2.General.SubscriptionFundingAmountLink = ptr.Ptr(float64(0))` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `vrfcommon.LogSubDetails(l, subscription, strconv.FormatUint(subID, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `subIDsForCancellingAfterTest = underfundedSubIDs` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `l.Debug().Int("Number of Subs", len(underfundedSubIDs)).Msg("Subs involved in the test")` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `vrfContracts.VRFV2Consumers = consumers` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `err = vrfContracts.VRFV2Consumers[0].ResetMetrics()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `MonitorLoadStats(testcontext.Get(t), lc, vrfContracts.VRFV2Consumers[0], updatedLabels)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `singleFeedConfig.Schedule = wasp.Plain( *configCopy.VRFv2.Performance.BHSTestRPS, configCopy.VRFv2.Performance.BHSTestDuration.Duration, )` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `_, err = wasp.NewProfile(). Add(wasp.NewGenerator(singleFeedConfig)). Run(true)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `wgBlockNumberTobe.Add(1)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `_, err = actions.WaitForBlockNumberToBe( latestBlockNumber+uint64(257), sethClient, &wgBlockNumberTobe, configCopy.VRFv2.General.WaitFor256BlocksTimeout.Duration, t, l, )` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `wgBlockNumberTobe.Wait()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `subIDsString = append(subIDsString, underfundedSubIDs...)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `l.Info(). Float64("SubscriptionRefundingAmountLink", *configCopy.VRFv2.General.SubscriptionRefundingAmountLink). Uints64("SubIDs", subIDsString). Msg("Funding Subscriptions with Link and Native Tokens")` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `err = vrfv2.FundSubscriptions( big.NewFloat(*configCopy.VRFv2.General.SubscriptionRefundingAmountLink), vrfContracts.LinkToken, vrfContracts.CoordinatorV2, underfundedSubIDs, )` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `wgAllRequestsFulfilled.Add(1)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `wgAllRequestsFulfilled.Wait()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `l.Info(). Interface("Request Count", requestCount). Interface("Fulfilment Count", fulfilmentCount). Msg("Final Request/Fulfilment Stats")` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.GetTestLogger(t)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.GetConfigurationNameFromEnv()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.GetConfig(testType, tc.VRFv2)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.NewLokiClient(lokiConfig)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.MustGetSelectedNetworkConfig(testConfig.GetNetworkConfig())` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.GetNetworkConfig()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.GetChainClient(testConfig, network)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Info()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Str("Test Type", testType)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Str("Test Duration", vrfv2Config.Performance.TestDuration.Duration.Truncate(time.Second).String())` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Performance.TestDuration.Duration.Truncate(time.Second)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.String()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Int64("RPS", *vrfv2Config.Performance.RPS)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Str("RateLimitUnitDuration", vrfv2Config.Performance.RateLimitUnitDuration.String())` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Performance.RateLimitUnitDuration.String()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Uint16("RandomnessRequestCountPerRequest", *vrfv2Config.General.RandomnessRequestCountPerRequest)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Uint16("RandomnessRequestCountPerRequestDeviation", *vrfv2Config.General.RandomnessRequestCountPerRequestDeviation)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Bool("UseExistingEnv", *vrfv2Config.General.UseExistingEnv)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Msg("Performance Test Configuration")` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Cfg.IsSimulatedNetwork()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Info()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Str("Network Name", sethClient.Cfg.Network.Name)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Hex()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Cleanup(test_env.CleanupOpts{})` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.SetupVRFV2Universe(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.SetupSubsAndConsumersForExistingEnv( testEnv, chainID, vrfContracts.CoordinatorV2, vrfContracts.LinkToken, 1, *vrfv2Config.General.NumberOfSubToCreate, testConfig, l, )` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.CoordinatorV2.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.LogSubDetails(l, subscription, strconv.FormatUint(subID, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.FormatUint(subID, 10)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Debug()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Int("Number of Subs", len(subIDs))` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Msg("Subs involved in the test")` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.ResetMetrics()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Plain( *vrfv2Config.Performance.RPS, vrfv2Config.Performance.TestDuration.Duration, )` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.NewProfile()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Add(wasp.NewGenerator(singleFeedConfig))` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.NewGenerator(singleFeedConfig)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Run(true)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Add(1)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.WaitForRequestCountEqualToFulfilmentCount(testcontext.Get(t), vrfContracts.VRFV2Consumers[0], 2*time.Minute, &wg)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Wait()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Info()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Interface("Request Count", requestCount)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Interface("Fulfilment Count", fulfilmentCount)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Msg("Final Request/Fulfilment Stats")` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.GetTestLogger(t)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.GetConfigurationNameFromEnv()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.GetConfig(testType, tc.VRFv2)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.NewLokiClient(lokiConfig)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Info()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Str("Test Type", testType)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Str("Test Duration", vrfv2Config.Performance.TestDuration.Duration.Truncate(time.Second).String())` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Performance.TestDuration.Duration.Truncate(time.Second)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.String()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Int64("RPS", *vrfv2Config.Performance.RPS)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Str("RateLimitUnitDuration", vrfv2Config.Performance.RateLimitUnitDuration.String())` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Performance.RateLimitUnitDuration.String()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Uint16("RandomnessRequestCountPerRequest", *vrfv2Config.General.RandomnessRequestCountPerRequest)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Uint16("RandomnessRequestCountPerRequestDeviation", *vrfv2Config.General.RandomnessRequestCountPerRequestDeviation)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Bool("UseExistingEnv", *vrfv2Config.General.UseExistingEnv)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Msg("Performance Test Configuration")` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.MustGetSelectedNetworkConfig(testConfig.GetNetworkConfig())` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.GetNetworkConfig()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.GetChainClient(testConfig, network)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Cfg.IsSimulatedNetwork()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Info()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Str("Network Name", sethClient.Cfg.Network.Name)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Hex()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Cleanup(test_env.CleanupOpts{})` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.SetupVRFV2Universe(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.MustCopy()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Ptr(float64(0))` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.SetupSubsAndConsumersForExistingEnv( testEnv, chainID, vrfContracts.CoordinatorV2, vrfContracts.LinkToken, 1, *vrfv2Config.General.NumberOfSubToCreate, configCopy, l, )` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.CoordinatorV2.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.LogSubDetails(l, subscription, strconv.FormatUint(subID, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.FormatUint(subID, 10)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Debug()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Int("Number of Subs", len(underfundedSubIDs))` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Msg("Subs involved in the test")` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.ResetMetrics()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Plain( *configCopy.VRFv2.Performance.BHSTestRPS, configCopy.VRFv2.Performance.BHSTestDuration.Duration, )` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.NewProfile()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Add(wasp.NewGenerator(singleFeedConfig))` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.NewGenerator(singleFeedConfig)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Run(true)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Add(1)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Client.BlockNumber(testcontext.Get(t))` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.WaitForBlockNumberToBe( latestBlockNumber+uint64(257), sethClient, &wgBlockNumberTobe, configCopy.VRFv2.General.WaitFor256BlocksTimeout.Duration, t, l, )` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Wait()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.GetLoadTestMetrics(testcontext.Get(t))` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Info()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Float64("SubscriptionRefundingAmountLink", *configCopy.VRFv2.General.SubscriptionRefundingAmountLink)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Uints64("SubIDs", subIDsString)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Msg("Funding Subscriptions with Link and Native Tokens")` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.FundSubscriptions( big.NewFloat(*configCopy.VRFv2.General.SubscriptionRefundingAmountLink), vrfContracts.LinkToken, vrfContracts.CoordinatorV2, underfundedSubIDs, )` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.NewFloat(*configCopy.VRFv2.General.SubscriptionRefundingAmountLink)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Add(1)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.WaitForRequestCountEqualToFulfilmentCount(testcontext.Get(t), vrfContracts.VRFV2Consumers[0], 2*time.Minute, &wgAllRequestsFulfilled)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Wait()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `.Info()` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Interface("Request Count", requestCount)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Interface("Fulfilment Count", fulfilmentCount)` $DIR/integration-tests/load/vrfv2/vrfv2_test.go: `. Msg("Final Request/Fulfilment Stats")` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `l.Info(). Str("Test Type", testType). Str("Test Duration", vrfv2PlusConfig.Performance.TestDuration.Duration.Truncate(time.Second).String()). Int64("RPS", *vrfv2PlusConfig.Performance.RPS). Str("RateLimitUnitDuration", vrfv2PlusConfig.Performance.RateLimitUnitDuration.String()). Uint16("RandomnessRequestCountPerRequest", *vrfv2PlusConfig.General.RandomnessRequestCountPerRequest). Uint16("RandomnessRequestCountPerRequestDeviation", *vrfv2PlusConfig.General.RandomnessRequestCountPerRequestDeviation). Bool("UseExistingEnv", *vrfv2PlusConfig.General.UseExistingEnv). Msg("Performance Test Configuration")` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `teardown(t, vrfContracts.VRFV2PlusConsumer[0], lc, updatedLabels, testReporter, testType, &testConfig)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `l.Info(). Str("Network Name", sethClient.Cfg.Network.Name). Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `vrfv2plus.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `testEnv, vrfContracts, vrfKey, _, err = vrfv2plus.SetupVRFV2PlusUniverse(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `subIDsForCancellingAfterTest = subIDs` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `l.Info().Int("Number of Subs", len(subIDs)).Msg("Subs involved in the test")` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `vrfContracts.VRFV2PlusConsumer = consumers` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `err = consumer.ResetMetrics()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `MonitorLoadStats(testcontext.Get(t), lc, consumer, updatedLabels)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `singleFeedConfig.Schedule = wasp.Plain( *vrfv2PlusConfig.Performance.RPS, vrfv2PlusConfig.Performance.TestDuration.Duration, )` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `_, err = wasp.NewProfile(). Add(wasp.NewGenerator(singleFeedConfig)). Run(true)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `wg.Add(1)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `wg.Wait()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `l.Info(). Interface("Request Count", requestCount). Interface("Fulfilment Count", fulfilmentCount). Msg("Final Request/Fulfilment Stats")` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `l.Info(). Str("Test Type", testType). Str("Test Duration", vrfv2PlusConfig.Performance.TestDuration.Duration.Truncate(time.Second).String()). Int64("RPS", *vrfv2PlusConfig.Performance.RPS). Str("RateLimitUnitDuration", vrfv2PlusConfig.Performance.RateLimitUnitDuration.String()). Uint16("RandomnessRequestCountPerRequest", *vrfv2PlusConfig.General.RandomnessRequestCountPerRequest). Uint16("RandomnessRequestCountPerRequestDeviation", *vrfv2PlusConfig.General.RandomnessRequestCountPerRequestDeviation). Bool("UseExistingEnv", *vrfv2PlusConfig.General.UseExistingEnv). Msg("Performance Test Configuration")` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `teardown(t, vrfContracts.VRFV2PlusConsumer[0], lc, updatedLabels, testReporter, testType, &testConfig)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `l.Info(). Str("Network Name", sethClient.Cfg.Network.Name). Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `vrfv2plus.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `testEnv, vrfContracts, vrfKey, _, err = vrfv2plus.SetupVRFV2PlusUniverse(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `configCopy.VRFv2Plus.General.SubscriptionFundingAmountLink = ptr.Ptr(float64(0))` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `configCopy.VRFv2Plus.General.SubscriptionFundingAmountNative = ptr.Ptr(float64(0))` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `subIDsForCancellingAfterTest = underfundedSubIDs` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `l.Debug().Int("Number of Subs", len(underfundedSubIDs)).Msg("Subs involved in the test")` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `vrfContracts.VRFV2PlusConsumer = consumers` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `err = consumer.ResetMetrics()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `MonitorLoadStats(testcontext.Get(t), lc, consumer, updatedLabels)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `singleFeedConfig.Schedule = wasp.Plain( *configCopy.VRFv2Plus.Performance.BHSTestRPS, configCopy.VRFv2Plus.Performance.BHSTestDuration.Duration, )` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `_, err = wasp.NewProfile(). Add(wasp.NewGenerator(singleFeedConfig)). Run(true)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `wgBlockNumberTobe.Add(1)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `_, err = actions.WaitForBlockNumberToBe( latestBlockNumber+uint64(257), sethClient, &wgBlockNumberTobe, configCopy.VRFv2Plus.General.WaitFor256BlocksTimeout.Duration, t, l, )` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `wgBlockNumberTobe.Wait()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `subIDsString = append(subIDsString, subID.String())` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `l.Info(). Float64("SubscriptionRefundingAmountNative", *configCopy.VRFv2Plus.General.SubscriptionRefundingAmountNative). Float64("SubscriptionRefundingAmountLink", *configCopy.VRFv2Plus.General.SubscriptionRefundingAmountLink). Strs("SubIDs", subIDsString). Msg("Funding Subscriptions with Link and Native Tokens")` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `err = vrfv2plus.FundSubscriptions( big.NewFloat(*configCopy.VRFv2Plus.General.SubscriptionRefundingAmountNative), big.NewFloat(*configCopy.VRFv2Plus.General.SubscriptionRefundingAmountLink), vrfContracts.LinkToken, vrfContracts.CoordinatorV2Plus, underfundedSubIDs, )` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `wgAllRequestsFulfilled.Add(1)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `wgAllRequestsFulfilled.Wait()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `l.Info(). Interface("Request Count", requestCount). Interface("Fulfilment Count", fulfilmentCount). Msg("Final Request/Fulfilment Stats")` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.GetTestLogger(t)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.GetConfigurationNameFromEnv()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.GetConfig(testType, tc.VRFv2Plus)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.NewLokiClient(lokiConfig)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.MustGetSelectedNetworkConfig(testConfig.GetNetworkConfig())` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.GetNetworkConfig()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.GetChainClient(testConfig, network)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Str("Test Type", testType)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Str("Test Duration", vrfv2PlusConfig.Performance.TestDuration.Duration.Truncate(time.Second).String())` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Performance.TestDuration.Duration.Truncate(time.Second)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.String()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Int64("RPS", *vrfv2PlusConfig.Performance.RPS)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Str("RateLimitUnitDuration", vrfv2PlusConfig.Performance.RateLimitUnitDuration.String())` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Performance.RateLimitUnitDuration.String()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Uint16("RandomnessRequestCountPerRequest", *vrfv2PlusConfig.General.RandomnessRequestCountPerRequest)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Uint16("RandomnessRequestCountPerRequestDeviation", *vrfv2PlusConfig.General.RandomnessRequestCountPerRequestDeviation)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Bool("UseExistingEnv", *vrfv2PlusConfig.General.UseExistingEnv)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Msg("Performance Test Configuration")` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Cfg.IsSimulatedNetwork()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Str("Network Name", sethClient.Cfg.Network.Name)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Hex()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Cleanup(test_env.CleanupOpts{})` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.SetupVRFV2PlusUniverse(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.SetupSubsAndConsumersForExistingEnv( testcontext.Get(t), testEnv, chainID, vrfContracts.CoordinatorV2Plus, vrfContracts.LinkToken, 1, *vrfv2PlusConfig.General.NumberOfSubToCreate, testConfig, l, )` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.String()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Int("Number of Subs", len(subIDs))` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Msg("Subs involved in the test")` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.ResetMetrics()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Plain( *vrfv2PlusConfig.Performance.RPS, vrfv2PlusConfig.Performance.TestDuration.Duration, )` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.NewProfile()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Add(wasp.NewGenerator(singleFeedConfig))` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.NewGenerator(singleFeedConfig)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Run(true)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Add(1)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.WaitForRequestCountEqualToFulfilmentCount(testcontext.Get(t), consumer, 2*time.Minute, &wg)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Wait()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Interface("Request Count", requestCount)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Interface("Fulfilment Count", fulfilmentCount)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Msg("Final Request/Fulfilment Stats")` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.GetTestLogger(t)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.GetConfigurationNameFromEnv()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.GetConfig(testType, tc.VRFv2Plus)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.NewLokiClient(lokiConfig)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Str("Test Type", testType)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Str("Test Duration", vrfv2PlusConfig.Performance.TestDuration.Duration.Truncate(time.Second).String())` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Performance.TestDuration.Duration.Truncate(time.Second)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.String()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Int64("RPS", *vrfv2PlusConfig.Performance.RPS)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Str("RateLimitUnitDuration", vrfv2PlusConfig.Performance.RateLimitUnitDuration.String())` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Performance.RateLimitUnitDuration.String()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Uint16("RandomnessRequestCountPerRequest", *vrfv2PlusConfig.General.RandomnessRequestCountPerRequest)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Uint16("RandomnessRequestCountPerRequestDeviation", *vrfv2PlusConfig.General.RandomnessRequestCountPerRequestDeviation)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Bool("UseExistingEnv", *vrfv2PlusConfig.General.UseExistingEnv)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Msg("Performance Test Configuration")` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.MustGetSelectedNetworkConfig(testConfig.GetNetworkConfig())` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.GetNetworkConfig()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.GetChainClient(testConfig, network)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Cfg.IsSimulatedNetwork()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Str("Network Name", sethClient.Cfg.Network.Name)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Hex()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Cleanup(test_env.CleanupOpts{})` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.SetupVRFV2PlusUniverse(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.MustCopy()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Ptr(float64(0))` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Ptr(float64(0))` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.SetupSubsAndConsumersForExistingEnv( testcontext.Get(t), testEnv, chainID, vrfContracts.CoordinatorV2Plus, vrfContracts.LinkToken, 1, *vrfv2PlusConfig.General.NumberOfSubToCreate, configCopy, l, )` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.String()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Debug()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Int("Number of Subs", len(underfundedSubIDs))` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Msg("Subs involved in the test")` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.ResetMetrics()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Plain( *configCopy.VRFv2Plus.Performance.BHSTestRPS, configCopy.VRFv2Plus.Performance.BHSTestDuration.Duration, )` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.NewProfile()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Add(wasp.NewGenerator(singleFeedConfig))` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.NewGenerator(singleFeedConfig)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Run(true)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Add(1)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Client.BlockNumber(testcontext.Get(t))` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.WaitForBlockNumberToBe( latestBlockNumber+uint64(257), sethClient, &wgBlockNumberTobe, configCopy.VRFv2Plus.General.WaitFor256BlocksTimeout.Duration, t, l, )` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Wait()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.GetLoadTestMetrics(testcontext.Get(t))` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.String()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Float64("SubscriptionRefundingAmountNative", *configCopy.VRFv2Plus.General.SubscriptionRefundingAmountNative)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Float64("SubscriptionRefundingAmountLink", *configCopy.VRFv2Plus.General.SubscriptionRefundingAmountLink)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Strs("SubIDs", subIDsString)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Msg("Funding Subscriptions with Link and Native Tokens")` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.FundSubscriptions( big.NewFloat(*configCopy.VRFv2Plus.General.SubscriptionRefundingAmountNative), big.NewFloat(*configCopy.VRFv2Plus.General.SubscriptionRefundingAmountLink), vrfContracts.LinkToken, vrfContracts.CoordinatorV2Plus, underfundedSubIDs, )` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.NewFloat(*configCopy.VRFv2Plus.General.SubscriptionRefundingAmountNative)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.NewFloat(*configCopy.VRFv2Plus.General.SubscriptionRefundingAmountLink)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Add(1)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.WaitForRequestCountEqualToFulfilmentCount(testcontext.Get(t), consumer, 2*time.Minute, &wgAllRequestsFulfilled)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Wait()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Interface("Request Count", requestCount)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Interface("Fulfilment Count", fulfilmentCount)` $DIR/integration-tests/load/vrfv2plus/vrfv2plus_test.go: `. Msg("Final Request/Fulfilment Stats")` $DIR/integration-tests/load/zcluster/cluster_entrypoint_test.go: `err = p.Run()` $DIR/integration-tests/load/zcluster/cluster_entrypoint_test.go: `.GetConfig("Load", tc.OCR)` $DIR/integration-tests/load/zcluster/cluster_entrypoint_test.go: `.AsBase64()` $DIR/integration-tests/load/zcluster/cluster_entrypoint_test.go: `.NewClusterProfile(&wasp.ClusterConfig{ // you set up these only once, no need to configure through TOML DockerCmdExecPath: "../../..", BuildCtxPath: "integration-tests/load", Namespace: *config.WaspConfig.Namespace, KeepJobs: config.WaspConfig.KeepJobs, UpdateImage: config.WaspConfig.UpdateImage, HelmValues: map[string]string{ "env.loki.url": *config.Logging.Loki.Endpoint, "env.loki.tenant_id": *config.Logging.Loki.TenantId, "image": *config.WaspConfig.RepoImageVersionURI, "test.binaryName": *config.WaspConfig.TestBinaryName, "test.name": *config.WaspConfig.TestName, "test.timeout": *config.WaspConfig.TestTimeout, "env.wasp.log_level": *config.WaspConfig.WaspLogLevel, "jobs": *config.WaspConfig.WaspJobs, // other test vars pass through "test.BASE64_CONFIG_OVERRIDE": cfgBase64, }, })` $DIR/integration-tests/load/zcluster/cluster_entrypoint_test.go: `.Run()` $DIR/integration-tests/migration/upgrade_version_test.go: `err = config.ChainlinkUpgradeImage.Validate()` $DIR/integration-tests/migration/upgrade_version_test.go: `err = env.ClCluster.Nodes[0].UpgradeVersion(*config.ChainlinkUpgradeImage.Image, *config.ChainlinkUpgradeImage.Version)` $DIR/integration-tests/migration/upgrade_version_test.go: `.GetTestLogger(t)` $DIR/integration-tests/migration/upgrade_version_test.go: `.GetConfig("Migration", tc.Node)` $DIR/integration-tests/migration/upgrade_version_test.go: `.ChainlinkUpgradeImage.Validate()` $DIR/integration-tests/migration/upgrade_version_test.go: `.EthereumNetworkConfigFromConfig(l, &config)` $DIR/integration-tests/migration/upgrade_version_test.go: `.NewCLTestEnvBuilder()` $DIR/integration-tests/migration/upgrade_version_test.go: `. WithTestConfig(&config)` $DIR/integration-tests/migration/upgrade_version_test.go: `. WithTestInstance(t)` $DIR/integration-tests/migration/upgrade_version_test.go: `. WithStandardCleanup()` $DIR/integration-tests/migration/upgrade_version_test.go: `. WithPrivateEthereumNetwork(privateNetwork.EthereumNetworkConfig)` $DIR/integration-tests/migration/upgrade_version_test.go: `. WithCLNodes(1)` $DIR/integration-tests/migration/upgrade_version_test.go: `. WithStandardCleanup()` $DIR/integration-tests/migration/upgrade_version_test.go: `. WithSeth()` $DIR/integration-tests/migration/upgrade_version_test.go: `. Build()` $DIR/integration-tests/migration/upgrade_version_test.go: `.UpgradeVersion(*config.ChainlinkUpgradeImage.Image, *config.ChainlinkUpgradeImage.Version)` $DIR/integration-tests/reorg/automation_reorg_test.go: `t.Run(name, func(t *testing.T) { t.Parallel() config, err := tc.GetConfig("Reorg", tc.Automation) if err != nil { t.Fatal(err) } network := networks.MustGetSelectedNetworkConfig(config.Network)[0] defaultAutomationSettings["replicas"] = nodeCount defaultAutomationSettings["toml"] = networks.AddNetworkDetailedConfig(baseTOML, config.Pyroscope, networkTOML, network) var overrideFn = func(_ interface{}, target interface{}) { ctf_config.MustConfigOverrideChainlinkVersion(config.GetChainlinkImageConfig(), target) ctf_config.MightConfigOverridePyroscopeKey(config.GetPyroscopeConfig(), target) } cd := chainlink.NewWithOverride(0, defaultAutomationSettings, config.ChainlinkImage, overrideFn) testEnvironment := environment. New(&environment.Config{ NamespacePrefix: fmt.Sprintf("automation-reorg-%d", reorgBlockCount), TTL: time.Hour * 1, Test: t}). // Use Geth blockchain to simulate reorgs AddHelm(geth_helm.New(&geth_helm.Props{ NetworkName: network.Name, Simulated: true, WsURLs: network.URLs, })). AddHelm(cd) err = testEnvironment.Run() require.NoError(t, err, "Error setting up test environment") if testEnvironment.WillUseRemoteRunner() { return } gethURL := testEnvironment.URLs["Simulated Geth_http"][0] require.NotEmpty(t, gethURL, "Geth URL should not be empty") gethRPCClient := ctf_client.NewRPCClient(gethURL) chainClient, err := blockchain.NewEVMClient(network, testEnvironment, l) require.NoError(t, err, "Error connecting to blockchain") contractDeployer, err := contracts.NewContractDeployer(chainClient, l) require.NoError(t, err, "Error building contract deployer") chainlinkNodes, err := client.ConnectChainlinkNodes(testEnvironment) require.NoError(t, err, "Error connecting to Chainlink nodes") chainClient.ParallelTransactions(true) // Register cleanup for any test t.Cleanup(func() { err := actions.TeardownSuite(t, testEnvironment, chainlinkNodes, nil, zapcore.PanicLevel, &config, chainClient) require.NoError(t, err, "Error tearing down environment") }) err = actions.FundChainlinkNodes(chainlinkNodes, chainClient, nodeFundsAmount) require.NoError(t, err, "Error funding Chainlink nodes") linkToken, err := contractDeployer.DeployLinkTokenContract() require.NoError(t, err, "Error deploying LINK token") registry, registrar := actions.DeployAutoOCRRegistryAndRegistrar( t, registryVersion, defaultOCRRegistryConfig, linkToken, contractDeployer, chainClient, ) // Fund the registry with LINK err = linkToken.Transfer(registry.Address(), big.NewInt(0).Mul(big.NewInt(1e18), big.NewInt(int64(upkeepCount)))) require.NoError(t, err, "Funding keeper registry contract shouldn't fail") actions.CreateOCRKeeperJobs(t, chainlinkNodes, registry.Address(), network.ChainID, 0, registryVersion) nodesWithoutBootstrap := chainlinkNodes[1:] defaultOCRRegistryConfig.RegistryVersion = registryVersion ocrConfig, err := actions.BuildAutoOCR2ConfigVars(t, nodesWithoutBootstrap, defaultOCRRegistryConfig, registrar.Address(), 5*time.Second, registry.ChainModuleAddress(), registry.ReorgProtectionEnabled()) require.NoError(t, err, "OCR2 config should be built successfully") if registryVersion == ethereum.RegistryVersion_2_0 { err = registry.SetConfig(defaultOCRRegistryConfig, ocrConfig) } else { err = registry.SetConfigTypeSafe(ocrConfig) } require.NoError(t, err, "Registry config should be be set successfully") require.NoError(t, chainClient.WaitForEvents(), "Waiting for config to be set") // Use the name to determine if this is a log trigger or not isLogTrigger := name == "registry_2_1_logtrigger" || name == "registry_2_2_logtrigger" consumers, upkeepIDs := actions.DeployConsumers(t, registry, registrar, linkToken, contractDeployer, chainClient, upkeepCount, big.NewInt(defaultLinkFunds), defaultUpkeepGasLimit, isLogTrigger, false) if isLogTrigger { for i := 0; i < len(upkeepIDs); i++ { if err := consumers[i].Start(); err != nil { l.Error().Msg("Error when starting consumer") return } l.Info().Int("Consumer index", i).Msg("Consumer started") } } l.Info().Msg("Waiting for all upkeeps to be performed") gom := gomega.NewGomegaWithT(t) gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 5 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := 5 l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep ID", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64()) } }, "7m", "1s").Should(gomega.Succeed()) // ~1m for cluster setup, ~3m for performing each upkeep 5 times, ~3m buffer l.Info().Msg("All upkeeps performed under happy path. Starting reorg") l.Info(). Str("URL", gethRPCClient.URL). Int("BlocksBack", reorgBlockCount). Int("FinalityDepth", finalityDepth). Int("HistoryDepth", historyDepth). Msg("Rewinding blocks on chain below finality depth") err = gethRPCClient.GethSetHead(reorgBlockCount) require.NoError(t, err, "Error rewinding blocks on chain") l.Info().Msg("Reorg started. Expecting chain to become unstable and upkeeps to still getting performed") gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they reach 10 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := 10 l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep ID", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64()) } }, "5m", "1s").Should(gomega.Succeed()) })` $DIR/integration-tests/reorg/automation_reorg_test.go: `defaultAutomationSettings["replicas"] = nodeCount` $DIR/integration-tests/reorg/automation_reorg_test.go: `defaultAutomationSettings["toml"] = networks.AddNetworkDetailedConfig(baseTOML, config.Pyroscope, networkTOML, network)` $DIR/integration-tests/reorg/automation_reorg_test.go: `ctf_config.MustConfigOverrideChainlinkVersion(config.GetChainlinkImageConfig(), target)` $DIR/integration-tests/reorg/automation_reorg_test.go: `ctf_config.MightConfigOverridePyroscopeKey(config.GetPyroscopeConfig(), target)` $DIR/integration-tests/reorg/automation_reorg_test.go: `err = testEnvironment.Run()` $DIR/integration-tests/reorg/automation_reorg_test.go: `chainClient.ParallelTransactions(true)` $DIR/integration-tests/reorg/automation_reorg_test.go: `t.Cleanup(func() { err := actions.TeardownSuite(t, testEnvironment, chainlinkNodes, nil, zapcore.PanicLevel, &config, chainClient) require.NoError(t, err, "Error tearing down environment") })` $DIR/integration-tests/reorg/automation_reorg_test.go: `err = actions.FundChainlinkNodes(chainlinkNodes, chainClient, nodeFundsAmount)` $DIR/integration-tests/reorg/automation_reorg_test.go: `err = linkToken.Transfer(registry.Address(), big.NewInt(0).Mul(big.NewInt(1e18), big.NewInt(int64(upkeepCount))))` $DIR/integration-tests/reorg/automation_reorg_test.go: `actions.CreateOCRKeeperJobs(t, chainlinkNodes, registry.Address(), network.ChainID, 0, registryVersion)` $DIR/integration-tests/reorg/automation_reorg_test.go: `defaultOCRRegistryConfig.RegistryVersion = registryVersion` $DIR/integration-tests/reorg/automation_reorg_test.go: `err = registry.SetConfig(defaultOCRRegistryConfig, ocrConfig)` $DIR/integration-tests/reorg/automation_reorg_test.go: `err = registry.SetConfigTypeSafe(ocrConfig)` $DIR/integration-tests/reorg/automation_reorg_test.go: `l.Info().Int("Consumer index", i).Msg("Consumer started")` $DIR/integration-tests/reorg/automation_reorg_test.go: `l.Info().Msg("Waiting for all upkeeps to be performed")` $DIR/integration-tests/reorg/automation_reorg_test.go: `gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 5 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := 5 l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep ID", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64()) } }, "7m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/reorg/automation_reorg_test.go: `l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep ID", i).Msg("Number of upkeeps performed")` $DIR/integration-tests/reorg/automation_reorg_test.go: `g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64())` $DIR/integration-tests/reorg/automation_reorg_test.go: `l.Info().Msg("All upkeeps performed under happy path. Starting reorg")` $DIR/integration-tests/reorg/automation_reorg_test.go: `l.Info(). Str("URL", gethRPCClient.URL). Int("BlocksBack", reorgBlockCount). Int("FinalityDepth", finalityDepth). Int("HistoryDepth", historyDepth). Msg("Rewinding blocks on chain below finality depth")` $DIR/integration-tests/reorg/automation_reorg_test.go: `err = gethRPCClient.GethSetHead(reorgBlockCount)` $DIR/integration-tests/reorg/automation_reorg_test.go: `l.Info().Msg("Reorg started. Expecting chain to become unstable and upkeeps to still getting performed")` $DIR/integration-tests/reorg/automation_reorg_test.go: `gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they reach 10 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := 10 l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep ID", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64()) } }, "5m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/reorg/automation_reorg_test.go: `l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep ID", i).Msg("Number of upkeeps performed")` $DIR/integration-tests/reorg/automation_reorg_test.go: `g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64())` $DIR/integration-tests/reorg/automation_reorg_test.go: `.GetTestLogger(t)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Run(name, func(t *testing.T) { t.Parallel() config, err := tc.GetConfig("Reorg", tc.Automation) if err != nil { t.Fatal(err) } network := networks.MustGetSelectedNetworkConfig(config.Network)[0] defaultAutomationSettings["replicas"] = nodeCount defaultAutomationSettings["toml"] = networks.AddNetworkDetailedConfig(baseTOML, config.Pyroscope, networkTOML, network) var overrideFn = func(_ interface{}, target interface{}) { ctf_config.MustConfigOverrideChainlinkVersion(config.GetChainlinkImageConfig(), target) ctf_config.MightConfigOverridePyroscopeKey(config.GetPyroscopeConfig(), target) } cd := chainlink.NewWithOverride(0, defaultAutomationSettings, config.ChainlinkImage, overrideFn) testEnvironment := environment. New(&environment.Config{ NamespacePrefix: fmt.Sprintf("automation-reorg-%d", reorgBlockCount), TTL: time.Hour * 1, Test: t}). // Use Geth blockchain to simulate reorgs AddHelm(geth_helm.New(&geth_helm.Props{ NetworkName: network.Name, Simulated: true, WsURLs: network.URLs, })). AddHelm(cd) err = testEnvironment.Run() require.NoError(t, err, "Error setting up test environment") if testEnvironment.WillUseRemoteRunner() { return } gethURL := testEnvironment.URLs["Simulated Geth_http"][0] require.NotEmpty(t, gethURL, "Geth URL should not be empty") gethRPCClient := ctf_client.NewRPCClient(gethURL) chainClient, err := blockchain.NewEVMClient(network, testEnvironment, l) require.NoError(t, err, "Error connecting to blockchain") contractDeployer, err := contracts.NewContractDeployer(chainClient, l) require.NoError(t, err, "Error building contract deployer") chainlinkNodes, err := client.ConnectChainlinkNodes(testEnvironment) require.NoError(t, err, "Error connecting to Chainlink nodes") chainClient.ParallelTransactions(true) // Register cleanup for any test t.Cleanup(func() { err := actions.TeardownSuite(t, testEnvironment, chainlinkNodes, nil, zapcore.PanicLevel, &config, chainClient) require.NoError(t, err, "Error tearing down environment") }) err = actions.FundChainlinkNodes(chainlinkNodes, chainClient, nodeFundsAmount) require.NoError(t, err, "Error funding Chainlink nodes") linkToken, err := contractDeployer.DeployLinkTokenContract() require.NoError(t, err, "Error deploying LINK token") registry, registrar := actions.DeployAutoOCRRegistryAndRegistrar( t, registryVersion, defaultOCRRegistryConfig, linkToken, contractDeployer, chainClient, ) // Fund the registry with LINK err = linkToken.Transfer(registry.Address(), big.NewInt(0).Mul(big.NewInt(1e18), big.NewInt(int64(upkeepCount)))) require.NoError(t, err, "Funding keeper registry contract shouldn't fail") actions.CreateOCRKeeperJobs(t, chainlinkNodes, registry.Address(), network.ChainID, 0, registryVersion) nodesWithoutBootstrap := chainlinkNodes[1:] defaultOCRRegistryConfig.RegistryVersion = registryVersion ocrConfig, err := actions.BuildAutoOCR2ConfigVars(t, nodesWithoutBootstrap, defaultOCRRegistryConfig, registrar.Address(), 5*time.Second, registry.ChainModuleAddress(), registry.ReorgProtectionEnabled()) require.NoError(t, err, "OCR2 config should be built successfully") if registryVersion == ethereum.RegistryVersion_2_0 { err = registry.SetConfig(defaultOCRRegistryConfig, ocrConfig) } else { err = registry.SetConfigTypeSafe(ocrConfig) } require.NoError(t, err, "Registry config should be be set successfully") require.NoError(t, chainClient.WaitForEvents(), "Waiting for config to be set") // Use the name to determine if this is a log trigger or not isLogTrigger := name == "registry_2_1_logtrigger" || name == "registry_2_2_logtrigger" consumers, upkeepIDs := actions.DeployConsumers(t, registry, registrar, linkToken, contractDeployer, chainClient, upkeepCount, big.NewInt(defaultLinkFunds), defaultUpkeepGasLimit, isLogTrigger, false) if isLogTrigger { for i := 0; i < len(upkeepIDs); i++ { if err := consumers[i].Start(); err != nil { l.Error().Msg("Error when starting consumer") return } l.Info().Int("Consumer index", i).Msg("Consumer started") } } l.Info().Msg("Waiting for all upkeeps to be performed") gom := gomega.NewGomegaWithT(t) gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 5 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := 5 l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep ID", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64()) } }, "7m", "1s").Should(gomega.Succeed()) // ~1m for cluster setup, ~3m for performing each upkeep 5 times, ~3m buffer l.Info().Msg("All upkeeps performed under happy path. Starting reorg") l.Info(). Str("URL", gethRPCClient.URL). Int("BlocksBack", reorgBlockCount). Int("FinalityDepth", finalityDepth). Int("HistoryDepth", historyDepth). Msg("Rewinding blocks on chain below finality depth") err = gethRPCClient.GethSetHead(reorgBlockCount) require.NoError(t, err, "Error rewinding blocks on chain") l.Info().Msg("Reorg started. Expecting chain to become unstable and upkeeps to still getting performed") gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they reach 10 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := 10 l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep ID", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64()) } }, "5m", "1s").Should(gomega.Succeed()) })` $DIR/integration-tests/reorg/automation_reorg_test.go: `.GetConfig("Reorg", tc.Automation)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.MustGetSelectedNetworkConfig(config.Network)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.AddNetworkDetailedConfig(baseTOML, config.Pyroscope, networkTOML, network)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.MustConfigOverrideChainlinkVersion(config.GetChainlinkImageConfig(), target)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.GetChainlinkImageConfig()` $DIR/integration-tests/reorg/automation_reorg_test.go: `.MightConfigOverridePyroscopeKey(config.GetPyroscopeConfig(), target)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.GetPyroscopeConfig()` $DIR/integration-tests/reorg/automation_reorg_test.go: `.NewWithOverride(0, defaultAutomationSettings, config.ChainlinkImage, overrideFn)` $DIR/integration-tests/reorg/automation_reorg_test.go: `. New(&environment.Config{ NamespacePrefix: fmt.Sprintf("automation-reorg-%d", reorgBlockCount), TTL: time.Hour * 1, Test: t})` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Sprintf("automation-reorg-%d", reorgBlockCount)` $DIR/integration-tests/reorg/automation_reorg_test.go: `. // Use Geth blockchain to simulate reorgs AddHelm(geth_helm.New(&geth_helm.Props{ NetworkName: network.Name, Simulated: true, WsURLs: network.URLs, }))` $DIR/integration-tests/reorg/automation_reorg_test.go: `.New(&geth_helm.Props{ NetworkName: network.Name, Simulated: true, WsURLs: network.URLs, })` $DIR/integration-tests/reorg/automation_reorg_test.go: `. AddHelm(cd)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Run()` $DIR/integration-tests/reorg/automation_reorg_test.go: `.WillUseRemoteRunner()` $DIR/integration-tests/reorg/automation_reorg_test.go: `.NewRPCClient(gethURL)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.NewEVMClient(network, testEnvironment, l)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.NewContractDeployer(chainClient, l)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.ConnectChainlinkNodes(testEnvironment)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.ParallelTransactions(true)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Cleanup(func() { err := actions.TeardownSuite(t, testEnvironment, chainlinkNodes, nil, zapcore.PanicLevel, &config, chainClient) require.NoError(t, err, "Error tearing down environment") })` $DIR/integration-tests/reorg/automation_reorg_test.go: `.TeardownSuite(t, testEnvironment, chainlinkNodes, nil, zapcore.PanicLevel, &config, chainClient)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.FundChainlinkNodes(chainlinkNodes, chainClient, nodeFundsAmount)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.DeployLinkTokenContract()` $DIR/integration-tests/reorg/automation_reorg_test.go: `.DeployAutoOCRRegistryAndRegistrar( t, registryVersion, defaultOCRRegistryConfig, linkToken, contractDeployer, chainClient, )` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Transfer(registry.Address(), big.NewInt(0).Mul(big.NewInt(1e18), big.NewInt(int64(upkeepCount))))` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Address()` $DIR/integration-tests/reorg/automation_reorg_test.go: `.NewInt(0)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Mul(big.NewInt(1e18), big.NewInt(int64(upkeepCount)))` $DIR/integration-tests/reorg/automation_reorg_test.go: `.NewInt(1e18)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.NewInt(int64(upkeepCount))` $DIR/integration-tests/reorg/automation_reorg_test.go: `.CreateOCRKeeperJobs(t, chainlinkNodes, registry.Address(), network.ChainID, 0, registryVersion)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Address()` $DIR/integration-tests/reorg/automation_reorg_test.go: `.BuildAutoOCR2ConfigVars(t, nodesWithoutBootstrap, defaultOCRRegistryConfig, registrar.Address(), 5*time.Second, registry.ChainModuleAddress(), registry.ReorgProtectionEnabled())` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Address()` $DIR/integration-tests/reorg/automation_reorg_test.go: `.ChainModuleAddress()` $DIR/integration-tests/reorg/automation_reorg_test.go: `.ReorgProtectionEnabled()` $DIR/integration-tests/reorg/automation_reorg_test.go: `.SetConfig(defaultOCRRegistryConfig, ocrConfig)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.SetConfigTypeSafe(ocrConfig)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.DeployConsumers(t, registry, registrar, linkToken, contractDeployer, chainClient, upkeepCount, big.NewInt(defaultLinkFunds), defaultUpkeepGasLimit, isLogTrigger, false)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.NewInt(defaultLinkFunds)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Start()` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Info()` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Int("Consumer index", i)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Msg("Consumer started")` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Info()` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Msg("Waiting for all upkeeps to be performed")` $DIR/integration-tests/reorg/automation_reorg_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 5 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := 5 l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep ID", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64()) } }, "7m", "1s")` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Get(t)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Info()` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Int64("Upkeeps Performed", counter.Int64())` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Int64()` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Int("Upkeep ID", i)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Msg("Number of upkeeps performed")` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Int64()` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64())` $DIR/integration-tests/reorg/automation_reorg_test.go: `.BeNumerically(">=", int64(expect))` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Int64()` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Succeed()` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Info()` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Msg("All upkeeps performed under happy path. Starting reorg")` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Info()` $DIR/integration-tests/reorg/automation_reorg_test.go: `. Str("URL", gethRPCClient.URL)` $DIR/integration-tests/reorg/automation_reorg_test.go: `. Int("BlocksBack", reorgBlockCount)` $DIR/integration-tests/reorg/automation_reorg_test.go: `. Int("FinalityDepth", finalityDepth)` $DIR/integration-tests/reorg/automation_reorg_test.go: `. Int("HistoryDepth", historyDepth)` $DIR/integration-tests/reorg/automation_reorg_test.go: `. Msg("Rewinding blocks on chain below finality depth")` $DIR/integration-tests/reorg/automation_reorg_test.go: `.GethSetHead(reorgBlockCount)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Info()` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Msg("Reorg started. Expecting chain to become unstable and upkeeps to still getting performed")` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they reach 10 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := 10 l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep ID", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64()) } }, "5m", "1s")` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Get(t)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Info()` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Int64("Upkeeps Performed", counter.Int64())` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Int64()` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Int("Upkeep ID", i)` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Msg("Number of upkeeps performed")` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Int64()` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64())` $DIR/integration-tests/reorg/automation_reorg_test.go: `.BeNumerically(">=", int64(expect))` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Int64()` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/reorg/automation_reorg_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `logging.Init()` $DIR/integration-tests/smoke/automation_test.go: `t.Run(name, func(t *testing.T) { t.Parallel() config, err := tc.GetConfig("Smoke", tc.Automation) require.NoError(t, err, "Failed to get config") a := setupAutomationTestDocker( t, registryVersion, automationDefaultRegistryConfig(config), false, false, &config, ) sb, err := a.ChainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") consumers, upkeepIDs := actions_seth.DeployConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, defaultAmountOfUpkeeps, big.NewInt(automationDefaultLinkFunds), automationDefaultUpkeepGasLimit, true, false, ) // Start log trigger based upkeeps for all consumers for i := 0; i < len(consumers); i++ { err := consumers[i].Start() if err != nil { return } } t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() }) l.Info().Msg("Waiting for all upkeeps to perform") gom := gomega.NewGomegaWithT(t) gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := 5 l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep Index", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64()) } }, "5m", "1s").Should(gomega.Succeed()) // ~1m for cluster setup, ~2m for performing each upkeep 5 times, ~2m buffer topic0InBytesMatch := [32]byte{ 61, 83, 163, 149, 80, 224, 70, 136, 6, 88, 39, 243, 187, 134, 88, 76, 176, 7, 171, 158, 188, 167, 235, 213, 40, 231, 48, 28, 156, 49, 235, 93, } // bytes representation of 0x3d53a39550e04688065827f3bb86584cb007ab9ebca7ebd528e7301c9c31eb5d topic0InBytesNoMatch := [32]byte{ 62, 83, 163, 149, 80, 224, 70, 136, 6, 88, 39, 243, 187, 134, 88, 76, 176, 7, 171, 158, 188, 167, 235, 213, 40, 231, 48, 28, 156, 49, 235, 93, } // changed the first byte from 61 to 62 to make it not match bytes0 := [32]byte{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } // bytes representation of 0x0000000000000000000000000000000000000000000000000000000000000000 // Update the trigger config so no upkeeps are triggered for i := 0; i < len(consumers); i++ { upkeepAddr := consumers[i].Address() logTriggerConfigStruct := ac.IAutomationV21PlusCommonLogTriggerConfig{ ContractAddress: common.HexToAddress(upkeepAddr), FilterSelector: 0, Topic0: topic0InBytesNoMatch, Topic1: bytes0, Topic2: bytes0, Topic3: bytes0, } encodedLogTriggerConfig, err := core.CompatibleUtilsABI.Methods["_logTriggerConfig"].Inputs.Pack(&logTriggerConfigStruct) if err != nil { return } err = a.Registry.SetUpkeepTriggerConfig(upkeepIDs[i], encodedLogTriggerConfig) require.NoError(t, err, "Could not set upkeep trigger config at index %d", i) } var countersAfterSetNoMatch = make([]*big.Int, len(upkeepIDs)) // Wait for 10 seconds to let in-flight upkeeps finish time.Sleep(10 * time.Second) for i := 0; i < len(upkeepIDs); i++ { // Obtain the amount of times the upkeep has been executed so far countersAfterSetNoMatch[i], err = consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) l.Info().Int64("Upkeep Count", countersAfterSetNoMatch[i].Int64()).Int("Upkeep Index", i).Msg("Upkeep") } l.Info().Msg("Making sure the counter stays consistent") gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { // Expect the counter to remain constant (At most increase by 2 to account for stale performs) because the upkeep trigger config is not met bufferCount := int64(2) latestCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterSetNoMatch[i].Int64()+bufferCount), "Expected consumer counter to remain less than or equal to %d, but got %d", countersAfterSetNoMatch[i].Int64()+bufferCount, latestCounter.Int64()) } }, "1m", "1s").Should(gomega.Succeed()) // Update the trigger config, so upkeeps start performing again for i := 0; i < len(consumers); i++ { upkeepAddr := consumers[i].Address() logTriggerConfigStruct := ac.IAutomationV21PlusCommonLogTriggerConfig{ ContractAddress: common.HexToAddress(upkeepAddr), FilterSelector: 0, Topic0: topic0InBytesMatch, Topic1: bytes0, Topic2: bytes0, Topic3: bytes0, } encodedLogTriggerConfig, err := core.CompatibleUtilsABI.Methods["_logTriggerConfig"].Inputs.Pack(&logTriggerConfigStruct) if err != nil { return } err = a.Registry.SetUpkeepTriggerConfig(upkeepIDs[i], encodedLogTriggerConfig) require.NoError(t, err, "Could not set upkeep trigger config at index %d", i) } var countersAfterSetMatch = make([]*big.Int, len(upkeepIDs)) for i := 0; i < len(upkeepIDs); i++ { // Obtain the amount of times the upkeep has been executed so far countersAfterSetMatch[i], err = consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) l.Info().Int64("Upkeep Count", countersAfterSetMatch[i].Int64()).Int("Upkeep Index", i).Msg("Upkeep") } // Wait for 30 seconds to make sure backend is ready time.Sleep(30 * time.Second) // Start the consumers again for i := 0; i < len(consumers); i++ { err := consumers[i].Start() if err != nil { return } } l.Info().Msg("Making sure the counter starts increasing again") gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := int64(5) l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep Index", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", countersAfterSetMatch[i].Int64()+expect), "Expected consumer counter to be greater than %d, but got %d", countersAfterSetMatch[i].Int64()+expect, counter.Int64()) } }, "5m", "1s").Should(gomega.Succeed()) // ~1m for cluster setup, ~2m for performing each upkeep 5 times, ~2m buffer })` $DIR/integration-tests/smoke/automation_test.go: `t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() })` $DIR/integration-tests/smoke/automation_test.go: `actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)()` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Msg("Waiting for all upkeeps to perform")` $DIR/integration-tests/smoke/automation_test.go: `gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := 5 l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep Index", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64()) } }, "5m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep Index", i).Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `err = a.Registry.SetUpkeepTriggerConfig(upkeepIDs[i], encodedLogTriggerConfig)` $DIR/integration-tests/smoke/automation_test.go: `time.Sleep(10 * time.Second)` $DIR/integration-tests/smoke/automation_test.go: `countersAfterSetNoMatch[i], err = consumers[i].Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Int64("Upkeep Count", countersAfterSetNoMatch[i].Int64()).Int("Upkeep Index", i).Msg("Upkeep")` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Msg("Making sure the counter stays consistent")` $DIR/integration-tests/smoke/automation_test.go: `gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { // Expect the counter to remain constant (At most increase by 2 to account for stale performs) because the upkeep trigger config is not met bufferCount := int64(2) latestCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterSetNoMatch[i].Int64()+bufferCount), "Expected consumer counter to remain less than or equal to %d, but got %d", countersAfterSetNoMatch[i].Int64()+bufferCount, latestCounter.Int64()) } }, "1m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterSetNoMatch[i].Int64()+bufferCount), "Expected consumer counter to remain less than or equal to %d, but got %d", countersAfterSetNoMatch[i].Int64()+bufferCount, latestCounter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `err = a.Registry.SetUpkeepTriggerConfig(upkeepIDs[i], encodedLogTriggerConfig)` $DIR/integration-tests/smoke/automation_test.go: `countersAfterSetMatch[i], err = consumers[i].Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Int64("Upkeep Count", countersAfterSetMatch[i].Int64()).Int("Upkeep Index", i).Msg("Upkeep")` $DIR/integration-tests/smoke/automation_test.go: `time.Sleep(30 * time.Second)` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Msg("Making sure the counter starts increasing again")` $DIR/integration-tests/smoke/automation_test.go: `gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := int64(5) l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep Index", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", countersAfterSetMatch[i].Int64()+expect), "Expected consumer counter to be greater than %d, but got %d", countersAfterSetMatch[i].Int64()+expect, counter.Int64()) } }, "5m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep Index", i).Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", countersAfterSetMatch[i].Int64()+expect), "Expected consumer counter to be greater than %d, but got %d", countersAfterSetMatch[i].Int64()+expect, counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `t.Run(name, func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Automation) require.NoError(t, err, "Failed to get config") a := setupAutomationTestDocker( t, registryVersion, automationDefaultRegistryConfig(config), false, false, &config, ) sb, err := a.ChainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") consumers, upkeepIDs := actions_seth.DeployConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, defaultAmountOfUpkeeps, big.NewInt(1), automationDefaultUpkeepGasLimit, false, false, ) t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() }) l.Info().Msg("Making sure for 2m no upkeeps are performed") gom := gomega.NewGomegaWithT(t) // Since the upkeep is currently underfunded, check that it doesn't get executed gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(counter.Int64()).Should(gomega.Equal(int64(0)), "Expected consumer counter to remain zero, but got %d", counter.Int64()) } }, "2m", "1s").Should(gomega.Succeed()) // ~1m for setup, 1m assertion // Grant permission to the registry to fund the upkeep err = a.LinkToken.Approve(a.Registry.Address(), big.NewInt(0).Mul(big.NewInt(9e18), big.NewInt(int64(len(upkeepIDs))))) require.NoError(t, err, "Could not approve permissions for the registry on the link token contract") l.Info().Msg("Adding funds to the upkeeps") for i := 0; i < len(upkeepIDs); i++ { // Add funds to the upkeep whose ID we know from above err = a.Registry.AddUpkeepFunds(upkeepIDs[i], big.NewInt(9e18)) require.NoError(t, err, "Unable to add upkeep") } l.Info().Msg("Waiting for 2m for all contracts to perform at least one upkeep") // Now the new upkeep should be performing because we added enough funds gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[0].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64()) } }, "2m", "1s").Should(gomega.Succeed()) // ~1m for setup, 1m assertion })` $DIR/integration-tests/smoke/automation_test.go: `t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() })` $DIR/integration-tests/smoke/automation_test.go: `actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)()` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Msg("Making sure for 2m no upkeeps are performed")` $DIR/integration-tests/smoke/automation_test.go: `gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(counter.Int64()).Should(gomega.Equal(int64(0)), "Expected consumer counter to remain zero, but got %d", counter.Int64()) } }, "2m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(counter.Int64()).Should(gomega.Equal(int64(0)), "Expected consumer counter to remain zero, but got %d", counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `err = a.LinkToken.Approve(a.Registry.Address(), big.NewInt(0).Mul(big.NewInt(9e18), big.NewInt(int64(len(upkeepIDs)))))` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Msg("Adding funds to the upkeeps")` $DIR/integration-tests/smoke/automation_test.go: `err = a.Registry.AddUpkeepFunds(upkeepIDs[i], big.NewInt(9e18))` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Msg("Waiting for 2m for all contracts to perform at least one upkeep")` $DIR/integration-tests/smoke/automation_test.go: `gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[0].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64()) } }, "2m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `t.Run(name, func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Automation) require.NoError(t, err, "Failed to get config") a := setupAutomationTestDocker( t, registryVersion, automationDefaultRegistryConfig(config), false, false, &config, ) sb, err := a.ChainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") consumers, upkeepIDs := actions_seth.DeployConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, defaultAmountOfUpkeeps, big.NewInt(automationDefaultLinkFunds), automationDefaultUpkeepGasLimit, false, false, ) t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() }) gom := gomega.NewGomegaWithT(t) gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 5 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(5)), "Expected consumer counter to be greater than 5, but got %d", counter.Int64()) l.Info().Int("Upkeep Index", i).Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed") } }, "5m", "1s").Should(gomega.Succeed()) // ~1m for cluster setup, ~2m for performing each upkeep 5 times, ~2m buffer // pause all the registered upkeeps via the registry for i := 0; i < len(upkeepIDs); i++ { err := a.Registry.PauseUpkeep(upkeepIDs[i]) require.NoError(t, err, "Could not pause upkeep at index %d", i) } var countersAfterPause = make([]*big.Int, len(upkeepIDs)) for i := 0; i < len(upkeepIDs); i++ { // Obtain the amount of times the upkeep has been executed so far countersAfterPause[i], err = consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) l.Info().Int("Upkeep Index", i).Int64("Upkeeps Performed", countersAfterPause[i].Int64()).Msg("Paused Upkeep") } gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { // In most cases counters should remain constant, but there might be a straggling perform tx which // gets committed later and increases counter by 1 latestCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterPause[i].Int64()+1), "Expected consumer counter not have increased more than %d, but got %d", countersAfterPause[i].Int64()+1, latestCounter.Int64()) } }, "1m", "1s").Should(gomega.Succeed()) // unpause all the registered upkeeps via the registry for i := 0; i < len(upkeepIDs); i++ { err := a.Registry.UnpauseUpkeep(upkeepIDs[i]) require.NoError(t, err, "Could not unpause upkeep at index %d", i) } gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analysing their counters and checking they are greater than 5 + numbers of performing before pause for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", countersAfterPause[i].Int64()+1), "Expected consumer counter to be greater than %d, but got %d", countersAfterPause[i].Int64()+1, counter.Int64()) l.Info().Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed") } }, "2m", "1s").Should(gomega.Succeed()) // ~1m to perform, 1m buffer })` $DIR/integration-tests/smoke/automation_test.go: `t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() })` $DIR/integration-tests/smoke/automation_test.go: `actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)()` $DIR/integration-tests/smoke/automation_test.go: `gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 5 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(5)), "Expected consumer counter to be greater than 5, but got %d", counter.Int64()) l.Info().Int("Upkeep Index", i).Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed") } }, "5m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(5)), "Expected consumer counter to be greater than 5, but got %d", counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Int("Upkeep Index", i).Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/automation_test.go: `countersAfterPause[i], err = consumers[i].Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Int("Upkeep Index", i).Int64("Upkeeps Performed", countersAfterPause[i].Int64()).Msg("Paused Upkeep")` $DIR/integration-tests/smoke/automation_test.go: `gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { // In most cases counters should remain constant, but there might be a straggling perform tx which // gets committed later and increases counter by 1 latestCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterPause[i].Int64()+1), "Expected consumer counter not have increased more than %d, but got %d", countersAfterPause[i].Int64()+1, latestCounter.Int64()) } }, "1m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterPause[i].Int64()+1), "Expected consumer counter not have increased more than %d, but got %d", countersAfterPause[i].Int64()+1, latestCounter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analysing their counters and checking they are greater than 5 + numbers of performing before pause for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", countersAfterPause[i].Int64()+1), "Expected consumer counter to be greater than %d, but got %d", countersAfterPause[i].Int64()+1, counter.Int64()) l.Info().Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed") } }, "2m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", countersAfterPause[i].Int64()+1), "Expected consumer counter to be greater than %d, but got %d", countersAfterPause[i].Int64()+1, counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/automation_test.go: `t.Run(name, func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Automation) require.NoError(t, err, "Failed to get config") a := setupAutomationTestDocker( t, registryVersion, automationDefaultRegistryConfig(config), false, false, &config, ) sb, err := a.ChainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") consumers, upkeepIDs := actions_seth.DeployConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, defaultAmountOfUpkeeps, big.NewInt(automationDefaultLinkFunds), automationDefaultUpkeepGasLimit, false, false, ) t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() }) var initialCounters = make([]*big.Int, len(upkeepIDs)) gom := gomega.NewGomegaWithT(t) // Observe that the upkeeps which are initially registered are performing and // store the value of their initial counters in order to compare later on that the value increased. gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) initialCounters[i] = counter g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64()) l.Info(). Int64("Upkeep counter", counter.Int64()). Int64("Upkeep index", int64(i)). Msg("Number of upkeeps performed") } }, "4m", "1s").Should(gomega.Succeed()) // ~1m for cluster setup, ~1m for performing each upkeep once, ~2m buffer newConsumers, _ := actions_seth.RegisterNewUpkeeps(t, a.ChainClient, a.LinkToken, a.Registry, a.Registrar, automationDefaultUpkeepGasLimit, 1) // We know that newConsumers has size 1, so we can just use the newly registered upkeep. newUpkeep := newConsumers[0] // Test that the newly registered upkeep is also performing. gom.Eventually(func(g gomega.Gomega) { counter, err := newUpkeep.Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling newly deployed upkeep's counter shouldn't fail") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected newly registered upkeep's counter to be greater than 0, but got %d", counter.Int64()) l.Info().Int64("Upkeeps Performed", counter.Int64()).Msg("Newly Registered Upkeep") }, "2m", "1s").Should(gomega.Succeed()) // ~1m for upkeep to perform, 1m buffer gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { currentCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") l.Info(). Int64("Upkeep index", int64(i)). Int64("Upkeep counter", currentCounter.Int64()). Int64("initial counter", initialCounters[i].Int64()). Msg("Number of upkeeps performed") g.Expect(currentCounter.Int64()).Should(gomega.BeNumerically(">", initialCounters[i].Int64()), "Expected counter to have increased from initial value of %s, but got %s", initialCounters[i], currentCounter) } }, "2m", "1s").Should(gomega.Succeed()) // ~1m for upkeeps to perform, 1m buffer })` $DIR/integration-tests/smoke/automation_test.go: `t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() })` $DIR/integration-tests/smoke/automation_test.go: `actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)()` $DIR/integration-tests/smoke/automation_test.go: `gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) initialCounters[i] = counter g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64()) l.Info(). Int64("Upkeep counter", counter.Int64()). Int64("Upkeep index", int64(i)). Msg("Number of upkeeps performed") } }, "4m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `initialCounters[i] = counter` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `l.Info(). Int64("Upkeep counter", counter.Int64()). Int64("Upkeep index", int64(i)). Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/automation_test.go: `gom.Eventually(func(g gomega.Gomega) { counter, err := newUpkeep.Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling newly deployed upkeep's counter shouldn't fail") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected newly registered upkeep's counter to be greater than 0, but got %d", counter.Int64()) l.Info().Int64("Upkeeps Performed", counter.Int64()).Msg("Newly Registered Upkeep") }, "2m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling newly deployed upkeep's counter shouldn't fail")` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected newly registered upkeep's counter to be greater than 0, but got %d", counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Int64("Upkeeps Performed", counter.Int64()).Msg("Newly Registered Upkeep")` $DIR/integration-tests/smoke/automation_test.go: `gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { currentCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") l.Info(). Int64("Upkeep index", int64(i)). Int64("Upkeep counter", currentCounter.Int64()). Int64("initial counter", initialCounters[i].Int64()). Msg("Number of upkeeps performed") g.Expect(currentCounter.Int64()).Should(gomega.BeNumerically(">", initialCounters[i].Int64()), "Expected counter to have increased from initial value of %s, but got %s", initialCounters[i], currentCounter) } }, "2m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/automation_test.go: `l.Info(). Int64("Upkeep index", int64(i)). Int64("Upkeep counter", currentCounter.Int64()). Int64("initial counter", initialCounters[i].Int64()). Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(currentCounter.Int64()).Should(gomega.BeNumerically(">", initialCounters[i].Int64()), "Expected counter to have increased from initial value of %s, but got %s", initialCounters[i], currentCounter)` $DIR/integration-tests/smoke/automation_test.go: `t.Run(name, func(t *testing.T) { t.Parallel() config, err := tc.GetConfig("Smoke", tc.Automation) require.NoError(t, err, "Failed to get config") a := setupAutomationTestDocker( t, registryVersion, automationDefaultRegistryConfig(config), false, false, &config, ) sb, err := a.ChainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") consumers, upkeepIDs := actions_seth.DeployConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, defaultAmountOfUpkeeps, big.NewInt(automationDefaultLinkFunds), automationDefaultUpkeepGasLimit, false, false, ) t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() }) gom := gomega.NewGomegaWithT(t) // Observe that the upkeeps which are initially registered are performing gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d") } }, "4m", "1s").Should(gomega.Succeed()) // ~1m for cluster setup, ~1m for performing each upkeep once, ~2m buffer // Pause the registry err = a.Registry.Pause() require.NoError(t, err, "Error pausing registry") // Store how many times each upkeep performed once the registry was successfully paused var countersAfterPause = make([]*big.Int, len(upkeepIDs)) for i := 0; i < len(upkeepIDs); i++ { countersAfterPause[i], err = consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) } // After we paused the registry, the counters of all the upkeeps should stay constant // because they are no longer getting serviced gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { latestCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.Equal(countersAfterPause[i].Int64()), "Expected consumer counter to remain constant at %d, but got %d", countersAfterPause[i].Int64(), latestCounter.Int64()) } }, "1m", "1s").Should(gomega.Succeed()) })` $DIR/integration-tests/smoke/automation_test.go: `t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() })` $DIR/integration-tests/smoke/automation_test.go: `actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)()` $DIR/integration-tests/smoke/automation_test.go: `gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d") } }, "4m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d")` $DIR/integration-tests/smoke/automation_test.go: `err = a.Registry.Pause()` $DIR/integration-tests/smoke/automation_test.go: `countersAfterPause[i], err = consumers[i].Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { latestCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.Equal(countersAfterPause[i].Int64()), "Expected consumer counter to remain constant at %d, but got %d", countersAfterPause[i].Int64(), latestCounter.Int64()) } }, "1m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(latestCounter.Int64()).Should(gomega.Equal(countersAfterPause[i].Int64()), "Expected consumer counter to remain constant at %d, but got %d", countersAfterPause[i].Int64(), latestCounter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `t.Run(name, func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Automation) require.NoError(t, err, "Failed to get config") a := setupAutomationTestDocker( t, registryVersion, automationDefaultRegistryConfig(config), false, false, &config, ) sb, err := a.ChainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") consumers, upkeepIDs := actions_seth.DeployConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, defaultAmountOfUpkeeps, big.NewInt(automationDefaultLinkFunds), automationDefaultUpkeepGasLimit, false, false, ) t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() }) gom := gomega.NewGomegaWithT(t) nodesWithoutBootstrap := a.ChainlinkNodes[1:] var initialCounters = make([]*big.Int, len(upkeepIDs)) // Watch upkeeps being performed and store their counters in order to compare them later in the test gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) initialCounters[i] = counter l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep Index", i).Msg("Number of upkeeps performed") g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64()) } }, "4m", "1s").Should(gomega.Succeed()) // ~1m for cluster setup, ~1m for performing each upkeep once, ~2m buffer // Take down 1 node. Currently, using 4 nodes so f=1 and is the max nodes that can go down. err = nodesWithoutBootstrap[0].MustDeleteJob("1") require.NoError(t, err, "Error deleting job from Chainlink node") l.Info().Msg("Successfully managed to take down the first half of the nodes") // Assert that upkeeps are still performed and their counters have increased gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { currentCounter, err := consumers[i].Counter(testcontext.Get(t)) l.Info().Int64("Upkeeps Performed", currentCounter.Int64()).Int("Upkeep Index", i).Msg("Number of upkeeps performed") g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(currentCounter.Int64()).Should(gomega.BeNumerically(">", initialCounters[i].Int64()), "Expected counter to have increased from initial value of %s, but got %s", initialCounters[i], currentCounter) } }, "2m", "1s").Should(gomega.Succeed()) // ~1m for each upkeep to perform once, 1m buffer // Take down the rest restOfNodesDown := nodesWithoutBootstrap[1:] for _, nodeToTakeDown := range restOfNodesDown { err = nodeToTakeDown.MustDeleteJob("1") require.NoError(t, err, "Error deleting job from Chainlink node") } l.Info().Msg("Successfully managed to take down the second half of the nodes") // See how many times each upkeep was executed var countersAfterNoMoreNodes = make([]*big.Int, len(upkeepIDs)) for i := 0; i < len(upkeepIDs); i++ { countersAfterNoMoreNodes[i], err = consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) l.Info().Int("Upkeep Index", i).Int64("Performed", countersAfterNoMoreNodes[i].Int64()).Msg("Upkeeps Performed") } // Once all the nodes are taken down, there might be some straggling transactions which went through before // all the nodes were taken down gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { latestCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterNoMoreNodes[i].Int64()+1), "Expected consumer counter to not have increased more than %d, but got %d", countersAfterNoMoreNodes[i].Int64()+1, latestCounter.Int64()) } }, "2m", "1s").Should(gomega.Succeed()) })` $DIR/integration-tests/smoke/automation_test.go: `t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() })` $DIR/integration-tests/smoke/automation_test.go: `actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)()` $DIR/integration-tests/smoke/automation_test.go: `gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) initialCounters[i] = counter l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep Index", i).Msg("Number of upkeeps performed") g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64()) } }, "4m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `initialCounters[i] = counter` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep Index", i).Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `err = nodesWithoutBootstrap[0].MustDeleteJob("1")` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Msg("Successfully managed to take down the first half of the nodes")` $DIR/integration-tests/smoke/automation_test.go: `gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { currentCounter, err := consumers[i].Counter(testcontext.Get(t)) l.Info().Int64("Upkeeps Performed", currentCounter.Int64()).Int("Upkeep Index", i).Msg("Number of upkeeps performed") g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(currentCounter.Int64()).Should(gomega.BeNumerically(">", initialCounters[i].Int64()), "Expected counter to have increased from initial value of %s, but got %s", initialCounters[i], currentCounter) } }, "2m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Int64("Upkeeps Performed", currentCounter.Int64()).Int("Upkeep Index", i).Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(currentCounter.Int64()).Should(gomega.BeNumerically(">", initialCounters[i].Int64()), "Expected counter to have increased from initial value of %s, but got %s", initialCounters[i], currentCounter)` $DIR/integration-tests/smoke/automation_test.go: `err = nodeToTakeDown.MustDeleteJob("1")` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Msg("Successfully managed to take down the second half of the nodes")` $DIR/integration-tests/smoke/automation_test.go: `countersAfterNoMoreNodes[i], err = consumers[i].Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Int("Upkeep Index", i).Int64("Performed", countersAfterNoMoreNodes[i].Int64()).Msg("Upkeeps Performed")` $DIR/integration-tests/smoke/automation_test.go: `gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { latestCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterNoMoreNodes[i].Int64()+1), "Expected consumer counter to not have increased more than %d, but got %d", countersAfterNoMoreNodes[i].Int64()+1, latestCounter.Int64()) } }, "2m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterNoMoreNodes[i].Int64()+1), "Expected consumer counter to not have increased more than %d, but got %d", countersAfterNoMoreNodes[i].Int64()+1, latestCounter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `t.Run(name, func(t *testing.T) { t.Parallel() config, err := tc.GetConfig("Smoke", tc.Automation) require.NoError(t, err, "Failed to get config") a := setupAutomationTestDocker( t, registryVersion, automationDefaultRegistryConfig(config), false, false, &config, ) sb, err := a.ChainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") consumersPerformance, _ := actions_seth.DeployPerformanceConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, defaultAmountOfUpkeeps, big.NewInt(automationDefaultLinkFunds), automationDefaultUpkeepGasLimit, 10000, // How many blocks this upkeep will be eligible from first upkeep block 5, // Interval of blocks that upkeeps are expected to be performed 100000, // How much gas should be burned on checkUpkeep() calls 4000000, // How much gas should be burned on performUpkeep() calls. Initially set higher than defaultUpkeepGasLimit ) t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() }) gom := gomega.NewGomegaWithT(t) consumerPerformance := consumersPerformance[0] // Initially performGas is set high, so performUpkeep reverts and no upkeep should be performed gom.Consistently(func(g gomega.Gomega) { // Consumer count should remain at 0 cnt, err := consumerPerformance.GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail") g.Expect(cnt.Int64()).Should(gomega.Equal(int64(0)), "Expected consumer counter to remain constant at %d, but got %d", 0, cnt.Int64(), ) }, "2m", "1s").Should(gomega.Succeed()) // ~1m for setup, 1m assertion // Set performGas on consumer to be low, so that performUpkeep starts becoming successful err = consumerPerformance.SetPerformGasToBurn(testcontext.Get(t), big.NewInt(100000)) require.NoError(t, err, "Perform gas should be set successfully on consumer") // Upkeep should now start performing gom.Eventually(func(g gomega.Gomega) { cnt, err := consumerPerformance.GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail") g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", cnt.Int64(), ) }, "2m", "1s").Should(gomega.Succeed()) // ~1m to perform once, 1m buffer })` $DIR/integration-tests/smoke/automation_test.go: `t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() })` $DIR/integration-tests/smoke/automation_test.go: `actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)()` $DIR/integration-tests/smoke/automation_test.go: `gom.Consistently(func(g gomega.Gomega) { // Consumer count should remain at 0 cnt, err := consumerPerformance.GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail") g.Expect(cnt.Int64()).Should(gomega.Equal(int64(0)), "Expected consumer counter to remain constant at %d, but got %d", 0, cnt.Int64(), ) }, "2m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail")` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(cnt.Int64()).Should(gomega.Equal(int64(0)), "Expected consumer counter to remain constant at %d, but got %d", 0, cnt.Int64(), )` $DIR/integration-tests/smoke/automation_test.go: `err = consumerPerformance.SetPerformGasToBurn(testcontext.Get(t), big.NewInt(100000))` $DIR/integration-tests/smoke/automation_test.go: `gom.Eventually(func(g gomega.Gomega) { cnt, err := consumerPerformance.GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail") g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", cnt.Int64(), ) }, "2m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail")` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", cnt.Int64(), )` $DIR/integration-tests/smoke/automation_test.go: `t.Run(name, func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Automation) require.NoError(t, err, "Failed to get config") a := setupAutomationTestDocker( t, registryVersion, automationDefaultRegistryConfig(config), false, false, &config, ) sb, err := a.ChainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") consumersPerformance, upkeepIDs := actions_seth.DeployPerformanceConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, 1, // It was impossible to investigate, why with multiple outputs it fails ONLY in CI and only for 2.1 and 2.2 versions big.NewInt(automationDefaultLinkFunds), automationDefaultUpkeepGasLimit, 10000, // How many blocks this upkeep will be eligible from first upkeep block 5, // Interval of blocks that upkeeps are expected to be performed 100000, // How much gas should be burned on checkUpkeep() calls 4000000, // How much gas should be burned on performUpkeep() calls. Initially set higher than defaultUpkeepGasLimit ) t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() }) gom := gomega.NewGomegaWithT(t) nodesWithoutBootstrap := a.ChainlinkNodes[1:] // Initially performGas is set higher than defaultUpkeepGasLimit, so no upkeep should be performed l.Info().Msg("Making sure for 2m no upkeeps are performed") gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(cnt.Int64()).Should( gomega.Equal(int64(0)), "Expected consumer counter to remain constant at %d, but got %d", 0, cnt.Int64(), ) } }, "2m", "1s").Should(gomega.Succeed()) // ~1m for setup, 1m assertion // Increase gas limit for the upkeep, higher than the performGasBurn l.Info().Msg("Increasing gas limit for upkeeps") for i := 0; i < len(upkeepIDs); i++ { err = a.Registry.SetUpkeepGasLimit(upkeepIDs[i], uint32(4500000)) require.NoError(t, err, "Error setting upkeep gas limit") } // Upkeep should now start performing l.Info().Msg("Waiting for 4m for all contracts to perform at least one upkeep after gas limit increase") gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") l.Info().Int("Upkeep index", i).Int64("Upkeep counter", cnt.Int64()).Msg("Number of upkeeps performed") g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", cnt.Int64(), ) } }, "4m", "1s").Should(gomega.Succeed()) // ~1m to perform once, 1m buffer // Now increase the checkGasBurn on consumer, upkeep should stop performing l.Info().Msg("Increasing check gas to burn for upkeeps") for i := 0; i < len(upkeepIDs); i++ { err = consumersPerformance[i].SetCheckGasToBurn(testcontext.Get(t), big.NewInt(3000000)) require.NoError(t, err, "Check gas burn should be set successfully on consumer") } countPerID := make(map[*big.Int]*big.Int) // Get existing performed count l.Info().Msg("Getting existing performed count") for i := 0; i < len(upkeepIDs); i++ { existingCnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) require.NoError(t, err, "Calling consumer's counter shouldn't fail") l.Info(). Str("UpkeepID", upkeepIDs[i].String()). Int64("Upkeep counter", existingCnt.Int64()). Msg("Upkeep counter when check gas increased") countPerID[upkeepIDs[i]] = existingCnt } // In most cases count should remain constant, but it might increase by upto 1 due to pending perform l.Info().Msg("Waiting for 1m for all contracts to make sure they perform at maximum 1 upkeep") gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") existingCnt := countPerID[upkeepIDs[i]] g.Expect(cnt.Int64()).Should( gomega.BeNumerically("<=", existingCnt.Int64()+1), "Expected consumer counter to remain less than equal %d, but got %d", existingCnt.Int64()+1, cnt.Int64(), ) } }, "1m", "1s").Should(gomega.Succeed()) l.Info().Msg("Getting existing performed count") for i := 0; i < len(upkeepIDs); i++ { existingCnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) require.NoError(t, err, "Calling consumer's counter shouldn't fail") l.Info(). Str("UpkeepID", upkeepIDs[i].String()). Int64("Upkeep counter", existingCnt.Int64()).Msg("Upkeep counter when consistently block finished") countPerID[upkeepIDs[i]] = existingCnt } // Now increase checkGasLimit on registry highCheckGasLimit := automationDefaultRegistryConfig(config) highCheckGasLimit.CheckGasLimit = uint32(5000000) highCheckGasLimit.RegistryVersion = registryVersion ocrConfig, err := actions.BuildAutoOCR2ConfigVarsLocal(l, nodesWithoutBootstrap, highCheckGasLimit, a.Registrar.Address(), 30*time.Second, a.Registry.RegistryOwnerAddress(), a.Registry.ChainModuleAddress(), a.Registry.ReorgProtectionEnabled()) require.NoError(t, err, "Error building OCR config") if a.RegistrySettings.RegistryVersion == ethereum.RegistryVersion_2_0 { err = a.Registry.SetConfig(highCheckGasLimit, ocrConfig) } else { err = a.Registry.SetConfigTypeSafe(ocrConfig) } require.NoError(t, err, "Registry config should be set successfully!") l.Info().Msg("Waiting for 3m for all contracts to make sure they perform at maximum 1 upkeep after check gas limit increase") // Upkeep should start performing again, and it should get regularly performed gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail") existingCnt := countPerID[upkeepIDs[i]] g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", existingCnt.Int64()), "Expected consumer counter to be greater than %d, but got %d", existingCnt.Int64(), cnt.Int64(), ) } }, "3m", "1s").Should(gomega.Succeed()) // ~1m to setup cluster, 1m to perform once, 1m buffer })` $DIR/integration-tests/smoke/automation_test.go: `t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() })` $DIR/integration-tests/smoke/automation_test.go: `actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)()` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Msg("Making sure for 2m no upkeeps are performed")` $DIR/integration-tests/smoke/automation_test.go: `gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(cnt.Int64()).Should( gomega.Equal(int64(0)), "Expected consumer counter to remain constant at %d, but got %d", 0, cnt.Int64(), ) } }, "2m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(cnt.Int64()).Should( gomega.Equal(int64(0)), "Expected consumer counter to remain constant at %d, but got %d", 0, cnt.Int64(), )` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Msg("Increasing gas limit for upkeeps")` $DIR/integration-tests/smoke/automation_test.go: `err = a.Registry.SetUpkeepGasLimit(upkeepIDs[i], uint32(4500000))` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Msg("Waiting for 4m for all contracts to perform at least one upkeep after gas limit increase")` $DIR/integration-tests/smoke/automation_test.go: `gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") l.Info().Int("Upkeep index", i).Int64("Upkeep counter", cnt.Int64()).Msg("Number of upkeeps performed") g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", cnt.Int64(), ) } }, "4m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Int("Upkeep index", i).Int64("Upkeep counter", cnt.Int64()).Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", cnt.Int64(), )` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Msg("Increasing check gas to burn for upkeeps")` $DIR/integration-tests/smoke/automation_test.go: `err = consumersPerformance[i].SetCheckGasToBurn(testcontext.Get(t), big.NewInt(3000000))` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Msg("Getting existing performed count")` $DIR/integration-tests/smoke/automation_test.go: `l.Info(). Str("UpkeepID", upkeepIDs[i].String()). Int64("Upkeep counter", existingCnt.Int64()). Msg("Upkeep counter when check gas increased")` $DIR/integration-tests/smoke/automation_test.go: `countPerID[upkeepIDs[i]] = existingCnt` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Msg("Waiting for 1m for all contracts to make sure they perform at maximum 1 upkeep")` $DIR/integration-tests/smoke/automation_test.go: `gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") existingCnt := countPerID[upkeepIDs[i]] g.Expect(cnt.Int64()).Should( gomega.BeNumerically("<=", existingCnt.Int64()+1), "Expected consumer counter to remain less than equal %d, but got %d", existingCnt.Int64()+1, cnt.Int64(), ) } }, "1m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(cnt.Int64()).Should( gomega.BeNumerically("<=", existingCnt.Int64()+1), "Expected consumer counter to remain less than equal %d, but got %d", existingCnt.Int64()+1, cnt.Int64(), )` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Msg("Getting existing performed count")` $DIR/integration-tests/smoke/automation_test.go: `l.Info(). Str("UpkeepID", upkeepIDs[i].String()). Int64("Upkeep counter", existingCnt.Int64()).Msg("Upkeep counter when consistently block finished")` $DIR/integration-tests/smoke/automation_test.go: `countPerID[upkeepIDs[i]] = existingCnt` $DIR/integration-tests/smoke/automation_test.go: `highCheckGasLimit.CheckGasLimit = uint32(5000000)` $DIR/integration-tests/smoke/automation_test.go: `highCheckGasLimit.RegistryVersion = registryVersion` $DIR/integration-tests/smoke/automation_test.go: `err = a.Registry.SetConfig(highCheckGasLimit, ocrConfig)` $DIR/integration-tests/smoke/automation_test.go: `err = a.Registry.SetConfigTypeSafe(ocrConfig)` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Msg("Waiting for 3m for all contracts to make sure they perform at maximum 1 upkeep after check gas limit increase")` $DIR/integration-tests/smoke/automation_test.go: `gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail") existingCnt := countPerID[upkeepIDs[i]] g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", existingCnt.Int64()), "Expected consumer counter to be greater than %d, but got %d", existingCnt.Int64(), cnt.Int64(), ) } }, "3m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail")` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", existingCnt.Int64()), "Expected consumer counter to be greater than %d, but got %d", existingCnt.Int64(), cnt.Int64(), )` $DIR/integration-tests/smoke/automation_test.go: `t.Run(name, func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Automation) require.NoError(t, err, "Failed to get config") a := setupAutomationTestDocker( t, registryVersion, automationDefaultRegistryConfig(config), false, false, &config, ) sb, err := a.ChainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") performDataChecker, upkeepIDs := actions_seth.DeployPerformDataCheckerConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, defaultAmountOfUpkeeps, big.NewInt(automationDefaultLinkFunds), automationDefaultUpkeepGasLimit, []byte(automationExpectedData), ) t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() }) gom := gomega.NewGomegaWithT(t) gom.Consistently(func(g gomega.Gomega) { // expect the counter to remain 0 because perform data does not match for i := 0; i < len(upkeepIDs); i++ { counter, err := performDataChecker[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve perform data checker"+ " for upkeep at index "+strconv.Itoa(i)) g.Expect(counter.Int64()).Should(gomega.Equal(int64(0)), "Expected perform data checker counter to be 0, but got %d", counter.Int64()) l.Info().Int64("Upkeep perform data checker", counter.Int64()).Msg("Number of upkeeps performed") } }, "2m", "1s").Should(gomega.Succeed()) // ~1m for setup, 1m assertion for i := 0; i < len(upkeepIDs); i++ { err := a.Registry.UpdateCheckData(upkeepIDs[i], []byte(automationExpectedData)) require.NoError(t, err, "Could not update check data for upkeep at index %d", i) } // retrieve new check data for all upkeeps for i := 0; i < len(upkeepIDs); i++ { upkeep, err := a.Registry.GetUpkeepInfo(testcontext.Get(t), upkeepIDs[i]) require.NoError(t, err, "Failed to get upkeep info at index %d", i) require.Equal(t, []byte(automationExpectedData), upkeep.CheckData, "Upkeep data not as expected") } gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analysing their counters and checking they are greater than 5 for i := 0; i < len(upkeepIDs); i++ { counter, err := performDataChecker[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve perform data checker counter"+ " for upkeep at index "+strconv.Itoa(i)) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected perform data checker counter to be greater than 0, but got %d", counter.Int64()) l.Info().Int64("Upkeep perform data checker", counter.Int64()).Msg("Number of upkeeps performed") } }, "2m", "1s").Should(gomega.Succeed()) // ~1m to perform once, 1m buffer })` $DIR/integration-tests/smoke/automation_test.go: `t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() })` $DIR/integration-tests/smoke/automation_test.go: `actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)()` $DIR/integration-tests/smoke/automation_test.go: `gom.Consistently(func(g gomega.Gomega) { // expect the counter to remain 0 because perform data does not match for i := 0; i < len(upkeepIDs); i++ { counter, err := performDataChecker[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve perform data checker"+ " for upkeep at index "+strconv.Itoa(i)) g.Expect(counter.Int64()).Should(gomega.Equal(int64(0)), "Expected perform data checker counter to be 0, but got %d", counter.Int64()) l.Info().Int64("Upkeep perform data checker", counter.Int64()).Msg("Number of upkeeps performed") } }, "2m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve perform data checker"+ " for upkeep at index "+strconv.Itoa(i))` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(counter.Int64()).Should(gomega.Equal(int64(0)), "Expected perform data checker counter to be 0, but got %d", counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Int64("Upkeep perform data checker", counter.Int64()).Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/automation_test.go: `gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analysing their counters and checking they are greater than 5 for i := 0; i < len(upkeepIDs); i++ { counter, err := performDataChecker[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve perform data checker counter"+ " for upkeep at index "+strconv.Itoa(i)) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected perform data checker counter to be greater than 0, but got %d", counter.Int64()) l.Info().Int64("Upkeep perform data checker", counter.Int64()).Msg("Number of upkeeps performed") } }, "2m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve perform data checker counter"+ " for upkeep at index "+strconv.Itoa(i))` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected perform data checker counter to be greater than 0, but got %d", counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Int64("Upkeep perform data checker", counter.Int64()).Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/automation_test.go: `t.Run(name, func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Automation) if err != nil { t.Fatal(err) } a := setupAutomationTestDocker( t, registryVersion, automationDefaultRegistryConfig(config), false, false, &config, ) sb, err := a.ChainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") consumers, upkeepIDs := actions_seth.DeployConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, defaultAmountOfUpkeeps, big.NewInt(automationDefaultLinkFunds), automationDefaultUpkeepGasLimit, false, false, ) t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() }) gom := gomega.NewGomegaWithT(t) l.Info().Msg("waiting for all upkeeps to be performed at least once") gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d") } }, "4m", "5s").Should(gomega.Succeed()) // ~1m for cluster setup, ~1m for performing each upkeep once, ~2m buffer // set the maxGasPrice to 1 wei uoc, _ := cbor.Marshal(gasprice.UpkeepOffchainConfig{MaxGasPrice: big.NewInt(1)}) l.Info().Msgf("setting all upkeeps' offchain config to %s, which means maxGasPrice is 1 wei", hexutil.Encode(uoc)) for _, uid := range upkeepIDs { err = a.Registry.SetUpkeepOffchainConfig(uid, uoc) require.NoError(t, err, "Error setting upkeep offchain config") } // Store how many times each upkeep performed once their offchain config is set with maxGasPrice = 1 wei var countersAfterSettingLowMaxGasPrice = make([]*big.Int, len(upkeepIDs)) for i := 0; i < len(upkeepIDs); i++ { countersAfterSettingLowMaxGasPrice[i], err = consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) l.Info().Int64("Upkeep Performed times", countersAfterSettingLowMaxGasPrice[i].Int64()).Int("Upkeep index", i).Msg("Number of upkeeps performed after setting low max gas price") } var latestCounter *big.Int // the upkeepsPerformed of all the upkeeps should stay constant because they are no longer getting serviced gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { latestCounter, err = consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterSettingLowMaxGasPrice[i].Int64()+1), "Expected consumer counter to be less than %d, but got %d", countersAfterSettingLowMaxGasPrice[i].Int64()+1, latestCounter.Int64()) } }, "2m", "5s").Should(gomega.Succeed()) l.Info().Msg("no upkeeps is performed because their max gas price is only 1 wei") // setting offchain config with a high max gas price for the first upkeep, it should perform again while // other upkeeps should not perform // set the maxGasPrice to 500 gwei for the first upkeep uoc, _ = cbor.Marshal(gasprice.UpkeepOffchainConfig{MaxGasPrice: big.NewInt(500_000_000_000)}) l.Info().Msgf("setting the first upkeeps' offchain config to %s, which means maxGasPrice is 500 gwei", hexutil.Encode(uoc)) err = a.Registry.SetUpkeepOffchainConfig(upkeepIDs[0], uoc) require.NoError(t, err, "Error setting upkeep offchain config") upkeepsPerformedBefore := make(map[int]int64) upkeepsPerformedAfter := make(map[int]int64) for i := 0; i < len(upkeepIDs); i++ { latestCounter, err = consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) upkeepsPerformedBefore[i] = latestCounter.Int64() upkeepsPerformedAfter[i] = latestCounter.Int64() l.Info().Int64("No of Upkeep Performed", latestCounter.Int64()).Str("Consumer address", consumers[i].Address()).Msg("Number of upkeeps performed just after setting offchain config") } // the upkeepsPerformed of all other upkeeps should stay constant because their max gas price remains very low. // consumer at index N, might not be correlated with upkeep at index N, so instead of focusing on one of them // we iterate over all of them and make sure that at most only one is performing upkeeps gom.Consistently(func(g gomega.Gomega) { activeConsumers := 0 for i := 0; i < len(upkeepIDs); i++ { latestCounter, err = consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) if latestCounter.Int64() != upkeepsPerformedAfter[i] { activeConsumers++ } upkeepsPerformedAfter[i] = latestCounter.Int64() } // 0 is also okay, because it means that no upkeep was performed yet g.Expect(activeConsumers).Should(gomega.BeNumerically("<=", 1), "Only one consumer should have been performing upkeeps, but %d did", activeConsumers) }, "2m", "5s").Should(gomega.Succeed()) performingConsumerIndex := -1 onlyOneConsumerPerformed := false for i := 0; i < len(upkeepIDs); i++ { if upkeepsPerformedAfter[i] > upkeepsPerformedBefore[i] { onlyOneConsumerPerformed = true performingConsumerIndex = i break } } for i := 0; i < len(upkeepIDs); i++ { l.Info().Int64("No of Upkeep Performed", latestCounter.Int64()).Str("Consumer address", consumers[i].Address()).Msg("Number of upkeeps performed after waiting for the results of offchain config change") } require.True(t, onlyOneConsumerPerformed, "Only one consumer should have been performing upkeeps") l.Info().Msg("all the rest upkeeps did not perform again because their max gas price remains 1 wei") l.Info().Msg("making sure the consumer keeps performing upkeeps because its max gas price is 500 gwei") // the first upkeep should start performing again gom.Eventually(func(g gomega.Gomega) { latestCounter, err = consumers[performingConsumerIndex].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), fmt.Sprintf("Failed to retrieve consumer counter for upkeep at index %d", performingConsumerIndex)) g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically(">", countersAfterSettingLowMaxGasPrice[0].Int64()), "Expected consumer counter to be greater than %d, but got %d", countersAfterSettingLowMaxGasPrice[0].Int64(), latestCounter.Int64()) }, "2m", "5s").Should(gomega.Succeed()) // ~1m for cluster setup, ~1m for performing each upkeep once l.Info().Int64("Upkeep Performed times", latestCounter.Int64()).Msg("the first upkeep performed again") })` $DIR/integration-tests/smoke/automation_test.go: `t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() })` $DIR/integration-tests/smoke/automation_test.go: `actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)()` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Msg("waiting for all upkeeps to be performed at least once")` $DIR/integration-tests/smoke/automation_test.go: `gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d") } }, "4m", "5s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d")` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Msgf("setting all upkeeps' offchain config to %s, which means maxGasPrice is 1 wei", hexutil.Encode(uoc))` $DIR/integration-tests/smoke/automation_test.go: `err = a.Registry.SetUpkeepOffchainConfig(uid, uoc)` $DIR/integration-tests/smoke/automation_test.go: `countersAfterSettingLowMaxGasPrice[i], err = consumers[i].Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Int64("Upkeep Performed times", countersAfterSettingLowMaxGasPrice[i].Int64()).Int("Upkeep index", i).Msg("Number of upkeeps performed after setting low max gas price")` $DIR/integration-tests/smoke/automation_test.go: `gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { latestCounter, err = consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterSettingLowMaxGasPrice[i].Int64()+1), "Expected consumer counter to be less than %d, but got %d", countersAfterSettingLowMaxGasPrice[i].Int64()+1, latestCounter.Int64()) } }, "2m", "5s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `latestCounter, err = consumers[i].Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterSettingLowMaxGasPrice[i].Int64()+1), "Expected consumer counter to be less than %d, but got %d", countersAfterSettingLowMaxGasPrice[i].Int64()+1, latestCounter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Msg("no upkeeps is performed because their max gas price is only 1 wei")` $DIR/integration-tests/smoke/automation_test.go: `uoc, _ = cbor.Marshal(gasprice.UpkeepOffchainConfig{MaxGasPrice: big.NewInt(500_000_000_000)})` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Msgf("setting the first upkeeps' offchain config to %s, which means maxGasPrice is 500 gwei", hexutil.Encode(uoc))` $DIR/integration-tests/smoke/automation_test.go: `err = a.Registry.SetUpkeepOffchainConfig(upkeepIDs[0], uoc)` $DIR/integration-tests/smoke/automation_test.go: `latestCounter, err = consumers[i].Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `upkeepsPerformedBefore[i] = latestCounter.Int64()` $DIR/integration-tests/smoke/automation_test.go: `upkeepsPerformedAfter[i] = latestCounter.Int64()` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Int64("No of Upkeep Performed", latestCounter.Int64()).Str("Consumer address", consumers[i].Address()).Msg("Number of upkeeps performed just after setting offchain config")` $DIR/integration-tests/smoke/automation_test.go: `gom.Consistently(func(g gomega.Gomega) { activeConsumers := 0 for i := 0; i < len(upkeepIDs); i++ { latestCounter, err = consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) if latestCounter.Int64() != upkeepsPerformedAfter[i] { activeConsumers++ } upkeepsPerformedAfter[i] = latestCounter.Int64() } // 0 is also okay, because it means that no upkeep was performed yet g.Expect(activeConsumers).Should(gomega.BeNumerically("<=", 1), "Only one consumer should have been performing upkeeps, but %d did", activeConsumers) }, "2m", "5s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `latestCounter, err = consumers[i].Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/automation_test.go: `activeConsumers++` $DIR/integration-tests/smoke/automation_test.go: `upkeepsPerformedAfter[i] = latestCounter.Int64()` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(activeConsumers).Should(gomega.BeNumerically("<=", 1), "Only one consumer should have been performing upkeeps, but %d did", activeConsumers)` $DIR/integration-tests/smoke/automation_test.go: `onlyOneConsumerPerformed = true` $DIR/integration-tests/smoke/automation_test.go: `performingConsumerIndex = i` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Int64("No of Upkeep Performed", latestCounter.Int64()).Str("Consumer address", consumers[i].Address()).Msg("Number of upkeeps performed after waiting for the results of offchain config change")` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Msg("all the rest upkeeps did not perform again because their max gas price remains 1 wei")` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Msg("making sure the consumer keeps performing upkeeps because its max gas price is 500 gwei")` $DIR/integration-tests/smoke/automation_test.go: `gom.Eventually(func(g gomega.Gomega) { latestCounter, err = consumers[performingConsumerIndex].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), fmt.Sprintf("Failed to retrieve consumer counter for upkeep at index %d", performingConsumerIndex)) g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically(">", countersAfterSettingLowMaxGasPrice[0].Int64()), "Expected consumer counter to be greater than %d, but got %d", countersAfterSettingLowMaxGasPrice[0].Int64(), latestCounter.Int64()) }, "2m", "5s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `latestCounter, err = consumers[performingConsumerIndex].Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), fmt.Sprintf("Failed to retrieve consumer counter for upkeep at index %d", performingConsumerIndex))` $DIR/integration-tests/smoke/automation_test.go: `g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically(">", countersAfterSettingLowMaxGasPrice[0].Int64()), "Expected consumer counter to be greater than %d, but got %d", countersAfterSettingLowMaxGasPrice[0].Int64(), latestCounter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `l.Info().Int64("Upkeep Performed times", latestCounter.Int64()).Msg("the first upkeep performed again")` $DIR/integration-tests/smoke/automation_test.go: `.Init()` $DIR/integration-tests/smoke/automation_test.go: `.Run()` $DIR/integration-tests/smoke/automation_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/automation_test.go: `.Run(name, func(t *testing.T) { t.Parallel() config, err := tc.GetConfig("Smoke", tc.Automation) require.NoError(t, err, "Failed to get config") a := setupAutomationTestDocker( t, registryVersion, automationDefaultRegistryConfig(config), false, false, &config, ) sb, err := a.ChainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") consumers, upkeepIDs := actions_seth.DeployConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, defaultAmountOfUpkeeps, big.NewInt(automationDefaultLinkFunds), automationDefaultUpkeepGasLimit, true, false, ) // Start log trigger based upkeeps for all consumers for i := 0; i < len(consumers); i++ { err := consumers[i].Start() if err != nil { return } } t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() }) l.Info().Msg("Waiting for all upkeeps to perform") gom := gomega.NewGomegaWithT(t) gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := 5 l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep Index", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64()) } }, "5m", "1s").Should(gomega.Succeed()) // ~1m for cluster setup, ~2m for performing each upkeep 5 times, ~2m buffer topic0InBytesMatch := [32]byte{ 61, 83, 163, 149, 80, 224, 70, 136, 6, 88, 39, 243, 187, 134, 88, 76, 176, 7, 171, 158, 188, 167, 235, 213, 40, 231, 48, 28, 156, 49, 235, 93, } // bytes representation of 0x3d53a39550e04688065827f3bb86584cb007ab9ebca7ebd528e7301c9c31eb5d topic0InBytesNoMatch := [32]byte{ 62, 83, 163, 149, 80, 224, 70, 136, 6, 88, 39, 243, 187, 134, 88, 76, 176, 7, 171, 158, 188, 167, 235, 213, 40, 231, 48, 28, 156, 49, 235, 93, } // changed the first byte from 61 to 62 to make it not match bytes0 := [32]byte{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } // bytes representation of 0x0000000000000000000000000000000000000000000000000000000000000000 // Update the trigger config so no upkeeps are triggered for i := 0; i < len(consumers); i++ { upkeepAddr := consumers[i].Address() logTriggerConfigStruct := ac.IAutomationV21PlusCommonLogTriggerConfig{ ContractAddress: common.HexToAddress(upkeepAddr), FilterSelector: 0, Topic0: topic0InBytesNoMatch, Topic1: bytes0, Topic2: bytes0, Topic3: bytes0, } encodedLogTriggerConfig, err := core.CompatibleUtilsABI.Methods["_logTriggerConfig"].Inputs.Pack(&logTriggerConfigStruct) if err != nil { return } err = a.Registry.SetUpkeepTriggerConfig(upkeepIDs[i], encodedLogTriggerConfig) require.NoError(t, err, "Could not set upkeep trigger config at index %d", i) } var countersAfterSetNoMatch = make([]*big.Int, len(upkeepIDs)) // Wait for 10 seconds to let in-flight upkeeps finish time.Sleep(10 * time.Second) for i := 0; i < len(upkeepIDs); i++ { // Obtain the amount of times the upkeep has been executed so far countersAfterSetNoMatch[i], err = consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) l.Info().Int64("Upkeep Count", countersAfterSetNoMatch[i].Int64()).Int("Upkeep Index", i).Msg("Upkeep") } l.Info().Msg("Making sure the counter stays consistent") gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { // Expect the counter to remain constant (At most increase by 2 to account for stale performs) because the upkeep trigger config is not met bufferCount := int64(2) latestCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterSetNoMatch[i].Int64()+bufferCount), "Expected consumer counter to remain less than or equal to %d, but got %d", countersAfterSetNoMatch[i].Int64()+bufferCount, latestCounter.Int64()) } }, "1m", "1s").Should(gomega.Succeed()) // Update the trigger config, so upkeeps start performing again for i := 0; i < len(consumers); i++ { upkeepAddr := consumers[i].Address() logTriggerConfigStruct := ac.IAutomationV21PlusCommonLogTriggerConfig{ ContractAddress: common.HexToAddress(upkeepAddr), FilterSelector: 0, Topic0: topic0InBytesMatch, Topic1: bytes0, Topic2: bytes0, Topic3: bytes0, } encodedLogTriggerConfig, err := core.CompatibleUtilsABI.Methods["_logTriggerConfig"].Inputs.Pack(&logTriggerConfigStruct) if err != nil { return } err = a.Registry.SetUpkeepTriggerConfig(upkeepIDs[i], encodedLogTriggerConfig) require.NoError(t, err, "Could not set upkeep trigger config at index %d", i) } var countersAfterSetMatch = make([]*big.Int, len(upkeepIDs)) for i := 0; i < len(upkeepIDs); i++ { // Obtain the amount of times the upkeep has been executed so far countersAfterSetMatch[i], err = consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) l.Info().Int64("Upkeep Count", countersAfterSetMatch[i].Int64()).Int("Upkeep Index", i).Msg("Upkeep") } // Wait for 30 seconds to make sure backend is ready time.Sleep(30 * time.Second) // Start the consumers again for i := 0; i < len(consumers); i++ { err := consumers[i].Start() if err != nil { return } } l.Info().Msg("Making sure the counter starts increasing again") gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := int64(5) l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep Index", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", countersAfterSetMatch[i].Int64()+expect), "Expected consumer counter to be greater than %d, but got %d", countersAfterSetMatch[i].Int64()+expect, counter.Int64()) } }, "5m", "1s").Should(gomega.Succeed()) // ~1m for cluster setup, ~2m for performing each upkeep 5 times, ~2m buffer })` $DIR/integration-tests/smoke/automation_test.go: `.GetConfig("Smoke", tc.Automation)` $DIR/integration-tests/smoke/automation_test.go: `.ChainClient.Client.BlockNumber(context.Background())` $DIR/integration-tests/smoke/automation_test.go: `.Background()` $DIR/integration-tests/smoke/automation_test.go: `.DeployConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, defaultAmountOfUpkeeps, big.NewInt(automationDefaultLinkFunds), automationDefaultUpkeepGasLimit, true, false, )` $DIR/integration-tests/smoke/automation_test.go: `.NewInt(automationDefaultLinkFunds)` $DIR/integration-tests/smoke/automation_test.go: `.Start()` $DIR/integration-tests/smoke/automation_test.go: `.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() })` $DIR/integration-tests/smoke/automation_test.go: `.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Waiting for all upkeeps to perform")` $DIR/integration-tests/smoke/automation_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/automation_test.go: `.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := 5 l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep Index", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64()) } }, "5m", "1s")` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Int64("Upkeeps Performed", counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int("Upkeep Index", i)` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/automation_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.BeNumerically(">=", int64(expect)), "Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.BeNumerically(">=", int64(expect))` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.Address()` $DIR/integration-tests/smoke/automation_test.go: `.HexToAddress(upkeepAddr)` $DIR/integration-tests/smoke/automation_test.go: `.Inputs.Pack(&logTriggerConfigStruct)` $DIR/integration-tests/smoke/automation_test.go: `.Registry.SetUpkeepTriggerConfig(upkeepIDs[i], encodedLogTriggerConfig)` $DIR/integration-tests/smoke/automation_test.go: `.Sleep(10 * time.Second)` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Int64("Upkeep Count", countersAfterSetNoMatch[i].Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int("Upkeep Index", i)` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Upkeep")` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Making sure the counter stays consistent")` $DIR/integration-tests/smoke/automation_test.go: `.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { // Expect the counter to remain constant (At most increase by 2 to account for stale performs) because the upkeep trigger config is not met bufferCount := int64(2) latestCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterSetNoMatch[i].Int64()+bufferCount), "Expected consumer counter to remain less than or equal to %d, but got %d", countersAfterSetNoMatch[i].Int64()+bufferCount, latestCounter.Int64()) } }, "1m", "1s")` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Expect(err)` $DIR/integration-tests/smoke/automation_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/automation_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/automation_test.go: `.Expect(latestCounter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.BeNumerically("<=", countersAfterSetNoMatch[i].Int64()+bufferCount), "Expected consumer counter to remain less than or equal to %d, but got %d", countersAfterSetNoMatch[i].Int64()+bufferCount, latestCounter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.BeNumerically("<=", countersAfterSetNoMatch[i].Int64()+bufferCount)` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.Address()` $DIR/integration-tests/smoke/automation_test.go: `.HexToAddress(upkeepAddr)` $DIR/integration-tests/smoke/automation_test.go: `.Inputs.Pack(&logTriggerConfigStruct)` $DIR/integration-tests/smoke/automation_test.go: `.Registry.SetUpkeepTriggerConfig(upkeepIDs[i], encodedLogTriggerConfig)` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Int64("Upkeep Count", countersAfterSetMatch[i].Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int("Upkeep Index", i)` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Upkeep")` $DIR/integration-tests/smoke/automation_test.go: `.Sleep(30 * time.Second)` $DIR/integration-tests/smoke/automation_test.go: `.Start()` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Making sure the counter starts increasing again")` $DIR/integration-tests/smoke/automation_test.go: `.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) expect := int64(5) l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep Index", i).Msg("Number of upkeeps performed") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", countersAfterSetMatch[i].Int64()+expect), "Expected consumer counter to be greater than %d, but got %d", countersAfterSetMatch[i].Int64()+expect, counter.Int64()) } }, "5m", "1s")` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Int64("Upkeeps Performed", counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int("Upkeep Index", i)` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/automation_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.BeNumerically(">=", countersAfterSetMatch[i].Int64()+expect), "Expected consumer counter to be greater than %d, but got %d", countersAfterSetMatch[i].Int64()+expect, counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.BeNumerically(">=", countersAfterSetMatch[i].Int64()+expect)` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.Run(name, func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Automation) require.NoError(t, err, "Failed to get config") a := setupAutomationTestDocker( t, registryVersion, automationDefaultRegistryConfig(config), false, false, &config, ) sb, err := a.ChainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") consumers, upkeepIDs := actions_seth.DeployConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, defaultAmountOfUpkeeps, big.NewInt(1), automationDefaultUpkeepGasLimit, false, false, ) t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() }) l.Info().Msg("Making sure for 2m no upkeeps are performed") gom := gomega.NewGomegaWithT(t) // Since the upkeep is currently underfunded, check that it doesn't get executed gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(counter.Int64()).Should(gomega.Equal(int64(0)), "Expected consumer counter to remain zero, but got %d", counter.Int64()) } }, "2m", "1s").Should(gomega.Succeed()) // ~1m for setup, 1m assertion // Grant permission to the registry to fund the upkeep err = a.LinkToken.Approve(a.Registry.Address(), big.NewInt(0).Mul(big.NewInt(9e18), big.NewInt(int64(len(upkeepIDs))))) require.NoError(t, err, "Could not approve permissions for the registry on the link token contract") l.Info().Msg("Adding funds to the upkeeps") for i := 0; i < len(upkeepIDs); i++ { // Add funds to the upkeep whose ID we know from above err = a.Registry.AddUpkeepFunds(upkeepIDs[i], big.NewInt(9e18)) require.NoError(t, err, "Unable to add upkeep") } l.Info().Msg("Waiting for 2m for all contracts to perform at least one upkeep") // Now the new upkeep should be performing because we added enough funds gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[0].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64()) } }, "2m", "1s").Should(gomega.Succeed()) // ~1m for setup, 1m assertion })` $DIR/integration-tests/smoke/automation_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/automation_test.go: `.GetConfig("Smoke", tc.Automation)` $DIR/integration-tests/smoke/automation_test.go: `.ChainClient.Client.BlockNumber(context.Background())` $DIR/integration-tests/smoke/automation_test.go: `.Background()` $DIR/integration-tests/smoke/automation_test.go: `.DeployConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, defaultAmountOfUpkeeps, big.NewInt(1), automationDefaultUpkeepGasLimit, false, false, )` $DIR/integration-tests/smoke/automation_test.go: `.NewInt(1)` $DIR/integration-tests/smoke/automation_test.go: `.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() })` $DIR/integration-tests/smoke/automation_test.go: `.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Making sure for 2m no upkeeps are performed")` $DIR/integration-tests/smoke/automation_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/automation_test.go: `.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(counter.Int64()).Should(gomega.Equal(int64(0)), "Expected consumer counter to remain zero, but got %d", counter.Int64()) } }, "2m", "1s")` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Expect(err)` $DIR/integration-tests/smoke/automation_test.go: `.ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/automation_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/automation_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Equal(int64(0)), "Expected consumer counter to remain zero, but got %d", counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Equal(int64(0))` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.LinkToken.Approve(a.Registry.Address(), big.NewInt(0).Mul(big.NewInt(9e18), big.NewInt(int64(len(upkeepIDs)))))` $DIR/integration-tests/smoke/automation_test.go: `.Registry.Address()` $DIR/integration-tests/smoke/automation_test.go: `.NewInt(0)` $DIR/integration-tests/smoke/automation_test.go: `.Mul(big.NewInt(9e18), big.NewInt(int64(len(upkeepIDs))))` $DIR/integration-tests/smoke/automation_test.go: `.NewInt(9e18)` $DIR/integration-tests/smoke/automation_test.go: `.NewInt(int64(len(upkeepIDs)))` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Adding funds to the upkeeps")` $DIR/integration-tests/smoke/automation_test.go: `.Registry.AddUpkeepFunds(upkeepIDs[i], big.NewInt(9e18))` $DIR/integration-tests/smoke/automation_test.go: `.NewInt(9e18)` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Waiting for 2m for all contracts to perform at least one upkeep")` $DIR/integration-tests/smoke/automation_test.go: `.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[0].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64()) } }, "2m", "1s")` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Expect(err)` $DIR/integration-tests/smoke/automation_test.go: `.ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/automation_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/automation_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.BeNumerically(">", int64(0))` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.Run(name, func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Automation) require.NoError(t, err, "Failed to get config") a := setupAutomationTestDocker( t, registryVersion, automationDefaultRegistryConfig(config), false, false, &config, ) sb, err := a.ChainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") consumers, upkeepIDs := actions_seth.DeployConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, defaultAmountOfUpkeeps, big.NewInt(automationDefaultLinkFunds), automationDefaultUpkeepGasLimit, false, false, ) t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() }) gom := gomega.NewGomegaWithT(t) gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 5 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(5)), "Expected consumer counter to be greater than 5, but got %d", counter.Int64()) l.Info().Int("Upkeep Index", i).Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed") } }, "5m", "1s").Should(gomega.Succeed()) // ~1m for cluster setup, ~2m for performing each upkeep 5 times, ~2m buffer // pause all the registered upkeeps via the registry for i := 0; i < len(upkeepIDs); i++ { err := a.Registry.PauseUpkeep(upkeepIDs[i]) require.NoError(t, err, "Could not pause upkeep at index %d", i) } var countersAfterPause = make([]*big.Int, len(upkeepIDs)) for i := 0; i < len(upkeepIDs); i++ { // Obtain the amount of times the upkeep has been executed so far countersAfterPause[i], err = consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) l.Info().Int("Upkeep Index", i).Int64("Upkeeps Performed", countersAfterPause[i].Int64()).Msg("Paused Upkeep") } gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { // In most cases counters should remain constant, but there might be a straggling perform tx which // gets committed later and increases counter by 1 latestCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterPause[i].Int64()+1), "Expected consumer counter not have increased more than %d, but got %d", countersAfterPause[i].Int64()+1, latestCounter.Int64()) } }, "1m", "1s").Should(gomega.Succeed()) // unpause all the registered upkeeps via the registry for i := 0; i < len(upkeepIDs); i++ { err := a.Registry.UnpauseUpkeep(upkeepIDs[i]) require.NoError(t, err, "Could not unpause upkeep at index %d", i) } gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analysing their counters and checking they are greater than 5 + numbers of performing before pause for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", countersAfterPause[i].Int64()+1), "Expected consumer counter to be greater than %d, but got %d", countersAfterPause[i].Int64()+1, counter.Int64()) l.Info().Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed") } }, "2m", "1s").Should(gomega.Succeed()) // ~1m to perform, 1m buffer })` $DIR/integration-tests/smoke/automation_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/automation_test.go: `.GetConfig("Smoke", tc.Automation)` $DIR/integration-tests/smoke/automation_test.go: `.ChainClient.Client.BlockNumber(context.Background())` $DIR/integration-tests/smoke/automation_test.go: `.Background()` $DIR/integration-tests/smoke/automation_test.go: `.DeployConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, defaultAmountOfUpkeeps, big.NewInt(automationDefaultLinkFunds), automationDefaultUpkeepGasLimit, false, false, )` $DIR/integration-tests/smoke/automation_test.go: `.NewInt(automationDefaultLinkFunds)` $DIR/integration-tests/smoke/automation_test.go: `.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() })` $DIR/integration-tests/smoke/automation_test.go: `.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)` $DIR/integration-tests/smoke/automation_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/automation_test.go: `.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 5 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(5)), "Expected consumer counter to be greater than 5, but got %d", counter.Int64()) l.Info().Int("Upkeep Index", i).Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed") } }, "5m", "1s")` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Expect(err)` $DIR/integration-tests/smoke/automation_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/automation_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/automation_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.BeNumerically(">", int64(5)), "Expected consumer counter to be greater than 5, but got %d", counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.BeNumerically(">", int64(5))` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Int("Upkeep Index", i)` $DIR/integration-tests/smoke/automation_test.go: `.Int64("Upkeep counter", counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.Registry.PauseUpkeep(upkeepIDs[i])` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Int("Upkeep Index", i)` $DIR/integration-tests/smoke/automation_test.go: `.Int64("Upkeeps Performed", countersAfterPause[i].Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Paused Upkeep")` $DIR/integration-tests/smoke/automation_test.go: `.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { // In most cases counters should remain constant, but there might be a straggling perform tx which // gets committed later and increases counter by 1 latestCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterPause[i].Int64()+1), "Expected consumer counter not have increased more than %d, but got %d", countersAfterPause[i].Int64()+1, latestCounter.Int64()) } }, "1m", "1s")` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Expect(err)` $DIR/integration-tests/smoke/automation_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/automation_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/automation_test.go: `.Expect(latestCounter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.BeNumerically("<=", countersAfterPause[i].Int64()+1), "Expected consumer counter not have increased more than %d, but got %d", countersAfterPause[i].Int64()+1, latestCounter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.BeNumerically("<=", countersAfterPause[i].Int64()+1)` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.Registry.UnpauseUpkeep(upkeepIDs[i])` $DIR/integration-tests/smoke/automation_test.go: `.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analysing their counters and checking they are greater than 5 + numbers of performing before pause for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", countersAfterPause[i].Int64()+1), "Expected consumer counter to be greater than %d, but got %d", countersAfterPause[i].Int64()+1, counter.Int64()) l.Info().Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed") } }, "2m", "1s")` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Expect(err)` $DIR/integration-tests/smoke/automation_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/automation_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/automation_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.BeNumerically(">", countersAfterPause[i].Int64()+1), "Expected consumer counter to be greater than %d, but got %d", countersAfterPause[i].Int64()+1, counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.BeNumerically(">", countersAfterPause[i].Int64()+1)` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Int64("Upkeep counter", counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.Run(name, func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Automation) require.NoError(t, err, "Failed to get config") a := setupAutomationTestDocker( t, registryVersion, automationDefaultRegistryConfig(config), false, false, &config, ) sb, err := a.ChainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") consumers, upkeepIDs := actions_seth.DeployConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, defaultAmountOfUpkeeps, big.NewInt(automationDefaultLinkFunds), automationDefaultUpkeepGasLimit, false, false, ) t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() }) var initialCounters = make([]*big.Int, len(upkeepIDs)) gom := gomega.NewGomegaWithT(t) // Observe that the upkeeps which are initially registered are performing and // store the value of their initial counters in order to compare later on that the value increased. gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) initialCounters[i] = counter g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64()) l.Info(). Int64("Upkeep counter", counter.Int64()). Int64("Upkeep index", int64(i)). Msg("Number of upkeeps performed") } }, "4m", "1s").Should(gomega.Succeed()) // ~1m for cluster setup, ~1m for performing each upkeep once, ~2m buffer newConsumers, _ := actions_seth.RegisterNewUpkeeps(t, a.ChainClient, a.LinkToken, a.Registry, a.Registrar, automationDefaultUpkeepGasLimit, 1) // We know that newConsumers has size 1, so we can just use the newly registered upkeep. newUpkeep := newConsumers[0] // Test that the newly registered upkeep is also performing. gom.Eventually(func(g gomega.Gomega) { counter, err := newUpkeep.Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling newly deployed upkeep's counter shouldn't fail") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected newly registered upkeep's counter to be greater than 0, but got %d", counter.Int64()) l.Info().Int64("Upkeeps Performed", counter.Int64()).Msg("Newly Registered Upkeep") }, "2m", "1s").Should(gomega.Succeed()) // ~1m for upkeep to perform, 1m buffer gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { currentCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") l.Info(). Int64("Upkeep index", int64(i)). Int64("Upkeep counter", currentCounter.Int64()). Int64("initial counter", initialCounters[i].Int64()). Msg("Number of upkeeps performed") g.Expect(currentCounter.Int64()).Should(gomega.BeNumerically(">", initialCounters[i].Int64()), "Expected counter to have increased from initial value of %s, but got %s", initialCounters[i], currentCounter) } }, "2m", "1s").Should(gomega.Succeed()) // ~1m for upkeeps to perform, 1m buffer })` $DIR/integration-tests/smoke/automation_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/automation_test.go: `.GetConfig("Smoke", tc.Automation)` $DIR/integration-tests/smoke/automation_test.go: `.ChainClient.Client.BlockNumber(context.Background())` $DIR/integration-tests/smoke/automation_test.go: `.Background()` $DIR/integration-tests/smoke/automation_test.go: `.DeployConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, defaultAmountOfUpkeeps, big.NewInt(automationDefaultLinkFunds), automationDefaultUpkeepGasLimit, false, false, )` $DIR/integration-tests/smoke/automation_test.go: `.NewInt(automationDefaultLinkFunds)` $DIR/integration-tests/smoke/automation_test.go: `.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() })` $DIR/integration-tests/smoke/automation_test.go: `.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)` $DIR/integration-tests/smoke/automation_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/automation_test.go: `.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) initialCounters[i] = counter g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64()) l.Info(). Int64("Upkeep counter", counter.Int64()). Int64("Upkeep index", int64(i)). Msg("Number of upkeeps performed") } }, "4m", "1s")` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Expect(err)` $DIR/integration-tests/smoke/automation_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/automation_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/automation_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.BeNumerically(">", int64(0))` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `. Int64("Upkeep counter", counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `. Int64("Upkeep index", int64(i))` $DIR/integration-tests/smoke/automation_test.go: `. Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.RegisterNewUpkeeps(t, a.ChainClient, a.LinkToken, a.Registry, a.Registrar, automationDefaultUpkeepGasLimit, 1)` $DIR/integration-tests/smoke/automation_test.go: `.Eventually(func(g gomega.Gomega) { counter, err := newUpkeep.Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling newly deployed upkeep's counter shouldn't fail") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected newly registered upkeep's counter to be greater than 0, but got %d", counter.Int64()) l.Info().Int64("Upkeeps Performed", counter.Int64()).Msg("Newly Registered Upkeep") }, "2m", "1s")` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Expect(err)` $DIR/integration-tests/smoke/automation_test.go: `.ShouldNot(gomega.HaveOccurred(), "Calling newly deployed upkeep's counter shouldn't fail")` $DIR/integration-tests/smoke/automation_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/automation_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.BeNumerically(">", int64(0)), "Expected newly registered upkeep's counter to be greater than 0, but got %d", counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.BeNumerically(">", int64(0))` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Int64("Upkeeps Performed", counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Newly Registered Upkeep")` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { currentCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") l.Info(). Int64("Upkeep index", int64(i)). Int64("Upkeep counter", currentCounter.Int64()). Int64("initial counter", initialCounters[i].Int64()). Msg("Number of upkeeps performed") g.Expect(currentCounter.Int64()).Should(gomega.BeNumerically(">", initialCounters[i].Int64()), "Expected counter to have increased from initial value of %s, but got %s", initialCounters[i], currentCounter) } }, "2m", "1s")` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Expect(err)` $DIR/integration-tests/smoke/automation_test.go: `.ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/automation_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `. Int64("Upkeep index", int64(i))` $DIR/integration-tests/smoke/automation_test.go: `. Int64("Upkeep counter", currentCounter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `. Int64("initial counter", initialCounters[i].Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `. Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/automation_test.go: `.Expect(currentCounter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.BeNumerically(">", initialCounters[i].Int64()), "Expected counter to have increased from initial value of %s, but got %s", initialCounters[i], currentCounter)` $DIR/integration-tests/smoke/automation_test.go: `.BeNumerically(">", initialCounters[i].Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.Run(name, func(t *testing.T) { t.Parallel() config, err := tc.GetConfig("Smoke", tc.Automation) require.NoError(t, err, "Failed to get config") a := setupAutomationTestDocker( t, registryVersion, automationDefaultRegistryConfig(config), false, false, &config, ) sb, err := a.ChainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") consumers, upkeepIDs := actions_seth.DeployConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, defaultAmountOfUpkeeps, big.NewInt(automationDefaultLinkFunds), automationDefaultUpkeepGasLimit, false, false, ) t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() }) gom := gomega.NewGomegaWithT(t) // Observe that the upkeeps which are initially registered are performing gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d") } }, "4m", "1s").Should(gomega.Succeed()) // ~1m for cluster setup, ~1m for performing each upkeep once, ~2m buffer // Pause the registry err = a.Registry.Pause() require.NoError(t, err, "Error pausing registry") // Store how many times each upkeep performed once the registry was successfully paused var countersAfterPause = make([]*big.Int, len(upkeepIDs)) for i := 0; i < len(upkeepIDs); i++ { countersAfterPause[i], err = consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) } // After we paused the registry, the counters of all the upkeeps should stay constant // because they are no longer getting serviced gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { latestCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.Equal(countersAfterPause[i].Int64()), "Expected consumer counter to remain constant at %d, but got %d", countersAfterPause[i].Int64(), latestCounter.Int64()) } }, "1m", "1s").Should(gomega.Succeed()) })` $DIR/integration-tests/smoke/automation_test.go: `.GetConfig("Smoke", tc.Automation)` $DIR/integration-tests/smoke/automation_test.go: `.ChainClient.Client.BlockNumber(context.Background())` $DIR/integration-tests/smoke/automation_test.go: `.Background()` $DIR/integration-tests/smoke/automation_test.go: `.DeployConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, defaultAmountOfUpkeeps, big.NewInt(automationDefaultLinkFunds), automationDefaultUpkeepGasLimit, false, false, )` $DIR/integration-tests/smoke/automation_test.go: `.NewInt(automationDefaultLinkFunds)` $DIR/integration-tests/smoke/automation_test.go: `.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() })` $DIR/integration-tests/smoke/automation_test.go: `.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)` $DIR/integration-tests/smoke/automation_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/automation_test.go: `.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d") } }, "4m", "1s")` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Expect(err)` $DIR/integration-tests/smoke/automation_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/automation_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/automation_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d")` $DIR/integration-tests/smoke/automation_test.go: `.BeNumerically(">", int64(0))` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.Registry.Pause()` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { latestCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.Equal(countersAfterPause[i].Int64()), "Expected consumer counter to remain constant at %d, but got %d", countersAfterPause[i].Int64(), latestCounter.Int64()) } }, "1m", "1s")` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Expect(err)` $DIR/integration-tests/smoke/automation_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/automation_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/automation_test.go: `.Expect(latestCounter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Equal(countersAfterPause[i].Int64()), "Expected consumer counter to remain constant at %d, but got %d", countersAfterPause[i].Int64(), latestCounter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Equal(countersAfterPause[i].Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.Run(name, func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Automation) require.NoError(t, err, "Failed to get config") a := setupAutomationTestDocker( t, registryVersion, automationDefaultRegistryConfig(config), false, false, &config, ) sb, err := a.ChainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") consumers, upkeepIDs := actions_seth.DeployConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, defaultAmountOfUpkeeps, big.NewInt(automationDefaultLinkFunds), automationDefaultUpkeepGasLimit, false, false, ) t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() }) gom := gomega.NewGomegaWithT(t) nodesWithoutBootstrap := a.ChainlinkNodes[1:] var initialCounters = make([]*big.Int, len(upkeepIDs)) // Watch upkeeps being performed and store their counters in order to compare them later in the test gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) initialCounters[i] = counter l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep Index", i).Msg("Number of upkeeps performed") g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64()) } }, "4m", "1s").Should(gomega.Succeed()) // ~1m for cluster setup, ~1m for performing each upkeep once, ~2m buffer // Take down 1 node. Currently, using 4 nodes so f=1 and is the max nodes that can go down. err = nodesWithoutBootstrap[0].MustDeleteJob("1") require.NoError(t, err, "Error deleting job from Chainlink node") l.Info().Msg("Successfully managed to take down the first half of the nodes") // Assert that upkeeps are still performed and their counters have increased gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { currentCounter, err := consumers[i].Counter(testcontext.Get(t)) l.Info().Int64("Upkeeps Performed", currentCounter.Int64()).Int("Upkeep Index", i).Msg("Number of upkeeps performed") g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(currentCounter.Int64()).Should(gomega.BeNumerically(">", initialCounters[i].Int64()), "Expected counter to have increased from initial value of %s, but got %s", initialCounters[i], currentCounter) } }, "2m", "1s").Should(gomega.Succeed()) // ~1m for each upkeep to perform once, 1m buffer // Take down the rest restOfNodesDown := nodesWithoutBootstrap[1:] for _, nodeToTakeDown := range restOfNodesDown { err = nodeToTakeDown.MustDeleteJob("1") require.NoError(t, err, "Error deleting job from Chainlink node") } l.Info().Msg("Successfully managed to take down the second half of the nodes") // See how many times each upkeep was executed var countersAfterNoMoreNodes = make([]*big.Int, len(upkeepIDs)) for i := 0; i < len(upkeepIDs); i++ { countersAfterNoMoreNodes[i], err = consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) l.Info().Int("Upkeep Index", i).Int64("Performed", countersAfterNoMoreNodes[i].Int64()).Msg("Upkeeps Performed") } // Once all the nodes are taken down, there might be some straggling transactions which went through before // all the nodes were taken down gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { latestCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterNoMoreNodes[i].Int64()+1), "Expected consumer counter to not have increased more than %d, but got %d", countersAfterNoMoreNodes[i].Int64()+1, latestCounter.Int64()) } }, "2m", "1s").Should(gomega.Succeed()) })` $DIR/integration-tests/smoke/automation_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/automation_test.go: `.GetConfig("Smoke", tc.Automation)` $DIR/integration-tests/smoke/automation_test.go: `.ChainClient.Client.BlockNumber(context.Background())` $DIR/integration-tests/smoke/automation_test.go: `.Background()` $DIR/integration-tests/smoke/automation_test.go: `.DeployConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, defaultAmountOfUpkeeps, big.NewInt(automationDefaultLinkFunds), automationDefaultUpkeepGasLimit, false, false, )` $DIR/integration-tests/smoke/automation_test.go: `.NewInt(automationDefaultLinkFunds)` $DIR/integration-tests/smoke/automation_test.go: `.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() })` $DIR/integration-tests/smoke/automation_test.go: `.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)` $DIR/integration-tests/smoke/automation_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/automation_test.go: `.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) initialCounters[i] = counter l.Info().Int64("Upkeeps Performed", counter.Int64()).Int("Upkeep Index", i).Msg("Number of upkeeps performed") g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64()) } }, "4m", "1s")` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Int64("Upkeeps Performed", counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int("Upkeep Index", i)` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/automation_test.go: `.Expect(err)` $DIR/integration-tests/smoke/automation_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/automation_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/automation_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.BeNumerically(">", int64(0))` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.MustDeleteJob("1")` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Successfully managed to take down the first half of the nodes")` $DIR/integration-tests/smoke/automation_test.go: `.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { currentCounter, err := consumers[i].Counter(testcontext.Get(t)) l.Info().Int64("Upkeeps Performed", currentCounter.Int64()).Int("Upkeep Index", i).Msg("Number of upkeeps performed") g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(currentCounter.Int64()).Should(gomega.BeNumerically(">", initialCounters[i].Int64()), "Expected counter to have increased from initial value of %s, but got %s", initialCounters[i], currentCounter) } }, "2m", "1s")` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Int64("Upkeeps Performed", currentCounter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int("Upkeep Index", i)` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/automation_test.go: `.Expect(err)` $DIR/integration-tests/smoke/automation_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/automation_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/automation_test.go: `.Expect(currentCounter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.BeNumerically(">", initialCounters[i].Int64()), "Expected counter to have increased from initial value of %s, but got %s", initialCounters[i], currentCounter)` $DIR/integration-tests/smoke/automation_test.go: `.BeNumerically(">", initialCounters[i].Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.MustDeleteJob("1")` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Successfully managed to take down the second half of the nodes")` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Int("Upkeep Index", i)` $DIR/integration-tests/smoke/automation_test.go: `.Int64("Performed", countersAfterNoMoreNodes[i].Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Upkeeps Performed")` $DIR/integration-tests/smoke/automation_test.go: `.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { latestCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterNoMoreNodes[i].Int64()+1), "Expected consumer counter to not have increased more than %d, but got %d", countersAfterNoMoreNodes[i].Int64()+1, latestCounter.Int64()) } }, "2m", "1s")` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Expect(err)` $DIR/integration-tests/smoke/automation_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/automation_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/automation_test.go: `.Expect(latestCounter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.BeNumerically("<=", countersAfterNoMoreNodes[i].Int64()+1), "Expected consumer counter to not have increased more than %d, but got %d", countersAfterNoMoreNodes[i].Int64()+1, latestCounter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.BeNumerically("<=", countersAfterNoMoreNodes[i].Int64()+1)` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.Run(name, func(t *testing.T) { t.Parallel() config, err := tc.GetConfig("Smoke", tc.Automation) require.NoError(t, err, "Failed to get config") a := setupAutomationTestDocker( t, registryVersion, automationDefaultRegistryConfig(config), false, false, &config, ) sb, err := a.ChainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") consumersPerformance, _ := actions_seth.DeployPerformanceConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, defaultAmountOfUpkeeps, big.NewInt(automationDefaultLinkFunds), automationDefaultUpkeepGasLimit, 10000, // How many blocks this upkeep will be eligible from first upkeep block 5, // Interval of blocks that upkeeps are expected to be performed 100000, // How much gas should be burned on checkUpkeep() calls 4000000, // How much gas should be burned on performUpkeep() calls. Initially set higher than defaultUpkeepGasLimit ) t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() }) gom := gomega.NewGomegaWithT(t) consumerPerformance := consumersPerformance[0] // Initially performGas is set high, so performUpkeep reverts and no upkeep should be performed gom.Consistently(func(g gomega.Gomega) { // Consumer count should remain at 0 cnt, err := consumerPerformance.GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail") g.Expect(cnt.Int64()).Should(gomega.Equal(int64(0)), "Expected consumer counter to remain constant at %d, but got %d", 0, cnt.Int64(), ) }, "2m", "1s").Should(gomega.Succeed()) // ~1m for setup, 1m assertion // Set performGas on consumer to be low, so that performUpkeep starts becoming successful err = consumerPerformance.SetPerformGasToBurn(testcontext.Get(t), big.NewInt(100000)) require.NoError(t, err, "Perform gas should be set successfully on consumer") // Upkeep should now start performing gom.Eventually(func(g gomega.Gomega) { cnt, err := consumerPerformance.GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail") g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", cnt.Int64(), ) }, "2m", "1s").Should(gomega.Succeed()) // ~1m to perform once, 1m buffer })` $DIR/integration-tests/smoke/automation_test.go: `.GetConfig("Smoke", tc.Automation)` $DIR/integration-tests/smoke/automation_test.go: `.ChainClient.Client.BlockNumber(context.Background())` $DIR/integration-tests/smoke/automation_test.go: `.Background()` $DIR/integration-tests/smoke/automation_test.go: `.DeployPerformanceConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, defaultAmountOfUpkeeps, big.NewInt(automationDefaultLinkFunds), automationDefaultUpkeepGasLimit, 10000, // How many blocks this upkeep will be eligible from first upkeep block 5, // Interval of blocks that upkeeps are expected to be performed 100000, // How much gas should be burned on checkUpkeep() calls 4000000, // How much gas should be burned on performUpkeep() calls. Initially set higher than defaultUpkeepGasLimit )` $DIR/integration-tests/smoke/automation_test.go: `.NewInt(automationDefaultLinkFunds)` $DIR/integration-tests/smoke/automation_test.go: `.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() })` $DIR/integration-tests/smoke/automation_test.go: `.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)` $DIR/integration-tests/smoke/automation_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/automation_test.go: `.Consistently(func(g gomega.Gomega) { // Consumer count should remain at 0 cnt, err := consumerPerformance.GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail") g.Expect(cnt.Int64()).Should(gomega.Equal(int64(0)), "Expected consumer counter to remain constant at %d, but got %d", 0, cnt.Int64(), ) }, "2m", "1s")` $DIR/integration-tests/smoke/automation_test.go: `.GetUpkeepCount(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Expect(err)` $DIR/integration-tests/smoke/automation_test.go: `.ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail")` $DIR/integration-tests/smoke/automation_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/automation_test.go: `.Expect(cnt.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Equal(int64(0)), "Expected consumer counter to remain constant at %d, but got %d", 0, cnt.Int64(), )` $DIR/integration-tests/smoke/automation_test.go: `.Equal(int64(0))` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.SetPerformGasToBurn(testcontext.Get(t), big.NewInt(100000))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.NewInt(100000)` $DIR/integration-tests/smoke/automation_test.go: `.Eventually(func(g gomega.Gomega) { cnt, err := consumerPerformance.GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail") g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", cnt.Int64(), ) }, "2m", "1s")` $DIR/integration-tests/smoke/automation_test.go: `.GetUpkeepCount(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Expect(err)` $DIR/integration-tests/smoke/automation_test.go: `.ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail")` $DIR/integration-tests/smoke/automation_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/automation_test.go: `.Expect(cnt.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", cnt.Int64(), )` $DIR/integration-tests/smoke/automation_test.go: `.BeNumerically(">", int64(0))` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.Run(name, func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Automation) require.NoError(t, err, "Failed to get config") a := setupAutomationTestDocker( t, registryVersion, automationDefaultRegistryConfig(config), false, false, &config, ) sb, err := a.ChainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") consumersPerformance, upkeepIDs := actions_seth.DeployPerformanceConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, 1, // It was impossible to investigate, why with multiple outputs it fails ONLY in CI and only for 2.1 and 2.2 versions big.NewInt(automationDefaultLinkFunds), automationDefaultUpkeepGasLimit, 10000, // How many blocks this upkeep will be eligible from first upkeep block 5, // Interval of blocks that upkeeps are expected to be performed 100000, // How much gas should be burned on checkUpkeep() calls 4000000, // How much gas should be burned on performUpkeep() calls. Initially set higher than defaultUpkeepGasLimit ) t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() }) gom := gomega.NewGomegaWithT(t) nodesWithoutBootstrap := a.ChainlinkNodes[1:] // Initially performGas is set higher than defaultUpkeepGasLimit, so no upkeep should be performed l.Info().Msg("Making sure for 2m no upkeeps are performed") gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(cnt.Int64()).Should( gomega.Equal(int64(0)), "Expected consumer counter to remain constant at %d, but got %d", 0, cnt.Int64(), ) } }, "2m", "1s").Should(gomega.Succeed()) // ~1m for setup, 1m assertion // Increase gas limit for the upkeep, higher than the performGasBurn l.Info().Msg("Increasing gas limit for upkeeps") for i := 0; i < len(upkeepIDs); i++ { err = a.Registry.SetUpkeepGasLimit(upkeepIDs[i], uint32(4500000)) require.NoError(t, err, "Error setting upkeep gas limit") } // Upkeep should now start performing l.Info().Msg("Waiting for 4m for all contracts to perform at least one upkeep after gas limit increase") gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") l.Info().Int("Upkeep index", i).Int64("Upkeep counter", cnt.Int64()).Msg("Number of upkeeps performed") g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", cnt.Int64(), ) } }, "4m", "1s").Should(gomega.Succeed()) // ~1m to perform once, 1m buffer // Now increase the checkGasBurn on consumer, upkeep should stop performing l.Info().Msg("Increasing check gas to burn for upkeeps") for i := 0; i < len(upkeepIDs); i++ { err = consumersPerformance[i].SetCheckGasToBurn(testcontext.Get(t), big.NewInt(3000000)) require.NoError(t, err, "Check gas burn should be set successfully on consumer") } countPerID := make(map[*big.Int]*big.Int) // Get existing performed count l.Info().Msg("Getting existing performed count") for i := 0; i < len(upkeepIDs); i++ { existingCnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) require.NoError(t, err, "Calling consumer's counter shouldn't fail") l.Info(). Str("UpkeepID", upkeepIDs[i].String()). Int64("Upkeep counter", existingCnt.Int64()). Msg("Upkeep counter when check gas increased") countPerID[upkeepIDs[i]] = existingCnt } // In most cases count should remain constant, but it might increase by upto 1 due to pending perform l.Info().Msg("Waiting for 1m for all contracts to make sure they perform at maximum 1 upkeep") gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") existingCnt := countPerID[upkeepIDs[i]] g.Expect(cnt.Int64()).Should( gomega.BeNumerically("<=", existingCnt.Int64()+1), "Expected consumer counter to remain less than equal %d, but got %d", existingCnt.Int64()+1, cnt.Int64(), ) } }, "1m", "1s").Should(gomega.Succeed()) l.Info().Msg("Getting existing performed count") for i := 0; i < len(upkeepIDs); i++ { existingCnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) require.NoError(t, err, "Calling consumer's counter shouldn't fail") l.Info(). Str("UpkeepID", upkeepIDs[i].String()). Int64("Upkeep counter", existingCnt.Int64()).Msg("Upkeep counter when consistently block finished") countPerID[upkeepIDs[i]] = existingCnt } // Now increase checkGasLimit on registry highCheckGasLimit := automationDefaultRegistryConfig(config) highCheckGasLimit.CheckGasLimit = uint32(5000000) highCheckGasLimit.RegistryVersion = registryVersion ocrConfig, err := actions.BuildAutoOCR2ConfigVarsLocal(l, nodesWithoutBootstrap, highCheckGasLimit, a.Registrar.Address(), 30*time.Second, a.Registry.RegistryOwnerAddress(), a.Registry.ChainModuleAddress(), a.Registry.ReorgProtectionEnabled()) require.NoError(t, err, "Error building OCR config") if a.RegistrySettings.RegistryVersion == ethereum.RegistryVersion_2_0 { err = a.Registry.SetConfig(highCheckGasLimit, ocrConfig) } else { err = a.Registry.SetConfigTypeSafe(ocrConfig) } require.NoError(t, err, "Registry config should be set successfully!") l.Info().Msg("Waiting for 3m for all contracts to make sure they perform at maximum 1 upkeep after check gas limit increase") // Upkeep should start performing again, and it should get regularly performed gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail") existingCnt := countPerID[upkeepIDs[i]] g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", existingCnt.Int64()), "Expected consumer counter to be greater than %d, but got %d", existingCnt.Int64(), cnt.Int64(), ) } }, "3m", "1s").Should(gomega.Succeed()) // ~1m to setup cluster, 1m to perform once, 1m buffer })` $DIR/integration-tests/smoke/automation_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/automation_test.go: `.GetConfig("Smoke", tc.Automation)` $DIR/integration-tests/smoke/automation_test.go: `.ChainClient.Client.BlockNumber(context.Background())` $DIR/integration-tests/smoke/automation_test.go: `.Background()` $DIR/integration-tests/smoke/automation_test.go: `.DeployPerformanceConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, 1, // It was impossible to investigate, why with multiple outputs it fails ONLY in CI and only for 2.1 and 2.2 versions big.NewInt(automationDefaultLinkFunds), automationDefaultUpkeepGasLimit, 10000, // How many blocks this upkeep will be eligible from first upkeep block 5, // Interval of blocks that upkeeps are expected to be performed 100000, // How much gas should be burned on checkUpkeep() calls 4000000, // How much gas should be burned on performUpkeep() calls. Initially set higher than defaultUpkeepGasLimit )` $DIR/integration-tests/smoke/automation_test.go: `.NewInt(automationDefaultLinkFunds)` $DIR/integration-tests/smoke/automation_test.go: `.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() })` $DIR/integration-tests/smoke/automation_test.go: `.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)` $DIR/integration-tests/smoke/automation_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Making sure for 2m no upkeeps are performed")` $DIR/integration-tests/smoke/automation_test.go: `.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(cnt.Int64()).Should( gomega.Equal(int64(0)), "Expected consumer counter to remain constant at %d, but got %d", 0, cnt.Int64(), ) } }, "2m", "1s")` $DIR/integration-tests/smoke/automation_test.go: `.GetUpkeepCount(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Expect(err)` $DIR/integration-tests/smoke/automation_test.go: `.ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/automation_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/automation_test.go: `.Expect(cnt.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should( gomega.Equal(int64(0)), "Expected consumer counter to remain constant at %d, but got %d", 0, cnt.Int64(), )` $DIR/integration-tests/smoke/automation_test.go: `.Equal(int64(0))` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Increasing gas limit for upkeeps")` $DIR/integration-tests/smoke/automation_test.go: `.Registry.SetUpkeepGasLimit(upkeepIDs[i], uint32(4500000))` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Waiting for 4m for all contracts to perform at least one upkeep after gas limit increase")` $DIR/integration-tests/smoke/automation_test.go: `.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") l.Info().Int("Upkeep index", i).Int64("Upkeep counter", cnt.Int64()).Msg("Number of upkeeps performed") g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", cnt.Int64(), ) } }, "4m", "1s")` $DIR/integration-tests/smoke/automation_test.go: `.GetUpkeepCount(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Expect(err)` $DIR/integration-tests/smoke/automation_test.go: `.ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/automation_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Int("Upkeep index", i)` $DIR/integration-tests/smoke/automation_test.go: `.Int64("Upkeep counter", cnt.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/automation_test.go: `.Expect(cnt.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", cnt.Int64(), )` $DIR/integration-tests/smoke/automation_test.go: `.BeNumerically(">", int64(0))` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Increasing check gas to burn for upkeeps")` $DIR/integration-tests/smoke/automation_test.go: `.SetCheckGasToBurn(testcontext.Get(t), big.NewInt(3000000))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.NewInt(3000000)` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Getting existing performed count")` $DIR/integration-tests/smoke/automation_test.go: `.GetUpkeepCount(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `. Str("UpkeepID", upkeepIDs[i].String())` $DIR/integration-tests/smoke/automation_test.go: `.String()` $DIR/integration-tests/smoke/automation_test.go: `. Int64("Upkeep counter", existingCnt.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `. Msg("Upkeep counter when check gas increased")` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Waiting for 1m for all contracts to make sure they perform at maximum 1 upkeep")` $DIR/integration-tests/smoke/automation_test.go: `.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") existingCnt := countPerID[upkeepIDs[i]] g.Expect(cnt.Int64()).Should( gomega.BeNumerically("<=", existingCnt.Int64()+1), "Expected consumer counter to remain less than equal %d, but got %d", existingCnt.Int64()+1, cnt.Int64(), ) } }, "1m", "1s")` $DIR/integration-tests/smoke/automation_test.go: `.GetUpkeepCount(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Expect(err)` $DIR/integration-tests/smoke/automation_test.go: `.ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/automation_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/automation_test.go: `.Expect(cnt.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should( gomega.BeNumerically("<=", existingCnt.Int64()+1), "Expected consumer counter to remain less than equal %d, but got %d", existingCnt.Int64()+1, cnt.Int64(), )` $DIR/integration-tests/smoke/automation_test.go: `.BeNumerically("<=", existingCnt.Int64()+1)` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Getting existing performed count")` $DIR/integration-tests/smoke/automation_test.go: `.GetUpkeepCount(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `. Str("UpkeepID", upkeepIDs[i].String())` $DIR/integration-tests/smoke/automation_test.go: `.String()` $DIR/integration-tests/smoke/automation_test.go: `. Int64("Upkeep counter", existingCnt.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Upkeep counter when consistently block finished")` $DIR/integration-tests/smoke/automation_test.go: `.BuildAutoOCR2ConfigVarsLocal(l, nodesWithoutBootstrap, highCheckGasLimit, a.Registrar.Address(), 30*time.Second, a.Registry.RegistryOwnerAddress(), a.Registry.ChainModuleAddress(), a.Registry.ReorgProtectionEnabled())` $DIR/integration-tests/smoke/automation_test.go: `.Registrar.Address()` $DIR/integration-tests/smoke/automation_test.go: `.Registry.RegistryOwnerAddress()` $DIR/integration-tests/smoke/automation_test.go: `.Registry.ChainModuleAddress()` $DIR/integration-tests/smoke/automation_test.go: `.Registry.ReorgProtectionEnabled()` $DIR/integration-tests/smoke/automation_test.go: `.Registry.SetConfig(highCheckGasLimit, ocrConfig)` $DIR/integration-tests/smoke/automation_test.go: `.Registry.SetConfigTypeSafe(ocrConfig)` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Waiting for 3m for all contracts to make sure they perform at maximum 1 upkeep after check gas limit increase")` $DIR/integration-tests/smoke/automation_test.go: `.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail") existingCnt := countPerID[upkeepIDs[i]] g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", existingCnt.Int64()), "Expected consumer counter to be greater than %d, but got %d", existingCnt.Int64(), cnt.Int64(), ) } }, "3m", "1s")` $DIR/integration-tests/smoke/automation_test.go: `.GetUpkeepCount(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Expect(err)` $DIR/integration-tests/smoke/automation_test.go: `.ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail")` $DIR/integration-tests/smoke/automation_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/automation_test.go: `.Expect(cnt.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.BeNumerically(">", existingCnt.Int64()), "Expected consumer counter to be greater than %d, but got %d", existingCnt.Int64(), cnt.Int64(), )` $DIR/integration-tests/smoke/automation_test.go: `.BeNumerically(">", existingCnt.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.Run(name, func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Automation) require.NoError(t, err, "Failed to get config") a := setupAutomationTestDocker( t, registryVersion, automationDefaultRegistryConfig(config), false, false, &config, ) sb, err := a.ChainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") performDataChecker, upkeepIDs := actions_seth.DeployPerformDataCheckerConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, defaultAmountOfUpkeeps, big.NewInt(automationDefaultLinkFunds), automationDefaultUpkeepGasLimit, []byte(automationExpectedData), ) t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() }) gom := gomega.NewGomegaWithT(t) gom.Consistently(func(g gomega.Gomega) { // expect the counter to remain 0 because perform data does not match for i := 0; i < len(upkeepIDs); i++ { counter, err := performDataChecker[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve perform data checker"+ " for upkeep at index "+strconv.Itoa(i)) g.Expect(counter.Int64()).Should(gomega.Equal(int64(0)), "Expected perform data checker counter to be 0, but got %d", counter.Int64()) l.Info().Int64("Upkeep perform data checker", counter.Int64()).Msg("Number of upkeeps performed") } }, "2m", "1s").Should(gomega.Succeed()) // ~1m for setup, 1m assertion for i := 0; i < len(upkeepIDs); i++ { err := a.Registry.UpdateCheckData(upkeepIDs[i], []byte(automationExpectedData)) require.NoError(t, err, "Could not update check data for upkeep at index %d", i) } // retrieve new check data for all upkeeps for i := 0; i < len(upkeepIDs); i++ { upkeep, err := a.Registry.GetUpkeepInfo(testcontext.Get(t), upkeepIDs[i]) require.NoError(t, err, "Failed to get upkeep info at index %d", i) require.Equal(t, []byte(automationExpectedData), upkeep.CheckData, "Upkeep data not as expected") } gom.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analysing their counters and checking they are greater than 5 for i := 0; i < len(upkeepIDs); i++ { counter, err := performDataChecker[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve perform data checker counter"+ " for upkeep at index "+strconv.Itoa(i)) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected perform data checker counter to be greater than 0, but got %d", counter.Int64()) l.Info().Int64("Upkeep perform data checker", counter.Int64()).Msg("Number of upkeeps performed") } }, "2m", "1s").Should(gomega.Succeed()) // ~1m to perform once, 1m buffer })` $DIR/integration-tests/smoke/automation_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/automation_test.go: `.GetConfig("Smoke", tc.Automation)` $DIR/integration-tests/smoke/automation_test.go: `.ChainClient.Client.BlockNumber(context.Background())` $DIR/integration-tests/smoke/automation_test.go: `.Background()` $DIR/integration-tests/smoke/automation_test.go: `.DeployPerformDataCheckerConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, defaultAmountOfUpkeeps, big.NewInt(automationDefaultLinkFunds), automationDefaultUpkeepGasLimit, []byte(automationExpectedData), )` $DIR/integration-tests/smoke/automation_test.go: `.NewInt(automationDefaultLinkFunds)` $DIR/integration-tests/smoke/automation_test.go: `.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() })` $DIR/integration-tests/smoke/automation_test.go: `.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)` $DIR/integration-tests/smoke/automation_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/automation_test.go: `.Consistently(func(g gomega.Gomega) { // expect the counter to remain 0 because perform data does not match for i := 0; i < len(upkeepIDs); i++ { counter, err := performDataChecker[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve perform data checker"+ " for upkeep at index "+strconv.Itoa(i)) g.Expect(counter.Int64()).Should(gomega.Equal(int64(0)), "Expected perform data checker counter to be 0, but got %d", counter.Int64()) l.Info().Int64("Upkeep perform data checker", counter.Int64()).Msg("Number of upkeeps performed") } }, "2m", "1s")` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Expect(err)` $DIR/integration-tests/smoke/automation_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve perform data checker"+ " for upkeep at index "+strconv.Itoa(i))` $DIR/integration-tests/smoke/automation_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/automation_test.go: `.Itoa(i)` $DIR/integration-tests/smoke/automation_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Equal(int64(0)), "Expected perform data checker counter to be 0, but got %d", counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Equal(int64(0))` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Int64("Upkeep perform data checker", counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.Registry.UpdateCheckData(upkeepIDs[i], []byte(automationExpectedData))` $DIR/integration-tests/smoke/automation_test.go: `.Registry.GetUpkeepInfo(testcontext.Get(t), upkeepIDs[i])` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Eventually(func(g gomega.Gomega) { // Check if the upkeeps are performing multiple times by analysing their counters and checking they are greater than 5 for i := 0; i < len(upkeepIDs); i++ { counter, err := performDataChecker[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve perform data checker counter"+ " for upkeep at index "+strconv.Itoa(i)) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected perform data checker counter to be greater than 0, but got %d", counter.Int64()) l.Info().Int64("Upkeep perform data checker", counter.Int64()).Msg("Number of upkeeps performed") } }, "2m", "1s")` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Expect(err)` $DIR/integration-tests/smoke/automation_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve perform data checker counter"+ " for upkeep at index "+strconv.Itoa(i))` $DIR/integration-tests/smoke/automation_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/automation_test.go: `.Itoa(i)` $DIR/integration-tests/smoke/automation_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.BeNumerically(">", int64(0)), "Expected perform data checker counter to be greater than 0, but got %d", counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.BeNumerically(">", int64(0))` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Int64("Upkeep perform data checker", counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.Run(name, func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Automation) if err != nil { t.Fatal(err) } a := setupAutomationTestDocker( t, registryVersion, automationDefaultRegistryConfig(config), false, false, &config, ) sb, err := a.ChainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") consumers, upkeepIDs := actions_seth.DeployConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, defaultAmountOfUpkeeps, big.NewInt(automationDefaultLinkFunds), automationDefaultUpkeepGasLimit, false, false, ) t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() }) gom := gomega.NewGomegaWithT(t) l.Info().Msg("waiting for all upkeeps to be performed at least once") gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d") } }, "4m", "5s").Should(gomega.Succeed()) // ~1m for cluster setup, ~1m for performing each upkeep once, ~2m buffer // set the maxGasPrice to 1 wei uoc, _ := cbor.Marshal(gasprice.UpkeepOffchainConfig{MaxGasPrice: big.NewInt(1)}) l.Info().Msgf("setting all upkeeps' offchain config to %s, which means maxGasPrice is 1 wei", hexutil.Encode(uoc)) for _, uid := range upkeepIDs { err = a.Registry.SetUpkeepOffchainConfig(uid, uoc) require.NoError(t, err, "Error setting upkeep offchain config") } // Store how many times each upkeep performed once their offchain config is set with maxGasPrice = 1 wei var countersAfterSettingLowMaxGasPrice = make([]*big.Int, len(upkeepIDs)) for i := 0; i < len(upkeepIDs); i++ { countersAfterSettingLowMaxGasPrice[i], err = consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) l.Info().Int64("Upkeep Performed times", countersAfterSettingLowMaxGasPrice[i].Int64()).Int("Upkeep index", i).Msg("Number of upkeeps performed after setting low max gas price") } var latestCounter *big.Int // the upkeepsPerformed of all the upkeeps should stay constant because they are no longer getting serviced gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { latestCounter, err = consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterSettingLowMaxGasPrice[i].Int64()+1), "Expected consumer counter to be less than %d, but got %d", countersAfterSettingLowMaxGasPrice[i].Int64()+1, latestCounter.Int64()) } }, "2m", "5s").Should(gomega.Succeed()) l.Info().Msg("no upkeeps is performed because their max gas price is only 1 wei") // setting offchain config with a high max gas price for the first upkeep, it should perform again while // other upkeeps should not perform // set the maxGasPrice to 500 gwei for the first upkeep uoc, _ = cbor.Marshal(gasprice.UpkeepOffchainConfig{MaxGasPrice: big.NewInt(500_000_000_000)}) l.Info().Msgf("setting the first upkeeps' offchain config to %s, which means maxGasPrice is 500 gwei", hexutil.Encode(uoc)) err = a.Registry.SetUpkeepOffchainConfig(upkeepIDs[0], uoc) require.NoError(t, err, "Error setting upkeep offchain config") upkeepsPerformedBefore := make(map[int]int64) upkeepsPerformedAfter := make(map[int]int64) for i := 0; i < len(upkeepIDs); i++ { latestCounter, err = consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) upkeepsPerformedBefore[i] = latestCounter.Int64() upkeepsPerformedAfter[i] = latestCounter.Int64() l.Info().Int64("No of Upkeep Performed", latestCounter.Int64()).Str("Consumer address", consumers[i].Address()).Msg("Number of upkeeps performed just after setting offchain config") } // the upkeepsPerformed of all other upkeeps should stay constant because their max gas price remains very low. // consumer at index N, might not be correlated with upkeep at index N, so instead of focusing on one of them // we iterate over all of them and make sure that at most only one is performing upkeeps gom.Consistently(func(g gomega.Gomega) { activeConsumers := 0 for i := 0; i < len(upkeepIDs); i++ { latestCounter, err = consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) if latestCounter.Int64() != upkeepsPerformedAfter[i] { activeConsumers++ } upkeepsPerformedAfter[i] = latestCounter.Int64() } // 0 is also okay, because it means that no upkeep was performed yet g.Expect(activeConsumers).Should(gomega.BeNumerically("<=", 1), "Only one consumer should have been performing upkeeps, but %d did", activeConsumers) }, "2m", "5s").Should(gomega.Succeed()) performingConsumerIndex := -1 onlyOneConsumerPerformed := false for i := 0; i < len(upkeepIDs); i++ { if upkeepsPerformedAfter[i] > upkeepsPerformedBefore[i] { onlyOneConsumerPerformed = true performingConsumerIndex = i break } } for i := 0; i < len(upkeepIDs); i++ { l.Info().Int64("No of Upkeep Performed", latestCounter.Int64()).Str("Consumer address", consumers[i].Address()).Msg("Number of upkeeps performed after waiting for the results of offchain config change") } require.True(t, onlyOneConsumerPerformed, "Only one consumer should have been performing upkeeps") l.Info().Msg("all the rest upkeeps did not perform again because their max gas price remains 1 wei") l.Info().Msg("making sure the consumer keeps performing upkeeps because its max gas price is 500 gwei") // the first upkeep should start performing again gom.Eventually(func(g gomega.Gomega) { latestCounter, err = consumers[performingConsumerIndex].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), fmt.Sprintf("Failed to retrieve consumer counter for upkeep at index %d", performingConsumerIndex)) g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically(">", countersAfterSettingLowMaxGasPrice[0].Int64()), "Expected consumer counter to be greater than %d, but got %d", countersAfterSettingLowMaxGasPrice[0].Int64(), latestCounter.Int64()) }, "2m", "5s").Should(gomega.Succeed()) // ~1m for cluster setup, ~1m for performing each upkeep once l.Info().Int64("Upkeep Performed times", latestCounter.Int64()).Msg("the first upkeep performed again") })` $DIR/integration-tests/smoke/automation_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/automation_test.go: `.GetConfig("Smoke", tc.Automation)` $DIR/integration-tests/smoke/automation_test.go: `.ChainClient.Client.BlockNumber(context.Background())` $DIR/integration-tests/smoke/automation_test.go: `.Background()` $DIR/integration-tests/smoke/automation_test.go: `.DeployConsumers( t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, defaultAmountOfUpkeeps, big.NewInt(automationDefaultLinkFunds), automationDefaultUpkeepGasLimit, false, false, )` $DIR/integration-tests/smoke/automation_test.go: `.NewInt(automationDefaultLinkFunds)` $DIR/integration-tests/smoke/automation_test.go: `.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)() })` $DIR/integration-tests/smoke/automation_test.go: `.GetStalenessReportCleanupFn(t, a.Logger, a.ChainClient, sb, a.Registry, registryVersion)` $DIR/integration-tests/smoke/automation_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("waiting for all upkeeps to be performed at least once")` $DIR/integration-tests/smoke/automation_test.go: `.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d") } }, "4m", "5s")` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Expect(err)` $DIR/integration-tests/smoke/automation_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/automation_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/automation_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d")` $DIR/integration-tests/smoke/automation_test.go: `.BeNumerically(">", int64(0))` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.Marshal(gasprice.UpkeepOffchainConfig{MaxGasPrice: big.NewInt(1)})` $DIR/integration-tests/smoke/automation_test.go: `.NewInt(1)` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Msgf("setting all upkeeps' offchain config to %s, which means maxGasPrice is 1 wei", hexutil.Encode(uoc))` $DIR/integration-tests/smoke/automation_test.go: `.Encode(uoc)` $DIR/integration-tests/smoke/automation_test.go: `.Registry.SetUpkeepOffchainConfig(uid, uoc)` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Int64("Upkeep Performed times", countersAfterSettingLowMaxGasPrice[i].Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int("Upkeep index", i)` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Number of upkeeps performed after setting low max gas price")` $DIR/integration-tests/smoke/automation_test.go: `.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { latestCounter, err = consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterSettingLowMaxGasPrice[i].Int64()+1), "Expected consumer counter to be less than %d, but got %d", countersAfterSettingLowMaxGasPrice[i].Int64()+1, latestCounter.Int64()) } }, "2m", "5s")` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Expect(err)` $DIR/integration-tests/smoke/automation_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/automation_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/automation_test.go: `.Expect(latestCounter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.BeNumerically("<=", countersAfterSettingLowMaxGasPrice[i].Int64()+1), "Expected consumer counter to be less than %d, but got %d", countersAfterSettingLowMaxGasPrice[i].Int64()+1, latestCounter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.BeNumerically("<=", countersAfterSettingLowMaxGasPrice[i].Int64()+1)` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("no upkeeps is performed because their max gas price is only 1 wei")` $DIR/integration-tests/smoke/automation_test.go: `.Marshal(gasprice.UpkeepOffchainConfig{MaxGasPrice: big.NewInt(500_000_000_000)})` $DIR/integration-tests/smoke/automation_test.go: `.NewInt(500_000_000_000)` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Msgf("setting the first upkeeps' offchain config to %s, which means maxGasPrice is 500 gwei", hexutil.Encode(uoc))` $DIR/integration-tests/smoke/automation_test.go: `.Encode(uoc)` $DIR/integration-tests/smoke/automation_test.go: `.Registry.SetUpkeepOffchainConfig(upkeepIDs[0], uoc)` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Int64("No of Upkeep Performed", latestCounter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Str("Consumer address", consumers[i].Address())` $DIR/integration-tests/smoke/automation_test.go: `.Address()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Number of upkeeps performed just after setting offchain config")` $DIR/integration-tests/smoke/automation_test.go: `.Consistently(func(g gomega.Gomega) { activeConsumers := 0 for i := 0; i < len(upkeepIDs); i++ { latestCounter, err = consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) if latestCounter.Int64() != upkeepsPerformedAfter[i] { activeConsumers++ } upkeepsPerformedAfter[i] = latestCounter.Int64() } // 0 is also okay, because it means that no upkeep was performed yet g.Expect(activeConsumers).Should(gomega.BeNumerically("<=", 1), "Only one consumer should have been performing upkeeps, but %d did", activeConsumers) }, "2m", "5s")` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Expect(err)` $DIR/integration-tests/smoke/automation_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/automation_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Expect(activeConsumers)` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.BeNumerically("<=", 1), "Only one consumer should have been performing upkeeps, but %d did", activeConsumers)` $DIR/integration-tests/smoke/automation_test.go: `.BeNumerically("<=", 1)` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Int64("No of Upkeep Performed", latestCounter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Str("Consumer address", consumers[i].Address())` $DIR/integration-tests/smoke/automation_test.go: `.Address()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("Number of upkeeps performed after waiting for the results of offchain config change")` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("all the rest upkeeps did not perform again because their max gas price remains 1 wei")` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("making sure the consumer keeps performing upkeeps because its max gas price is 500 gwei")` $DIR/integration-tests/smoke/automation_test.go: `.Eventually(func(g gomega.Gomega) { latestCounter, err = consumers[performingConsumerIndex].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), fmt.Sprintf("Failed to retrieve consumer counter for upkeep at index %d", performingConsumerIndex)) g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically(">", countersAfterSettingLowMaxGasPrice[0].Int64()), "Expected consumer counter to be greater than %d, but got %d", countersAfterSettingLowMaxGasPrice[0].Int64(), latestCounter.Int64()) }, "2m", "5s")` $DIR/integration-tests/smoke/automation_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/automation_test.go: `.Get(t)` $DIR/integration-tests/smoke/automation_test.go: `.Expect(err)` $DIR/integration-tests/smoke/automation_test.go: `.ShouldNot(gomega.HaveOccurred(), fmt.Sprintf("Failed to retrieve consumer counter for upkeep at index %d", performingConsumerIndex))` $DIR/integration-tests/smoke/automation_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/automation_test.go: `.Sprintf("Failed to retrieve consumer counter for upkeep at index %d", performingConsumerIndex)` $DIR/integration-tests/smoke/automation_test.go: `.Expect(latestCounter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.BeNumerically(">", countersAfterSettingLowMaxGasPrice[0].Int64()), "Expected consumer counter to be greater than %d, but got %d", countersAfterSettingLowMaxGasPrice[0].Int64(), latestCounter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.BeNumerically(">", countersAfterSettingLowMaxGasPrice[0].Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/automation_test.go: `.Succeed()` $DIR/integration-tests/smoke/automation_test.go: `.Info()` $DIR/integration-tests/smoke/automation_test.go: `.Int64("Upkeep Performed times", latestCounter.Int64())` $DIR/integration-tests/smoke/automation_test.go: `.Int64()` $DIR/integration-tests/smoke/automation_test.go: `.Msg("the first upkeep performed again")` $DIR/integration-tests/smoke/cron_test.go: `err = env.MockAdapter.SetAdapterBasedIntValuePath("/variable", []string{http.MethodGet, http.MethodPost}, 5)` $DIR/integration-tests/smoke/cron_test.go: `err = env.ClCluster.Nodes[0].API.MustCreateBridge(bta)` $DIR/integration-tests/smoke/cron_test.go: `l.Info().Err(err).Msg("error while waiting for job runs")` $DIR/integration-tests/smoke/cron_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Reading Job run data shouldn't fail")` $DIR/integration-tests/smoke/cron_test.go: `g.Expect(len(jobRuns.Data)).Should(gomega.BeNumerically(">=", 5), "Expected number of job runs to be greater than 5, but got %d", len(jobRuns.Data))` $DIR/integration-tests/smoke/cron_test.go: `g.Expect(jr.Attributes.Errors).Should(gomega.Equal([]interface{}{nil}), "Job run %s shouldn't have errors", jr.ID)` $DIR/integration-tests/smoke/cron_test.go: `err = env.MockAdapter.SetAdapterBasedIntValuePath("/variable", []string{http.MethodGet, http.MethodPost}, 5)` $DIR/integration-tests/smoke/cron_test.go: `err = env.ClCluster.Nodes[0].API.MustCreateBridge(bta)` $DIR/integration-tests/smoke/cron_test.go: `gom.Eventually(func(g gomega.Gomega) { jobRuns, err := env.ClCluster.Nodes[0].API.MustReadRunsByJob(job.Data.ID) if err != nil { l.Info().Err(err).Msg("error while waiting for job runs") } g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Reading Job run data shouldn't fail") g.Expect(len(jobRuns.Data)).Should(gomega.BeNumerically(">=", 5), "Expected number of job runs to be greater than 5, but got %d", len(jobRuns.Data)) for _, jr := range jobRuns.Data { g.Expect(jr.Attributes.Errors).Should(gomega.Equal([]interface{}{nil}), "Job run %s shouldn't have errors", jr.ID) } }, "3m", "3s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/cron_test.go: `l.Info().Err(err).Msg("error while waiting for job runs")` $DIR/integration-tests/smoke/cron_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Reading Job run data shouldn't fail")` $DIR/integration-tests/smoke/cron_test.go: `g.Expect(len(jobRuns.Data)).Should(gomega.BeNumerically(">=", 5), "Expected number of job runs to be greater than 5, but got %d", len(jobRuns.Data))` $DIR/integration-tests/smoke/cron_test.go: `g.Expect(jr.Attributes.Errors).Should(gomega.Equal([]interface{}{nil}), "Job run %s shouldn't have errors", jr.ID)` $DIR/integration-tests/smoke/cron_test.go: `err = env.ClCluster.Nodes[0].API.MustDeleteJob(job.Data.ID)` $DIR/integration-tests/smoke/cron_test.go: `job, err = env.ClCluster.Nodes[0].API.MustCreateJob(&client.CronJobSpec{ Schedule: "CRON_TZ=UTC * * * * * *", ObservationSource: client.ObservationSourceSpecBridge(bta), })` $DIR/integration-tests/smoke/cron_test.go: `l.Info().Err(err).Msg("error while waiting for job runs")` $DIR/integration-tests/smoke/cron_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Reading Job run data shouldn't fail")` $DIR/integration-tests/smoke/cron_test.go: `g.Expect(len(jobRuns.Data)).Should(gomega.BeNumerically(">=", 5), "Expected number of job runs to be greater than 5, but got %d", len(jobRuns.Data))` $DIR/integration-tests/smoke/cron_test.go: `g.Expect(jr.Attributes.Errors).Should(gomega.Equal([]interface{}{nil}), "Job run %s shouldn't have errors", jr.ID)` $DIR/integration-tests/smoke/cron_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/cron_test.go: `.GetConfig("Smoke", tc.Cron)` $DIR/integration-tests/smoke/cron_test.go: `.EthereumNetworkConfigFromConfig(l, &config)` $DIR/integration-tests/smoke/cron_test.go: `.NewCLTestEnvBuilder()` $DIR/integration-tests/smoke/cron_test.go: `. WithTestInstance(t)` $DIR/integration-tests/smoke/cron_test.go: `. WithTestConfig(&config)` $DIR/integration-tests/smoke/cron_test.go: `. WithPrivateEthereumNetwork(privateNetwork.EthereumNetworkConfig)` $DIR/integration-tests/smoke/cron_test.go: `. WithMockAdapter()` $DIR/integration-tests/smoke/cron_test.go: `. WithCLNodes(1)` $DIR/integration-tests/smoke/cron_test.go: `. WithStandardCleanup()` $DIR/integration-tests/smoke/cron_test.go: `. WithSeth()` $DIR/integration-tests/smoke/cron_test.go: `. Build()` $DIR/integration-tests/smoke/cron_test.go: `.MockAdapter.SetAdapterBasedIntValuePath("/variable", []string{http.MethodGet, http.MethodPost}, 5)` $DIR/integration-tests/smoke/cron_test.go: `.Sprintf("variable-%s", uuid.NewString())` $DIR/integration-tests/smoke/cron_test.go: `.NewString()` $DIR/integration-tests/smoke/cron_test.go: `.Sprintf("%s/variable", env.MockAdapter.InternalEndpoint)` $DIR/integration-tests/smoke/cron_test.go: `.API.MustCreateBridge(bta)` $DIR/integration-tests/smoke/cron_test.go: `.API.MustCreateJob(&client.CronJobSpec{ Schedule: "CRON_TZ=UTC * * * * * *", ObservationSource: client.ObservationSourceSpecBridge(bta), })` $DIR/integration-tests/smoke/cron_test.go: `.ObservationSourceSpecBridge(bta)` $DIR/integration-tests/smoke/cron_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/cron_test.go: `.Eventually(func(g gomega.Gomega) { jobRuns, err := env.ClCluster.Nodes[0].API.MustReadRunsByJob(job.Data.ID) if err != nil { l.Info().Err(err).Msg("error while waiting for job runs") } g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Reading Job run data shouldn't fail") g.Expect(len(jobRuns.Data)).Should(gomega.BeNumerically(">=", 5), "Expected number of job runs to be greater than 5, but got %d", len(jobRuns.Data)) for _, jr := range jobRuns.Data { g.Expect(jr.Attributes.Errors).Should(gomega.Equal([]interface{}{nil}), "Job run %s shouldn't have errors", jr.ID) } }, "2m", "3s")` $DIR/integration-tests/smoke/cron_test.go: `.API.MustReadRunsByJob(job.Data.ID)` $DIR/integration-tests/smoke/cron_test.go: `.Info()` $DIR/integration-tests/smoke/cron_test.go: `.Err(err)` $DIR/integration-tests/smoke/cron_test.go: `.Msg("error while waiting for job runs")` $DIR/integration-tests/smoke/cron_test.go: `.Expect(err)` $DIR/integration-tests/smoke/cron_test.go: `.ShouldNot(gomega.HaveOccurred(), "Reading Job run data shouldn't fail")` $DIR/integration-tests/smoke/cron_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/cron_test.go: `.Expect(len(jobRuns.Data))` $DIR/integration-tests/smoke/cron_test.go: `.Should(gomega.BeNumerically(">=", 5), "Expected number of job runs to be greater than 5, but got %d", len(jobRuns.Data))` $DIR/integration-tests/smoke/cron_test.go: `.BeNumerically(">=", 5)` $DIR/integration-tests/smoke/cron_test.go: `.Expect(jr.Attributes.Errors)` $DIR/integration-tests/smoke/cron_test.go: `.Should(gomega.Equal([]interface{}{nil}), "Job run %s shouldn't have errors", jr.ID)` $DIR/integration-tests/smoke/cron_test.go: `.Equal([]interface{}{nil})` $DIR/integration-tests/smoke/cron_test.go: `.Succeed()` $DIR/integration-tests/smoke/cron_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/cron_test.go: `.GetConfig("Smoke", tc.Cron)` $DIR/integration-tests/smoke/cron_test.go: `.EthereumNetworkConfigFromConfig(l, &config)` $DIR/integration-tests/smoke/cron_test.go: `.NewCLTestEnvBuilder()` $DIR/integration-tests/smoke/cron_test.go: `. WithTestInstance(t)` $DIR/integration-tests/smoke/cron_test.go: `. WithTestConfig(&config)` $DIR/integration-tests/smoke/cron_test.go: `. WithPrivateEthereumNetwork(privateNetwork.EthereumNetworkConfig)` $DIR/integration-tests/smoke/cron_test.go: `. WithMockAdapter()` $DIR/integration-tests/smoke/cron_test.go: `. WithCLNodes(1)` $DIR/integration-tests/smoke/cron_test.go: `. WithStandardCleanup()` $DIR/integration-tests/smoke/cron_test.go: `. WithSeth()` $DIR/integration-tests/smoke/cron_test.go: `. Build()` $DIR/integration-tests/smoke/cron_test.go: `.MockAdapter.SetAdapterBasedIntValuePath("/variable", []string{http.MethodGet, http.MethodPost}, 5)` $DIR/integration-tests/smoke/cron_test.go: `.Sprintf("variable-%s", uuid.NewString())` $DIR/integration-tests/smoke/cron_test.go: `.NewString()` $DIR/integration-tests/smoke/cron_test.go: `.Sprintf("%s/variable", env.MockAdapter.InternalEndpoint)` $DIR/integration-tests/smoke/cron_test.go: `.API.MustCreateBridge(bta)` $DIR/integration-tests/smoke/cron_test.go: `.API.MustCreateJob(&client.CronJobSpec{ Schedule: "CRON_TZ=UTC * * * * * *", ObservationSource: client.ObservationSourceSpecBridge(bta), })` $DIR/integration-tests/smoke/cron_test.go: `.ObservationSourceSpecBridge(bta)` $DIR/integration-tests/smoke/cron_test.go: `.NewWithT(t)` $DIR/integration-tests/smoke/cron_test.go: `.Eventually(func(g gomega.Gomega) { jobRuns, err := env.ClCluster.Nodes[0].API.MustReadRunsByJob(job.Data.ID) if err != nil { l.Info().Err(err).Msg("error while waiting for job runs") } g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Reading Job run data shouldn't fail") g.Expect(len(jobRuns.Data)).Should(gomega.BeNumerically(">=", 5), "Expected number of job runs to be greater than 5, but got %d", len(jobRuns.Data)) for _, jr := range jobRuns.Data { g.Expect(jr.Attributes.Errors).Should(gomega.Equal([]interface{}{nil}), "Job run %s shouldn't have errors", jr.ID) } }, "3m", "3s")` $DIR/integration-tests/smoke/cron_test.go: `.API.MustReadRunsByJob(job.Data.ID)` $DIR/integration-tests/smoke/cron_test.go: `.Info()` $DIR/integration-tests/smoke/cron_test.go: `.Err(err)` $DIR/integration-tests/smoke/cron_test.go: `.Msg("error while waiting for job runs")` $DIR/integration-tests/smoke/cron_test.go: `.Expect(err)` $DIR/integration-tests/smoke/cron_test.go: `.ShouldNot(gomega.HaveOccurred(), "Reading Job run data shouldn't fail")` $DIR/integration-tests/smoke/cron_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/cron_test.go: `.Expect(len(jobRuns.Data))` $DIR/integration-tests/smoke/cron_test.go: `.Should(gomega.BeNumerically(">=", 5), "Expected number of job runs to be greater than 5, but got %d", len(jobRuns.Data))` $DIR/integration-tests/smoke/cron_test.go: `.BeNumerically(">=", 5)` $DIR/integration-tests/smoke/cron_test.go: `.Expect(jr.Attributes.Errors)` $DIR/integration-tests/smoke/cron_test.go: `.Should(gomega.Equal([]interface{}{nil}), "Job run %s shouldn't have errors", jr.ID)` $DIR/integration-tests/smoke/cron_test.go: `.Equal([]interface{}{nil})` $DIR/integration-tests/smoke/cron_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/cron_test.go: `.Succeed()` $DIR/integration-tests/smoke/cron_test.go: `.API.MustDeleteJob(job.Data.ID)` $DIR/integration-tests/smoke/cron_test.go: `.API.MustCreateJob(&client.CronJobSpec{ Schedule: "CRON_TZ=UTC * * * * * *", ObservationSource: client.ObservationSourceSpecBridge(bta), })` $DIR/integration-tests/smoke/cron_test.go: `.ObservationSourceSpecBridge(bta)` $DIR/integration-tests/smoke/cron_test.go: `.Eventually(func(g gomega.Gomega) { jobRuns, err := env.ClCluster.Nodes[0].API.MustReadRunsByJob(job.Data.ID) if err != nil { l.Info().Err(err).Msg("error while waiting for job runs") } g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Reading Job run data shouldn't fail") g.Expect(len(jobRuns.Data)).Should(gomega.BeNumerically(">=", 5), "Expected number of job runs to be greater than 5, but got %d", len(jobRuns.Data)) for _, jr := range jobRuns.Data { g.Expect(jr.Attributes.Errors).Should(gomega.Equal([]interface{}{nil}), "Job run %s shouldn't have errors", jr.ID) } }, "3m", "3s")` $DIR/integration-tests/smoke/cron_test.go: `.API.MustReadRunsByJob(job.Data.ID)` $DIR/integration-tests/smoke/cron_test.go: `.Info()` $DIR/integration-tests/smoke/cron_test.go: `.Err(err)` $DIR/integration-tests/smoke/cron_test.go: `.Msg("error while waiting for job runs")` $DIR/integration-tests/smoke/cron_test.go: `.Expect(err)` $DIR/integration-tests/smoke/cron_test.go: `.ShouldNot(gomega.HaveOccurred(), "Reading Job run data shouldn't fail")` $DIR/integration-tests/smoke/cron_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/cron_test.go: `.Expect(len(jobRuns.Data))` $DIR/integration-tests/smoke/cron_test.go: `.Should(gomega.BeNumerically(">=", 5), "Expected number of job runs to be greater than 5, but got %d", len(jobRuns.Data))` $DIR/integration-tests/smoke/cron_test.go: `.BeNumerically(">=", 5)` $DIR/integration-tests/smoke/cron_test.go: `.Expect(jr.Attributes.Errors)` $DIR/integration-tests/smoke/cron_test.go: `.Should(gomega.Equal([]interface{}{nil}), "Job run %s shouldn't have errors", jr.ID)` $DIR/integration-tests/smoke/cron_test.go: `.Equal([]interface{}{nil})` $DIR/integration-tests/smoke/cron_test.go: `.Succeed()` $DIR/integration-tests/smoke/flux_test.go: `err = env.MockAdapter.SetAdapterBasedIntValuePath(adapterPath, []string{http.MethodPost}, 1e5)` $DIR/integration-tests/smoke/flux_test.go: `err = lt.Transfer(fluxInstance.Address(), big.NewInt(1e18))` $DIR/integration-tests/smoke/flux_test.go: `err = fluxInstance.UpdateAvailableFunds()` $DIR/integration-tests/smoke/flux_test.go: `err = env.FundChainlinkNodes(big.NewFloat(1))` $DIR/integration-tests/smoke/flux_test.go: `err = fluxInstance.SetOracles( contracts.FluxAggregatorSetOraclesOptions{ AddList: nodeAddresses, RemoveList: []common.Address{}, AdminList: nodeAddresses, MinSubmissions: 3, MaxSubmissions: 3, RestartDelayRounds: 0, })` $DIR/integration-tests/smoke/flux_test.go: `l.Info().Str("Oracles", strings.Join(oracles, ",")).Msg("Oracles set")` $DIR/integration-tests/smoke/flux_test.go: `l.Info().Str("AdapterFullURL", adapterFullURL).Send()` $DIR/integration-tests/smoke/flux_test.go: `err = n.API.MustCreateBridge(bta)` $DIR/integration-tests/smoke/flux_test.go: `_, err = n.API.MustCreateJob(fluxSpec)` $DIR/integration-tests/smoke/flux_test.go: `err = actions_seth.WatchNewFluxRound(l, sethClient, 1, fluxInstance, fluxRoundTimeout)` $DIR/integration-tests/smoke/flux_test.go: `err = env.MockAdapter.SetAdapterBasedIntValuePath(adapterPath, []string{http.MethodPost}, 1e10)` $DIR/integration-tests/smoke/flux_test.go: `err = actions_seth.WatchNewFluxRound(l, sethClient, 2, fluxInstance, fluxRoundTimeout)` $DIR/integration-tests/smoke/flux_test.go: `data, err = fluxInstance.GetContractData(testcontext.Get(t))` $DIR/integration-tests/smoke/flux_test.go: `l.Info().Interface("data", data).Msg("Round data")` $DIR/integration-tests/smoke/flux_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/flux_test.go: `.GetConfig("Smoke", tc.Flux)` $DIR/integration-tests/smoke/flux_test.go: `.EthereumNetworkConfigFromConfig(l, &config)` $DIR/integration-tests/smoke/flux_test.go: `.NewCLTestEnvBuilder()` $DIR/integration-tests/smoke/flux_test.go: `. WithTestInstance(t)` $DIR/integration-tests/smoke/flux_test.go: `. WithTestConfig(&config)` $DIR/integration-tests/smoke/flux_test.go: `. WithPrivateEthereumNetwork(privateNetwork.EthereumNetworkConfig)` $DIR/integration-tests/smoke/flux_test.go: `. WithMockAdapter()` $DIR/integration-tests/smoke/flux_test.go: `. WithCLNodes(3)` $DIR/integration-tests/smoke/flux_test.go: `. WithStandardCleanup()` $DIR/integration-tests/smoke/flux_test.go: `. WithSeth()` $DIR/integration-tests/smoke/flux_test.go: `. Build()` $DIR/integration-tests/smoke/flux_test.go: `.ClCluster.NodeAddresses()` $DIR/integration-tests/smoke/flux_test.go: `.MustGetSelectedNetworkConfig(config.GetNetworkConfig())` $DIR/integration-tests/smoke/flux_test.go: `.GetNetworkConfig()` $DIR/integration-tests/smoke/flux_test.go: `.GetSethClient(network.ChainID)` $DIR/integration-tests/smoke/flux_test.go: `.NewString()` $DIR/integration-tests/smoke/flux_test.go: `.Sprintf("/variable-%s", adapterUUID)` $DIR/integration-tests/smoke/flux_test.go: `.MockAdapter.SetAdapterBasedIntValuePath(adapterPath, []string{http.MethodPost}, 1e5)` $DIR/integration-tests/smoke/flux_test.go: `.DeployLinkTokenContract(l, sethClient)` $DIR/integration-tests/smoke/flux_test.go: `.DeployFluxAggregatorContract(sethClient, lt.Address(), contracts.DefaultFluxAggregatorOptions())` $DIR/integration-tests/smoke/flux_test.go: `.Address()` $DIR/integration-tests/smoke/flux_test.go: `.DefaultFluxAggregatorOptions()` $DIR/integration-tests/smoke/flux_test.go: `.Transfer(fluxInstance.Address(), big.NewInt(1e18))` $DIR/integration-tests/smoke/flux_test.go: `.Address()` $DIR/integration-tests/smoke/flux_test.go: `.NewInt(1e18)` $DIR/integration-tests/smoke/flux_test.go: `.UpdateAvailableFunds()` $DIR/integration-tests/smoke/flux_test.go: `.FundChainlinkNodes(big.NewFloat(1))` $DIR/integration-tests/smoke/flux_test.go: `.NewFloat(1)` $DIR/integration-tests/smoke/flux_test.go: `.SetOracles( contracts.FluxAggregatorSetOraclesOptions{ AddList: nodeAddresses, RemoveList: []common.Address{}, AdminList: nodeAddresses, MinSubmissions: 3, MaxSubmissions: 3, RestartDelayRounds: 0, })` $DIR/integration-tests/smoke/flux_test.go: `.GetOracles(testcontext.Get(t))` $DIR/integration-tests/smoke/flux_test.go: `.Get(t)` $DIR/integration-tests/smoke/flux_test.go: `.Info()` $DIR/integration-tests/smoke/flux_test.go: `.Str("Oracles", strings.Join(oracles, ","))` $DIR/integration-tests/smoke/flux_test.go: `.Join(oracles, ",")` $DIR/integration-tests/smoke/flux_test.go: `.Msg("Oracles set")` $DIR/integration-tests/smoke/flux_test.go: `.Sprintf("%s%s", env.MockAdapter.InternalEndpoint, adapterPath)` $DIR/integration-tests/smoke/flux_test.go: `.Info()` $DIR/integration-tests/smoke/flux_test.go: `.Str("AdapterFullURL", adapterFullURL)` $DIR/integration-tests/smoke/flux_test.go: `.Send()` $DIR/integration-tests/smoke/flux_test.go: `.Sprintf("variable-%s", adapterUUID)` $DIR/integration-tests/smoke/flux_test.go: `.API.MustCreateBridge(bta)` $DIR/integration-tests/smoke/flux_test.go: `.Sprintf("flux-monitor-%s", adapterUUID)` $DIR/integration-tests/smoke/flux_test.go: `.Address()` $DIR/integration-tests/smoke/flux_test.go: `.Sprint(sethClient.ChainID)` $DIR/integration-tests/smoke/flux_test.go: `.ObservationSourceSpecBridge(bta)` $DIR/integration-tests/smoke/flux_test.go: `.API.MustCreateJob(fluxSpec)` $DIR/integration-tests/smoke/flux_test.go: `.WatchNewFluxRound(l, sethClient, 1, fluxInstance, fluxRoundTimeout)` $DIR/integration-tests/smoke/flux_test.go: `.GetContractData(testcontext.Get(t))` $DIR/integration-tests/smoke/flux_test.go: `.Get(t)` $DIR/integration-tests/smoke/flux_test.go: `.MockAdapter.SetAdapterBasedIntValuePath(adapterPath, []string{http.MethodPost}, 1e10)` $DIR/integration-tests/smoke/flux_test.go: `.WatchNewFluxRound(l, sethClient, 2, fluxInstance, fluxRoundTimeout)` $DIR/integration-tests/smoke/flux_test.go: `.GetContractData(testcontext.Get(t))` $DIR/integration-tests/smoke/flux_test.go: `.Get(t)` $DIR/integration-tests/smoke/flux_test.go: `.Info()` $DIR/integration-tests/smoke/flux_test.go: `.Interface("data", data)` $DIR/integration-tests/smoke/flux_test.go: `.Msg("Round data")` $DIR/integration-tests/smoke/flux_test.go: `.WithdrawablePayment(testcontext.Get(t), oracleAddr)` $DIR/integration-tests/smoke/flux_test.go: `.Get(t)` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `l.Info().Str("ETH amount per node", fundingAmount.String()).Msg("Funding Chainlink nodes")` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `err = actions_seth.FundChainlinkNodesFromRootAddress(l, sethClient, contracts.ChainlinkClientToChainlinkNodeWithKeysAndAddress(workerNodes), fundingAmount)` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `actions_seth.AcceptAuthorizedReceiversOperator( t, l, sethClient, operators[i], authorizedForwarders[i], []common.Address{workerNodeAddresses[i]}, )` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `actions_seth.TrackForwarder(t, sethClient, authorizedForwarders[i], workerNodes[i])` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `err = actions.CreateOCRJobsWithForwarderLocal(ocrInstances, bootstrapNode, workerNodes, 5, env.MockAdapter, fmt.Sprint(sethClient.ChainID))` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `err = actions_seth.WatchNewOCRRound(l, sethClient, 1, contracts.V1OffChainAgrregatorToOffChainAggregatorWithRounds(ocrInstances), time.Duration(10*time.Minute))` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `err = actions.SetAllAdapterResponsesToTheSameValueLocal(10, ocrInstances, workerNodes, env.MockAdapter)` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `err = actions_seth.WatchNewOCRRound(l, sethClient, 2, contracts.V1OffChainAgrregatorToOffChainAggregatorWithRounds(ocrInstances), time.Duration(10*time.Minute))` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `answer, err = ocrInstances[0].GetLatestAnswer(testcontext.Get(t))` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.GetConfig("Smoke", tc.ForwarderOcr)` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.EthereumNetworkConfigFromConfig(l, &config)` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.NewCLTestEnvBuilder()` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `. WithTestInstance(t)` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `. WithTestConfig(&config)` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `. WithPrivateEthereumNetwork(privateNetwork.EthereumNetworkConfig)` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `. WithMockAdapter()` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `. WithCLNodes(6)` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `. WithFunding(big.NewFloat(*config.Common.ChainlinkNodeFunding))` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.NewFloat(*config.Common.ChainlinkNodeFunding)` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `. WithStandardCleanup()` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `. WithSeth()` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `. Build()` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.ClCluster.NodeAPIs()` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.ChainlinkNodeAddressesLocal(workerNodes)` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.MustGetSelectedNetworkConfig(config.Network)` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.GetSethClient(selectedNetwork.ChainID)` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.DeployLinkTokenContract(l, sethClient)` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.NewFloat(.05)` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.Info()` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.Str("ETH amount per node", fundingAmount.String())` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.String()` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.Msg("Funding Chainlink nodes")` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.FundChainlinkNodesFromRootAddress(l, sethClient, contracts.ChainlinkClientToChainlinkNodeWithKeysAndAddress(workerNodes), fundingAmount)` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.ChainlinkClientToChainlinkNodeWithKeysAndAddress(workerNodes)` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.DeployForwarderContracts( t, sethClient, common.HexToAddress(lt.Address()), len(workerNodes), )` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.HexToAddress(lt.Address())` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.Address()` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.AcceptAuthorizedReceiversOperator( t, l, sethClient, operators[i], authorizedForwarders[i], []common.Address{workerNodeAddresses[i]}, )` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.TrackForwarder(t, sethClient, authorizedForwarders[i], workerNodes[i])` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.DeployOCRContractsForwarderFlow( l, sethClient, 1, common.HexToAddress(lt.Address()), contracts.ChainlinkClientToChainlinkNodeWithKeysAndAddress(workerNodes), authorizedForwarders, )` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.HexToAddress(lt.Address())` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.Address()` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.ChainlinkClientToChainlinkNodeWithKeysAndAddress(workerNodes)` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.CreateOCRJobsWithForwarderLocal(ocrInstances, bootstrapNode, workerNodes, 5, env.MockAdapter, fmt.Sprint(sethClient.ChainID))` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.Sprint(sethClient.ChainID)` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.WatchNewOCRRound(l, sethClient, 1, contracts.V1OffChainAgrregatorToOffChainAggregatorWithRounds(ocrInstances), time.Duration(10*time.Minute))` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.V1OffChainAgrregatorToOffChainAggregatorWithRounds(ocrInstances)` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.Duration(10*time.Minute)` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.GetLatestAnswer(testcontext.Get(t))` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.Get(t)` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.SetAllAdapterResponsesToTheSameValueLocal(10, ocrInstances, workerNodes, env.MockAdapter)` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.WatchNewOCRRound(l, sethClient, 2, contracts.V1OffChainAgrregatorToOffChainAggregatorWithRounds(ocrInstances), time.Duration(10*time.Minute))` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.V1OffChainAgrregatorToOffChainAggregatorWithRounds(ocrInstances)` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.Duration(10*time.Minute)` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.GetLatestAnswer(testcontext.Get(t))` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.Get(t)` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.Int64()` $DIR/integration-tests/smoke/forwarder_ocr_test.go: `.Int64()` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `l.Info().Str("ETH amount per node", fundingAmount.String()).Msg("Funding Chainlink nodes")` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `err = actions_seth.FundChainlinkNodesFromRootAddress(l, sethClient, contracts.ChainlinkClientToChainlinkNodeWithKeysAndAddress(workerNodes), fundingAmount)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `actions_seth.AcceptAuthorizedReceiversOperator( t, l, sethClient, operators[i], authorizedForwarders[i], []common.Address{workerNodeAddresses[i]}, )` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `actions_seth.TrackForwarder(t, sethClient, authorizedForwarders[i], workerNodes[i])` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `transmitters = append(transmitters, forwarderCommonAddress.Hex())` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `ocrv2Config.Transmitters = authorizedForwarders` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `err = actions_seth.ConfigureOCRv2AggregatorContracts(ocrv2Config, ocrInstances)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `err = actions.CreateOCRv2JobsLocal(ocrInstances, bootstrapNode, workerNodes, env.MockAdapter, "ocr2", 5, uint64(sethClient.ChainID), true, false)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `err = actions_seth.WatchNewOCRRound(l, sethClient, 1, contracts.V2OffChainAgrregatorToOffChainAggregatorWithRounds(ocrInstances), time.Duration(10*time.Minute))` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `err = env.MockAdapter.SetAdapterBasedIntValuePath("ocr2", []string{http.MethodGet, http.MethodPost}, ocrRoundVal)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `err = actions_seth.WatchNewOCRRound(l, sethClient, int64(i), contracts.V2OffChainAgrregatorToOffChainAggregatorWithRounds(ocrInstances), time.Duration(10*time.Minute))` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `answer, err = ocrInstances[0].GetLatestAnswer(testcontext.Get(t))` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.GetConfig("Smoke", tc.ForwarderOcr2)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.EthereumNetworkConfigFromConfig(l, &config)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.NewCLTestEnvBuilder()` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `. WithTestInstance(t)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `. WithTestConfig(&config)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `. WithPrivateEthereumNetwork(privateNetwork.EthereumNetworkConfig)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `. WithMockAdapter()` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `. WithCLNodes(6)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `. WithFunding(big.NewFloat(*config.Common.ChainlinkNodeFunding))` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.NewFloat(*config.Common.ChainlinkNodeFunding)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `. WithStandardCleanup()` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `. WithSeth()` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `. Build()` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.ClCluster.NodeAPIs()` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.ChainlinkNodeAddressesLocal(workerNodes)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.MustGetSelectedNetworkConfig(config.Network)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.GetSethClient(selectedNetwork.ChainID)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.DeployLinkTokenContract(l, sethClient)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.NewFloat(.05)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.Info()` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.Str("ETH amount per node", fundingAmount.String())` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.String()` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.Msg("Funding Chainlink nodes")` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.FundChainlinkNodesFromRootAddress(l, sethClient, contracts.ChainlinkClientToChainlinkNodeWithKeysAndAddress(workerNodes), fundingAmount)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.ChainlinkClientToChainlinkNodeWithKeysAndAddress(workerNodes)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.DeployForwarderContracts( t, sethClient, common.HexToAddress(lt.Address()), len(workerNodes), )` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.HexToAddress(lt.Address())` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.Address()` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.AcceptAuthorizedReceiversOperator( t, l, sethClient, operators[i], authorizedForwarders[i], []common.Address{workerNodeAddresses[i]}, )` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.TrackForwarder(t, sethClient, authorizedForwarders[i], workerNodes[i])` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.Hex()` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.DefaultOffChainAggregatorOptions()` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.DeployOCRv2Contracts(l, sethClient, 1, common.HexToAddress(lt.Address()), transmitters, ocrOffchainOptions)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.HexToAddress(lt.Address())` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.Address()` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.BuildMedianOCR2ConfigLocal(workerNodes, ocrOffchainOptions)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.ConfigureOCRv2AggregatorContracts(ocrv2Config, ocrInstances)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.CreateOCRv2JobsLocal(ocrInstances, bootstrapNode, workerNodes, env.MockAdapter, "ocr2", 5, uint64(sethClient.ChainID), true, false)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.WatchNewOCRRound(l, sethClient, 1, contracts.V2OffChainAgrregatorToOffChainAggregatorWithRounds(ocrInstances), time.Duration(10*time.Minute))` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.V2OffChainAgrregatorToOffChainAggregatorWithRounds(ocrInstances)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.Duration(10*time.Minute)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.GetLatestAnswer(testcontext.Get(t))` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.Get(t)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.MockAdapter.SetAdapterBasedIntValuePath("ocr2", []string{http.MethodGet, http.MethodPost}, ocrRoundVal)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.WatchNewOCRRound(l, sethClient, int64(i), contracts.V2OffChainAgrregatorToOffChainAggregatorWithRounds(ocrInstances), time.Duration(10*time.Minute))` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.V2OffChainAgrregatorToOffChainAggregatorWithRounds(ocrInstances)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.Duration(10*time.Minute)` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.GetLatestAnswer(testcontext.Get(t))` $DIR/integration-tests/smoke/forwarders_ocr2_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `t.Run(fmt.Sprintf("registry_1_%d", registryVersion), func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Keeper) require.NoError(t, err, "Failed to get config") chainClient, chainlinkNodes, linkToken, _ := setupKeeperTest(l, t, &config) sb, err := chainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") registry, _, consumers, upkeepIDs := actions_seth.DeployKeeperContracts( t, registryVersion, keeperDefaultRegistryConfig, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, chainClient, big.NewInt(keeperDefaultLinkFunds), ) t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() }) _, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID)) require.NoError(t, err, "Error creating keeper jobs") gom := gomega.NewGomegaWithT(t) gom.Eventually(func(g gomega.Gomega) error { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 10 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(10)), "Expected consumer counter to be greater than 10, but got %d", counter.Int64()) l.Info().Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed") } return nil }, "5m", "1s").Should(gomega.Succeed()) // Cancel all the registered upkeeps via the registry for i := 0; i < len(upkeepIDs); i++ { err := registry.CancelUpkeep(upkeepIDs[i]) require.NoError(t, err, "Could not cancel upkeep at index %d", i) } var countersAfterCancellation = make([]*big.Int, len(upkeepIDs)) for i := 0; i < len(upkeepIDs); i++ { // Obtain the amount of times the upkeep has been executed so far countersAfterCancellation[i], err = consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) l.Info().Int("Index", i).Int64("Upkeeps Performed", countersAfterCancellation[i].Int64()).Msg("Cancelled Upkeep") } gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { // Expect the counter to remain constant because the upkeep was cancelled, so it shouldn't increase anymore latestCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.Equal(countersAfterCancellation[i].Int64()), "Expected consumer counter to remain constant at %d, but got %d", countersAfterCancellation[i].Int64(), latestCounter.Int64()) } }, "1m", "1s").Should(gomega.Succeed()) })` $DIR/integration-tests/smoke/keeper_test.go: `t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() })` $DIR/integration-tests/smoke/keeper_test.go: `actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)()` $DIR/integration-tests/smoke/keeper_test.go: `_, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `gom.Eventually(func(g gomega.Gomega) error { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 10 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(10)), "Expected consumer counter to be greater than 10, but got %d", counter.Int64()) l.Info().Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed") } return nil }, "5m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(10)), "Expected consumer counter to be greater than 10, but got %d", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/keeper_test.go: `countersAfterCancellation[i], err = consumers[i].Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Int("Index", i).Int64("Upkeeps Performed", countersAfterCancellation[i].Int64()).Msg("Cancelled Upkeep")` $DIR/integration-tests/smoke/keeper_test.go: `gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { // Expect the counter to remain constant because the upkeep was cancelled, so it shouldn't increase anymore latestCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.Equal(countersAfterCancellation[i].Int64()), "Expected consumer counter to remain constant at %d, but got %d", countersAfterCancellation[i].Int64(), latestCounter.Int64()) } }, "1m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(latestCounter.Int64()).Should(gomega.Equal(countersAfterCancellation[i].Int64()), "Expected consumer counter to remain constant at %d, but got %d", countersAfterCancellation[i].Int64(), latestCounter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `t.Run(fmt.Sprintf("registry_1_%d", registryVersion), func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Keeper) require.NoError(t, err, "Failed to get config") chainClient, chainlinkNodes, linkToken, _ := setupKeeperTest(l, t, &config) sb, err := chainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") registry, _, consumers, upkeepIDs := actions_seth.DeployKeeperContracts( t, registryVersion, highBCPTRegistryConfig, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, chainClient, big.NewInt(keeperDefaultLinkFunds), ) _, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID)) require.NoError(t, err, "Error creating keeper jobs") t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() }) keepersPerformedLowFreq := map[*big.Int][]string{} // gom := gomega.NewGomegaWithT(t) // Wait for upkeep to be performed by two different keepers that alternate (buddies) l.Info().Msg("Waiting for 2m for upkeeps to be performed by different keepers") ticker := time.NewTicker(1 * time.Second) defer ticker.Stop() stop := time.After(2 * time.Minute) LOW_LOOP: for { select { case <-ticker.C: for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Calling consumer's counter shouldn't fail") l.Info().Str("UpkeepId", upkeepIDs[i].String()).Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed") upkeepInfo, err := registry.GetUpkeepInfo(testcontext.Get(t), upkeepIDs[i]) require.NoError(t, err, "Registry's getUpkeep shouldn't fail") latestKeeper := upkeepInfo.LastKeeper if latestKeeper == actions.ZeroAddress.String() { continue } keepersPerformedLowFreq[upkeepIDs[i]] = append(keepersPerformedLowFreq[upkeepIDs[i]], latestKeeper) } case <-stop: ticker.Stop() break LOW_LOOP } } require.GreaterOrEqual(t, 2, len(keepersPerformedLowFreq), "At least 2 different keepers should have been performing upkeeps") // Now set BCPT to be low, so keepers change turn frequently err = registry.SetConfig(lowBCPTRegistryConfig, contracts.OCRv2Config{}) require.NoError(t, err, "Error setting registry config") keepersPerformedHigherFreq := map[*big.Int][]string{} ticker = time.NewTicker(1 * time.Second) defer ticker.Stop() stop = time.After(2 * time.Minute) HIGH_LOOP: for { select { case <-ticker.C: for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Calling consumer's counter shouldn't fail") l.Info().Str("UpkeepId", upkeepIDs[i].String()).Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed") upkeepInfo, err := registry.GetUpkeepInfo(testcontext.Get(t), upkeepIDs[i]) require.NoError(t, err, "Registry's getUpkeep shouldn't fail") latestKeeper := upkeepInfo.LastKeeper if latestKeeper == actions.ZeroAddress.String() { continue } keepersPerformedHigherFreq[upkeepIDs[i]] = append(keepersPerformedHigherFreq[upkeepIDs[i]], latestKeeper) } case <-stop: ticker.Stop() break HIGH_LOOP } } require.GreaterOrEqual(t, 3, len(keepersPerformedHigherFreq), "At least 3 different keepers should have been performing upkeeps after BCPT change") var countFreq = func(keepers []string, freqMap map[string]int) { for _, keeper := range keepers { freqMap[keeper]++ } } for i := 0; i < len(upkeepIDs); i++ { lowFreqMap := make(map[string]int) highFreqMap := make(map[string]int) countFreq(keepersPerformedLowFreq[upkeepIDs[i]], lowFreqMap) countFreq(keepersPerformedHigherFreq[upkeepIDs[i]], highFreqMap) require.Greater(t, len(highFreqMap), len(lowFreqMap), "High frequency map should have more keepers than low frequency map") l.Info().Interface("Low BCPT", lowFreqMap).Interface("High BCPT", highFreqMap).Str("UpkeepID", upkeepIDs[i].String()).Msg("Keeper frequency map") for lowKeeper, lowFreq := range lowFreqMap { highFreq, ok := highFreqMap[lowKeeper] // it might happen due to fluke that a keeper is not found in high frequency map if !ok { continue } // require.True(t, ok, "Keeper %s not found in high frequency map. This should not happen", lowKeeper) require.GreaterOrEqual(t, lowFreq, highFreq, "Keeper %s should have performed less times with high BCPT than with low BCPT", lowKeeper) } } })` $DIR/integration-tests/smoke/keeper_test.go: `_, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() })` $DIR/integration-tests/smoke/keeper_test.go: `actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)()` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Msg("Waiting for 2m for upkeeps to be performed by different keepers")` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Str("UpkeepId", upkeepIDs[i].String()).Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/keeper_test.go: `keepersPerformedLowFreq[upkeepIDs[i]] = append(keepersPerformedLowFreq[upkeepIDs[i]], latestKeeper)` $DIR/integration-tests/smoke/keeper_test.go: `ticker.Stop()` $DIR/integration-tests/smoke/keeper_test.go: `err = registry.SetConfig(lowBCPTRegistryConfig, contracts.OCRv2Config{})` $DIR/integration-tests/smoke/keeper_test.go: `ticker = time.NewTicker(1 * time.Second)` $DIR/integration-tests/smoke/keeper_test.go: `stop = time.After(2 * time.Minute)` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Str("UpkeepId", upkeepIDs[i].String()).Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/keeper_test.go: `keepersPerformedHigherFreq[upkeepIDs[i]] = append(keepersPerformedHigherFreq[upkeepIDs[i]], latestKeeper)` $DIR/integration-tests/smoke/keeper_test.go: `ticker.Stop()` $DIR/integration-tests/smoke/keeper_test.go: `freqMap[keeper]++` $DIR/integration-tests/smoke/keeper_test.go: `countFreq(keepersPerformedLowFreq[upkeepIDs[i]], lowFreqMap)` $DIR/integration-tests/smoke/keeper_test.go: `countFreq(keepersPerformedHigherFreq[upkeepIDs[i]], highFreqMap)` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Interface("Low BCPT", lowFreqMap).Interface("High BCPT", highFreqMap).Str("UpkeepID", upkeepIDs[i].String()).Msg("Keeper frequency map")` $DIR/integration-tests/smoke/keeper_test.go: `t.Run(fmt.Sprintf("registry_1_%d", registryVersion), func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Keeper) require.NoError(t, err, "Failed to get config") chainClient, chainlinkNodes, linkToken, _ := setupKeeperTest(l, t, &config) sb, err := chainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") registry, _, consumersPerformance, upkeepIDs := actions_seth.DeployPerformanceKeeperContracts( t, chainClient, registryVersion, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, &keeperDefaultRegistryConfig, big.NewInt(keeperDefaultLinkFunds), 10000, // How many blocks this upkeep will be eligible from first upkeep block 5, // Interval of blocks that upkeeps are expected to be performed 100000, // How much gas should be burned on checkUpkeep() calls 4000000, // How much gas should be burned on performUpkeep() calls. Initially set higher than defaultUpkeepGasLimit ) _, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID)) require.NoError(t, err, "Error creating keeper jobs") t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() }) consumerPerformance := consumersPerformance[0] upkeepID := upkeepIDs[0] gom := gomega.NewGomegaWithT(t) // Initially performGas is set high, so performUpkeep reverts and no upkeep should be performed gom.Consistently(func(g gomega.Gomega) { // Consumer count should remain at 0 cnt, err := consumerPerformance.GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail") g.Expect(cnt.Int64()).Should( gomega.Equal(int64(0)), "Expected consumer counter to remain constant at %d, but got %d", 0, cnt.Int64(), ) // Not even reverted upkeeps should be performed. Last keeper for the upkeep should be 0 address upkeepInfo, err := registry.GetUpkeepInfo(testcontext.Get(t), upkeepID) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Registry's getUpkeep shouldn't fail") g.Expect(upkeepInfo.LastKeeper).Should(gomega.Equal(actions.ZeroAddress.String()), "Last keeper should be zero address") }, "1m", "1s").Should(gomega.Succeed()) // Set performGas on consumer to be low, so that performUpkeep starts becoming successful err = consumerPerformance.SetPerformGasToBurn(testcontext.Get(t), big.NewInt(100000)) require.NoError(t, err, "Error setting PerformGasToBurn") // Upkeep should now start performing gom.Eventually(func(g gomega.Gomega) error { cnt, err := consumerPerformance.GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail") g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", cnt.Int64(), ) return nil }, "1m", "1s").Should(gomega.Succeed()) })` $DIR/integration-tests/smoke/keeper_test.go: `_, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() })` $DIR/integration-tests/smoke/keeper_test.go: `actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)()` $DIR/integration-tests/smoke/keeper_test.go: `gom.Consistently(func(g gomega.Gomega) { // Consumer count should remain at 0 cnt, err := consumerPerformance.GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail") g.Expect(cnt.Int64()).Should( gomega.Equal(int64(0)), "Expected consumer counter to remain constant at %d, but got %d", 0, cnt.Int64(), ) // Not even reverted upkeeps should be performed. Last keeper for the upkeep should be 0 address upkeepInfo, err := registry.GetUpkeepInfo(testcontext.Get(t), upkeepID) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Registry's getUpkeep shouldn't fail") g.Expect(upkeepInfo.LastKeeper).Should(gomega.Equal(actions.ZeroAddress.String()), "Last keeper should be zero address") }, "1m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail")` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(cnt.Int64()).Should( gomega.Equal(int64(0)), "Expected consumer counter to remain constant at %d, but got %d", 0, cnt.Int64(), )` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Registry's getUpkeep shouldn't fail")` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(upkeepInfo.LastKeeper).Should(gomega.Equal(actions.ZeroAddress.String()), "Last keeper should be zero address")` $DIR/integration-tests/smoke/keeper_test.go: `err = consumerPerformance.SetPerformGasToBurn(testcontext.Get(t), big.NewInt(100000))` $DIR/integration-tests/smoke/keeper_test.go: `gom.Eventually(func(g gomega.Gomega) error { cnt, err := consumerPerformance.GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail") g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", cnt.Int64(), ) return nil }, "1m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail")` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", cnt.Int64(), )` $DIR/integration-tests/smoke/keeper_test.go: `t.Run(fmt.Sprintf("registry_1_%d", registryVersion), func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Keeper) require.NoError(t, err, "Failed to get config") chainClient, chainlinkNodes, linkToken, _ := setupKeeperTest(l, t, &config) sb, err := chainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") registry, _, consumersPerformance, upkeepIDs := actions_seth.DeployPerformanceKeeperContracts( t, chainClient, registryVersion, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, &keeperDefaultRegistryConfig, big.NewInt(keeperDefaultLinkFunds), 10000, // How many blocks this upkeep will be eligible from first upkeep block 5, // Interval of blocks that upkeeps are expected to be performed 100000, // How much gas should be burned on checkUpkeep() calls 4000000, // How much gas should be burned on performUpkeep() calls. Initially set higher than defaultUpkeepGasLimit ) _, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID)) require.NoError(t, err, "Error creating keeper jobs") t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() }) gom := gomega.NewGomegaWithT(t) // Initially performGas is set higher than defaultUpkeepGasLimit, so no upkeep should be performed l.Info().Msg("Waiting for 1m for upkeeps to be performed") gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(cnt.Int64()).Should( gomega.Equal(int64(0)), "Expected consumer counter to remain constant at %d, but got %d", 0, cnt.Int64(), ) } }, "1m", "1s").Should(gomega.Succeed()) // Increase gas limit for the upkeep, higher than the performGasBurn l.Info().Msg("Setting upkeep gas limit higher than performGasBurn") for i := 0; i < len(upkeepIDs); i++ { err = registry.SetUpkeepGasLimit(upkeepIDs[i], uint32(4500000)) require.NoError(t, err, "Error setting Upkeep gas limit") } // Upkeep should now start performing l.Info().Msg("Waiting for 1m for upkeeps to be performed") gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", cnt.Int64(), ) } }, "1m", "1s").Should(gomega.Succeed()) // Now increase the checkGasBurn on consumer, upkeep should stop performing l.Info().Msg("Setting checkGasBurn higher than performGasBurn") for i := 0; i < len(upkeepIDs); i++ { err = consumersPerformance[i].SetCheckGasToBurn(testcontext.Get(t), big.NewInt(3000000)) require.NoError(t, err, "Error setting CheckGasToBurn") } // Get existing performed count existingCnts := make(map[*big.Int]*big.Int) for i := 0; i < len(upkeepIDs); i++ { existingCnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) existingCnts[upkeepIDs[i]] = existingCnt require.NoError(t, err, "Error calling consumer's counter") l.Info().Int64("Upkeep counter", existingCnt.Int64()).Msg("Check Gas Increased") } // In most cases count should remain constant, but there might be a straggling perform tx which // gets committed later. Since every keeper node cannot have more than 1 straggling tx, it // is sufficient to check that the upkeep count does not increase by more than 6. l.Info().Msg("Waiting for 3m to make sure no more than 6 upkeeps are performed") gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") existingCnt := existingCnts[upkeepIDs[i]] g.Expect(cnt.Int64()).Should( gomega.BeNumerically("<=", existingCnt.Int64()+numUpkeepsAllowedForStragglingTxs), "Expected consumer counter to remain constant at %d, but got %d", existingCnt.Int64(), cnt.Int64(), ) } }, "3m", "1s").Should(gomega.Succeed()) for i := 0; i < len(upkeepIDs); i++ { existingCnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) existingCnts[upkeepIDs[i]] = existingCnt require.NoError(t, err, "Error calling consumer's counter") l.Info().Int64("Upkeep counter", existingCnt.Int64()).Msg("Upkeep counter when consistently block finished") } // Now increase checkGasLimit on registry highCheckGasLimit := keeperDefaultRegistryConfig highCheckGasLimit.CheckGasLimit = uint32(5000000) err = registry.SetConfig(highCheckGasLimit, contracts.OCRv2Config{}) require.NoError(t, err, "Error setting registry config") // Upkeep should start performing again, and it should get regularly performed l.Info().Msg("Waiting for 1m for upkeeps to be performed") gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail") existingCnt := existingCnts[upkeepIDs[i]] g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", existingCnt.Int64()), "Expected consumer counter to be greater than %d, but got %d", existingCnt.Int64(), cnt.Int64(), ) } }, "1m", "1s").Should(gomega.Succeed()) })` $DIR/integration-tests/smoke/keeper_test.go: `_, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() })` $DIR/integration-tests/smoke/keeper_test.go: `actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)()` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Msg("Waiting for 1m for upkeeps to be performed")` $DIR/integration-tests/smoke/keeper_test.go: `gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(cnt.Int64()).Should( gomega.Equal(int64(0)), "Expected consumer counter to remain constant at %d, but got %d", 0, cnt.Int64(), ) } }, "1m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(cnt.Int64()).Should( gomega.Equal(int64(0)), "Expected consumer counter to remain constant at %d, but got %d", 0, cnt.Int64(), )` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Msg("Setting upkeep gas limit higher than performGasBurn")` $DIR/integration-tests/smoke/keeper_test.go: `err = registry.SetUpkeepGasLimit(upkeepIDs[i], uint32(4500000))` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Msg("Waiting for 1m for upkeeps to be performed")` $DIR/integration-tests/smoke/keeper_test.go: `gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", cnt.Int64(), ) } }, "1m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", cnt.Int64(), )` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Msg("Setting checkGasBurn higher than performGasBurn")` $DIR/integration-tests/smoke/keeper_test.go: `err = consumersPerformance[i].SetCheckGasToBurn(testcontext.Get(t), big.NewInt(3000000))` $DIR/integration-tests/smoke/keeper_test.go: `existingCnts[upkeepIDs[i]] = existingCnt` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Int64("Upkeep counter", existingCnt.Int64()).Msg("Check Gas Increased")` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Msg("Waiting for 3m to make sure no more than 6 upkeeps are performed")` $DIR/integration-tests/smoke/keeper_test.go: `gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") existingCnt := existingCnts[upkeepIDs[i]] g.Expect(cnt.Int64()).Should( gomega.BeNumerically("<=", existingCnt.Int64()+numUpkeepsAllowedForStragglingTxs), "Expected consumer counter to remain constant at %d, but got %d", existingCnt.Int64(), cnt.Int64(), ) } }, "3m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(cnt.Int64()).Should( gomega.BeNumerically("<=", existingCnt.Int64()+numUpkeepsAllowedForStragglingTxs), "Expected consumer counter to remain constant at %d, but got %d", existingCnt.Int64(), cnt.Int64(), )` $DIR/integration-tests/smoke/keeper_test.go: `existingCnts[upkeepIDs[i]] = existingCnt` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Int64("Upkeep counter", existingCnt.Int64()).Msg("Upkeep counter when consistently block finished")` $DIR/integration-tests/smoke/keeper_test.go: `highCheckGasLimit.CheckGasLimit = uint32(5000000)` $DIR/integration-tests/smoke/keeper_test.go: `err = registry.SetConfig(highCheckGasLimit, contracts.OCRv2Config{})` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Msg("Waiting for 1m for upkeeps to be performed")` $DIR/integration-tests/smoke/keeper_test.go: `gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail") existingCnt := existingCnts[upkeepIDs[i]] g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", existingCnt.Int64()), "Expected consumer counter to be greater than %d, but got %d", existingCnt.Int64(), cnt.Int64(), ) } }, "1m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail")` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", existingCnt.Int64()), "Expected consumer counter to be greater than %d, but got %d", existingCnt.Int64(), cnt.Int64(), )` $DIR/integration-tests/smoke/keeper_test.go: `t.Run(fmt.Sprintf("registry_1_%d", registryVersion), func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Keeper) require.NoError(t, err, "Failed to get config") chainClient, chainlinkNodes, linkToken, _ := setupKeeperTest(l, t, &config) sb, err := chainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") registry, registrar, consumers, upkeepIDs := actions_seth.DeployKeeperContracts( t, registryVersion, keeperDefaultRegistryConfig, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, chainClient, big.NewInt(keeperDefaultLinkFunds), ) _, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID)) require.NoError(t, err, "Error creating keeper jobs") t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() }) var initialCounters = make([]*big.Int, len(upkeepIDs)) gom := gomega.NewGomegaWithT(t) // Observe that the upkeeps which are initially registered are performing and // store the value of their initial counters in order to compare later on that the value increased. gom.Eventually(func(g gomega.Gomega) error { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) initialCounters[i] = counter g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter"+ " for upkeep at index "+strconv.Itoa(i)) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64()) l.Info(). Int64("Upkeep counter", counter.Int64()). Int("Upkeep ID", i). Msg("Number of upkeeps performed") } return nil }, "1m", "1s").Should(gomega.Succeed()) newConsumers, _ := actions_seth.RegisterNewUpkeeps(t, chainClient, linkToken, registry, registrar, keeperDefaultUpkeepGasLimit, 1) // We know that newConsumers has size 1, so we can just use the newly registered upkeep. newUpkeep := newConsumers[0] // Test that the newly registered upkeep is also performing. gom.Eventually(func(g gomega.Gomega) error { counter, err := newUpkeep.Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling newly deployed upkeep's counter shouldn't fail") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected newly registered upkeep's counter to be greater than 0, but got %d", counter.Int64()) l.Info().Msg("Newly registered upkeeps performed " + strconv.Itoa(int(counter.Int64())) + " times") return nil }, "1m", "1s").Should(gomega.Succeed()) gom.Eventually(func(g gomega.Gomega) error { for i := 0; i < len(upkeepIDs); i++ { currentCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") l.Info(). Int("Upkeep ID", i). Int64("Upkeep counter", currentCounter.Int64()). Int64("initial counter", initialCounters[i].Int64()). Msg("Number of upkeeps performed") g.Expect(currentCounter.Int64()).Should(gomega.BeNumerically(">", initialCounters[i].Int64()), "Expected counter to have increased from initial value of %s, but got %s", initialCounters[i], currentCounter) } return nil }, "1m", "1s").Should(gomega.Succeed()) })` $DIR/integration-tests/smoke/keeper_test.go: `_, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() })` $DIR/integration-tests/smoke/keeper_test.go: `actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)()` $DIR/integration-tests/smoke/keeper_test.go: `gom.Eventually(func(g gomega.Gomega) error { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) initialCounters[i] = counter g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter"+ " for upkeep at index "+strconv.Itoa(i)) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64()) l.Info(). Int64("Upkeep counter", counter.Int64()). Int("Upkeep ID", i). Msg("Number of upkeeps performed") } return nil }, "1m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `initialCounters[i] = counter` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter"+ " for upkeep at index "+strconv.Itoa(i))` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `l.Info(). Int64("Upkeep counter", counter.Int64()). Int("Upkeep ID", i). Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/keeper_test.go: `gom.Eventually(func(g gomega.Gomega) error { counter, err := newUpkeep.Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling newly deployed upkeep's counter shouldn't fail") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected newly registered upkeep's counter to be greater than 0, but got %d", counter.Int64()) l.Info().Msg("Newly registered upkeeps performed " + strconv.Itoa(int(counter.Int64())) + " times") return nil }, "1m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling newly deployed upkeep's counter shouldn't fail")` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected newly registered upkeep's counter to be greater than 0, but got %d", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Msg("Newly registered upkeeps performed " + strconv.Itoa(int(counter.Int64())) + " times")` $DIR/integration-tests/smoke/keeper_test.go: `gom.Eventually(func(g gomega.Gomega) error { for i := 0; i < len(upkeepIDs); i++ { currentCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") l.Info(). Int("Upkeep ID", i). Int64("Upkeep counter", currentCounter.Int64()). Int64("initial counter", initialCounters[i].Int64()). Msg("Number of upkeeps performed") g.Expect(currentCounter.Int64()).Should(gomega.BeNumerically(">", initialCounters[i].Int64()), "Expected counter to have increased from initial value of %s, but got %s", initialCounters[i], currentCounter) } return nil }, "1m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/keeper_test.go: `l.Info(). Int("Upkeep ID", i). Int64("Upkeep counter", currentCounter.Int64()). Int64("initial counter", initialCounters[i].Int64()). Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(currentCounter.Int64()).Should(gomega.BeNumerically(">", initialCounters[i].Int64()), "Expected counter to have increased from initial value of %s, but got %s", initialCounters[i], currentCounter)` $DIR/integration-tests/smoke/keeper_test.go: `t.Run(fmt.Sprintf("registry_1_%d", registryVersion), func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Keeper) require.NoError(t, err, "Failed to get config") chainClient, chainlinkNodes, linkToken, _ := setupKeeperTest(l, t, &config) sb, err := chainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") registry, _, consumers, upkeepIDs := actions_seth.DeployKeeperContracts( t, registryVersion, keeperDefaultRegistryConfig, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, chainClient, big.NewInt(1), ) _, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID)) require.NoError(t, err, "Error creating keeper jobs") t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() }) // Since the upkeep is currently underfunded, check that it doesn't get executed gom := gomega.NewGomegaWithT(t) l.Info().Msg("Waiting for 1m to make sure no upkeeps are performed") gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(counter.Int64()).Should(gomega.Equal(int64(0)), "Expected consumer counter to remain zero, but got %d", counter.Int64()) } }, "1m", "1s").Should(gomega.Succeed()) // Grant permission to the registry to fund the upkeep err = linkToken.Approve(registry.Address(), big.NewInt(0).Mul(big.NewInt(9e18), big.NewInt(int64(len(upkeepIDs))))) require.NoError(t, err, "Error approving permissions for registry") // Add funds to the upkeep whose ID we know from above l.Info().Msg("Adding funds to upkeeps") for i := 0; i < len(upkeepIDs); i++ { err = registry.AddUpkeepFunds(upkeepIDs[i], big.NewInt(9e18)) require.NoError(t, err, "Error funding upkeep") } // Now the new upkeep should be performing because we added enough funds gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected newly registered upkeep's counter to be greater than 0, but got %d", counter.Int64()) } }, "1m", "1s").Should(gomega.Succeed()) })` $DIR/integration-tests/smoke/keeper_test.go: `_, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() })` $DIR/integration-tests/smoke/keeper_test.go: `actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)()` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Msg("Waiting for 1m to make sure no upkeeps are performed")` $DIR/integration-tests/smoke/keeper_test.go: `gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(counter.Int64()).Should(gomega.Equal(int64(0)), "Expected consumer counter to remain zero, but got %d", counter.Int64()) } }, "1m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(counter.Int64()).Should(gomega.Equal(int64(0)), "Expected consumer counter to remain zero, but got %d", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `err = linkToken.Approve(registry.Address(), big.NewInt(0).Mul(big.NewInt(9e18), big.NewInt(int64(len(upkeepIDs)))))` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Msg("Adding funds to upkeeps")` $DIR/integration-tests/smoke/keeper_test.go: `err = registry.AddUpkeepFunds(upkeepIDs[i], big.NewInt(9e18))` $DIR/integration-tests/smoke/keeper_test.go: `gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected newly registered upkeep's counter to be greater than 0, but got %d", counter.Int64()) } }, "1m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected newly registered upkeep's counter to be greater than 0, but got %d", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `t.Run(fmt.Sprintf("registry_1_%d", registryVersion), func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Keeper) require.NoError(t, err, "Failed to get config") chainClient, chainlinkNodes, linkToken, _ := setupKeeperTest(l, t, &config) sb, err := chainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") registry, _, consumers, upkeepIDs := actions_seth.DeployKeeperContracts( t, registryVersion, keeperDefaultRegistryConfig, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, chainClient, big.NewInt(keeperDefaultLinkFunds), ) _, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID)) require.NoError(t, err, "Error creating keeper jobs") t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() }) var initialCounters = make([]*big.Int, len(upkeepIDs)) gom := gomega.NewGomegaWithT(t) // Make sure the upkeeps are running before we remove a keeper gom.Eventually(func(g gomega.Gomega) error { for upkeepID := 0; upkeepID < len(upkeepIDs); upkeepID++ { counter, err := consumers[upkeepID].Counter(testcontext.Get(t)) initialCounters[upkeepID] = counter g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter"+ " for upkeep with ID "+strconv.Itoa(upkeepID)) g.Expect(counter.Cmp(big.NewInt(0)) == 1, "Expected consumer counter to be greater than 0, but got %s", counter) } return nil }, "1m", "1s").Should(gomega.Succeed()) keepers, err := registry.GetKeeperList(testcontext.Get(t)) require.NoError(t, err, "Error getting list of Keepers") // Remove the first keeper from the list require.GreaterOrEqual(t, len(keepers), 2, "Expected there to be at least 2 keepers") newKeeperList := keepers[1:] // Construct the addresses of the payees required by the SetKeepers function payees := make([]string, len(keepers)-1) for i := 0; i < len(payees); i++ { payees[i], err = chainlinkNodes[0].PrimaryEthAddress() require.NoError(t, err, "Error building payee list") } err = registry.SetKeepers(newKeeperList, payees, contracts.OCRv2Config{}) require.NoError(t, err, "Error setting new list of Keepers") l.Info().Msg("Successfully removed keeper at address " + keepers[0] + " from the list of Keepers") // The upkeeps should still perform and their counters should have increased compared to the first check gom.Eventually(func(g gomega.Gomega) error { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Cmp(initialCounters[i]) == 1, "Expected consumer counter to be greater "+ "than initial counter which was %s, but got %s", initialCounters[i], counter) } return nil }, "1m", "1s").Should(gomega.Succeed()) })` $DIR/integration-tests/smoke/keeper_test.go: `_, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() })` $DIR/integration-tests/smoke/keeper_test.go: `actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)()` $DIR/integration-tests/smoke/keeper_test.go: `gom.Eventually(func(g gomega.Gomega) error { for upkeepID := 0; upkeepID < len(upkeepIDs); upkeepID++ { counter, err := consumers[upkeepID].Counter(testcontext.Get(t)) initialCounters[upkeepID] = counter g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter"+ " for upkeep with ID "+strconv.Itoa(upkeepID)) g.Expect(counter.Cmp(big.NewInt(0)) == 1, "Expected consumer counter to be greater than 0, but got %s", counter) } return nil }, "1m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `initialCounters[upkeepID] = counter` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter"+ " for upkeep with ID "+strconv.Itoa(upkeepID))` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(counter.Cmp(big.NewInt(0)) == 1, "Expected consumer counter to be greater than 0, but got %s", counter)` $DIR/integration-tests/smoke/keeper_test.go: `payees[i], err = chainlinkNodes[0].PrimaryEthAddress()` $DIR/integration-tests/smoke/keeper_test.go: `err = registry.SetKeepers(newKeeperList, payees, contracts.OCRv2Config{})` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Msg("Successfully removed keeper at address " + keepers[0] + " from the list of Keepers")` $DIR/integration-tests/smoke/keeper_test.go: `gom.Eventually(func(g gomega.Gomega) error { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Cmp(initialCounters[i]) == 1, "Expected consumer counter to be greater "+ "than initial counter which was %s, but got %s", initialCounters[i], counter) } return nil }, "1m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(counter.Cmp(initialCounters[i]) == 1, "Expected consumer counter to be greater "+ "than initial counter which was %s, but got %s", initialCounters[i], counter)` $DIR/integration-tests/smoke/keeper_test.go: `t.Run(fmt.Sprintf("registry_1_%d", registryVersion), func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Keeper) require.NoError(t, err, "Failed to get config") chainClient, chainlinkNodes, linkToken, _ := setupKeeperTest(l, t, &config) sb, err := chainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") registry, _, consumers, upkeepIDs := actions_seth.DeployKeeperContracts( t, registryVersion, keeperDefaultRegistryConfig, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, chainClient, big.NewInt(keeperDefaultLinkFunds), ) gom := gomega.NewGomegaWithT(t) _, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID)) require.NoError(t, err, "Error creating keeper jobs") t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() }) // Observe that the upkeeps which are initially registered are performing gom.Eventually(func(g gomega.Gomega) error { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d") } return nil }, "1m", "1s").Should(gomega.Succeed()) // Pause the registry err = registry.Pause() require.NoError(t, err, "Error pausing the registry") // Store how many times each upkeep performed once the registry was successfully paused var countersAfterPause = make([]*big.Int, len(upkeepIDs)) for i := 0; i < len(upkeepIDs); i++ { countersAfterPause[i], err = consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Error retrieving consumer at index %d", i) } // After we paused the registry, the counters of all the upkeeps should stay constant // because they are no longer getting serviced gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { latestCounter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Error retrieving consumer contract at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.Equal(countersAfterPause[i].Int64()), "Expected consumer counter to remain constant at %d, but got %d", countersAfterPause[i].Int64(), latestCounter.Int64()) } }, "1m", "1s").Should(gomega.Succeed()) })` $DIR/integration-tests/smoke/keeper_test.go: `_, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() })` $DIR/integration-tests/smoke/keeper_test.go: `actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)()` $DIR/integration-tests/smoke/keeper_test.go: `gom.Eventually(func(g gomega.Gomega) error { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d") } return nil }, "1m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d")` $DIR/integration-tests/smoke/keeper_test.go: `err = registry.Pause()` $DIR/integration-tests/smoke/keeper_test.go: `countersAfterPause[i], err = consumers[i].Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { latestCounter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Error retrieving consumer contract at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.Equal(countersAfterPause[i].Int64()), "Expected consumer counter to remain constant at %d, but got %d", countersAfterPause[i].Int64(), latestCounter.Int64()) } }, "1m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(latestCounter.Int64()).Should(gomega.Equal(countersAfterPause[i].Int64()), "Expected consumer counter to remain constant at %d, but got %d", countersAfterPause[i].Int64(), latestCounter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `_, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, ethereum.RegistryVersion_1_2)() })` $DIR/integration-tests/smoke/keeper_test.go: `actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, ethereum.RegistryVersion_1_2)()` $DIR/integration-tests/smoke/keeper_test.go: `_, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, secondRegistry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `err = registry.SetMigrationPermissions(common.HexToAddress(secondRegistry.Address()), 3)` $DIR/integration-tests/smoke/keeper_test.go: `err = secondRegistry.SetMigrationPermissions(common.HexToAddress(registry.Address()), 3)` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Msg("Waiting for 1m for upkeeps to be performed before migration")` $DIR/integration-tests/smoke/keeper_test.go: `gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counterBeforeMigration, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(counterBeforeMigration.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %s", counterBeforeMigration) } }, "1m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(counterBeforeMigration.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %s", counterBeforeMigration)` $DIR/integration-tests/smoke/keeper_test.go: `err = registry.Migrate([]*big.Int{upkeepIDs[i]}, common.HexToAddress(secondRegistry.Address()))` $DIR/integration-tests/smoke/keeper_test.go: `err = registry.Pause()` $DIR/integration-tests/smoke/keeper_test.go: `counterAfterMigrationPerUpkeep[upkeepIDs[i]] = counterAfterMigration` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Msg("Waiting for 1m for upkeeps to be performed after migration")` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(currentCounter.Int64()).Should(gomega.BeNumerically(">", counterAfterMigration.Int64()), "Expected counter to have increased, but stayed constant at %s", counterAfterMigration)` $DIR/integration-tests/smoke/keeper_test.go: `t.Run(fmt.Sprintf("registry_1_%d", registryVersion), func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Keeper) require.NoError(t, err, "Failed to get config") chainClient, chainlinkNodes, linkToken, _ := setupKeeperTest(l, t, &config) sb, err := chainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") registry, _, consumers, upkeepIDs := actions_seth.DeployKeeperContracts( t, registryVersion, lowBCPTRegistryConfig, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, chainClient, big.NewInt(keeperDefaultLinkFunds), ) jobs, err := actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID)) require.NoError(t, err, "Error creating keeper jobs") t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() }) var initialCounters = make([]*big.Int, len(upkeepIDs)) gom := gomega.NewGomegaWithT(t) // Watch upkeeps being performed and store their counters in order to compare them later in the test gom.Eventually(func(g gomega.Gomega) error { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) initialCounters[i] = counter g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64()) } return nil }, "1m", "1s").Should(gomega.Succeed()) // Take down half of the Keeper nodes by deleting the Keeper job registered above (after registry deployment) firstHalfToTakeDown := chainlinkNodes[:len(chainlinkNodes)/2+1] for i, nodeToTakeDown := range firstHalfToTakeDown { err = nodeToTakeDown.MustDeleteJob(jobs[0].Data.ID) require.NoError(t, err, "Error deleting job from node %d", i) } l.Info().Msg("Successfully managed to take down the first half of the nodes") // Assert that upkeeps are still performed and their counters have increased gom.Eventually(func(g gomega.Gomega) error { for i := 0; i < len(upkeepIDs); i++ { currentCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(currentCounter.Int64()).Should(gomega.BeNumerically(">", initialCounters[i].Int64()), "Expected counter to have increased from initial value of %s, but got %s", initialCounters[i], currentCounter) } return nil }, "3m", "1s").Should(gomega.Succeed()) // Take down the other half of the Keeper nodes nodesAndJobs := []nodeAndJob{} for i, n := range chainlinkNodes { nodesAndJobs = append(nodesAndJobs, nodeAndJob{node: n, job: jobs[i]}) } secondHalfToTakeDown := nodesAndJobs[len(nodesAndJobs)/2+1:] for i, nodeToTakeDown := range secondHalfToTakeDown { err = nodeToTakeDown.node.MustDeleteJob(nodeToTakeDown.job.Data.ID) require.NoError(t, err, "Error deleting job from node %d", i) } l.Info().Msg("Successfully managed to take down the second half of the nodes") // See how many times each upkeep was executed var countersAfterNoMoreNodes = make([]*big.Int, len(upkeepIDs)) for i := 0; i < len(upkeepIDs); i++ { countersAfterNoMoreNodes[i], err = consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Error retrieving consumer counter %d", i) l.Info(). Int("Index", i). Int64("Upkeeps", countersAfterNoMoreNodes[i].Int64()). Msg("Upkeeps Performed") } // Once all the nodes are taken down, there might be some straggling transactions which went through before // all the nodes were taken down. Every keeper node can have at most 1 straggling transaction per upkeep, // so a +6 on the upper limit side should be sufficient. gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { latestCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterNoMoreNodes[i].Int64()+numUpkeepsAllowedForStragglingTxs, ), "Expected consumer counter to not have increased more than %d, but got %d", countersAfterNoMoreNodes[i].Int64()+numUpkeepsAllowedForStragglingTxs, latestCounter.Int64()) } }, "3m", "1s").Should(gomega.Succeed()) })` $DIR/integration-tests/smoke/keeper_test.go: `t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() })` $DIR/integration-tests/smoke/keeper_test.go: `actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)()` $DIR/integration-tests/smoke/keeper_test.go: `gom.Eventually(func(g gomega.Gomega) error { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) initialCounters[i] = counter g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64()) } return nil }, "1m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `initialCounters[i] = counter` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `err = nodeToTakeDown.MustDeleteJob(jobs[0].Data.ID)` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Msg("Successfully managed to take down the first half of the nodes")` $DIR/integration-tests/smoke/keeper_test.go: `gom.Eventually(func(g gomega.Gomega) error { for i := 0; i < len(upkeepIDs); i++ { currentCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(currentCounter.Int64()).Should(gomega.BeNumerically(">", initialCounters[i].Int64()), "Expected counter to have increased from initial value of %s, but got %s", initialCounters[i], currentCounter) } return nil }, "3m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(currentCounter.Int64()).Should(gomega.BeNumerically(">", initialCounters[i].Int64()), "Expected counter to have increased from initial value of %s, but got %s", initialCounters[i], currentCounter)` $DIR/integration-tests/smoke/keeper_test.go: `nodesAndJobs = append(nodesAndJobs, nodeAndJob{node: n, job: jobs[i]})` $DIR/integration-tests/smoke/keeper_test.go: `err = nodeToTakeDown.node.MustDeleteJob(nodeToTakeDown.job.Data.ID)` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Msg("Successfully managed to take down the second half of the nodes")` $DIR/integration-tests/smoke/keeper_test.go: `countersAfterNoMoreNodes[i], err = consumers[i].Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `l.Info(). Int("Index", i). Int64("Upkeeps", countersAfterNoMoreNodes[i].Int64()). Msg("Upkeeps Performed")` $DIR/integration-tests/smoke/keeper_test.go: `gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { latestCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterNoMoreNodes[i].Int64()+numUpkeepsAllowedForStragglingTxs, ), "Expected consumer counter to not have increased more than %d, but got %d", countersAfterNoMoreNodes[i].Int64()+numUpkeepsAllowedForStragglingTxs, latestCounter.Int64()) } }, "3m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterNoMoreNodes[i].Int64()+numUpkeepsAllowedForStragglingTxs, ), "Expected consumer counter to not have increased more than %d, but got %d", countersAfterNoMoreNodes[i].Int64()+numUpkeepsAllowedForStragglingTxs, latestCounter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `_, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, ethereum.RegistryVersion_1_3)() })` $DIR/integration-tests/smoke/keeper_test.go: `actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, ethereum.RegistryVersion_1_3)()` $DIR/integration-tests/smoke/keeper_test.go: `gom.Eventually(func(g gomega.Gomega) error { // Check if the upkeeps are performing multiple times by analysing their counters and checking they are greater than 5 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(5)), "Expected consumer counter to be greater than 5, but got %d", counter.Int64()) l.Info().Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed") } return nil }, "3m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(5)), "Expected consumer counter to be greater than 5, but got %d", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/keeper_test.go: `countersAfterPause[i], err = consumers[i].Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `l.Info(). Int("Index", i). Int64("Upkeeps", countersAfterPause[i].Int64()). Msg("Paused Upkeep")` $DIR/integration-tests/smoke/keeper_test.go: `gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { // In most cases counters should remain constant, but there might be a straggling perform tx which // gets committed later. Since every keeper node cannot have more than 1 straggling tx, it // is sufficient to check that the upkeep count does not increase by more than 6. latestCounter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Error retrieving counter at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterPause[i].Int64()+numUpkeepsAllowedForStragglingTxs), "Expected consumer counter not have increased more than %d, but got %d", countersAfterPause[i].Int64()+numUpkeepsAllowedForStragglingTxs, latestCounter.Int64()) } }, "1m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterPause[i].Int64()+numUpkeepsAllowedForStragglingTxs), "Expected consumer counter not have increased more than %d, but got %d", countersAfterPause[i].Int64()+numUpkeepsAllowedForStragglingTxs, latestCounter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter"+ " for upkeep at index %d", i)` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(5)+countersAfterPause[i].Int64()), "Expected consumer counter to be greater than %d, but got %d", int64(5)+countersAfterPause[i].Int64(), counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Int64("Upkeeps", counter.Int64()).Msg("Upkeeps Performed")` $DIR/integration-tests/smoke/keeper_test.go: `_, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, ethereum.RegistryVersion_1_3)() })` $DIR/integration-tests/smoke/keeper_test.go: `actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, ethereum.RegistryVersion_1_3)()` $DIR/integration-tests/smoke/keeper_test.go: `gom.Consistently(func(g gomega.Gomega) { // expect the counter to remain 0 because perform data does not match for i := 0; i < len(upkeepIDs); i++ { counter, err := performDataChecker[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve perform data checker for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.Equal(int64(0)), "Expected perform data checker counter to be 0, but got %d", counter.Int64()) l.Info().Int64("Upkeep perform data checker", counter.Int64()).Msg("Number of upkeeps performed") } }, "2m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve perform data checker for upkeep at index %d", i)` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(counter.Int64()).Should(gomega.Equal(int64(0)), "Expected perform data checker counter to be 0, but got %d", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Int64("Upkeep perform data checker", counter.Int64()).Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/keeper_test.go: `err = registry.UpdateCheckData(upkeepIDs[i], []byte(keeperExpectedData))` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve perform data checker counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(5)), "Expected perform data checker counter to be greater than 5, but got %d", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Int64("Upkeep perform data checker", counter.Int64()).Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/keeper_test.go: `_, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `gom.Eventually(func(g gomega.Gomega) error { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 10 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(10)), "Expected consumer counter to be greater than 10, but got %d", counter.Int64()) l.Info().Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed") } return nil }, "5m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(10)), "Expected consumer counter to be greater than 10, but got %d", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/keeper_test.go: `_, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/keeper_test.go: `g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(10)), "Expected consumer counter to be greater than 10, but got %d", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `l.Info().Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/keeper_test.go: `.Run(fmt.Sprintf("registry_1_%d", registryVersion), func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Keeper) require.NoError(t, err, "Failed to get config") chainClient, chainlinkNodes, linkToken, _ := setupKeeperTest(l, t, &config) sb, err := chainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") registry, _, consumers, upkeepIDs := actions_seth.DeployKeeperContracts( t, registryVersion, keeperDefaultRegistryConfig, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, chainClient, big.NewInt(keeperDefaultLinkFunds), ) t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() }) _, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID)) require.NoError(t, err, "Error creating keeper jobs") gom := gomega.NewGomegaWithT(t) gom.Eventually(func(g gomega.Gomega) error { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 10 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(10)), "Expected consumer counter to be greater than 10, but got %d", counter.Int64()) l.Info().Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed") } return nil }, "5m", "1s").Should(gomega.Succeed()) // Cancel all the registered upkeeps via the registry for i := 0; i < len(upkeepIDs); i++ { err := registry.CancelUpkeep(upkeepIDs[i]) require.NoError(t, err, "Could not cancel upkeep at index %d", i) } var countersAfterCancellation = make([]*big.Int, len(upkeepIDs)) for i := 0; i < len(upkeepIDs); i++ { // Obtain the amount of times the upkeep has been executed so far countersAfterCancellation[i], err = consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Failed to retrieve consumer counter for upkeep at index %d", i) l.Info().Int("Index", i).Int64("Upkeeps Performed", countersAfterCancellation[i].Int64()).Msg("Cancelled Upkeep") } gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { // Expect the counter to remain constant because the upkeep was cancelled, so it shouldn't increase anymore latestCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.Equal(countersAfterCancellation[i].Int64()), "Expected consumer counter to remain constant at %d, but got %d", countersAfterCancellation[i].Int64(), latestCounter.Int64()) } }, "1m", "1s").Should(gomega.Succeed()) })` $DIR/integration-tests/smoke/keeper_test.go: `.Sprintf("registry_1_%d", registryVersion)` $DIR/integration-tests/smoke/keeper_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/keeper_test.go: `.GetConfig("Smoke", tc.Keeper)` $DIR/integration-tests/smoke/keeper_test.go: `.Client.BlockNumber(context.Background())` $DIR/integration-tests/smoke/keeper_test.go: `.Background()` $DIR/integration-tests/smoke/keeper_test.go: `.DeployKeeperContracts( t, registryVersion, keeperDefaultRegistryConfig, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, chainClient, big.NewInt(keeperDefaultLinkFunds), )` $DIR/integration-tests/smoke/keeper_test.go: `.NewInt(keeperDefaultLinkFunds)` $DIR/integration-tests/smoke/keeper_test.go: `.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() })` $DIR/integration-tests/smoke/keeper_test.go: `.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)` $DIR/integration-tests/smoke/keeper_test.go: `.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `.Sprint(chainClient.ChainID)` $DIR/integration-tests/smoke/keeper_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Eventually(func(g gomega.Gomega) error { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 10 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(10)), "Expected consumer counter to be greater than 10, but got %d", counter.Int64()) l.Info().Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed") } return nil }, "5m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.BeNumerically(">", int64(10)), "Expected consumer counter to be greater than 10, but got %d", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.BeNumerically(">", int64(10))` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Int64("Upkeep counter", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.CancelUpkeep(upkeepIDs[i])` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Int("Index", i)` $DIR/integration-tests/smoke/keeper_test.go: `.Int64("Upkeeps Performed", countersAfterCancellation[i].Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Cancelled Upkeep")` $DIR/integration-tests/smoke/keeper_test.go: `.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { // Expect the counter to remain constant because the upkeep was cancelled, so it shouldn't increase anymore latestCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.Equal(countersAfterCancellation[i].Int64()), "Expected consumer counter to remain constant at %d, but got %d", countersAfterCancellation[i].Int64(), latestCounter.Int64()) } }, "1m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(latestCounter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Equal(countersAfterCancellation[i].Int64()), "Expected consumer counter to remain constant at %d, but got %d", countersAfterCancellation[i].Int64(), latestCounter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Equal(countersAfterCancellation[i].Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.Run(fmt.Sprintf("registry_1_%d", registryVersion), func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Keeper) require.NoError(t, err, "Failed to get config") chainClient, chainlinkNodes, linkToken, _ := setupKeeperTest(l, t, &config) sb, err := chainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") registry, _, consumers, upkeepIDs := actions_seth.DeployKeeperContracts( t, registryVersion, highBCPTRegistryConfig, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, chainClient, big.NewInt(keeperDefaultLinkFunds), ) _, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID)) require.NoError(t, err, "Error creating keeper jobs") t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() }) keepersPerformedLowFreq := map[*big.Int][]string{} // gom := gomega.NewGomegaWithT(t) // Wait for upkeep to be performed by two different keepers that alternate (buddies) l.Info().Msg("Waiting for 2m for upkeeps to be performed by different keepers") ticker := time.NewTicker(1 * time.Second) defer ticker.Stop() stop := time.After(2 * time.Minute) LOW_LOOP: for { select { case <-ticker.C: for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Calling consumer's counter shouldn't fail") l.Info().Str("UpkeepId", upkeepIDs[i].String()).Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed") upkeepInfo, err := registry.GetUpkeepInfo(testcontext.Get(t), upkeepIDs[i]) require.NoError(t, err, "Registry's getUpkeep shouldn't fail") latestKeeper := upkeepInfo.LastKeeper if latestKeeper == actions.ZeroAddress.String() { continue } keepersPerformedLowFreq[upkeepIDs[i]] = append(keepersPerformedLowFreq[upkeepIDs[i]], latestKeeper) } case <-stop: ticker.Stop() break LOW_LOOP } } require.GreaterOrEqual(t, 2, len(keepersPerformedLowFreq), "At least 2 different keepers should have been performing upkeeps") // Now set BCPT to be low, so keepers change turn frequently err = registry.SetConfig(lowBCPTRegistryConfig, contracts.OCRv2Config{}) require.NoError(t, err, "Error setting registry config") keepersPerformedHigherFreq := map[*big.Int][]string{} ticker = time.NewTicker(1 * time.Second) defer ticker.Stop() stop = time.After(2 * time.Minute) HIGH_LOOP: for { select { case <-ticker.C: for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Calling consumer's counter shouldn't fail") l.Info().Str("UpkeepId", upkeepIDs[i].String()).Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed") upkeepInfo, err := registry.GetUpkeepInfo(testcontext.Get(t), upkeepIDs[i]) require.NoError(t, err, "Registry's getUpkeep shouldn't fail") latestKeeper := upkeepInfo.LastKeeper if latestKeeper == actions.ZeroAddress.String() { continue } keepersPerformedHigherFreq[upkeepIDs[i]] = append(keepersPerformedHigherFreq[upkeepIDs[i]], latestKeeper) } case <-stop: ticker.Stop() break HIGH_LOOP } } require.GreaterOrEqual(t, 3, len(keepersPerformedHigherFreq), "At least 3 different keepers should have been performing upkeeps after BCPT change") var countFreq = func(keepers []string, freqMap map[string]int) { for _, keeper := range keepers { freqMap[keeper]++ } } for i := 0; i < len(upkeepIDs); i++ { lowFreqMap := make(map[string]int) highFreqMap := make(map[string]int) countFreq(keepersPerformedLowFreq[upkeepIDs[i]], lowFreqMap) countFreq(keepersPerformedHigherFreq[upkeepIDs[i]], highFreqMap) require.Greater(t, len(highFreqMap), len(lowFreqMap), "High frequency map should have more keepers than low frequency map") l.Info().Interface("Low BCPT", lowFreqMap).Interface("High BCPT", highFreqMap).Str("UpkeepID", upkeepIDs[i].String()).Msg("Keeper frequency map") for lowKeeper, lowFreq := range lowFreqMap { highFreq, ok := highFreqMap[lowKeeper] // it might happen due to fluke that a keeper is not found in high frequency map if !ok { continue } // require.True(t, ok, "Keeper %s not found in high frequency map. This should not happen", lowKeeper) require.GreaterOrEqual(t, lowFreq, highFreq, "Keeper %s should have performed less times with high BCPT than with low BCPT", lowKeeper) } } })` $DIR/integration-tests/smoke/keeper_test.go: `.Sprintf("registry_1_%d", registryVersion)` $DIR/integration-tests/smoke/keeper_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/keeper_test.go: `.GetConfig("Smoke", tc.Keeper)` $DIR/integration-tests/smoke/keeper_test.go: `.Client.BlockNumber(context.Background())` $DIR/integration-tests/smoke/keeper_test.go: `.Background()` $DIR/integration-tests/smoke/keeper_test.go: `.DeployKeeperContracts( t, registryVersion, highBCPTRegistryConfig, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, chainClient, big.NewInt(keeperDefaultLinkFunds), )` $DIR/integration-tests/smoke/keeper_test.go: `.NewInt(keeperDefaultLinkFunds)` $DIR/integration-tests/smoke/keeper_test.go: `.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `.Sprint(chainClient.ChainID)` $DIR/integration-tests/smoke/keeper_test.go: `.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() })` $DIR/integration-tests/smoke/keeper_test.go: `.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Waiting for 2m for upkeeps to be performed by different keepers")` $DIR/integration-tests/smoke/keeper_test.go: `.NewTicker(1 * time.Second)` $DIR/integration-tests/smoke/keeper_test.go: `.Stop()` $DIR/integration-tests/smoke/keeper_test.go: `.After(2 * time.Minute)` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Str("UpkeepId", upkeepIDs[i].String())` $DIR/integration-tests/smoke/keeper_test.go: `.String()` $DIR/integration-tests/smoke/keeper_test.go: `.Int64("Upkeep counter", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/keeper_test.go: `.GetUpkeepInfo(testcontext.Get(t), upkeepIDs[i])` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.ZeroAddress.String()` $DIR/integration-tests/smoke/keeper_test.go: `.Stop()` $DIR/integration-tests/smoke/keeper_test.go: `.SetConfig(lowBCPTRegistryConfig, contracts.OCRv2Config{})` $DIR/integration-tests/smoke/keeper_test.go: `.NewTicker(1 * time.Second)` $DIR/integration-tests/smoke/keeper_test.go: `.Stop()` $DIR/integration-tests/smoke/keeper_test.go: `.After(2 * time.Minute)` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Str("UpkeepId", upkeepIDs[i].String())` $DIR/integration-tests/smoke/keeper_test.go: `.String()` $DIR/integration-tests/smoke/keeper_test.go: `.Int64("Upkeep counter", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/keeper_test.go: `.GetUpkeepInfo(testcontext.Get(t), upkeepIDs[i])` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.ZeroAddress.String()` $DIR/integration-tests/smoke/keeper_test.go: `.Stop()` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Interface("Low BCPT", lowFreqMap)` $DIR/integration-tests/smoke/keeper_test.go: `.Interface("High BCPT", highFreqMap)` $DIR/integration-tests/smoke/keeper_test.go: `.Str("UpkeepID", upkeepIDs[i].String())` $DIR/integration-tests/smoke/keeper_test.go: `.String()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Keeper frequency map")` $DIR/integration-tests/smoke/keeper_test.go: `.Run(fmt.Sprintf("registry_1_%d", registryVersion), func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Keeper) require.NoError(t, err, "Failed to get config") chainClient, chainlinkNodes, linkToken, _ := setupKeeperTest(l, t, &config) sb, err := chainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") registry, _, consumersPerformance, upkeepIDs := actions_seth.DeployPerformanceKeeperContracts( t, chainClient, registryVersion, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, &keeperDefaultRegistryConfig, big.NewInt(keeperDefaultLinkFunds), 10000, // How many blocks this upkeep will be eligible from first upkeep block 5, // Interval of blocks that upkeeps are expected to be performed 100000, // How much gas should be burned on checkUpkeep() calls 4000000, // How much gas should be burned on performUpkeep() calls. Initially set higher than defaultUpkeepGasLimit ) _, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID)) require.NoError(t, err, "Error creating keeper jobs") t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() }) consumerPerformance := consumersPerformance[0] upkeepID := upkeepIDs[0] gom := gomega.NewGomegaWithT(t) // Initially performGas is set high, so performUpkeep reverts and no upkeep should be performed gom.Consistently(func(g gomega.Gomega) { // Consumer count should remain at 0 cnt, err := consumerPerformance.GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail") g.Expect(cnt.Int64()).Should( gomega.Equal(int64(0)), "Expected consumer counter to remain constant at %d, but got %d", 0, cnt.Int64(), ) // Not even reverted upkeeps should be performed. Last keeper for the upkeep should be 0 address upkeepInfo, err := registry.GetUpkeepInfo(testcontext.Get(t), upkeepID) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Registry's getUpkeep shouldn't fail") g.Expect(upkeepInfo.LastKeeper).Should(gomega.Equal(actions.ZeroAddress.String()), "Last keeper should be zero address") }, "1m", "1s").Should(gomega.Succeed()) // Set performGas on consumer to be low, so that performUpkeep starts becoming successful err = consumerPerformance.SetPerformGasToBurn(testcontext.Get(t), big.NewInt(100000)) require.NoError(t, err, "Error setting PerformGasToBurn") // Upkeep should now start performing gom.Eventually(func(g gomega.Gomega) error { cnt, err := consumerPerformance.GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail") g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", cnt.Int64(), ) return nil }, "1m", "1s").Should(gomega.Succeed()) })` $DIR/integration-tests/smoke/keeper_test.go: `.Sprintf("registry_1_%d", registryVersion)` $DIR/integration-tests/smoke/keeper_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/keeper_test.go: `.GetConfig("Smoke", tc.Keeper)` $DIR/integration-tests/smoke/keeper_test.go: `.Client.BlockNumber(context.Background())` $DIR/integration-tests/smoke/keeper_test.go: `.Background()` $DIR/integration-tests/smoke/keeper_test.go: `.DeployPerformanceKeeperContracts( t, chainClient, registryVersion, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, &keeperDefaultRegistryConfig, big.NewInt(keeperDefaultLinkFunds), 10000, // How many blocks this upkeep will be eligible from first upkeep block 5, // Interval of blocks that upkeeps are expected to be performed 100000, // How much gas should be burned on checkUpkeep() calls 4000000, // How much gas should be burned on performUpkeep() calls. Initially set higher than defaultUpkeepGasLimit )` $DIR/integration-tests/smoke/keeper_test.go: `.NewInt(keeperDefaultLinkFunds)` $DIR/integration-tests/smoke/keeper_test.go: `.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `.Sprint(chainClient.ChainID)` $DIR/integration-tests/smoke/keeper_test.go: `.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() })` $DIR/integration-tests/smoke/keeper_test.go: `.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)` $DIR/integration-tests/smoke/keeper_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Consistently(func(g gomega.Gomega) { // Consumer count should remain at 0 cnt, err := consumerPerformance.GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail") g.Expect(cnt.Int64()).Should( gomega.Equal(int64(0)), "Expected consumer counter to remain constant at %d, but got %d", 0, cnt.Int64(), ) // Not even reverted upkeeps should be performed. Last keeper for the upkeep should be 0 address upkeepInfo, err := registry.GetUpkeepInfo(testcontext.Get(t), upkeepID) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Registry's getUpkeep shouldn't fail") g.Expect(upkeepInfo.LastKeeper).Should(gomega.Equal(actions.ZeroAddress.String()), "Last keeper should be zero address") }, "1m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.GetUpkeepCount(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail")` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(cnt.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should( gomega.Equal(int64(0)), "Expected consumer counter to remain constant at %d, but got %d", 0, cnt.Int64(), )` $DIR/integration-tests/smoke/keeper_test.go: `.Equal(int64(0))` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.GetUpkeepInfo(testcontext.Get(t), upkeepID)` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Registry's getUpkeep shouldn't fail")` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(upkeepInfo.LastKeeper)` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Equal(actions.ZeroAddress.String()), "Last keeper should be zero address")` $DIR/integration-tests/smoke/keeper_test.go: `.Equal(actions.ZeroAddress.String())` $DIR/integration-tests/smoke/keeper_test.go: `.ZeroAddress.String()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.SetPerformGasToBurn(testcontext.Get(t), big.NewInt(100000))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.NewInt(100000)` $DIR/integration-tests/smoke/keeper_test.go: `.Eventually(func(g gomega.Gomega) error { cnt, err := consumerPerformance.GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail") g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", cnt.Int64(), ) return nil }, "1m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.GetUpkeepCount(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail")` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(cnt.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", cnt.Int64(), )` $DIR/integration-tests/smoke/keeper_test.go: `.BeNumerically(">", int64(0))` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.Run(fmt.Sprintf("registry_1_%d", registryVersion), func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Keeper) require.NoError(t, err, "Failed to get config") chainClient, chainlinkNodes, linkToken, _ := setupKeeperTest(l, t, &config) sb, err := chainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") registry, _, consumersPerformance, upkeepIDs := actions_seth.DeployPerformanceKeeperContracts( t, chainClient, registryVersion, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, &keeperDefaultRegistryConfig, big.NewInt(keeperDefaultLinkFunds), 10000, // How many blocks this upkeep will be eligible from first upkeep block 5, // Interval of blocks that upkeeps are expected to be performed 100000, // How much gas should be burned on checkUpkeep() calls 4000000, // How much gas should be burned on performUpkeep() calls. Initially set higher than defaultUpkeepGasLimit ) _, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID)) require.NoError(t, err, "Error creating keeper jobs") t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() }) gom := gomega.NewGomegaWithT(t) // Initially performGas is set higher than defaultUpkeepGasLimit, so no upkeep should be performed l.Info().Msg("Waiting for 1m for upkeeps to be performed") gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(cnt.Int64()).Should( gomega.Equal(int64(0)), "Expected consumer counter to remain constant at %d, but got %d", 0, cnt.Int64(), ) } }, "1m", "1s").Should(gomega.Succeed()) // Increase gas limit for the upkeep, higher than the performGasBurn l.Info().Msg("Setting upkeep gas limit higher than performGasBurn") for i := 0; i < len(upkeepIDs); i++ { err = registry.SetUpkeepGasLimit(upkeepIDs[i], uint32(4500000)) require.NoError(t, err, "Error setting Upkeep gas limit") } // Upkeep should now start performing l.Info().Msg("Waiting for 1m for upkeeps to be performed") gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", cnt.Int64(), ) } }, "1m", "1s").Should(gomega.Succeed()) // Now increase the checkGasBurn on consumer, upkeep should stop performing l.Info().Msg("Setting checkGasBurn higher than performGasBurn") for i := 0; i < len(upkeepIDs); i++ { err = consumersPerformance[i].SetCheckGasToBurn(testcontext.Get(t), big.NewInt(3000000)) require.NoError(t, err, "Error setting CheckGasToBurn") } // Get existing performed count existingCnts := make(map[*big.Int]*big.Int) for i := 0; i < len(upkeepIDs); i++ { existingCnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) existingCnts[upkeepIDs[i]] = existingCnt require.NoError(t, err, "Error calling consumer's counter") l.Info().Int64("Upkeep counter", existingCnt.Int64()).Msg("Check Gas Increased") } // In most cases count should remain constant, but there might be a straggling perform tx which // gets committed later. Since every keeper node cannot have more than 1 straggling tx, it // is sufficient to check that the upkeep count does not increase by more than 6. l.Info().Msg("Waiting for 3m to make sure no more than 6 upkeeps are performed") gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") existingCnt := existingCnts[upkeepIDs[i]] g.Expect(cnt.Int64()).Should( gomega.BeNumerically("<=", existingCnt.Int64()+numUpkeepsAllowedForStragglingTxs), "Expected consumer counter to remain constant at %d, but got %d", existingCnt.Int64(), cnt.Int64(), ) } }, "3m", "1s").Should(gomega.Succeed()) for i := 0; i < len(upkeepIDs); i++ { existingCnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) existingCnts[upkeepIDs[i]] = existingCnt require.NoError(t, err, "Error calling consumer's counter") l.Info().Int64("Upkeep counter", existingCnt.Int64()).Msg("Upkeep counter when consistently block finished") } // Now increase checkGasLimit on registry highCheckGasLimit := keeperDefaultRegistryConfig highCheckGasLimit.CheckGasLimit = uint32(5000000) err = registry.SetConfig(highCheckGasLimit, contracts.OCRv2Config{}) require.NoError(t, err, "Error setting registry config") // Upkeep should start performing again, and it should get regularly performed l.Info().Msg("Waiting for 1m for upkeeps to be performed") gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail") existingCnt := existingCnts[upkeepIDs[i]] g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", existingCnt.Int64()), "Expected consumer counter to be greater than %d, but got %d", existingCnt.Int64(), cnt.Int64(), ) } }, "1m", "1s").Should(gomega.Succeed()) })` $DIR/integration-tests/smoke/keeper_test.go: `.Sprintf("registry_1_%d", registryVersion)` $DIR/integration-tests/smoke/keeper_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/keeper_test.go: `.GetConfig("Smoke", tc.Keeper)` $DIR/integration-tests/smoke/keeper_test.go: `.Client.BlockNumber(context.Background())` $DIR/integration-tests/smoke/keeper_test.go: `.Background()` $DIR/integration-tests/smoke/keeper_test.go: `.DeployPerformanceKeeperContracts( t, chainClient, registryVersion, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, &keeperDefaultRegistryConfig, big.NewInt(keeperDefaultLinkFunds), 10000, // How many blocks this upkeep will be eligible from first upkeep block 5, // Interval of blocks that upkeeps are expected to be performed 100000, // How much gas should be burned on checkUpkeep() calls 4000000, // How much gas should be burned on performUpkeep() calls. Initially set higher than defaultUpkeepGasLimit )` $DIR/integration-tests/smoke/keeper_test.go: `.NewInt(keeperDefaultLinkFunds)` $DIR/integration-tests/smoke/keeper_test.go: `.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `.Sprint(chainClient.ChainID)` $DIR/integration-tests/smoke/keeper_test.go: `.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() })` $DIR/integration-tests/smoke/keeper_test.go: `.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)` $DIR/integration-tests/smoke/keeper_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Waiting for 1m for upkeeps to be performed")` $DIR/integration-tests/smoke/keeper_test.go: `.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(cnt.Int64()).Should( gomega.Equal(int64(0)), "Expected consumer counter to remain constant at %d, but got %d", 0, cnt.Int64(), ) } }, "1m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.GetUpkeepCount(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(cnt.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should( gomega.Equal(int64(0)), "Expected consumer counter to remain constant at %d, but got %d", 0, cnt.Int64(), )` $DIR/integration-tests/smoke/keeper_test.go: `.Equal(int64(0))` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Setting upkeep gas limit higher than performGasBurn")` $DIR/integration-tests/smoke/keeper_test.go: `.SetUpkeepGasLimit(upkeepIDs[i], uint32(4500000))` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Waiting for 1m for upkeeps to be performed")` $DIR/integration-tests/smoke/keeper_test.go: `.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", cnt.Int64(), ) } }, "1m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.GetUpkeepCount(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(cnt.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", cnt.Int64(), )` $DIR/integration-tests/smoke/keeper_test.go: `.BeNumerically(">", int64(0))` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Setting checkGasBurn higher than performGasBurn")` $DIR/integration-tests/smoke/keeper_test.go: `.SetCheckGasToBurn(testcontext.Get(t), big.NewInt(3000000))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.NewInt(3000000)` $DIR/integration-tests/smoke/keeper_test.go: `.GetUpkeepCount(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Int64("Upkeep counter", existingCnt.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Check Gas Increased")` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Waiting for 3m to make sure no more than 6 upkeeps are performed")` $DIR/integration-tests/smoke/keeper_test.go: `.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") existingCnt := existingCnts[upkeepIDs[i]] g.Expect(cnt.Int64()).Should( gomega.BeNumerically("<=", existingCnt.Int64()+numUpkeepsAllowedForStragglingTxs), "Expected consumer counter to remain constant at %d, but got %d", existingCnt.Int64(), cnt.Int64(), ) } }, "3m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.GetUpkeepCount(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(cnt.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should( gomega.BeNumerically("<=", existingCnt.Int64()+numUpkeepsAllowedForStragglingTxs), "Expected consumer counter to remain constant at %d, but got %d", existingCnt.Int64(), cnt.Int64(), )` $DIR/integration-tests/smoke/keeper_test.go: `.BeNumerically("<=", existingCnt.Int64()+numUpkeepsAllowedForStragglingTxs)` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.GetUpkeepCount(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Int64("Upkeep counter", existingCnt.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Upkeep counter when consistently block finished")` $DIR/integration-tests/smoke/keeper_test.go: `.SetConfig(highCheckGasLimit, contracts.OCRv2Config{})` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Waiting for 1m for upkeeps to be performed")` $DIR/integration-tests/smoke/keeper_test.go: `.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { cnt, err := consumersPerformance[i].GetUpkeepCount(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail") existingCnt := existingCnts[upkeepIDs[i]] g.Expect(cnt.Int64()).Should(gomega.BeNumerically(">", existingCnt.Int64()), "Expected consumer counter to be greater than %d, but got %d", existingCnt.Int64(), cnt.Int64(), ) } }, "1m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.GetUpkeepCount(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Calling consumer's Counter shouldn't fail")` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(cnt.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.BeNumerically(">", existingCnt.Int64()), "Expected consumer counter to be greater than %d, but got %d", existingCnt.Int64(), cnt.Int64(), )` $DIR/integration-tests/smoke/keeper_test.go: `.BeNumerically(">", existingCnt.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.Run(fmt.Sprintf("registry_1_%d", registryVersion), func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Keeper) require.NoError(t, err, "Failed to get config") chainClient, chainlinkNodes, linkToken, _ := setupKeeperTest(l, t, &config) sb, err := chainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") registry, registrar, consumers, upkeepIDs := actions_seth.DeployKeeperContracts( t, registryVersion, keeperDefaultRegistryConfig, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, chainClient, big.NewInt(keeperDefaultLinkFunds), ) _, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID)) require.NoError(t, err, "Error creating keeper jobs") t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() }) var initialCounters = make([]*big.Int, len(upkeepIDs)) gom := gomega.NewGomegaWithT(t) // Observe that the upkeeps which are initially registered are performing and // store the value of their initial counters in order to compare later on that the value increased. gom.Eventually(func(g gomega.Gomega) error { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) initialCounters[i] = counter g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter"+ " for upkeep at index "+strconv.Itoa(i)) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64()) l.Info(). Int64("Upkeep counter", counter.Int64()). Int("Upkeep ID", i). Msg("Number of upkeeps performed") } return nil }, "1m", "1s").Should(gomega.Succeed()) newConsumers, _ := actions_seth.RegisterNewUpkeeps(t, chainClient, linkToken, registry, registrar, keeperDefaultUpkeepGasLimit, 1) // We know that newConsumers has size 1, so we can just use the newly registered upkeep. newUpkeep := newConsumers[0] // Test that the newly registered upkeep is also performing. gom.Eventually(func(g gomega.Gomega) error { counter, err := newUpkeep.Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling newly deployed upkeep's counter shouldn't fail") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected newly registered upkeep's counter to be greater than 0, but got %d", counter.Int64()) l.Info().Msg("Newly registered upkeeps performed " + strconv.Itoa(int(counter.Int64())) + " times") return nil }, "1m", "1s").Should(gomega.Succeed()) gom.Eventually(func(g gomega.Gomega) error { for i := 0; i < len(upkeepIDs); i++ { currentCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") l.Info(). Int("Upkeep ID", i). Int64("Upkeep counter", currentCounter.Int64()). Int64("initial counter", initialCounters[i].Int64()). Msg("Number of upkeeps performed") g.Expect(currentCounter.Int64()).Should(gomega.BeNumerically(">", initialCounters[i].Int64()), "Expected counter to have increased from initial value of %s, but got %s", initialCounters[i], currentCounter) } return nil }, "1m", "1s").Should(gomega.Succeed()) })` $DIR/integration-tests/smoke/keeper_test.go: `.Sprintf("registry_1_%d", registryVersion)` $DIR/integration-tests/smoke/keeper_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/keeper_test.go: `.GetConfig("Smoke", tc.Keeper)` $DIR/integration-tests/smoke/keeper_test.go: `.Client.BlockNumber(context.Background())` $DIR/integration-tests/smoke/keeper_test.go: `.Background()` $DIR/integration-tests/smoke/keeper_test.go: `.DeployKeeperContracts( t, registryVersion, keeperDefaultRegistryConfig, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, chainClient, big.NewInt(keeperDefaultLinkFunds), )` $DIR/integration-tests/smoke/keeper_test.go: `.NewInt(keeperDefaultLinkFunds)` $DIR/integration-tests/smoke/keeper_test.go: `.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `.Sprint(chainClient.ChainID)` $DIR/integration-tests/smoke/keeper_test.go: `.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() })` $DIR/integration-tests/smoke/keeper_test.go: `.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)` $DIR/integration-tests/smoke/keeper_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Eventually(func(g gomega.Gomega) error { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) initialCounters[i] = counter g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter"+ " for upkeep at index "+strconv.Itoa(i)) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64()) l.Info(). Int64("Upkeep counter", counter.Int64()). Int("Upkeep ID", i). Msg("Number of upkeeps performed") } return nil }, "1m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter"+ " for upkeep at index "+strconv.Itoa(i))` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Itoa(i)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.BeNumerically(">", int64(0))` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `. Int64("Upkeep counter", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `. Int("Upkeep ID", i)` $DIR/integration-tests/smoke/keeper_test.go: `. Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.RegisterNewUpkeeps(t, chainClient, linkToken, registry, registrar, keeperDefaultUpkeepGasLimit, 1)` $DIR/integration-tests/smoke/keeper_test.go: `.Eventually(func(g gomega.Gomega) error { counter, err := newUpkeep.Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling newly deployed upkeep's counter shouldn't fail") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected newly registered upkeep's counter to be greater than 0, but got %d", counter.Int64()) l.Info().Msg("Newly registered upkeeps performed " + strconv.Itoa(int(counter.Int64())) + " times") return nil }, "1m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Calling newly deployed upkeep's counter shouldn't fail")` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.BeNumerically(">", int64(0)), "Expected newly registered upkeep's counter to be greater than 0, but got %d", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.BeNumerically(">", int64(0))` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Newly registered upkeeps performed " + strconv.Itoa(int(counter.Int64())) + " times")` $DIR/integration-tests/smoke/keeper_test.go: `.Itoa(int(counter.Int64()))` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.Eventually(func(g gomega.Gomega) error { for i := 0; i < len(upkeepIDs); i++ { currentCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") l.Info(). Int("Upkeep ID", i). Int64("Upkeep counter", currentCounter.Int64()). Int64("initial counter", initialCounters[i].Int64()). Msg("Number of upkeeps performed") g.Expect(currentCounter.Int64()).Should(gomega.BeNumerically(">", initialCounters[i].Int64()), "Expected counter to have increased from initial value of %s, but got %s", initialCounters[i], currentCounter) } return nil }, "1m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `. Int("Upkeep ID", i)` $DIR/integration-tests/smoke/keeper_test.go: `. Int64("Upkeep counter", currentCounter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `. Int64("initial counter", initialCounters[i].Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `. Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(currentCounter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.BeNumerically(">", initialCounters[i].Int64()), "Expected counter to have increased from initial value of %s, but got %s", initialCounters[i], currentCounter)` $DIR/integration-tests/smoke/keeper_test.go: `.BeNumerically(">", initialCounters[i].Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.Run(fmt.Sprintf("registry_1_%d", registryVersion), func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Keeper) require.NoError(t, err, "Failed to get config") chainClient, chainlinkNodes, linkToken, _ := setupKeeperTest(l, t, &config) sb, err := chainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") registry, _, consumers, upkeepIDs := actions_seth.DeployKeeperContracts( t, registryVersion, keeperDefaultRegistryConfig, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, chainClient, big.NewInt(1), ) _, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID)) require.NoError(t, err, "Error creating keeper jobs") t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() }) // Since the upkeep is currently underfunded, check that it doesn't get executed gom := gomega.NewGomegaWithT(t) l.Info().Msg("Waiting for 1m to make sure no upkeeps are performed") gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(counter.Int64()).Should(gomega.Equal(int64(0)), "Expected consumer counter to remain zero, but got %d", counter.Int64()) } }, "1m", "1s").Should(gomega.Succeed()) // Grant permission to the registry to fund the upkeep err = linkToken.Approve(registry.Address(), big.NewInt(0).Mul(big.NewInt(9e18), big.NewInt(int64(len(upkeepIDs))))) require.NoError(t, err, "Error approving permissions for registry") // Add funds to the upkeep whose ID we know from above l.Info().Msg("Adding funds to upkeeps") for i := 0; i < len(upkeepIDs); i++ { err = registry.AddUpkeepFunds(upkeepIDs[i], big.NewInt(9e18)) require.NoError(t, err, "Error funding upkeep") } // Now the new upkeep should be performing because we added enough funds gom.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected newly registered upkeep's counter to be greater than 0, but got %d", counter.Int64()) } }, "1m", "1s").Should(gomega.Succeed()) })` $DIR/integration-tests/smoke/keeper_test.go: `.Sprintf("registry_1_%d", registryVersion)` $DIR/integration-tests/smoke/keeper_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/keeper_test.go: `.GetConfig("Smoke", tc.Keeper)` $DIR/integration-tests/smoke/keeper_test.go: `.Client.BlockNumber(context.Background())` $DIR/integration-tests/smoke/keeper_test.go: `.Background()` $DIR/integration-tests/smoke/keeper_test.go: `.DeployKeeperContracts( t, registryVersion, keeperDefaultRegistryConfig, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, chainClient, big.NewInt(1), )` $DIR/integration-tests/smoke/keeper_test.go: `.NewInt(1)` $DIR/integration-tests/smoke/keeper_test.go: `.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `.Sprint(chainClient.ChainID)` $DIR/integration-tests/smoke/keeper_test.go: `.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() })` $DIR/integration-tests/smoke/keeper_test.go: `.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)` $DIR/integration-tests/smoke/keeper_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Waiting for 1m to make sure no upkeeps are performed")` $DIR/integration-tests/smoke/keeper_test.go: `.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(counter.Int64()).Should(gomega.Equal(int64(0)), "Expected consumer counter to remain zero, but got %d", counter.Int64()) } }, "1m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Equal(int64(0)), "Expected consumer counter to remain zero, but got %d", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Equal(int64(0))` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.Approve(registry.Address(), big.NewInt(0).Mul(big.NewInt(9e18), big.NewInt(int64(len(upkeepIDs)))))` $DIR/integration-tests/smoke/keeper_test.go: `.Address()` $DIR/integration-tests/smoke/keeper_test.go: `.NewInt(0)` $DIR/integration-tests/smoke/keeper_test.go: `.Mul(big.NewInt(9e18), big.NewInt(int64(len(upkeepIDs))))` $DIR/integration-tests/smoke/keeper_test.go: `.NewInt(9e18)` $DIR/integration-tests/smoke/keeper_test.go: `.NewInt(int64(len(upkeepIDs)))` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Adding funds to upkeeps")` $DIR/integration-tests/smoke/keeper_test.go: `.AddUpkeepFunds(upkeepIDs[i], big.NewInt(9e18))` $DIR/integration-tests/smoke/keeper_test.go: `.NewInt(9e18)` $DIR/integration-tests/smoke/keeper_test.go: `.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected newly registered upkeep's counter to be greater than 0, but got %d", counter.Int64()) } }, "1m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.BeNumerically(">", int64(0)), "Expected newly registered upkeep's counter to be greater than 0, but got %d", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.BeNumerically(">", int64(0))` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.Run(fmt.Sprintf("registry_1_%d", registryVersion), func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Keeper) require.NoError(t, err, "Failed to get config") chainClient, chainlinkNodes, linkToken, _ := setupKeeperTest(l, t, &config) sb, err := chainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") registry, _, consumers, upkeepIDs := actions_seth.DeployKeeperContracts( t, registryVersion, keeperDefaultRegistryConfig, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, chainClient, big.NewInt(keeperDefaultLinkFunds), ) _, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID)) require.NoError(t, err, "Error creating keeper jobs") t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() }) var initialCounters = make([]*big.Int, len(upkeepIDs)) gom := gomega.NewGomegaWithT(t) // Make sure the upkeeps are running before we remove a keeper gom.Eventually(func(g gomega.Gomega) error { for upkeepID := 0; upkeepID < len(upkeepIDs); upkeepID++ { counter, err := consumers[upkeepID].Counter(testcontext.Get(t)) initialCounters[upkeepID] = counter g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter"+ " for upkeep with ID "+strconv.Itoa(upkeepID)) g.Expect(counter.Cmp(big.NewInt(0)) == 1, "Expected consumer counter to be greater than 0, but got %s", counter) } return nil }, "1m", "1s").Should(gomega.Succeed()) keepers, err := registry.GetKeeperList(testcontext.Get(t)) require.NoError(t, err, "Error getting list of Keepers") // Remove the first keeper from the list require.GreaterOrEqual(t, len(keepers), 2, "Expected there to be at least 2 keepers") newKeeperList := keepers[1:] // Construct the addresses of the payees required by the SetKeepers function payees := make([]string, len(keepers)-1) for i := 0; i < len(payees); i++ { payees[i], err = chainlinkNodes[0].PrimaryEthAddress() require.NoError(t, err, "Error building payee list") } err = registry.SetKeepers(newKeeperList, payees, contracts.OCRv2Config{}) require.NoError(t, err, "Error setting new list of Keepers") l.Info().Msg("Successfully removed keeper at address " + keepers[0] + " from the list of Keepers") // The upkeeps should still perform and their counters should have increased compared to the first check gom.Eventually(func(g gomega.Gomega) error { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Cmp(initialCounters[i]) == 1, "Expected consumer counter to be greater "+ "than initial counter which was %s, but got %s", initialCounters[i], counter) } return nil }, "1m", "1s").Should(gomega.Succeed()) })` $DIR/integration-tests/smoke/keeper_test.go: `.Sprintf("registry_1_%d", registryVersion)` $DIR/integration-tests/smoke/keeper_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/keeper_test.go: `.GetConfig("Smoke", tc.Keeper)` $DIR/integration-tests/smoke/keeper_test.go: `.Client.BlockNumber(context.Background())` $DIR/integration-tests/smoke/keeper_test.go: `.Background()` $DIR/integration-tests/smoke/keeper_test.go: `.DeployKeeperContracts( t, registryVersion, keeperDefaultRegistryConfig, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, chainClient, big.NewInt(keeperDefaultLinkFunds), )` $DIR/integration-tests/smoke/keeper_test.go: `.NewInt(keeperDefaultLinkFunds)` $DIR/integration-tests/smoke/keeper_test.go: `.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `.Sprint(chainClient.ChainID)` $DIR/integration-tests/smoke/keeper_test.go: `.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() })` $DIR/integration-tests/smoke/keeper_test.go: `.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)` $DIR/integration-tests/smoke/keeper_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Eventually(func(g gomega.Gomega) error { for upkeepID := 0; upkeepID < len(upkeepIDs); upkeepID++ { counter, err := consumers[upkeepID].Counter(testcontext.Get(t)) initialCounters[upkeepID] = counter g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter"+ " for upkeep with ID "+strconv.Itoa(upkeepID)) g.Expect(counter.Cmp(big.NewInt(0)) == 1, "Expected consumer counter to be greater than 0, but got %s", counter) } return nil }, "1m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter"+ " for upkeep with ID "+strconv.Itoa(upkeepID))` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Itoa(upkeepID)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(counter.Cmp(big.NewInt(0)) == 1, "Expected consumer counter to be greater than 0, but got %s", counter)` $DIR/integration-tests/smoke/keeper_test.go: `.Cmp(big.NewInt(0))` $DIR/integration-tests/smoke/keeper_test.go: `.NewInt(0)` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.GetKeeperList(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.PrimaryEthAddress()` $DIR/integration-tests/smoke/keeper_test.go: `.SetKeepers(newKeeperList, payees, contracts.OCRv2Config{})` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Successfully removed keeper at address " + keepers[0] + " from the list of Keepers")` $DIR/integration-tests/smoke/keeper_test.go: `.Eventually(func(g gomega.Gomega) error { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Cmp(initialCounters[i]) == 1, "Expected consumer counter to be greater "+ "than initial counter which was %s, but got %s", initialCounters[i], counter) } return nil }, "1m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(counter.Cmp(initialCounters[i]) == 1, "Expected consumer counter to be greater "+ "than initial counter which was %s, but got %s", initialCounters[i], counter)` $DIR/integration-tests/smoke/keeper_test.go: `.Cmp(initialCounters[i])` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.Run(fmt.Sprintf("registry_1_%d", registryVersion), func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Keeper) require.NoError(t, err, "Failed to get config") chainClient, chainlinkNodes, linkToken, _ := setupKeeperTest(l, t, &config) sb, err := chainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") registry, _, consumers, upkeepIDs := actions_seth.DeployKeeperContracts( t, registryVersion, keeperDefaultRegistryConfig, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, chainClient, big.NewInt(keeperDefaultLinkFunds), ) gom := gomega.NewGomegaWithT(t) _, err = actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID)) require.NoError(t, err, "Error creating keeper jobs") t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() }) // Observe that the upkeeps which are initially registered are performing gom.Eventually(func(g gomega.Gomega) error { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d") } return nil }, "1m", "1s").Should(gomega.Succeed()) // Pause the registry err = registry.Pause() require.NoError(t, err, "Error pausing the registry") // Store how many times each upkeep performed once the registry was successfully paused var countersAfterPause = make([]*big.Int, len(upkeepIDs)) for i := 0; i < len(upkeepIDs); i++ { countersAfterPause[i], err = consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Error retrieving consumer at index %d", i) } // After we paused the registry, the counters of all the upkeeps should stay constant // because they are no longer getting serviced gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { latestCounter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Error retrieving consumer contract at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.Equal(countersAfterPause[i].Int64()), "Expected consumer counter to remain constant at %d, but got %d", countersAfterPause[i].Int64(), latestCounter.Int64()) } }, "1m", "1s").Should(gomega.Succeed()) })` $DIR/integration-tests/smoke/keeper_test.go: `.Sprintf("registry_1_%d", registryVersion)` $DIR/integration-tests/smoke/keeper_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/keeper_test.go: `.GetConfig("Smoke", tc.Keeper)` $DIR/integration-tests/smoke/keeper_test.go: `.Client.BlockNumber(context.Background())` $DIR/integration-tests/smoke/keeper_test.go: `.Background()` $DIR/integration-tests/smoke/keeper_test.go: `.DeployKeeperContracts( t, registryVersion, keeperDefaultRegistryConfig, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, chainClient, big.NewInt(keeperDefaultLinkFunds), )` $DIR/integration-tests/smoke/keeper_test.go: `.NewInt(keeperDefaultLinkFunds)` $DIR/integration-tests/smoke/keeper_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/keeper_test.go: `.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `.Sprint(chainClient.ChainID)` $DIR/integration-tests/smoke/keeper_test.go: `.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() })` $DIR/integration-tests/smoke/keeper_test.go: `.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)` $DIR/integration-tests/smoke/keeper_test.go: `.Eventually(func(g gomega.Gomega) error { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d") } return nil }, "1m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d")` $DIR/integration-tests/smoke/keeper_test.go: `.BeNumerically(">", int64(0))` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.Pause()` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { latestCounter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Error retrieving consumer contract at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.Equal(countersAfterPause[i].Int64()), "Expected consumer counter to remain constant at %d, but got %d", countersAfterPause[i].Int64(), latestCounter.Int64()) } }, "1m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(latestCounter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Equal(countersAfterPause[i].Int64()), "Expected consumer counter to remain constant at %d, but got %d", countersAfterPause[i].Int64(), latestCounter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Equal(countersAfterPause[i].Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/keeper_test.go: `.GetConfig("Smoke", tc.Keeper)` $DIR/integration-tests/smoke/keeper_test.go: `.Client.BlockNumber(context.Background())` $DIR/integration-tests/smoke/keeper_test.go: `.Background()` $DIR/integration-tests/smoke/keeper_test.go: `.DeployKeeperContracts( t, ethereum.RegistryVersion_1_2, keeperDefaultRegistryConfig, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, chainClient, big.NewInt(keeperDefaultLinkFunds), )` $DIR/integration-tests/smoke/keeper_test.go: `.NewInt(keeperDefaultLinkFunds)` $DIR/integration-tests/smoke/keeper_test.go: `.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `.Sprint(chainClient.ChainID)` $DIR/integration-tests/smoke/keeper_test.go: `.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, ethereum.RegistryVersion_1_2)() })` $DIR/integration-tests/smoke/keeper_test.go: `.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, ethereum.RegistryVersion_1_2)` $DIR/integration-tests/smoke/keeper_test.go: `.DeployKeeperContracts( t, ethereum.RegistryVersion_1_2, keeperDefaultRegistryConfig, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, chainClient, big.NewInt(keeperDefaultLinkFunds), )` $DIR/integration-tests/smoke/keeper_test.go: `.NewInt(keeperDefaultLinkFunds)` $DIR/integration-tests/smoke/keeper_test.go: `.CreateKeeperJobsLocal(l, chainlinkNodes, secondRegistry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `.Sprint(chainClient.ChainID)` $DIR/integration-tests/smoke/keeper_test.go: `.SetMigrationPermissions(common.HexToAddress(secondRegistry.Address()), 3)` $DIR/integration-tests/smoke/keeper_test.go: `.HexToAddress(secondRegistry.Address())` $DIR/integration-tests/smoke/keeper_test.go: `.Address()` $DIR/integration-tests/smoke/keeper_test.go: `.SetMigrationPermissions(common.HexToAddress(registry.Address()), 3)` $DIR/integration-tests/smoke/keeper_test.go: `.HexToAddress(registry.Address())` $DIR/integration-tests/smoke/keeper_test.go: `.Address()` $DIR/integration-tests/smoke/keeper_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Waiting for 1m for upkeeps to be performed before migration")` $DIR/integration-tests/smoke/keeper_test.go: `.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { counterBeforeMigration, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(counterBeforeMigration.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %s", counterBeforeMigration) } }, "1m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(counterBeforeMigration.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %s", counterBeforeMigration)` $DIR/integration-tests/smoke/keeper_test.go: `.BeNumerically(">", int64(0))` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.Migrate([]*big.Int{upkeepIDs[i]}, common.HexToAddress(secondRegistry.Address()))` $DIR/integration-tests/smoke/keeper_test.go: `.HexToAddress(secondRegistry.Address())` $DIR/integration-tests/smoke/keeper_test.go: `.Address()` $DIR/integration-tests/smoke/keeper_test.go: `.Pause()` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Waiting for 1m for upkeeps to be performed after migration")` $DIR/integration-tests/smoke/keeper_test.go: `.Eventually(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { currentCounter, err := consumers[i].Counter(testcontext.Get(t)) counterAfterMigration := counterAfterMigrationPerUpkeep[upkeepIDs[i]] g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail") g.Expect(currentCounter.Int64()).Should(gomega.BeNumerically(">", counterAfterMigration.Int64()), "Expected counter to have increased, but stayed constant at %s", counterAfterMigration) } }, "1m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Calling consumer's counter shouldn't fail")` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(currentCounter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.BeNumerically(">", counterAfterMigration.Int64()), "Expected counter to have increased, but stayed constant at %s", counterAfterMigration)` $DIR/integration-tests/smoke/keeper_test.go: `.BeNumerically(">", counterAfterMigration.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.Run(fmt.Sprintf("registry_1_%d", registryVersion), func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) config, err := tc.GetConfig("Smoke", tc.Keeper) require.NoError(t, err, "Failed to get config") chainClient, chainlinkNodes, linkToken, _ := setupKeeperTest(l, t, &config) sb, err := chainClient.Client.BlockNumber(context.Background()) require.NoError(t, err, "Failed to get start block") registry, _, consumers, upkeepIDs := actions_seth.DeployKeeperContracts( t, registryVersion, lowBCPTRegistryConfig, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, chainClient, big.NewInt(keeperDefaultLinkFunds), ) jobs, err := actions.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID)) require.NoError(t, err, "Error creating keeper jobs") t.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() }) var initialCounters = make([]*big.Int, len(upkeepIDs)) gom := gomega.NewGomegaWithT(t) // Watch upkeeps being performed and store their counters in order to compare them later in the test gom.Eventually(func(g gomega.Gomega) error { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) initialCounters[i] = counter g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64()) } return nil }, "1m", "1s").Should(gomega.Succeed()) // Take down half of the Keeper nodes by deleting the Keeper job registered above (after registry deployment) firstHalfToTakeDown := chainlinkNodes[:len(chainlinkNodes)/2+1] for i, nodeToTakeDown := range firstHalfToTakeDown { err = nodeToTakeDown.MustDeleteJob(jobs[0].Data.ID) require.NoError(t, err, "Error deleting job from node %d", i) } l.Info().Msg("Successfully managed to take down the first half of the nodes") // Assert that upkeeps are still performed and their counters have increased gom.Eventually(func(g gomega.Gomega) error { for i := 0; i < len(upkeepIDs); i++ { currentCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(currentCounter.Int64()).Should(gomega.BeNumerically(">", initialCounters[i].Int64()), "Expected counter to have increased from initial value of %s, but got %s", initialCounters[i], currentCounter) } return nil }, "3m", "1s").Should(gomega.Succeed()) // Take down the other half of the Keeper nodes nodesAndJobs := []nodeAndJob{} for i, n := range chainlinkNodes { nodesAndJobs = append(nodesAndJobs, nodeAndJob{node: n, job: jobs[i]}) } secondHalfToTakeDown := nodesAndJobs[len(nodesAndJobs)/2+1:] for i, nodeToTakeDown := range secondHalfToTakeDown { err = nodeToTakeDown.node.MustDeleteJob(nodeToTakeDown.job.Data.ID) require.NoError(t, err, "Error deleting job from node %d", i) } l.Info().Msg("Successfully managed to take down the second half of the nodes") // See how many times each upkeep was executed var countersAfterNoMoreNodes = make([]*big.Int, len(upkeepIDs)) for i := 0; i < len(upkeepIDs); i++ { countersAfterNoMoreNodes[i], err = consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Error retrieving consumer counter %d", i) l.Info(). Int("Index", i). Int64("Upkeeps", countersAfterNoMoreNodes[i].Int64()). Msg("Upkeeps Performed") } // Once all the nodes are taken down, there might be some straggling transactions which went through before // all the nodes were taken down. Every keeper node can have at most 1 straggling transaction per upkeep, // so a +6 on the upper limit side should be sufficient. gom.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { latestCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterNoMoreNodes[i].Int64()+numUpkeepsAllowedForStragglingTxs, ), "Expected consumer counter to not have increased more than %d, but got %d", countersAfterNoMoreNodes[i].Int64()+numUpkeepsAllowedForStragglingTxs, latestCounter.Int64()) } }, "3m", "1s").Should(gomega.Succeed()) })` $DIR/integration-tests/smoke/keeper_test.go: `.Sprintf("registry_1_%d", registryVersion)` $DIR/integration-tests/smoke/keeper_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/keeper_test.go: `.GetConfig("Smoke", tc.Keeper)` $DIR/integration-tests/smoke/keeper_test.go: `.Client.BlockNumber(context.Background())` $DIR/integration-tests/smoke/keeper_test.go: `.Background()` $DIR/integration-tests/smoke/keeper_test.go: `.DeployKeeperContracts( t, registryVersion, lowBCPTRegistryConfig, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, chainClient, big.NewInt(keeperDefaultLinkFunds), )` $DIR/integration-tests/smoke/keeper_test.go: `.NewInt(keeperDefaultLinkFunds)` $DIR/integration-tests/smoke/keeper_test.go: `.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `.Sprint(chainClient.ChainID)` $DIR/integration-tests/smoke/keeper_test.go: `.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)() })` $DIR/integration-tests/smoke/keeper_test.go: `.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, registryVersion)` $DIR/integration-tests/smoke/keeper_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Eventually(func(g gomega.Gomega) error { for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) initialCounters[i] = counter g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64()) } return nil }, "1m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.BeNumerically(">", int64(0)), "Expected consumer counter to be greater than 0, but got %d", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.BeNumerically(">", int64(0))` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.MustDeleteJob(jobs[0].Data.ID)` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Successfully managed to take down the first half of the nodes")` $DIR/integration-tests/smoke/keeper_test.go: `.Eventually(func(g gomega.Gomega) error { for i := 0; i < len(upkeepIDs); i++ { currentCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(currentCounter.Int64()).Should(gomega.BeNumerically(">", initialCounters[i].Int64()), "Expected counter to have increased from initial value of %s, but got %s", initialCounters[i], currentCounter) } return nil }, "3m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(currentCounter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.BeNumerically(">", initialCounters[i].Int64()), "Expected counter to have increased from initial value of %s, but got %s", initialCounters[i], currentCounter)` $DIR/integration-tests/smoke/keeper_test.go: `.BeNumerically(">", initialCounters[i].Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.node.MustDeleteJob(nodeToTakeDown.job.Data.ID)` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Successfully managed to take down the second half of the nodes")` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `. Int("Index", i)` $DIR/integration-tests/smoke/keeper_test.go: `. Int64("Upkeeps", countersAfterNoMoreNodes[i].Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `. Msg("Upkeeps Performed")` $DIR/integration-tests/smoke/keeper_test.go: `.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { latestCounter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterNoMoreNodes[i].Int64()+numUpkeepsAllowedForStragglingTxs, ), "Expected consumer counter to not have increased more than %d, but got %d", countersAfterNoMoreNodes[i].Int64()+numUpkeepsAllowedForStragglingTxs, latestCounter.Int64()) } }, "3m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(latestCounter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.BeNumerically("<=", countersAfterNoMoreNodes[i].Int64()+numUpkeepsAllowedForStragglingTxs, ), "Expected consumer counter to not have increased more than %d, but got %d", countersAfterNoMoreNodes[i].Int64()+numUpkeepsAllowedForStragglingTxs, latestCounter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.BeNumerically("<=", countersAfterNoMoreNodes[i].Int64()+numUpkeepsAllowedForStragglingTxs, )` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/keeper_test.go: `.GetConfig("Smoke", tc.Keeper)` $DIR/integration-tests/smoke/keeper_test.go: `.Client.BlockNumber(context.Background())` $DIR/integration-tests/smoke/keeper_test.go: `.Background()` $DIR/integration-tests/smoke/keeper_test.go: `.DeployKeeperContracts( t, ethereum.RegistryVersion_1_3, lowBCPTRegistryConfig, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, chainClient, big.NewInt(keeperDefaultLinkFunds), )` $DIR/integration-tests/smoke/keeper_test.go: `.NewInt(keeperDefaultLinkFunds)` $DIR/integration-tests/smoke/keeper_test.go: `.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `.Sprint(chainClient.ChainID)` $DIR/integration-tests/smoke/keeper_test.go: `.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, ethereum.RegistryVersion_1_3)() })` $DIR/integration-tests/smoke/keeper_test.go: `.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, ethereum.RegistryVersion_1_3)` $DIR/integration-tests/smoke/keeper_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Eventually(func(g gomega.Gomega) error { // Check if the upkeeps are performing multiple times by analysing their counters and checking they are greater than 5 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(5)), "Expected consumer counter to be greater than 5, but got %d", counter.Int64()) l.Info().Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed") } return nil }, "3m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.BeNumerically(">", int64(5)), "Expected consumer counter to be greater than 5, but got %d", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.BeNumerically(">", int64(5))` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Int64("Upkeep counter", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.PauseUpkeep(upkeepIDs[i])` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `. Int("Index", i)` $DIR/integration-tests/smoke/keeper_test.go: `. Int64("Upkeeps", countersAfterPause[i].Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `. Msg("Paused Upkeep")` $DIR/integration-tests/smoke/keeper_test.go: `.Consistently(func(g gomega.Gomega) { for i := 0; i < len(upkeepIDs); i++ { // In most cases counters should remain constant, but there might be a straggling perform tx which // gets committed later. Since every keeper node cannot have more than 1 straggling tx, it // is sufficient to check that the upkeep count does not increase by more than 6. latestCounter, err := consumers[i].Counter(testcontext.Get(t)) require.NoError(t, err, "Error retrieving counter at index %d", i) g.Expect(latestCounter.Int64()).Should(gomega.BeNumerically("<=", countersAfterPause[i].Int64()+numUpkeepsAllowedForStragglingTxs), "Expected consumer counter not have increased more than %d, but got %d", countersAfterPause[i].Int64()+numUpkeepsAllowedForStragglingTxs, latestCounter.Int64()) } }, "1m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(latestCounter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.BeNumerically("<=", countersAfterPause[i].Int64()+numUpkeepsAllowedForStragglingTxs), "Expected consumer counter not have increased more than %d, but got %d", countersAfterPause[i].Int64()+numUpkeepsAllowedForStragglingTxs, latestCounter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.BeNumerically("<=", countersAfterPause[i].Int64()+numUpkeepsAllowedForStragglingTxs)` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.UnpauseUpkeep(upkeepIDs[i])` $DIR/integration-tests/smoke/keeper_test.go: `.Eventually(func(g gomega.Gomega) error { // Check if the upkeeps are performing multiple times by analysing their counters and checking they are greater than 5 + numbers of performing before pause for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter"+ " for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(5)+countersAfterPause[i].Int64()), "Expected consumer counter to be greater than %d, but got %d", int64(5)+countersAfterPause[i].Int64(), counter.Int64()) l.Info().Int64("Upkeeps", counter.Int64()).Msg("Upkeeps Performed") } return nil }, "3m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter"+ " for upkeep at index %d", i)` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.BeNumerically(">", int64(5)+countersAfterPause[i].Int64()), "Expected consumer counter to be greater than %d, but got %d", int64(5)+countersAfterPause[i].Int64(), counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.BeNumerically(">", int64(5)+countersAfterPause[i].Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Int64("Upkeeps", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Upkeeps Performed")` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/keeper_test.go: `.GetConfig("Smoke", tc.Keeper)` $DIR/integration-tests/smoke/keeper_test.go: `.Client.BlockNumber(context.Background())` $DIR/integration-tests/smoke/keeper_test.go: `.Background()` $DIR/integration-tests/smoke/keeper_test.go: `.DeployPerformDataCheckerContracts( t, chainClient, ethereum.RegistryVersion_1_3, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, &lowBCPTRegistryConfig, big.NewInt(keeperDefaultLinkFunds), []byte(keeperExpectedData), )` $DIR/integration-tests/smoke/keeper_test.go: `.NewInt(keeperDefaultLinkFunds)` $DIR/integration-tests/smoke/keeper_test.go: `.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `.Sprint(chainClient.ChainID)` $DIR/integration-tests/smoke/keeper_test.go: `.Cleanup(func() { actions_seth.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, ethereum.RegistryVersion_1_3)() })` $DIR/integration-tests/smoke/keeper_test.go: `.GetStalenessReportCleanupFn(t, l, chainClient, sb, registry, ethereum.RegistryVersion_1_3)` $DIR/integration-tests/smoke/keeper_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Consistently(func(g gomega.Gomega) { // expect the counter to remain 0 because perform data does not match for i := 0; i < len(upkeepIDs); i++ { counter, err := performDataChecker[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve perform data checker for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.Equal(int64(0)), "Expected perform data checker counter to be 0, but got %d", counter.Int64()) l.Info().Int64("Upkeep perform data checker", counter.Int64()).Msg("Number of upkeeps performed") } }, "2m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve perform data checker for upkeep at index %d", i)` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Equal(int64(0)), "Expected perform data checker counter to be 0, but got %d", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Equal(int64(0))` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Int64("Upkeep perform data checker", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.UpdateCheckData(upkeepIDs[i], []byte(keeperExpectedData))` $DIR/integration-tests/smoke/keeper_test.go: `.GetUpkeepInfo(testcontext.Get(t), upkeepIDs[i])` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Eventually(func(g gomega.Gomega) error { // Check if the upkeeps are performing multiple times by analysing their counters and checking they are greater than 5 for i := 0; i < len(upkeepIDs); i++ { counter, err := performDataChecker[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve perform data checker counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(5)), "Expected perform data checker counter to be greater than 5, but got %d", counter.Int64()) l.Info().Int64("Upkeep perform data checker", counter.Int64()).Msg("Number of upkeeps performed") } return nil }, "3m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve perform data checker counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.BeNumerically(">", int64(5)), "Expected perform data checker counter to be greater than 5, but got %d", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.BeNumerically(">", int64(5))` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Int64("Upkeep perform data checker", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/keeper_test.go: `.GetConfig("Smoke", tc.Keeper)` $DIR/integration-tests/smoke/keeper_test.go: `.DeployKeeperContracts( t, registryVersion, keeperDefaultRegistryConfig, keeperDefaultUpkeepsToDeploy, keeperDefaultUpkeepGasLimit, linkToken, chainClient, big.NewInt(keeperDefaultLinkFunds), )` $DIR/integration-tests/smoke/keeper_test.go: `.NewInt(keeperDefaultLinkFunds)` $DIR/integration-tests/smoke/keeper_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/keeper_test.go: `.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `.Sprint(chainClient.ChainID)` $DIR/integration-tests/smoke/keeper_test.go: `.Eventually(func(g gomega.Gomega) error { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 10 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(10)), "Expected consumer counter to be greater than 10, but got %d", counter.Int64()) l.Info().Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed") } return nil }, "5m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.BeNumerically(">", int64(10)), "Expected consumer counter to be greater than 10, but got %d", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.BeNumerically(">", int64(10))` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Int64("Upkeep counter", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/keeper_test.go: `.ReadJobs()` $DIR/integration-tests/smoke/keeper_test.go: `.DeleteJob(id)` $DIR/integration-tests/smoke/keeper_test.go: `.CreateKeeperJobsLocal(l, chainlinkNodes, registry, contracts.OCRv2Config{}, fmt.Sprint(chainClient.ChainID))` $DIR/integration-tests/smoke/keeper_test.go: `.Sprint(chainClient.ChainID)` $DIR/integration-tests/smoke/keeper_test.go: `.Eventually(func(g gomega.Gomega) error { // Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 10 for i := 0; i < len(upkeepIDs); i++ { counter, err := consumers[i].Counter(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i) g.Expect(counter.Int64()).Should(gomega.BeNumerically(">", int64(10)), "Expected consumer counter to be greater than 10, but got %d", counter.Int64()) l.Info().Int64("Upkeep counter", counter.Int64()).Msg("Number of upkeeps performed") } return nil }, "5m", "1s")` $DIR/integration-tests/smoke/keeper_test.go: `.Counter(testcontext.Get(t))` $DIR/integration-tests/smoke/keeper_test.go: `.Get(t)` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(err)` $DIR/integration-tests/smoke/keeper_test.go: `.ShouldNot(gomega.HaveOccurred(), "Failed to retrieve consumer counter for upkeep at index %d", i)` $DIR/integration-tests/smoke/keeper_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/keeper_test.go: `.Expect(counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Should(gomega.BeNumerically(">", int64(10)), "Expected consumer counter to be greater than 10, but got %d", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.BeNumerically(">", int64(10))` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Info()` $DIR/integration-tests/smoke/keeper_test.go: `.Int64("Upkeep counter", counter.Int64())` $DIR/integration-tests/smoke/keeper_test.go: `.Int64()` $DIR/integration-tests/smoke/keeper_test.go: `.Msg("Number of upkeeps performed")` $DIR/integration-tests/smoke/keeper_test.go: `.Succeed()` $DIR/integration-tests/smoke/ocr2_test.go: `t.Run(test.name, func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) testEnv, aggregatorContracts, sethClient := prepareORCv2SmokeTestEnv(t, test, l, 5) err := testEnv.MockAdapter.SetAdapterBasedIntValuePath("ocr2", []string{http.MethodGet, http.MethodPost}, 10) require.NoError(t, err) err = actions_seth.WatchNewOCRRound(l, sethClient, 2, contracts.V2OffChainAgrregatorToOffChainAggregatorWithRounds(aggregatorContracts), time.Minute*5) require.NoError(t, err) roundData, err := aggregatorContracts[0].GetRound(testcontext.Get(t), big.NewInt(2)) require.NoError(t, err, "Error getting latest OCR answer") require.Equal(t, int64(10), roundData.Answer.Int64(), "Expected latest answer from OCR contract to be 10 but got %d", roundData.Answer.Int64(), ) })` $DIR/integration-tests/smoke/ocr2_test.go: `err = actions_seth.WatchNewOCRRound(l, sethClient, 2, contracts.V2OffChainAgrregatorToOffChainAggregatorWithRounds(aggregatorContracts), time.Minute*5)` $DIR/integration-tests/smoke/ocr2_test.go: `err = actions_seth.WatchNewOCRRound(l, sethClient, int64(round), contracts.V2OffChainAgrregatorToOffChainAggregatorWithRounds(aggregatorContracts), time.Minute*5)` $DIR/integration-tests/smoke/ocr2_test.go: `err = actions_seth.WatchNewOCRRound(l, sethClient, 2, contracts.V2OffChainAgrregatorToOffChainAggregatorWithRounds(aggregatorContracts), time.Minute*5)` $DIR/integration-tests/smoke/ocr2_test.go: `err = actions.DeleteJobs(nodeClients)` $DIR/integration-tests/smoke/ocr2_test.go: `err = actions.DeleteBridges(nodeClients)` $DIR/integration-tests/smoke/ocr2_test.go: `err = actions.CreateOCRv2JobsLocal(aggregatorContracts, bootstrapNode, workerNodes, env.MockAdapter, "ocr2", 15, uint64(sethClient.ChainID), false, false)` $DIR/integration-tests/smoke/ocr2_test.go: `err = actions_seth.WatchNewOCRRound(l, sethClient, 3, contracts.V2OffChainAgrregatorToOffChainAggregatorWithRounds(aggregatorContracts), time.Minute*3)` $DIR/integration-tests/smoke/ocr2_test.go: `roundData, err = aggregatorContracts[0].GetRound(testcontext.Get(t), big.NewInt(3))` $DIR/integration-tests/smoke/ocr2_test.go: `.Run(test.name, func(t *testing.T) { t.Parallel() l := logging.GetTestLogger(t) testEnv, aggregatorContracts, sethClient := prepareORCv2SmokeTestEnv(t, test, l, 5) err := testEnv.MockAdapter.SetAdapterBasedIntValuePath("ocr2", []string{http.MethodGet, http.MethodPost}, 10) require.NoError(t, err) err = actions_seth.WatchNewOCRRound(l, sethClient, 2, contracts.V2OffChainAgrregatorToOffChainAggregatorWithRounds(aggregatorContracts), time.Minute*5) require.NoError(t, err) roundData, err := aggregatorContracts[0].GetRound(testcontext.Get(t), big.NewInt(2)) require.NoError(t, err, "Error getting latest OCR answer") require.Equal(t, int64(10), roundData.Answer.Int64(), "Expected latest answer from OCR contract to be 10 but got %d", roundData.Answer.Int64(), ) })` $DIR/integration-tests/smoke/ocr2_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/ocr2_test.go: `.MockAdapter.SetAdapterBasedIntValuePath("ocr2", []string{http.MethodGet, http.MethodPost}, 10)` $DIR/integration-tests/smoke/ocr2_test.go: `.WatchNewOCRRound(l, sethClient, 2, contracts.V2OffChainAgrregatorToOffChainAggregatorWithRounds(aggregatorContracts), time.Minute*5)` $DIR/integration-tests/smoke/ocr2_test.go: `.V2OffChainAgrregatorToOffChainAggregatorWithRounds(aggregatorContracts)` $DIR/integration-tests/smoke/ocr2_test.go: `.GetRound(testcontext.Get(t), big.NewInt(2))` $DIR/integration-tests/smoke/ocr2_test.go: `.Get(t)` $DIR/integration-tests/smoke/ocr2_test.go: `.NewInt(2)` $DIR/integration-tests/smoke/ocr2_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/ocr2_test.go: `.StartNewRound(contracts.V2OffChainAgrregatorToOffChainAggregatorWithRounds(aggregatorContracts))` $DIR/integration-tests/smoke/ocr2_test.go: `.V2OffChainAgrregatorToOffChainAggregatorWithRounds(aggregatorContracts)` $DIR/integration-tests/smoke/ocr2_test.go: `.WatchNewOCRRound(l, sethClient, int64(round), contracts.V2OffChainAgrregatorToOffChainAggregatorWithRounds(aggregatorContracts), time.Minute*5)` $DIR/integration-tests/smoke/ocr2_test.go: `.V2OffChainAgrregatorToOffChainAggregatorWithRounds(aggregatorContracts)` $DIR/integration-tests/smoke/ocr2_test.go: `.GetRound(testcontext.Get(t), big.NewInt(int64(round)))` $DIR/integration-tests/smoke/ocr2_test.go: `.Get(t)` $DIR/integration-tests/smoke/ocr2_test.go: `.NewInt(int64(round))` $DIR/integration-tests/smoke/ocr2_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/ocr2_test.go: `.ClCluster.NodeAPIs()` $DIR/integration-tests/smoke/ocr2_test.go: `.MockAdapter.SetAdapterBasedIntValuePath("ocr2", []string{http.MethodGet, http.MethodPost}, 10)` $DIR/integration-tests/smoke/ocr2_test.go: `.WatchNewOCRRound(l, sethClient, 2, contracts.V2OffChainAgrregatorToOffChainAggregatorWithRounds(aggregatorContracts), time.Minute*5)` $DIR/integration-tests/smoke/ocr2_test.go: `.V2OffChainAgrregatorToOffChainAggregatorWithRounds(aggregatorContracts)` $DIR/integration-tests/smoke/ocr2_test.go: `.GetRound(testcontext.Get(t), big.NewInt(2))` $DIR/integration-tests/smoke/ocr2_test.go: `.Get(t)` $DIR/integration-tests/smoke/ocr2_test.go: `.NewInt(2)` $DIR/integration-tests/smoke/ocr2_test.go: `.DeleteJobs(nodeClients)` $DIR/integration-tests/smoke/ocr2_test.go: `.DeleteBridges(nodeClients)` $DIR/integration-tests/smoke/ocr2_test.go: `.CreateOCRv2JobsLocal(aggregatorContracts, bootstrapNode, workerNodes, env.MockAdapter, "ocr2", 15, uint64(sethClient.ChainID), false, false)` $DIR/integration-tests/smoke/ocr2_test.go: `.WatchNewOCRRound(l, sethClient, 3, contracts.V2OffChainAgrregatorToOffChainAggregatorWithRounds(aggregatorContracts), time.Minute*3)` $DIR/integration-tests/smoke/ocr2_test.go: `.V2OffChainAgrregatorToOffChainAggregatorWithRounds(aggregatorContracts)` $DIR/integration-tests/smoke/ocr2_test.go: `.GetRound(testcontext.Get(t), big.NewInt(3))` $DIR/integration-tests/smoke/ocr2_test.go: `.Get(t)` $DIR/integration-tests/smoke/ocr2_test.go: `.NewInt(3)` $DIR/integration-tests/smoke/ocr2_test.go: `.Answer.Int64()` $DIR/integration-tests/smoke/ocr2_test.go: `.Answer.Int64()` $DIR/integration-tests/smoke/ocr2vrf_test.go: `testNetwork = seth_utils.MustReplaceSimulatedNetworkUrlWithK8(l, testNetwork, *testEnvironment)` $DIR/integration-tests/smoke/ocr2vrf_test.go: `t.Cleanup(func() { err := actions_seth.TeardownSuite(t, chainClient, testEnvironment, chainlinkNodes, nil, zapcore.ErrorLevel, &config) require.NoError(t, err, "Error tearing down environment") })` $DIR/integration-tests/smoke/ocr2vrf_test.go: `l.Info().Interface("Random Number", randomness).Interface("Randomness Number Index", i).Msg("Randomness retrieved from Consumer contract")` $DIR/integration-tests/smoke/ocr2vrf_test.go: `testNetwork = seth_utils.MustReplaceSimulatedNetworkUrlWithK8(l, testNetwork, *testEnvironment)` $DIR/integration-tests/smoke/ocr2vrf_test.go: `t.Cleanup(func() { err := actions_seth.TeardownSuite(t, chainClient, testEnvironment, chainlinkNodes, nil, zapcore.ErrorLevel, &config) require.NoError(t, err, "Error tearing down environment") })` $DIR/integration-tests/smoke/ocr2vrf_test.go: `l.Info().Interface("Random Number", randomness).Interface("Randomness Number Index", i).Msg("Randomness Fulfillment retrieved from Consumer contract")` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.GetConfig("Smoke", testconfig.OCR2)` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.WillUseRemoteRunner()` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.MustReplaceSimulatedNetworkUrlWithK8(l, testNetwork, *testEnvironment)` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.GetChainClientWithConfigFunction(config, testNetwork, actions_seth.OneEphemeralKeysLiveTestnetCheckFn)` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.ConnectChainlinkNodes(testEnvironment)` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.ChainlinkNodeAddresses(chainlinkNodes)` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.Cleanup(func() { err := actions_seth.TeardownSuite(t, chainClient, testEnvironment, chainlinkNodes, nil, zapcore.ErrorLevel, &config) require.NoError(t, err, "Error tearing down environment") })` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.TeardownSuite(t, chainClient, testEnvironment, chainlinkNodes, nil, zapcore.ErrorLevel, &config)` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.DeployLinkTokenContract(l, chainClient)` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.DeployMockETHLINKFeed(chainClient, ocr2vrf_constants.LinkEthFeedResponse)` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.SetupOCR2VRFUniverse( t, linkToken, mockETHLinkFeed, chainClient, nodeAddresses, chainlinkNodes, testNetwork, )` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.RequestAndRedeemRandomness( t, consumerContract, vrfBeaconContract, ocr2vrf_constants.NumberOfRandomWordsToRequest, subID, ocr2vrf_constants.ConfirmationDelay, ocr2vrf_constants.RandomnessRedeemTransmissionEventTimeout, )` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.GetRandomnessByRequestId(testcontext.Get(t), requestID, big.NewInt(int64(i)))` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.Get(t)` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.NewInt(int64(i))` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.Info()` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.Interface("Random Number", randomness)` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.Interface("Randomness Number Index", i)` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.Msg("Randomness retrieved from Consumer contract")` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.GetConfig("Smoke", testconfig.OCR2)` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.WillUseRemoteRunner()` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.MustReplaceSimulatedNetworkUrlWithK8(l, testNetwork, *testEnvironment)` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.GetChainClientWithConfigFunction(config, testNetwork, actions_seth.OneEphemeralKeysLiveTestnetCheckFn)` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.ConnectChainlinkNodes(testEnvironment)` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.ChainlinkNodeAddresses(chainlinkNodes)` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.Cleanup(func() { err := actions_seth.TeardownSuite(t, chainClient, testEnvironment, chainlinkNodes, nil, zapcore.ErrorLevel, &config) require.NoError(t, err, "Error tearing down environment") })` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.TeardownSuite(t, chainClient, testEnvironment, chainlinkNodes, nil, zapcore.ErrorLevel, &config)` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.DeployLinkTokenContract(l, chainClient)` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.DeployMockETHLINKFeed(chainClient, ocr2vrf_constants.LinkEthFeedResponse)` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.SetupOCR2VRFUniverse( t, linkToken, mockETHLinkFeed, chainClient, nodeAddresses, chainlinkNodes, testNetwork, )` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.RequestRandomnessFulfillmentAndWaitForFulfilment( t, consumerContract, vrfBeaconContract, ocr2vrf_constants.NumberOfRandomWordsToRequest, subID, ocr2vrf_constants.ConfirmationDelay, ocr2vrf_constants.RandomnessFulfilmentTransmissionEventTimeout, )` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.GetRandomnessByRequestId(testcontext.Get(t), requestID, big.NewInt(int64(i)))` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.Get(t)` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.NewInt(int64(i))` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.Info()` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.Interface("Random Number", randomness)` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.Interface("Randomness Number Index", i)` $DIR/integration-tests/smoke/ocr2vrf_test.go: `.Msg("Randomness Fulfillment retrieved from Consumer contract")` $DIR/integration-tests/smoke/ocr_test.go: `err = actions_seth.WatchNewOCRRound(l, sethClient, 2, contracts.V1OffChainAgrregatorToOffChainAggregatorWithRounds(ocrInstances), time.Duration(3*time.Minute))` $DIR/integration-tests/smoke/ocr_test.go: `err = actions_seth.WatchNewOCRRound(l, sethClient, 2, contracts.V1OffChainAgrregatorToOffChainAggregatorWithRounds(ocrInstances), time.Duration(3*time.Minute))` $DIR/integration-tests/smoke/ocr_test.go: `err = actions.DeleteJobs(nodeClients)` $DIR/integration-tests/smoke/ocr_test.go: `err = actions.DeleteBridges(nodeClients)` $DIR/integration-tests/smoke/ocr_test.go: `err = actions.CreateOCRJobsLocal(ocrInstances, bootstrapNode, workerNodes, 5, env.MockAdapter, big.NewInt(sethClient.ChainID))` $DIR/integration-tests/smoke/ocr_test.go: `err = actions_seth.WatchNewOCRRound(l, sethClient, 1, contracts.V1OffChainAgrregatorToOffChainAggregatorWithRounds(ocrInstances), time.Duration(3*time.Minute))` $DIR/integration-tests/smoke/ocr_test.go: `answer, err = ocrInstances[0].GetLatestAnswer(testcontext.Get(t))` $DIR/integration-tests/smoke/ocr_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/ocr_test.go: `.ClCluster.NodeAPIs()` $DIR/integration-tests/smoke/ocr_test.go: `.SetAllAdapterResponsesToTheSameValueLocal(10, ocrInstances, workerNodes, env.MockAdapter)` $DIR/integration-tests/smoke/ocr_test.go: `.WatchNewOCRRound(l, sethClient, 2, contracts.V1OffChainAgrregatorToOffChainAggregatorWithRounds(ocrInstances), time.Duration(3*time.Minute))` $DIR/integration-tests/smoke/ocr_test.go: `.V1OffChainAgrregatorToOffChainAggregatorWithRounds(ocrInstances)` $DIR/integration-tests/smoke/ocr_test.go: `.Duration(3*time.Minute)` $DIR/integration-tests/smoke/ocr_test.go: `.GetLatestAnswer(testcontext.Get(t))` $DIR/integration-tests/smoke/ocr_test.go: `.Get(t)` $DIR/integration-tests/smoke/ocr_test.go: `.Int64()` $DIR/integration-tests/smoke/ocr_test.go: `.Int64()` $DIR/integration-tests/smoke/ocr_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/ocr_test.go: `.ClCluster.NodeAPIs()` $DIR/integration-tests/smoke/ocr_test.go: `.SetAllAdapterResponsesToTheSameValueLocal(10, ocrInstances, workerNodes, env.MockAdapter)` $DIR/integration-tests/smoke/ocr_test.go: `.WatchNewOCRRound(l, sethClient, 2, contracts.V1OffChainAgrregatorToOffChainAggregatorWithRounds(ocrInstances), time.Duration(3*time.Minute))` $DIR/integration-tests/smoke/ocr_test.go: `.V1OffChainAgrregatorToOffChainAggregatorWithRounds(ocrInstances)` $DIR/integration-tests/smoke/ocr_test.go: `.Duration(3*time.Minute)` $DIR/integration-tests/smoke/ocr_test.go: `.GetLatestAnswer(testcontext.Get(t))` $DIR/integration-tests/smoke/ocr_test.go: `.Get(t)` $DIR/integration-tests/smoke/ocr_test.go: `.DeleteJobs(nodeClients)` $DIR/integration-tests/smoke/ocr_test.go: `.DeleteBridges(nodeClients)` $DIR/integration-tests/smoke/ocr_test.go: `.CreateOCRJobsLocal(ocrInstances, bootstrapNode, workerNodes, 5, env.MockAdapter, big.NewInt(sethClient.ChainID))` $DIR/integration-tests/smoke/ocr_test.go: `.NewInt(sethClient.ChainID)` $DIR/integration-tests/smoke/ocr_test.go: `.WatchNewOCRRound(l, sethClient, 1, contracts.V1OffChainAgrregatorToOffChainAggregatorWithRounds(ocrInstances), time.Duration(3*time.Minute))` $DIR/integration-tests/smoke/ocr_test.go: `.V1OffChainAgrregatorToOffChainAggregatorWithRounds(ocrInstances)` $DIR/integration-tests/smoke/ocr_test.go: `.Duration(3*time.Minute)` $DIR/integration-tests/smoke/ocr_test.go: `.GetLatestAnswer(testcontext.Get(t))` $DIR/integration-tests/smoke/ocr_test.go: `.Get(t)` $DIR/integration-tests/smoke/ocr_test.go: `.Int64()` $DIR/integration-tests/smoke/ocr_test.go: `.Int64()` $DIR/integration-tests/smoke/runlog_test.go: `err = lt.Transfer(consumer.Address(), big.NewInt(2e18))` $DIR/integration-tests/smoke/runlog_test.go: `err = env.MockAdapter.SetAdapterBasedIntValuePath("/variable", []string{http.MethodPost}, 5)` $DIR/integration-tests/smoke/runlog_test.go: `err = env.ClCluster.Nodes[0].API.MustCreateBridge(&bta)` $DIR/integration-tests/smoke/runlog_test.go: `_, err = env.ClCluster.Nodes[0].API.MustCreateJob(&client.DirectRequestJobSpec{ Name: fmt.Sprintf("direct-request-%s", uuid.NewString()), MinIncomingConfirmations: "1", ContractAddress: oracle.Address(), EVMChainID: fmt.Sprint(sethClient.ChainID), ExternalJobID: jobUUID.String(), ObservationSource: ost, })` $DIR/integration-tests/smoke/runlog_test.go: `copy(jobID[:], jobUUIDReplaces)` $DIR/integration-tests/smoke/runlog_test.go: `err = consumer.CreateRequestTo( oracle.Address(), jobID, big.NewInt(1e18), fmt.Sprintf("%s/variable", env.MockAdapter.InternalEndpoint), "data,result", big.NewInt(100), )` $DIR/integration-tests/smoke/runlog_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Getting data from consumer contract shouldn't fail")` $DIR/integration-tests/smoke/runlog_test.go: `g.Expect(d).ShouldNot(gomega.BeNil(), "Expected the initial on chain data to be nil")` $DIR/integration-tests/smoke/runlog_test.go: `l.Debug().Int64("Data", d.Int64()).Msg("Found on chain")` $DIR/integration-tests/smoke/runlog_test.go: `g.Expect(d.Int64()).Should(gomega.BeNumerically("==", 5), "Expected the on-chain data to be 5, but found %d", d.Int64())` $DIR/integration-tests/smoke/runlog_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/runlog_test.go: `.GetConfig("Smoke", tc.RunLog)` $DIR/integration-tests/smoke/runlog_test.go: `.EthereumNetworkConfigFromConfig(l, &config)` $DIR/integration-tests/smoke/runlog_test.go: `.NewCLTestEnvBuilder()` $DIR/integration-tests/smoke/runlog_test.go: `. WithTestInstance(t)` $DIR/integration-tests/smoke/runlog_test.go: `. WithTestConfig(&config)` $DIR/integration-tests/smoke/runlog_test.go: `. WithPrivateEthereumNetwork(privateNetwork.EthereumNetworkConfig)` $DIR/integration-tests/smoke/runlog_test.go: `. WithMockAdapter()` $DIR/integration-tests/smoke/runlog_test.go: `. WithCLNodes(1)` $DIR/integration-tests/smoke/runlog_test.go: `. WithFunding(big.NewFloat(*config.Common.ChainlinkNodeFunding))` $DIR/integration-tests/smoke/runlog_test.go: `.NewFloat(*config.Common.ChainlinkNodeFunding)` $DIR/integration-tests/smoke/runlog_test.go: `. WithStandardCleanup()` $DIR/integration-tests/smoke/runlog_test.go: `. WithSeth()` $DIR/integration-tests/smoke/runlog_test.go: `. Build()` $DIR/integration-tests/smoke/runlog_test.go: `.MustGetSelectedNetworkConfig(config.GetNetworkConfig())` $DIR/integration-tests/smoke/runlog_test.go: `.GetNetworkConfig()` $DIR/integration-tests/smoke/runlog_test.go: `.GetSethClient(network.ChainID)` $DIR/integration-tests/smoke/runlog_test.go: `.DeployLinkTokenContract(l, sethClient)` $DIR/integration-tests/smoke/runlog_test.go: `.DeployOracle(sethClient, lt.Address())` $DIR/integration-tests/smoke/runlog_test.go: `.Address()` $DIR/integration-tests/smoke/runlog_test.go: `.DeployAPIConsumer(sethClient, lt.Address())` $DIR/integration-tests/smoke/runlog_test.go: `.Address()` $DIR/integration-tests/smoke/runlog_test.go: `.Transfer(consumer.Address(), big.NewInt(2e18))` $DIR/integration-tests/smoke/runlog_test.go: `.Address()` $DIR/integration-tests/smoke/runlog_test.go: `.NewInt(2e18)` $DIR/integration-tests/smoke/runlog_test.go: `.MockAdapter.SetAdapterBasedIntValuePath("/variable", []string{http.MethodPost}, 5)` $DIR/integration-tests/smoke/runlog_test.go: `.New()` $DIR/integration-tests/smoke/runlog_test.go: `.Sprintf("five-%s", jobUUID.String())` $DIR/integration-tests/smoke/runlog_test.go: `.String()` $DIR/integration-tests/smoke/runlog_test.go: `.Sprintf("%s/variable", env.MockAdapter.InternalEndpoint)` $DIR/integration-tests/smoke/runlog_test.go: `.API.MustCreateBridge(&bta)` $DIR/integration-tests/smoke/runlog_test.go: `.String()` $DIR/integration-tests/smoke/runlog_test.go: `.API.MustCreateJob(&client.DirectRequestJobSpec{ Name: fmt.Sprintf("direct-request-%s", uuid.NewString()), MinIncomingConfirmations: "1", ContractAddress: oracle.Address(), EVMChainID: fmt.Sprint(sethClient.ChainID), ExternalJobID: jobUUID.String(), ObservationSource: ost, })` $DIR/integration-tests/smoke/runlog_test.go: `.Sprintf("direct-request-%s", uuid.NewString())` $DIR/integration-tests/smoke/runlog_test.go: `.NewString()` $DIR/integration-tests/smoke/runlog_test.go: `.Address()` $DIR/integration-tests/smoke/runlog_test.go: `.Sprint(sethClient.ChainID)` $DIR/integration-tests/smoke/runlog_test.go: `.String()` $DIR/integration-tests/smoke/runlog_test.go: `.Replace(jobUUID.String(), "-", "", 4)` $DIR/integration-tests/smoke/runlog_test.go: `.String()` $DIR/integration-tests/smoke/runlog_test.go: `.CreateRequestTo( oracle.Address(), jobID, big.NewInt(1e18), fmt.Sprintf("%s/variable", env.MockAdapter.InternalEndpoint), "data,result", big.NewInt(100), )` $DIR/integration-tests/smoke/runlog_test.go: `.Address()` $DIR/integration-tests/smoke/runlog_test.go: `.NewInt(1e18)` $DIR/integration-tests/smoke/runlog_test.go: `.Sprintf("%s/variable", env.MockAdapter.InternalEndpoint)` $DIR/integration-tests/smoke/runlog_test.go: `.NewInt(100)` $DIR/integration-tests/smoke/runlog_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/runlog_test.go: `.Eventually(func(g gomega.Gomega) { d, err := consumer.Data(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Getting data from consumer contract shouldn't fail") g.Expect(d).ShouldNot(gomega.BeNil(), "Expected the initial on chain data to be nil") l.Debug().Int64("Data", d.Int64()).Msg("Found on chain") g.Expect(d.Int64()).Should(gomega.BeNumerically("==", 5), "Expected the on-chain data to be 5, but found %d", d.Int64()) }, "2m", "1s")` $DIR/integration-tests/smoke/runlog_test.go: `.Data(testcontext.Get(t))` $DIR/integration-tests/smoke/runlog_test.go: `.Get(t)` $DIR/integration-tests/smoke/runlog_test.go: `.Expect(err)` $DIR/integration-tests/smoke/runlog_test.go: `.ShouldNot(gomega.HaveOccurred(), "Getting data from consumer contract shouldn't fail")` $DIR/integration-tests/smoke/runlog_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/runlog_test.go: `.Expect(d)` $DIR/integration-tests/smoke/runlog_test.go: `.ShouldNot(gomega.BeNil(), "Expected the initial on chain data to be nil")` $DIR/integration-tests/smoke/runlog_test.go: `.BeNil()` $DIR/integration-tests/smoke/runlog_test.go: `.Debug()` $DIR/integration-tests/smoke/runlog_test.go: `.Int64("Data", d.Int64())` $DIR/integration-tests/smoke/runlog_test.go: `.Int64()` $DIR/integration-tests/smoke/runlog_test.go: `.Msg("Found on chain")` $DIR/integration-tests/smoke/runlog_test.go: `.Expect(d.Int64())` $DIR/integration-tests/smoke/runlog_test.go: `.Int64()` $DIR/integration-tests/smoke/runlog_test.go: `.Should(gomega.BeNumerically("==", 5), "Expected the on-chain data to be 5, but found %d", d.Int64())` $DIR/integration-tests/smoke/runlog_test.go: `.BeNumerically("==", 5)` $DIR/integration-tests/smoke/runlog_test.go: `.Int64()` $DIR/integration-tests/smoke/runlog_test.go: `.Succeed()` $DIR/integration-tests/smoke/vrf_test.go: `l.Debug().Interface("Key JSON", nodeKey).Msg("Created proving key")` $DIR/integration-tests/smoke/vrf_test.go: `err = contracts.Coordinator.RegisterProvingKey( big.NewInt(1), oracleAddr, provingKey, actions.EncodeOnChainExternalJobID(jobUUID), )` $DIR/integration-tests/smoke/vrf_test.go: `encodedProvingKeys = append(encodedProvingKeys, provingKey)` $DIR/integration-tests/smoke/vrf_test.go: `err = contracts.Consumer.RequestRandomness(requestHash, big.NewInt(1))` $DIR/integration-tests/smoke/vrf_test.go: `gom.Eventually(func(g gomega.Gomega) { jobRuns, err := env.ClCluster.Nodes[0].API.MustReadRunsByJob(job.Data.ID) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Job execution shouldn't fail") out, err := contracts.Consumer.RandomnessOutput(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Getting the randomness output of the consumer shouldn't fail") // Checks that the job has actually run g.Expect(len(jobRuns.Data)).Should(gomega.BeNumerically(">=", 1), fmt.Sprintf("Expected the VRF job to run once or more after %s", timeout)) // TODO: This is an imperfect check, given it's a random number, it CAN be 0, but chances are unlikely. // So we're just checking that the answer has changed to something other than the default (0) // There's a better formula to ensure that VRF response is as expected, detailed under Technical Walkthrough. // https://bl.chain.link/chainlink-vrf-on-chain-verifiable-randomness/ g.Expect(out.Uint64()).ShouldNot(gomega.BeNumerically("==", 0), "Expected the VRF job give an answer other than 0") l.Debug().Uint64("Output", out.Uint64()).Msg("Randomness fulfilled") }, timeout, "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/vrf_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Job execution shouldn't fail")` $DIR/integration-tests/smoke/vrf_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Getting the randomness output of the consumer shouldn't fail")` $DIR/integration-tests/smoke/vrf_test.go: `g.Expect(len(jobRuns.Data)).Should(gomega.BeNumerically(">=", 1), fmt.Sprintf("Expected the VRF job to run once or more after %s", timeout))` $DIR/integration-tests/smoke/vrf_test.go: `g.Expect(out.Uint64()).ShouldNot(gomega.BeNumerically("==", 0), "Expected the VRF job give an answer other than 0")` $DIR/integration-tests/smoke/vrf_test.go: `l.Debug().Uint64("Output", out.Uint64()).Msg("Randomness fulfilled")` $DIR/integration-tests/smoke/vrf_test.go: `l.Debug().Interface("Key JSON", nodeKey).Msg("Created proving key")` $DIR/integration-tests/smoke/vrf_test.go: `err = contracts.Coordinator.RegisterProvingKey( big.NewInt(1), oracleAddr, provingKey, actions.EncodeOnChainExternalJobID(jobUUID), )` $DIR/integration-tests/smoke/vrf_test.go: `encodedProvingKeys = append(encodedProvingKeys, provingKey)` $DIR/integration-tests/smoke/vrf_test.go: `err = contracts.Consumer.RequestRandomness(requestHash, big.NewInt(1))` $DIR/integration-tests/smoke/vrf_test.go: `gom.Eventually(func(g gomega.Gomega) { jobRuns, err := env.ClCluster.Nodes[0].API.MustReadRunsByJob(job.Data.ID) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Job execution shouldn't fail") out, err := contracts.Consumer.RandomnessOutput(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Getting the randomness output of the consumer shouldn't fail") // Checks that the job has actually run g.Expect(len(jobRuns.Data)).Should(gomega.BeNumerically(">=", 1), fmt.Sprintf("Expected the VRF job to run once or more after %s", timeout)) g.Expect(out.Uint64()).ShouldNot(gomega.BeNumerically("==", 0), "Expected the VRF job give an answer other than 0") l.Debug().Uint64("Output", out.Uint64()).Msg("Randomness fulfilled") }, timeout, "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/vrf_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Job execution shouldn't fail")` $DIR/integration-tests/smoke/vrf_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Getting the randomness output of the consumer shouldn't fail")` $DIR/integration-tests/smoke/vrf_test.go: `g.Expect(len(jobRuns.Data)).Should(gomega.BeNumerically(">=", 1), fmt.Sprintf("Expected the VRF job to run once or more after %s", timeout))` $DIR/integration-tests/smoke/vrf_test.go: `g.Expect(out.Uint64()).ShouldNot(gomega.BeNumerically("==", 0), "Expected the VRF job give an answer other than 0")` $DIR/integration-tests/smoke/vrf_test.go: `l.Debug().Uint64("Output", out.Uint64()).Msg("Randomness fulfilled")` $DIR/integration-tests/smoke/vrf_test.go: `err = n.API.MustDeleteJob(job.Data.ID)` $DIR/integration-tests/smoke/vrf_test.go: `job, err = n.API.MustCreateJob(&client.VRFJobSpec{ Name: fmt.Sprintf("vrf-%s", jobUUID), CoordinatorAddress: contracts.Coordinator.Address(), MinIncomingConfirmations: 1, PublicKey: pubKeyCompressed, ExternalJobID: jobUUID.String(), EVMChainID: fmt.Sprint(sethClient.ChainID), ObservationSource: ost, })` $DIR/integration-tests/smoke/vrf_test.go: `gom.Eventually(func(g gomega.Gomega) { jobRuns, err := env.ClCluster.Nodes[0].API.MustReadRunsByJob(job.Data.ID) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Job execution shouldn't fail") out, err := contracts.Consumer.RandomnessOutput(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Getting the randomness output of the consumer shouldn't fail") // Checks that the job has actually run g.Expect(len(jobRuns.Data)).Should(gomega.BeNumerically(">=", 1), fmt.Sprintf("Expected the VRF job to run once or more after %s", timeout)) g.Expect(out.Uint64()).ShouldNot(gomega.BeNumerically("==", 0), "Expected the VRF job give an answer other than 0") l.Debug().Uint64("Output", out.Uint64()).Msg("Randomness fulfilled") }, timeout, "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/vrf_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Job execution shouldn't fail")` $DIR/integration-tests/smoke/vrf_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Getting the randomness output of the consumer shouldn't fail")` $DIR/integration-tests/smoke/vrf_test.go: `g.Expect(len(jobRuns.Data)).Should(gomega.BeNumerically(">=", 1), fmt.Sprintf("Expected the VRF job to run once or more after %s", timeout))` $DIR/integration-tests/smoke/vrf_test.go: `g.Expect(out.Uint64()).ShouldNot(gomega.BeNumerically("==", 0), "Expected the VRF job give an answer other than 0")` $DIR/integration-tests/smoke/vrf_test.go: `l.Debug().Uint64("Output", out.Uint64()).Msg("Randomness fulfilled")` $DIR/integration-tests/smoke/vrf_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/vrf_test.go: `.API.MustCreateVRFKey()` $DIR/integration-tests/smoke/vrf_test.go: `.Debug()` $DIR/integration-tests/smoke/vrf_test.go: `.Interface("Key JSON", nodeKey)` $DIR/integration-tests/smoke/vrf_test.go: `.Msg("Created proving key")` $DIR/integration-tests/smoke/vrf_test.go: `.New()` $DIR/integration-tests/smoke/vrf_test.go: `.Coordinator.Address()` $DIR/integration-tests/smoke/vrf_test.go: `.String()` $DIR/integration-tests/smoke/vrf_test.go: `.API.MustCreateJob(&client.VRFJobSpec{ Name: fmt.Sprintf("vrf-%s", jobUUID), CoordinatorAddress: contracts.Coordinator.Address(), MinIncomingConfirmations: 1, PublicKey: pubKeyCompressed, ExternalJobID: jobUUID.String(), EVMChainID: fmt.Sprint(sethClient.ChainID), ObservationSource: ost, })` $DIR/integration-tests/smoke/vrf_test.go: `.Sprintf("vrf-%s", jobUUID)` $DIR/integration-tests/smoke/vrf_test.go: `.Coordinator.Address()` $DIR/integration-tests/smoke/vrf_test.go: `.String()` $DIR/integration-tests/smoke/vrf_test.go: `.Sprint(sethClient.ChainID)` $DIR/integration-tests/smoke/vrf_test.go: `.API.PrimaryEthAddress()` $DIR/integration-tests/smoke/vrf_test.go: `.EncodeOnChainVRFProvingKey(*nodeKey)` $DIR/integration-tests/smoke/vrf_test.go: `.Coordinator.RegisterProvingKey( big.NewInt(1), oracleAddr, provingKey, actions.EncodeOnChainExternalJobID(jobUUID), )` $DIR/integration-tests/smoke/vrf_test.go: `.NewInt(1)` $DIR/integration-tests/smoke/vrf_test.go: `.EncodeOnChainExternalJobID(jobUUID)` $DIR/integration-tests/smoke/vrf_test.go: `.Coordinator.HashOfKey(testcontext.Get(t), encodedProvingKeys[0])` $DIR/integration-tests/smoke/vrf_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrf_test.go: `.Consumer.RequestRandomness(requestHash, big.NewInt(1))` $DIR/integration-tests/smoke/vrf_test.go: `.NewInt(1)` $DIR/integration-tests/smoke/vrf_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/vrf_test.go: `.Eventually(func(g gomega.Gomega) { jobRuns, err := env.ClCluster.Nodes[0].API.MustReadRunsByJob(job.Data.ID) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Job execution shouldn't fail") out, err := contracts.Consumer.RandomnessOutput(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Getting the randomness output of the consumer shouldn't fail") // Checks that the job has actually run g.Expect(len(jobRuns.Data)).Should(gomega.BeNumerically(">=", 1), fmt.Sprintf("Expected the VRF job to run once or more after %s", timeout)) // TODO: This is an imperfect check, given it's a random number, it CAN be 0, but chances are unlikely. // So we're just checking that the answer has changed to something other than the default (0) // There's a better formula to ensure that VRF response is as expected, detailed under Technical Walkthrough. // https://bl.chain.link/chainlink-vrf-on-chain-verifiable-randomness/ g.Expect(out.Uint64()).ShouldNot(gomega.BeNumerically("==", 0), "Expected the VRF job give an answer other than 0") l.Debug().Uint64("Output", out.Uint64()).Msg("Randomness fulfilled") }, timeout, "1s")` $DIR/integration-tests/smoke/vrf_test.go: `.API.MustReadRunsByJob(job.Data.ID)` $DIR/integration-tests/smoke/vrf_test.go: `.Expect(err)` $DIR/integration-tests/smoke/vrf_test.go: `.ShouldNot(gomega.HaveOccurred(), "Job execution shouldn't fail")` $DIR/integration-tests/smoke/vrf_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/vrf_test.go: `.Consumer.RandomnessOutput(testcontext.Get(t))` $DIR/integration-tests/smoke/vrf_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrf_test.go: `.Expect(err)` $DIR/integration-tests/smoke/vrf_test.go: `.ShouldNot(gomega.HaveOccurred(), "Getting the randomness output of the consumer shouldn't fail")` $DIR/integration-tests/smoke/vrf_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/vrf_test.go: `.Expect(len(jobRuns.Data))` $DIR/integration-tests/smoke/vrf_test.go: `.Should(gomega.BeNumerically(">=", 1), fmt.Sprintf("Expected the VRF job to run once or more after %s", timeout))` $DIR/integration-tests/smoke/vrf_test.go: `.BeNumerically(">=", 1)` $DIR/integration-tests/smoke/vrf_test.go: `.Sprintf("Expected the VRF job to run once or more after %s", timeout)` $DIR/integration-tests/smoke/vrf_test.go: `.Expect(out.Uint64())` $DIR/integration-tests/smoke/vrf_test.go: `.Uint64()` $DIR/integration-tests/smoke/vrf_test.go: `.ShouldNot(gomega.BeNumerically("==", 0), "Expected the VRF job give an answer other than 0")` $DIR/integration-tests/smoke/vrf_test.go: `.BeNumerically("==", 0)` $DIR/integration-tests/smoke/vrf_test.go: `.Debug()` $DIR/integration-tests/smoke/vrf_test.go: `.Uint64("Output", out.Uint64())` $DIR/integration-tests/smoke/vrf_test.go: `.Uint64()` $DIR/integration-tests/smoke/vrf_test.go: `.Msg("Randomness fulfilled")` $DIR/integration-tests/smoke/vrf_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/vrf_test.go: `.Succeed()` $DIR/integration-tests/smoke/vrf_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/vrf_test.go: `.API.MustCreateVRFKey()` $DIR/integration-tests/smoke/vrf_test.go: `.Debug()` $DIR/integration-tests/smoke/vrf_test.go: `.Interface("Key JSON", nodeKey)` $DIR/integration-tests/smoke/vrf_test.go: `.Msg("Created proving key")` $DIR/integration-tests/smoke/vrf_test.go: `.New()` $DIR/integration-tests/smoke/vrf_test.go: `.Coordinator.Address()` $DIR/integration-tests/smoke/vrf_test.go: `.String()` $DIR/integration-tests/smoke/vrf_test.go: `.API.MustCreateJob(&client.VRFJobSpec{ Name: fmt.Sprintf("vrf-%s", jobUUID), CoordinatorAddress: contracts.Coordinator.Address(), MinIncomingConfirmations: 1, PublicKey: pubKeyCompressed, ExternalJobID: jobUUID.String(), EVMChainID: fmt.Sprint(sethClient.ChainID), ObservationSource: ost, })` $DIR/integration-tests/smoke/vrf_test.go: `.Sprintf("vrf-%s", jobUUID)` $DIR/integration-tests/smoke/vrf_test.go: `.Coordinator.Address()` $DIR/integration-tests/smoke/vrf_test.go: `.String()` $DIR/integration-tests/smoke/vrf_test.go: `.Sprint(sethClient.ChainID)` $DIR/integration-tests/smoke/vrf_test.go: `.API.PrimaryEthAddress()` $DIR/integration-tests/smoke/vrf_test.go: `.EncodeOnChainVRFProvingKey(*nodeKey)` $DIR/integration-tests/smoke/vrf_test.go: `.Coordinator.RegisterProvingKey( big.NewInt(1), oracleAddr, provingKey, actions.EncodeOnChainExternalJobID(jobUUID), )` $DIR/integration-tests/smoke/vrf_test.go: `.NewInt(1)` $DIR/integration-tests/smoke/vrf_test.go: `.EncodeOnChainExternalJobID(jobUUID)` $DIR/integration-tests/smoke/vrf_test.go: `.Coordinator.HashOfKey(testcontext.Get(t), encodedProvingKeys[0])` $DIR/integration-tests/smoke/vrf_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrf_test.go: `.Consumer.RequestRandomness(requestHash, big.NewInt(1))` $DIR/integration-tests/smoke/vrf_test.go: `.NewInt(1)` $DIR/integration-tests/smoke/vrf_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/vrf_test.go: `.Eventually(func(g gomega.Gomega) { jobRuns, err := env.ClCluster.Nodes[0].API.MustReadRunsByJob(job.Data.ID) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Job execution shouldn't fail") out, err := contracts.Consumer.RandomnessOutput(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Getting the randomness output of the consumer shouldn't fail") // Checks that the job has actually run g.Expect(len(jobRuns.Data)).Should(gomega.BeNumerically(">=", 1), fmt.Sprintf("Expected the VRF job to run once or more after %s", timeout)) g.Expect(out.Uint64()).ShouldNot(gomega.BeNumerically("==", 0), "Expected the VRF job give an answer other than 0") l.Debug().Uint64("Output", out.Uint64()).Msg("Randomness fulfilled") }, timeout, "1s")` $DIR/integration-tests/smoke/vrf_test.go: `.API.MustReadRunsByJob(job.Data.ID)` $DIR/integration-tests/smoke/vrf_test.go: `.Expect(err)` $DIR/integration-tests/smoke/vrf_test.go: `.ShouldNot(gomega.HaveOccurred(), "Job execution shouldn't fail")` $DIR/integration-tests/smoke/vrf_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/vrf_test.go: `.Consumer.RandomnessOutput(testcontext.Get(t))` $DIR/integration-tests/smoke/vrf_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrf_test.go: `.Expect(err)` $DIR/integration-tests/smoke/vrf_test.go: `.ShouldNot(gomega.HaveOccurred(), "Getting the randomness output of the consumer shouldn't fail")` $DIR/integration-tests/smoke/vrf_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/vrf_test.go: `.Expect(len(jobRuns.Data))` $DIR/integration-tests/smoke/vrf_test.go: `.Should(gomega.BeNumerically(">=", 1), fmt.Sprintf("Expected the VRF job to run once or more after %s", timeout))` $DIR/integration-tests/smoke/vrf_test.go: `.BeNumerically(">=", 1)` $DIR/integration-tests/smoke/vrf_test.go: `.Sprintf("Expected the VRF job to run once or more after %s", timeout)` $DIR/integration-tests/smoke/vrf_test.go: `.Expect(out.Uint64())` $DIR/integration-tests/smoke/vrf_test.go: `.Uint64()` $DIR/integration-tests/smoke/vrf_test.go: `.ShouldNot(gomega.BeNumerically("==", 0), "Expected the VRF job give an answer other than 0")` $DIR/integration-tests/smoke/vrf_test.go: `.BeNumerically("==", 0)` $DIR/integration-tests/smoke/vrf_test.go: `.Debug()` $DIR/integration-tests/smoke/vrf_test.go: `.Uint64("Output", out.Uint64())` $DIR/integration-tests/smoke/vrf_test.go: `.Uint64()` $DIR/integration-tests/smoke/vrf_test.go: `.Msg("Randomness fulfilled")` $DIR/integration-tests/smoke/vrf_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/vrf_test.go: `.Succeed()` $DIR/integration-tests/smoke/vrf_test.go: `.API.MustDeleteJob(job.Data.ID)` $DIR/integration-tests/smoke/vrf_test.go: `.API.MustCreateJob(&client.VRFJobSpec{ Name: fmt.Sprintf("vrf-%s", jobUUID), CoordinatorAddress: contracts.Coordinator.Address(), MinIncomingConfirmations: 1, PublicKey: pubKeyCompressed, ExternalJobID: jobUUID.String(), EVMChainID: fmt.Sprint(sethClient.ChainID), ObservationSource: ost, })` $DIR/integration-tests/smoke/vrf_test.go: `.Sprintf("vrf-%s", jobUUID)` $DIR/integration-tests/smoke/vrf_test.go: `.Coordinator.Address()` $DIR/integration-tests/smoke/vrf_test.go: `.String()` $DIR/integration-tests/smoke/vrf_test.go: `.Sprint(sethClient.ChainID)` $DIR/integration-tests/smoke/vrf_test.go: `.Eventually(func(g gomega.Gomega) { jobRuns, err := env.ClCluster.Nodes[0].API.MustReadRunsByJob(job.Data.ID) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Job execution shouldn't fail") out, err := contracts.Consumer.RandomnessOutput(testcontext.Get(t)) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "Getting the randomness output of the consumer shouldn't fail") // Checks that the job has actually run g.Expect(len(jobRuns.Data)).Should(gomega.BeNumerically(">=", 1), fmt.Sprintf("Expected the VRF job to run once or more after %s", timeout)) g.Expect(out.Uint64()).ShouldNot(gomega.BeNumerically("==", 0), "Expected the VRF job give an answer other than 0") l.Debug().Uint64("Output", out.Uint64()).Msg("Randomness fulfilled") }, timeout, "1s")` $DIR/integration-tests/smoke/vrf_test.go: `.API.MustReadRunsByJob(job.Data.ID)` $DIR/integration-tests/smoke/vrf_test.go: `.Expect(err)` $DIR/integration-tests/smoke/vrf_test.go: `.ShouldNot(gomega.HaveOccurred(), "Job execution shouldn't fail")` $DIR/integration-tests/smoke/vrf_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/vrf_test.go: `.Consumer.RandomnessOutput(testcontext.Get(t))` $DIR/integration-tests/smoke/vrf_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrf_test.go: `.Expect(err)` $DIR/integration-tests/smoke/vrf_test.go: `.ShouldNot(gomega.HaveOccurred(), "Getting the randomness output of the consumer shouldn't fail")` $DIR/integration-tests/smoke/vrf_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/vrf_test.go: `.Expect(len(jobRuns.Data))` $DIR/integration-tests/smoke/vrf_test.go: `.Should(gomega.BeNumerically(">=", 1), fmt.Sprintf("Expected the VRF job to run once or more after %s", timeout))` $DIR/integration-tests/smoke/vrf_test.go: `.BeNumerically(">=", 1)` $DIR/integration-tests/smoke/vrf_test.go: `.Sprintf("Expected the VRF job to run once or more after %s", timeout)` $DIR/integration-tests/smoke/vrf_test.go: `.Expect(out.Uint64())` $DIR/integration-tests/smoke/vrf_test.go: `.Uint64()` $DIR/integration-tests/smoke/vrf_test.go: `.ShouldNot(gomega.BeNumerically("==", 0), "Expected the VRF job give an answer other than 0")` $DIR/integration-tests/smoke/vrf_test.go: `.BeNumerically("==", 0)` $DIR/integration-tests/smoke/vrf_test.go: `.Debug()` $DIR/integration-tests/smoke/vrf_test.go: `.Uint64("Output", out.Uint64())` $DIR/integration-tests/smoke/vrf_test.go: `.Uint64()` $DIR/integration-tests/smoke/vrf_test.go: `.Msg("Randomness fulfilled")` $DIR/integration-tests/smoke/vrf_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/vrf_test.go: `.Succeed()` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info(). Str("Network Name", sethClient.Cfg.Network.Name). Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2_test.go: `vrfv2.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2_test.go: `testEnv, vrfContracts, vrfKey, nodeTypeToNodeMap, err = vrfv2.SetupVRFV2Universe(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2_test.go: `t.Run("Request Randomness", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) consumers, subIDsForRequestRandomness, err := vrfv2.SetupNewConsumersAndSubs( testEnv, chainID, vrfContracts.CoordinatorV2, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subIDForRequestRandomness := subIDsForRequestRandomness[0] subscription, err := vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForRequestRandomness) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, strconv.FormatUint(subIDForRequestRandomness, 10), vrfContracts.CoordinatorV2) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDsForRequestRandomness...) subBalanceBeforeRequest := subscription.Balance // test and assert _, randomWordsFulfilledEvent, err := vrfv2.RequestRandomnessAndWaitForFulfillment( l, consumers[0], vrfContracts.CoordinatorV2, subIDForRequestRandomness, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, 0, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") expectedSubBalanceJuels := new(big.Int).Sub(subBalanceBeforeRequest, randomWordsFulfilledEvent.Payment) subscription, err = vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForRequestRandomness) require.NoError(t, err, "error getting subscription information") subBalanceAfterRequest := subscription.Balance require.Equal(t, expectedSubBalanceJuels, subBalanceAfterRequest) status, err := consumers[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId) require.NoError(t, err, "error getting rand request status") require.True(t, status.Fulfilled) l.Info().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status") require.Equal(t, *configCopy.VRFv2.General.NumberOfWords, uint32(len(status.RandomWords))) for _, w := range status.RandomWords { l.Info().Str("Output", w.String()).Msg("Randomness fulfilled") require.Equal(t, 1, w.Cmp(big.NewInt(0)), "Expected the VRF job give an answer bigger than 0") } })` $DIR/integration-tests/smoke/vrfv2_test.go: `vrfcommon.LogSubDetails(l, subscription, strconv.FormatUint(subIDForRequestRandomness, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/smoke/vrfv2_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDsForRequestRandomness...)` $DIR/integration-tests/smoke/vrfv2_test.go: `subscription, err = vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForRequestRandomness)` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status")` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info().Str("Output", w.String()).Msg("Randomness fulfilled")` $DIR/integration-tests/smoke/vrfv2_test.go: `t.Run("VRF Node waits block confirmation number specified by the consumer before sending fulfilment on-chain", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) testConfig := configCopy.VRFv2.General consumers, subIDs, err := vrfv2.SetupNewConsumersAndSubs( testEnv, chainID, vrfContracts.CoordinatorV2, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subID := subIDs[0] subscription, err := vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, strconv.FormatUint(subID, 10), vrfContracts.CoordinatorV2) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...) expectedBlockNumberWait := uint16(10) testConfig.MinimumConfirmations = ptr.Ptr[uint16](expectedBlockNumberWait) randomWordsRequestedEvent, randomWordsFulfilledEvent, err := vrfv2.RequestRandomnessAndWaitForFulfillment( l, consumers[0], vrfContracts.CoordinatorV2, subID, vrfKey, *testConfig.MinimumConfirmations, *testConfig.CallbackGasLimit, *testConfig.NumberOfWords, *testConfig.RandomnessRequestCountPerRequest, *testConfig.RandomnessRequestCountPerRequestDeviation, testConfig.RandomWordsFulfilledEventTimeout.Duration, 0, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") // check that VRF node waited at least the number of blocks specified by the consumer in the rand request min confs field blockNumberWait := randomWordsRequestedEvent.Raw.BlockNumber - randomWordsFulfilledEvent.Raw.BlockNumber require.GreaterOrEqual(t, blockNumberWait, uint64(expectedBlockNumberWait)) status, err := consumers[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId) require.NoError(t, err, "error getting rand request status") require.True(t, status.Fulfilled) l.Info().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status") })` $DIR/integration-tests/smoke/vrfv2_test.go: `vrfcommon.LogSubDetails(l, subscription, strconv.FormatUint(subID, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/smoke/vrfv2_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...)` $DIR/integration-tests/smoke/vrfv2_test.go: `testConfig.MinimumConfirmations = ptr.Ptr[uint16](expectedBlockNumberWait)` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status")` $DIR/integration-tests/smoke/vrfv2_test.go: `t.Run("CL Node VRF Job Runs", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) consumers, subIDsForJobRuns, err := vrfv2.SetupNewConsumersAndSubs( testEnv, chainID, vrfContracts.CoordinatorV2, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subIDForJobRuns := subIDsForJobRuns[0] subscription, err := vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForJobRuns) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, strconv.FormatUint(subIDForJobRuns, 10), vrfContracts.CoordinatorV2) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDsForJobRuns...) jobRunsBeforeTest, err := nodeTypeToNodeMap[vrfcommon.VRF].CLNode.API.MustReadRunsByJob(nodeTypeToNodeMap[vrfcommon.VRF].Job.Data.ID) require.NoError(t, err, "error reading job runs") // test and assert _, _, err = vrfv2.RequestRandomnessAndWaitForFulfillment( l, consumers[0], vrfContracts.CoordinatorV2, subIDForJobRuns, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, 0, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") jobRuns, err := nodeTypeToNodeMap[vrfcommon.VRF].CLNode.API.MustReadRunsByJob(nodeTypeToNodeMap[vrfcommon.VRF].Job.Data.ID) require.NoError(t, err, "error reading job runs") require.Equal(t, len(jobRunsBeforeTest.Data)+1, len(jobRuns.Data)) })` $DIR/integration-tests/smoke/vrfv2_test.go: `vrfcommon.LogSubDetails(l, subscription, strconv.FormatUint(subIDForJobRuns, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/smoke/vrfv2_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDsForJobRuns...)` $DIR/integration-tests/smoke/vrfv2_test.go: `_, _, err = vrfv2.RequestRandomnessAndWaitForFulfillment( l, consumers[0], vrfContracts.CoordinatorV2, subIDForJobRuns, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, 0, )` $DIR/integration-tests/smoke/vrfv2_test.go: `t.Run("Direct Funding", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) wrapperContracts, wrapperSubID, err := vrfv2.SetupVRFV2WrapperEnvironment( testcontext.Get(t), testEnv, chainID, &configCopy, vrfContracts.LinkToken, vrfContracts.MockETHLINKFeed, vrfContracts.CoordinatorV2, vrfKey.KeyHash, 1, ) require.NoError(t, err) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, *wrapperSubID) wrapperConsumer := wrapperContracts.LoadTestConsumers[0] wrapperConsumerJuelsBalanceBeforeRequest, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), wrapperConsumer.Address()) require.NoError(t, err, "Error getting wrapper consumer balance") wrapperSubscription, err := vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), *wrapperSubID) require.NoError(t, err, "Error getting subscription information") subBalanceBeforeRequest := wrapperSubscription.Balance // Request Randomness and wait for fulfillment event randomWordsFulfilledEvent, err := vrfv2.DirectFundingRequestRandomnessAndWaitForFulfillment( l, wrapperConsumer, vrfContracts.CoordinatorV2, *wrapperSubID, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, ) require.NoError(t, err, "Error requesting randomness and waiting for fulfilment") // Check wrapper subscription balance expectedSubBalanceJuels := new(big.Int).Sub(subBalanceBeforeRequest, randomWordsFulfilledEvent.Payment) wrapperSubscription, err = vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), *wrapperSubID) require.NoError(t, err, "Error getting subscription information") subBalanceAfterRequest := wrapperSubscription.Balance require.Equal(t, expectedSubBalanceJuels, subBalanceAfterRequest) // Check status of randomness request within the wrapper consumer contract consumerStatus, err := wrapperConsumer.GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId) require.NoError(t, err, "Error getting randomness request status") require.True(t, consumerStatus.Fulfilled) // Check wrapper consumer LINK balance expectedWrapperConsumerJuelsBalance := new(big.Int).Sub(wrapperConsumerJuelsBalanceBeforeRequest, consumerStatus.Paid) wrapperConsumerJuelsBalanceAfterRequest, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), wrapperConsumer.Address()) require.NoError(t, err, "Error getting wrapper consumer balance") require.Equal(t, expectedWrapperConsumerJuelsBalance, wrapperConsumerJuelsBalanceAfterRequest) // Check random word count require.Equal(t, *configCopy.VRFv2.General.NumberOfWords, uint32(len(consumerStatus.RandomWords))) for _, w := range consumerStatus.RandomWords { l.Info().Str("Output", w.String()).Msg("Randomness fulfilled") require.Equal(t, 1, w.Cmp(big.NewInt(0)), "Expected the VRF job give an answer bigger than 0") } l.Info(). Str("Consumer Balance Before Request (Link)", (*commonassets.Link)(wrapperConsumerJuelsBalanceBeforeRequest).Link()). Str("Consumer Balance After Request (Link)", (*commonassets.Link)(wrapperConsumerJuelsBalanceAfterRequest).Link()). Bool("Fulfilment Status", consumerStatus.Fulfilled). Str("Paid by Consumer Contract (Link)", (*commonassets.Link)(consumerStatus.Paid).Link()). Str("Paid by Coordinator Sub (Link)", (*commonassets.Link)(randomWordsFulfilledEvent.Payment).Link()). Str("RequestTimestamp", consumerStatus.RequestTimestamp.String()). Str("FulfilmentTimestamp", consumerStatus.FulfilmentTimestamp.String()). Str("RequestBlockNumber", consumerStatus.RequestBlockNumber.String()). Str("FulfilmentBlockNumber", consumerStatus.FulfilmentBlockNumber.String()). Str("TX Hash", randomWordsFulfilledEvent.Raw.TxHash.String()). Msg("Random Words Fulfilment Details For Link Billing") })` $DIR/integration-tests/smoke/vrfv2_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, *wrapperSubID)` $DIR/integration-tests/smoke/vrfv2_test.go: `wrapperSubscription, err = vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), *wrapperSubID)` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info().Str("Output", w.String()).Msg("Randomness fulfilled")` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info(). Str("Consumer Balance Before Request (Link)", (*commonassets.Link)(wrapperConsumerJuelsBalanceBeforeRequest).Link()). Str("Consumer Balance After Request (Link)", (*commonassets.Link)(wrapperConsumerJuelsBalanceAfterRequest).Link()). Bool("Fulfilment Status", consumerStatus.Fulfilled). Str("Paid by Consumer Contract (Link)", (*commonassets.Link)(consumerStatus.Paid).Link()). Str("Paid by Coordinator Sub (Link)", (*commonassets.Link)(randomWordsFulfilledEvent.Payment).Link()). Str("RequestTimestamp", consumerStatus.RequestTimestamp.String()). Str("FulfilmentTimestamp", consumerStatus.FulfilmentTimestamp.String()). Str("RequestBlockNumber", consumerStatus.RequestBlockNumber.String()). Str("FulfilmentBlockNumber", consumerStatus.FulfilmentBlockNumber.String()). Str("TX Hash", randomWordsFulfilledEvent.Raw.TxHash.String()). Msg("Random Words Fulfilment Details For Link Billing")` $DIR/integration-tests/smoke/vrfv2_test.go: `t.Run("Oracle Withdraw", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) consumers, subIDsForOracleWithDraw, err := vrfv2.SetupNewConsumersAndSubs( testEnv, chainID, vrfContracts.CoordinatorV2, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subIDForOracleWithdraw := subIDsForOracleWithDraw[0] subscription, err := vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForOracleWithdraw) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, strconv.FormatUint(subIDForOracleWithdraw, 10), vrfContracts.CoordinatorV2) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDsForOracleWithDraw...) _, fulfilledEventLink, err := vrfv2.RequestRandomnessAndWaitForFulfillment( l, consumers[0], vrfContracts.CoordinatorV2, subIDForOracleWithdraw, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, 0, ) require.NoError(t, err) amountToWithdrawLink := fulfilledEventLink.Payment defaultWalletBalanceLinkBeforeOracleWithdraw, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), sethClient.MustGetRootKeyAddress().Hex()) require.NoError(t, err) l.Info(). Str("Returning to", sethClient.MustGetRootKeyAddress().Hex()). Str("Amount", amountToWithdrawLink.String()). Msg("Invoking Oracle Withdraw for LINK") err = vrfContracts.CoordinatorV2.OracleWithdraw(sethClient.MustGetRootKeyAddress(), amountToWithdrawLink) require.NoError(t, err, "Error withdrawing LINK from coordinator to default wallet") defaultWalletBalanceLinkAfterOracleWithdraw, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), sethClient.MustGetRootKeyAddress().Hex()) require.NoError(t, err) require.Equal( t, 1, defaultWalletBalanceLinkAfterOracleWithdraw.Cmp(defaultWalletBalanceLinkBeforeOracleWithdraw), "LINK funds were not returned after oracle withdraw", ) })` $DIR/integration-tests/smoke/vrfv2_test.go: `vrfcommon.LogSubDetails(l, subscription, strconv.FormatUint(subIDForOracleWithdraw, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/smoke/vrfv2_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDsForOracleWithDraw...)` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info(). Str("Returning to", sethClient.MustGetRootKeyAddress().Hex()). Str("Amount", amountToWithdrawLink.String()). Msg("Invoking Oracle Withdraw for LINK")` $DIR/integration-tests/smoke/vrfv2_test.go: `err = vrfContracts.CoordinatorV2.OracleWithdraw(sethClient.MustGetRootKeyAddress(), amountToWithdrawLink)` $DIR/integration-tests/smoke/vrfv2_test.go: `t.Run("Canceling Sub And Returning Funds", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) _, subIDsForCancelling, err := vrfv2.SetupNewConsumersAndSubs( testEnv, chainID, vrfContracts.CoordinatorV2, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subIDForCancelling := subIDsForCancelling[0] subscription, err := vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForCancelling) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, strconv.FormatUint(subIDForCancelling, 10), vrfContracts.CoordinatorV2) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDsForCancelling...) testWalletAddress, err := actions.GenerateWallet() require.NoError(t, err) testWalletBalanceLinkBeforeSubCancelling, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), testWalletAddress.String()) require.NoError(t, err) subscriptionForCancelling, err := vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForCancelling) require.NoError(t, err, "error getting subscription information") subBalanceLink := subscriptionForCancelling.Balance l.Info(). Str("Subscription Amount Link", subBalanceLink.String()). Uint64("Returning funds from SubID", subIDForCancelling). Str("Returning funds to", testWalletAddress.String()). Msg("Canceling subscription and returning funds to subscription owner") cancellationTx, cancellationEvent, err := vrfContracts.CoordinatorV2.CancelSubscription(subIDForCancelling, testWalletAddress) require.NoError(t, err, "Error canceling subscription") txGasUsed := new(big.Int).SetUint64(cancellationTx.Receipt.GasUsed) // we don't have that information for older Geth versions if cancellationTx.Receipt.EffectiveGasPrice == nil { cancellationTx.Receipt.EffectiveGasPrice = new(big.Int).SetUint64(0) } cancellationTxFeeWei := new(big.Int).Mul(txGasUsed, cancellationTx.Receipt.EffectiveGasPrice) l.Info(). Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String()). Str("Effective Gas Price", cancellationTx.Receipt.EffectiveGasPrice.String()). Uint64("Gas Used", cancellationTx.Receipt.GasUsed). Msg("Cancellation TX Receipt") l.Info(). Str("Returned Subscription Amount Link", cancellationEvent.Amount.String()). Uint64("SubID", cancellationEvent.SubId). Str("Returned to", cancellationEvent.To.String()). Msg("Subscription Canceled Event") require.Equal(t, subBalanceLink, cancellationEvent.Amount, "SubscriptionCanceled event LINK amount is not equal to sub amount while canceling subscription") testWalletBalanceLinkAfterSubCancelling, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), testWalletAddress.String()) require.NoError(t, err) //Verify that sub was deleted from Coordinator _, err = vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForCancelling) require.Error(t, err, "error not occurred when trying to get deleted subscription from old Coordinator after sub migration") subFundsReturnedLinkActual := new(big.Int).Sub(testWalletBalanceLinkAfterSubCancelling, testWalletBalanceLinkBeforeSubCancelling) l.Info(). Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String()). Str("Sub Funds Returned Actual - Link", subFundsReturnedLinkActual.String()). Str("Sub Balance - Link", subBalanceLink.String()). Msg("Sub funds returned") require.Equal(t, 0, subBalanceLink.Cmp(subFundsReturnedLinkActual), "Returned LINK funds are not equal to sub balance that was cancelled") })` $DIR/integration-tests/smoke/vrfv2_test.go: `vrfcommon.LogSubDetails(l, subscription, strconv.FormatUint(subIDForCancelling, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/smoke/vrfv2_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDsForCancelling...)` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info(). Str("Subscription Amount Link", subBalanceLink.String()). Uint64("Returning funds from SubID", subIDForCancelling). Str("Returning funds to", testWalletAddress.String()). Msg("Canceling subscription and returning funds to subscription owner")` $DIR/integration-tests/smoke/vrfv2_test.go: `cancellationTx.Receipt.EffectiveGasPrice = new(big.Int).SetUint64(0)` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info(). Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String()). Str("Effective Gas Price", cancellationTx.Receipt.EffectiveGasPrice.String()). Uint64("Gas Used", cancellationTx.Receipt.GasUsed). Msg("Cancellation TX Receipt")` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info(). Str("Returned Subscription Amount Link", cancellationEvent.Amount.String()). Uint64("SubID", cancellationEvent.SubId). Str("Returned to", cancellationEvent.To.String()). Msg("Subscription Canceled Event")` $DIR/integration-tests/smoke/vrfv2_test.go: `_, err = vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForCancelling)` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info(). Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String()). Str("Sub Funds Returned Actual - Link", subFundsReturnedLinkActual.String()). Str("Sub Balance - Link", subBalanceLink.String()). Msg("Sub funds returned")` $DIR/integration-tests/smoke/vrfv2_test.go: `configCopy.VRFv2.General.SubscriptionFundingAmountLink = ptr.Ptr(float64(0))` $DIR/integration-tests/smoke/vrfv2_test.go: `vrfcommon.LogSubDetails(l, subscriptionForCancelling, strconv.FormatUint(subIDForOwnerCancelling, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/smoke/vrfv2_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDsForOwnerCancelling...)` $DIR/integration-tests/smoke/vrfv2_test.go: `_, _, err = vrfv2.RequestRandomnessAndWaitForFulfillment( l, consumers[0], vrfContracts.CoordinatorV2, subIDForOwnerCancelling, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, randomWordsFulfilledEventTimeout, 0, )` $DIR/integration-tests/smoke/vrfv2_test.go: `pendingRequestsExist, err = vrfContracts.CoordinatorV2.PendingRequestsExist(testcontext.Get(t), subIDForOwnerCancelling)` $DIR/integration-tests/smoke/vrfv2_test.go: `subscriptionForCancelling, err = vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForOwnerCancelling)` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info(). Str("Subscription Amount Link", subBalanceLink.String()). Uint64("Returning funds from SubID", subIDForOwnerCancelling). Str("Returning funds to", sethClient.MustGetRootKeyAddress().Hex()). Msg("Canceling subscription and returning funds to subscription owner")` $DIR/integration-tests/smoke/vrfv2_test.go: `cancellationTx.Receipt.EffectiveGasPrice = new(big.Int).SetUint64(0)` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info(). Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String()). Str("Effective Gas Price", cancellationTx.Receipt.EffectiveGasPrice.String()). Uint64("Gas Used", cancellationTx.Receipt.GasUsed). Msg("Cancellation TX Receipt")` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info(). Str("Returned Subscription Amount Link", cancellationEvent.Amount.String()). Uint64("SubID", cancellationEvent.SubId). Str("Returned to", cancellationEvent.To.String()). Msg("Subscription Canceled Event")` $DIR/integration-tests/smoke/vrfv2_test.go: `_, err = vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForOwnerCancelling)` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info(). Str("Expected error message", err.Error())` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info(). Str("Wallet Balance Before Owner Cancelation", walletBalanceLinkBeforeSubCancelling.String()). Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String()). Str("Sub Funds Returned Actual - Link", subFundsReturnedLinkActual.String()). Str("Sub Balance - Link", subBalanceLink.String()). Str("Wallet Balance After Owner Cancelation", walletBalanceLinkAfterSubCancelling.String()). Msg("Sub funds returned")` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info(). Str("Network Name", sethClient.Cfg.Network.Name). Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2_test.go: `vrfv2.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2_test.go: `testEnv, vrfContracts, vrfKey, nodeTypeToNodeMap, err = vrfv2.SetupVRFV2Universe(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2_test.go: `vrfcommon.LogSubDetails(l, subscriptionForMultipleSendingKeys, strconv.FormatUint(subIDForMultipleSendingKeys, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/smoke/vrfv2_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDsForMultipleSendingKeys...)` $DIR/integration-tests/smoke/vrfv2_test.go: `fulfillmentTxFromAddresses = append(fulfillmentTxFromAddresses, fulfillmentTxFromAddress)` $DIR/integration-tests/smoke/vrfv2_test.go: `txKeyAddresses = append(txKeyAddresses, txKey.Attributes.Address)` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info(). Str("Network Name", sethClient.Cfg.Network.Name). Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2_test.go: `vrfv2.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2_test.go: `testEnv, vrfContracts, vrfKey, _, err = vrfv2.SetupVRFV2Universe(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2_test.go: `vrfcommon.LogSubDetails(l, subscriptionForMultipleSendingKeys, strconv.FormatUint(subIDForForceFulfill, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/smoke/vrfv2_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDsForForceFulfill...)` $DIR/integration-tests/smoke/vrfv2_test.go: `err = vrfContracts.LinkToken.Transfer( consumers[0].Address(), conversions.EtherToWei(big.NewFloat(*configCopy.VRFv2.General.SubscriptionFundingAmountLink)), )` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info(). Str("Balance", conversions.WeiToEther(consumerLinkBalance).String()). Str("Consumer", consumers[0].Address()). Msg("Consumer Link Balance")` $DIR/integration-tests/smoke/vrfv2_test.go: `err = vrfContracts.MockETHLINKFeed.SetBlockTimestampDeduction(big.NewInt(3))` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status")` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info().Str("Output", w.String()).Msg("Randomness fulfilled")` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info(). Str("Network Name", sethClient.Cfg.Network.Name). Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2_test.go: `vrfv2.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2_test.go: `vrfv2Config.General.BHSJobWaitBlocks = ptr.Ptr(2)` $DIR/integration-tests/smoke/vrfv2_test.go: `vrfv2Config.General.BHSJobLookBackBlocks = ptr.Ptr(20)` $DIR/integration-tests/smoke/vrfv2_test.go: `testEnv, vrfContracts, vrfKey, nodeTypeToNodeMap, err = vrfv2.SetupVRFV2Universe(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2_test.go: `t.Run("BHS Job with complete E2E - wait 256 blocks to see if Rand Request is fulfilled", func(t *testing.T) { if os.Getenv("TEST_UNSKIP") != "true" { t.Skip("Skipped due to long execution time. Should be run on-demand on live testnet with TEST_UNSKIP=\"true\".") } //BHS node should fill in blockhashes into BHS contract depending on the waitBlocks and lookBackBlocks settings configCopy := config.MustCopy().(tc.TestConfig) //Underfund Subscription configCopy.VRFv2.General.SubscriptionFundingAmountLink = ptr.Ptr(float64(0)) consumers, subIDsForBHS, err := vrfv2.SetupNewConsumersAndSubs( testEnv, chainID, vrfContracts.CoordinatorV2, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subIDForBHS := subIDsForBHS[0] subscriptionForBHS, err := vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForBHS) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscriptionForBHS, strconv.FormatUint(subIDForBHS, 10), vrfContracts.CoordinatorV2) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDsForBHS...) randomWordsRequestedEvent, err := vrfv2.RequestRandomness( l, consumers[0], vrfContracts.CoordinatorV2, subIDForBHS, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, SethRootKeyIndex, ) require.NoError(t, err, "error requesting randomness") vrfcommon.LogRandomnessRequestedEvent(l, vrfContracts.CoordinatorV2, randomWordsRequestedEvent, false, 0) randRequestBlockNumber := randomWordsRequestedEvent.Raw.BlockNumber var wg sync.WaitGroup wg.Add(1) //Wait at least 256 blocks sethClient, err := testEnv.GetSethClient(chainID) require.NoError(t, err, "Getting Seth client shouldn't fail") _, err = actions.WaitForBlockNumberToBe( randRequestBlockNumber+uint64(257), sethClient, &wg, configCopy.VRFv2.General.WaitFor256BlocksTimeout.Duration, t, l, ) wg.Wait() require.NoError(t, err) err = vrfv2.FundSubscriptions(big.NewFloat(*configCopy.VRFv2.General.SubscriptionFundingAmountLink), vrfContracts.LinkToken, vrfContracts.CoordinatorV2, subIDsForBHS) require.NoError(t, err, "error funding subscriptions") randomWordsFulfilledEvent, err := vrfContracts.CoordinatorV2.WaitForRandomWordsFulfilledEvent( contracts.RandomWordsFulfilledEventFilter{ RequestIds: []*big.Int{randomWordsRequestedEvent.RequestId}, Timeout: configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, }, ) require.NoError(t, err, "error waiting for randomness fulfilled event") vrfcommon.LogRandomWordsFulfilledEvent(l, vrfContracts.CoordinatorV2, randomWordsFulfilledEvent, false, 0) status, err := consumers[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId) require.NoError(t, err, "error getting rand request status") require.True(t, status.Fulfilled) l.Info().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status") })` $DIR/integration-tests/smoke/vrfv2_test.go: `configCopy.VRFv2.General.SubscriptionFundingAmountLink = ptr.Ptr(float64(0))` $DIR/integration-tests/smoke/vrfv2_test.go: `vrfcommon.LogSubDetails(l, subscriptionForBHS, strconv.FormatUint(subIDForBHS, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/smoke/vrfv2_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDsForBHS...)` $DIR/integration-tests/smoke/vrfv2_test.go: `vrfcommon.LogRandomnessRequestedEvent(l, vrfContracts.CoordinatorV2, randomWordsRequestedEvent, false, 0)` $DIR/integration-tests/smoke/vrfv2_test.go: `wg.Add(1)` $DIR/integration-tests/smoke/vrfv2_test.go: `_, err = actions.WaitForBlockNumberToBe( randRequestBlockNumber+uint64(257), sethClient, &wg, configCopy.VRFv2.General.WaitFor256BlocksTimeout.Duration, t, l, )` $DIR/integration-tests/smoke/vrfv2_test.go: `wg.Wait()` $DIR/integration-tests/smoke/vrfv2_test.go: `err = vrfv2.FundSubscriptions(big.NewFloat(*configCopy.VRFv2.General.SubscriptionFundingAmountLink), vrfContracts.LinkToken, vrfContracts.CoordinatorV2, subIDsForBHS)` $DIR/integration-tests/smoke/vrfv2_test.go: `vrfcommon.LogRandomWordsFulfilledEvent(l, vrfContracts.CoordinatorV2, randomWordsFulfilledEvent, false, 0)` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status")` $DIR/integration-tests/smoke/vrfv2_test.go: `configCopy.VRFv2.General.SubscriptionFundingAmountLink = ptr.Ptr(float64(0))` $DIR/integration-tests/smoke/vrfv2_test.go: `vrfcommon.LogSubDetails(l, subscriptionForBHS, strconv.FormatUint(subIDForBHS, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/smoke/vrfv2_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDsForBHS...)` $DIR/integration-tests/smoke/vrfv2_test.go: `_, err = vrfContracts.BHS.GetBlockHash(testcontext.Get(t), big.NewInt(int64(randRequestBlockNumber)))` $DIR/integration-tests/smoke/vrfv2_test.go: `wg.Add(1)` $DIR/integration-tests/smoke/vrfv2_test.go: `_, err = actions.WaitForBlockNumberToBe( randRequestBlockNumber+uint64(*configCopy.VRFv2.General.BHSJobWaitBlocks), sethClient, &wg, time.Minute*1, t, l, )` $DIR/integration-tests/smoke/vrfv2_test.go: `wg.Wait()` $DIR/integration-tests/smoke/vrfv2_test.go: `gom.Eventually(func(g gomega.Gomega) { clNodeTxs, _, err = nodeTypeToNodeMap[vrfcommon.BHS].CLNode.API.ReadTransactions() g.Expect(err).ShouldNot(gomega.HaveOccurred(), "error getting CL Node transactions") l.Info().Int("Number of TXs", len(clNodeTxs.Data)).Msg("BHS Node txs") g.Expect(len(clNodeTxs.Data)).Should(gomega.BeNumerically("==", 1), "Expected 1 tx posted by BHS Node, but found %d", len(clNodeTxs.Data)) txHash = clNodeTxs.Data[0].Attributes.Hash }, "2m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/vrfv2_test.go: `clNodeTxs, _, err = nodeTypeToNodeMap[vrfcommon.BHS].CLNode.API.ReadTransactions()` $DIR/integration-tests/smoke/vrfv2_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "error getting CL Node transactions")` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info().Int("Number of TXs", len(clNodeTxs.Data)).Msg("BHS Node txs")` $DIR/integration-tests/smoke/vrfv2_test.go: `g.Expect(len(clNodeTxs.Data)).Should(gomega.BeNumerically("==", 1), "Expected 1 tx posted by BHS Node, but found %d", len(clNodeTxs.Data))` $DIR/integration-tests/smoke/vrfv2_test.go: `txHash = clNodeTxs.Data[0].Attributes.Hash` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info(). Str("Block Number", bhsStoreTxInputData["n"].(*big.Int).String()). Msg("BHS Node's Store Blockhash for Blocknumber Method TX")` $DIR/integration-tests/smoke/vrfv2_test.go: `gom.Eventually(func(g gomega.Gomega) { randRequestBlockHash, err = vrfContracts.BHS.GetBlockHash(testcontext.Get(t), big.NewInt(int64(randRequestBlockNumber))) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "error getting blockhash for a blocknumber which was stored in BHS contract") }, "2m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/vrfv2_test.go: `randRequestBlockHash, err = vrfContracts.BHS.GetBlockHash(testcontext.Get(t), big.NewInt(int64(randRequestBlockNumber)))` $DIR/integration-tests/smoke/vrfv2_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "error getting blockhash for a blocknumber which was stored in BHS contract")` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info(). Str("Randomness Request's Blockhash", randomWordsRequestedEvent.Raw.BlockHash.String()). Str("Block Hash stored by BHS contract", fmt.Sprintf("0x%x", randRequestBlockHash)). Msg("BHS Contract's stored Blockhash for Randomness Request")` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info(). Str("Network Name", sethClient.Cfg.Network.Name). Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2_test.go: `vrfv2.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, defaultWalletAddress, subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2_test.go: `env, vrfContracts, vrfKey, _, err = vrfv2.SetupVRFV2Universe(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2_test.go: `vrfcommon.LogSubDetails(l, subscription, strconv.FormatUint(subID, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/smoke/vrfv2_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...)` $DIR/integration-tests/smoke/vrfv2_test.go: `t.Run("Reorg on fulfillment", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) configCopy.VRFv2.General.MinimumConfirmations = ptr.Ptr[uint16](10) //1. request randomness and wait for fulfillment for blockhash from Reorged Fork randomWordsRequestedEvent, randomWordsFulfilledEventOnReorgedFork, err := vrfv2.RequestRandomnessAndWaitForFulfillment( l, consumers[0], vrfContracts.CoordinatorV2, subID, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, 0, ) require.NoError(t, err) // rewind chain to block number after the request was made, but before the request was fulfilled rewindChainToBlock := randomWordsRequestedEvent.Raw.BlockNumber + 1 rpcUrl, err := actions.GetRPCUrl(env, chainID) require.NoError(t, err, "error getting rpc url") //2. rewind chain by n number of blocks - basically, mimicking reorg scenario latestBlockNumberAfterReorg, err := actions.RewindSimulatedChainToBlockNumber(testcontext.Get(t), sethClient, rpcUrl, rewindChainToBlock, l) require.NoError(t, err, fmt.Sprintf("error rewinding chain to block number %d", rewindChainToBlock)) //3.1 ensure that chain is reorged and latest block number is greater than the block number when request was made require.Greater(t, latestBlockNumberAfterReorg, randomWordsRequestedEvent.Raw.BlockNumber) //3.2 ensure that chain is reorged and latest block number is less than the block number when fulfilment was performed require.Less(t, latestBlockNumberAfterReorg, randomWordsFulfilledEventOnReorgedFork.Raw.BlockNumber) //4. wait for the fulfillment which VRF Node will generate for Canonical chain _, err = vrfv2.WaitRandomWordsFulfilledEvent( vrfContracts.CoordinatorV2, randomWordsRequestedEvent.RequestId, randomWordsRequestedEvent.Raw.BlockNumber, configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, l, ) require.NoError(t, err, "error waiting for randomness fulfilled event") })` $DIR/integration-tests/smoke/vrfv2_test.go: `configCopy.VRFv2.General.MinimumConfirmations = ptr.Ptr[uint16](10)` $DIR/integration-tests/smoke/vrfv2_test.go: `_, err = vrfv2.WaitRandomWordsFulfilledEvent( vrfContracts.CoordinatorV2, randomWordsRequestedEvent.RequestId, randomWordsRequestedEvent.Raw.BlockNumber, configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, l, )` $DIR/integration-tests/smoke/vrfv2_test.go: `configCopy.VRFv2.General.MinimumConfirmations = ptr.Ptr[uint16](6)` $DIR/integration-tests/smoke/vrfv2_test.go: `_, err = vrfContracts.CoordinatorV2.WaitForRandomWordsFulfilledEvent( contracts.RandomWordsFulfilledEventFilter{ RequestIds: []*big.Int{randomWordsRequestedEvent.RequestId}, Timeout: time.Second * 10, }, )` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info(). Str("Network Name", sethClient.Cfg.Network.Name). Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2_test.go: `vrfv2.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, defaultWalletAddress, subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2_test.go: `env, vrfContracts, vrfKey, nodeTypeToNodeMap, err = vrfv2.SetupVRFV2Universe(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2_test.go: `config.VRFv2.General.CallbackGasLimit = ptr.Ptr(uint32(500_000))` $DIR/integration-tests/smoke/vrfv2_test.go: `t.Run("Batch Fulfillment Enabled", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) vrfNode, exists := nodeTypeToNodeMap[vrfcommon.VRF] require.True(t, exists, "VRF Node does not exist") //ensure that no job present on the node err = actions.DeleteJobs([]*client.ChainlinkClient{vrfNode.CLNode.API}) require.NoError(t, err) batchFullfillmentEnabled := true // create job with batch fulfillment enabled vrfJobSpecConfig := vrfcommon.VRFJobSpecConfig{ ForwardingAllowed: *configCopy.VRFv2.General.VRFJobForwardingAllowed, CoordinatorAddress: vrfContracts.CoordinatorV2.Address(), BatchCoordinatorAddress: vrfContracts.BatchCoordinatorV2.Address(), FromAddresses: vrfNode.TXKeyAddressStrings, EVMChainID: fmt.Sprint(chainID), MinIncomingConfirmations: int(*configCopy.VRFv2.General.MinimumConfirmations), PublicKey: vrfKey.PubKeyCompressed, EstimateGasMultiplier: *configCopy.VRFv2.General.VRFJobEstimateGasMultiplier, BatchFulfillmentEnabled: batchFullfillmentEnabled, BatchFulfillmentGasMultiplier: *configCopy.VRFv2.General.VRFJobBatchFulfillmentGasMultiplier, PollPeriod: configCopy.VRFv2.General.VRFJobPollPeriod.Duration, RequestTimeout: configCopy.VRFv2.General.VRFJobRequestTimeout.Duration, SimulationBlock: configCopy.VRFv2.General.VRFJobSimulationBlock, VRFOwnerConfig: &vrfcommon.VRFOwnerConfig{ UseVRFOwner: false, }, } l.Info(). Msg("Creating VRFV2 Job with `batchFulfillmentEnabled = true`") job, err := vrfv2.CreateVRFV2Job( vrfNode.CLNode.API, vrfJobSpecConfig, ) require.NoError(t, err, "error creating job with higher timeout") vrfNode.Job = job consumers, subIDs, err := vrfv2.SetupNewConsumersAndSubs( env, chainID, vrfContracts.CoordinatorV2, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subID := subIDs[0] subscription, err := vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, strconv.FormatUint(subID, 10), vrfContracts.CoordinatorV2) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...) configCopy.VRFv2.General.RandomnessRequestCountPerRequest = ptr.Ptr(uint16(randRequestCount)) // test and assert _, randomWordsFulfilledEvent, err := vrfv2.RequestRandomnessAndWaitForFulfillment( l, consumers[0], vrfContracts.CoordinatorV2, subID, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, 0, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") var wgAllRequestsFulfilled sync.WaitGroup wgAllRequestsFulfilled.Add(1) requestCount, fulfilmentCount, err := vrfcommon.WaitForRequestCountEqualToFulfilmentCount(testcontext.Get(t), consumers[0], 2*time.Minute, &wgAllRequestsFulfilled) require.NoError(t, err) wgAllRequestsFulfilled.Wait() l.Info(). Interface("Request Count", requestCount). Interface("Fulfilment Count", fulfilmentCount). Msg("Request/Fulfilment Stats") clNodeTxs, resp, err := nodeTypeToNodeMap[vrfcommon.VRF].CLNode.API.ReadTransactions() require.NoError(t, err) require.Equal(t, 200, resp.StatusCode) var batchFulfillmentTxs []client.TransactionData for _, tx := range clNodeTxs.Data { if common.HexToAddress(tx.Attributes.To).Cmp(common.HexToAddress(vrfContracts.BatchCoordinatorV2.Address())) == 0 { batchFulfillmentTxs = append(batchFulfillmentTxs, tx) } } // verify that all fulfillments should be inside one tx require.Equal(t, 1, len(batchFulfillmentTxs)) fulfillmentTx, _, err := sethClient.Client.TransactionByHash(testcontext.Get(t), randomWordsFulfilledEvent.Raw.TxHash) require.NoError(t, err, "error getting tx from hash") fulfillmentTXToAddress := fulfillmentTx.To().String() l.Info(). Str("Actual Fulfillment Tx To Address", fulfillmentTXToAddress). Str("BatchCoordinatorV2 Address", vrfContracts.BatchCoordinatorV2.Address()). Msg("Fulfillment Tx To Address should be the BatchCoordinatorV2 Address when batch fulfillment is enabled") // verify that VRF node sends fulfillments via BatchCoordinator contract require.Equal(t, vrfContracts.BatchCoordinatorV2.Address(), fulfillmentTXToAddress, "Fulfillment Tx To Address should be the BatchCoordinatorV2 Address when batch fulfillment is enabled") // verify that all fulfillments should be inside one tx // This check is disabled for live testnets since each testnet has different gas usage for similar tx if network.Simulated { fulfillmentTxReceipt, err := sethClient.Client.TransactionReceipt(testcontext.Get(t), fulfillmentTx.Hash()) require.NoError(t, err) randomWordsFulfilledLogs, err := contracts.ParseRandomWordsFulfilledLogs(vrfContracts.CoordinatorV2, fulfillmentTxReceipt.Logs) require.NoError(t, err) require.Equal(t, 1, len(batchFulfillmentTxs)) require.Equal(t, int(randRequestCount), len(randomWordsFulfilledLogs)) } })` $DIR/integration-tests/smoke/vrfv2_test.go: `err = actions.DeleteJobs([]*client.ChainlinkClient{vrfNode.CLNode.API})` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info(). Msg("Creating VRFV2 Job with `batchFulfillmentEnabled = true`")` $DIR/integration-tests/smoke/vrfv2_test.go: `vrfNode.Job = job` $DIR/integration-tests/smoke/vrfv2_test.go: `vrfcommon.LogSubDetails(l, subscription, strconv.FormatUint(subID, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/smoke/vrfv2_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...)` $DIR/integration-tests/smoke/vrfv2_test.go: `configCopy.VRFv2.General.RandomnessRequestCountPerRequest = ptr.Ptr(uint16(randRequestCount))` $DIR/integration-tests/smoke/vrfv2_test.go: `wgAllRequestsFulfilled.Add(1)` $DIR/integration-tests/smoke/vrfv2_test.go: `wgAllRequestsFulfilled.Wait()` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info(). Interface("Request Count", requestCount). Interface("Fulfilment Count", fulfilmentCount). Msg("Request/Fulfilment Stats")` $DIR/integration-tests/smoke/vrfv2_test.go: `batchFulfillmentTxs = append(batchFulfillmentTxs, tx)` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info(). Str("Actual Fulfillment Tx To Address", fulfillmentTXToAddress). Str("BatchCoordinatorV2 Address", vrfContracts.BatchCoordinatorV2.Address()). Msg("Fulfillment Tx To Address should be the BatchCoordinatorV2 Address when batch fulfillment is enabled")` $DIR/integration-tests/smoke/vrfv2_test.go: `err = actions.DeleteJobs([]*client.ChainlinkClient{vrfNode.CLNode.API})` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info(). Msg("Creating VRFV2 Job with `batchFulfillmentEnabled = false`")` $DIR/integration-tests/smoke/vrfv2_test.go: `vrfNode.Job = job` $DIR/integration-tests/smoke/vrfv2_test.go: `vrfcommon.LogSubDetails(l, subscription, strconv.FormatUint(subID, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/smoke/vrfv2_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...)` $DIR/integration-tests/smoke/vrfv2_test.go: `configCopy.VRFv2.General.RandomnessRequestCountPerRequest = ptr.Ptr(uint16(randRequestCount))` $DIR/integration-tests/smoke/vrfv2_test.go: `wgAllRequestsFulfilled.Add(1)` $DIR/integration-tests/smoke/vrfv2_test.go: `wgAllRequestsFulfilled.Wait()` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info(). Interface("Request Count", requestCount). Interface("Fulfilment Count", fulfilmentCount). Msg("Request/Fulfilment Stats")` $DIR/integration-tests/smoke/vrfv2_test.go: `l.Info(). Str("Actual Fulfillment Tx To Address", fulfillmentTXToAddress). Str("CoordinatorV2 Address", vrfContracts.CoordinatorV2.Address()). Msg("Fulfillment Tx To Address should be the CoordinatorV2 Address when batch fulfillment is disabled")` $DIR/integration-tests/smoke/vrfv2_test.go: `singleFulfillmentTxs = append(singleFulfillmentTxs, tx)` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetConfig("Smoke", tc.VRFv2)` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustGetSelectedNetworkConfig(config.GetNetworkConfig())` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetNetworkConfig()` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Cfg.IsSimulatedNetwork()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Network Name", sethClient.Cfg.Network.Name)` $DIR/integration-tests/smoke/vrfv2_test.go: `. Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2_test.go: `.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Cleanup(test_env.CleanupOpts{TestName: t.Name()})` $DIR/integration-tests/smoke/vrfv2_test.go: `.Name()` $DIR/integration-tests/smoke/vrfv2_test.go: `.SetupVRFV2Universe(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Run("Request Randomness", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) consumers, subIDsForRequestRandomness, err := vrfv2.SetupNewConsumersAndSubs( testEnv, chainID, vrfContracts.CoordinatorV2, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subIDForRequestRandomness := subIDsForRequestRandomness[0] subscription, err := vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForRequestRandomness) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, strconv.FormatUint(subIDForRequestRandomness, 10), vrfContracts.CoordinatorV2) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDsForRequestRandomness...) subBalanceBeforeRequest := subscription.Balance // test and assert _, randomWordsFulfilledEvent, err := vrfv2.RequestRandomnessAndWaitForFulfillment( l, consumers[0], vrfContracts.CoordinatorV2, subIDForRequestRandomness, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, 0, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") expectedSubBalanceJuels := new(big.Int).Sub(subBalanceBeforeRequest, randomWordsFulfilledEvent.Payment) subscription, err = vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForRequestRandomness) require.NoError(t, err, "error getting subscription information") subBalanceAfterRequest := subscription.Balance require.Equal(t, expectedSubBalanceJuels, subBalanceAfterRequest) status, err := consumers[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId) require.NoError(t, err, "error getting rand request status") require.True(t, status.Fulfilled) l.Info().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status") require.Equal(t, *configCopy.VRFv2.General.NumberOfWords, uint32(len(status.RandomWords))) for _, w := range status.RandomWords { l.Info().Str("Output", w.String()).Msg("Randomness fulfilled") require.Equal(t, 1, w.Cmp(big.NewInt(0)), "Expected the VRF job give an answer bigger than 0") } })` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2_test.go: `.SetupNewConsumersAndSubs( testEnv, chainID, vrfContracts.CoordinatorV2, configCopy, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForRequestRandomness)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.LogSubDetails(l, subscription, strconv.FormatUint(subIDForRequestRandomness, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/smoke/vrfv2_test.go: `.FormatUint(subIDForRequestRandomness, 10)` $DIR/integration-tests/smoke/vrfv2_test.go: `.RequestRandomnessAndWaitForFulfillment( l, consumers[0], vrfContracts.CoordinatorV2, subIDForRequestRandomness, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, 0, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.Sub(subBalanceBeforeRequest, randomWordsFulfilledEvent.Payment)` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForRequestRandomness)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Bool("Fulfilment Status", status.Fulfilled)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Msg("Random Words Request Fulfilment Status")` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Str("Output", w.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Msg("Randomness fulfilled")` $DIR/integration-tests/smoke/vrfv2_test.go: `.Run("VRF Node waits block confirmation number specified by the consumer before sending fulfilment on-chain", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) testConfig := configCopy.VRFv2.General consumers, subIDs, err := vrfv2.SetupNewConsumersAndSubs( testEnv, chainID, vrfContracts.CoordinatorV2, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subID := subIDs[0] subscription, err := vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, strconv.FormatUint(subID, 10), vrfContracts.CoordinatorV2) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...) expectedBlockNumberWait := uint16(10) testConfig.MinimumConfirmations = ptr.Ptr[uint16](expectedBlockNumberWait) randomWordsRequestedEvent, randomWordsFulfilledEvent, err := vrfv2.RequestRandomnessAndWaitForFulfillment( l, consumers[0], vrfContracts.CoordinatorV2, subID, vrfKey, *testConfig.MinimumConfirmations, *testConfig.CallbackGasLimit, *testConfig.NumberOfWords, *testConfig.RandomnessRequestCountPerRequest, *testConfig.RandomnessRequestCountPerRequestDeviation, testConfig.RandomWordsFulfilledEventTimeout.Duration, 0, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") // check that VRF node waited at least the number of blocks specified by the consumer in the rand request min confs field blockNumberWait := randomWordsRequestedEvent.Raw.BlockNumber - randomWordsFulfilledEvent.Raw.BlockNumber require.GreaterOrEqual(t, blockNumberWait, uint64(expectedBlockNumberWait)) status, err := consumers[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId) require.NoError(t, err, "error getting rand request status") require.True(t, status.Fulfilled) l.Info().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status") })` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2_test.go: `.SetupNewConsumersAndSubs( testEnv, chainID, vrfContracts.CoordinatorV2, configCopy, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.LogSubDetails(l, subscription, strconv.FormatUint(subID, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/smoke/vrfv2_test.go: `.FormatUint(subID, 10)` $DIR/integration-tests/smoke/vrfv2_test.go: `.RequestRandomnessAndWaitForFulfillment( l, consumers[0], vrfContracts.CoordinatorV2, subID, vrfKey, *testConfig.MinimumConfirmations, *testConfig.CallbackGasLimit, *testConfig.NumberOfWords, *testConfig.RandomnessRequestCountPerRequest, *testConfig.RandomnessRequestCountPerRequestDeviation, testConfig.RandomWordsFulfilledEventTimeout.Duration, 0, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Bool("Fulfilment Status", status.Fulfilled)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Msg("Random Words Request Fulfilment Status")` $DIR/integration-tests/smoke/vrfv2_test.go: `.Run("CL Node VRF Job Runs", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) consumers, subIDsForJobRuns, err := vrfv2.SetupNewConsumersAndSubs( testEnv, chainID, vrfContracts.CoordinatorV2, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subIDForJobRuns := subIDsForJobRuns[0] subscription, err := vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForJobRuns) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, strconv.FormatUint(subIDForJobRuns, 10), vrfContracts.CoordinatorV2) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDsForJobRuns...) jobRunsBeforeTest, err := nodeTypeToNodeMap[vrfcommon.VRF].CLNode.API.MustReadRunsByJob(nodeTypeToNodeMap[vrfcommon.VRF].Job.Data.ID) require.NoError(t, err, "error reading job runs") // test and assert _, _, err = vrfv2.RequestRandomnessAndWaitForFulfillment( l, consumers[0], vrfContracts.CoordinatorV2, subIDForJobRuns, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, 0, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") jobRuns, err := nodeTypeToNodeMap[vrfcommon.VRF].CLNode.API.MustReadRunsByJob(nodeTypeToNodeMap[vrfcommon.VRF].Job.Data.ID) require.NoError(t, err, "error reading job runs") require.Equal(t, len(jobRunsBeforeTest.Data)+1, len(jobRuns.Data)) })` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2_test.go: `.SetupNewConsumersAndSubs( testEnv, chainID, vrfContracts.CoordinatorV2, configCopy, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForJobRuns)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.LogSubDetails(l, subscription, strconv.FormatUint(subIDForJobRuns, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/smoke/vrfv2_test.go: `.FormatUint(subIDForJobRuns, 10)` $DIR/integration-tests/smoke/vrfv2_test.go: `.CLNode.API.MustReadRunsByJob(nodeTypeToNodeMap[vrfcommon.VRF].Job.Data.ID)` $DIR/integration-tests/smoke/vrfv2_test.go: `.RequestRandomnessAndWaitForFulfillment( l, consumers[0], vrfContracts.CoordinatorV2, subIDForJobRuns, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, 0, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.CLNode.API.MustReadRunsByJob(nodeTypeToNodeMap[vrfcommon.VRF].Job.Data.ID)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Run("Direct Funding", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) wrapperContracts, wrapperSubID, err := vrfv2.SetupVRFV2WrapperEnvironment( testcontext.Get(t), testEnv, chainID, &configCopy, vrfContracts.LinkToken, vrfContracts.MockETHLINKFeed, vrfContracts.CoordinatorV2, vrfKey.KeyHash, 1, ) require.NoError(t, err) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, *wrapperSubID) wrapperConsumer := wrapperContracts.LoadTestConsumers[0] wrapperConsumerJuelsBalanceBeforeRequest, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), wrapperConsumer.Address()) require.NoError(t, err, "Error getting wrapper consumer balance") wrapperSubscription, err := vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), *wrapperSubID) require.NoError(t, err, "Error getting subscription information") subBalanceBeforeRequest := wrapperSubscription.Balance // Request Randomness and wait for fulfillment event randomWordsFulfilledEvent, err := vrfv2.DirectFundingRequestRandomnessAndWaitForFulfillment( l, wrapperConsumer, vrfContracts.CoordinatorV2, *wrapperSubID, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, ) require.NoError(t, err, "Error requesting randomness and waiting for fulfilment") // Check wrapper subscription balance expectedSubBalanceJuels := new(big.Int).Sub(subBalanceBeforeRequest, randomWordsFulfilledEvent.Payment) wrapperSubscription, err = vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), *wrapperSubID) require.NoError(t, err, "Error getting subscription information") subBalanceAfterRequest := wrapperSubscription.Balance require.Equal(t, expectedSubBalanceJuels, subBalanceAfterRequest) // Check status of randomness request within the wrapper consumer contract consumerStatus, err := wrapperConsumer.GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId) require.NoError(t, err, "Error getting randomness request status") require.True(t, consumerStatus.Fulfilled) // Check wrapper consumer LINK balance expectedWrapperConsumerJuelsBalance := new(big.Int).Sub(wrapperConsumerJuelsBalanceBeforeRequest, consumerStatus.Paid) wrapperConsumerJuelsBalanceAfterRequest, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), wrapperConsumer.Address()) require.NoError(t, err, "Error getting wrapper consumer balance") require.Equal(t, expectedWrapperConsumerJuelsBalance, wrapperConsumerJuelsBalanceAfterRequest) // Check random word count require.Equal(t, *configCopy.VRFv2.General.NumberOfWords, uint32(len(consumerStatus.RandomWords))) for _, w := range consumerStatus.RandomWords { l.Info().Str("Output", w.String()).Msg("Randomness fulfilled") require.Equal(t, 1, w.Cmp(big.NewInt(0)), "Expected the VRF job give an answer bigger than 0") } l.Info(). Str("Consumer Balance Before Request (Link)", (*commonassets.Link)(wrapperConsumerJuelsBalanceBeforeRequest).Link()). Str("Consumer Balance After Request (Link)", (*commonassets.Link)(wrapperConsumerJuelsBalanceAfterRequest).Link()). Bool("Fulfilment Status", consumerStatus.Fulfilled). Str("Paid by Consumer Contract (Link)", (*commonassets.Link)(consumerStatus.Paid).Link()). Str("Paid by Coordinator Sub (Link)", (*commonassets.Link)(randomWordsFulfilledEvent.Payment).Link()). Str("RequestTimestamp", consumerStatus.RequestTimestamp.String()). Str("FulfilmentTimestamp", consumerStatus.FulfilmentTimestamp.String()). Str("RequestBlockNumber", consumerStatus.RequestBlockNumber.String()). Str("FulfilmentBlockNumber", consumerStatus.FulfilmentBlockNumber.String()). Str("TX Hash", randomWordsFulfilledEvent.Raw.TxHash.String()). Msg("Random Words Fulfilment Details For Link Billing") })` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2_test.go: `.SetupVRFV2WrapperEnvironment( testcontext.Get(t), testEnv, chainID, &configCopy, vrfContracts.LinkToken, vrfContracts.MockETHLINKFeed, vrfContracts.CoordinatorV2, vrfKey.KeyHash, 1, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.LinkToken.BalanceOf(testcontext.Get(t), wrapperConsumer.Address())` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Address()` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.GetSubscription(testcontext.Get(t), *wrapperSubID)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.DirectFundingRequestRandomnessAndWaitForFulfillment( l, wrapperConsumer, vrfContracts.CoordinatorV2, *wrapperSubID, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.Sub(subBalanceBeforeRequest, randomWordsFulfilledEvent.Payment)` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.GetSubscription(testcontext.Get(t), *wrapperSubID)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Sub(wrapperConsumerJuelsBalanceBeforeRequest, consumerStatus.Paid)` $DIR/integration-tests/smoke/vrfv2_test.go: `.LinkToken.BalanceOf(testcontext.Get(t), wrapperConsumer.Address())` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Address()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Str("Output", w.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Msg("Randomness fulfilled")` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Consumer Balance Before Request (Link)", (*commonassets.Link)(wrapperConsumerJuelsBalanceBeforeRequest).Link())` $DIR/integration-tests/smoke/vrfv2_test.go: `.Link()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Consumer Balance After Request (Link)", (*commonassets.Link)(wrapperConsumerJuelsBalanceAfterRequest).Link())` $DIR/integration-tests/smoke/vrfv2_test.go: `.Link()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Bool("Fulfilment Status", consumerStatus.Fulfilled)` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Paid by Consumer Contract (Link)", (*commonassets.Link)(consumerStatus.Paid).Link())` $DIR/integration-tests/smoke/vrfv2_test.go: `.Link()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Paid by Coordinator Sub (Link)", (*commonassets.Link)(randomWordsFulfilledEvent.Payment).Link())` $DIR/integration-tests/smoke/vrfv2_test.go: `.Link()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("RequestTimestamp", consumerStatus.RequestTimestamp.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.RequestTimestamp.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("FulfilmentTimestamp", consumerStatus.FulfilmentTimestamp.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.FulfilmentTimestamp.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("RequestBlockNumber", consumerStatus.RequestBlockNumber.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.RequestBlockNumber.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("FulfilmentBlockNumber", consumerStatus.FulfilmentBlockNumber.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.FulfilmentBlockNumber.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("TX Hash", randomWordsFulfilledEvent.Raw.TxHash.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.Raw.TxHash.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Msg("Random Words Fulfilment Details For Link Billing")` $DIR/integration-tests/smoke/vrfv2_test.go: `.Run("Oracle Withdraw", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) consumers, subIDsForOracleWithDraw, err := vrfv2.SetupNewConsumersAndSubs( testEnv, chainID, vrfContracts.CoordinatorV2, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subIDForOracleWithdraw := subIDsForOracleWithDraw[0] subscription, err := vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForOracleWithdraw) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, strconv.FormatUint(subIDForOracleWithdraw, 10), vrfContracts.CoordinatorV2) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDsForOracleWithDraw...) _, fulfilledEventLink, err := vrfv2.RequestRandomnessAndWaitForFulfillment( l, consumers[0], vrfContracts.CoordinatorV2, subIDForOracleWithdraw, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, 0, ) require.NoError(t, err) amountToWithdrawLink := fulfilledEventLink.Payment defaultWalletBalanceLinkBeforeOracleWithdraw, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), sethClient.MustGetRootKeyAddress().Hex()) require.NoError(t, err) l.Info(). Str("Returning to", sethClient.MustGetRootKeyAddress().Hex()). Str("Amount", amountToWithdrawLink.String()). Msg("Invoking Oracle Withdraw for LINK") err = vrfContracts.CoordinatorV2.OracleWithdraw(sethClient.MustGetRootKeyAddress(), amountToWithdrawLink) require.NoError(t, err, "Error withdrawing LINK from coordinator to default wallet") defaultWalletBalanceLinkAfterOracleWithdraw, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), sethClient.MustGetRootKeyAddress().Hex()) require.NoError(t, err) require.Equal( t, 1, defaultWalletBalanceLinkAfterOracleWithdraw.Cmp(defaultWalletBalanceLinkBeforeOracleWithdraw), "LINK funds were not returned after oracle withdraw", ) })` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2_test.go: `.SetupNewConsumersAndSubs( testEnv, chainID, vrfContracts.CoordinatorV2, configCopy, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForOracleWithdraw)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.LogSubDetails(l, subscription, strconv.FormatUint(subIDForOracleWithdraw, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/smoke/vrfv2_test.go: `.FormatUint(subIDForOracleWithdraw, 10)` $DIR/integration-tests/smoke/vrfv2_test.go: `.RequestRandomnessAndWaitForFulfillment( l, consumers[0], vrfContracts.CoordinatorV2, subIDForOracleWithdraw, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, 0, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.LinkToken.BalanceOf(testcontext.Get(t), sethClient.MustGetRootKeyAddress().Hex())` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Returning to", sethClient.MustGetRootKeyAddress().Hex())` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Amount", amountToWithdrawLink.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Msg("Invoking Oracle Withdraw for LINK")` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.OracleWithdraw(sethClient.MustGetRootKeyAddress(), amountToWithdrawLink)` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2_test.go: `.LinkToken.BalanceOf(testcontext.Get(t), sethClient.MustGetRootKeyAddress().Hex())` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Run("Canceling Sub And Returning Funds", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) _, subIDsForCancelling, err := vrfv2.SetupNewConsumersAndSubs( testEnv, chainID, vrfContracts.CoordinatorV2, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subIDForCancelling := subIDsForCancelling[0] subscription, err := vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForCancelling) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, strconv.FormatUint(subIDForCancelling, 10), vrfContracts.CoordinatorV2) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDsForCancelling...) testWalletAddress, err := actions.GenerateWallet() require.NoError(t, err) testWalletBalanceLinkBeforeSubCancelling, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), testWalletAddress.String()) require.NoError(t, err) subscriptionForCancelling, err := vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForCancelling) require.NoError(t, err, "error getting subscription information") subBalanceLink := subscriptionForCancelling.Balance l.Info(). Str("Subscription Amount Link", subBalanceLink.String()). Uint64("Returning funds from SubID", subIDForCancelling). Str("Returning funds to", testWalletAddress.String()). Msg("Canceling subscription and returning funds to subscription owner") cancellationTx, cancellationEvent, err := vrfContracts.CoordinatorV2.CancelSubscription(subIDForCancelling, testWalletAddress) require.NoError(t, err, "Error canceling subscription") txGasUsed := new(big.Int).SetUint64(cancellationTx.Receipt.GasUsed) // we don't have that information for older Geth versions if cancellationTx.Receipt.EffectiveGasPrice == nil { cancellationTx.Receipt.EffectiveGasPrice = new(big.Int).SetUint64(0) } cancellationTxFeeWei := new(big.Int).Mul(txGasUsed, cancellationTx.Receipt.EffectiveGasPrice) l.Info(). Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String()). Str("Effective Gas Price", cancellationTx.Receipt.EffectiveGasPrice.String()). Uint64("Gas Used", cancellationTx.Receipt.GasUsed). Msg("Cancellation TX Receipt") l.Info(). Str("Returned Subscription Amount Link", cancellationEvent.Amount.String()). Uint64("SubID", cancellationEvent.SubId). Str("Returned to", cancellationEvent.To.String()). Msg("Subscription Canceled Event") require.Equal(t, subBalanceLink, cancellationEvent.Amount, "SubscriptionCanceled event LINK amount is not equal to sub amount while canceling subscription") testWalletBalanceLinkAfterSubCancelling, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), testWalletAddress.String()) require.NoError(t, err) //Verify that sub was deleted from Coordinator _, err = vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForCancelling) require.Error(t, err, "error not occurred when trying to get deleted subscription from old Coordinator after sub migration") subFundsReturnedLinkActual := new(big.Int).Sub(testWalletBalanceLinkAfterSubCancelling, testWalletBalanceLinkBeforeSubCancelling) l.Info(). Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String()). Str("Sub Funds Returned Actual - Link", subFundsReturnedLinkActual.String()). Str("Sub Balance - Link", subBalanceLink.String()). Msg("Sub funds returned") require.Equal(t, 0, subBalanceLink.Cmp(subFundsReturnedLinkActual), "Returned LINK funds are not equal to sub balance that was cancelled") })` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2_test.go: `.SetupNewConsumersAndSubs( testEnv, chainID, vrfContracts.CoordinatorV2, configCopy, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForCancelling)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.LogSubDetails(l, subscription, strconv.FormatUint(subIDForCancelling, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/smoke/vrfv2_test.go: `.FormatUint(subIDForCancelling, 10)` $DIR/integration-tests/smoke/vrfv2_test.go: `.GenerateWallet()` $DIR/integration-tests/smoke/vrfv2_test.go: `.LinkToken.BalanceOf(testcontext.Get(t), testWalletAddress.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForCancelling)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Subscription Amount Link", subBalanceLink.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Uint64("Returning funds from SubID", subIDForCancelling)` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Returning funds to", testWalletAddress.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Msg("Canceling subscription and returning funds to subscription owner")` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.CancelSubscription(subIDForCancelling, testWalletAddress)` $DIR/integration-tests/smoke/vrfv2_test.go: `.SetUint64(cancellationTx.Receipt.GasUsed)` $DIR/integration-tests/smoke/vrfv2_test.go: `.SetUint64(0)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Mul(txGasUsed, cancellationTx.Receipt.EffectiveGasPrice)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Effective Gas Price", cancellationTx.Receipt.EffectiveGasPrice.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.Receipt.EffectiveGasPrice.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Uint64("Gas Used", cancellationTx.Receipt.GasUsed)` $DIR/integration-tests/smoke/vrfv2_test.go: `. Msg("Cancellation TX Receipt")` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Returned Subscription Amount Link", cancellationEvent.Amount.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.Amount.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Uint64("SubID", cancellationEvent.SubId)` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Returned to", cancellationEvent.To.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.To.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Msg("Subscription Canceled Event")` $DIR/integration-tests/smoke/vrfv2_test.go: `.LinkToken.BalanceOf(testcontext.Get(t), testWalletAddress.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForCancelling)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Sub(testWalletBalanceLinkAfterSubCancelling, testWalletBalanceLinkBeforeSubCancelling)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Sub Funds Returned Actual - Link", subFundsReturnedLinkActual.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Sub Balance - Link", subBalanceLink.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Msg("Sub funds returned")` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Ptr(float64(0))` $DIR/integration-tests/smoke/vrfv2_test.go: `.SetupNewConsumersAndSubs( testEnv, chainID, vrfContracts.CoordinatorV2, configCopy, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForOwnerCancelling)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.LogSubDetails(l, subscriptionForCancelling, strconv.FormatUint(subIDForOwnerCancelling, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/smoke/vrfv2_test.go: `.FormatUint(subIDForOwnerCancelling, 10)` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.PendingRequestsExist(testcontext.Get(t), subIDForOwnerCancelling)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.RequestRandomnessAndWaitForFulfillment( l, consumers[0], vrfContracts.CoordinatorV2, subIDForOwnerCancelling, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, randomWordsFulfilledEventTimeout, 0, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.PendingRequestsExist(testcontext.Get(t), subIDForOwnerCancelling)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.LinkToken.BalanceOf(testcontext.Get(t), sethClient.MustGetRootKeyAddress().Hex())` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForOwnerCancelling)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Subscription Amount Link", subBalanceLink.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Uint64("Returning funds from SubID", subIDForOwnerCancelling)` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Returning funds to", sethClient.MustGetRootKeyAddress().Hex())` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Msg("Canceling subscription and returning funds to subscription owner")` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.OwnerCancelSubscription(subIDForOwnerCancelling)` $DIR/integration-tests/smoke/vrfv2_test.go: `.SetUint64(cancellationTx.Receipt.GasUsed)` $DIR/integration-tests/smoke/vrfv2_test.go: `.SetUint64(0)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Mul(txGasUsed, cancellationTx.Receipt.EffectiveGasPrice)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Effective Gas Price", cancellationTx.Receipt.EffectiveGasPrice.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.Receipt.EffectiveGasPrice.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Uint64("Gas Used", cancellationTx.Receipt.GasUsed)` $DIR/integration-tests/smoke/vrfv2_test.go: `. Msg("Cancellation TX Receipt")` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Returned Subscription Amount Link", cancellationEvent.Amount.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.Amount.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Uint64("SubID", cancellationEvent.SubId)` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Returned to", cancellationEvent.To.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.To.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Msg("Subscription Canceled Event")` $DIR/integration-tests/smoke/vrfv2_test.go: `.LinkToken.BalanceOf(testcontext.Get(t), sethClient.MustGetRootKeyAddress().Hex())` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForOwnerCancelling)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Expected error message", err.Error())` $DIR/integration-tests/smoke/vrfv2_test.go: `.Sub(walletBalanceLinkAfterSubCancelling, walletBalanceLinkBeforeSubCancelling)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Wallet Balance Before Owner Cancelation", walletBalanceLinkBeforeSubCancelling.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Sub Funds Returned Actual - Link", subFundsReturnedLinkActual.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Sub Balance - Link", subBalanceLink.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Wallet Balance After Owner Cancelation", walletBalanceLinkAfterSubCancelling.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Msg("Sub funds returned")` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetConfig("Smoke", tc.VRFv2)` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustGetSelectedNetworkConfig(config.GetNetworkConfig())` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetNetworkConfig()` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Cfg.IsSimulatedNetwork()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Network Name", sethClient.Cfg.Network.Name)` $DIR/integration-tests/smoke/vrfv2_test.go: `. Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2_test.go: `.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Cleanup(test_env.CleanupOpts{TestName: t.Name()})` $DIR/integration-tests/smoke/vrfv2_test.go: `.Name()` $DIR/integration-tests/smoke/vrfv2_test.go: `.SetupVRFV2Universe(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2_test.go: `.SetupNewConsumersAndSubs( testEnv, chainID, vrfContracts.CoordinatorV2, configCopy, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForMultipleSendingKeys)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.LogSubDetails(l, subscriptionForMultipleSendingKeys, strconv.FormatUint(subIDForMultipleSendingKeys, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/smoke/vrfv2_test.go: `.FormatUint(subIDForMultipleSendingKeys, 10)` $DIR/integration-tests/smoke/vrfv2_test.go: `.CLNode.API.ReadTxKeys("evm")` $DIR/integration-tests/smoke/vrfv2_test.go: `.RequestRandomnessAndWaitForFulfillment( l, consumers[0], vrfContracts.CoordinatorV2, subIDForMultipleSendingKeys, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, 0, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Client.TransactionByHash(testcontext.Get(t), randomWordsFulfilledEvent.Raw.TxHash)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetTxFromAddress(fulfillmentTx)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Diff(txKeyAddresses, fulfillmentTxFromAddresses, cmpopts.SortSlices(less))` $DIR/integration-tests/smoke/vrfv2_test.go: `.SortSlices(less)` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetConfig("Smoke", tc.VRFv2)` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustGetSelectedNetworkConfig(config.GetNetworkConfig())` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetNetworkConfig()` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Cfg.IsSimulatedNetwork()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Network Name", sethClient.Cfg.Network.Name)` $DIR/integration-tests/smoke/vrfv2_test.go: `. Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2_test.go: `.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Cleanup(test_env.CleanupOpts{TestName: t.Name()})` $DIR/integration-tests/smoke/vrfv2_test.go: `.Name()` $DIR/integration-tests/smoke/vrfv2_test.go: `.SetupVRFV2Universe(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2_test.go: `.SetupNewConsumersAndSubs( testEnv, chainID, vrfContracts.CoordinatorV2, configCopy, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForForceFulfill)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.LogSubDetails(l, subscriptionForMultipleSendingKeys, strconv.FormatUint(subIDForForceFulfill, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/smoke/vrfv2_test.go: `.FormatUint(subIDForForceFulfill, 10)` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.GetOwner(testcontext.Get(t))` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.LinkToken.Transfer( consumers[0].Address(), conversions.EtherToWei(big.NewFloat(*configCopy.VRFv2.General.SubscriptionFundingAmountLink)), )` $DIR/integration-tests/smoke/vrfv2_test.go: `.Address()` $DIR/integration-tests/smoke/vrfv2_test.go: `.EtherToWei(big.NewFloat(*configCopy.VRFv2.General.SubscriptionFundingAmountLink))` $DIR/integration-tests/smoke/vrfv2_test.go: `.NewFloat(*configCopy.VRFv2.General.SubscriptionFundingAmountLink)` $DIR/integration-tests/smoke/vrfv2_test.go: `.LinkToken.BalanceOf(testcontext.Get(t), consumers[0].Address())` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Address()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Balance", conversions.WeiToEther(consumerLinkBalance).String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.WeiToEther(consumerLinkBalance)` $DIR/integration-tests/smoke/vrfv2_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Consumer", consumers[0].Address())` $DIR/integration-tests/smoke/vrfv2_test.go: `.Address()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Msg("Consumer Link Balance")` $DIR/integration-tests/smoke/vrfv2_test.go: `.MockETHLINKFeed.SetBlockTimestampDeduction(big.NewInt(3))` $DIR/integration-tests/smoke/vrfv2_test.go: `.NewInt(3)` $DIR/integration-tests/smoke/vrfv2_test.go: `.RequestRandomnessWithForceFulfillAndWaitForFulfillment( l, consumers[0], vrfContracts.CoordinatorV2, vrfContracts.VRFOwner, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, conversions.EtherToWei(big.NewFloat(5)), common.HexToAddress(vrfContracts.LinkToken.Address()), time.Minute*2, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.EtherToWei(big.NewFloat(5))` $DIR/integration-tests/smoke/vrfv2_test.go: `.NewFloat(5)` $DIR/integration-tests/smoke/vrfv2_test.go: `.HexToAddress(vrfContracts.LinkToken.Address())` $DIR/integration-tests/smoke/vrfv2_test.go: `.LinkToken.Address()` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetRequestStatus(testcontext.Get(t), randFulfilledEvent.RequestId)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Bool("Fulfilment Status", status.Fulfilled)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Msg("Random Words Request Fulfilment Status")` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Str("Output", w.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Msg("Randomness fulfilled")` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.GetConfig(testcontext.Get(t))` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.GetFeeConfig(testcontext.Get(t))` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.GetFallbackWeiPerUnitLink(testcontext.Get(t))` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetConfig("Smoke", tc.VRFv2)` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustGetSelectedNetworkConfig(config.GetNetworkConfig())` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetNetworkConfig()` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Cfg.IsSimulatedNetwork()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Network Name", sethClient.Cfg.Network.Name)` $DIR/integration-tests/smoke/vrfv2_test.go: `. Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2_test.go: `.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Cleanup(test_env.CleanupOpts{TestName: t.Name()})` $DIR/integration-tests/smoke/vrfv2_test.go: `.Name()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Ptr(2)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Ptr(20)` $DIR/integration-tests/smoke/vrfv2_test.go: `.SetupVRFV2Universe(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Run("BHS Job with complete E2E - wait 256 blocks to see if Rand Request is fulfilled", func(t *testing.T) { if os.Getenv("TEST_UNSKIP") != "true" { t.Skip("Skipped due to long execution time. Should be run on-demand on live testnet with TEST_UNSKIP=\"true\".") } //BHS node should fill in blockhashes into BHS contract depending on the waitBlocks and lookBackBlocks settings configCopy := config.MustCopy().(tc.TestConfig) //Underfund Subscription configCopy.VRFv2.General.SubscriptionFundingAmountLink = ptr.Ptr(float64(0)) consumers, subIDsForBHS, err := vrfv2.SetupNewConsumersAndSubs( testEnv, chainID, vrfContracts.CoordinatorV2, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subIDForBHS := subIDsForBHS[0] subscriptionForBHS, err := vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForBHS) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscriptionForBHS, strconv.FormatUint(subIDForBHS, 10), vrfContracts.CoordinatorV2) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDsForBHS...) randomWordsRequestedEvent, err := vrfv2.RequestRandomness( l, consumers[0], vrfContracts.CoordinatorV2, subIDForBHS, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, SethRootKeyIndex, ) require.NoError(t, err, "error requesting randomness") vrfcommon.LogRandomnessRequestedEvent(l, vrfContracts.CoordinatorV2, randomWordsRequestedEvent, false, 0) randRequestBlockNumber := randomWordsRequestedEvent.Raw.BlockNumber var wg sync.WaitGroup wg.Add(1) //Wait at least 256 blocks sethClient, err := testEnv.GetSethClient(chainID) require.NoError(t, err, "Getting Seth client shouldn't fail") _, err = actions.WaitForBlockNumberToBe( randRequestBlockNumber+uint64(257), sethClient, &wg, configCopy.VRFv2.General.WaitFor256BlocksTimeout.Duration, t, l, ) wg.Wait() require.NoError(t, err) err = vrfv2.FundSubscriptions(big.NewFloat(*configCopy.VRFv2.General.SubscriptionFundingAmountLink), vrfContracts.LinkToken, vrfContracts.CoordinatorV2, subIDsForBHS) require.NoError(t, err, "error funding subscriptions") randomWordsFulfilledEvent, err := vrfContracts.CoordinatorV2.WaitForRandomWordsFulfilledEvent( contracts.RandomWordsFulfilledEventFilter{ RequestIds: []*big.Int{randomWordsRequestedEvent.RequestId}, Timeout: configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, }, ) require.NoError(t, err, "error waiting for randomness fulfilled event") vrfcommon.LogRandomWordsFulfilledEvent(l, vrfContracts.CoordinatorV2, randomWordsFulfilledEvent, false, 0) status, err := consumers[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId) require.NoError(t, err, "error getting rand request status") require.True(t, status.Fulfilled) l.Info().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status") })` $DIR/integration-tests/smoke/vrfv2_test.go: `.Getenv("TEST_UNSKIP")` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Ptr(float64(0))` $DIR/integration-tests/smoke/vrfv2_test.go: `.SetupNewConsumersAndSubs( testEnv, chainID, vrfContracts.CoordinatorV2, configCopy, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForBHS)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.LogSubDetails(l, subscriptionForBHS, strconv.FormatUint(subIDForBHS, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/smoke/vrfv2_test.go: `.FormatUint(subIDForBHS, 10)` $DIR/integration-tests/smoke/vrfv2_test.go: `.RequestRandomness( l, consumers[0], vrfContracts.CoordinatorV2, subIDForBHS, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, SethRootKeyIndex, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.LogRandomnessRequestedEvent(l, vrfContracts.CoordinatorV2, randomWordsRequestedEvent, false, 0)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Add(1)` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2_test.go: `.WaitForBlockNumberToBe( randRequestBlockNumber+uint64(257), sethClient, &wg, configCopy.VRFv2.General.WaitFor256BlocksTimeout.Duration, t, l, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.Wait()` $DIR/integration-tests/smoke/vrfv2_test.go: `.FundSubscriptions(big.NewFloat(*configCopy.VRFv2.General.SubscriptionFundingAmountLink), vrfContracts.LinkToken, vrfContracts.CoordinatorV2, subIDsForBHS)` $DIR/integration-tests/smoke/vrfv2_test.go: `.NewFloat(*configCopy.VRFv2.General.SubscriptionFundingAmountLink)` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.WaitForRandomWordsFulfilledEvent( contracts.RandomWordsFulfilledEventFilter{ RequestIds: []*big.Int{randomWordsRequestedEvent.RequestId}, Timeout: configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, }, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.LogRandomWordsFulfilledEvent(l, vrfContracts.CoordinatorV2, randomWordsFulfilledEvent, false, 0)` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Bool("Fulfilment Status", status.Fulfilled)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Msg("Random Words Request Fulfilment Status")` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Ptr(float64(0))` $DIR/integration-tests/smoke/vrfv2_test.go: `.SetupNewConsumersAndSubs( testEnv, chainID, vrfContracts.CoordinatorV2, configCopy, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForBHS)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.LogSubDetails(l, subscriptionForBHS, strconv.FormatUint(subIDForBHS, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/smoke/vrfv2_test.go: `.FormatUint(subIDForBHS, 10)` $DIR/integration-tests/smoke/vrfv2_test.go: `.RequestRandomness( l, consumers[0], vrfContracts.CoordinatorV2, subIDForBHS, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, SethRootKeyIndex, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.BHS.GetBlockHash(testcontext.Get(t), big.NewInt(int64(randRequestBlockNumber)))` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.NewInt(int64(randRequestBlockNumber))` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Add(1)` $DIR/integration-tests/smoke/vrfv2_test.go: `.WaitForBlockNumberToBe( randRequestBlockNumber+uint64(*configCopy.VRFv2.General.BHSJobWaitBlocks), sethClient, &wg, time.Minute*1, t, l, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.Wait()` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetLoadTestMetrics(testcontext.Get(t))` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Eventually(func(g gomega.Gomega) { clNodeTxs, _, err = nodeTypeToNodeMap[vrfcommon.BHS].CLNode.API.ReadTransactions() g.Expect(err).ShouldNot(gomega.HaveOccurred(), "error getting CL Node transactions") l.Info().Int("Number of TXs", len(clNodeTxs.Data)).Msg("BHS Node txs") g.Expect(len(clNodeTxs.Data)).Should(gomega.BeNumerically("==", 1), "Expected 1 tx posted by BHS Node, but found %d", len(clNodeTxs.Data)) txHash = clNodeTxs.Data[0].Attributes.Hash }, "2m", "1s")` $DIR/integration-tests/smoke/vrfv2_test.go: `.CLNode.API.ReadTransactions()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Expect(err)` $DIR/integration-tests/smoke/vrfv2_test.go: `.ShouldNot(gomega.HaveOccurred(), "error getting CL Node transactions")` $DIR/integration-tests/smoke/vrfv2_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Int("Number of TXs", len(clNodeTxs.Data))` $DIR/integration-tests/smoke/vrfv2_test.go: `.Msg("BHS Node txs")` $DIR/integration-tests/smoke/vrfv2_test.go: `.Expect(len(clNodeTxs.Data))` $DIR/integration-tests/smoke/vrfv2_test.go: `.Should(gomega.BeNumerically("==", 1), "Expected 1 tx posted by BHS Node, but found %d", len(clNodeTxs.Data))` $DIR/integration-tests/smoke/vrfv2_test.go: `.BeNumerically("==", 1)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/vrfv2_test.go: `.Succeed()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Client.TransactionByHash(testcontext.Get(t), common.HexToHash(txHash))` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.HexToHash(txHash)` $DIR/integration-tests/smoke/vrfv2_test.go: `.DecodeTxInputData(blockhash_store.BlockhashStoreABI, bhsStoreTx.Data())` $DIR/integration-tests/smoke/vrfv2_test.go: `.Data()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Block Number", bhsStoreTxInputData["n"].(*big.Int).String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Msg("BHS Node's Store Blockhash for Blocknumber Method TX")` $DIR/integration-tests/smoke/vrfv2_test.go: `.Eventually(func(g gomega.Gomega) { randRequestBlockHash, err = vrfContracts.BHS.GetBlockHash(testcontext.Get(t), big.NewInt(int64(randRequestBlockNumber))) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "error getting blockhash for a blocknumber which was stored in BHS contract") }, "2m", "1s")` $DIR/integration-tests/smoke/vrfv2_test.go: `.BHS.GetBlockHash(testcontext.Get(t), big.NewInt(int64(randRequestBlockNumber)))` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.NewInt(int64(randRequestBlockNumber))` $DIR/integration-tests/smoke/vrfv2_test.go: `.Expect(err)` $DIR/integration-tests/smoke/vrfv2_test.go: `.ShouldNot(gomega.HaveOccurred(), "error getting blockhash for a blocknumber which was stored in BHS contract")` $DIR/integration-tests/smoke/vrfv2_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/vrfv2_test.go: `.Succeed()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Randomness Request's Blockhash", randomWordsRequestedEvent.Raw.BlockHash.String())` $DIR/integration-tests/smoke/vrfv2_test.go: `.Raw.BlockHash.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Block Hash stored by BHS contract", fmt.Sprintf("0x%x", randRequestBlockHash))` $DIR/integration-tests/smoke/vrfv2_test.go: `.Sprintf("0x%x", randRequestBlockHash)` $DIR/integration-tests/smoke/vrfv2_test.go: `. Msg("BHS Contract's stored Blockhash for Randomness Request")` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetConfig("Smoke", tc.VRFv2)` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustGetSelectedNetworkConfig(config.GetNetworkConfig())` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetNetworkConfig()` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Cfg.IsSimulatedNetwork()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Network Name", sethClient.Cfg.Network.Name)` $DIR/integration-tests/smoke/vrfv2_test.go: `. Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2_test.go: `.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, defaultWalletAddress, subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Cleanup(test_env.CleanupOpts{TestName: t.Name()})` $DIR/integration-tests/smoke/vrfv2_test.go: `.Name()` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetDefaultChainlinkNodeLogScannerSettingsWithExtraAllowedMessages( testreporters.NewAllowedLogMessage( "This is a problem and either means a very deep re-org occurred", "Test is expecting a reorg to occur", zapcore.DPanicLevel, testreporters.WarnAboutAllowedMsgs_No), testreporters.NewAllowedLogMessage( "Reorg greater than finality depth detected", "Test is expecting a reorg to occur", zapcore.DPanicLevel, testreporters.WarnAboutAllowedMsgs_No), )` $DIR/integration-tests/smoke/vrfv2_test.go: `.NewAllowedLogMessage( "This is a problem and either means a very deep re-org occurred", "Test is expecting a reorg to occur", zapcore.DPanicLevel, testreporters.WarnAboutAllowedMsgs_No)` $DIR/integration-tests/smoke/vrfv2_test.go: `.NewAllowedLogMessage( "Reorg greater than finality depth detected", "Test is expecting a reorg to occur", zapcore.DPanicLevel, testreporters.WarnAboutAllowedMsgs_No)` $DIR/integration-tests/smoke/vrfv2_test.go: `.SetupVRFV2Universe(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2_test.go: `.SetupNewConsumersAndSubs( env, chainID, vrfContracts.CoordinatorV2, config, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.LogSubDetails(l, subscription, strconv.FormatUint(subID, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/smoke/vrfv2_test.go: `.FormatUint(subID, 10)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Run("Reorg on fulfillment", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) configCopy.VRFv2.General.MinimumConfirmations = ptr.Ptr[uint16](10) //1. request randomness and wait for fulfillment for blockhash from Reorged Fork randomWordsRequestedEvent, randomWordsFulfilledEventOnReorgedFork, err := vrfv2.RequestRandomnessAndWaitForFulfillment( l, consumers[0], vrfContracts.CoordinatorV2, subID, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, 0, ) require.NoError(t, err) // rewind chain to block number after the request was made, but before the request was fulfilled rewindChainToBlock := randomWordsRequestedEvent.Raw.BlockNumber + 1 rpcUrl, err := actions.GetRPCUrl(env, chainID) require.NoError(t, err, "error getting rpc url") //2. rewind chain by n number of blocks - basically, mimicking reorg scenario latestBlockNumberAfterReorg, err := actions.RewindSimulatedChainToBlockNumber(testcontext.Get(t), sethClient, rpcUrl, rewindChainToBlock, l) require.NoError(t, err, fmt.Sprintf("error rewinding chain to block number %d", rewindChainToBlock)) //3.1 ensure that chain is reorged and latest block number is greater than the block number when request was made require.Greater(t, latestBlockNumberAfterReorg, randomWordsRequestedEvent.Raw.BlockNumber) //3.2 ensure that chain is reorged and latest block number is less than the block number when fulfilment was performed require.Less(t, latestBlockNumberAfterReorg, randomWordsFulfilledEventOnReorgedFork.Raw.BlockNumber) //4. wait for the fulfillment which VRF Node will generate for Canonical chain _, err = vrfv2.WaitRandomWordsFulfilledEvent( vrfContracts.CoordinatorV2, randomWordsRequestedEvent.RequestId, randomWordsRequestedEvent.Raw.BlockNumber, configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, l, ) require.NoError(t, err, "error waiting for randomness fulfilled event") })` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2_test.go: `.RequestRandomnessAndWaitForFulfillment( l, consumers[0], vrfContracts.CoordinatorV2, subID, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, 0, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetRPCUrl(env, chainID)` $DIR/integration-tests/smoke/vrfv2_test.go: `.RewindSimulatedChainToBlockNumber(testcontext.Get(t), sethClient, rpcUrl, rewindChainToBlock, l)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.WaitRandomWordsFulfilledEvent( vrfContracts.CoordinatorV2, randomWordsRequestedEvent.RequestId, randomWordsRequestedEvent.Raw.BlockNumber, configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, l, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2_test.go: `.RequestRandomness( l, consumers[0], vrfContracts.CoordinatorV2, subID, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, SethRootKeyIndex, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetRPCUrl(env, chainID)` $DIR/integration-tests/smoke/vrfv2_test.go: `.RewindSimulatedChainToBlockNumber(testcontext.Get(t), sethClient, rpcUrl, rewindChainToBlockNumber, l)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.WaitForRandomWordsFulfilledEvent( contracts.RandomWordsFulfilledEventFilter{ RequestIds: []*big.Int{randomWordsRequestedEvent.RequestId}, Timeout: time.Second * 10, }, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetConfig("Smoke", tc.VRFv2)` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustGetSelectedNetworkConfig(config.GetNetworkConfig())` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetNetworkConfig()` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Cfg.IsSimulatedNetwork()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Network Name", sethClient.Cfg.Network.Name)` $DIR/integration-tests/smoke/vrfv2_test.go: `. Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2_test.go: `.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, defaultWalletAddress, subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Cleanup(test_env.CleanupOpts{TestName: t.Name()})` $DIR/integration-tests/smoke/vrfv2_test.go: `.Name()` $DIR/integration-tests/smoke/vrfv2_test.go: `.SetupVRFV2Universe(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Ptr(uint32(500_000))` $DIR/integration-tests/smoke/vrfv2_test.go: `.Run("Batch Fulfillment Enabled", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) vrfNode, exists := nodeTypeToNodeMap[vrfcommon.VRF] require.True(t, exists, "VRF Node does not exist") //ensure that no job present on the node err = actions.DeleteJobs([]*client.ChainlinkClient{vrfNode.CLNode.API}) require.NoError(t, err) batchFullfillmentEnabled := true // create job with batch fulfillment enabled vrfJobSpecConfig := vrfcommon.VRFJobSpecConfig{ ForwardingAllowed: *configCopy.VRFv2.General.VRFJobForwardingAllowed, CoordinatorAddress: vrfContracts.CoordinatorV2.Address(), BatchCoordinatorAddress: vrfContracts.BatchCoordinatorV2.Address(), FromAddresses: vrfNode.TXKeyAddressStrings, EVMChainID: fmt.Sprint(chainID), MinIncomingConfirmations: int(*configCopy.VRFv2.General.MinimumConfirmations), PublicKey: vrfKey.PubKeyCompressed, EstimateGasMultiplier: *configCopy.VRFv2.General.VRFJobEstimateGasMultiplier, BatchFulfillmentEnabled: batchFullfillmentEnabled, BatchFulfillmentGasMultiplier: *configCopy.VRFv2.General.VRFJobBatchFulfillmentGasMultiplier, PollPeriod: configCopy.VRFv2.General.VRFJobPollPeriod.Duration, RequestTimeout: configCopy.VRFv2.General.VRFJobRequestTimeout.Duration, SimulationBlock: configCopy.VRFv2.General.VRFJobSimulationBlock, VRFOwnerConfig: &vrfcommon.VRFOwnerConfig{ UseVRFOwner: false, }, } l.Info(). Msg("Creating VRFV2 Job with `batchFulfillmentEnabled = true`") job, err := vrfv2.CreateVRFV2Job( vrfNode.CLNode.API, vrfJobSpecConfig, ) require.NoError(t, err, "error creating job with higher timeout") vrfNode.Job = job consumers, subIDs, err := vrfv2.SetupNewConsumersAndSubs( env, chainID, vrfContracts.CoordinatorV2, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subID := subIDs[0] subscription, err := vrfContracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, strconv.FormatUint(subID, 10), vrfContracts.CoordinatorV2) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...) configCopy.VRFv2.General.RandomnessRequestCountPerRequest = ptr.Ptr(uint16(randRequestCount)) // test and assert _, randomWordsFulfilledEvent, err := vrfv2.RequestRandomnessAndWaitForFulfillment( l, consumers[0], vrfContracts.CoordinatorV2, subID, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, 0, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") var wgAllRequestsFulfilled sync.WaitGroup wgAllRequestsFulfilled.Add(1) requestCount, fulfilmentCount, err := vrfcommon.WaitForRequestCountEqualToFulfilmentCount(testcontext.Get(t), consumers[0], 2*time.Minute, &wgAllRequestsFulfilled) require.NoError(t, err) wgAllRequestsFulfilled.Wait() l.Info(). Interface("Request Count", requestCount). Interface("Fulfilment Count", fulfilmentCount). Msg("Request/Fulfilment Stats") clNodeTxs, resp, err := nodeTypeToNodeMap[vrfcommon.VRF].CLNode.API.ReadTransactions() require.NoError(t, err) require.Equal(t, 200, resp.StatusCode) var batchFulfillmentTxs []client.TransactionData for _, tx := range clNodeTxs.Data { if common.HexToAddress(tx.Attributes.To).Cmp(common.HexToAddress(vrfContracts.BatchCoordinatorV2.Address())) == 0 { batchFulfillmentTxs = append(batchFulfillmentTxs, tx) } } // verify that all fulfillments should be inside one tx require.Equal(t, 1, len(batchFulfillmentTxs)) fulfillmentTx, _, err := sethClient.Client.TransactionByHash(testcontext.Get(t), randomWordsFulfilledEvent.Raw.TxHash) require.NoError(t, err, "error getting tx from hash") fulfillmentTXToAddress := fulfillmentTx.To().String() l.Info(). Str("Actual Fulfillment Tx To Address", fulfillmentTXToAddress). Str("BatchCoordinatorV2 Address", vrfContracts.BatchCoordinatorV2.Address()). Msg("Fulfillment Tx To Address should be the BatchCoordinatorV2 Address when batch fulfillment is enabled") // verify that VRF node sends fulfillments via BatchCoordinator contract require.Equal(t, vrfContracts.BatchCoordinatorV2.Address(), fulfillmentTXToAddress, "Fulfillment Tx To Address should be the BatchCoordinatorV2 Address when batch fulfillment is enabled") // verify that all fulfillments should be inside one tx // This check is disabled for live testnets since each testnet has different gas usage for similar tx if network.Simulated { fulfillmentTxReceipt, err := sethClient.Client.TransactionReceipt(testcontext.Get(t), fulfillmentTx.Hash()) require.NoError(t, err) randomWordsFulfilledLogs, err := contracts.ParseRandomWordsFulfilledLogs(vrfContracts.CoordinatorV2, fulfillmentTxReceipt.Logs) require.NoError(t, err) require.Equal(t, 1, len(batchFulfillmentTxs)) require.Equal(t, int(randRequestCount), len(randomWordsFulfilledLogs)) } })` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2_test.go: `.DeleteJobs([]*client.ChainlinkClient{vrfNode.CLNode.API})` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.Address()` $DIR/integration-tests/smoke/vrfv2_test.go: `.BatchCoordinatorV2.Address()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Sprint(chainID)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Msg("Creating VRFV2 Job with `batchFulfillmentEnabled = true`")` $DIR/integration-tests/smoke/vrfv2_test.go: `.CreateVRFV2Job( vrfNode.CLNode.API, vrfJobSpecConfig, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.SetupNewConsumersAndSubs( env, chainID, vrfContracts.CoordinatorV2, configCopy, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.LogSubDetails(l, subscription, strconv.FormatUint(subID, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/smoke/vrfv2_test.go: `.FormatUint(subID, 10)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Ptr(uint16(randRequestCount))` $DIR/integration-tests/smoke/vrfv2_test.go: `.RequestRandomnessAndWaitForFulfillment( l, consumers[0], vrfContracts.CoordinatorV2, subID, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, 0, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.Add(1)` $DIR/integration-tests/smoke/vrfv2_test.go: `.WaitForRequestCountEqualToFulfilmentCount(testcontext.Get(t), consumers[0], 2*time.Minute, &wgAllRequestsFulfilled)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Wait()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Interface("Request Count", requestCount)` $DIR/integration-tests/smoke/vrfv2_test.go: `. Interface("Fulfilment Count", fulfilmentCount)` $DIR/integration-tests/smoke/vrfv2_test.go: `. Msg("Request/Fulfilment Stats")` $DIR/integration-tests/smoke/vrfv2_test.go: `.CLNode.API.ReadTransactions()` $DIR/integration-tests/smoke/vrfv2_test.go: `.HexToAddress(tx.Attributes.To)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Cmp(common.HexToAddress(vrfContracts.BatchCoordinatorV2.Address()))` $DIR/integration-tests/smoke/vrfv2_test.go: `.HexToAddress(vrfContracts.BatchCoordinatorV2.Address())` $DIR/integration-tests/smoke/vrfv2_test.go: `.BatchCoordinatorV2.Address()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Client.TransactionByHash(testcontext.Get(t), randomWordsFulfilledEvent.Raw.TxHash)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.To()` $DIR/integration-tests/smoke/vrfv2_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Actual Fulfillment Tx To Address", fulfillmentTXToAddress)` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("BatchCoordinatorV2 Address", vrfContracts.BatchCoordinatorV2.Address())` $DIR/integration-tests/smoke/vrfv2_test.go: `.BatchCoordinatorV2.Address()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Msg("Fulfillment Tx To Address should be the BatchCoordinatorV2 Address when batch fulfillment is enabled")` $DIR/integration-tests/smoke/vrfv2_test.go: `.Client.TransactionReceipt(testcontext.Get(t), fulfillmentTx.Hash())` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Hash()` $DIR/integration-tests/smoke/vrfv2_test.go: `.ParseRandomWordsFulfilledLogs(vrfContracts.CoordinatorV2, fulfillmentTxReceipt.Logs)` $DIR/integration-tests/smoke/vrfv2_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2_test.go: `.DeleteJobs([]*client.ChainlinkClient{vrfNode.CLNode.API})` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.Address()` $DIR/integration-tests/smoke/vrfv2_test.go: `.BatchCoordinatorV2.Address()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Sprint(chainID)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Msg("Creating VRFV2 Job with `batchFulfillmentEnabled = false`")` $DIR/integration-tests/smoke/vrfv2_test.go: `.CreateVRFV2Job( vrfNode.CLNode.API, vrfJobSpecConfig, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.SetupNewConsumersAndSubs( env, chainID, vrfContracts.CoordinatorV2, configCopy, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.LogSubDetails(l, subscription, strconv.FormatUint(subID, 10), vrfContracts.CoordinatorV2)` $DIR/integration-tests/smoke/vrfv2_test.go: `.FormatUint(subID, 10)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Ptr(uint16(randRequestCount))` $DIR/integration-tests/smoke/vrfv2_test.go: `.RequestRandomnessAndWaitForFulfillment( l, consumers[0], vrfContracts.CoordinatorV2, subID, vrfKey, *configCopy.VRFv2.General.MinimumConfirmations, *configCopy.VRFv2.General.CallbackGasLimit, *configCopy.VRFv2.General.NumberOfWords, *configCopy.VRFv2.General.RandomnessRequestCountPerRequest, *configCopy.VRFv2.General.RandomnessRequestCountPerRequestDeviation, configCopy.VRFv2.General.RandomWordsFulfilledEventTimeout.Duration, 0, )` $DIR/integration-tests/smoke/vrfv2_test.go: `.Add(1)` $DIR/integration-tests/smoke/vrfv2_test.go: `.WaitForRequestCountEqualToFulfilmentCount(testcontext.Get(t), consumers[0], 2*time.Minute, &wgAllRequestsFulfilled)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Wait()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Interface("Request Count", requestCount)` $DIR/integration-tests/smoke/vrfv2_test.go: `. Interface("Fulfilment Count", fulfilmentCount)` $DIR/integration-tests/smoke/vrfv2_test.go: `. Msg("Request/Fulfilment Stats")` $DIR/integration-tests/smoke/vrfv2_test.go: `.Client.TransactionByHash(testcontext.Get(t), randomWordsFulfilledEvent.Raw.TxHash)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2_test.go: `.To()` $DIR/integration-tests/smoke/vrfv2_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("Actual Fulfillment Tx To Address", fulfillmentTXToAddress)` $DIR/integration-tests/smoke/vrfv2_test.go: `. Str("CoordinatorV2 Address", vrfContracts.CoordinatorV2.Address())` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.Address()` $DIR/integration-tests/smoke/vrfv2_test.go: `. Msg("Fulfillment Tx To Address should be the CoordinatorV2 Address when batch fulfillment is disabled")` $DIR/integration-tests/smoke/vrfv2_test.go: `.CLNode.API.ReadTransactions()` $DIR/integration-tests/smoke/vrfv2_test.go: `.HexToAddress(tx.Attributes.To)` $DIR/integration-tests/smoke/vrfv2_test.go: `.Cmp(common.HexToAddress(vrfContracts.CoordinatorV2.Address()))` $DIR/integration-tests/smoke/vrfv2_test.go: `.HexToAddress(vrfContracts.CoordinatorV2.Address())` $DIR/integration-tests/smoke/vrfv2_test.go: `.CoordinatorV2.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Str("Network Name", sethClient.Cfg.Network.Name). Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfv2plus.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `env, vrfContracts, vrfKey, nodeTypeToNodeMap, err = vrfv2plus.SetupVRFV2PlusUniverse(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `t.Run("Link Billing", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) var isNativeBilling = false consumers, subIDsForRequestRandomness, err := vrfv2plus.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subIDForRequestRandomness := subIDsForRequestRandomness[0] subscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subIDForRequestRandomness) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, subIDForRequestRandomness.String(), vrfContracts.CoordinatorV2Plus) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDsForRequestRandomness...) subBalanceBeforeRequest := subscription.Balance // test and assert _, randomWordsFulfilledEvent, err := vrfv2plus.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subIDForRequestRandomness, isNativeBilling, configCopy.VRFv2Plus.General, l, 0, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") require.False(t, randomWordsFulfilledEvent.OnlyPremium, "RandomWordsFulfilled Event's `OnlyPremium` field should be false") require.Equal(t, isNativeBilling, randomWordsFulfilledEvent.NativePayment, "RandomWordsFulfilled Event's `NativePayment` field should be false") require.True(t, randomWordsFulfilledEvent.Success, "RandomWordsFulfilled Event's `Success` field should be true") expectedSubBalanceJuels := new(big.Int).Sub(subBalanceBeforeRequest, randomWordsFulfilledEvent.Payment) subscription, err = vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subIDForRequestRandomness) require.NoError(t, err, "error getting subscription information") subBalanceAfterRequest := subscription.Balance require.Equal(t, expectedSubBalanceJuels, subBalanceAfterRequest) status, err := consumers[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId) require.NoError(t, err, "error getting rand request status") require.True(t, status.Fulfilled) l.Info().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status") require.Equal(t, *configCopy.VRFv2Plus.General.NumberOfWords, uint32(len(status.RandomWords))) for _, w := range status.RandomWords { l.Info().Str("Output", w.String()).Msg("Randomness fulfilled") require.Equal(t, 1, w.Cmp(big.NewInt(0)), "Expected the VRF job give an answer bigger than 0") } })` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfcommon.LogSubDetails(l, subscription, subIDForRequestRandomness.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDsForRequestRandomness...)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `subscription, err = vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subIDForRequestRandomness)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info().Str("Output", w.String()).Msg("Randomness fulfilled")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `t.Run("Native Billing", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) testConfig := configCopy.VRFv2Plus.General var isNativeBilling = true consumers, subIDs, err := vrfv2plus.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subID := subIDs[0] subscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...) subNativeTokenBalanceBeforeRequest := subscription.NativeBalance // test and assert _, randomWordsFulfilledEvent, err := vrfv2plus.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, isNativeBilling, configCopy.VRFv2Plus.General, l, 0, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") require.False(t, randomWordsFulfilledEvent.OnlyPremium) require.Equal(t, isNativeBilling, randomWordsFulfilledEvent.NativePayment) require.True(t, randomWordsFulfilledEvent.Success) expectedSubBalanceWei := new(big.Int).Sub(subNativeTokenBalanceBeforeRequest, randomWordsFulfilledEvent.Payment) subscription, err = vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err) subBalanceAfterRequest := subscription.NativeBalance require.Equal(t, expectedSubBalanceWei, subBalanceAfterRequest) status, err := consumers[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId) require.NoError(t, err, "error getting rand request status") require.True(t, status.Fulfilled) l.Info().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status") require.Equal(t, *testConfig.NumberOfWords, uint32(len(status.RandomWords))) for _, w := range status.RandomWords { l.Info().Str("Output", w.String()).Msg("Randomness fulfilled") require.Equal(t, 1, w.Cmp(big.NewInt(0)), "Expected the VRF job give an answer bigger than 0") } })` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `subscription, err = vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info().Str("Output", w.String()).Msg("Randomness fulfilled")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `t.Run("VRF Node waits block confirmation number specified by the consumer before sending fulfilment on-chain", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) testConfig := configCopy.VRFv2Plus.General var isNativeBilling = true consumers, subIDs, err := vrfv2plus.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subID := subIDs[0] subscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...) expectedBlockNumberWait := uint16(10) testConfig.MinimumConfirmations = ptr.Ptr[uint16](expectedBlockNumberWait) randomWordsRequestedEvent, randomWordsFulfilledEvent, err := vrfv2plus.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, isNativeBilling, testConfig, l, 0, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") // check that VRF node waited at least the number of blocks specified by the consumer in the rand request min confs field blockNumberWait := randomWordsRequestedEvent.Raw.BlockNumber - randomWordsFulfilledEvent.Raw.BlockNumber require.GreaterOrEqual(t, blockNumberWait, uint64(expectedBlockNumberWait)) status, err := consumers[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId) require.NoError(t, err, "error getting rand request status") require.True(t, status.Fulfilled) l.Info().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status") })` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `testConfig.MinimumConfirmations = ptr.Ptr[uint16](expectedBlockNumberWait)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `t.Run("CL Node VRF Job Runs", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) var isNativeBilling = false consumers, subIDsForRequestRandomness, err := vrfv2plus.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subIDForRequestRandomness := subIDsForRequestRandomness[0] subscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subIDForRequestRandomness) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, subIDForRequestRandomness.String(), vrfContracts.CoordinatorV2Plus) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDsForRequestRandomness...) jobRunsBeforeTest, err := nodeTypeToNodeMap[vrfcommon.VRF].CLNode.API.MustReadRunsByJob(nodeTypeToNodeMap[vrfcommon.VRF].Job.Data.ID) require.NoError(t, err, "error reading job runs") // test and assert _, _, err = vrfv2plus.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subIDForRequestRandomness, isNativeBilling, configCopy.VRFv2Plus.General, l, 0, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") jobRuns, err := nodeTypeToNodeMap[vrfcommon.VRF].CLNode.API.MustReadRunsByJob(nodeTypeToNodeMap[vrfcommon.VRF].Job.Data.ID) require.NoError(t, err, "error reading job runs") require.Equal(t, len(jobRunsBeforeTest.Data)+1, len(jobRuns.Data)) })` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfcommon.LogSubDetails(l, subscription, subIDForRequestRandomness.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDsForRequestRandomness...)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `_, _, err = vrfv2plus.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subIDForRequestRandomness, isNativeBilling, configCopy.VRFv2Plus.General, l, 0, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `t.Run("Direct Funding", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) wrapperContracts, wrapperSubID, err := vrfv2plus.SetupVRFV2PlusWrapperEnvironment( testcontext.Get(t), l, env, chainID, &configCopy, vrfContracts.LinkToken, vrfContracts.MockETHLINKFeed, vrfContracts.CoordinatorV2Plus, vrfKey.KeyHash, 1, ) require.NoError(t, err) t.Run("Link Billing", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) testConfig := configCopy.VRFv2Plus.General var isNativeBilling = false wrapperConsumerJuelsBalanceBeforeRequest, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), wrapperContracts.LoadTestConsumers[0].Address()) require.NoError(t, err, "error getting wrapper consumer balance") wrapperSubscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), wrapperSubID) require.NoError(t, err, "error getting subscription information") subBalanceBeforeRequest := wrapperSubscription.Balance randomWordsFulfilledEvent, err := vrfv2plus.DirectFundingRequestRandomnessAndWaitForFulfillment( wrapperContracts.LoadTestConsumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, wrapperSubID, isNativeBilling, configCopy.VRFv2Plus.General, l, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") expectedSubBalanceJuels := new(big.Int).Sub(subBalanceBeforeRequest, randomWordsFulfilledEvent.Payment) wrapperSubscription, err = vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), wrapperSubID) require.NoError(t, err, "error getting subscription information") subBalanceAfterRequest := wrapperSubscription.Balance require.Equal(t, expectedSubBalanceJuels, subBalanceAfterRequest) consumerStatus, err := wrapperContracts.LoadTestConsumers[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId) require.NoError(t, err, "error getting rand request status") require.True(t, consumerStatus.Fulfilled) expectedWrapperConsumerJuelsBalance := new(big.Int).Sub(wrapperConsumerJuelsBalanceBeforeRequest, consumerStatus.Paid) wrapperConsumerJuelsBalanceAfterRequest, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), wrapperContracts.LoadTestConsumers[0].Address()) require.NoError(t, err, "error getting wrapper consumer balance") require.Equal(t, expectedWrapperConsumerJuelsBalance, wrapperConsumerJuelsBalanceAfterRequest) //todo: uncomment when VRF-651 will be fixed //require.Equal(t, 1, consumerStatus.Paid.Cmp(randomWordsFulfilledEvent.Payment), "Expected Consumer contract pay more than the Coordinator Sub") vrfcommon.LogFulfillmentDetailsLinkBilling(l, wrapperConsumerJuelsBalanceBeforeRequest, wrapperConsumerJuelsBalanceAfterRequest, consumerStatus, randomWordsFulfilledEvent) require.Equal(t, *testConfig.NumberOfWords, uint32(len(consumerStatus.RandomWords))) for _, w := range consumerStatus.RandomWords { l.Info().Str("Output", w.String()).Msg("Randomness fulfilled") require.Equal(t, 1, w.Cmp(big.NewInt(0)), "Expected the VRF job give an answer bigger than 0") } }) t.Run("Native Billing", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) testConfig := configCopy.VRFv2Plus.General var isNativeBilling = true wrapperConsumerBalanceBeforeRequestWei, err := sethClient.Client.BalanceAt(testcontext.Get(t), common.HexToAddress(wrapperContracts.LoadTestConsumers[0].Address()), nil) require.NoError(t, err, "error getting wrapper consumer balance") wrapperSubscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), wrapperSubID) require.NoError(t, err, "error getting subscription information") subBalanceBeforeRequest := wrapperSubscription.NativeBalance randomWordsFulfilledEvent, err := vrfv2plus.DirectFundingRequestRandomnessAndWaitForFulfillment( wrapperContracts.LoadTestConsumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, wrapperSubID, isNativeBilling, configCopy.VRFv2Plus.General, l, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") expectedSubBalanceWei := new(big.Int).Sub(subBalanceBeforeRequest, randomWordsFulfilledEvent.Payment) wrapperSubscription, err = vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), wrapperSubID) require.NoError(t, err, "error getting subscription information") subBalanceAfterRequest := wrapperSubscription.NativeBalance require.Equal(t, expectedSubBalanceWei, subBalanceAfterRequest) consumerStatus, err := wrapperContracts.LoadTestConsumers[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId) require.NoError(t, err, "error getting rand request status") require.True(t, consumerStatus.Fulfilled) expectedWrapperConsumerWeiBalance := new(big.Int).Sub(wrapperConsumerBalanceBeforeRequestWei, consumerStatus.Paid) wrapperConsumerBalanceAfterRequestWei, err := sethClient.Client.BalanceAt(testcontext.Get(t), common.HexToAddress(wrapperContracts.LoadTestConsumers[0].Address()), nil) require.NoError(t, err, "error getting wrapper consumer balance") require.Equal(t, expectedWrapperConsumerWeiBalance, wrapperConsumerBalanceAfterRequestWei) //todo: uncomment when VRF-651 will be fixed //require.Equal(t, 1, consumerStatus.Paid.Cmp(randomWordsFulfilledEvent.Payment), "Expected Consumer contract pay more than the Coordinator Sub") vrfcommon.LogFulfillmentDetailsNativeBilling(l, wrapperConsumerBalanceBeforeRequestWei, wrapperConsumerBalanceAfterRequestWei, consumerStatus, randomWordsFulfilledEvent) require.Equal(t, *testConfig.NumberOfWords, uint32(len(consumerStatus.RandomWords))) for _, w := range consumerStatus.RandomWords { l.Info().Str("Output", w.String()).Msg("Randomness fulfilled") require.Equal(t, 1, w.Cmp(big.NewInt(0)), "Expected the VRF job give an answer bigger than 0") } }) })` $DIR/integration-tests/smoke/vrfv2plus_test.go: `t.Run("Link Billing", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) testConfig := configCopy.VRFv2Plus.General var isNativeBilling = false wrapperConsumerJuelsBalanceBeforeRequest, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), wrapperContracts.LoadTestConsumers[0].Address()) require.NoError(t, err, "error getting wrapper consumer balance") wrapperSubscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), wrapperSubID) require.NoError(t, err, "error getting subscription information") subBalanceBeforeRequest := wrapperSubscription.Balance randomWordsFulfilledEvent, err := vrfv2plus.DirectFundingRequestRandomnessAndWaitForFulfillment( wrapperContracts.LoadTestConsumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, wrapperSubID, isNativeBilling, configCopy.VRFv2Plus.General, l, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") expectedSubBalanceJuels := new(big.Int).Sub(subBalanceBeforeRequest, randomWordsFulfilledEvent.Payment) wrapperSubscription, err = vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), wrapperSubID) require.NoError(t, err, "error getting subscription information") subBalanceAfterRequest := wrapperSubscription.Balance require.Equal(t, expectedSubBalanceJuels, subBalanceAfterRequest) consumerStatus, err := wrapperContracts.LoadTestConsumers[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId) require.NoError(t, err, "error getting rand request status") require.True(t, consumerStatus.Fulfilled) expectedWrapperConsumerJuelsBalance := new(big.Int).Sub(wrapperConsumerJuelsBalanceBeforeRequest, consumerStatus.Paid) wrapperConsumerJuelsBalanceAfterRequest, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), wrapperContracts.LoadTestConsumers[0].Address()) require.NoError(t, err, "error getting wrapper consumer balance") require.Equal(t, expectedWrapperConsumerJuelsBalance, wrapperConsumerJuelsBalanceAfterRequest) //todo: uncomment when VRF-651 will be fixed //require.Equal(t, 1, consumerStatus.Paid.Cmp(randomWordsFulfilledEvent.Payment), "Expected Consumer contract pay more than the Coordinator Sub") vrfcommon.LogFulfillmentDetailsLinkBilling(l, wrapperConsumerJuelsBalanceBeforeRequest, wrapperConsumerJuelsBalanceAfterRequest, consumerStatus, randomWordsFulfilledEvent) require.Equal(t, *testConfig.NumberOfWords, uint32(len(consumerStatus.RandomWords))) for _, w := range consumerStatus.RandomWords { l.Info().Str("Output", w.String()).Msg("Randomness fulfilled") require.Equal(t, 1, w.Cmp(big.NewInt(0)), "Expected the VRF job give an answer bigger than 0") } })` $DIR/integration-tests/smoke/vrfv2plus_test.go: `wrapperSubscription, err = vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), wrapperSubID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfcommon.LogFulfillmentDetailsLinkBilling(l, wrapperConsumerJuelsBalanceBeforeRequest, wrapperConsumerJuelsBalanceAfterRequest, consumerStatus, randomWordsFulfilledEvent)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info().Str("Output", w.String()).Msg("Randomness fulfilled")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `t.Run("Native Billing", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) testConfig := configCopy.VRFv2Plus.General var isNativeBilling = true wrapperConsumerBalanceBeforeRequestWei, err := sethClient.Client.BalanceAt(testcontext.Get(t), common.HexToAddress(wrapperContracts.LoadTestConsumers[0].Address()), nil) require.NoError(t, err, "error getting wrapper consumer balance") wrapperSubscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), wrapperSubID) require.NoError(t, err, "error getting subscription information") subBalanceBeforeRequest := wrapperSubscription.NativeBalance randomWordsFulfilledEvent, err := vrfv2plus.DirectFundingRequestRandomnessAndWaitForFulfillment( wrapperContracts.LoadTestConsumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, wrapperSubID, isNativeBilling, configCopy.VRFv2Plus.General, l, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") expectedSubBalanceWei := new(big.Int).Sub(subBalanceBeforeRequest, randomWordsFulfilledEvent.Payment) wrapperSubscription, err = vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), wrapperSubID) require.NoError(t, err, "error getting subscription information") subBalanceAfterRequest := wrapperSubscription.NativeBalance require.Equal(t, expectedSubBalanceWei, subBalanceAfterRequest) consumerStatus, err := wrapperContracts.LoadTestConsumers[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId) require.NoError(t, err, "error getting rand request status") require.True(t, consumerStatus.Fulfilled) expectedWrapperConsumerWeiBalance := new(big.Int).Sub(wrapperConsumerBalanceBeforeRequestWei, consumerStatus.Paid) wrapperConsumerBalanceAfterRequestWei, err := sethClient.Client.BalanceAt(testcontext.Get(t), common.HexToAddress(wrapperContracts.LoadTestConsumers[0].Address()), nil) require.NoError(t, err, "error getting wrapper consumer balance") require.Equal(t, expectedWrapperConsumerWeiBalance, wrapperConsumerBalanceAfterRequestWei) //todo: uncomment when VRF-651 will be fixed //require.Equal(t, 1, consumerStatus.Paid.Cmp(randomWordsFulfilledEvent.Payment), "Expected Consumer contract pay more than the Coordinator Sub") vrfcommon.LogFulfillmentDetailsNativeBilling(l, wrapperConsumerBalanceBeforeRequestWei, wrapperConsumerBalanceAfterRequestWei, consumerStatus, randomWordsFulfilledEvent) require.Equal(t, *testConfig.NumberOfWords, uint32(len(consumerStatus.RandomWords))) for _, w := range consumerStatus.RandomWords { l.Info().Str("Output", w.String()).Msg("Randomness fulfilled") require.Equal(t, 1, w.Cmp(big.NewInt(0)), "Expected the VRF job give an answer bigger than 0") } })` $DIR/integration-tests/smoke/vrfv2plus_test.go: `wrapperSubscription, err = vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), wrapperSubID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfcommon.LogFulfillmentDetailsNativeBilling(l, wrapperConsumerBalanceBeforeRequestWei, wrapperConsumerBalanceAfterRequestWei, consumerStatus, randomWordsFulfilledEvent)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info().Str("Output", w.String()).Msg("Randomness fulfilled")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `t.Run("Canceling Sub And Returning Funds", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) _, subIDs, err := vrfv2plus.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subID := subIDs[0] subscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...) testWalletAddress, err := actions.GenerateWallet() require.NoError(t, err) testWalletBalanceNativeBeforeSubCancelling, err := sethClient.Client.BalanceAt(testcontext.Get(t), testWalletAddress, nil) require.NoError(t, err) testWalletBalanceLinkBeforeSubCancelling, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), testWalletAddress.String()) require.NoError(t, err) subscriptionForCancelling, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err, "error getting subscription information") subBalanceLink := subscriptionForCancelling.Balance subBalanceNative := subscriptionForCancelling.NativeBalance l.Info(). Str("Subscription Amount Native", subBalanceNative.String()). Str("Subscription Amount Link", subBalanceLink.String()). Str("Returning funds from SubID", subID.String()). Str("Returning funds to", testWalletAddress.String()). Msg("Canceling subscription and returning funds to subscription owner") cancellationTx, cancellationEvent, err := vrfContracts.CoordinatorV2Plus.CancelSubscription(subID, testWalletAddress) require.NoError(t, err, "Error canceling subscription") txGasUsed := new(big.Int).SetUint64(cancellationTx.Receipt.GasUsed) // we don't have that information for older Geth versions if cancellationTx.Receipt.EffectiveGasPrice == nil { cancellationTx.Receipt.EffectiveGasPrice = new(big.Int).SetUint64(0) } cancellationTxFeeWei := new(big.Int).Mul(txGasUsed, cancellationTx.Receipt.EffectiveGasPrice) l.Info(). Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String()). Str("Effective Gas Price", cancellationTx.Receipt.EffectiveGasPrice.String()). Uint64("Gas Used", cancellationTx.Receipt.GasUsed). Msg("Cancellation TX Receipt") l.Info(). Str("Returned Subscription Amount Native", cancellationEvent.AmountLink.String()). Str("Returned Subscription Amount Link", cancellationEvent.AmountLink.String()). Str("SubID", cancellationEvent.SubId.String()). Str("Returned to", cancellationEvent.To.String()). Msg("Subscription Canceled Event") require.Equal(t, subBalanceNative, cancellationEvent.AmountNative, "SubscriptionCanceled event native amount is not equal to sub amount while canceling subscription") require.Equal(t, subBalanceLink, cancellationEvent.AmountLink, "SubscriptionCanceled event LINK amount is not equal to sub amount while canceling subscription") testWalletBalanceNativeAfterSubCancelling, err := sethClient.Client.BalanceAt(testcontext.Get(t), testWalletAddress, nil) require.NoError(t, err) testWalletBalanceLinkAfterSubCancelling, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), testWalletAddress.String()) require.NoError(t, err) //Verify that sub was deleted from Coordinator _, err = vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.Error(t, err, "error not occurred when trying to get deleted subscription from old Coordinator after sub migration") subFundsReturnedNativeActual := new(big.Int).Sub(testWalletBalanceNativeAfterSubCancelling, testWalletBalanceNativeBeforeSubCancelling) subFundsReturnedLinkActual := new(big.Int).Sub(testWalletBalanceLinkAfterSubCancelling, testWalletBalanceLinkBeforeSubCancelling) subFundsReturnedNativeExpected := new(big.Int).Sub(subBalanceNative, cancellationTxFeeWei) deltaSpentOnCancellationTxFee := new(big.Int).Sub(subBalanceNative, subFundsReturnedNativeActual) l.Info(). Str("Sub Balance - Native", subBalanceNative.String()). Str("Delta Spent On Cancellation Tx Fee - `NativeBalance - subFundsReturnedNativeActual`", deltaSpentOnCancellationTxFee.String()). Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String()). Str("Sub Funds Returned Actual - Native", subFundsReturnedNativeActual.String()). Str("Sub Funds Returned Expected - `NativeBalance - cancellationTxFeeWei`", subFundsReturnedNativeExpected.String()). Str("Sub Funds Returned Actual - Link", subFundsReturnedLinkActual.String()). Str("Sub Balance - Link", subBalanceLink.String()). Msg("Sub funds returned") //todo - this fails on SIMULATED env as tx cost is calculated different as for testnets and it's not receipt.EffectiveGasPrice*receipt.GasUsed //require.Equal(t, subFundsReturnedNativeExpected, subFundsReturnedNativeActual, "Returned funds are not equal to sub balance that was cancelled") require.Equal(t, 1, testWalletBalanceNativeAfterSubCancelling.Cmp(testWalletBalanceNativeBeforeSubCancelling), "Native funds were not returned after sub cancellation") require.Equal(t, 0, subBalanceLink.Cmp(subFundsReturnedLinkActual), "Returned LINK funds are not equal to sub balance that was cancelled") })` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Str("Subscription Amount Native", subBalanceNative.String()). Str("Subscription Amount Link", subBalanceLink.String()). Str("Returning funds from SubID", subID.String()). Str("Returning funds to", testWalletAddress.String()). Msg("Canceling subscription and returning funds to subscription owner")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `cancellationTx.Receipt.EffectiveGasPrice = new(big.Int).SetUint64(0)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String()). Str("Effective Gas Price", cancellationTx.Receipt.EffectiveGasPrice.String()). Uint64("Gas Used", cancellationTx.Receipt.GasUsed). Msg("Cancellation TX Receipt")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Str("Returned Subscription Amount Native", cancellationEvent.AmountLink.String()). Str("Returned Subscription Amount Link", cancellationEvent.AmountLink.String()). Str("SubID", cancellationEvent.SubId.String()). Str("Returned to", cancellationEvent.To.String()). Msg("Subscription Canceled Event")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `_, err = vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Str("Sub Balance - Native", subBalanceNative.String()). Str("Delta Spent On Cancellation Tx Fee - `NativeBalance - subFundsReturnedNativeActual`", deltaSpentOnCancellationTxFee.String()). Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String()). Str("Sub Funds Returned Actual - Native", subFundsReturnedNativeActual.String()). Str("Sub Funds Returned Expected - `NativeBalance - cancellationTxFeeWei`", subFundsReturnedNativeExpected.String()). Str("Sub Funds Returned Actual - Link", subFundsReturnedLinkActual.String()). Str("Sub Balance - Link", subBalanceLink.String()). Msg("Sub funds returned")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `t.Run("Owner Canceling Sub And Returning Funds While Having Pending Requests", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) testConfig := configCopy.VRFv2Plus.General //underfund subs in order rand fulfillments to fail testConfig.SubscriptionFundingAmountNative = ptr.Ptr(float64(0)) testConfig.SubscriptionFundingAmountLink = ptr.Ptr(float64(0)) consumers, subIDs, err := vrfv2plus.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subID := subIDs[0] subscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...) activeSubscriptionIdsBeforeSubCancellation, err := vrfContracts.CoordinatorV2Plus.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0)) require.NoError(t, err) require.True(t, it_utils.BigIntSliceContains(activeSubscriptionIdsBeforeSubCancellation, subID)) pendingRequestsExist, err := vrfContracts.CoordinatorV2Plus.PendingRequestsExist(testcontext.Get(t), subID) require.NoError(t, err) require.False(t, pendingRequestsExist, "Pending requests should not exist") configCopy.VRFv2Plus.General.RandomWordsFulfilledEventTimeout = ptr.Ptr(blockchain.StrDuration{Duration: 5 * time.Second}) _, _, err = vrfv2plus.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, false, configCopy.VRFv2Plus.General, l, 0, ) require.Error(t, err, "error should occur for waiting for fulfilment due to low sub balance") _, _, err = vrfv2plus.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, true, configCopy.VRFv2Plus.General, l, 0, ) require.Error(t, err, "error should occur for waiting for fulfilment due to low sub balance") pendingRequestsExist, err = vrfContracts.CoordinatorV2Plus.PendingRequestsExist(testcontext.Get(t), subID) require.NoError(t, err) require.True(t, pendingRequestsExist, "Pending requests should exist after unfulfilled rand requests due to low sub balance") walletBalanceNativeBeforeSubCancelling, err := sethClient.Client.BalanceAt(testcontext.Get(t), common.HexToAddress(sethClient.MustGetRootKeyAddress().Hex()), nil) require.NoError(t, err) walletBalanceLinkBeforeSubCancelling, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), sethClient.MustGetRootKeyAddress().Hex()) require.NoError(t, err) subscriptionForCancelling, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err, "error getting subscription information") subBalanceLink := subscriptionForCancelling.Balance subBalanceNative := subscriptionForCancelling.NativeBalance l.Info(). Str("Subscription Amount Native", subBalanceNative.String()). Str("Subscription Amount Link", subBalanceLink.String()). Str("Returning funds from SubID", subID.String()). Str("Returning funds to", sethClient.MustGetRootKeyAddress().Hex()). Msg("Canceling subscription and returning funds to subscription owner") cancellationTx, cancellationEvent, err := vrfContracts.CoordinatorV2Plus.OwnerCancelSubscription(subID) require.NoError(t, err, "Error canceling subscription") txGasUsed := new(big.Int).SetUint64(cancellationTx.Receipt.GasUsed) // we don't have that information for older Geth versions if cancellationTx.Receipt.EffectiveGasPrice == nil { cancellationTx.Receipt.EffectiveGasPrice = new(big.Int).SetUint64(0) } cancellationTxFeeWei := new(big.Int).Mul(txGasUsed, cancellationTx.Receipt.EffectiveGasPrice) l.Info(). Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String()). Str("Effective Gas Price", cancellationTx.Receipt.EffectiveGasPrice.String()). Uint64("Gas Used", cancellationTx.Receipt.GasUsed). Msg("Cancellation TX Receipt") l.Info(). Str("Returned Subscription Amount Native", cancellationEvent.AmountNative.String()). Str("Returned Subscription Amount Link", cancellationEvent.AmountLink.String()). Str("SubID", cancellationEvent.SubId.String()). Str("Returned to", cancellationEvent.To.String()). Msg("Subscription Canceled Event") require.Equal(t, subBalanceNative, cancellationEvent.AmountNative, "SubscriptionCanceled event native amount is not equal to sub amount while canceling subscription") require.Equal(t, subBalanceLink, cancellationEvent.AmountLink, "SubscriptionCanceled event LINK amount is not equal to sub amount while canceling subscription") walletBalanceNativeAfterSubCancelling, err := sethClient.Client.BalanceAt(testcontext.Get(t), common.HexToAddress(sethClient.MustGetRootKeyAddress().Hex()), nil) require.NoError(t, err) walletBalanceLinkAfterSubCancelling, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), sethClient.MustGetRootKeyAddress().Hex()) require.NoError(t, err) //Verify that sub was deleted from Coordinator _, err = vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.Error(t, err, "error not occurred when trying to get deleted subscription from old Coordinator after sub migration") subFundsReturnedNativeActual := new(big.Int).Sub(walletBalanceNativeAfterSubCancelling, walletBalanceNativeBeforeSubCancelling) subFundsReturnedLinkActual := new(big.Int).Sub(walletBalanceLinkAfterSubCancelling, walletBalanceLinkBeforeSubCancelling) subFundsReturnedNativeExpected := new(big.Int).Sub(subBalanceNative, cancellationTxFeeWei) deltaSpentOnCancellationTxFee := new(big.Int).Sub(subBalanceNative, subFundsReturnedNativeActual) l.Info(). Str("Sub Balance - Native", subBalanceNative.String()). Str("Delta Spent On Cancellation Tx Fee - `NativeBalance - subFundsReturnedNativeActual`", deltaSpentOnCancellationTxFee.String()). Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String()). Str("Sub Funds Returned Actual - Native", subFundsReturnedNativeActual.String()). Str("Sub Funds Returned Expected - `NativeBalance - cancellationTxFeeWei`", subFundsReturnedNativeExpected.String()). Str("Sub Funds Returned Actual - Link", subFundsReturnedLinkActual.String()). Str("Sub Balance - Link", subBalanceLink.String()). Str("walletBalanceNativeBeforeSubCancelling", walletBalanceNativeBeforeSubCancelling.String()). Str("walletBalanceNativeAfterSubCancelling", walletBalanceNativeAfterSubCancelling.String()). Msg("Sub funds returned") //todo - need to use different wallet for each test to verify exact amount of Native/LINK returned //todo - as defaultWallet is used in other tests in parallel which might affect the balance - TT-684 //require.Equal(t, 1, walletBalanceNativeAfterSubCancelling.Cmp(walletBalanceNativeBeforeSubCancelling), "Native funds were not returned after sub cancellation") //todo - this fails on SIMULATED env as tx cost is calculated different as for testnets and it's not receipt.EffectiveGasPrice*receipt.GasUsed //require.Equal(t, subFundsReturnedNativeExpected, subFundsReturnedNativeActual, "Returned funds are not equal to sub balance that was cancelled") require.Equal(t, 0, subBalanceLink.Cmp(subFundsReturnedLinkActual), "Returned LINK funds are not equal to sub balance that was cancelled") activeSubscriptionIdsAfterSubCancellation, err := vrfContracts.CoordinatorV2Plus.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0)) require.NoError(t, err, "error getting active subscription ids") require.False( t, it_utils.BigIntSliceContains(activeSubscriptionIdsAfterSubCancellation, subID), "Active subscription ids should not contain sub id after sub cancellation", ) })` $DIR/integration-tests/smoke/vrfv2plus_test.go: `testConfig.SubscriptionFundingAmountNative = ptr.Ptr(float64(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `testConfig.SubscriptionFundingAmountLink = ptr.Ptr(float64(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `configCopy.VRFv2Plus.General.RandomWordsFulfilledEventTimeout = ptr.Ptr(blockchain.StrDuration{Duration: 5 * time.Second})` $DIR/integration-tests/smoke/vrfv2plus_test.go: `_, _, err = vrfv2plus.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, false, configCopy.VRFv2Plus.General, l, 0, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `_, _, err = vrfv2plus.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, true, configCopy.VRFv2Plus.General, l, 0, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `pendingRequestsExist, err = vrfContracts.CoordinatorV2Plus.PendingRequestsExist(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Str("Subscription Amount Native", subBalanceNative.String()). Str("Subscription Amount Link", subBalanceLink.String()). Str("Returning funds from SubID", subID.String()). Str("Returning funds to", sethClient.MustGetRootKeyAddress().Hex()). Msg("Canceling subscription and returning funds to subscription owner")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `cancellationTx.Receipt.EffectiveGasPrice = new(big.Int).SetUint64(0)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String()). Str("Effective Gas Price", cancellationTx.Receipt.EffectiveGasPrice.String()). Uint64("Gas Used", cancellationTx.Receipt.GasUsed). Msg("Cancellation TX Receipt")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Str("Returned Subscription Amount Native", cancellationEvent.AmountNative.String()). Str("Returned Subscription Amount Link", cancellationEvent.AmountLink.String()). Str("SubID", cancellationEvent.SubId.String()). Str("Returned to", cancellationEvent.To.String()). Msg("Subscription Canceled Event")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `_, err = vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Str("Sub Balance - Native", subBalanceNative.String()). Str("Delta Spent On Cancellation Tx Fee - `NativeBalance - subFundsReturnedNativeActual`", deltaSpentOnCancellationTxFee.String()). Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String()). Str("Sub Funds Returned Actual - Native", subFundsReturnedNativeActual.String()). Str("Sub Funds Returned Expected - `NativeBalance - cancellationTxFeeWei`", subFundsReturnedNativeExpected.String()). Str("Sub Funds Returned Actual - Link", subFundsReturnedLinkActual.String()). Str("Sub Balance - Link", subBalanceLink.String()). Str("walletBalanceNativeBeforeSubCancelling", walletBalanceNativeBeforeSubCancelling.String()). Str("walletBalanceNativeAfterSubCancelling", walletBalanceNativeAfterSubCancelling.String()). Msg("Sub funds returned")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Str("Returning to", sethClient.MustGetRootKeyAddress().Hex()). Str("Amount", amountToWithdrawLink.String()). Msg("Invoking Oracle Withdraw for LINK")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `err = vrfContracts.CoordinatorV2Plus.Withdraw( common.HexToAddress(sethClient.MustGetRootKeyAddress().Hex()), )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Str("Returning to", sethClient.MustGetRootKeyAddress().Hex()). Str("Amount", amountToWithdrawNative.String()). Msg("Invoking Oracle Withdraw for Native")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `err = vrfContracts.CoordinatorV2Plus.WithdrawNative( common.HexToAddress(sethClient.MustGetRootKeyAddress().Hex()), )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Str("Network Name", sethClient.Cfg.Network.Name). Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfv2plus.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `env, vrfContracts, vrfKey, nodeTypeToNodeMap, err = vrfv2plus.SetupVRFV2PlusUniverse(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `fulfillmentTxFromAddresses = append(fulfillmentTxFromAddresses, fulfillmentTxFromAddress)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `txKeyAddresses = append(txKeyAddresses, txKey.Attributes.Address)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Str("Network Name", sethClient.Cfg.Network.Name). Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfv2plus.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `env, vrfContracts, vrfKey, nodeTypeToNodeMap, err = vrfv2plus.SetupVRFV2PlusUniverse(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `t.Run("Test migration of Subscription Billing subID", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) consumers, subIDs, err := vrfv2plus.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 2, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subID := subIDs[0] subscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...) activeSubIdsOldCoordinatorBeforeMigration, err := vrfContracts.CoordinatorV2Plus.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0)) require.NoError(t, err, "error occurred getting active sub ids") require.Len(t, activeSubIdsOldCoordinatorBeforeMigration, 1, "Active Sub Ids length is not equal to 1") require.Equal(t, subID, activeSubIdsOldCoordinatorBeforeMigration[0]) oldSubscriptionBeforeMigration, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err, "error getting subscription information") //Migration Process newCoordinator, err := contracts.DeployVRFCoordinatorV2PlusUpgradedVersion(sethClient, vrfContracts.BHS.Address()) require.NoError(t, err, "error deploying VRF CoordinatorV2PlusUpgradedVersion") _, err = vrfv2plus.VRFV2PlusUpgradedVersionRegisterProvingKey(vrfKey.VRFKey, newCoordinator, uint64(assets.GWei(*configCopy.VRFv2Plus.General.CLNodeMaxGasPriceGWei).Int64())) require.NoError(t, err, fmt.Errorf("%s, err: %w", vrfcommon.ErrRegisteringProvingKey, err)) err = newCoordinator.SetConfig( *configCopy.VRFv2Plus.General.MinimumConfirmations, *configCopy.VRFv2Plus.General.MaxGasLimitCoordinatorConfig, *configCopy.VRFv2Plus.General.StalenessSeconds, *configCopy.VRFv2Plus.General.GasAfterPaymentCalculation, big.NewInt(*configCopy.VRFv2Plus.General.LinkNativeFeedResponse), *configCopy.VRFv2Plus.General.FulfillmentFlatFeeNativePPM, *configCopy.VRFv2Plus.General.FulfillmentFlatFeeLinkDiscountPPM, *configCopy.VRFv2Plus.General.NativePremiumPercentage, *configCopy.VRFv2Plus.General.LinkPremiumPercentage, ) require.NoError(t, err) err = newCoordinator.SetLINKAndLINKNativeFeed(vrfContracts.LinkToken.Address(), vrfContracts.MockETHLINKFeed.Address()) require.NoError(t, err, vrfv2plus.ErrSetLinkNativeLinkFeed) vrfJobSpecConfig := vrfcommon.VRFJobSpecConfig{ ForwardingAllowed: *configCopy.VRFv2Plus.General.VRFJobForwardingAllowed, CoordinatorAddress: newCoordinator.Address(), FromAddresses: nodeTypeToNodeMap[vrfcommon.VRF].TXKeyAddressStrings, EVMChainID: fmt.Sprint(chainID), MinIncomingConfirmations: int(*configCopy.VRFv2Plus.General.MinimumConfirmations), PublicKey: vrfKey.VRFKey.Data.ID, EstimateGasMultiplier: *configCopy.VRFv2Plus.General.VRFJobEstimateGasMultiplier, BatchFulfillmentEnabled: false, BatchFulfillmentGasMultiplier: *configCopy.VRFv2Plus.General.VRFJobBatchFulfillmentGasMultiplier, PollPeriod: configCopy.VRFv2Plus.General.VRFJobPollPeriod.Duration, RequestTimeout: configCopy.VRFv2Plus.General.VRFJobRequestTimeout.Duration, SimulationBlock: configCopy.VRFv2Plus.General.VRFJobSimulationBlock, } _, err = vrfv2plus.CreateVRFV2PlusJob( nodeTypeToNodeMap[vrfcommon.VRF].CLNode.API, vrfJobSpecConfig, ) require.NoError(t, err, vrfv2plus.ErrCreateVRFV2PlusJobs) err = vrfContracts.CoordinatorV2Plus.RegisterMigratableCoordinator(newCoordinator.Address()) require.NoError(t, err, "error registering migratable coordinator") oldCoordinatorLinkTotalBalanceBeforeMigration, oldCoordinatorEthTotalBalanceBeforeMigration, err := vrfv2plus.GetCoordinatorTotalBalance(vrfContracts.CoordinatorV2Plus) require.NoError(t, err) migratedCoordinatorLinkTotalBalanceBeforeMigration, migratedCoordinatorEthTotalBalanceBeforeMigration, err := vrfv2plus.GetUpgradedCoordinatorTotalBalance(newCoordinator) require.NoError(t, err) _, migrationCompletedEvent, err := vrfContracts.CoordinatorV2Plus.Migrate(subID, newCoordinator.Address()) require.NoError(t, err, "error migrating sub id ", subID.String(), " from ", vrfContracts.CoordinatorV2Plus.Address(), " to new Coordinator address ", newCoordinator.Address()) vrfv2plus.LogMigrationCompletedEvent(l, migrationCompletedEvent, vrfContracts.CoordinatorV2Plus) oldCoordinatorLinkTotalBalanceAfterMigration, oldCoordinatorEthTotalBalanceAfterMigration, err := vrfv2plus.GetCoordinatorTotalBalance(vrfContracts.CoordinatorV2Plus) require.NoError(t, err) migratedCoordinatorLinkTotalBalanceAfterMigration, migratedCoordinatorEthTotalBalanceAfterMigration, err := vrfv2plus.GetUpgradedCoordinatorTotalBalance(newCoordinator) require.NoError(t, err) migratedSubscription, err := newCoordinator.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err, "error getting subscription information") vrfv2plus.LogSubDetailsAfterMigration(l, newCoordinator, subID, migratedSubscription) //Verify that Coordinators were updated in Consumers for _, consumer := range consumers { coordinatorAddressInConsumerAfterMigration, err := consumer.GetCoordinator(testcontext.Get(t)) require.NoError(t, err, "error getting Coordinator from Consumer contract") require.Equal(t, newCoordinator.Address(), coordinatorAddressInConsumerAfterMigration.String()) l.Info(). Str("Consumer", consumer.Address()). Str("Coordinator", coordinatorAddressInConsumerAfterMigration.String()). Msg("Coordinator Address in Consumer After Migration") } //Verify old and migrated subs require.Equal(t, oldSubscriptionBeforeMigration.NativeBalance, migratedSubscription.NativeBalance) require.Equal(t, oldSubscriptionBeforeMigration.Balance, migratedSubscription.Balance) require.Equal(t, oldSubscriptionBeforeMigration.SubOwner, migratedSubscription.SubOwner) require.Equal(t, oldSubscriptionBeforeMigration.Consumers, migratedSubscription.Consumers) //Verify that old sub was deleted from old Coordinator _, err = vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.Error(t, err, "error not occurred when trying to get deleted subscription from old Coordinator after sub migration") _, err = vrfContracts.CoordinatorV2Plus.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0)) // If (subscription billing), numActiveSub should be 0 after migration in oldCoordinator require.Error(t, err, "error not occurred getting active sub ids. Should occur since it should revert when sub id array is empty") activeSubIdsMigratedCoordinator, err := newCoordinator.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0)) require.NoError(t, err, "error occurred getting active sub ids") require.Len(t, activeSubIdsMigratedCoordinator, 1, "Active Sub Ids length is not equal to 1 for Migrated Coordinator after migration") require.Equal(t, subID, activeSubIdsMigratedCoordinator[0]) //Verify that total balances changed for Link and Eth for new and old coordinator expectedLinkTotalBalanceForMigratedCoordinator := new(big.Int).Add(oldSubscriptionBeforeMigration.Balance, migratedCoordinatorLinkTotalBalanceBeforeMigration) expectedEthTotalBalanceForMigratedCoordinator := new(big.Int).Add(oldSubscriptionBeforeMigration.NativeBalance, migratedCoordinatorEthTotalBalanceBeforeMigration) expectedLinkTotalBalanceForOldCoordinator := new(big.Int).Sub(oldCoordinatorLinkTotalBalanceBeforeMigration, oldSubscriptionBeforeMigration.Balance) expectedEthTotalBalanceForOldCoordinator := new(big.Int).Sub(oldCoordinatorEthTotalBalanceBeforeMigration, oldSubscriptionBeforeMigration.NativeBalance) require.Equal(t, 0, expectedLinkTotalBalanceForMigratedCoordinator.Cmp(migratedCoordinatorLinkTotalBalanceAfterMigration)) require.Equal(t, 0, expectedEthTotalBalanceForMigratedCoordinator.Cmp(migratedCoordinatorEthTotalBalanceAfterMigration)) require.Equal(t, 0, expectedLinkTotalBalanceForOldCoordinator.Cmp(oldCoordinatorLinkTotalBalanceAfterMigration)) require.Equal(t, 0, expectedEthTotalBalanceForOldCoordinator.Cmp(oldCoordinatorEthTotalBalanceAfterMigration)) //Verify rand requests fulfills with Link Token billing _, _, err = vrfv2plus.RequestRandomnessAndWaitForFulfillment( consumers[0], newCoordinator, vrfKey, subID, false, configCopy.VRFv2Plus.General, l, 0, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") //Verify rand requests fulfills with Native Token billing _, _, err = vrfv2plus.RequestRandomnessAndWaitForFulfillment( consumers[1], newCoordinator, vrfKey, subID, true, configCopy.VRFv2Plus.General, l, 0, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") })` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `_, err = vrfv2plus.VRFV2PlusUpgradedVersionRegisterProvingKey(vrfKey.VRFKey, newCoordinator, uint64(assets.GWei(*configCopy.VRFv2Plus.General.CLNodeMaxGasPriceGWei).Int64()))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `err = newCoordinator.SetConfig( *configCopy.VRFv2Plus.General.MinimumConfirmations, *configCopy.VRFv2Plus.General.MaxGasLimitCoordinatorConfig, *configCopy.VRFv2Plus.General.StalenessSeconds, *configCopy.VRFv2Plus.General.GasAfterPaymentCalculation, big.NewInt(*configCopy.VRFv2Plus.General.LinkNativeFeedResponse), *configCopy.VRFv2Plus.General.FulfillmentFlatFeeNativePPM, *configCopy.VRFv2Plus.General.FulfillmentFlatFeeLinkDiscountPPM, *configCopy.VRFv2Plus.General.NativePremiumPercentage, *configCopy.VRFv2Plus.General.LinkPremiumPercentage, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `err = newCoordinator.SetLINKAndLINKNativeFeed(vrfContracts.LinkToken.Address(), vrfContracts.MockETHLINKFeed.Address())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `_, err = vrfv2plus.CreateVRFV2PlusJob( nodeTypeToNodeMap[vrfcommon.VRF].CLNode.API, vrfJobSpecConfig, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `err = vrfContracts.CoordinatorV2Plus.RegisterMigratableCoordinator(newCoordinator.Address())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfv2plus.LogMigrationCompletedEvent(l, migrationCompletedEvent, vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfv2plus.LogSubDetailsAfterMigration(l, newCoordinator, subID, migratedSubscription)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Str("Consumer", consumer.Address()). Str("Coordinator", coordinatorAddressInConsumerAfterMigration.String()). Msg("Coordinator Address in Consumer After Migration")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `_, err = vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `_, err = vrfContracts.CoordinatorV2Plus.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `_, _, err = vrfv2plus.RequestRandomnessAndWaitForFulfillment( consumers[0], newCoordinator, vrfKey, subID, false, configCopy.VRFv2Plus.General, l, 0, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `_, _, err = vrfv2plus.RequestRandomnessAndWaitForFulfillment( consumers[1], newCoordinator, vrfKey, subID, true, configCopy.VRFv2Plus.General, l, 0, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `_, err = vrfv2plus.VRFV2PlusUpgradedVersionRegisterProvingKey(vrfKey.VRFKey, newCoordinator, uint64(assets.GWei(*configCopy.VRFv2Plus.General.CLNodeMaxGasPriceGWei).Int64()))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `err = newCoordinator.SetConfig( *configCopy.VRFv2Plus.General.MinimumConfirmations, *configCopy.VRFv2Plus.General.MaxGasLimitCoordinatorConfig, *configCopy.VRFv2Plus.General.StalenessSeconds, *configCopy.VRFv2Plus.General.GasAfterPaymentCalculation, big.NewInt(*configCopy.VRFv2Plus.General.LinkNativeFeedResponse), *configCopy.VRFv2Plus.General.FulfillmentFlatFeeNativePPM, *configCopy.VRFv2Plus.General.FulfillmentFlatFeeLinkDiscountPPM, *configCopy.VRFv2Plus.General.NativePremiumPercentage, *configCopy.VRFv2Plus.General.LinkPremiumPercentage, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `err = newCoordinator.SetLINKAndLINKNativeFeed(vrfContracts.LinkToken.Address(), vrfContracts.MockETHLINKFeed.Address())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `_, err = vrfv2plus.CreateVRFV2PlusJob( nodeTypeToNodeMap[vrfcommon.VRF].CLNode.API, vrfJobSpecConfig, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `err = vrfContracts.CoordinatorV2Plus.RegisterMigratableCoordinator(newCoordinator.Address())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfv2plus.LogMigrationCompletedEvent(l, migrationCompletedEvent, vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfv2plus.LogSubDetailsAfterMigration(l, newCoordinator, subID, migratedSubscription)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Str("Consumer-VRFV2PlusWrapper", wrapperContracts.VRFV2PlusWrapper.Address()). Str("Coordinator", coordinatorAddressInConsumerAfterMigration.String()). Msg("Coordinator Address in VRFV2PlusWrapper After Migration")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `_, err = vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `_, err = vrfContracts.CoordinatorV2Plus.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `isNativeBilling = true` $DIR/integration-tests/smoke/vrfv2plus_test.go: `randomWordsFulfilledEvent, err = vrfv2plus.DirectFundingRequestRandomnessAndWaitForFulfillment( wrapperContracts.LoadTestConsumers[0], newCoordinator, vrfKey, subID, isNativeBilling, configCopy.VRFv2Plus.General, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `consumerStatus, err = wrapperContracts.LoadTestConsumers[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Str("Network Name", sethClient.Cfg.Network.Name). Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfv2plus.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfv2PlusConfig.General.BHSJobWaitBlocks = ptr.Ptr(2)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfv2PlusConfig.General.BHSJobLookBackBlocks = ptr.Ptr(20)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `env, vrfContracts, vrfKey, nodeTypeToNodeMap, err = vrfv2plus.SetupVRFV2PlusUniverse(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `t.Run("BHS Job with complete E2E - wait 256 blocks to see if Rand Request is fulfilled", func(t *testing.T) { if os.Getenv("TEST_UNSKIP") != "true" { t.Skip("Skipped due to long execution time. Should be run on-demand on live testnet with TEST_UNSKIP=\"true\".") } configCopy := config.MustCopy().(tc.TestConfig) //Underfund Subscription configCopy.VRFv2Plus.General.SubscriptionFundingAmountLink = ptr.Ptr(float64(0)) configCopy.VRFv2Plus.General.SubscriptionFundingAmountNative = ptr.Ptr(float64(0)) consumers, subIDs, err := vrfv2plus.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subID := subIDs[0] subscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...) randomWordsRequestedEvent, err := vrfv2plus.RequestRandomness( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, isNativeBilling, configCopy.VRFv2Plus.General, l, 0, ) require.NoError(t, err, "error requesting randomness") randRequestBlockNumber := randomWordsRequestedEvent.Raw.BlockNumber var wg sync.WaitGroup wg.Add(1) //Wait at least 256 blocks _, err = actions.WaitForBlockNumberToBe( randRequestBlockNumber+uint64(257), sethClient, &wg, configCopy.VRFv2Plus.General.WaitFor256BlocksTimeout.Duration, t, l, ) wg.Wait() require.NoError(t, err) err = vrfv2plus.FundSubscriptions( big.NewFloat(*configCopy.VRFv2Plus.General.SubscriptionRefundingAmountNative), big.NewFloat(*configCopy.VRFv2Plus.General.SubscriptionRefundingAmountLink), vrfContracts.LinkToken, vrfContracts.CoordinatorV2Plus, subIDs, ) require.NoError(t, err, "error funding subscriptions") randomWordsFulfilledEvent, err := vrfContracts.CoordinatorV2Plus.WaitForRandomWordsFulfilledEvent( contracts.RandomWordsFulfilledEventFilter{ RequestIds: []*big.Int{randomWordsRequestedEvent.RequestId}, SubIDs: []*big.Int{subID}, Timeout: configCopy.VRFv2Plus.General.RandomWordsFulfilledEventTimeout.Duration, }, ) require.NoError(t, err, "error waiting for randomness fulfilled event") vrfcommon.LogRandomWordsFulfilledEvent(l, vrfContracts.CoordinatorV2Plus, randomWordsFulfilledEvent, isNativeBilling, 0) status, err := consumers[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId) require.NoError(t, err, "error getting rand request status") require.True(t, status.Fulfilled) l.Info().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status") randRequestBlockHash, err := vrfContracts.BHS.GetBlockHash(testcontext.Get(t), big.NewInt(int64(randRequestBlockNumber))) require.NoError(t, err, "error getting blockhash for a blocknumber which was stored in BHS contract") l.Info(). Str("Randomness Request's Blockhash", randomWordsRequestedEvent.Raw.BlockHash.String()). Str("Block Hash stored by BHS contract", fmt.Sprintf("0x%x", randRequestBlockHash)). Msg("BHS Contract's stored Blockhash for Randomness Request") require.Equal(t, 0, randomWordsRequestedEvent.Raw.BlockHash.Cmp(randRequestBlockHash)) })` $DIR/integration-tests/smoke/vrfv2plus_test.go: `configCopy.VRFv2Plus.General.SubscriptionFundingAmountLink = ptr.Ptr(float64(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `configCopy.VRFv2Plus.General.SubscriptionFundingAmountNative = ptr.Ptr(float64(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `wg.Add(1)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `_, err = actions.WaitForBlockNumberToBe( randRequestBlockNumber+uint64(257), sethClient, &wg, configCopy.VRFv2Plus.General.WaitFor256BlocksTimeout.Duration, t, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `wg.Wait()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `err = vrfv2plus.FundSubscriptions( big.NewFloat(*configCopy.VRFv2Plus.General.SubscriptionRefundingAmountNative), big.NewFloat(*configCopy.VRFv2Plus.General.SubscriptionRefundingAmountLink), vrfContracts.LinkToken, vrfContracts.CoordinatorV2Plus, subIDs, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfcommon.LogRandomWordsFulfilledEvent(l, vrfContracts.CoordinatorV2Plus, randomWordsFulfilledEvent, isNativeBilling, 0)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Str("Randomness Request's Blockhash", randomWordsRequestedEvent.Raw.BlockHash.String()). Str("Block Hash stored by BHS contract", fmt.Sprintf("0x%x", randRequestBlockHash)). Msg("BHS Contract's stored Blockhash for Randomness Request")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `configCopy.VRFv2Plus.General.SubscriptionFundingAmountLink = ptr.Ptr(float64(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `configCopy.VRFv2Plus.General.SubscriptionFundingAmountNative = ptr.Ptr(float64(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `_, err = vrfContracts.BHS.GetBlockHash(testcontext.Get(t), big.NewInt(int64(randRequestBlockNumber)))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `wg.Add(1)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `_, err = actions.WaitForBlockNumberToBe( randRequestBlockNumber+uint64(*configCopy.VRFv2Plus.General.BHSJobWaitBlocks+10), sethClient, &wg, time.Minute*1, t, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `wg.Wait()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `gom.Eventually(func(g gomega.Gomega) { clNodeTxs, _, err = nodeTypeToNodeMap[vrfcommon.BHS].CLNode.API.ReadTransactions() g.Expect(err).ShouldNot(gomega.HaveOccurred(), "error getting CL Node transactions") l.Info().Int("Number of TXs", len(clNodeTxs.Data)).Msg("BHS Node txs") g.Expect(len(clNodeTxs.Data)).Should(gomega.BeNumerically("==", 1), "Expected 1 tx posted by BHS Node, but found %d", len(clNodeTxs.Data)) txHash = clNodeTxs.Data[0].Attributes.Hash }, "2m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `clNodeTxs, _, err = nodeTypeToNodeMap[vrfcommon.BHS].CLNode.API.ReadTransactions()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "error getting CL Node transactions")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info().Int("Number of TXs", len(clNodeTxs.Data)).Msg("BHS Node txs")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `g.Expect(len(clNodeTxs.Data)).Should(gomega.BeNumerically("==", 1), "Expected 1 tx posted by BHS Node, but found %d", len(clNodeTxs.Data))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `txHash = clNodeTxs.Data[0].Attributes.Hash` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Str("Block Number", bhsStoreTxInputData["n"].(*big.Int).String()). Msg("BHS Node's Store Blockhash for Blocknumber Method TX")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `gom.Eventually(func(g gomega.Gomega) { randRequestBlockHash, err = vrfContracts.BHS.GetBlockHash(testcontext.Get(t), big.NewInt(int64(randRequestBlockNumber))) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "error getting blockhash for a blocknumber which was stored in BHS contract") }, "2m", "1s").Should(gomega.Succeed())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `randRequestBlockHash, err = vrfContracts.BHS.GetBlockHash(testcontext.Get(t), big.NewInt(int64(randRequestBlockNumber)))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `g.Expect(err).ShouldNot(gomega.HaveOccurred(), "error getting blockhash for a blocknumber which was stored in BHS contract")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Str("Randomness Request's Blockhash", randomWordsRequestedEvent.Raw.BlockHash.String()). Str("Block Hash stored by BHS contract", fmt.Sprintf("0x%x", randRequestBlockHash)). Msg("BHS Contract's stored Blockhash for Randomness Request")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Str("Network Name", sethClient.Cfg.Network.Name). Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfv2plus.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `config.VRFv2Plus.General.BHFJobWaitBlocks = ptr.Ptr(260)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `config.VRFv2Plus.General.BHFJobLookBackBlocks = ptr.Ptr(500)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `config.VRFv2Plus.General.BHFJobPollPeriod = ptr.Ptr(blockchain.StrDuration{Duration: time.Second * 30})` $DIR/integration-tests/smoke/vrfv2plus_test.go: `config.VRFv2Plus.General.BHFJobRunTimeout = ptr.Ptr(blockchain.StrDuration{Duration: time.Minute * 24})` $DIR/integration-tests/smoke/vrfv2plus_test.go: `env, vrfContracts, vrfKey, nodeTypeToNodeMap, err = vrfv2plus.SetupVRFV2PlusUniverse( testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `configCopy.VRFv2Plus.General.SubscriptionFundingAmountLink = ptr.Ptr(float64(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `configCopy.VRFv2Plus.General.SubscriptionFundingAmountNative = ptr.Ptr(float64(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `wg.Add(1)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `_, err = actions.WaitForBlockNumberToBe( randRequestBlockNumber+uint64(257), sethClient, &wg, configCopy.VRFv2Plus.General.WaitFor256BlocksTimeout.Duration, t, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `wg.Wait()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info().Float64("SubscriptionFundingAmountNative", *configCopy.VRFv2Plus.General.SubscriptionRefundingAmountNative). Float64("SubscriptionFundingAmountLink", *configCopy.VRFv2Plus.General.SubscriptionRefundingAmountLink). Msg("Funding subscription")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `err = vrfv2plus.FundSubscriptions( big.NewFloat(*configCopy.VRFv2Plus.General.SubscriptionRefundingAmountNative), big.NewFloat(*configCopy.VRFv2Plus.General.SubscriptionRefundingAmountLink), vrfContracts.LinkToken, vrfContracts.CoordinatorV2Plus, subIDs, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfcommon.LogRandomWordsFulfilledEvent(l, vrfContracts.CoordinatorV2Plus, randomWordsFulfilledEvent, isNativeBilling, 0)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `batchBHSTxFound = true` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Str("Randomness Request's Blockhash", randomWordsRequestedEvent.Raw.BlockHash.String()). Str("Block Hash stored by BHS contract", fmt.Sprintf("0x%x", randRequestBlockHash)). Msg("BHS Contract's stored Blockhash for Randomness Request")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Str("Network Name", sethClient.Cfg.Network.Name). Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfv2plus.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `config.VRFv2Plus.General.VRFJobRequestTimeout = ptr.Ptr(blockchain.StrDuration{Duration: timeout})` $DIR/integration-tests/smoke/vrfv2plus_test.go: `config.VRFv2Plus.General.SubscriptionFundingAmountLink = ptr.Ptr(float64(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `config.VRFv2Plus.General.SubscriptionFundingAmountNative = ptr.Ptr(float64(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `env, vrfContracts, vrfKey, nodeTypeToNodeMap, err = vrfv2plus.SetupVRFV2PlusUniverse(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `time.Sleep(timeout + 1*time.Second)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `err = vrfv2plus.FundSubscriptions( fundingLinkAmt, fundingNativeAmt, vrfContracts.LinkToken, vrfContracts.CoordinatorV2Plus, []*big.Int{subID}, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `configCopy.VRFv2Plus.General.VRFJobRequestTimeout = ptr.Ptr(blockchain.StrDuration{Duration: time.Duration(time.Hour * 1)})` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Msg("Creating VRFV2 Plus Job with higher timeout (1hr)")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfNode.Job = job` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info().Str("reqID", initialReqRandomWordsRequestedEvent.RequestId.String()). Str("subID", subID.String()). Msg("Waiting for initalReqRandomWordsFulfilledEvent")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Str("Network Name", sethClient.Cfg.Network.Name). Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfv2plus.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `config.VRFv2Plus.General.MinimumConfirmations = ptr.Ptr[uint16](0)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `config.VRFv2Plus.General.VRFJobSimulationBlock = ptr.Ptr[string]("pending")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `env, vrfContracts, vrfKey, _, err = vrfv2plus.SetupVRFV2PlusUniverse(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info().Uint16("minimumConfirmationDelay", *config.VRFv2Plus.General.MinimumConfirmations).Msg("Minimum Confirmation Delay")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Str("Network Name", sethClient.Cfg.Network.Name). Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfv2plus.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, defaultWalletAddress, subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `env, vrfContracts, vrfKey, _, err = vrfv2plus.SetupVRFV2PlusUniverse(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `t.Run("Reorg on fulfillment", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) configCopy.VRFv2Plus.General.MinimumConfirmations = ptr.Ptr[uint16](10) //1. request randomness and wait for fulfillment for blockhash from Reorged Fork randomWordsRequestedEvent, randomWordsFulfilledEventOnReorgedFork, err := vrfv2plus.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, isNativeBilling, configCopy.VRFv2Plus.General, l, 0, ) require.NoError(t, err) // rewind chain to block number after the request was made, but before the request was fulfilled rewindChainToBlock := randomWordsRequestedEvent.Raw.BlockNumber + 1 rpcUrl, err := actions.GetRPCUrl(env, chainID) require.NoError(t, err, "error getting rpc url") //2. rewind chain by n number of blocks - basically, mimicking reorg scenario latestBlockNumberAfterReorg, err := actions.RewindSimulatedChainToBlockNumber(testcontext.Get(t), sethClient, rpcUrl, rewindChainToBlock, l) require.NoError(t, err, fmt.Sprintf("error rewinding chain to block number %d", rewindChainToBlock)) //3.1 ensure that chain is reorged and latest block number is greater than the block number when request was made require.Greater(t, latestBlockNumberAfterReorg, randomWordsRequestedEvent.Raw.BlockNumber) //3.2 ensure that chain is reorged and latest block number is less than the block number when fulfilment was performed require.Less(t, latestBlockNumberAfterReorg, randomWordsFulfilledEventOnReorgedFork.Raw.BlockNumber) //4. wait for the fulfillment which VRF Node will generate for Canonical chain _, err = vrfv2plus.WaitRandomWordsFulfilledEvent( vrfContracts.CoordinatorV2Plus, randomWordsRequestedEvent.RequestId, subID, randomWordsRequestedEvent.Raw.BlockNumber, isNativeBilling, configCopy.VRFv2Plus.General.RandomWordsFulfilledEventTimeout.Duration, l, 0, ) require.NoError(t, err, "error waiting for randomness fulfilled event") })` $DIR/integration-tests/smoke/vrfv2plus_test.go: `configCopy.VRFv2Plus.General.MinimumConfirmations = ptr.Ptr[uint16](10)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `_, err = vrfv2plus.WaitRandomWordsFulfilledEvent( vrfContracts.CoordinatorV2Plus, randomWordsRequestedEvent.RequestId, subID, randomWordsRequestedEvent.Raw.BlockNumber, isNativeBilling, configCopy.VRFv2Plus.General.RandomWordsFulfilledEventTimeout.Duration, l, 0, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `configCopy.VRFv2Plus.General.MinimumConfirmations = ptr.Ptr[uint16](6)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `_, err = vrfContracts.CoordinatorV2Plus.WaitForRandomWordsFulfilledEvent( contracts.RandomWordsFulfilledEventFilter{ RequestIds: []*big.Int{randomWordsRequestedEvent.RequestId}, SubIDs: []*big.Int{subID}, Timeout: time.Second * 10, }, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Str("Network Name", sethClient.Cfg.Network.Name). Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfv2plus.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, defaultWalletAddress, subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `env, vrfContracts, vrfKey, nodeTypeToNodeMap, err = vrfv2plus.SetupVRFV2PlusUniverse(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `config.VRFv2Plus.General.CallbackGasLimit = ptr.Ptr(uint32(500_000))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `t.Run("Batch Fulfillment Enabled", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) var isNativeBilling = true vrfNode, exists := nodeTypeToNodeMap[vrfcommon.VRF] require.True(t, exists, "VRF Node does not exist") //ensure that no job present on the node err = actions.DeleteJobs([]*client.ChainlinkClient{vrfNode.CLNode.API}) require.NoError(t, err) batchFullfillmentEnabled := true // create job with batch fulfillment enabled vrfJobSpecConfig := vrfcommon.VRFJobSpecConfig{ ForwardingAllowed: *configCopy.VRFv2Plus.General.VRFJobForwardingAllowed, CoordinatorAddress: vrfContracts.CoordinatorV2Plus.Address(), BatchCoordinatorAddress: vrfContracts.BatchCoordinatorV2Plus.Address(), FromAddresses: vrfNode.TXKeyAddressStrings, EVMChainID: fmt.Sprint(chainID), MinIncomingConfirmations: int(*configCopy.VRFv2Plus.General.MinimumConfirmations), PublicKey: vrfKey.PubKeyCompressed, EstimateGasMultiplier: *configCopy.VRFv2Plus.General.VRFJobEstimateGasMultiplier, BatchFulfillmentEnabled: batchFullfillmentEnabled, BatchFulfillmentGasMultiplier: *configCopy.VRFv2Plus.General.VRFJobBatchFulfillmentGasMultiplier, PollPeriod: configCopy.VRFv2Plus.General.VRFJobPollPeriod.Duration, RequestTimeout: configCopy.VRFv2Plus.General.VRFJobRequestTimeout.Duration, SimulationBlock: configCopy.VRFv2Plus.General.VRFJobSimulationBlock, VRFOwnerConfig: nil, } l.Info(). Msg("Creating VRFV2 Plus Job with `batchFulfillmentEnabled = true`") job, err := vrfv2plus.CreateVRFV2PlusJob( vrfNode.CLNode.API, vrfJobSpecConfig, ) require.NoError(t, err, "error creating job with higher timeout") vrfNode.Job = job consumers, subIDs, err := vrfv2plus.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subID := subIDs[0] subscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...) configCopy.VRFv2Plus.General.RandomnessRequestCountPerRequest = ptr.Ptr(uint16(randRequestCount)) // test and assert _, randomWordsFulfilledEvent, err := vrfv2plus.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, isNativeBilling, configCopy.VRFv2Plus.General, l, 0, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") var wgAllRequestsFulfilled sync.WaitGroup wgAllRequestsFulfilled.Add(1) requestCount, fulfilmentCount, err := vrfcommon.WaitForRequestCountEqualToFulfilmentCount(testcontext.Get(t), consumers[0], 2*time.Minute, &wgAllRequestsFulfilled) require.NoError(t, err) wgAllRequestsFulfilled.Wait() l.Info(). Interface("Request Count", requestCount). Interface("Fulfilment Count", fulfilmentCount). Msg("Request/Fulfilment Stats") clNodeTxs, resp, err := nodeTypeToNodeMap[vrfcommon.VRF].CLNode.API.ReadTransactions() require.NoError(t, err) require.Equal(t, 200, resp.StatusCode) var batchFulfillmentTxs []client.TransactionData for _, tx := range clNodeTxs.Data { if common.HexToAddress(tx.Attributes.To).Cmp(common.HexToAddress(vrfContracts.BatchCoordinatorV2Plus.Address())) == 0 { batchFulfillmentTxs = append(batchFulfillmentTxs, tx) } } fulfillmentTx, _, err := sethClient.Client.TransactionByHash(testcontext.Get(t), randomWordsFulfilledEvent.Raw.TxHash) require.NoError(t, err, "error getting tx from hash") fulfillmentTXToAddress := fulfillmentTx.To().String() l.Info(). Str("Actual Fulfillment Tx To Address", fulfillmentTXToAddress). Str("BatchCoordinatorV2Plus Address", vrfContracts.BatchCoordinatorV2Plus.Address()). Msg("Fulfillment Tx To Address should be the BatchCoordinatorV2Plus Address when batch fulfillment is enabled") // verify that VRF node sends fulfillments via BatchCoordinator contract require.Equal(t, vrfContracts.BatchCoordinatorV2Plus.Address(), fulfillmentTXToAddress, "Fulfillment Tx To Address should be the BatchCoordinatorV2Plus Address when batch fulfillment is enabled") // verify that all fulfillments should be inside one tx // This check is disabled for live testnets since each testnet has different gas usage for similar tx if network.Simulated { fulfillmentTxReceipt, err := sethClient.Client.TransactionReceipt(testcontext.Get(t), fulfillmentTx.Hash()) require.NoError(t, err) randomWordsFulfilledLogs, err := contracts.ParseRandomWordsFulfilledLogs(vrfContracts.CoordinatorV2Plus, fulfillmentTxReceipt.Logs) require.NoError(t, err) require.Equal(t, 1, len(batchFulfillmentTxs)) require.Equal(t, int(randRequestCount), len(randomWordsFulfilledLogs)) } })` $DIR/integration-tests/smoke/vrfv2plus_test.go: `err = actions.DeleteJobs([]*client.ChainlinkClient{vrfNode.CLNode.API})` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Msg("Creating VRFV2 Plus Job with `batchFulfillmentEnabled = true`")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfNode.Job = job` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `configCopy.VRFv2Plus.General.RandomnessRequestCountPerRequest = ptr.Ptr(uint16(randRequestCount))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `wgAllRequestsFulfilled.Add(1)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `wgAllRequestsFulfilled.Wait()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Interface("Request Count", requestCount). Interface("Fulfilment Count", fulfilmentCount). Msg("Request/Fulfilment Stats")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `batchFulfillmentTxs = append(batchFulfillmentTxs, tx)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Str("Actual Fulfillment Tx To Address", fulfillmentTXToAddress). Str("BatchCoordinatorV2Plus Address", vrfContracts.BatchCoordinatorV2Plus.Address()). Msg("Fulfillment Tx To Address should be the BatchCoordinatorV2Plus Address when batch fulfillment is enabled")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `err = actions.DeleteJobs([]*client.ChainlinkClient{vrfNode.CLNode.API})` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Msg("Creating VRFV2 Plus Job with `batchFulfillmentEnabled = false`")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfNode.Job = job` $DIR/integration-tests/smoke/vrfv2plus_test.go: `vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `configCopy.VRFv2Plus.General.RandomnessRequestCountPerRequest = ptr.Ptr(uint16(randRequestCount))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `wgAllRequestsFulfilled.Add(1)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `wgAllRequestsFulfilled.Wait()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Interface("Request Count", requestCount). Interface("Fulfilment Count", fulfilmentCount). Msg("Request/Fulfilment Stats")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `l.Info(). Str("Actual Fulfillment Tx To Address", fulfillmentTXToAddress). Str("CoordinatorV2Plus Address", vrfContracts.CoordinatorV2Plus.Address()). Msg("Fulfillment Tx To Address should be the CoordinatorV2Plus Address when batch fulfillment is disabled")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `singleFulfillmentTxs = append(singleFulfillmentTxs, tx)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetConfig("Smoke", tc.VRFv2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetSelectedNetworkConfig(config.GetNetworkConfig())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetNetworkConfig()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Cfg.IsSimulatedNetwork()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Network Name", sethClient.Cfg.Network.Name)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Cleanup(test_env.CleanupOpts{TestName: t.Name()})` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Name()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupVRFV2PlusUniverse(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Run("Link Billing", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) var isNativeBilling = false consumers, subIDsForRequestRandomness, err := vrfv2plus.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subIDForRequestRandomness := subIDsForRequestRandomness[0] subscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subIDForRequestRandomness) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, subIDForRequestRandomness.String(), vrfContracts.CoordinatorV2Plus) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDsForRequestRandomness...) subBalanceBeforeRequest := subscription.Balance // test and assert _, randomWordsFulfilledEvent, err := vrfv2plus.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subIDForRequestRandomness, isNativeBilling, configCopy.VRFv2Plus.General, l, 0, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") require.False(t, randomWordsFulfilledEvent.OnlyPremium, "RandomWordsFulfilled Event's `OnlyPremium` field should be false") require.Equal(t, isNativeBilling, randomWordsFulfilledEvent.NativePayment, "RandomWordsFulfilled Event's `NativePayment` field should be false") require.True(t, randomWordsFulfilledEvent.Success, "RandomWordsFulfilled Event's `Success` field should be true") expectedSubBalanceJuels := new(big.Int).Sub(subBalanceBeforeRequest, randomWordsFulfilledEvent.Payment) subscription, err = vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subIDForRequestRandomness) require.NoError(t, err, "error getting subscription information") subBalanceAfterRequest := subscription.Balance require.Equal(t, expectedSubBalanceJuels, subBalanceAfterRequest) status, err := consumers[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId) require.NoError(t, err, "error getting rand request status") require.True(t, status.Fulfilled) l.Info().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status") require.Equal(t, *configCopy.VRFv2Plus.General.NumberOfWords, uint32(len(status.RandomWords))) for _, w := range status.RandomWords { l.Info().Str("Output", w.String()).Msg("Randomness fulfilled") require.Equal(t, 1, w.Cmp(big.NewInt(0)), "Expected the VRF job give an answer bigger than 0") } })` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subIDForRequestRandomness)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LogSubDetails(l, subscription, subIDForRequestRandomness.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subIDForRequestRandomness, isNativeBilling, configCopy.VRFv2Plus.General, l, 0, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Sub(subBalanceBeforeRequest, randomWordsFulfilledEvent.Payment)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subIDForRequestRandomness)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Bool("Fulfilment Status", status.Fulfilled)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Msg("Random Words Request Fulfilment Status")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Str("Output", w.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Msg("Randomness fulfilled")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Run("Native Billing", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) testConfig := configCopy.VRFv2Plus.General var isNativeBilling = true consumers, subIDs, err := vrfv2plus.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subID := subIDs[0] subscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...) subNativeTokenBalanceBeforeRequest := subscription.NativeBalance // test and assert _, randomWordsFulfilledEvent, err := vrfv2plus.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, isNativeBilling, configCopy.VRFv2Plus.General, l, 0, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") require.False(t, randomWordsFulfilledEvent.OnlyPremium) require.Equal(t, isNativeBilling, randomWordsFulfilledEvent.NativePayment) require.True(t, randomWordsFulfilledEvent.Success) expectedSubBalanceWei := new(big.Int).Sub(subNativeTokenBalanceBeforeRequest, randomWordsFulfilledEvent.Payment) subscription, err = vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err) subBalanceAfterRequest := subscription.NativeBalance require.Equal(t, expectedSubBalanceWei, subBalanceAfterRequest) status, err := consumers[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId) require.NoError(t, err, "error getting rand request status") require.True(t, status.Fulfilled) l.Info().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status") require.Equal(t, *testConfig.NumberOfWords, uint32(len(status.RandomWords))) for _, w := range status.RandomWords { l.Info().Str("Output", w.String()).Msg("Randomness fulfilled") require.Equal(t, 1, w.Cmp(big.NewInt(0)), "Expected the VRF job give an answer bigger than 0") } })` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, isNativeBilling, configCopy.VRFv2Plus.General, l, 0, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Sub(subNativeTokenBalanceBeforeRequest, randomWordsFulfilledEvent.Payment)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Bool("Fulfilment Status", status.Fulfilled)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Msg("Random Words Request Fulfilment Status")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Str("Output", w.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Msg("Randomness fulfilled")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Run("VRF Node waits block confirmation number specified by the consumer before sending fulfilment on-chain", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) testConfig := configCopy.VRFv2Plus.General var isNativeBilling = true consumers, subIDs, err := vrfv2plus.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subID := subIDs[0] subscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...) expectedBlockNumberWait := uint16(10) testConfig.MinimumConfirmations = ptr.Ptr[uint16](expectedBlockNumberWait) randomWordsRequestedEvent, randomWordsFulfilledEvent, err := vrfv2plus.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, isNativeBilling, testConfig, l, 0, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") // check that VRF node waited at least the number of blocks specified by the consumer in the rand request min confs field blockNumberWait := randomWordsRequestedEvent.Raw.BlockNumber - randomWordsFulfilledEvent.Raw.BlockNumber require.GreaterOrEqual(t, blockNumberWait, uint64(expectedBlockNumberWait)) status, err := consumers[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId) require.NoError(t, err, "error getting rand request status") require.True(t, status.Fulfilled) l.Info().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status") })` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, isNativeBilling, testConfig, l, 0, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Bool("Fulfilment Status", status.Fulfilled)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Msg("Random Words Request Fulfilment Status")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Run("CL Node VRF Job Runs", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) var isNativeBilling = false consumers, subIDsForRequestRandomness, err := vrfv2plus.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subIDForRequestRandomness := subIDsForRequestRandomness[0] subscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subIDForRequestRandomness) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, subIDForRequestRandomness.String(), vrfContracts.CoordinatorV2Plus) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDsForRequestRandomness...) jobRunsBeforeTest, err := nodeTypeToNodeMap[vrfcommon.VRF].CLNode.API.MustReadRunsByJob(nodeTypeToNodeMap[vrfcommon.VRF].Job.Data.ID) require.NoError(t, err, "error reading job runs") // test and assert _, _, err = vrfv2plus.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subIDForRequestRandomness, isNativeBilling, configCopy.VRFv2Plus.General, l, 0, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") jobRuns, err := nodeTypeToNodeMap[vrfcommon.VRF].CLNode.API.MustReadRunsByJob(nodeTypeToNodeMap[vrfcommon.VRF].Job.Data.ID) require.NoError(t, err, "error reading job runs") require.Equal(t, len(jobRunsBeforeTest.Data)+1, len(jobRuns.Data)) })` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subIDForRequestRandomness)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LogSubDetails(l, subscription, subIDForRequestRandomness.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CLNode.API.MustReadRunsByJob(nodeTypeToNodeMap[vrfcommon.VRF].Job.Data.ID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subIDForRequestRandomness, isNativeBilling, configCopy.VRFv2Plus.General, l, 0, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CLNode.API.MustReadRunsByJob(nodeTypeToNodeMap[vrfcommon.VRF].Job.Data.ID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Run("Direct Funding", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) wrapperContracts, wrapperSubID, err := vrfv2plus.SetupVRFV2PlusWrapperEnvironment( testcontext.Get(t), l, env, chainID, &configCopy, vrfContracts.LinkToken, vrfContracts.MockETHLINKFeed, vrfContracts.CoordinatorV2Plus, vrfKey.KeyHash, 1, ) require.NoError(t, err) t.Run("Link Billing", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) testConfig := configCopy.VRFv2Plus.General var isNativeBilling = false wrapperConsumerJuelsBalanceBeforeRequest, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), wrapperContracts.LoadTestConsumers[0].Address()) require.NoError(t, err, "error getting wrapper consumer balance") wrapperSubscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), wrapperSubID) require.NoError(t, err, "error getting subscription information") subBalanceBeforeRequest := wrapperSubscription.Balance randomWordsFulfilledEvent, err := vrfv2plus.DirectFundingRequestRandomnessAndWaitForFulfillment( wrapperContracts.LoadTestConsumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, wrapperSubID, isNativeBilling, configCopy.VRFv2Plus.General, l, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") expectedSubBalanceJuels := new(big.Int).Sub(subBalanceBeforeRequest, randomWordsFulfilledEvent.Payment) wrapperSubscription, err = vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), wrapperSubID) require.NoError(t, err, "error getting subscription information") subBalanceAfterRequest := wrapperSubscription.Balance require.Equal(t, expectedSubBalanceJuels, subBalanceAfterRequest) consumerStatus, err := wrapperContracts.LoadTestConsumers[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId) require.NoError(t, err, "error getting rand request status") require.True(t, consumerStatus.Fulfilled) expectedWrapperConsumerJuelsBalance := new(big.Int).Sub(wrapperConsumerJuelsBalanceBeforeRequest, consumerStatus.Paid) wrapperConsumerJuelsBalanceAfterRequest, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), wrapperContracts.LoadTestConsumers[0].Address()) require.NoError(t, err, "error getting wrapper consumer balance") require.Equal(t, expectedWrapperConsumerJuelsBalance, wrapperConsumerJuelsBalanceAfterRequest) //todo: uncomment when VRF-651 will be fixed //require.Equal(t, 1, consumerStatus.Paid.Cmp(randomWordsFulfilledEvent.Payment), "Expected Consumer contract pay more than the Coordinator Sub") vrfcommon.LogFulfillmentDetailsLinkBilling(l, wrapperConsumerJuelsBalanceBeforeRequest, wrapperConsumerJuelsBalanceAfterRequest, consumerStatus, randomWordsFulfilledEvent) require.Equal(t, *testConfig.NumberOfWords, uint32(len(consumerStatus.RandomWords))) for _, w := range consumerStatus.RandomWords { l.Info().Str("Output", w.String()).Msg("Randomness fulfilled") require.Equal(t, 1, w.Cmp(big.NewInt(0)), "Expected the VRF job give an answer bigger than 0") } }) t.Run("Native Billing", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) testConfig := configCopy.VRFv2Plus.General var isNativeBilling = true wrapperConsumerBalanceBeforeRequestWei, err := sethClient.Client.BalanceAt(testcontext.Get(t), common.HexToAddress(wrapperContracts.LoadTestConsumers[0].Address()), nil) require.NoError(t, err, "error getting wrapper consumer balance") wrapperSubscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), wrapperSubID) require.NoError(t, err, "error getting subscription information") subBalanceBeforeRequest := wrapperSubscription.NativeBalance randomWordsFulfilledEvent, err := vrfv2plus.DirectFundingRequestRandomnessAndWaitForFulfillment( wrapperContracts.LoadTestConsumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, wrapperSubID, isNativeBilling, configCopy.VRFv2Plus.General, l, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") expectedSubBalanceWei := new(big.Int).Sub(subBalanceBeforeRequest, randomWordsFulfilledEvent.Payment) wrapperSubscription, err = vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), wrapperSubID) require.NoError(t, err, "error getting subscription information") subBalanceAfterRequest := wrapperSubscription.NativeBalance require.Equal(t, expectedSubBalanceWei, subBalanceAfterRequest) consumerStatus, err := wrapperContracts.LoadTestConsumers[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId) require.NoError(t, err, "error getting rand request status") require.True(t, consumerStatus.Fulfilled) expectedWrapperConsumerWeiBalance := new(big.Int).Sub(wrapperConsumerBalanceBeforeRequestWei, consumerStatus.Paid) wrapperConsumerBalanceAfterRequestWei, err := sethClient.Client.BalanceAt(testcontext.Get(t), common.HexToAddress(wrapperContracts.LoadTestConsumers[0].Address()), nil) require.NoError(t, err, "error getting wrapper consumer balance") require.Equal(t, expectedWrapperConsumerWeiBalance, wrapperConsumerBalanceAfterRequestWei) //todo: uncomment when VRF-651 will be fixed //require.Equal(t, 1, consumerStatus.Paid.Cmp(randomWordsFulfilledEvent.Payment), "Expected Consumer contract pay more than the Coordinator Sub") vrfcommon.LogFulfillmentDetailsNativeBilling(l, wrapperConsumerBalanceBeforeRequestWei, wrapperConsumerBalanceAfterRequestWei, consumerStatus, randomWordsFulfilledEvent) require.Equal(t, *testConfig.NumberOfWords, uint32(len(consumerStatus.RandomWords))) for _, w := range consumerStatus.RandomWords { l.Info().Str("Output", w.String()).Msg("Randomness fulfilled") require.Equal(t, 1, w.Cmp(big.NewInt(0)), "Expected the VRF job give an answer bigger than 0") } }) })` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupVRFV2PlusWrapperEnvironment( testcontext.Get(t), l, env, chainID, &configCopy, vrfContracts.LinkToken, vrfContracts.MockETHLINKFeed, vrfContracts.CoordinatorV2Plus, vrfKey.KeyHash, 1, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Run("Link Billing", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) testConfig := configCopy.VRFv2Plus.General var isNativeBilling = false wrapperConsumerJuelsBalanceBeforeRequest, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), wrapperContracts.LoadTestConsumers[0].Address()) require.NoError(t, err, "error getting wrapper consumer balance") wrapperSubscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), wrapperSubID) require.NoError(t, err, "error getting subscription information") subBalanceBeforeRequest := wrapperSubscription.Balance randomWordsFulfilledEvent, err := vrfv2plus.DirectFundingRequestRandomnessAndWaitForFulfillment( wrapperContracts.LoadTestConsumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, wrapperSubID, isNativeBilling, configCopy.VRFv2Plus.General, l, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") expectedSubBalanceJuels := new(big.Int).Sub(subBalanceBeforeRequest, randomWordsFulfilledEvent.Payment) wrapperSubscription, err = vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), wrapperSubID) require.NoError(t, err, "error getting subscription information") subBalanceAfterRequest := wrapperSubscription.Balance require.Equal(t, expectedSubBalanceJuels, subBalanceAfterRequest) consumerStatus, err := wrapperContracts.LoadTestConsumers[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId) require.NoError(t, err, "error getting rand request status") require.True(t, consumerStatus.Fulfilled) expectedWrapperConsumerJuelsBalance := new(big.Int).Sub(wrapperConsumerJuelsBalanceBeforeRequest, consumerStatus.Paid) wrapperConsumerJuelsBalanceAfterRequest, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), wrapperContracts.LoadTestConsumers[0].Address()) require.NoError(t, err, "error getting wrapper consumer balance") require.Equal(t, expectedWrapperConsumerJuelsBalance, wrapperConsumerJuelsBalanceAfterRequest) //todo: uncomment when VRF-651 will be fixed //require.Equal(t, 1, consumerStatus.Paid.Cmp(randomWordsFulfilledEvent.Payment), "Expected Consumer contract pay more than the Coordinator Sub") vrfcommon.LogFulfillmentDetailsLinkBilling(l, wrapperConsumerJuelsBalanceBeforeRequest, wrapperConsumerJuelsBalanceAfterRequest, consumerStatus, randomWordsFulfilledEvent) require.Equal(t, *testConfig.NumberOfWords, uint32(len(consumerStatus.RandomWords))) for _, w := range consumerStatus.RandomWords { l.Info().Str("Output", w.String()).Msg("Randomness fulfilled") require.Equal(t, 1, w.Cmp(big.NewInt(0)), "Expected the VRF job give an answer bigger than 0") } })` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LinkToken.BalanceOf(testcontext.Get(t), wrapperContracts.LoadTestConsumers[0].Address())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), wrapperSubID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.DirectFundingRequestRandomnessAndWaitForFulfillment( wrapperContracts.LoadTestConsumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, wrapperSubID, isNativeBilling, configCopy.VRFv2Plus.General, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Sub(subBalanceBeforeRequest, randomWordsFulfilledEvent.Payment)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), wrapperSubID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Sub(wrapperConsumerJuelsBalanceBeforeRequest, consumerStatus.Paid)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LinkToken.BalanceOf(testcontext.Get(t), wrapperContracts.LoadTestConsumers[0].Address())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LogFulfillmentDetailsLinkBilling(l, wrapperConsumerJuelsBalanceBeforeRequest, wrapperConsumerJuelsBalanceAfterRequest, consumerStatus, randomWordsFulfilledEvent)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Str("Output", w.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Msg("Randomness fulfilled")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Run("Native Billing", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) testConfig := configCopy.VRFv2Plus.General var isNativeBilling = true wrapperConsumerBalanceBeforeRequestWei, err := sethClient.Client.BalanceAt(testcontext.Get(t), common.HexToAddress(wrapperContracts.LoadTestConsumers[0].Address()), nil) require.NoError(t, err, "error getting wrapper consumer balance") wrapperSubscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), wrapperSubID) require.NoError(t, err, "error getting subscription information") subBalanceBeforeRequest := wrapperSubscription.NativeBalance randomWordsFulfilledEvent, err := vrfv2plus.DirectFundingRequestRandomnessAndWaitForFulfillment( wrapperContracts.LoadTestConsumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, wrapperSubID, isNativeBilling, configCopy.VRFv2Plus.General, l, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") expectedSubBalanceWei := new(big.Int).Sub(subBalanceBeforeRequest, randomWordsFulfilledEvent.Payment) wrapperSubscription, err = vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), wrapperSubID) require.NoError(t, err, "error getting subscription information") subBalanceAfterRequest := wrapperSubscription.NativeBalance require.Equal(t, expectedSubBalanceWei, subBalanceAfterRequest) consumerStatus, err := wrapperContracts.LoadTestConsumers[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId) require.NoError(t, err, "error getting rand request status") require.True(t, consumerStatus.Fulfilled) expectedWrapperConsumerWeiBalance := new(big.Int).Sub(wrapperConsumerBalanceBeforeRequestWei, consumerStatus.Paid) wrapperConsumerBalanceAfterRequestWei, err := sethClient.Client.BalanceAt(testcontext.Get(t), common.HexToAddress(wrapperContracts.LoadTestConsumers[0].Address()), nil) require.NoError(t, err, "error getting wrapper consumer balance") require.Equal(t, expectedWrapperConsumerWeiBalance, wrapperConsumerBalanceAfterRequestWei) //todo: uncomment when VRF-651 will be fixed //require.Equal(t, 1, consumerStatus.Paid.Cmp(randomWordsFulfilledEvent.Payment), "Expected Consumer contract pay more than the Coordinator Sub") vrfcommon.LogFulfillmentDetailsNativeBilling(l, wrapperConsumerBalanceBeforeRequestWei, wrapperConsumerBalanceAfterRequestWei, consumerStatus, randomWordsFulfilledEvent) require.Equal(t, *testConfig.NumberOfWords, uint32(len(consumerStatus.RandomWords))) for _, w := range consumerStatus.RandomWords { l.Info().Str("Output", w.String()).Msg("Randomness fulfilled") require.Equal(t, 1, w.Cmp(big.NewInt(0)), "Expected the VRF job give an answer bigger than 0") } })` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Client.BalanceAt(testcontext.Get(t), common.HexToAddress(wrapperContracts.LoadTestConsumers[0].Address()), nil)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.HexToAddress(wrapperContracts.LoadTestConsumers[0].Address())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), wrapperSubID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.DirectFundingRequestRandomnessAndWaitForFulfillment( wrapperContracts.LoadTestConsumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, wrapperSubID, isNativeBilling, configCopy.VRFv2Plus.General, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Sub(subBalanceBeforeRequest, randomWordsFulfilledEvent.Payment)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), wrapperSubID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Sub(wrapperConsumerBalanceBeforeRequestWei, consumerStatus.Paid)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Client.BalanceAt(testcontext.Get(t), common.HexToAddress(wrapperContracts.LoadTestConsumers[0].Address()), nil)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.HexToAddress(wrapperContracts.LoadTestConsumers[0].Address())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LogFulfillmentDetailsNativeBilling(l, wrapperConsumerBalanceBeforeRequestWei, wrapperConsumerBalanceAfterRequestWei, consumerStatus, randomWordsFulfilledEvent)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Str("Output", w.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Msg("Randomness fulfilled")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Run("Canceling Sub And Returning Funds", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) _, subIDs, err := vrfv2plus.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subID := subIDs[0] subscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...) testWalletAddress, err := actions.GenerateWallet() require.NoError(t, err) testWalletBalanceNativeBeforeSubCancelling, err := sethClient.Client.BalanceAt(testcontext.Get(t), testWalletAddress, nil) require.NoError(t, err) testWalletBalanceLinkBeforeSubCancelling, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), testWalletAddress.String()) require.NoError(t, err) subscriptionForCancelling, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err, "error getting subscription information") subBalanceLink := subscriptionForCancelling.Balance subBalanceNative := subscriptionForCancelling.NativeBalance l.Info(). Str("Subscription Amount Native", subBalanceNative.String()). Str("Subscription Amount Link", subBalanceLink.String()). Str("Returning funds from SubID", subID.String()). Str("Returning funds to", testWalletAddress.String()). Msg("Canceling subscription and returning funds to subscription owner") cancellationTx, cancellationEvent, err := vrfContracts.CoordinatorV2Plus.CancelSubscription(subID, testWalletAddress) require.NoError(t, err, "Error canceling subscription") txGasUsed := new(big.Int).SetUint64(cancellationTx.Receipt.GasUsed) // we don't have that information for older Geth versions if cancellationTx.Receipt.EffectiveGasPrice == nil { cancellationTx.Receipt.EffectiveGasPrice = new(big.Int).SetUint64(0) } cancellationTxFeeWei := new(big.Int).Mul(txGasUsed, cancellationTx.Receipt.EffectiveGasPrice) l.Info(). Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String()). Str("Effective Gas Price", cancellationTx.Receipt.EffectiveGasPrice.String()). Uint64("Gas Used", cancellationTx.Receipt.GasUsed). Msg("Cancellation TX Receipt") l.Info(). Str("Returned Subscription Amount Native", cancellationEvent.AmountLink.String()). Str("Returned Subscription Amount Link", cancellationEvent.AmountLink.String()). Str("SubID", cancellationEvent.SubId.String()). Str("Returned to", cancellationEvent.To.String()). Msg("Subscription Canceled Event") require.Equal(t, subBalanceNative, cancellationEvent.AmountNative, "SubscriptionCanceled event native amount is not equal to sub amount while canceling subscription") require.Equal(t, subBalanceLink, cancellationEvent.AmountLink, "SubscriptionCanceled event LINK amount is not equal to sub amount while canceling subscription") testWalletBalanceNativeAfterSubCancelling, err := sethClient.Client.BalanceAt(testcontext.Get(t), testWalletAddress, nil) require.NoError(t, err) testWalletBalanceLinkAfterSubCancelling, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), testWalletAddress.String()) require.NoError(t, err) //Verify that sub was deleted from Coordinator _, err = vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.Error(t, err, "error not occurred when trying to get deleted subscription from old Coordinator after sub migration") subFundsReturnedNativeActual := new(big.Int).Sub(testWalletBalanceNativeAfterSubCancelling, testWalletBalanceNativeBeforeSubCancelling) subFundsReturnedLinkActual := new(big.Int).Sub(testWalletBalanceLinkAfterSubCancelling, testWalletBalanceLinkBeforeSubCancelling) subFundsReturnedNativeExpected := new(big.Int).Sub(subBalanceNative, cancellationTxFeeWei) deltaSpentOnCancellationTxFee := new(big.Int).Sub(subBalanceNative, subFundsReturnedNativeActual) l.Info(). Str("Sub Balance - Native", subBalanceNative.String()). Str("Delta Spent On Cancellation Tx Fee - `NativeBalance - subFundsReturnedNativeActual`", deltaSpentOnCancellationTxFee.String()). Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String()). Str("Sub Funds Returned Actual - Native", subFundsReturnedNativeActual.String()). Str("Sub Funds Returned Expected - `NativeBalance - cancellationTxFeeWei`", subFundsReturnedNativeExpected.String()). Str("Sub Funds Returned Actual - Link", subFundsReturnedLinkActual.String()). Str("Sub Balance - Link", subBalanceLink.String()). Msg("Sub funds returned") //todo - this fails on SIMULATED env as tx cost is calculated different as for testnets and it's not receipt.EffectiveGasPrice*receipt.GasUsed //require.Equal(t, subFundsReturnedNativeExpected, subFundsReturnedNativeActual, "Returned funds are not equal to sub balance that was cancelled") require.Equal(t, 1, testWalletBalanceNativeAfterSubCancelling.Cmp(testWalletBalanceNativeBeforeSubCancelling), "Native funds were not returned after sub cancellation") require.Equal(t, 0, subBalanceLink.Cmp(subFundsReturnedLinkActual), "Returned LINK funds are not equal to sub balance that was cancelled") })` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GenerateWallet()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Client.BalanceAt(testcontext.Get(t), testWalletAddress, nil)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LinkToken.BalanceOf(testcontext.Get(t), testWalletAddress.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Subscription Amount Native", subBalanceNative.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Subscription Amount Link", subBalanceLink.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Returning funds from SubID", subID.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Returning funds to", testWalletAddress.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Canceling subscription and returning funds to subscription owner")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.CancelSubscription(subID, testWalletAddress)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetUint64(cancellationTx.Receipt.GasUsed)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetUint64(0)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Mul(txGasUsed, cancellationTx.Receipt.EffectiveGasPrice)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Effective Gas Price", cancellationTx.Receipt.EffectiveGasPrice.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Receipt.EffectiveGasPrice.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Uint64("Gas Used", cancellationTx.Receipt.GasUsed)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Cancellation TX Receipt")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Returned Subscription Amount Native", cancellationEvent.AmountLink.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.AmountLink.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Returned Subscription Amount Link", cancellationEvent.AmountLink.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.AmountLink.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("SubID", cancellationEvent.SubId.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SubId.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Returned to", cancellationEvent.To.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.To.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Subscription Canceled Event")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Client.BalanceAt(testcontext.Get(t), testWalletAddress, nil)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LinkToken.BalanceOf(testcontext.Get(t), testWalletAddress.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Sub(testWalletBalanceNativeAfterSubCancelling, testWalletBalanceNativeBeforeSubCancelling)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Sub(testWalletBalanceLinkAfterSubCancelling, testWalletBalanceLinkBeforeSubCancelling)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Sub(subBalanceNative, cancellationTxFeeWei)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Sub(subBalanceNative, subFundsReturnedNativeActual)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Sub Balance - Native", subBalanceNative.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Delta Spent On Cancellation Tx Fee - `NativeBalance - subFundsReturnedNativeActual`", deltaSpentOnCancellationTxFee.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Sub Funds Returned Actual - Native", subFundsReturnedNativeActual.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Sub Funds Returned Expected - `NativeBalance - cancellationTxFeeWei`", subFundsReturnedNativeExpected.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Sub Funds Returned Actual - Link", subFundsReturnedLinkActual.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Sub Balance - Link", subBalanceLink.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Sub funds returned")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Run("Owner Canceling Sub And Returning Funds While Having Pending Requests", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) testConfig := configCopy.VRFv2Plus.General //underfund subs in order rand fulfillments to fail testConfig.SubscriptionFundingAmountNative = ptr.Ptr(float64(0)) testConfig.SubscriptionFundingAmountLink = ptr.Ptr(float64(0)) consumers, subIDs, err := vrfv2plus.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subID := subIDs[0] subscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...) activeSubscriptionIdsBeforeSubCancellation, err := vrfContracts.CoordinatorV2Plus.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0)) require.NoError(t, err) require.True(t, it_utils.BigIntSliceContains(activeSubscriptionIdsBeforeSubCancellation, subID)) pendingRequestsExist, err := vrfContracts.CoordinatorV2Plus.PendingRequestsExist(testcontext.Get(t), subID) require.NoError(t, err) require.False(t, pendingRequestsExist, "Pending requests should not exist") configCopy.VRFv2Plus.General.RandomWordsFulfilledEventTimeout = ptr.Ptr(blockchain.StrDuration{Duration: 5 * time.Second}) _, _, err = vrfv2plus.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, false, configCopy.VRFv2Plus.General, l, 0, ) require.Error(t, err, "error should occur for waiting for fulfilment due to low sub balance") _, _, err = vrfv2plus.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, true, configCopy.VRFv2Plus.General, l, 0, ) require.Error(t, err, "error should occur for waiting for fulfilment due to low sub balance") pendingRequestsExist, err = vrfContracts.CoordinatorV2Plus.PendingRequestsExist(testcontext.Get(t), subID) require.NoError(t, err) require.True(t, pendingRequestsExist, "Pending requests should exist after unfulfilled rand requests due to low sub balance") walletBalanceNativeBeforeSubCancelling, err := sethClient.Client.BalanceAt(testcontext.Get(t), common.HexToAddress(sethClient.MustGetRootKeyAddress().Hex()), nil) require.NoError(t, err) walletBalanceLinkBeforeSubCancelling, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), sethClient.MustGetRootKeyAddress().Hex()) require.NoError(t, err) subscriptionForCancelling, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err, "error getting subscription information") subBalanceLink := subscriptionForCancelling.Balance subBalanceNative := subscriptionForCancelling.NativeBalance l.Info(). Str("Subscription Amount Native", subBalanceNative.String()). Str("Subscription Amount Link", subBalanceLink.String()). Str("Returning funds from SubID", subID.String()). Str("Returning funds to", sethClient.MustGetRootKeyAddress().Hex()). Msg("Canceling subscription and returning funds to subscription owner") cancellationTx, cancellationEvent, err := vrfContracts.CoordinatorV2Plus.OwnerCancelSubscription(subID) require.NoError(t, err, "Error canceling subscription") txGasUsed := new(big.Int).SetUint64(cancellationTx.Receipt.GasUsed) // we don't have that information for older Geth versions if cancellationTx.Receipt.EffectiveGasPrice == nil { cancellationTx.Receipt.EffectiveGasPrice = new(big.Int).SetUint64(0) } cancellationTxFeeWei := new(big.Int).Mul(txGasUsed, cancellationTx.Receipt.EffectiveGasPrice) l.Info(). Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String()). Str("Effective Gas Price", cancellationTx.Receipt.EffectiveGasPrice.String()). Uint64("Gas Used", cancellationTx.Receipt.GasUsed). Msg("Cancellation TX Receipt") l.Info(). Str("Returned Subscription Amount Native", cancellationEvent.AmountNative.String()). Str("Returned Subscription Amount Link", cancellationEvent.AmountLink.String()). Str("SubID", cancellationEvent.SubId.String()). Str("Returned to", cancellationEvent.To.String()). Msg("Subscription Canceled Event") require.Equal(t, subBalanceNative, cancellationEvent.AmountNative, "SubscriptionCanceled event native amount is not equal to sub amount while canceling subscription") require.Equal(t, subBalanceLink, cancellationEvent.AmountLink, "SubscriptionCanceled event LINK amount is not equal to sub amount while canceling subscription") walletBalanceNativeAfterSubCancelling, err := sethClient.Client.BalanceAt(testcontext.Get(t), common.HexToAddress(sethClient.MustGetRootKeyAddress().Hex()), nil) require.NoError(t, err) walletBalanceLinkAfterSubCancelling, err := vrfContracts.LinkToken.BalanceOf(testcontext.Get(t), sethClient.MustGetRootKeyAddress().Hex()) require.NoError(t, err) //Verify that sub was deleted from Coordinator _, err = vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.Error(t, err, "error not occurred when trying to get deleted subscription from old Coordinator after sub migration") subFundsReturnedNativeActual := new(big.Int).Sub(walletBalanceNativeAfterSubCancelling, walletBalanceNativeBeforeSubCancelling) subFundsReturnedLinkActual := new(big.Int).Sub(walletBalanceLinkAfterSubCancelling, walletBalanceLinkBeforeSubCancelling) subFundsReturnedNativeExpected := new(big.Int).Sub(subBalanceNative, cancellationTxFeeWei) deltaSpentOnCancellationTxFee := new(big.Int).Sub(subBalanceNative, subFundsReturnedNativeActual) l.Info(). Str("Sub Balance - Native", subBalanceNative.String()). Str("Delta Spent On Cancellation Tx Fee - `NativeBalance - subFundsReturnedNativeActual`", deltaSpentOnCancellationTxFee.String()). Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String()). Str("Sub Funds Returned Actual - Native", subFundsReturnedNativeActual.String()). Str("Sub Funds Returned Expected - `NativeBalance - cancellationTxFeeWei`", subFundsReturnedNativeExpected.String()). Str("Sub Funds Returned Actual - Link", subFundsReturnedLinkActual.String()). Str("Sub Balance - Link", subBalanceLink.String()). Str("walletBalanceNativeBeforeSubCancelling", walletBalanceNativeBeforeSubCancelling.String()). Str("walletBalanceNativeAfterSubCancelling", walletBalanceNativeAfterSubCancelling.String()). Msg("Sub funds returned") //todo - need to use different wallet for each test to verify exact amount of Native/LINK returned //todo - as defaultWallet is used in other tests in parallel which might affect the balance - TT-684 //require.Equal(t, 1, walletBalanceNativeAfterSubCancelling.Cmp(walletBalanceNativeBeforeSubCancelling), "Native funds were not returned after sub cancellation") //todo - this fails on SIMULATED env as tx cost is calculated different as for testnets and it's not receipt.EffectiveGasPrice*receipt.GasUsed //require.Equal(t, subFundsReturnedNativeExpected, subFundsReturnedNativeActual, "Returned funds are not equal to sub balance that was cancelled") require.Equal(t, 0, subBalanceLink.Cmp(subFundsReturnedLinkActual), "Returned LINK funds are not equal to sub balance that was cancelled") activeSubscriptionIdsAfterSubCancellation, err := vrfContracts.CoordinatorV2Plus.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0)) require.NoError(t, err, "error getting active subscription ids") require.False( t, it_utils.BigIntSliceContains(activeSubscriptionIdsAfterSubCancellation, subID), "Active subscription ids should not contain sub id after sub cancellation", ) })` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Ptr(float64(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Ptr(float64(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewInt(0)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewInt(0)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.PendingRequestsExist(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Ptr(blockchain.StrDuration{Duration: 5 * time.Second})` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, false, configCopy.VRFv2Plus.General, l, 0, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, true, configCopy.VRFv2Plus.General, l, 0, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.PendingRequestsExist(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Client.BalanceAt(testcontext.Get(t), common.HexToAddress(sethClient.MustGetRootKeyAddress().Hex()), nil)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.HexToAddress(sethClient.MustGetRootKeyAddress().Hex())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LinkToken.BalanceOf(testcontext.Get(t), sethClient.MustGetRootKeyAddress().Hex())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Subscription Amount Native", subBalanceNative.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Subscription Amount Link", subBalanceLink.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Returning funds from SubID", subID.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Returning funds to", sethClient.MustGetRootKeyAddress().Hex())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Canceling subscription and returning funds to subscription owner")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.OwnerCancelSubscription(subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetUint64(cancellationTx.Receipt.GasUsed)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetUint64(0)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Mul(txGasUsed, cancellationTx.Receipt.EffectiveGasPrice)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Effective Gas Price", cancellationTx.Receipt.EffectiveGasPrice.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Receipt.EffectiveGasPrice.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Uint64("Gas Used", cancellationTx.Receipt.GasUsed)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Cancellation TX Receipt")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Returned Subscription Amount Native", cancellationEvent.AmountNative.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.AmountNative.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Returned Subscription Amount Link", cancellationEvent.AmountLink.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.AmountLink.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("SubID", cancellationEvent.SubId.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SubId.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Returned to", cancellationEvent.To.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.To.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Subscription Canceled Event")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Client.BalanceAt(testcontext.Get(t), common.HexToAddress(sethClient.MustGetRootKeyAddress().Hex()), nil)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.HexToAddress(sethClient.MustGetRootKeyAddress().Hex())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LinkToken.BalanceOf(testcontext.Get(t), sethClient.MustGetRootKeyAddress().Hex())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Sub(walletBalanceNativeAfterSubCancelling, walletBalanceNativeBeforeSubCancelling)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Sub(walletBalanceLinkAfterSubCancelling, walletBalanceLinkBeforeSubCancelling)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Sub(subBalanceNative, cancellationTxFeeWei)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Sub(subBalanceNative, subFundsReturnedNativeActual)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Sub Balance - Native", subBalanceNative.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Delta Spent On Cancellation Tx Fee - `NativeBalance - subFundsReturnedNativeActual`", deltaSpentOnCancellationTxFee.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Cancellation Tx Fee Wei", cancellationTxFeeWei.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Sub Funds Returned Actual - Native", subFundsReturnedNativeActual.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Sub Funds Returned Expected - `NativeBalance - cancellationTxFeeWei`", subFundsReturnedNativeExpected.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Sub Funds Returned Actual - Link", subFundsReturnedLinkActual.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Sub Balance - Link", subBalanceLink.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("walletBalanceNativeBeforeSubCancelling", walletBalanceNativeBeforeSubCancelling.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("walletBalanceNativeAfterSubCancelling", walletBalanceNativeAfterSubCancelling.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Sub funds returned")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewInt(0)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewInt(0)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, false, configCopy.VRFv2Plus.General, l, 0, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, true, configCopy.VRFv2Plus.General, l, 0, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Client.BalanceAt(testcontext.Get(t), common.HexToAddress(sethClient.MustGetRootKeyAddress().Hex()), nil)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.HexToAddress(sethClient.MustGetRootKeyAddress().Hex())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LinkToken.BalanceOf(testcontext.Get(t), sethClient.MustGetRootKeyAddress().Hex())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Returning to", sethClient.MustGetRootKeyAddress().Hex())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Amount", amountToWithdrawLink.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Invoking Oracle Withdraw for LINK")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.Withdraw( common.HexToAddress(sethClient.MustGetRootKeyAddress().Hex()), )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.HexToAddress(sethClient.MustGetRootKeyAddress().Hex())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Returning to", sethClient.MustGetRootKeyAddress().Hex())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Amount", amountToWithdrawNative.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Invoking Oracle Withdraw for Native")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.WithdrawNative( common.HexToAddress(sethClient.MustGetRootKeyAddress().Hex()), )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.HexToAddress(sethClient.MustGetRootKeyAddress().Hex())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Client.BalanceAt(testcontext.Get(t), common.HexToAddress(sethClient.MustGetRootKeyAddress().Hex()), nil)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.HexToAddress(sethClient.MustGetRootKeyAddress().Hex())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LinkToken.BalanceOf(testcontext.Get(t), sethClient.MustGetRootKeyAddress().Hex())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetConfig("Smoke", tc.VRFv2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetSelectedNetworkConfig(config.GetNetworkConfig())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetNetworkConfig()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Cfg.IsSimulatedNetwork()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Network Name", sethClient.Cfg.Network.Name)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Cleanup(test_env.CleanupOpts{TestName: t.Name()})` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Name()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupVRFV2PlusUniverse(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CLNode.API.ReadTxKeys("evm")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, isNativeBilling, configCopy.VRFv2Plus.General, l, 0, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Client.TransactionByHash(testcontext.Get(t), randomWordsFulfilledEvent.Raw.TxHash)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetTxFromAddress(fulfillmentTx)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Diff(txKeyAddresses, fulfillmentTxFromAddresses, cmpopts.SortSlices(less))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SortSlices(less)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetConfig("Smoke", tc.VRFv2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetSelectedNetworkConfig(config.GetNetworkConfig())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetNetworkConfig()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Cfg.IsSimulatedNetwork()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Network Name", sethClient.Cfg.Network.Name)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Cleanup(test_env.CleanupOpts{TestName: t.Name()})` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Name()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupVRFV2PlusUniverse(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Run("Test migration of Subscription Billing subID", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) consumers, subIDs, err := vrfv2plus.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 2, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subID := subIDs[0] subscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...) activeSubIdsOldCoordinatorBeforeMigration, err := vrfContracts.CoordinatorV2Plus.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0)) require.NoError(t, err, "error occurred getting active sub ids") require.Len(t, activeSubIdsOldCoordinatorBeforeMigration, 1, "Active Sub Ids length is not equal to 1") require.Equal(t, subID, activeSubIdsOldCoordinatorBeforeMigration[0]) oldSubscriptionBeforeMigration, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err, "error getting subscription information") //Migration Process newCoordinator, err := contracts.DeployVRFCoordinatorV2PlusUpgradedVersion(sethClient, vrfContracts.BHS.Address()) require.NoError(t, err, "error deploying VRF CoordinatorV2PlusUpgradedVersion") _, err = vrfv2plus.VRFV2PlusUpgradedVersionRegisterProvingKey(vrfKey.VRFKey, newCoordinator, uint64(assets.GWei(*configCopy.VRFv2Plus.General.CLNodeMaxGasPriceGWei).Int64())) require.NoError(t, err, fmt.Errorf("%s, err: %w", vrfcommon.ErrRegisteringProvingKey, err)) err = newCoordinator.SetConfig( *configCopy.VRFv2Plus.General.MinimumConfirmations, *configCopy.VRFv2Plus.General.MaxGasLimitCoordinatorConfig, *configCopy.VRFv2Plus.General.StalenessSeconds, *configCopy.VRFv2Plus.General.GasAfterPaymentCalculation, big.NewInt(*configCopy.VRFv2Plus.General.LinkNativeFeedResponse), *configCopy.VRFv2Plus.General.FulfillmentFlatFeeNativePPM, *configCopy.VRFv2Plus.General.FulfillmentFlatFeeLinkDiscountPPM, *configCopy.VRFv2Plus.General.NativePremiumPercentage, *configCopy.VRFv2Plus.General.LinkPremiumPercentage, ) require.NoError(t, err) err = newCoordinator.SetLINKAndLINKNativeFeed(vrfContracts.LinkToken.Address(), vrfContracts.MockETHLINKFeed.Address()) require.NoError(t, err, vrfv2plus.ErrSetLinkNativeLinkFeed) vrfJobSpecConfig := vrfcommon.VRFJobSpecConfig{ ForwardingAllowed: *configCopy.VRFv2Plus.General.VRFJobForwardingAllowed, CoordinatorAddress: newCoordinator.Address(), FromAddresses: nodeTypeToNodeMap[vrfcommon.VRF].TXKeyAddressStrings, EVMChainID: fmt.Sprint(chainID), MinIncomingConfirmations: int(*configCopy.VRFv2Plus.General.MinimumConfirmations), PublicKey: vrfKey.VRFKey.Data.ID, EstimateGasMultiplier: *configCopy.VRFv2Plus.General.VRFJobEstimateGasMultiplier, BatchFulfillmentEnabled: false, BatchFulfillmentGasMultiplier: *configCopy.VRFv2Plus.General.VRFJobBatchFulfillmentGasMultiplier, PollPeriod: configCopy.VRFv2Plus.General.VRFJobPollPeriod.Duration, RequestTimeout: configCopy.VRFv2Plus.General.VRFJobRequestTimeout.Duration, SimulationBlock: configCopy.VRFv2Plus.General.VRFJobSimulationBlock, } _, err = vrfv2plus.CreateVRFV2PlusJob( nodeTypeToNodeMap[vrfcommon.VRF].CLNode.API, vrfJobSpecConfig, ) require.NoError(t, err, vrfv2plus.ErrCreateVRFV2PlusJobs) err = vrfContracts.CoordinatorV2Plus.RegisterMigratableCoordinator(newCoordinator.Address()) require.NoError(t, err, "error registering migratable coordinator") oldCoordinatorLinkTotalBalanceBeforeMigration, oldCoordinatorEthTotalBalanceBeforeMigration, err := vrfv2plus.GetCoordinatorTotalBalance(vrfContracts.CoordinatorV2Plus) require.NoError(t, err) migratedCoordinatorLinkTotalBalanceBeforeMigration, migratedCoordinatorEthTotalBalanceBeforeMigration, err := vrfv2plus.GetUpgradedCoordinatorTotalBalance(newCoordinator) require.NoError(t, err) _, migrationCompletedEvent, err := vrfContracts.CoordinatorV2Plus.Migrate(subID, newCoordinator.Address()) require.NoError(t, err, "error migrating sub id ", subID.String(), " from ", vrfContracts.CoordinatorV2Plus.Address(), " to new Coordinator address ", newCoordinator.Address()) vrfv2plus.LogMigrationCompletedEvent(l, migrationCompletedEvent, vrfContracts.CoordinatorV2Plus) oldCoordinatorLinkTotalBalanceAfterMigration, oldCoordinatorEthTotalBalanceAfterMigration, err := vrfv2plus.GetCoordinatorTotalBalance(vrfContracts.CoordinatorV2Plus) require.NoError(t, err) migratedCoordinatorLinkTotalBalanceAfterMigration, migratedCoordinatorEthTotalBalanceAfterMigration, err := vrfv2plus.GetUpgradedCoordinatorTotalBalance(newCoordinator) require.NoError(t, err) migratedSubscription, err := newCoordinator.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err, "error getting subscription information") vrfv2plus.LogSubDetailsAfterMigration(l, newCoordinator, subID, migratedSubscription) //Verify that Coordinators were updated in Consumers for _, consumer := range consumers { coordinatorAddressInConsumerAfterMigration, err := consumer.GetCoordinator(testcontext.Get(t)) require.NoError(t, err, "error getting Coordinator from Consumer contract") require.Equal(t, newCoordinator.Address(), coordinatorAddressInConsumerAfterMigration.String()) l.Info(). Str("Consumer", consumer.Address()). Str("Coordinator", coordinatorAddressInConsumerAfterMigration.String()). Msg("Coordinator Address in Consumer After Migration") } //Verify old and migrated subs require.Equal(t, oldSubscriptionBeforeMigration.NativeBalance, migratedSubscription.NativeBalance) require.Equal(t, oldSubscriptionBeforeMigration.Balance, migratedSubscription.Balance) require.Equal(t, oldSubscriptionBeforeMigration.SubOwner, migratedSubscription.SubOwner) require.Equal(t, oldSubscriptionBeforeMigration.Consumers, migratedSubscription.Consumers) //Verify that old sub was deleted from old Coordinator _, err = vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.Error(t, err, "error not occurred when trying to get deleted subscription from old Coordinator after sub migration") _, err = vrfContracts.CoordinatorV2Plus.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0)) // If (subscription billing), numActiveSub should be 0 after migration in oldCoordinator require.Error(t, err, "error not occurred getting active sub ids. Should occur since it should revert when sub id array is empty") activeSubIdsMigratedCoordinator, err := newCoordinator.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0)) require.NoError(t, err, "error occurred getting active sub ids") require.Len(t, activeSubIdsMigratedCoordinator, 1, "Active Sub Ids length is not equal to 1 for Migrated Coordinator after migration") require.Equal(t, subID, activeSubIdsMigratedCoordinator[0]) //Verify that total balances changed for Link and Eth for new and old coordinator expectedLinkTotalBalanceForMigratedCoordinator := new(big.Int).Add(oldSubscriptionBeforeMigration.Balance, migratedCoordinatorLinkTotalBalanceBeforeMigration) expectedEthTotalBalanceForMigratedCoordinator := new(big.Int).Add(oldSubscriptionBeforeMigration.NativeBalance, migratedCoordinatorEthTotalBalanceBeforeMigration) expectedLinkTotalBalanceForOldCoordinator := new(big.Int).Sub(oldCoordinatorLinkTotalBalanceBeforeMigration, oldSubscriptionBeforeMigration.Balance) expectedEthTotalBalanceForOldCoordinator := new(big.Int).Sub(oldCoordinatorEthTotalBalanceBeforeMigration, oldSubscriptionBeforeMigration.NativeBalance) require.Equal(t, 0, expectedLinkTotalBalanceForMigratedCoordinator.Cmp(migratedCoordinatorLinkTotalBalanceAfterMigration)) require.Equal(t, 0, expectedEthTotalBalanceForMigratedCoordinator.Cmp(migratedCoordinatorEthTotalBalanceAfterMigration)) require.Equal(t, 0, expectedLinkTotalBalanceForOldCoordinator.Cmp(oldCoordinatorLinkTotalBalanceAfterMigration)) require.Equal(t, 0, expectedEthTotalBalanceForOldCoordinator.Cmp(oldCoordinatorEthTotalBalanceAfterMigration)) //Verify rand requests fulfills with Link Token billing _, _, err = vrfv2plus.RequestRandomnessAndWaitForFulfillment( consumers[0], newCoordinator, vrfKey, subID, false, configCopy.VRFv2Plus.General, l, 0, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") //Verify rand requests fulfills with Native Token billing _, _, err = vrfv2plus.RequestRandomnessAndWaitForFulfillment( consumers[1], newCoordinator, vrfKey, subID, true, configCopy.VRFv2Plus.General, l, 0, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") })` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 2, 1, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewInt(0)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewInt(0)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.DeployVRFCoordinatorV2PlusUpgradedVersion(sethClient, vrfContracts.BHS.Address())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.BHS.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.VRFV2PlusUpgradedVersionRegisterProvingKey(vrfKey.VRFKey, newCoordinator, uint64(assets.GWei(*configCopy.VRFv2Plus.General.CLNodeMaxGasPriceGWei).Int64()))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GWei(*configCopy.VRFv2Plus.General.CLNodeMaxGasPriceGWei)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Int64()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetConfig( *configCopy.VRFv2Plus.General.MinimumConfirmations, *configCopy.VRFv2Plus.General.MaxGasLimitCoordinatorConfig, *configCopy.VRFv2Plus.General.StalenessSeconds, *configCopy.VRFv2Plus.General.GasAfterPaymentCalculation, big.NewInt(*configCopy.VRFv2Plus.General.LinkNativeFeedResponse), *configCopy.VRFv2Plus.General.FulfillmentFlatFeeNativePPM, *configCopy.VRFv2Plus.General.FulfillmentFlatFeeLinkDiscountPPM, *configCopy.VRFv2Plus.General.NativePremiumPercentage, *configCopy.VRFv2Plus.General.LinkPremiumPercentage, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewInt(*configCopy.VRFv2Plus.General.LinkNativeFeedResponse)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetLINKAndLINKNativeFeed(vrfContracts.LinkToken.Address(), vrfContracts.MockETHLINKFeed.Address())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LinkToken.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MockETHLINKFeed.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Sprint(chainID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CreateVRFV2PlusJob( nodeTypeToNodeMap[vrfcommon.VRF].CLNode.API, vrfJobSpecConfig, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.RegisterMigratableCoordinator(newCoordinator.Address())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetCoordinatorTotalBalance(vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetUpgradedCoordinatorTotalBalance(newCoordinator)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.Migrate(subID, newCoordinator.Address())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LogMigrationCompletedEvent(l, migrationCompletedEvent, vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetCoordinatorTotalBalance(vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetUpgradedCoordinatorTotalBalance(newCoordinator)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LogSubDetailsAfterMigration(l, newCoordinator, subID, migratedSubscription)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetCoordinator(testcontext.Get(t))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Consumer", consumer.Address())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Coordinator", coordinatorAddressInConsumerAfterMigration.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Coordinator Address in Consumer After Migration")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewInt(0)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewInt(0)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewInt(0)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewInt(0)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Add(oldSubscriptionBeforeMigration.Balance, migratedCoordinatorLinkTotalBalanceBeforeMigration)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Add(oldSubscriptionBeforeMigration.NativeBalance, migratedCoordinatorEthTotalBalanceBeforeMigration)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Sub(oldCoordinatorLinkTotalBalanceBeforeMigration, oldSubscriptionBeforeMigration.Balance)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Sub(oldCoordinatorEthTotalBalanceBeforeMigration, oldSubscriptionBeforeMigration.NativeBalance)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.RequestRandomnessAndWaitForFulfillment( consumers[0], newCoordinator, vrfKey, subID, false, configCopy.VRFv2Plus.General, l, 0, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.RequestRandomnessAndWaitForFulfillment( consumers[1], newCoordinator, vrfKey, subID, true, configCopy.VRFv2Plus.General, l, 0, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupVRFV2PlusWrapperEnvironment( testcontext.Get(t), l, env, chainID, &configCopy, vrfContracts.LinkToken, vrfContracts.MockETHLINKFeed, vrfContracts.CoordinatorV2Plus, vrfKey.KeyHash, 1, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewInt(0)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewInt(0)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.DeployVRFCoordinatorV2PlusUpgradedVersion(sethClient, vrfContracts.BHS.Address())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.BHS.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.VRFV2PlusUpgradedVersionRegisterProvingKey(vrfKey.VRFKey, newCoordinator, uint64(assets.GWei(*configCopy.VRFv2Plus.General.CLNodeMaxGasPriceGWei).Int64()))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GWei(*configCopy.VRFv2Plus.General.CLNodeMaxGasPriceGWei)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Int64()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetConfig( *configCopy.VRFv2Plus.General.MinimumConfirmations, *configCopy.VRFv2Plus.General.MaxGasLimitCoordinatorConfig, *configCopy.VRFv2Plus.General.StalenessSeconds, *configCopy.VRFv2Plus.General.GasAfterPaymentCalculation, big.NewInt(*configCopy.VRFv2Plus.General.LinkNativeFeedResponse), *configCopy.VRFv2Plus.General.FulfillmentFlatFeeNativePPM, *configCopy.VRFv2Plus.General.FulfillmentFlatFeeLinkDiscountPPM, *configCopy.VRFv2Plus.General.NativePremiumPercentage, *configCopy.VRFv2Plus.General.LinkPremiumPercentage, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewInt(*configCopy.VRFv2Plus.General.LinkNativeFeedResponse)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetLINKAndLINKNativeFeed(vrfContracts.LinkToken.Address(), vrfContracts.MockETHLINKFeed.Address())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LinkToken.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MockETHLINKFeed.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Sprint(chainID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CreateVRFV2PlusJob( nodeTypeToNodeMap[vrfcommon.VRF].CLNode.API, vrfJobSpecConfig, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.RegisterMigratableCoordinator(newCoordinator.Address())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetCoordinatorTotalBalance(vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetUpgradedCoordinatorTotalBalance(newCoordinator)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.Migrate(subID, newCoordinator.Address())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LogMigrationCompletedEvent(l, migrationCompletedEvent, vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetCoordinatorTotalBalance(vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetUpgradedCoordinatorTotalBalance(newCoordinator)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LogSubDetailsAfterMigration(l, newCoordinator, subID, migratedSubscription)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.VRFV2PlusWrapper.Coordinator(testcontext.Get(t))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Consumer-VRFV2PlusWrapper", wrapperContracts.VRFV2PlusWrapper.Address())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.VRFV2PlusWrapper.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Coordinator", coordinatorAddressInConsumerAfterMigration.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Coordinator Address in VRFV2PlusWrapper After Migration")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewInt(0)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewInt(0)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewInt(0)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewInt(0)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Add(oldSubscriptionBeforeMigration.Balance, migratedCoordinatorLinkTotalBalanceBeforeMigration)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Add(oldSubscriptionBeforeMigration.NativeBalance, migratedCoordinatorEthTotalBalanceBeforeMigration)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Sub(oldCoordinatorLinkTotalBalanceBeforeMigration, oldSubscriptionBeforeMigration.Balance)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Sub(oldCoordinatorEthTotalBalanceBeforeMigration, oldSubscriptionBeforeMigration.NativeBalance)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.DirectFundingRequestRandomnessAndWaitForFulfillment( wrapperContracts.LoadTestConsumers[0], newCoordinator, vrfKey, subID, isNativeBilling, configCopy.VRFv2Plus.General, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.DirectFundingRequestRandomnessAndWaitForFulfillment( wrapperContracts.LoadTestConsumers[0], newCoordinator, vrfKey, subID, isNativeBilling, configCopy.VRFv2Plus.General, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetConfig("Smoke", tc.VRFv2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetSelectedNetworkConfig(config.GetNetworkConfig())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetNetworkConfig()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Cfg.IsSimulatedNetwork()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Network Name", sethClient.Cfg.Network.Name)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Cleanup(test_env.CleanupOpts{TestName: t.Name()})` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Name()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Ptr(2)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Ptr(20)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupVRFV2PlusUniverse(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Run("BHS Job with complete E2E - wait 256 blocks to see if Rand Request is fulfilled", func(t *testing.T) { if os.Getenv("TEST_UNSKIP") != "true" { t.Skip("Skipped due to long execution time. Should be run on-demand on live testnet with TEST_UNSKIP=\"true\".") } configCopy := config.MustCopy().(tc.TestConfig) //Underfund Subscription configCopy.VRFv2Plus.General.SubscriptionFundingAmountLink = ptr.Ptr(float64(0)) configCopy.VRFv2Plus.General.SubscriptionFundingAmountNative = ptr.Ptr(float64(0)) consumers, subIDs, err := vrfv2plus.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subID := subIDs[0] subscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...) randomWordsRequestedEvent, err := vrfv2plus.RequestRandomness( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, isNativeBilling, configCopy.VRFv2Plus.General, l, 0, ) require.NoError(t, err, "error requesting randomness") randRequestBlockNumber := randomWordsRequestedEvent.Raw.BlockNumber var wg sync.WaitGroup wg.Add(1) //Wait at least 256 blocks _, err = actions.WaitForBlockNumberToBe( randRequestBlockNumber+uint64(257), sethClient, &wg, configCopy.VRFv2Plus.General.WaitFor256BlocksTimeout.Duration, t, l, ) wg.Wait() require.NoError(t, err) err = vrfv2plus.FundSubscriptions( big.NewFloat(*configCopy.VRFv2Plus.General.SubscriptionRefundingAmountNative), big.NewFloat(*configCopy.VRFv2Plus.General.SubscriptionRefundingAmountLink), vrfContracts.LinkToken, vrfContracts.CoordinatorV2Plus, subIDs, ) require.NoError(t, err, "error funding subscriptions") randomWordsFulfilledEvent, err := vrfContracts.CoordinatorV2Plus.WaitForRandomWordsFulfilledEvent( contracts.RandomWordsFulfilledEventFilter{ RequestIds: []*big.Int{randomWordsRequestedEvent.RequestId}, SubIDs: []*big.Int{subID}, Timeout: configCopy.VRFv2Plus.General.RandomWordsFulfilledEventTimeout.Duration, }, ) require.NoError(t, err, "error waiting for randomness fulfilled event") vrfcommon.LogRandomWordsFulfilledEvent(l, vrfContracts.CoordinatorV2Plus, randomWordsFulfilledEvent, isNativeBilling, 0) status, err := consumers[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId) require.NoError(t, err, "error getting rand request status") require.True(t, status.Fulfilled) l.Info().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status") randRequestBlockHash, err := vrfContracts.BHS.GetBlockHash(testcontext.Get(t), big.NewInt(int64(randRequestBlockNumber))) require.NoError(t, err, "error getting blockhash for a blocknumber which was stored in BHS contract") l.Info(). Str("Randomness Request's Blockhash", randomWordsRequestedEvent.Raw.BlockHash.String()). Str("Block Hash stored by BHS contract", fmt.Sprintf("0x%x", randRequestBlockHash)). Msg("BHS Contract's stored Blockhash for Randomness Request") require.Equal(t, 0, randomWordsRequestedEvent.Raw.BlockHash.Cmp(randRequestBlockHash)) })` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Getenv("TEST_UNSKIP")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Ptr(float64(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Ptr(float64(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.RequestRandomness( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, isNativeBilling, configCopy.VRFv2Plus.General, l, 0, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Add(1)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.WaitForBlockNumberToBe( randRequestBlockNumber+uint64(257), sethClient, &wg, configCopy.VRFv2Plus.General.WaitFor256BlocksTimeout.Duration, t, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Wait()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.FundSubscriptions( big.NewFloat(*configCopy.VRFv2Plus.General.SubscriptionRefundingAmountNative), big.NewFloat(*configCopy.VRFv2Plus.General.SubscriptionRefundingAmountLink), vrfContracts.LinkToken, vrfContracts.CoordinatorV2Plus, subIDs, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewFloat(*configCopy.VRFv2Plus.General.SubscriptionRefundingAmountNative)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewFloat(*configCopy.VRFv2Plus.General.SubscriptionRefundingAmountLink)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.WaitForRandomWordsFulfilledEvent( contracts.RandomWordsFulfilledEventFilter{ RequestIds: []*big.Int{randomWordsRequestedEvent.RequestId}, SubIDs: []*big.Int{subID}, Timeout: configCopy.VRFv2Plus.General.RandomWordsFulfilledEventTimeout.Duration, }, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LogRandomWordsFulfilledEvent(l, vrfContracts.CoordinatorV2Plus, randomWordsFulfilledEvent, isNativeBilling, 0)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Bool("Fulfilment Status", status.Fulfilled)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Msg("Random Words Request Fulfilment Status")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.BHS.GetBlockHash(testcontext.Get(t), big.NewInt(int64(randRequestBlockNumber)))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewInt(int64(randRequestBlockNumber))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Randomness Request's Blockhash", randomWordsRequestedEvent.Raw.BlockHash.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Raw.BlockHash.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Block Hash stored by BHS contract", fmt.Sprintf("0x%x", randRequestBlockHash))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Sprintf("0x%x", randRequestBlockHash)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("BHS Contract's stored Blockhash for Randomness Request")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Ptr(float64(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Ptr(float64(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.RequestRandomness( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, isNativeBilling, configCopy.VRFv2Plus.General, l, 0, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.BHS.GetBlockHash(testcontext.Get(t), big.NewInt(int64(randRequestBlockNumber)))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewInt(int64(randRequestBlockNumber))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Add(1)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.WaitForBlockNumberToBe( randRequestBlockNumber+uint64(*configCopy.VRFv2Plus.General.BHSJobWaitBlocks+10), sethClient, &wg, time.Minute*1, t, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Wait()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetLoadTestMetrics(testcontext.Get(t))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewGomegaWithT(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Eventually(func(g gomega.Gomega) { clNodeTxs, _, err = nodeTypeToNodeMap[vrfcommon.BHS].CLNode.API.ReadTransactions() g.Expect(err).ShouldNot(gomega.HaveOccurred(), "error getting CL Node transactions") l.Info().Int("Number of TXs", len(clNodeTxs.Data)).Msg("BHS Node txs") g.Expect(len(clNodeTxs.Data)).Should(gomega.BeNumerically("==", 1), "Expected 1 tx posted by BHS Node, but found %d", len(clNodeTxs.Data)) txHash = clNodeTxs.Data[0].Attributes.Hash }, "2m", "1s")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CLNode.API.ReadTransactions()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Expect(err)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.ShouldNot(gomega.HaveOccurred(), "error getting CL Node transactions")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Int("Number of TXs", len(clNodeTxs.Data))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Msg("BHS Node txs")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Expect(len(clNodeTxs.Data))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Should(gomega.BeNumerically("==", 1), "Expected 1 tx posted by BHS Node, but found %d", len(clNodeTxs.Data))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.BeNumerically("==", 1)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Succeed()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Client.TransactionByHash(testcontext.Get(t), common.HexToHash(txHash))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.HexToHash(txHash)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.DecodeTxInputData(blockhash_store.BlockhashStoreABI, bhsStoreTx.Data())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Data()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Block Number", bhsStoreTxInputData["n"].(*big.Int).String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("BHS Node's Store Blockhash for Blocknumber Method TX")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Eventually(func(g gomega.Gomega) { randRequestBlockHash, err = vrfContracts.BHS.GetBlockHash(testcontext.Get(t), big.NewInt(int64(randRequestBlockNumber))) g.Expect(err).ShouldNot(gomega.HaveOccurred(), "error getting blockhash for a blocknumber which was stored in BHS contract") }, "2m", "1s")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.BHS.GetBlockHash(testcontext.Get(t), big.NewInt(int64(randRequestBlockNumber)))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewInt(int64(randRequestBlockNumber))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Expect(err)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.ShouldNot(gomega.HaveOccurred(), "error getting blockhash for a blocknumber which was stored in BHS contract")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.HaveOccurred()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Should(gomega.Succeed())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Succeed()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Randomness Request's Blockhash", randomWordsRequestedEvent.Raw.BlockHash.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Raw.BlockHash.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Block Hash stored by BHS contract", fmt.Sprintf("0x%x", randRequestBlockHash))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Sprintf("0x%x", randRequestBlockHash)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("BHS Contract's stored Blockhash for Randomness Request")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetConfig("Smoke", tc.VRFv2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetSelectedNetworkConfig(config.GetNetworkConfig())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetNetworkConfig()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Cfg.IsSimulatedNetwork()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Network Name", sethClient.Cfg.Network.Name)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Cleanup(test_env.CleanupOpts{TestName: t.Name()})` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Name()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Ptr(260)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Ptr(500)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Ptr(blockchain.StrDuration{Duration: time.Second * 30})` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Ptr(blockchain.StrDuration{Duration: time.Minute * 24})` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetDefaultChainlinkNodeLogScannerSettingsWithExtraAllowedMessages(testreporters.NewAllowedLogMessage( "Pipeline error", "Test is expecting this error to occur", zapcore.DPanicLevel, testreporters.WarnAboutAllowedMsgs_No))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewAllowedLogMessage( "Pipeline error", "Test is expecting this error to occur", zapcore.DPanicLevel, testreporters.WarnAboutAllowedMsgs_No)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupVRFV2PlusUniverse( testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Ptr(float64(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Ptr(float64(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.RequestRandomness( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, isNativeBilling, configCopy.VRFv2Plus.General, l, 0, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Add(1)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.WaitForBlockNumberToBe( randRequestBlockNumber+uint64(257), sethClient, &wg, configCopy.VRFv2Plus.General.WaitFor256BlocksTimeout.Duration, t, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Wait()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Float64("SubscriptionFundingAmountNative", *configCopy.VRFv2Plus.General.SubscriptionRefundingAmountNative)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Float64("SubscriptionFundingAmountLink", *configCopy.VRFv2Plus.General.SubscriptionRefundingAmountLink)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Funding subscription")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.FundSubscriptions( big.NewFloat(*configCopy.VRFv2Plus.General.SubscriptionRefundingAmountNative), big.NewFloat(*configCopy.VRFv2Plus.General.SubscriptionRefundingAmountLink), vrfContracts.LinkToken, vrfContracts.CoordinatorV2Plus, subIDs, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewFloat(*configCopy.VRFv2Plus.General.SubscriptionRefundingAmountNative)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewFloat(*configCopy.VRFv2Plus.General.SubscriptionRefundingAmountLink)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.WaitForRandomWordsFulfilledEvent( contracts.RandomWordsFulfilledEventFilter{ RequestIds: []*big.Int{randomWordsRequestedEvent.RequestId}, SubIDs: []*big.Int{subID}, Timeout: configCopy.VRFv2Plus.General.RandomWordsFulfilledEventTimeout.Duration, }, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LogRandomWordsFulfilledEvent(l, vrfContracts.CoordinatorV2Plus, randomWordsFulfilledEvent, isNativeBilling, 0)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Bool("Fulfilment Status", status.Fulfilled)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Msg("Random Words Request Fulfilment Status")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CLNode.API.ReadTransactions()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.EqualFold(tx.Attributes.To, vrfContracts.BatchBHS.Address())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.BatchBHS.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.BHS.GetBlockHash(testcontext.Get(t), big.NewInt(int64(randRequestBlockNumber)))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewInt(int64(randRequestBlockNumber))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Randomness Request's Blockhash", randomWordsRequestedEvent.Raw.BlockHash.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Raw.BlockHash.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Block Hash stored by BHS contract", fmt.Sprintf("0x%x", randRequestBlockHash))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Sprintf("0x%x", randRequestBlockHash)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("BHS Contract's stored Blockhash for Randomness Request")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetConfig("Smoke", tc.VRFv2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetSelectedNetworkConfig(config.GetNetworkConfig())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetNetworkConfig()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Cfg.IsSimulatedNetwork()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Network Name", sethClient.Cfg.Network.Name)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Cleanup(test_env.CleanupOpts{TestName: t.Name()})` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Name()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Ptr(blockchain.StrDuration{Duration: timeout})` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Ptr(float64(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Ptr(float64(0))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupVRFV2PlusUniverse(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 2, 1, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.RequestRandomness( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, isNativeBilling, configCopy.VRFv2Plus.General, l, 0, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Sleep(timeout + 1*time.Second)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewFloat(*configCopy.VRFv2Plus.General.SubscriptionRefundingAmountLink)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewFloat(*configCopy.VRFv2Plus.General.SubscriptionRefundingAmountNative)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.FundSubscriptions( fundingLinkAmt, fundingNativeAmt, vrfContracts.LinkToken, vrfContracts.CoordinatorV2Plus, []*big.Int{subID}, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.PendingRequestsExist(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CLNode.API.DeleteJob(vrfNode.Job.Data.ID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Ptr(blockchain.StrDuration{Duration: time.Duration(time.Hour * 1)})` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Duration(time.Hour * 1)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Sprint(chainID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Creating VRFV2 Plus Job with higher timeout (1hr)")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CreateVRFV2PlusJob( vrfNode.CLNode.API, vrfJobSpecConfig, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Str("reqID", initialReqRandomWordsRequestedEvent.RequestId.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.RequestId.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("subID", subID.String())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Waiting for initalReqRandomWordsFulfilledEvent")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.WaitForRandomWordsFulfilledEvent( contracts.RandomWordsFulfilledEventFilter{ RequestIds: []*big.Int{initialReqRandomWordsRequestedEvent.RequestId}, SubIDs: []*big.Int{subID}, Timeout: configCopy.VRFv2Plus.General.RandomWordsFulfilledEventTimeout.Duration, }, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetRequestStatus(testcontext.Get(t), initalReqRandomWordsFulfilledEvent.RequestId)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Bool("Fulfilment Status", status.Fulfilled)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Msg("Random Words Request Fulfilment Status")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetConfig("Smoke", tc.VRFv2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetSelectedNetworkConfig(config.GetNetworkConfig())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetNetworkConfig()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Cfg.IsSimulatedNetwork()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Network Name", sethClient.Cfg.Network.Name)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, sethClient.MustGetRootKeyAddress().Hex(), subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetRootKeyAddress()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Hex()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Cleanup(test_env.CleanupOpts{TestName: t.Name()})` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Name()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupVRFV2PlusUniverse(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, config, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Uint16("minimumConfirmationDelay", *config.VRFv2Plus.General.MinimumConfirmations)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Msg("Minimum Confirmation Delay")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, isNativeBilling, config.VRFv2Plus.General, l, 0, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Bool("Fulfilment Status", status.Fulfilled)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetConfig("Smoke", tc.VRFv2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetSelectedNetworkConfig(config.GetNetworkConfig())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetNetworkConfig()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Cfg.IsSimulatedNetwork()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Network Name", sethClient.Cfg.Network.Name)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, defaultWalletAddress, subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Cleanup(test_env.CleanupOpts{TestName: t.Name()})` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Name()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetDefaultChainlinkNodeLogScannerSettingsWithExtraAllowedMessages( testreporters.NewAllowedLogMessage( "This is a problem and either means a very deep re-org occurred", "Test is expecting a reorg to occur", zapcore.DPanicLevel, testreporters.WarnAboutAllowedMsgs_No), testreporters.NewAllowedLogMessage( "Reorg greater than finality depth detected", "Test is expecting a reorg to occur", zapcore.DPanicLevel, testreporters.WarnAboutAllowedMsgs_No), )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewAllowedLogMessage( "This is a problem and either means a very deep re-org occurred", "Test is expecting a reorg to occur", zapcore.DPanicLevel, testreporters.WarnAboutAllowedMsgs_No)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.NewAllowedLogMessage( "Reorg greater than finality depth detected", "Test is expecting a reorg to occur", zapcore.DPanicLevel, testreporters.WarnAboutAllowedMsgs_No)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupVRFV2PlusUniverse(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, config, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Run("Reorg on fulfillment", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) configCopy.VRFv2Plus.General.MinimumConfirmations = ptr.Ptr[uint16](10) //1. request randomness and wait for fulfillment for blockhash from Reorged Fork randomWordsRequestedEvent, randomWordsFulfilledEventOnReorgedFork, err := vrfv2plus.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, isNativeBilling, configCopy.VRFv2Plus.General, l, 0, ) require.NoError(t, err) // rewind chain to block number after the request was made, but before the request was fulfilled rewindChainToBlock := randomWordsRequestedEvent.Raw.BlockNumber + 1 rpcUrl, err := actions.GetRPCUrl(env, chainID) require.NoError(t, err, "error getting rpc url") //2. rewind chain by n number of blocks - basically, mimicking reorg scenario latestBlockNumberAfterReorg, err := actions.RewindSimulatedChainToBlockNumber(testcontext.Get(t), sethClient, rpcUrl, rewindChainToBlock, l) require.NoError(t, err, fmt.Sprintf("error rewinding chain to block number %d", rewindChainToBlock)) //3.1 ensure that chain is reorged and latest block number is greater than the block number when request was made require.Greater(t, latestBlockNumberAfterReorg, randomWordsRequestedEvent.Raw.BlockNumber) //3.2 ensure that chain is reorged and latest block number is less than the block number when fulfilment was performed require.Less(t, latestBlockNumberAfterReorg, randomWordsFulfilledEventOnReorgedFork.Raw.BlockNumber) //4. wait for the fulfillment which VRF Node will generate for Canonical chain _, err = vrfv2plus.WaitRandomWordsFulfilledEvent( vrfContracts.CoordinatorV2Plus, randomWordsRequestedEvent.RequestId, subID, randomWordsRequestedEvent.Raw.BlockNumber, isNativeBilling, configCopy.VRFv2Plus.General.RandomWordsFulfilledEventTimeout.Duration, l, 0, ) require.NoError(t, err, "error waiting for randomness fulfilled event") })` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, isNativeBilling, configCopy.VRFv2Plus.General, l, 0, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetRPCUrl(env, chainID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.RewindSimulatedChainToBlockNumber(testcontext.Get(t), sethClient, rpcUrl, rewindChainToBlock, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.WaitRandomWordsFulfilledEvent( vrfContracts.CoordinatorV2Plus, randomWordsRequestedEvent.RequestId, subID, randomWordsRequestedEvent.Raw.BlockNumber, isNativeBilling, configCopy.VRFv2Plus.General.RandomWordsFulfilledEventTimeout.Duration, l, 0, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.RequestRandomness( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, isNativeBilling, configCopy.VRFv2Plus.General, l, 0, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetRPCUrl(env, chainID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.RewindSimulatedChainToBlockNumber(testcontext.Get(t), sethClient, rpcUrl, rewindChainToBlockNumber, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.WaitForRandomWordsFulfilledEvent( contracts.RandomWordsFulfilledEventFilter{ RequestIds: []*big.Int{randomWordsRequestedEvent.RequestId}, SubIDs: []*big.Int{subID}, Timeout: time.Second * 10, }, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetTestLogger(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetConfig("Smoke", tc.VRFv2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustGetSelectedNetworkConfig(config.GetNetworkConfig())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetNetworkConfig()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Cfg.IsSimulatedNetwork()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Network Name", sethClient.Cfg.Network.Name)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Network is a simulated network. Skipping fund return for Coordinator Subscriptions.")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CancelSubsAndReturnFunds(testcontext.Get(t), vrfContracts, defaultWalletAddress, subIDsForCancellingAfterTest, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Cleanup(test_env.CleanupOpts{TestName: t.Name()})` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Name()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupVRFV2PlusUniverse(testcontext.Get(t), t, vrfEnvConfig, newEnvConfig, l)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.GetSethClient(chainID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Ptr(uint32(500_000))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Run("Batch Fulfillment Enabled", func(t *testing.T) { configCopy := config.MustCopy().(tc.TestConfig) var isNativeBilling = true vrfNode, exists := nodeTypeToNodeMap[vrfcommon.VRF] require.True(t, exists, "VRF Node does not exist") //ensure that no job present on the node err = actions.DeleteJobs([]*client.ChainlinkClient{vrfNode.CLNode.API}) require.NoError(t, err) batchFullfillmentEnabled := true // create job with batch fulfillment enabled vrfJobSpecConfig := vrfcommon.VRFJobSpecConfig{ ForwardingAllowed: *configCopy.VRFv2Plus.General.VRFJobForwardingAllowed, CoordinatorAddress: vrfContracts.CoordinatorV2Plus.Address(), BatchCoordinatorAddress: vrfContracts.BatchCoordinatorV2Plus.Address(), FromAddresses: vrfNode.TXKeyAddressStrings, EVMChainID: fmt.Sprint(chainID), MinIncomingConfirmations: int(*configCopy.VRFv2Plus.General.MinimumConfirmations), PublicKey: vrfKey.PubKeyCompressed, EstimateGasMultiplier: *configCopy.VRFv2Plus.General.VRFJobEstimateGasMultiplier, BatchFulfillmentEnabled: batchFullfillmentEnabled, BatchFulfillmentGasMultiplier: *configCopy.VRFv2Plus.General.VRFJobBatchFulfillmentGasMultiplier, PollPeriod: configCopy.VRFv2Plus.General.VRFJobPollPeriod.Duration, RequestTimeout: configCopy.VRFv2Plus.General.VRFJobRequestTimeout.Duration, SimulationBlock: configCopy.VRFv2Plus.General.VRFJobSimulationBlock, VRFOwnerConfig: nil, } l.Info(). Msg("Creating VRFV2 Plus Job with `batchFulfillmentEnabled = true`") job, err := vrfv2plus.CreateVRFV2PlusJob( vrfNode.CLNode.API, vrfJobSpecConfig, ) require.NoError(t, err, "error creating job with higher timeout") vrfNode.Job = job consumers, subIDs, err := vrfv2plus.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, ) require.NoError(t, err, "error setting up new consumers and subs") subID := subIDs[0] subscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID) require.NoError(t, err, "error getting subscription information") vrfcommon.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus) subIDsForCancellingAfterTest = append(subIDsForCancellingAfterTest, subIDs...) configCopy.VRFv2Plus.General.RandomnessRequestCountPerRequest = ptr.Ptr(uint16(randRequestCount)) // test and assert _, randomWordsFulfilledEvent, err := vrfv2plus.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, isNativeBilling, configCopy.VRFv2Plus.General, l, 0, ) require.NoError(t, err, "error requesting randomness and waiting for fulfilment") var wgAllRequestsFulfilled sync.WaitGroup wgAllRequestsFulfilled.Add(1) requestCount, fulfilmentCount, err := vrfcommon.WaitForRequestCountEqualToFulfilmentCount(testcontext.Get(t), consumers[0], 2*time.Minute, &wgAllRequestsFulfilled) require.NoError(t, err) wgAllRequestsFulfilled.Wait() l.Info(). Interface("Request Count", requestCount). Interface("Fulfilment Count", fulfilmentCount). Msg("Request/Fulfilment Stats") clNodeTxs, resp, err := nodeTypeToNodeMap[vrfcommon.VRF].CLNode.API.ReadTransactions() require.NoError(t, err) require.Equal(t, 200, resp.StatusCode) var batchFulfillmentTxs []client.TransactionData for _, tx := range clNodeTxs.Data { if common.HexToAddress(tx.Attributes.To).Cmp(common.HexToAddress(vrfContracts.BatchCoordinatorV2Plus.Address())) == 0 { batchFulfillmentTxs = append(batchFulfillmentTxs, tx) } } fulfillmentTx, _, err := sethClient.Client.TransactionByHash(testcontext.Get(t), randomWordsFulfilledEvent.Raw.TxHash) require.NoError(t, err, "error getting tx from hash") fulfillmentTXToAddress := fulfillmentTx.To().String() l.Info(). Str("Actual Fulfillment Tx To Address", fulfillmentTXToAddress). Str("BatchCoordinatorV2Plus Address", vrfContracts.BatchCoordinatorV2Plus.Address()). Msg("Fulfillment Tx To Address should be the BatchCoordinatorV2Plus Address when batch fulfillment is enabled") // verify that VRF node sends fulfillments via BatchCoordinator contract require.Equal(t, vrfContracts.BatchCoordinatorV2Plus.Address(), fulfillmentTXToAddress, "Fulfillment Tx To Address should be the BatchCoordinatorV2Plus Address when batch fulfillment is enabled") // verify that all fulfillments should be inside one tx // This check is disabled for live testnets since each testnet has different gas usage for similar tx if network.Simulated { fulfillmentTxReceipt, err := sethClient.Client.TransactionReceipt(testcontext.Get(t), fulfillmentTx.Hash()) require.NoError(t, err) randomWordsFulfilledLogs, err := contracts.ParseRandomWordsFulfilledLogs(vrfContracts.CoordinatorV2Plus, fulfillmentTxReceipt.Logs) require.NoError(t, err) require.Equal(t, 1, len(batchFulfillmentTxs)) require.Equal(t, int(randRequestCount), len(randomWordsFulfilledLogs)) } })` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.DeleteJobs([]*client.ChainlinkClient{vrfNode.CLNode.API})` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.BatchCoordinatorV2Plus.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Sprint(chainID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Creating VRFV2 Plus Job with `batchFulfillmentEnabled = true`")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CreateVRFV2PlusJob( vrfNode.CLNode.API, vrfJobSpecConfig, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Ptr(uint16(randRequestCount))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, isNativeBilling, configCopy.VRFv2Plus.General, l, 0, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Add(1)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.WaitForRequestCountEqualToFulfilmentCount(testcontext.Get(t), consumers[0], 2*time.Minute, &wgAllRequestsFulfilled)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Wait()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Interface("Request Count", requestCount)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Interface("Fulfilment Count", fulfilmentCount)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Request/Fulfilment Stats")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CLNode.API.ReadTransactions()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.HexToAddress(tx.Attributes.To)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Cmp(common.HexToAddress(vrfContracts.BatchCoordinatorV2Plus.Address()))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.HexToAddress(vrfContracts.BatchCoordinatorV2Plus.Address())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.BatchCoordinatorV2Plus.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Client.TransactionByHash(testcontext.Get(t), randomWordsFulfilledEvent.Raw.TxHash)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.To()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Actual Fulfillment Tx To Address", fulfillmentTXToAddress)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("BatchCoordinatorV2Plus Address", vrfContracts.BatchCoordinatorV2Plus.Address())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.BatchCoordinatorV2Plus.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Fulfillment Tx To Address should be the BatchCoordinatorV2Plus Address when batch fulfillment is enabled")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Client.TransactionReceipt(testcontext.Get(t), fulfillmentTx.Hash())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Hash()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.ParseRandomWordsFulfilledLogs(vrfContracts.CoordinatorV2Plus, fulfillmentTxReceipt.Logs)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.MustCopy()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.DeleteJobs([]*client.ChainlinkClient{vrfNode.CLNode.API})` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.BatchCoordinatorV2Plus.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Sprint(chainID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Creating VRFV2 Plus Job with `batchFulfillmentEnabled = false`")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CreateVRFV2PlusJob( vrfNode.CLNode.API, vrfJobSpecConfig, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.SetupNewConsumersAndSubs( testcontext.Get(t), env, chainID, vrfContracts.CoordinatorV2Plus, configCopy, vrfContracts.LinkToken, 1, 1, l, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.LogSubDetails(l, subscription, subID.String(), vrfContracts.CoordinatorV2Plus)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Ptr(uint16(randRequestCount))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.RequestRandomnessAndWaitForFulfillment( consumers[0], vrfContracts.CoordinatorV2Plus, vrfKey, subID, isNativeBilling, configCopy.VRFv2Plus.General, l, 0, )` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Add(1)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.WaitForRequestCountEqualToFulfilmentCount(testcontext.Get(t), consumers[0], 2*time.Minute, &wgAllRequestsFulfilled)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Wait()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Interface("Request Count", requestCount)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Interface("Fulfilment Count", fulfilmentCount)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Request/Fulfilment Stats")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Client.TransactionByHash(testcontext.Get(t), randomWordsFulfilledEvent.Raw.TxHash)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Get(t)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.To()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.String()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Info()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("Actual Fulfillment Tx To Address", fulfillmentTXToAddress)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Str("CoordinatorV2Plus Address", vrfContracts.CoordinatorV2Plus.Address())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.Address()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `. Msg("Fulfillment Tx To Address should be the CoordinatorV2Plus Address when batch fulfillment is disabled")` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CLNode.API.ReadTransactions()` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.HexToAddress(tx.Attributes.To)` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.Cmp(common.HexToAddress(vrfContracts.CoordinatorV2Plus.Address()))` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.HexToAddress(vrfContracts.CoordinatorV2Plus.Address())` $DIR/integration-tests/smoke/vrfv2plus_test.go: `.CoordinatorV2Plus.Address()` $DIR/integration-tests/soak/forwarder_ocr_test.go: `ocrSoakTest.DeployEnvironment(customNetworkTOML, &config)` $DIR/integration-tests/soak/forwarder_ocr_test.go: `t.Cleanup(func() { if err := actions_seth.TeardownRemoteSuite(ocrSoakTest.TearDownVals(t)); err != nil { l.Error().Err(err).Msg("Error tearing down environment") } })` $DIR/integration-tests/soak/forwarder_ocr_test.go: `ocrSoakTest.Setup(&config)` $DIR/integration-tests/soak/forwarder_ocr_test.go: `.GetTestLogger(t)` $DIR/integration-tests/soak/forwarder_ocr_test.go: `.GetConfig("Soak", tc.OCR)` $DIR/integration-tests/soak/forwarder_ocr_test.go: `.NewOCRSoakTest(t, &config, true)` $DIR/integration-tests/soak/forwarder_ocr_test.go: `.DeployEnvironment(customNetworkTOML, &config)` $DIR/integration-tests/soak/forwarder_ocr_test.go: `.Environment()` $DIR/integration-tests/soak/forwarder_ocr_test.go: `.WillUseRemoteRunner()` $DIR/integration-tests/soak/forwarder_ocr_test.go: `.Cleanup(func() { if err := actions_seth.TeardownRemoteSuite(ocrSoakTest.TearDownVals(t)); err != nil { l.Error().Err(err).Msg("Error tearing down environment") } })` $DIR/integration-tests/soak/forwarder_ocr_test.go: `.TeardownRemoteSuite(ocrSoakTest.TearDownVals(t))` $DIR/integration-tests/soak/forwarder_ocr_test.go: `.TearDownVals(t)` $DIR/integration-tests/soak/forwarder_ocr_test.go: `.Setup(&config)` $DIR/integration-tests/soak/ocr_test.go: `ocrSoakTest.DeployEnvironment(customNetworkTOML, &config)` $DIR/integration-tests/soak/ocr_test.go: `t.Cleanup(func() { if err := actions_seth.TeardownRemoteSuite(ocrSoakTest.TearDownVals(t)); err != nil { l.Error().Err(err).Msg("Error tearing down environment") } })` $DIR/integration-tests/soak/ocr_test.go: `err = ocrSoakTest.LoadState()` $DIR/integration-tests/soak/ocr_test.go: `ocrSoakTest.Resume()` $DIR/integration-tests/soak/ocr_test.go: `ocrSoakTest.Setup(&config)` $DIR/integration-tests/soak/ocr_test.go: `ocrSoakTest.Run()` $DIR/integration-tests/soak/ocr_test.go: `.GetTestLogger(t)` $DIR/integration-tests/soak/ocr_test.go: `.GetConfig("Soak", tc.OCR)` $DIR/integration-tests/soak/ocr_test.go: `.NewOCRSoakTest(t, &config, false)` $DIR/integration-tests/soak/ocr_test.go: `.Interrupted()` $DIR/integration-tests/soak/ocr_test.go: `.DeployEnvironment(customNetworkTOML, &config)` $DIR/integration-tests/soak/ocr_test.go: `.Environment()` $DIR/integration-tests/soak/ocr_test.go: `.WillUseRemoteRunner()` $DIR/integration-tests/soak/ocr_test.go: `.Cleanup(func() { if err := actions_seth.TeardownRemoteSuite(ocrSoakTest.TearDownVals(t)); err != nil { l.Error().Err(err).Msg("Error tearing down environment") } })` $DIR/integration-tests/soak/ocr_test.go: `.TeardownRemoteSuite(ocrSoakTest.TearDownVals(t))` $DIR/integration-tests/soak/ocr_test.go: `.TearDownVals(t)` $DIR/integration-tests/soak/ocr_test.go: `.Interrupted()` $DIR/integration-tests/soak/ocr_test.go: `.LoadState()` $DIR/integration-tests/soak/ocr_test.go: `.Resume()` $DIR/integration-tests/soak/ocr_test.go: `.Setup(&config)` $DIR/integration-tests/soak/ocr_test.go: `.Run()` $DIR/integration-tests/testconfig/testconfig_test.go: `os.Setenv(ctf_config.Base64NetworkConfigEnvVarName, networksEncoded)` $DIR/integration-tests/testconfig/testconfig_test.go: `os.Setenv(Base64OverrideEnvVarName, testConfigEncoded)` $DIR/integration-tests/testconfig/testconfig_test.go: `.StdEncoding.EncodeToString([]byte(networkConfigTOML))` $DIR/integration-tests/testconfig/testconfig_test.go: `.Setenv(ctf_config.Base64NetworkConfigEnvVarName, networksEncoded)` $DIR/integration-tests/testconfig/testconfig_test.go: `.Ptr(7)` $DIR/integration-tests/testconfig/testconfig_test.go: `.Ptr(9)` $DIR/integration-tests/testconfig/testconfig_test.go: `.Ptr(10)` $DIR/integration-tests/testconfig/testconfig_test.go: `.Ptr("minimum")` $DIR/integration-tests/testconfig/testconfig_test.go: `.Ptr("debug")` $DIR/integration-tests/testconfig/testconfig_test.go: `.Ptr(1)` $DIR/integration-tests/testconfig/testconfig_test.go: `.Ptr(2)` $DIR/integration-tests/testconfig/testconfig_test.go: `.Ptr(3)` $DIR/integration-tests/testconfig/testconfig_test.go: `.Ptr(4)` $DIR/integration-tests/testconfig/testconfig_test.go: `.NewInt(5)` $DIR/integration-tests/testconfig/testconfig_test.go: `.NewInt(6)` $DIR/integration-tests/testconfig/testconfig_test.go: `.Ptr(true)` $DIR/integration-tests/testconfig/testconfig_test.go: `.Ptr(3)` $DIR/integration-tests/testconfig/testconfig_test.go: `.Ptr(2)` $DIR/integration-tests/testconfig/testconfig_test.go: `.Ptr(3)` $DIR/integration-tests/testconfig/testconfig_test.go: `.Ptr(7)` $DIR/integration-tests/testconfig/testconfig_test.go: `.NewInt(5)` $DIR/integration-tests/testconfig/testconfig_test.go: `.NewInt(6)` $DIR/integration-tests/testconfig/testconfig_test.go: `.Ptr(false)` $DIR/integration-tests/testconfig/testconfig_test.go: `.Marshal(testConfig)` $DIR/integration-tests/testconfig/testconfig_test.go: `.StdEncoding.EncodeToString(configMarshalled)` $DIR/integration-tests/testconfig/testconfig_test.go: `.Setenv(Base64OverrideEnvVarName, testConfigEncoded)` $DIR/main_test.go: `t.Run(strings.TrimPrefix(path, "testdata/scripts/"), func(t *testing.T) { t.Parallel() testscript.Run(t, testscript.Params{ Dir: path, Setup: commonEnv, ContinueOnError: true, // UpdateScripts: true, // uncomment to update golden files }) })` $DIR/main_test.go: `testscript.Run(t, testscript.Params{ Dir: path, Setup: commonEnv, ContinueOnError: true, // UpdateScripts: true, // uncomment to update golden files })` $DIR/main_test.go: `.RunMain(m, map[string]func() int{ "chainlink": core.Main, })` $DIR/main_test.go: `.Short()` $DIR/main_test.go: `.NewDirVisitor("testdata/scripts", txtar.Recurse, func(path string) error { t.Run(strings.TrimPrefix(path, "testdata/scripts/"), func(t *testing.T) { t.Parallel() testscript.Run(t, testscript.Params{ Dir: path, Setup: commonEnv, ContinueOnError: true, // UpdateScripts: true, // uncomment to update golden files }) }) return nil })` $DIR/main_test.go: `.Run(strings.TrimPrefix(path, "testdata/scripts/"), func(t *testing.T) { t.Parallel() testscript.Run(t, testscript.Params{ Dir: path, Setup: commonEnv, ContinueOnError: true, // UpdateScripts: true, // uncomment to update golden files }) })` $DIR/main_test.go: `.TrimPrefix(path, "testdata/scripts/")` $DIR/main_test.go: `.Run(t, testscript.Params{ Dir: path, Setup: commonEnv, ContinueOnError: true, // UpdateScripts: true, // uncomment to update golden files })` $DIR/main_test.go: `.Walk()` $DIR/plugins/cmd_test.go: `.Contains(err.Error(), "failed to register")` $DIR/plugins/env_test.go: `t.Run("valid", func(t *testing.T) { got, err := ParseEnvFile("testdata/valid.env") require.NoError(t, err) require.Equal(t, []string{"GOMEMLIMIT=1MiB"}, got) })` $DIR/plugins/env_test.go: `t.Run("invalid", func(t *testing.T) { _, err := ParseEnvFile("testdata/invalid.env") require.Error(t, err) })` $DIR/plugins/env_test.go: `.Run("valid", func(t *testing.T) { got, err := ParseEnvFile("testdata/valid.env") require.NoError(t, err) require.Equal(t, []string{"GOMEMLIMIT=1MiB"}, got) })` $DIR/plugins/env_test.go: `.Run("invalid", func(t *testing.T) { _, err := ParseEnvFile("testdata/invalid.env") require.Error(t, err) })` $DIR/plugins/loop_registry_test.go: `.TestLogger(t)` $DIR/plugins/loop_registry_test.go: `.Register("foo")` $DIR/plugins/loop_registry_test.go: `.Register("foo")` $DIR/plugins/loop_registry_test.go: `.Register("bar")` $DIR/plugins/loop_registry_test.go: `.TestLogger(t)` $DIR/plugins/loop_registry_test.go: `.Register("testID")` $DIR/plugins/medianpoc/data_source_test.go: `.TestLogger(t)` $DIR/plugins/medianpoc/data_source_test.go: `.Observe(tests.Context(t), ocrtypes.ReportTimestamp{})` $DIR/plugins/medianpoc/data_source_test.go: `.Context(t)` $DIR/plugins/medianpoc/data_source_test.go: `.NewInt(expect.Val.(int64))` $DIR/plugins/medianpoc/data_source_test.go: `.TestLogger(t)` $DIR/plugins/medianpoc/data_source_test.go: `.New("something went wrong")` $DIR/plugins/medianpoc/data_source_test.go: `.Observe(tests.Context(t), ocrtypes.ReportTimestamp{})` $DIR/plugins/medianpoc/data_source_test.go: `.Context(t)` $DIR/plugins/medianpoc/data_source_test.go: `.TestLogger(t)` $DIR/plugins/medianpoc/data_source_test.go: `.Observe(tests.Context(t), ocrtypes.ReportTimestamp{})` $DIR/plugins/medianpoc/data_source_test.go: `.Context(t)` $DIR/plugins/medianpoc/plugin_test.go: `.TestLogger(t)` $DIR/plugins/medianpoc/plugin_test.go: `.Sprintf( `{"pipelines": [{"name": "__DEFAULT_PIPELINE__", "spec": "%s"},{"name": "juelsPerFeeCoinPipeline", "spec": "%s"}]}`, defaultSpec, juelsPerFeeCoinSpec, )` $DIR/plugins/medianpoc/plugin_test.go: `.newFactory( tests.Context(t), config, prov, pr, nil, mockErrorLog{}, )` $DIR/plugins/medianpoc/plugin_test.go: `.Context(t)` $DIR/tools/flakeytests/reporter_test.go: `.Now()` $DIR/tools/flakeytests/reporter_test.go: `.Sprintf("%d", now.UnixNano())` $DIR/tools/flakeytests/reporter_test.go: `.UnixNano()` $DIR/tools/flakeytests/reporter_test.go: `.createRequest(r)` $DIR/tools/flakeytests/reporter_test.go: `.Now()` $DIR/tools/flakeytests/reporter_test.go: `.Sprintf("%d", now.UnixNano())` $DIR/tools/flakeytests/reporter_test.go: `.UnixNano()` $DIR/tools/flakeytests/reporter_test.go: `.createRequest(r)` $DIR/tools/flakeytests/reporter_test.go: `.Now()` $DIR/tools/flakeytests/reporter_test.go: `.Sprintf("%d", now.UnixNano())` $DIR/tools/flakeytests/reporter_test.go: `.UnixNano()` $DIR/tools/flakeytests/reporter_test.go: `.createRequest(r)` $DIR/tools/flakeytests/reporter_test.go: `.Now()` $DIR/tools/flakeytests/reporter_test.go: `.Sprintf("%d", now.UnixNano())` $DIR/tools/flakeytests/reporter_test.go: `.UnixNano()` $DIR/tools/flakeytests/reporter_test.go: `.createRequest(r)` $DIR/tools/flakeytests/reporter_test.go: `.Now()` $DIR/tools/flakeytests/reporter_test.go: `.Sprintf("%d", now.UnixNano())` $DIR/tools/flakeytests/reporter_test.go: `.UnixNano()` $DIR/tools/flakeytests/reporter_test.go: `.createRequest(r)` $DIR/tools/flakeytests/runner_test.go: `i++` $DIR/tools/flakeytests/runner_test.go: `i++` $DIR/tools/flakeytests/runner_test.go: `i++` $DIR/tools/flakeytests/runner_test.go: `i++` $DIR/tools/flakeytests/runner_test.go: `index++` $DIR/tools/flakeytests/runner_test.go: `t.Run("1: should fail", func(t *testing.T) { assert.False(t, true) })` $DIR/tools/flakeytests/runner_test.go: `cmd.Env = append(cmd.Env, runInIntegrationTestModeEnv)` $DIR/tools/flakeytests/runner_test.go: `cmd.Stdout = io.Discard` $DIR/tools/flakeytests/runner_test.go: `cmd.Stderr = io.Discard` $DIR/tools/flakeytests/runner_test.go: `cmd.Env = append(cmd.Env, runInIntegrationTestModeEnv)` $DIR/tools/flakeytests/runner_test.go: `cmd.Stdout = io.Discard` $DIR/tools/flakeytests/runner_test.go: `cmd.Stderr = io.Discard` $DIR/tools/flakeytests/runner_test.go: `cmd.Env = append(cmd.Env, runInIntegrationTestModeEnv)` $DIR/tools/flakeytests/runner_test.go: `cmd.Stdout = io.Discard` $DIR/tools/flakeytests/runner_test.go: `cmd.Stderr = io.Discard` $DIR/tools/flakeytests/runner_test.go: `.NewReader(output)` $DIR/tools/flakeytests/runner_test.go: `.NewReader(output)` $DIR/tools/flakeytests/runner_test.go: `.NewReader(output)` $DIR/tools/flakeytests/runner_test.go: `.NewReader(output)` $DIR/tools/flakeytests/runner_test.go: `.NewReader(initialOutput)` $DIR/tools/flakeytests/runner_test.go: `.Write([]byte(outputs[i]))` $DIR/tools/flakeytests/runner_test.go: `.Run(tests.Context(t))` $DIR/tools/flakeytests/runner_test.go: `.Context(t)` $DIR/tools/flakeytests/runner_test.go: `.NewReader(initialOutput)` $DIR/tools/flakeytests/runner_test.go: `.Write([]byte(outputs[i]))` $DIR/tools/flakeytests/runner_test.go: `.Run(tests.Context(t))` $DIR/tools/flakeytests/runner_test.go: `.Context(t)` $DIR/tools/flakeytests/runner_test.go: `.NewReader(output)` $DIR/tools/flakeytests/runner_test.go: `.Write([]byte(rerunOutput))` $DIR/tools/flakeytests/runner_test.go: `.Run(tests.Context(t))` $DIR/tools/flakeytests/runner_test.go: `.Context(t)` $DIR/tools/flakeytests/runner_test.go: `.NewReader(output)` $DIR/tools/flakeytests/runner_test.go: `.Write([]byte(rerunOutputs[i]))` $DIR/tools/flakeytests/runner_test.go: `.Run(tests.Context(t))` $DIR/tools/flakeytests/runner_test.go: `.Context(t)` $DIR/tools/flakeytests/runner_test.go: `.NewReader(output)` $DIR/tools/flakeytests/runner_test.go: `.Write([]byte(rerunOutput))` $DIR/tools/flakeytests/runner_test.go: `.Run(tests.Context(t))` $DIR/tools/flakeytests/runner_test.go: `.Context(t)` $DIR/tools/flakeytests/runner_test.go: `.NewReader(output)` $DIR/tools/flakeytests/runner_test.go: `.Write([]byte(rerunOutputs[i]))` $DIR/tools/flakeytests/runner_test.go: `.Run(tests.Context(t))` $DIR/tools/flakeytests/runner_test.go: `.Context(t)` $DIR/tools/flakeytests/runner_test.go: `.NewReader(` {"Time":"2023-09-07T15:39:46.378315+01:00","Action":"fail","Package":"github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets","Test":"TestLink","Elapsed":0} `)` $DIR/tools/flakeytests/runner_test.go: `.NewReader(` {"Time":"2023-09-07T15:39:46.378315+01:00","Action":"fail","Package":"github.com/smartcontractkit/chainlink/v2/core/services/vrf/v2","Test":"TestMaybeReservedLinkV2","Elapsed":0} `)` $DIR/tools/flakeytests/runner_test.go: `.Write([]byte(rerunOutputs[index]))` $DIR/tools/flakeytests/runner_test.go: `.Run(tests.Context(t))` $DIR/tools/flakeytests/runner_test.go: `.Context(t)` $DIR/tools/flakeytests/runner_test.go: `.Run("1: should fail", func(t *testing.T) { assert.False(t, true) })` $DIR/tools/flakeytests/runner_test.go: `.Short()` $DIR/tools/flakeytests/runner_test.go: `.NewReader(output)` $DIR/tools/flakeytests/runner_test.go: `.Run(tests.Context(t))` $DIR/tools/flakeytests/runner_test.go: `.Context(t)` $DIR/tools/flakeytests/runner_test.go: `.Short()` $DIR/tools/flakeytests/runner_test.go: `.NewReader(output)` $DIR/tools/flakeytests/runner_test.go: `.Run(tests.Context(t))` $DIR/tools/flakeytests/runner_test.go: `.Context(t)` $DIR/tools/flakeytests/runner_test.go: `.Short()` $DIR/tools/flakeytests/runner_test.go: `.NewReader(output)` $DIR/tools/flakeytests/runner_test.go: `.Run(tests.Context(t))` $DIR/tools/flakeytests/runner_test.go: `.Context(t)` $DIR/tools/flakeytests/utils_test.go: `event = fmt.Sprintf(prEventTemplate, anotherSha, url)` $DIR/tools/flakeytests/utils_test.go: `sha = "302eb05d592132309b264e316f443f1ceb81b6c3"` $DIR/tools/flakeytests/utils_test.go: `ctx = getGithubMetadata(repo, eventName, sha, strings.NewReader(event), runID, runAttempt)` $DIR/tools/flakeytests/utils_test.go: `.Sprintf("github.com/%s/actions/runs/%s/attempts/%s", repo, runID, runAttempt)` $DIR/tools/flakeytests/utils_test.go: `.NewReader(event)` $DIR/tools/flakeytests/utils_test.go: `.Sprintf(prEventTemplate, anotherSha, url)` $DIR/tools/flakeytests/utils_test.go: `.NewReader(event)`